41 void replaceAll(std::string& source,
const std::string& from,
const std::string& to)
43 std::string newString;
44 newString.reserve( source.length() );
46 std::string::size_type lastPos = 0;
47 std::string::size_type findPos;
49 while( std::string::npos != ( findPos = source.find( from, lastPos )))
51 newString.append( source, lastPos, findPos - lastPos );
53 lastPos = findPos + from.length();
57 newString += source.substr( lastPos );
59 source.swap( newString );
65 template void Parser::Add<ScorerMesh, FastList<ScorerMesh> >(
bool unique,
const std::string& className);
66 template void Parser::Add<CavityModel, FastList<CavityModel> >(
bool unique,
const std::string& className);
67 template void Parser::Add<BLMPlacement, FastList<BLMPlacement> >(
bool unique,
const std::string& className);
68 template void Parser::Add<SamplerPlacement, FastList<SamplerPlacement> >(
bool unique,
const std::string& className);
69 template void Parser::Add<Atom, FastList<Atom> >(
bool unique,
const std::string& className);
70 template void Parser::Add<Field, FastList<Field> >(
bool unique,
const std::string& className);
71 template void Parser::Add<Query, FastList<Query> >(
bool unique,
const std::string& className);
72 template void Parser::Add<Region, FastList<Region> >(
bool unique,
const std::string& className);
73 template void Parser::Add<Scorer, FastList<Scorer> >(
bool unique,
const std::string& className);
74 template void Parser::Add<Tunnel, FastList<Tunnel> >(
bool unique,
const std::string& className);
75 template void Parser::Add<Crystal, FastList<Crystal> >(
bool unique,
const std::string& className);
76 template void Parser::Add<Aperture, FastList<Aperture> >(
bool unique,
const std::string& className);
77 template void Parser::Add<Material, FastList<Material> >(
bool unique,
const std::string& className);
78 template void Parser::Add<NewColour, FastList<NewColour> >(
bool unique,
const std::string& className);
79 template void Parser::Add<PhysicsBiasing, FastList<PhysicsBiasing> >(
bool unique,
const std::string& className);
85 extern std::string yyfilename;
91Parser* Parser::instance =
nullptr;
97 std::cerr <<
"Parser has not been initialized!" << std::endl;
107 std::cerr <<
"Warning parser was already initialized!" << std::endl;
128 std::cout <<
"gmad_parser> opening file" << std::endl;
133 std::string tilde(
"~");
134 std::string home(getpwuid(getuid())->pw_dir);
136 replaceAll(name,tilde,home);
138 FILE *f = fopen(name.c_str(),
"r");
142 std::cerr <<
"gmad_parser> Can't open input file " << name << std::endl;
146 yyfilename = std::string(name);
150 std::cout.precision(10);
160 std::cout <<
"gmad_parser> beginning to parse file" << std::endl;
168 std::cout <<
"gmad_parser> finished to parsing file" << std::endl;
172 std::cout <<
"gmad_parser> clearing temporary lists" << std::endl;
181 std::cout <<
"gmad_parser> finished" << std::endl;
189 const int reserved = 1;
202 add_var(
"pi", 4.0*std::atan(1),reserved);
203 add_var(
"twopi", 8.0*std::atan(1),reserved);
204 add_var(
"halfpi", 2.0*std::atan(1),reserved);
206 add_var(
"PeV",1e6, reserved);
207 add_var(
"TeV",1e3, reserved);
208 add_var(
"GeV",1.0 ,reserved);
209 add_var(
"MeV",1e-3,reserved);
210 add_var(
"keV",1e-6,reserved);
211 add_var(
"KeV",1e-6,reserved);
212 add_var(
"eV" ,1e-9,reserved);
214 add_var(
"PJ", 1e12, reserved);
215 add_var(
"GJ", 1e9, reserved);
216 add_var(
"MJ", 1e6, reserved);
217 add_var(
"kJ", 1e3, reserved);
218 add_var(
"J", 1, reserved);
219 add_var(
"mJ", 1e-3, reserved);
220 add_var(
"uJ", 1e-6, reserved);
221 add_var(
"nJ", 1e-9, reserved);
222 add_var(
"pJ", 1e-12, reserved);
224 add_var(
"mV",1e-3,reserved);
225 add_var(
"V" ,1.0, reserved);
226 add_var(
"kV",1e+3,reserved);
227 add_var(
"MV",1e+6,reserved);
228 add_var(
"GV",1e+9,reserved);
230 add_var(
"Tesla",1.0,reserved);
231 add_var(
"T", 1.0,reserved);
233 add_var(
"km" ,1e3 ,reserved);
234 add_var(
"m" ,1.0 ,reserved);
235 add_var(
"cm" ,1e-2,reserved);
236 add_var(
"mm" ,1e-3,reserved);
237 add_var(
"um" ,1e-6,reserved);
238 add_var(
"mum",1e-6,reserved);
239 add_var(
"nm" ,1e-9,reserved);
240 add_var(
"ang",1e-10,reserved);
241 add_var(
"pm" ,1e-12,reserved);
243 add_var(
"s" ,1.0 ,reserved);
244 add_var(
"ms" ,1.e-3,reserved);
245 add_var(
"us" ,1.e-6,reserved);
246 add_var(
"ns" ,1.e-9,reserved);
247 add_var(
"ps" ,1.e-12,reserved);
249 add_var(
"Hz" ,1.0, reserved);
250 add_var(
"kHz",1e+3, reserved);
251 add_var(
"MHz",1e+6, reserved);
252 add_var(
"GHz",1e+9, reserved);
253 add_var(
"THz",1e+12,reserved);
255 add_var(
"rad" ,1.0, reserved);
256 add_var(
"mrad",1e-3,reserved);
257 add_var(
"urad",1e-6,reserved);
258 add_var(
"nrad",1e-9,reserved);
260 add_var(
"degrees",std::atan(1)/45,reserved);
262 add_var(
"clight",2.99792458e+8,reserved);
269 std::cout <<
"parsing complete..." << std::endl;
306 const std::string& name,
311 if(line.
type != ElementType::_LINE && line.
type != ElementType::_REV_LINE )
313 std::cerr <<
"Error with use command: \"" << name <<
"\" is not a line" << std::endl;
330 std::cout <<
"expanding line " << name <<
", range = " << start << end << std::endl;
336 std::list<Element>::iterator sit = line.
lst->begin();
337 std::list<Element>::iterator eit = line.
lst->end();
342 case ElementType::_LINE:
343 {target.
insert(target.
end(),sit,eit);
break;}
344 case ElementType::_REV_LINE:
345 {target.
insert(target.
end(),line.
lst->rbegin(),line.
lst->rend());
break;}
347 {target.
insert(target.
end(),sit,eit);
break;}
350 bool is_expanded =
false;
358 std::list<Element>::iterator it = ++target.
begin();
359 for (; it!=target.
end(); ++it)
364 std::cout << element.name <<
" , " << type << std::endl;
367 if (type != ElementType::_LINE && type != ElementType::_REV_LINE)
371 std::list<Element>::const_iterator tmpit =
element_list.find(element.name);
372 std::list<Element>::const_iterator iterEnd =
element_list.end();
373 if ( (tmpit != iterEnd) && ( (*tmpit).lst !=
nullptr) )
377 std::cout <<
"inserting sequence for " << element.name <<
" - " << list.name <<
" ...";
379 if (type == ElementType::_LINE)
381 else if (type == ElementType::_REV_LINE)
384 std::list<Element> tmpList;
385 tmpList.insert(tmpList.end(),list.
lst->begin(),list.
lst->end());
386 for (std::list<Element>::iterator itLineInverter = tmpList.begin();
387 itLineInverter != tmpList.end(); ++itLineInverter)
389 if ( (*itLineInverter).type == ElementType::_LINE)
390 {(*itLineInverter).type = ElementType::_REV_LINE;}
391 else if ((*itLineInverter).type == ElementType::_REV_LINE)
392 {(*itLineInverter).type = ElementType::_LINE;}
394 target.
insert(it,tmpList.rbegin(),tmpList.rend());
397 std::cout <<
"inserted" << std::endl;
402 else if ( tmpit != iterEnd )
406 std::cout <<
"keeping element..." << element.name << std::endl;
412 std::cout <<
"done" << std::endl;
417 std::cerr <<
"Error : Expanding line \"" << name <<
"\" : element \"" << element.name
418 <<
"\" has not been defined! " << std::endl;
425 std::cerr <<
"Error : Line expansion of '" << name <<
"' seems to loop, " << std::endl
426 <<
"possible recursive line definition, quitting" << std::endl;
437 std::list<Element>::const_iterator startIt = target.
find(std::string(start));
439 if(startIt!=target.
end())
445 std::list<Element>::const_iterator endIt = target.
find(std::string(end));
447 if(endIt!=target.
end())
448 {target.
erase(++endIt,target.
end());}
453 std::list<Element>::iterator itTunnel =
element_list.find(
"tunnel");
463 {
return *(search->second);}
465 {std::cerr <<
"parser> no such sequence \"" << name <<
"\"" << std::endl; exit(1);}
471 const std::string& samplerType,
472 double samplerRadius,
482 if((*it).type == ElementType::_LINE || (*it).type == ElementType::_REV_LINE)
485 if (type != ElementType::_NONE && type != (*it).type)
488 (*it).setSamplerInfo(samplerType,(*it).name,samplerRadius,particleSetID);
492 else if (count == -1)
495 if (itPair.first==itPair.second)
497 std::cerr<<
"current beamline doesn't contain element "<< name << std::endl;
500 for (
auto it = itPair.first; it!= itPair.second; ++it)
503 auto elementIt = (it->second);
504 std::string samplerName = elementIt->name;
505 if ((*elementIt).type == ElementType::_MARKER)
509 while ((*elementIt).isSpecial())
518 std::cout <<
"WARNING: no element before marker " << name <<
", no sampler added" << std::endl;
522 (*elementIt).setSamplerInfo(samplerType,samplerName,samplerRadius,particleSetID);
530 std::cerr<<
"current beamline doesn't contain element "<<name<<
" with number "<<count<<std::endl;
534 std::string samplerName = (*it).name;
535 if ((*it).type == ElementType::_MARKER)
539 while ((*it).isSpecial())
544 std::cout <<
"WARNING: no element before marker " << name <<
", no sampler added" << std::endl;
549 (*it).setSamplerInfo(samplerType,samplerName,samplerRadius,particleSetID);
555 if (!samplerPartIDListIn)
557 std::set<int> partIDs = std::set<int>(std::begin(*samplerPartIDListIn), std::end(*samplerPartIDListIn));
559 if (alreadyExists > 0)
560 {
return setToSamplerFilterID[partIDs];}
563 int particleSetID = (int) samplerFilterIDToSet.size();
564 samplerFilterIDToSet[particleSetID] = partIDs;
565 setToSamplerFilterID[partIDs] = particleSetID;
567 return particleSetID;
574 std::cout<<
"inserting sampler "<<name;
575 if (count>=0) std::cout<<
"["<< count <<
"]";
576 std::cout<<std::endl;
579 set_sampler(name,count,type,samplerType,0,particleSetID);
584 std::list<Element>::iterator it =
element_list.find(element_name);
585 std::list<Element>::const_iterator iterEnd =
element_list.end();
589 std::cerr <<
"parser.h> Error: element (type) \"" << element_name
590 <<
"\" has not been defined." << std::endl;
598 std::list<Element>::const_iterator it =
element_list.find(element_name);
599 std::list<Element>::const_iterator iterEnd =
element_list.end();
603 std::cerr <<
"parser.h> Error: unknown element \"" << element_name <<
"\"." << std::endl;
611 const Element* result =
nullptr;
623 const Element* result =
nullptr;
642 std::cout <<
"matched sequence element, " << name;
643 if (number > 1) std::cout <<
" * " << number;
644 std::cout << std::endl;
653 for(
int i=0;i<number;i++)
658 for(
int i=0;i<number;i++)
667 std::cout <<
"newinstance : VARIABLE -- " << elementName << std::endl;
672 type =
static_cast<int>(element.
type);
684void Parser::add_var(std::string name,
double value,
int is_reserved)
687 sp->
Set(value,is_reserved);
690bool Parser::InvalidSymbolName(
const std::string& s, std::string& errorReason)
694 {result =
true; errorReason =
"The variable name \"" + s +
"\" is an option name and cannot be used as a variable name";}
742 bool extended =
false;
760 if ( (extended = FindAndExtend<Atom> (objectName)) ) {}
761 else if ( (extended = FindAndExtend<NewColour> (objectName)) ) {}
762 else if ( (extended = FindAndExtend<Crystal> (objectName)) ) {}
763 else if ( (extended = FindAndExtend<Field> (objectName)) ) {}
764 else if ( (extended = FindAndExtend<Material> (objectName)) ) {}
765 else if ( (extended = FindAndExtend<Placement> (objectName)) ) {}
766 else if ( (extended = FindAndExtend<Query> (objectName)) ) {}
767 else if ( (extended = FindAndExtend<Region> (objectName)) ) {}
768 else if ( (extended = FindAndExtend<Tunnel> (objectName)) ) {}
769 else if ( (extended = FindAndExtend<CavityModel>(objectName)) ) {}
770 else if ( (extended = FindAndExtend<SamplerPlacement>(objectName)) ) {}
771 else if ( (extended = FindAndExtend<Scorer> (objectName)) ) {}
772 else if ( (extended = FindAndExtend<ScorerMesh> (objectName)) ) {}
773 else if ( (extended = FindAndExtend<Aperture> (objectName)) ) {}
774 else if ( (extended = FindAndExtend<BLMPlacement> (objectName)) ) {}
779 std::cerr <<
"parser.h> Error: object \"" << objectName
780 <<
"\" has not been defined and can't be extended." << std::endl;
794 auto search = fl.
find(objectName);
795 if (search != fl.
end())
807 {
object.set_value(option.first, option.second);}
809 {
object.set_value(option.first, option.second);}
811 {
object.set_value(option.first, option.second);}
841 const std::string& on = objectName;
844 auto searchAtom = std::find_if(
atom_list.begin(),
atom_list.end(), [&on](
const Atom& obj) {return obj.name == on;});
846 {searchAtom->print();
return true;}
849 {searchNewColour->print();
return true;}
852 {searchCrystal->print();
return true;}
855 {searchField->print();
return true;}
858 {searchMaterial->print();
return true;}
861 {searchQuery->print();
return true;}
864 {searchRegion->print();
return true;}
867 {searchTunnel->print();
return true;}
870 {searchXsecbias->print();
return true;}
873 {searchPlacement->print();
return true;}
876 {searchCavityModel->print();
return true;}
879 {searchSamplerPlacement->print();
return true;}
880 auto searchScorer = std::find_if(scorer_list.begin(), scorer_list.end(), [&on](
const Scorer& obj) {return obj.name == on;});
881 if (searchScorer != scorer_list.end())
882 {searchScorer->print();
return true;}
883 auto searchScorerMesh = std::find_if(scorermesh_list.begin(), scorermesh_list.end(), [&on](
const ScorerMesh& obj) {return obj.name == on;});
884 if (searchScorerMesh != scorermesh_list.end())
885 {searchScorerMesh->print();
return true;}
888 {searchAperture->print();
return true;}
890 if (searchBLMPlacement !=
blm_list.end())
891 {searchBLMPlacement->print();
return true;}
1021 template <
class C,
class Container>
1025 C& global = GetGlobal<C>();
1032 GetList<C, Container>().push_back(inst);
1035 template <
class C,
class Container>
1036 void Parser::Add(
bool unique,
const std::string& className)
1039 C& global = GetGlobal<C>();
1046 GetList<C, Container>().push_back(inst, unique, className);
1056 void Parser::Add<Placement, FastList<Placement>>(
bool unique,
const std::string& className)
1059 Placement& global = GetGlobal<Placement>();
1066 GetList<Placement, FastList<Placement>>().push_back(inst, unique, className);
1073 std::cerr <<
"The bdsimElement referred to in \"" << inst.
name <<
"\" (\""
1074 << inst.
bdsimElement <<
"\") cannot be found and should be defined"
1075 <<
" before this placement" << std::endl;
1078 placement_elements.push_back(
Element(*elDef));
Representation of arrays used in tokens.
void Copy(Container< std::string, std::allocator< std::string > > &cpy)
Copy STL string containers into symbols.
RF CavityModel class for parser.
Crystal class for parser.
List with Efficient Lookup.
FastListIterator insert(FastListInputIterator position, const T &val)
template definitions need to be in header
void erase()
erase elements
void push_back(const T &el, bool unique=false, const std::string &objectName="element")
FastListConstIterator find(std::string name, unsigned int count=1) const
Colour definition for parser.
void print() const
print some properties
void Overwrite(const std::string &objectName)
Overwrite object with current values.
FastList< Atom > atom_list
List of parser defined atoms.
void Add()
Insert global object of parser class C in Container class.
std::vector< std::list< Element > * > allocated_lines
double property_lookup(const std::string &element_name, const std::string &property_name) const
access property of Element with element_name
FastList< BLMPlacement > blm_list
List of parser defined blms.
std::vector< std::string > sequences
Names of all defined sequences in the parser with 'line'.
const int MAX_EXPAND_ITERATIONS
maximum number of nested lines
Scorer scorer
Scorer instance.
void ExtendValue(const std::string &property, T value)
Add value to be extended to object.
void ExtendObject(C &object)
Extend object with maps.
FastList< Crystal > crystal_list
FastList< Placement > placement_list
List of parser defined placements.
Material material
Material instance;.
virtual ~Parser()
Destructor.
void expand_line(FastList< Element > &target, const std::string &name, std::string start="", std::string end="")
Symtab * symlook(const std::string &s)
look up parser symbol
static Parser * Instance()
Access method.
std::map< std::string, FastList< Element > * > expandedSequences
Cached copy of expanded sequences.
FastList< Region > region_list
List of parser defined regions.
FastList< NewColour > colour_list
List of parser defined colours.
Parameters params
Parameters to copy to Element.
int add_sampler_partIDSet(std::list< int > *samplerPartIDListIn)
FastList< Tunnel > tunnel_list
List of parser defined tunnels.
FastList< Element > element_list
List of all encountered elements.
void add_sampler(const std::string &name, int count, ElementType type, std::string samplerType, std::list< int > *samplerPartIDListIn=nullptr)
insert a sampler into beamline_list
C & GetGlobal()
Get global object of parser class C.
int copy_element_to_params(const std::string &elementName)
copy properties from Element into params, returns element type as integer, returs _NONE if not found
bool TryPrintingObject(const std::string &objectName) const
Options options
General options.
Element & find_element(const std::string &element_name)
find element
FastList< Aperture > aperture_list
List of parser defined apertures.
Tunnel tunnel
Tunnel instance.
FastList< PhysicsBiasing > xsecbias_list
List of parser defined cross section biasing objects.
void write_table(std::string *name, ElementType type, bool isLine=false)
Method that transfers parameters to element properties.
const Element * find_placement_element_safe(const std::string &element_name) const
search placement_element
void PrintElements() const
Print methods.
FastList< Element > placement_elements
std::vector< std::string * > var_list
Variable vector for memory storage.
FastList< Element > beamline_list
Beamline.
void add_element_temp(const std::string &name, int number, bool pushfront, ElementType linetype)
add element to temporary element sequence tmp_list
std::set< std::set< int > > samplerFilters
FastList< SamplerPlacement > samplerplacement_list
List of parser defined sampler placements.
Field field
Field instance;.
std::list< Element > tmp_list
Temporary list.
Query query
Query instance.
Aperture aperture
Aperture instance.
void AddVariable(std::string *name)
Add variable memory to variable list for memory management.
BLMPlacement blm
BLM instance.
std::map< std::string, std::string > extendedStrings
Map for options of type string for extending objects.
Region region
Region instance;.
void ParseFile(FILE *f)
Parse the input file and construct beamline_list and options.
bool FindAndExtend(const std::string &objectName)
Find object by name in list.
SymbolMap symtab_map
Parser symbol map.
void PrintBeamline() const
Print methods.
const FastList< Element > & get_sequence(const std::string &name)
std::map< std::string, Array * > extendedVectors
Map for options of type vector for extending objects.
void set_sampler(const std::string &name, int count, ElementType type, const std::string &samplerType, double samplerRadius=0, int particleSetID=-1)
Set sampler.
Symtab * symcreate(const std::string &s)
create new parser symbol
NewColour colour
NewColour instance.
ScorerMesh scorermesh
ScorerMesh instance.
const FastList< Element > & GetBeamline() const
void PrintOptions() const
Print methods.
FastList< Field > field_list
List of parser defined fields.
FastList< CavityModel > cavitymodel_list
List of parser defined rf cavity models.
std::map< std::string, double > extendedNumbers
Map for options of type double for extending objects.
Placement placement
Placement instance.
std::list< double > tmparray
temporary list for reading of arrays in parser
CavityModel cavitymodel
RF Cavity model instance.
FastList< Query > query_list
List of parser defined query objects.
Parser()=delete
No default constructor.
void Store(double value)
Add value to front of temporary list.
static Parser * instance
Instance.
PhysicsBiasing xsecbias
PhysicsBiasing instance.
void add_func(std::string name, double(*func)(double))
Add function to parser.
void Initialise()
Initialisation of parser functions and constants.
FastList< Material > material_list
List of parser defined materials.
const Element * find_element_safe(const std::string &element_name) const
find element by pointer - nullptr if not found - searches element_list
void expand_sequences()
Expand all sequences define with 'line' into FastLists.
std::list< std::string > tmpstring
temporary list for reading of arrays in parser
SamplerPlacement samplerplacement
Sampler placement instance.
Physics biasing class for parser.
Placement class for parser.
std::string name
Name of this placement.
void print() const
print some properties
std::string bdsimElement
Name of bdsim-built component to place instead of piece of geometry.
Query structure class for parser.
Sampler placement class for parser.
ScorerMesh class for parser.
void clear()
Destructor that clears memory.
Symtab * symlook(std::string s)
Look up parser symbol.
Symtab * symcreate(std::string s)
Create new parser symbol.
Common header for the lexer and the parser to share Symbol table for numeric variables,...
void Set(Array *)
Set to Array value.
Parser namespace for GMAD language. Combination of Geant4 and MAD.
ElementType
types of elements
double property_lookup(std::string property_name) const
void set(const Parameters ¶ms)
set method from Parameters structure
std::list< Element > * lst
in case the element is a list itself (line)
ElementType type
element enum
Parameters - Element class with booleans.
void inherit_properties(const Element &e)
void flush()
Reset the parameters to defaults and setMap.