GEMC  2.3
Geant4 Monte-Carlo Framework
gbank.cc
Go to the documentation of this file.
1 
8 // Qt headers
9 #include <QtSql>
10 
11 // gemc headers
12 #include "gbank.h"
13 #include "string_utilities.h"
14 #include "utils.h"
15 
16 // Variable Type is two chars.
17 // The first char:
18 // R for raw integrated variables
19 // D for dgt integrated variables
20 // S for raw step by step variables
21 // M for digitized multi-hit variables
22 // V for voltage(time) variables
23 
24 // The second char:
25 // i for integers
26 // d for doubles
27 // s for strings
28 
29 
30 map<string, gBank> read_banks(goptions gemcOpt, map<string, string> allSystems)
31 {
32  double verbosity = gemcOpt.optMap["BANK_VERBOSITY"].arg ;
33 
34  // geant4 information, integrated over
35  map<string, gBank> banks;
36 
37  gBank abank;
38 
39  // event header
40  abank = gBank(HEADER_BANK_TAG, "header", "Data Header Bank");
41  abank.load_variable("time", 1, "Ns", "Time-stamp");
42  abank.load_variable("runNo", 2, "Ni", "Run Number");
43  abank.load_variable("evn", 3, "Ni", "Event Number");
44  abank.load_variable("evn_type", 4, "Ni", "Event Type. 1 for physics events, 10 for scaler. Negative sign for MC.");
45  abank.load_variable("beamPol", 5, "Nd", "Beam Polarization");
46  abank.load_variable("var1", 6, "Nd", "User defined. In LUND this was: Target Polarization");
47  abank.load_variable("var2", 7, "Nd", "User defined. In LUND this was: Number of nucleons in the target");
48  abank.load_variable("var3", 8, "Nd", "User defined. In LUND this was: Number of protons in the target");
49  abank.load_variable("var4", 9, "Nd", "User defined. In LUND this was: Bjorken x");
50  abank.load_variable("var5", 10, "Nd", "User defined. In LUND this was: Fraction of energy loss");
51  abank.load_variable("var6", 11, "Nd", "User defined. In LUND this was: W square");
52  abank.load_variable("var7", 12, "Nd", "User defined. In LUND this was: Q square");
53  abank.load_variable("var8", 13, "Nd", "User defined. In LUND this was: Energy loss");
54  abank.orderNames();
55  banks["header"] = abank;
56 
57  // generated particle infos
58  abank = gBank(GENERATED_PARTICLES_BANK_TAG, "generated", "Generated Particles");
59  abank.load_variable("pid", 1, "Ni", "Particle ID");
60  abank.load_variable("px", 2, "Nd", "x component of momentum");
61  abank.load_variable("py", 3, "Nd", "y component of momentum");
62  abank.load_variable("pz", 4, "Nd", "z component of momentum");
63  abank.load_variable("vx", 5, "Nd", "x component of vertex");
64  abank.load_variable("vy", 6, "Nd", "y component of vertex");
65  abank.load_variable("vz", 7, "Nd", "z component of vertex");
66  abank.orderNames();
67  banks["generated"] = abank;
68 
69  // particle summary infos
70  // this is a daughter bank of the generated particle infos
71  abank = gBank(GENERATED_SUMMARY_BANK_TAG, "psummary", "Generated Particles Summary");
72  abank.load_variable("dname", 1, "Ns", "Detector Name");
73  abank.load_variable("stat", 2, "Ni", "Number of Hits in the detector");
74  abank.load_variable("etot", 3, "Nd", "Total Energy Deposited");
75  abank.load_variable("t", 4, "Nd", "Fastest Time on Detector");
76  abank.load_variable("nphe", 5, "Ni", "Number of Photoelectrons");
77  abank.orderNames();
78  banks["psummary"] = abank;
79 
80 
81  // all hit bank information have a variable with num 0 "hitn" = hit number;
82 
83  // geant4 raw integrated
84  // common for all banks
85  abank = gBank(RAWINT_ID, "raws", "Geant4 true information integrated over the hit");
86  abank.load_variable("pid", 1, "Ri", "ID of the first particle entering the sensitive volume");
87  abank.load_variable("mpid", 2, "Ri", "ID of the mother of the first particle entering the sensitive volume");
88  abank.load_variable("tid", 3, "Ri", "Track ID of the first particle entering the sensitive volume");
89  abank.load_variable("mtid", 4, "Ri", "Track ID of the mother of the first particle entering the sensitive volume");
90  abank.load_variable("otid", 5, "Ri", "Track ID of the original track that generated the first particle entering the sensitive volume");
91  abank.load_variable("trackE", 6, "Rd", "Energy of the track");
92  abank.load_variable("totEdep", 7, "Rd", "Total Energy Deposited (in MeV");
93  abank.load_variable("avg_x", 8, "Rd", "Average X position in the global reference system (in mm)");
94  abank.load_variable("avg_y", 9, "Rd", "Average Y position in the global reference system (in mm)");
95  abank.load_variable("avg_z", 10, "Rd", "Average Z position in the global reference system (in mm)");
96  abank.load_variable("avg_lx", 11, "Rd", "Average X position in the local reference system (in mm)");
97  abank.load_variable("avg_ly", 12, "Rd", "Average Y position in the local reference system (in mm)");
98  abank.load_variable("avg_lz", 13, "Rd", "Average Z position in the local reference system (in mm)");
99  abank.load_variable("px", 14, "Rd", "x component of momentum of the particle entering the sensitive volume");
100  abank.load_variable("py", 15, "Rd", "y component of momentum of the particle entering the sensitive volume");
101  abank.load_variable("pz", 16, "Rd", "z component of momentum of the particle entering the sensitive volume");
102  abank.load_variable("vx", 17, "Rd", "x component of point of origin of the particle entering the sensitive volume");
103  abank.load_variable("vy", 18, "Rd", "y component of point of origin of the particle entering the sensitive volume");
104  abank.load_variable("vz", 19, "Rd", "z component of point of origin of the particle entering the sensitive volume");
105  abank.load_variable("mvx", 20, "Rd", "x component of point of origin the mother of the particle entering the sensitive volume");
106  abank.load_variable("mvy", 21, "Rd", "y component of point of origin of the mother of the particle entering the sensitive volume");
107  abank.load_variable("mvz", 22, "Rd", "z component of point of origin of the mother of the particle entering the sensitive volume");
108  abank.load_variable("avg_t", 23, "Rd", "Average time");
109  abank.load_variable("nsteps", 24, "Ri", "Number of geant4 steps");
110  abank.load_variable("procID", 25, "Ri", "Process that created the particle. It's an integer described at gemc.jlab.org");
111  abank.load_variable("hitn", 99, "Ri", "Hit Number");
112  abank.orderNames();
113  banks["raws"] = abank;
114 
115 
116  // geant4 raw step by step
117  // common for all banks
118  abank = gBank(RAWSTEP_ID, "allraws", "Geant4 true information step by step");
119  abank.load_variable("pid", 1, "Si", "ID of the particle in the sensitive volume");
120  abank.load_variable("mpid", 2, "Si", "ID of the mother in the sensitive volume");
121  abank.load_variable("tid", 3, "Si", "Track ID of the particle in the sensitive volume");
122  abank.load_variable("mtid", 4, "Si", "Track ID of the mother of the particle in the sensitive volume");
123  abank.load_variable("otid", 5, "Si", "Track ID of the original track that generated the particle in the sensitive volume");
124  abank.load_variable("trackE", 6, "Sd", "Energy of the track");
125  abank.load_variable("edep", 7, "Sd", "Energy Deposited");
126  abank.load_variable("x", 8, "Sd", "X position in global reference system");
127  abank.load_variable("y", 9, "Sd", "Y position in global reference system");
128  abank.load_variable("z", 10, "Sd", "Z position in global reference system");
129  abank.load_variable("lx", 11, "Sd", "X position in local reference system");
130  abank.load_variable("ly", 12, "Sd", "Y position in local reference system");
131  abank.load_variable("lz", 13, "Sd", "Z position in local reference system");
132  abank.load_variable("px", 14, "Sd", "x component of momentum of the particle in the sensitive volume");
133  abank.load_variable("py", 15, "Sd", "y component of momentum of the particle in the sensitive volume");
134  abank.load_variable("pz", 16, "Sd", "z component of momentum of the particle in the sensitive volume");
135  abank.load_variable("vx", 17, "Sd", "x component of primary vertex of the particle in the sensitive volume");
136  abank.load_variable("vy", 18, "Sd", "y component of primary vertex of the particle in the sensitive volume");
137  abank.load_variable("vz", 19, "Sd", "z component of primary vertex of the particle in the sensitive volume");
138  abank.load_variable("mvx", 20, "Sd", "x component of primary vertex of the mother of the particle in the sensitive volume");
139  abank.load_variable("mvy", 21, "Sd", "y component of primary vertex of the mother of the particle in the sensitive volume");
140  abank.load_variable("mvz", 22, "Sd", "z component of primary vertex of the mother of the particle in the sensitive volume");
141  abank.load_variable("t", 23, "Sd", "time");
142  abank.load_variable("stepn", 98, "Si", "step index");
143  abank.load_variable("hitn", 99, "Si", "Hit Number");
144  abank.orderNames();
145  banks["allraws"] = abank;
146 
147 
148 
149  // flux bank integrated digitized infos
150  // flux digitized provide just one "digitized" variable, the detector id
151  abank = gBank(FLUX_BANK_TAG, "flux", "Geant4 flux digitized information integrated over the hit");
152  abank.load_variable("hitn", 99, "Di", "Hit Number");
153  abank.load_variable("id", 1, "Di", "ID of flux element");
154  abank.orderNames();
155  banks["flux"] = abank;
156 
157 
158  // Loading all banks related to a system
159  // then checking that all sensitive detectors have a bank
160  for(map<string, string>::iterator sit = allSystems.begin(); sit != allSystems.end(); sit++)
161  {
162  string systemName = sit->first;
163  string systemFactory = sit->second;
164 
165  if(systemName == "flux") continue;
166 
167  // text factory
168  if(systemFactory == "TEXT")
169  {
170 
171  string fname = systemName + "__bank.txt";
172  ifstream IN(fname.c_str());
173  if(!IN)
174  {
175  // if file is not found, maybe it's in the GEMC_DATA_DIR directory
176  if(getenv("GEMC_DATA_DIR") != NULL)
177  {
178  fname = (string) getenv("GEMC_DATA_DIR") + "/" + fname;
179  IN.open(fname.c_str());
180  }
181 
182  }
183  // now file should be loaded
184  if(IN)
185  {
186  if(verbosity > 1)
187  cout << " > Loading bank TEXT definitions for <" << systemName << ">." << endl;
188 
189 
190  // first get all banks for this system
191  vector<string> banksForSystem;
192  while(!IN.eof())
193  {
194  string dbline;
195  getline(IN, dbline);
196 
197  if(!dbline.size()) continue;
198 
199  gtable gt(get_strings(dbline, "|"));
200 
201  if(gt.data.size())
202  if(gt.data[1] == "bankid")
203  banksForSystem.push_back(gt.data[0]); // 0: bank name
204  }
205  // rewind IN
206  IN.clear();
207  IN.seekg(0);
208 
209  // now loading bank and variables
210  for(unsigned b=0; b<banksForSystem.size(); b++)
211  {
212  while(!IN.eof())
213  {
214  string dbline;
215  getline(IN, dbline);
216 
217  if(!dbline.size()) continue;
218 
219  gtable gt(get_strings(dbline, "|"));
220 
221  // the bankid entry is always the first
222  if(gt.data.size())
223  if(gt.data[0] == banksForSystem[b])
224  {
225  string bname = gt.data[0]; // 0: bank name
226  string vname = gt.data[1]; // 0: variable name
227  string desc = gt.data[2]; // 2: bank/variable description
228  int num = get_number(gt.data[3]); // 3: variable num is bank id
229  string type = gt.data[4]; // 4: variable type
230 
231  if(vname == "bankid")
232  {
233  abank = gBank(num, bname, desc);
234  }
235  else
236  {
237  abank.load_variable(vname, num, type, desc);
238 
239  }
240  }
241  }
242  abank.orderNames();
243  banks[banksForSystem[b]] = abank;
244  IN.clear();
245  IN.seekg(0);
246  }
247 
248  IN.close();
249  }
250  else
251  {
252  if(verbosity>2)
253  cout << " !!! Error: Failed to open system bank file " << fname
254  << ". Maybe the filename doesn't exist? Exiting." << endl;
255  }
256  }
257 
258  if(systemFactory == "MYSQL")
259  {
260  // connection to the DB
261  QSqlDatabase db = openGdb(gemcOpt);
262  string tname = systemName + "__bank";
263  // hardcoding original variation for now
264  string variation = "original";
265 
266  if(verbosity > 1) cout << " > Loading MYSQL definitions for <" << systemName << ">." << endl;
267 
268  // first getting all banks from system
269  string dbexecute = "select bankname, name from " + tname ;
270  dbexecute += " where variation ='" + variation + "'";
271 
272  QSqlQuery q;
273  if(!q.exec(dbexecute.c_str()))
274  {
275  cout << " !!! Failed to execute MYSQL query " << dbexecute << ". This is a fatal error. Exiting." << endl;
276  qDebug() << q.lastError();
277  exit(0);
278  }
279 
280  // Warning if nothing is found
281  if(q.size() == 0 && verbosity)
282  {
283  cout << " ** WARNING: system \"" << systemName << "\" not found in MYSQL database "
284  << " for variation " << variation << endl << endl;
285  }
286 
287  vector<string> banksForSystem;
288  while (q.next())
289  {
290  // Reading variables
291 
292  // 0: variable name
293  string name = qv_tostring(q.value(1));
294 
295  if(name == "bankid")
296  banksForSystem.push_back(qv_tostring(q.value(0)));
297 
298  }
299 
300 
301  for(unsigned b=0; b<banksForSystem.size(); b++)
302  {
303  // re-executing the query and loading variables
304  dbexecute = "select bankname, name, num, type, description from " + tname ;
305  dbexecute += " where variation ='" + variation + "'";
306  dbexecute += " and bankname = '" + banksForSystem[b] + "'";
307  q.exec(dbexecute.c_str());
308  while (q.next())
309  {
310  string bname = qv_tostring(q.value(0)); // 0: bank name
311  string vname = qv_tostring(q.value(1)); // 1: variable name
312  int num = get_number(qv_tostring(q.value(2))); // 2: variable num is bank id
313  string type = qv_tostring(q.value(3)); // 3: variable type
314  string desc = qv_tostring(q.value(4)); // 4: variable description
315 
316  // need to make sure bankid is the first entry
317  // that comes out of the mysql query
318  if(vname == "bankid")
319  {
320  abank = gBank(num, bname, desc);
321  }
322  else
323  {
324  abank.load_variable(vname, num, type, desc);
325  }
326  }
327  abank.orderNames();
328  banks[banksForSystem[b]] = abank;
329 
330  }
331 
332 
333  // closing DB connection
334  closeGdb(db);
335  }
336 
337  }
338  if(verbosity > 3)
339  {
340  for(map<string, gBank>::iterator it = banks.begin(); it != banks.end(); it++)
341  cout << it->second;
342  }
343 
344  return banks;
345 }
346 
347 // Load a variable in the bank definition
348 void gBank::load_variable(string n, int i, string t, string d)
349 {
350  // adding the variable index to order the map
351  name.push_back(n);
352  id.push_back(i);
353  type.push_back(t);
354  description.push_back(d);
355 }
356 
357 
358 int gBank::getVarId(string bank)
359 {
360  for(unsigned int i=0; i<name.size(); i++)
361  {
362  if(name[i].find(bank) == 0) return id[i];
363  }
364  return -1;
365 }
366 
367 
368 
369 string gBank::getVarType(string var)
370 {
371  for(unsigned int i=0; i<name.size(); i++)
372  if(name[i] == var && type[i].length() == 2)
373  {
374  if(type[i].find("i") == 1) return "i";
375  if(type[i].find("d") == 1) return "d";
376  }
377 
378  return "na";
379 }
380 
381 int gBank::getVarBankType(string var)
382 {
383  for(unsigned int i=0; i<name.size(); i++)
384  {
385  if(name[i] == var && type[i].length() == 2)
386  {
387  if(type[i].find("R") == 0) return RAWINT_ID;
388  if(type[i].find("D") == 0) return DGTINT_ID;
389  if(type[i].find("S") == 0) return RAWSTEP_ID;
390  if(type[i].find("M") == 0) return DGTMULTI_ID;
391  if(type[i].find("V") == 0) return VOLTAGETIME_ID;
392  }
393  }
394  return 0;
395 }
396 
397 // order names based on their ID
399 {
400  int minId = 1000;
401  int maxId = 0;
402 
403  // first find min, max ID
404  for(unsigned i=0; i<id.size(); i++)
405  {
406  if(id[i] < minId) minId = id[i];
407  if(id[i] > maxId) maxId = id[i];
408  }
409 
410  int j = 0;
411  for(int i=minId; i<=maxId; i++)
412  {
413  for(unsigned k=0; k<id.size(); k++)
414  {
415  if(i == id[k])
416  {
417  orderedNames[j++] = name[k];
418  }
419  }
420  }
421 }
422 
423 // get bank definitions (all)
424 gBank getBankFromMap(string name, map<string, gBank>* banksMap)
425 {
426  if(banksMap->find(name) == banksMap->end())
427  {
428  cout << " !!! Error: >" << name << "< bank definitions not found. Exiting." << endl;
429  exit(0);
430  }
431 
432  return (*banksMap)[name];
433 }
434 
435 
436 
437 // get dgt bank definitions
438 gBank getDgtBankFromMap(string name, map<string, gBank>* banksMap)
439 {
440  gBank thisBank, dgtBank;
441  if(banksMap->find(name) == banksMap->end())
442  {
443  cout << " !!! Error: >" << name << "< bank definitions not found. Exiting." << endl;
444  exit(0);
445  }
446  else
447  {
448  // thisBank may have definitions other than DGT
449  // so I'm extracting just the DGT variables from it.
450  thisBank = (*banksMap)[name];
451 
452  dgtBank = gBank(DGTINT_ID, thisBank.bankName, thisBank.bdescription);
453  for(unsigned int i=0; i<thisBank.name.size(); i++)
454  {
455  if(thisBank.getVarBankType(thisBank.name[i]) == DGTINT_ID)
456  {
457  dgtBank.load_variable(thisBank.name[i], thisBank.id[i], thisBank.type[i], thisBank.description[i]);
458  }
459  }
460 
461  }
462  dgtBank.orderNames();
463  return dgtBank;
464 }
465 
466 // Overloaded "<<" for the class 'bank'
467 ostream &operator<<(ostream &stream, gBank bank)
468 {
469  cout << " >> Bank " << bank.bankName << " loaded with id " << bank.idtag << " : " << bank.bdescription << endl;
470 
471  for(unsigned i = 0; i<bank.name.size(); i++)
472  {
473  cout << " > Variable : " << bank.name[i] << "\t id: " << bank.id[i] << "\t type: " << bank.type[i] << " : " << bank.description[i] << endl;
474  }
475  cout << endl;
476  return stream;
477 }
478 
void load_variable(string, int, string, string)
Definition: gbank.cc:348
vector< string > get_strings(string input)
returns a vector of strings from a stringstream, space is delimiter
string getVarType(string)
Definition: gbank.cc:369
void closeGdb(QSqlDatabase db)
Definition: utils.cc:252
QSqlDatabase openGdb(goptions gemcOpt)
Definition: utils.cc:218
gBank getDgtBankFromMap(string name, map< string, gBank > *banksMap)
Definition: gbank.cc:438
vector< string > data
Definition: utils.h:76
Definition: utils.h:65
double verbosity
int idtag
unique id for the bank
Definition: gbank.h:102
int getVarBankType(string)
Definition: gbank.cc:381
friend ostream & operator<<(ostream &stream, gBank)
Overloaded "<<" for the class &#39;bank&#39;.
Definition: gbank.cc:467
#define GENERATED_PARTICLES_BANK_TAG
Definition: gbank.h:27
#define DGTMULTI_ID
Definition: gbank.h:69
string qv_tostring(QVariant input)
vector< string > type
Variable type.
Definition: gbank.h:111
double get_number(string v, int warn_no_unit)
Returns number with dimension from string, i.e. 100*cm.
#define HEADER_BANK_TAG
Definition: gbank.h:24
gBank getBankFromMap(string name, map< string, gBank > *banksMap)
Definition: gbank.cc:424
map< string, aopt > optMap
Options map.
Definition: options.h:75
string bankName
name of the bank, it&#39;s also key in the map but we store it here as well
Definition: gbank.h:101
map< int, string > orderedNames
Definition: gbank.h:126
int getVarId(string)
Definition: gbank.cc:358
#define GENERATED_SUMMARY_BANK_TAG
Definition: gbank.h:30
vector< string > name
Variable name.
Definition: gbank.h:106
#define VOLTAGETIME_ID
Definition: gbank.h:73
#define RAWSTEP_ID
Definition: gbank.h:65
map< string, gBank > read_banks(goptions gemcOpt, map< string, string > allSystems)
Definition: gbank.cc:30
vector< int > id
Output variable identifier.
Definition: gbank.h:107
#define RAWINT_ID
Definition: gbank.h:50
Definition: gbank.h:86
#define FLUX_BANK_TAG
Definition: gbank.h:33
gBank()
Definition: gbank.h:89
vector< string > description
Variable description.
Definition: gbank.h:112
string bdescription
bank description
Definition: gbank.h:103
#define DGTINT_ID
Definition: gbank.h:61
void orderNames()
Definition: gbank.cc:398