BDSIM
BDSIM is a Geant4 extension toolkit for simulation of particle transport in accelerator beamlines.
parser.h
1/*
2Beam Delivery Simulation (BDSIM) Copyright (C) Royal Holloway,
3University of London 2001 - 2022.
4
5This file is part of BDSIM.
6
7BDSIM is free software: you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published
9by the Free Software Foundation version 3 of the License.
10
11BDSIM is distributed in the hope that it will be useful, but
12WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with BDSIM. If not, see <http://www.gnu.org/licenses/>.
18*/
19#ifndef PARSER_H
20#define PARSER_H
21
22#include <list>
23#include <map>
24#include <set>
25#include <string>
26#include <vector>
27
28#include "aperture.h"
29#include "atom.h"
30#include "beam.h"
31#include "blmplacement.h"
32#include "cavitymodel.h"
33#include "newcolour.h"
34#include "crystal.h"
35#include "element.h"
36#include "elementtype.h"
37#include "field.h"
38#include "fastlist.h"
39#include "material.h"
40#include "options.h"
41#include "parameters.h"
42#include "physicsbiasing.h"
43#include "placement.h"
44#include "query.h"
45#include "region.h"
46#include "scorer.h"
47#include "scorermesh.h"
48#include "samplerplacement.h"
49#include "symbolmap.h"
50#include "tunnel.h"
51
53int yyerror(const char *);
55extern int yylex();
56
63namespace GMAD
64{
65 class Array;
66 class Symtab;
77 class Parser
78 {
79 public:
81 Parser() = delete;
83 static Parser* Instance(const std::string& filename);
85 static Parser* Instance();
87 virtual ~Parser();
88
89 protected:
91 explicit Parser(std::string filename);
92 private:
96 void Initialise();
98 void ParseFile(FILE *f);
99
100 public:
102 void quit();
104 void write_table(std::string* name, ElementType type, bool isLine=false);
105
108 void expand_line(FastList<Element>& target,
109 const std::string& name,
110 std::string start = "",
111 std::string end = "");
112
114 void expand_line(const std::string& name, std::string start, std::string end);
115
118 const FastList<Element>& get_sequence(const std::string& name);
119
122 int add_sampler_partIDSet(std::list<int>* samplerPartIDListIn);
124 void add_sampler(const std::string& name, int count, ElementType type, std::string samplerType, std::list<int>* samplerPartIDListIn = nullptr);
126 template <class C, class Container=FastList<C>>
127 void Add();
128 template <class C, class Container=FastList<C>>
129 void Add(bool unique, const std::string& className);
131 template <class C>
134 template <class C, class Container=FastList<C>>
135 Container& GetList();
136
137 const std::set<std::set<int>>& GetSamplerFilters() const {return samplerFilters;}
138 const std::map<int, std::set<int>>& GetSamplerFilterIDToSet() const {return samplerFilterIDToSet;}
139
141 Element& find_element(const std::string& element_name);
143 const Element& find_element(const std::string& element_name) const;
145 const Element* find_element_safe(const std::string& element_name) const;
147 const Element* find_placement_element_safe(const std::string& element_name) const;
149 double property_lookup(const std::string& element_name, const std::string& property_name) const;
151 void add_element_temp(const std::string& name, int number, bool pushfront, ElementType linetype);
153 int copy_element_to_params(const std::string& elementName);
154
155 bool InvalidSymbolName(const std::string& s, std::string& errorReason);
157 Symtab * symcreate(const std::string& s);
159 Symtab * symlook(const std::string& s);
160
162 void Store(double value);
163 void Store(const std::string& name);
166 void FillArray(Array*);
167 void FillString(Array*);
170 void ClearParams();
172 template <class C, typename T>
173 void SetValue(std::string property, T value);
175 template <class C>
176 double GetValue(std::string property);
177
178 template<typename T>
179 std::list<T>* ArrayToList(Array*);
180
182 template <typename T>
183 void ExtendValue(const std::string& property, T value);
184
186 void Overwrite(const std::string& objectName);
188 void AddVariable(std::string* name);
190 void PrintBeamline()const;
191 void PrintElements()const;
192 void PrintOptions()const;
196 bool TryPrintingObject(const std::string& objectName) const;
197
199 std::string current_line;
200 std::string current_start;
201 std::string current_end;
204 const FastList<Element>& GetBeamline() const;
205
206 private:
208 void set_sampler(const std::string& name,
209 int count, ElementType type,
210 const std::string& samplerType,
211 double samplerRadius=0,
212 int particleSetID = -1);
214 void add_func(std::string name, double (*func)(double));
215 void add_var(std::string name, double value, int is_reserved = 0);
216
218 void expand_sequences();
219
220 // protected implementation (for inheritance to BDSParser - hackish)
221 protected:
250 FastList<Scorer> scorer_list;
251 FastList<ScorerMesh> scorermesh_list;
256
257 private:
258 // *****************
259 // Private members *
260 // *****************
262 const int MAX_EXPAND_ITERATIONS = 50;
263
265 std::list<double> tmparray;
266 std::list<std::string> tmpstring;
269 std::vector<std::list<Element>*> allocated_lines;
270
303
305 template <class C>
306 bool FindAndExtend(const std::string& objectName);
308 template <class C>
309 void ExtendObject(C& object);
310
312 std::map<std::string, double> extendedNumbers;
314 std::map<std::string, std::string> extendedStrings;
316 std::map<std::string, Array*> extendedVectors;
317
320
325
327 std::list<Element> tmp_list;
328
330 std::vector<std::string> sequences;
331
333 std::map<std::string, FastList<Element>*> expandedSequences;
334
338 std::vector<std::string*> var_list;
339
342 std::set<std::set<int>> samplerFilters;
343 std::map<int, std::set<int>> samplerFilterIDToSet;
344 std::map<std::set<int>, int> setToSamplerFilterID;
345 };
346
347 template <class C, typename T>
348 void Parser::SetValue(std::string property, T value)
349 {
350 GetGlobal<C>().set_value(property, value);
351 }
352
353 template <class C>
354 double Parser::GetValue(std::string property)
355 {
356 return GetGlobal<C>().get_value(property);
357 }
358
359 template<typename T>
360 std::list<T>* Parser::ArrayToList(Array* arrayIn)
361 {
362 if (!arrayIn)
363 {return nullptr;}
364 else
365 {
366 std::list<T>* result = new std::list<T>();
367 const auto& doubleData = arrayIn->GetDataList();
368 for (auto& value : doubleData)
369 {result->push_back((T)value);}
370 return result;
371 }
372 }
373}
374
375#endif
Aperture class.
Definition: aperture.h:38
Representation of arrays used in tokens.
Definition: array.h:40
blm for parser.
Definition: blmplacement.h:39
Beam class.
Definition: beam.h:44
RF CavityModel class for parser.
Definition: cavitymodel.h:35
Crystal class for parser.
Definition: crystal.h:37
List with Efficient Lookup.
Definition: fastlist.h:42
Field class for parser.
Definition: field.h:37
Colour definition for parser.
Definition: newcolour.h:40
Options class.
Definition: options.h:44
Parser class.
Definition: parser.h:78
void Overwrite(const std::string &objectName)
Overwrite object with current values.
Definition: parser.cc:735
FastList< Atom > atom_list
List of parser defined atoms.
Definition: parser.h:229
void Add()
Insert global object of parser class C in Container class.
Definition: parser.cc:1022
std::vector< std::list< Element > * > allocated_lines
Definition: parser.h:269
double property_lookup(const std::string &element_name, const std::string &property_name) const
access property of Element with element_name
Definition: parser.cc:633
FastList< BLMPlacement > blm_list
List of parser defined blms.
Definition: parser.h:255
std::vector< std::string > sequences
Names of all defined sequences in the parser with 'line'.
Definition: parser.h:330
void FillString(Array *)
Definition: parser.cc:723
const int MAX_EXPAND_ITERATIONS
maximum number of nested lines
Definition: parser.h:262
void quit()
Exit method.
Definition: parser.cc:267
Scorer scorer
Scorer instance.
Definition: parser.h:296
void ExtendValue(const std::string &property, T value)
Add value to be extended to object.
std::string current_line
Name of beamline.
Definition: parser.h:199
void ExtendObject(C &object)
Extend object with maps.
Definition: parser.cc:804
FastList< Crystal > crystal_list
Definition: parser.h:231
FastList< Placement > placement_list
List of parser defined placements.
Definition: parser.h:245
Material material
Material instance;.
Definition: parser.h:280
virtual ~Parser()
Destructor.
Definition: parser.cc:114
void expand_line(FastList< Element > &target, const std::string &name, std::string start="", std::string end="")
Definition: parser.cc:305
Atom atom
Atom instance;.
Definition: parser.h:274
Symtab * symlook(const std::string &s)
look up parser symbol
Definition: parser.cc:703
static Parser * Instance()
Access method.
Definition: parser.cc:93
std::map< std::string, FastList< Element > * > expandedSequences
Cached copy of expanded sequences.
Definition: parser.h:333
FastList< Region > region_list
List of parser defined regions.
Definition: parser.h:239
void SetValue(std::string property, T value)
Set value for parser class.
Definition: parser.h:348
FastList< NewColour > colour_list
List of parser defined colours.
Definition: parser.h:230
Parameters params
Parameters to copy to Element.
Definition: parser.h:272
int add_sampler_partIDSet(std::list< int > *samplerPartIDListIn)
Definition: parser.cc:553
FastList< Tunnel > tunnel_list
List of parser defined tunnels.
Definition: parser.h:241
FastList< Element > element_list
List of all encountered elements.
Definition: parser.h:319
Container & GetList()
Get list for parser class C.
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
Definition: parser.cc:571
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
Definition: parser.cc:663
Crystal crystal
Definition: parser.h:276
bool TryPrintingObject(const std::string &objectName) const
Definition: parser.cc:834
Options options
General options.
Definition: parser.h:225
Element & find_element(const std::string &element_name)
find element
Definition: parser.cc:582
FastList< Aperture > aperture_list
List of parser defined apertures.
Definition: parser.h:253
Tunnel tunnel
Tunnel instance.
Definition: parser.h:290
FastList< PhysicsBiasing > xsecbias_list
List of parser defined cross section biasing objects.
Definition: parser.h:243
void write_table(std::string *name, ElementType type, bool isLine=false)
Method that transfers parameters to element properties.
Definition: parser.cc:273
const Element * find_placement_element_safe(const std::string &element_name) const
search placement_element
Definition: parser.cc:609
void PrintElements() const
Print methods.
Definition: parser.cc:824
FastList< Element > placement_elements
Definition: parser.h:324
std::vector< std::string * > var_list
Variable vector for memory storage.
Definition: parser.h:338
FastList< Element > beamline_list
Beamline.
Definition: parser.h:227
void add_element_temp(const std::string &name, int number, bool pushfront, ElementType linetype)
add element to temporary element sequence tmp_list
Definition: parser.cc:639
std::set< std::set< int > > samplerFilters
Definition: parser.h:342
FastList< SamplerPlacement > samplerplacement_list
List of parser defined sampler placements.
Definition: parser.h:249
Field field
Field instance;.
Definition: parser.h:278
std::list< Element > tmp_list
Temporary list.
Definition: parser.h:327
Query query
Query instance.
Definition: parser.h:286
Aperture aperture
Aperture instance.
Definition: parser.h:300
void AddVariable(std::string *name)
Add variable memory to variable list for memory management.
Definition: parser.cc:814
BLMPlacement blm
BLM instance.
Definition: parser.h:302
std::map< std::string, std::string > extendedStrings
Map for options of type string for extending objects.
Definition: parser.h:314
Region region
Region instance;.
Definition: parser.h:288
std::string current_end
Name of beamline.
Definition: parser.h:201
void ParseFile(FILE *f)
Parse the input file and construct beamline_list and options.
Definition: parser.cc:155
bool FindAndExtend(const std::string &objectName)
Find object by name in list.
Definition: parser.cc:791
SymbolMap symtab_map
Parser symbol map.
Definition: parser.h:336
void PrintBeamline() const
Print methods.
Definition: parser.cc:819
const FastList< Element > & get_sequence(const std::string &name)
Definition: parser.cc:458
std::map< std::string, Array * > extendedVectors
Map for options of type vector for extending objects.
Definition: parser.h:316
void set_sampler(const std::string &name, int count, ElementType type, const std::string &samplerType, double samplerRadius=0, int particleSetID=-1)
Set sampler.
Definition: parser.cc:468
double GetValue(std::string property)
Get value for parser class (only for doubles)
Definition: parser.h:354
Symtab * symcreate(const std::string &s)
create new parser symbol
Definition: parser.cc:698
NewColour colour
NewColour instance.
Definition: parser.h:275
ScorerMesh scorermesh
ScorerMesh instance.
Definition: parser.h:298
const FastList< Element > & GetBeamline() const
Definition: parser.cc:896
void PrintOptions() const
Print methods.
Definition: parser.cc:829
void ClearParams()
Definition: parser.cc:729
void FillArray(Array *)
Definition: parser.cc:717
FastList< Field > field_list
List of parser defined fields.
Definition: parser.h:233
FastList< CavityModel > cavitymodel_list
List of parser defined rf cavity models.
Definition: parser.h:247
std::map< std::string, double > extendedNumbers
Map for options of type double for extending objects.
Definition: parser.h:312
Placement placement
Placement instance.
Definition: parser.h:284
std::list< double > tmparray
temporary list for reading of arrays in parser
Definition: parser.h:265
CavityModel cavitymodel
RF Cavity model instance.
Definition: parser.h:292
FastList< Query > query_list
List of parser defined query objects.
Definition: parser.h:237
Parser()=delete
No default constructor.
void Store(double value)
Add value to front of temporary list.
Definition: parser.cc:707
static Parser * instance
Instance.
Definition: parser.h:94
PhysicsBiasing xsecbias
PhysicsBiasing instance.
Definition: parser.h:282
Beam beam
Beam instance;.
Definition: parser.h:223
void add_func(std::string name, double(*func)(double))
Add function to parser.
Definition: parser.cc:678
void Initialise()
Initialisation of parser functions and constants.
Definition: parser.cc:187
FastList< Material > material_list
List of parser defined materials.
Definition: parser.h:235
std::string current_start
Name of beamline.
Definition: parser.h:200
const Element * find_element_safe(const std::string &element_name) const
find element by pointer - nullptr if not found - searches element_list
Definition: parser.cc:621
void expand_sequences()
Expand all sequences define with 'line' into FastLists.
Definition: parser.cc:290
std::list< std::string > tmpstring
temporary list for reading of arrays in parser
Definition: parser.h:266
SamplerPlacement samplerplacement
Sampler placement instance.
Definition: parser.h:294
Physics biasing class for parser.
Placement class for parser.
Definition: placement.h:41
Query structure class for parser.
Definition: query.h:37
Region class for parser.
Definition: region.h:36
Sampler placement class for parser.
ScorerMesh class for parser.
Definition: scorermesh.h:38
Scorer class for parser.
Definition: scorer.h:37
Class that hold the symbol table.
Definition: symbolmap.h:33
Tunnel class for parser.
Definition: tunnel.h:35
Parser namespace for GMAD language. Combination of Geant4 and MAD.
ElementType
types of elements
Definition: elementtype.h:28
Atom class.
Definition: atom.h:36
Material class.
Definition: material.h:39
Parameters - Element class with booleans.
Definition: parameters.h:44