40 void replaceAll(std::string& source,
const std::string& from,
const std::string& to)
42 std::string newString;
43 newString.reserve( source.length() );
45 std::string::size_type lastPos = 0;
46 std::string::size_type findPos;
48 while( std::string::npos != ( findPos = source.find( from, lastPos )))
50 newString.append( source, lastPos, findPos - lastPos );
52 lastPos = findPos + from.length();
56 newString += source.substr( lastPos );
58 source.swap( newString );
64 template void Parser::Add<Atom, FastList<Atom> >();
65 template void Parser::Add<Aperture, FastList<Aperture> >();
66 template void Parser::Add<BLMPlacement, FastList<BLMPlacement> >();
67 template void Parser::Add<CavityModel, FastList<CavityModel> >();
68 template void Parser::Add<Crystal, FastList<Crystal> >();
69 template void Parser::Add<Field, FastList<Field> >();
70 template void Parser::Add<Laser, FastList<Laser> >();
71 template void Parser::Add<Material, FastList<Material> >();
72 template void Parser::Add<Modulator, FastList<Modulator> >();
73 template void Parser::Add<NewColour, FastList<NewColour> >();
74 template void Parser::Add<PhysicsBiasing, FastList<PhysicsBiasing> >();
75 template void Parser::Add<Placement, FastList<Placement> >();
76 template void Parser::Add<Query, FastList<Query> >();
77 template void Parser::Add<Region, FastList<Region> >();
78 template void Parser::Add<SamplerPlacement, FastList<SamplerPlacement> >();
79 template void Parser::Add<Scorer, FastList<Scorer> >();
80 template void Parser::Add<ScorerMesh, FastList<ScorerMesh> >();
81 template void Parser::Add<Tunnel, FastList<Tunnel> >();
83 template void Parser::Add<Atom, FastList<Atom> >(
bool unique,
const std::string& className);
84 template void Parser::Add<Aperture, FastList<Aperture> >(
bool unique,
const std::string& className);
85 template void Parser::Add<BLMPlacement, FastList<BLMPlacement> >(
bool unique,
const std::string& className);
86 template void Parser::Add<CavityModel, FastList<CavityModel> >(
bool unique,
const std::string& className);
87 template void Parser::Add<CoolingChannel, FastList<CoolingChannel> >(
bool unique,
const std::string& className);
88 template void Parser::Add<Crystal, FastList<Crystal> >(
bool unique,
const std::string& className);
89 template void Parser::Add<Field, FastList<Field> >(
bool unique,
const std::string& className);
90 template void Parser::Add<ScorerMesh, FastList<ScorerMesh> >(
bool unique,
const std::string& className);
91 template void Parser::Add<Material, FastList<Material> >(
bool unique,
const std::string& className);
92 template void Parser::Add<Modulator, FastList<Modulator> >(
bool unique,
const std::string& className);
93 template void Parser::Add<NewColour, FastList<NewColour> >(
bool unique,
const std::string& className);
94 template void Parser::Add<PhysicsBiasing, FastList<PhysicsBiasing> >(
bool unique,
const std::string& className);
96 template void Parser::Add<Query, FastList<Query> >(
bool unique,
const std::string& className);
97 template void Parser::Add<Region, FastList<Region> >(
bool unique,
const std::string& className);
98 template void Parser::Add<SamplerPlacement, FastList<SamplerPlacement> >(
bool unique,
const std::string& className);
99 template void Parser::Add<Scorer, FastList<Scorer> >(
bool unique,
const std::string& className);
100 template void Parser::Add<Tunnel, FastList<Tunnel> >(
bool unique,
const std::string& className);
101 template void Parser::Add<Laser, FastList<Laser> >(
bool unique,
const std::string& className);
107 extern std::string yyfilename;
116 (*call_sequence_log) <<
"Parser::Parser()" << std::endl;
125 std::cerr <<
"Parser has not been initialized!" << std::endl;
135 std::cerr <<
"Warning parser was already initialized!" << std::endl;
144 (*call_sequence_log) <<
"Parser::~Parser()" << std::endl;
156 (*call_sequence_log) <<
"Parser::Parser(" << name <<
")" << std::endl;
160 std::cout <<
"gmad_parser> opening file" << std::endl;
165 std::string tilde(
"~");
166 std::string home(getpwuid(getuid())->pw_dir);
168 replaceAll(name,tilde,home);
170 FILE *f = fopen(name.c_str(),
"r");
174 std::cerr <<
"gmad_parser> Can't open input file " << name << std::endl;
178 yyfilename = std::string(name);
182 std::cout.precision(10);
189 (*call_sequence_log) <<
"Parser::ParseFile(f=" << f <<
")" << std::endl;
194 std::cout <<
"gmad_parser> beginning to parse file" << std::endl;
202 std::cout <<
"gmad_parser> finished to parsing file" << std::endl;
206 std::cout <<
"gmad_parser> clearing temporary lists" << std::endl;
215 std::cout <<
"gmad_parser> finished" << std::endl;
225 (*call_sequence_log) <<
"Parser::Initialise()" << std::endl;
227 const int reserved = 1;
240 add_var(
"pi", 4.0*std::atan(1),reserved);
241 add_var(
"twopi", 8.0*std::atan(1),reserved);
242 add_var(
"halfpi", 2.0*std::atan(1),reserved);
244 add_var(
"PeV",1e6, reserved);
245 add_var(
"TeV",1e3, reserved);
246 add_var(
"GeV",1.0 ,reserved);
247 add_var(
"MeV",1e-3,reserved);
248 add_var(
"keV",1e-6,reserved);
249 add_var(
"KeV",1e-6,reserved);
250 add_var(
"eV" ,1e-9,reserved);
252 add_var(
"PJ", 1e12, reserved);
253 add_var(
"GJ", 1e9, reserved);
254 add_var(
"MJ", 1e6, reserved);
255 add_var(
"kJ", 1e3, reserved);
256 add_var(
"J", 1, reserved);
257 add_var(
"mJ", 1e-3, reserved);
258 add_var(
"uJ", 1e-6, reserved);
259 add_var(
"nJ", 1e-9, reserved);
260 add_var(
"pJ", 1e-12, reserved);
262 add_var(
"mV",1e-3,reserved);
263 add_var(
"V" ,1.0, reserved);
264 add_var(
"kV",1e+3,reserved);
265 add_var(
"MV",1e+6,reserved);
266 add_var(
"GV",1e+9,reserved);
268 add_var(
"Tesla",1.0,reserved);
269 add_var(
"T", 1.0,reserved);
271 add_var(
"km" ,1e3 ,reserved);
272 add_var(
"m" ,1.0 ,reserved);
273 add_var(
"cm" ,1e-2,reserved);
274 add_var(
"mm" ,1e-3,reserved);
275 add_var(
"um" ,1e-6,reserved);
276 add_var(
"mum",1e-6,reserved);
277 add_var(
"nm" ,1e-9,reserved);
278 add_var(
"ang",1e-10,reserved);
279 add_var(
"pm" ,1e-12,reserved);
281 add_var(
"s" ,1.0 ,reserved);
282 add_var(
"ms" ,1.e-3,reserved);
283 add_var(
"us" ,1.e-6,reserved);
284 add_var(
"ns" ,1.e-9,reserved);
285 add_var(
"ps" ,1.e-12,reserved);
287 add_var(
"Hz" ,1.0, reserved);
288 add_var(
"kHz",1e+3, reserved);
289 add_var(
"MHz",1e+6, reserved);
290 add_var(
"GHz",1e+9, reserved);
291 add_var(
"THz",1e+12,reserved);
293 add_var(
"rad" ,1.0, reserved);
294 add_var(
"mrad",1e-3,reserved);
295 add_var(
"urad",1e-6,reserved);
296 add_var(
"nrad",1e-9,reserved);
298 add_var(
"degrees",std::atan(1)/45,reserved);
300 add_var(
"clight",2.99792458e+8,reserved);
302 add_var(
"kg_per_cubic_m", 1e-3, reserved);
303 add_var(
"g_per_cubic_m", 1e-6, reserved);
304 add_var(
"g_per_cubic_cm", 1, reserved);
306 add_var(
"pascal", 1/101324.99987983676, reserved);
307 add_var(
"bar", 1/1.0132499987983676, reserved);
308 add_var(
"torr", 0.00131579, reserved);
309 add_var(
"atmosphere", 1, reserved);
316 (*call_sequence_log) <<
"Parser::quit()" << std::endl;
318 std::cout <<
"parsing complete..." << std::endl;
324 (*call_sequence_log) <<
"Parser::write_table(name=" << *name
326 <<
",isLine=" << isLine <<
")" << std::endl;
330 (*call_sequence_log) <<
"Parser::write_table> name=" << e.name << std::endl;
331 (*call_sequence_log) <<
"Parser::write_table> type=" << e.
type << std::endl;
332 (*call_sequence_log) <<
"Parser::write_table> l=" << e.
l << std::endl;
349 (*call_sequence_log) <<
"Parser::expand_sequences" << std::endl;
360 const std::string& start,
361 const std::string& end)
363 (*call_sequence_log) <<
"Parser::expand_line(name=" << name <<
",start=" << start <<
",end=" << end <<
")" << std::endl;
369 const std::string& name,
370 const std::string& start,
371 const std::string& end)
373 (*call_sequence_log) <<
"Parser::expand_line(target=" << target.
size() <<
",name=" << name <<
",start="
374 << start <<
" end=" << end <<
")" << std::endl;
377 if(line.
type != ElementType::_LINE && line.
type != ElementType::_REV_LINE )
379 std::cerr <<
"Error with use command: \"" << name <<
"\" is not a line" << std::endl;
396 std::cout <<
"expanding line " << name <<
", range = " << start << end << std::endl;
402 std::list<Element>::iterator sit = line.
lst->begin();
403 std::list<Element>::iterator eit = line.
lst->end();
408 case ElementType::_LINE:
409 {target.
insert(target.
end(),sit,eit);
break;}
410 case ElementType::_REV_LINE:
411 {target.
insert(target.
end(),line.
lst->rbegin(),line.
lst->rend());
break;}
413 {target.
insert(target.
end(),sit,eit);
break;}
416 bool is_expanded =
false;
424 std::list<Element>::iterator it = ++target.
begin();
425 for (; it!=target.
end(); ++it)
430 std::cout << element.name <<
" , " << type << std::endl;
433 if (type != ElementType::_LINE && type != ElementType::_REV_LINE)
437 std::list<Element>::const_iterator tmpit =
element_list.find(element.name);
438 std::list<Element>::const_iterator iterEnd =
element_list.end();
439 if ( (tmpit != iterEnd) && ( (*tmpit).lst !=
nullptr) )
443 std::cout <<
"inserting sequence for " << element.name <<
" - " << list.name <<
" ...";
445 if (type == ElementType::_LINE)
447 else if (type == ElementType::_REV_LINE)
450 std::list<Element> tmpList;
451 tmpList.insert(tmpList.end(),list.
lst->begin(),list.
lst->end());
452 for (std::list<Element>::iterator itLineInverter = tmpList.begin();
453 itLineInverter != tmpList.end(); ++itLineInverter)
455 if ( (*itLineInverter).type == ElementType::_LINE)
456 {(*itLineInverter).type = ElementType::_REV_LINE;}
457 else if ((*itLineInverter).type == ElementType::_REV_LINE)
458 {(*itLineInverter).type = ElementType::_LINE;}
460 target.
insert(it,tmpList.rbegin(),tmpList.rend());
463 std::cout <<
"inserted" << std::endl;
468 else if ( tmpit != iterEnd )
472 std::cout <<
"keeping element..." << element.name << std::endl;
478 std::cout <<
"done" << std::endl;
483 std::cerr <<
"Error : Expanding line \"" << name <<
"\" : element \"" << element.name
484 <<
"\" has not been defined! " << std::endl;
491 std::cerr <<
"Error : Line expansion of '" << name <<
"' seems to loop, " << std::endl
492 <<
"possible recursive line definition, quitting" << std::endl;
503 std::list<Element>::const_iterator startIt = target.
find(std::string(start));
505 if(startIt!=target.
end())
511 std::list<Element>::const_iterator endIt = target.
find(std::string(end));
513 if(endIt!=target.
end())
514 {target.
erase(++endIt,target.
end());}
519 std::list<Element>::iterator itTunnel =
element_list.find(
"tunnel");
525 (*call_sequence_log) <<
"Parser::get_sequences()" << std::endl;
532 (*call_sequence_log) <<
"Parser::get_sequence(name=" << name <<
")" << std::endl;
537 {
return *(search->second);}
540 std::cerr <<
"parser> no such sequence \"" << name <<
"\"" << std::endl;
544 throw std::runtime_error(
"parser> no such sequence "+name);
552 const std::string& samplerType,
553 double samplerRadius,
556 (*call_sequence_log) <<
"Parser::set_sampler(name=" << name
557 <<
", count=" << count
558 <<
", ElementType=" << type
559 <<
", samplerType=" << samplerType
560 <<
", samplerRadius=" << samplerRadius
561 <<
", particleSetID=" << particleSetID <<
")" << std::endl;
570 if((*it).type == ElementType::_LINE || (*it).type == ElementType::_REV_LINE)
573 if (type != ElementType::_NONE && type != (*it).type)
576 (*it).setSamplerInfo(samplerType,(*it).name,samplerRadius,particleSetID);
579 else if (count == -1)
582 if (itPair.first == itPair.second)
584 std::string msg =
"parser> SetSampler> current beamline doesn't contain element \"" + name +
"\"";
585 yyerror2(msg.c_str());
587 for (
auto it = itPair.first; it != itPair.second; ++it)
590 auto elementIt = (it->second);
591 std::string samplerName = elementIt->name;
592 if ((*elementIt).type == ElementType::_MARKER)
596 while ((*elementIt).isSpecial())
606 std::cout <<
"parser> SetSampler> WARNING: no element before marker " << name <<
", no sampler added" << std::endl;
610 (*elementIt).setSamplerInfo(samplerType,samplerName,samplerRadius,particleSetID);
618 std::string msg =
"parser> SetSampler> current beamline doesn't contain element \"" + name +
"\" with number " + std::to_string(count);
619 yyerror2(msg.c_str());
622 std::string samplerName = (*it).name;
623 if ((*it).type == ElementType::_MARKER)
627 while ((*it).isSpecial())
632 std::cout <<
"parser> SetSampler> WARNING: no element before marker " << name <<
", no sampler added" << std::endl;
637 (*it).setSamplerInfo(samplerType,samplerName,samplerRadius,particleSetID);
643 (*call_sequence_log) <<
"Parser::add_sampler_partIDSet(samplerPartIDListIn=" << samplerPartIDListIn <<
")" << std::endl;
644 if(samplerPartIDListIn !=
nullptr)
646 (*call_sequence_log) <<
" samplerPartIDListIn.size=" << samplerPartIDListIn->size() << std::endl;
649 (*call_sequence_log) <<
" samplerPartIDListIn=nullptr" << std::endl;
652 if (!samplerPartIDListIn)
654 std::set<int> partIDs = std::set<int>(std::begin(*samplerPartIDListIn), std::end(*samplerPartIDListIn));
656 if (alreadyExists > 0)
657 {
return setToSamplerFilterID[partIDs];}
660 int particleSetID = (int) samplerFilterIDToSet.size();
661 samplerFilterIDToSet[particleSetID] = partIDs;
662 setToSamplerFilterID[partIDs] = particleSetID;
664 return particleSetID;
669 std::string samplerType, std::list<int>* samplerPartIDListIn)
672 std::cout <<
"inserting sampler " << name;
674 {std::cout <<
"[" << count <<
"]";}
675 std::cout << std::endl;
678 (*call_sequence_log) <<
"Parser::add_sampler(name=" << name
679 <<
", count=" << count
681 <<
", samplerType=" << samplerType;
682 if(samplerPartIDListIn !=
nullptr)
684 (*call_sequence_log) <<
" samplerPartIDListIn.size=" << samplerPartIDListIn->size() <<
")" << std::endl;
687 (*call_sequence_log) <<
" samplerPartIDListIn.size=nullptr" <<
")" << std::endl;
691 set_sampler(name,count,type,samplerType,0,particleSetID);
696 (*call_sequence_log) <<
"Parser::find_element(element_name=" << element_name <<
")" << std::endl;
698 std::list<Element>::iterator it =
element_list.find(element_name);
699 std::list<Element>::const_iterator iterEnd =
element_list.end();
703 std::cerr <<
"parser.h> Error: element (type) \"" << element_name
704 <<
"\" has not been defined." << std::endl;
712 (*call_sequence_log) <<
"Parser::find_element(element_name=" << element_name <<
")" << std::endl;
717 std::cerr <<
"parser.h> Error: unknown element \"" << element_name <<
"\"." << std::endl;
725 (*call_sequence_log) <<
"Parser::find_placement_element_safe(element_name=" << element_name <<
")" << std::endl;
727 const Element* result =
nullptr;
739 (*call_sequence_log) <<
"Parser::find_element_safe(element_name=" << element_name <<
")" << std::endl;
741 const Element* result =
nullptr;
753 (*call_sequence_log) <<
"Parser::property_lookup(element_name=" << element_name
754 <<
", property_name=" << property_name <<
")" << std::endl;
763 std::cout <<
"matched sequence element, " << name;
765 {std::cout <<
" * " << number;}
766 std::cout << std::endl;
769 (*call_sequence_log) <<
"Parser::add_element_temp(name=" << name
770 <<
", number=" << number
771 <<
", pushfront=" << pushfront
772 <<
", linetype=" << linetype <<
")" << std::endl;
781 for (
int i = 0; i < number; i++)
786 for (
int i = 0; i < number; i++)
795 std::cout <<
"newinstance : VARIABLE -- " << elementName << std::endl;
798 (*call_sequence_log) <<
"Parser::copy_element_to_params(elementName=" << elementName <<
")" << std::endl;
803 type =
static_cast<int>(element.
type);
811 (*call_sequence_log) <<
"Parser::add_func(name=" << name
812 <<
", func=" << func <<
")" << std::endl;
818void Parser::add_var(std::string name,
double value,
int is_reserved)
820 (*call_sequence_log) <<
"Parser::add_var(name=" << name
821 <<
", value=" << value
822 <<
", is_reserved=" << is_reserved <<
")" << std::endl;
825 sp->
Set(value,is_reserved);
828bool Parser::InvalidSymbolName(
const std::string& s, std::string& errorReason)
830 (*call_sequence_log) <<
"Parser::InvalidSymbolName(s=" << s
831 <<
", errorReason=" << errorReason <<
")" << std::endl;
835 {result =
true; errorReason =
"The variable name \"" + s +
"\" is an option name and cannot be used as a variable name";}
841 (*call_sequence_log) <<
"Parser::symcreate(s=" << s <<
")" << std::endl;
848 (*call_sequence_log) <<
"Parser::symlook(s=" << s <<
")" << std::endl;
855 (*call_sequence_log) <<
"Parser::Store(s=" << value <<
")" << std::endl;
862 (*call_sequence_log) <<
"Parser::Store(name=" << name <<
")" << std::endl;
869 (*call_sequence_log) <<
"Parser::FillArray(array.size=" << array->GetData().size() <<
")" << std::endl;
878 (*call_sequence_log) <<
"Parser::FillString(array.size=" << array->GetData().size() <<
")" << std::endl;
886 (*call_sequence_log) <<
"Parser::ClearParams()" << std::endl;
894 (*call_sequence_log) <<
"Parser::Overwrite(objectName=" << objectName <<
")" << std::endl;
901 bool extended =
false;
919 if ( (extended = FindAndExtend<Atom> (objectName)) ) {}
920 else if ( (extended = FindAndExtend<NewColour> (objectName)) ) {}
921 else if ( (extended = FindAndExtend<Crystal> (objectName)) ) {}
922 else if ( (extended = FindAndExtend<CoolingChannel> (objectName)) ) {}
923 else if ( (extended = FindAndExtend<Field> (objectName)) ) {}
924 else if ( (extended = FindAndExtend<Material> (objectName)) ) {}
925 else if ( (extended = FindAndExtend<Placement> (objectName)) ) {}
926 else if ( (extended = FindAndExtend<Query> (objectName)) ) {}
927 else if ( (extended = FindAndExtend<Region> (objectName)) ) {}
928 else if ( (extended = FindAndExtend<Tunnel> (objectName)) ) {}
929 else if ( (extended = FindAndExtend<CavityModel>(objectName)) ) {}
930 else if ( (extended = FindAndExtend<SamplerPlacement>(objectName)) ) {}
931 else if ( (extended = FindAndExtend<Scorer> (objectName)) ) {}
932 else if ( (extended = FindAndExtend<ScorerMesh> (objectName)) ) {}
933 else if ( (extended = FindAndExtend<Aperture> (objectName)) ) {}
934 else if ( (extended = FindAndExtend<BLMPlacement> (objectName)) ) {}
935 else if ( (extended = FindAndExtend<Modulator> (objectName)) ) {}
936 else if ( (extended = FindAndExtend<Laser> (objectName)) ) {}
941 std::cerr <<
"parser.h> Error: object \"" << objectName
942 <<
"\" has not been defined and can't be extended." << std::endl;
955 (*call_sequence_log) <<
"Parser::FindAndExtend(objectName=" << objectName <<
")" << std::endl;
958 auto search = fl.
find(objectName);
959 if (search != fl.
end())
970 (*call_sequence_log) <<
"Parser::Extend(<C>object=" << &
object <<
")" << std::endl;
973 {
object.set_value(option.first, option.second);}
975 {
object.set_value(option.first, option.second);}
977 {
object.set_value(option.first, option.second);}
982 (*call_sequence_log) <<
"Parser::AddVariable(name=" << *name <<
")" << std::endl;
1009 const std::string& on = objectName;
1012 auto searchAtom = std::find_if(
atom_list.begin(),
atom_list.end(), [&on](
const Atom& obj) {return obj.name == on;});
1014 {searchAtom->print();
return true;}
1017 {searchNewColour->print();
return true;}
1020 {searchCrystal->print();
return true;}
1023 {searchCoolingChannel->print();
return true;}
1024 auto searchField = std::find_if(
field_list.begin(),
field_list.end(), [&on](
const Field& obj) {return obj.name == on;});
1026 {searchField->print();
return true;}
1027 auto searchLaser = std::find_if(
laser_list.begin(),
laser_list.end(), [&on](
const Laser& obj) {return obj.name == on;});
1029 {searchLaser->print();
return true;}
1032 {searchMaterial->print();
return true;}
1033 auto searchQuery = std::find_if(
query_list.begin(),
query_list.end(), [&on](
const Query& obj) {return obj.name == on;});
1035 {searchQuery->print();
return true;}
1038 {searchRegion->print();
return true;}
1041 {searchTunnel->print();
return true;}
1044 {searchXsecbias->print();
return true;}
1047 {searchPlacement->print();
return true;}
1050 {searchCavityModel->print();
return true;}
1053 {searchSamplerPlacement->print();
return true;}
1056 {searchScorer->print();
return true;}
1059 {searchScorerMesh->print();
return true;}
1062 {searchAperture->print();
return true;}
1064 if (searchBLMPlacement !=
blm_list.end())
1065 {searchBLMPlacement->print();
return true;}
1068 {searchModulator->print();
return true;}
1075 (*call_sequence_log) <<
"Parser::GetBeamline()" << std::endl;
1089 template<>
Atom* Parser::GetGlobalPtr(){
return &
atom;}
1093 template<>
Beam* Parser::GetGlobalPtr(){
return &
beam;}
1116 template<>
Field* Parser::GetGlobalPtr(){
return &
field;}
1120 template<>
Laser* Parser::GetGlobalPtr(){
return &
laser;}
1143 template<>
FastList<PhysicsBiasing>& Parser::GetList<PhysicsBiasing, FastList<PhysicsBiasing>>(){
return xsecbias_list;}
1146 template<>
Query* Parser::GetGlobalPtr(){
return &
query;}
1150 template<>
Region* Parser::GetGlobalPtr(){
return &
region;}
1158 template<>
Scorer* Parser::GetGlobalPtr(){
return &
scorer;}
1166 template<>
Tunnel* Parser::GetGlobalPtr(){
return &
tunnel;}
1181 template <
class C,
class Container>
1185 C& global = GetGlobal<C>();
1192 GetList<C, Container>().push_back(inst);
1195 template <
class C,
class Container>
1196 void Parser::Add(
bool unique,
const std::string& className)
1199 C& global = GetGlobal<C>();
1206 GetList<C, Container>().push_back(inst, unique, className);
1216 void Parser::Add<Placement, FastList<Placement>>(
bool unique,
const std::string& className)
1219 Placement& global = GetGlobal<Placement>();
1226 GetList<Placement, FastList<Placement>>().push_back(inst, unique, className);
1233 std::cerr <<
"The bdsimElement referred to in \"" << inst.
name <<
"\" (\""
1234 << inst.
bdsimElement <<
"\") cannot be found and should be defined"
1235 <<
" before this placement" << std::endl;
1238 placement_elements.push_back(
Element(*elDef));
1243std::string Parser::GetCallSequenceLog() {
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.
Cooling channel parameters.
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
int size() const
size of list
Placement class for laser.
Modulator class for parser.
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 instances of that object.
void Add()
Insert global object of parser class C in Container class.
Parser()
Default contructor.
std::vector< std::string > & get_sequences()
Get names of the available sequences.
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 instances of that object.
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
Laser laser
The one instance we fill before appending to a list.
Scorer scorer
The one instance we fill before appending to a list.
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
List of parser defined instances of that object.
FastList< Placement > placement_list
List of parser defined instances of that object.
Material material
The one instance we fill before appending to a list.
virtual ~Parser()
Destructor.
Atom atom
The one instance we fill before appending to a list.
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 instances of that object.
FastList< Modulator > modulator_list
List of parser defined instances of that object.
FastList< NewColour > colour_list
List of parser defined instances of that object.
Parameters params
The one instance we fill before appending to a list.
int add_sampler_partIDSet(std::list< int > *samplerPartIDListIn)
FastList< Scorer > scorer_list
List of parser defined instances of that object.
FastList< Tunnel > tunnel_list
List of parser defined instances of that object.
FastList< Element > element_list
List of all encountered elements.
CoolingChannel coolingchannel
The one instance we fill before appending to a list.
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
Crystal crystal
The one instance we fill before appending to a list.
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 instances of that object.
Modulator modulator
The one instance we fill before appending to a list.
FastList< CoolingChannel > coolingchannel_list
List of parser defined instances of that object.
std::stringstream * call_sequence_log
execution log to understand call order (not an error or debug log)
Tunnel tunnel
The one instance we fill before appending to a list.
void expand_line(FastList< Element > &target, const std::string &name, const std::string &start="", const std::string &end="")
FastList< PhysicsBiasing > xsecbias_list
List of parser defined instances of that object.
void write_table(std::string *name, ElementType type, bool isLine=false)
Method that transfers parameters to element properties.
FastList< ScorerMesh > scorermesh_list
List of parser defined instances of that object.
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.
const FastList< Element > & get_sequence(const std::string &name, bool bExit=true)
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 instances of that object.
Field field
The one instance we fill before appending to a list.
std::list< Element > tmp_list
Temporary list.
Query query
The one instance we fill before appending to a list.
Aperture aperture
The one instance we fill before appending to a list.
void AddVariable(std::string *name)
Add variable memory to variable list for memory management.
BLMPlacement blm
The one instance we fill before appending to a list.
std::map< std::string, std::string > extendedStrings
Map for options of type string for extending objects.
Region region
The one instance we fill before appending to a list.
void ParseFile(FILE *f)
Parse the input file and construct beamline_list and options.
bool FindAndExtend(const std::string &objectName)
Laser instance.
SymbolMap symtab_map
Parser symbol map.
void PrintBeamline() const
Print methods.
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
The one instance we fill before appending to a list.
ScorerMesh scorermesh
The one instance we fill before appending to a list.
const FastList< Element > & GetBeamline() const
void PrintOptions() const
Print methods.
FastList< Field > field_list
List of parser defined instances of that object.
FastList< CavityModel > cavitymodel_list
List of parser defined instances of that object.
std::map< std::string, double > extendedNumbers
Map for options of type double for extending objects.
Placement placement
The one instance we fill before appending to a list.
std::list< double > tmparray
temporary list for reading of arrays in parser
CavityModel cavitymodel
The one instance we fill before appending to a list.
FastList< Query > query_list
List of parser defined instances of that object.
void Store(double value)
Add value to front of temporary list.
static Parser * instance
Instance.
PhysicsBiasing xsecbias
The one instance we fill before appending to a list.
FastList< Laser > laser_list
List of parser defined instances of that object.
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 instances of that object.
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
The one instance we fill before appending to a list.
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.