GEMC  2.3
Geant4 Monte-Carlo Framework
evio_output.cc
Go to the documentation of this file.
1 // gemc headers
2 #include "evio_output.h"
3 #include "utils.h"
4 
5 // C++ headers
6 #include <fstream>
7 
8 // CLHEP units
9 #include "CLHEP/Units/PhysicalConstants.h"
10 using namespace CLHEP;
11 
12 
13 // record the simulation conditions
14 // the format is a string for each variable
15 // the num is 0 for the mother bank, 1 for the data
16 void evio_output :: recordSimConditions(outputContainer* output, map<string, string> sims)
17 {
18  vector<string> data;
19 
20  // writing both key and argument as one string
21  for(map<string, string>::iterator it=sims.begin(); it!=sims.end(); it++)
22  {
23  data.push_back(it->first + ": " + it->second + " ");
24  }
25 
26  evioDOMTree *conditionsBank = new evioDOMTree(SIMULATION_CONDITIONS_BANK_TAG, 0);
27  *conditionsBank << evioDOMNode::createEvioDOMNode(SIMULATION_CONDITIONS_BANK_TAG, 1, data);
28 
29  output->pchan->write(*conditionsBank);
30  delete conditionsBank;
31 }
32 
33 // instantiates the DOM tree
34 // write header bank
35 // each variable is a domnode
36 void evio_output :: writeHeader(outputContainer* output, map<string, double> data, gBank bank)
37 {
38  event = new evioDOMTree(1, 0);
39 
40  evioDOMNodeP headerBank = evioDOMNode::createEvioDOMNode(HEADER_BANK_TAG, 0);
41 
42  // timestamp
43  string time = timeStamp();
44  *headerBank << addVariable(HEADER_BANK_TAG, bank.getVarId("time"), "s", time);
45 
46  for(map<string, double> :: iterator it = data.begin(); it != data.end(); it++)
47  {
48  int bankId = bank.getVarId(it->first);
49 
50  if(bankId)
51  *headerBank << addVariable(HEADER_BANK_TAG, bankId, bank.getVarType(it->first), it->second);
52 
53  // storing event number in memory
54  if(it->first == "evn")
55  evn = it->second;
56 
57  }
58  *event << headerBank;
59 }
60 
61 
62 void evio_output :: writeGenerated(outputContainer* output, vector<generatedParticle> MGP, map<string, gBank> *banksMap)
63 {
64  double MAXP = output->gemcOpt.optMap["NGENP"].arg;
65  double SAVE_ALL_MOTHERS = output->gemcOpt.optMap["SAVE_ALL_MOTHERS"].arg ;
66 
67  gBank bank = getBankFromMap("generated", banksMap);
68  gBank sbank = getBankFromMap("psummary", banksMap);
69 
70  vector<int> pid;
71  vector<double> px;
72  vector<double> py;
73  vector<double> pz;
74  vector<double> vx;
75  vector<double> vy;
76  vector<double> vz;
77 
78  for(unsigned i=0; i<MAXP && i<MGP.size(); i++)
79  {
80  pid.push_back(MGP[i].PID);
81  px.push_back(MGP[i].momentum.getX()/MeV);
82  py.push_back(MGP[i].momentum.getY()/MeV);
83  pz.push_back(MGP[i].momentum.getZ()/MeV);
84  vx.push_back(MGP[i].vertex.getX()/mm);
85  vy.push_back(MGP[i].vertex.getY()/mm);
86  vz.push_back(MGP[i].vertex.getZ()/mm);
87  }
88 
89  // creating and inserting generated particles bank >> TAG=10 NUM=0 <<
90  evioDOMNodeP generatedp = evioDOMNode::createEvioDOMNode(GENERATED_PARTICLES_BANK_TAG, 0);
91 
92  *generatedp << addVector(GENERATED_PARTICLES_BANK_TAG, bank.getVarId("pid"), bank.getVarType("pid"), pid);
93  *generatedp << addVector(GENERATED_PARTICLES_BANK_TAG, bank.getVarId("px"), bank.getVarType("px"), px);
94  *generatedp << addVector(GENERATED_PARTICLES_BANK_TAG, bank.getVarId("py"), bank.getVarType("py"), py);
95  *generatedp << addVector(GENERATED_PARTICLES_BANK_TAG, bank.getVarId("pz"), bank.getVarType("pz"), pz);
96  *generatedp << addVector(GENERATED_PARTICLES_BANK_TAG, bank.getVarId("vx"), bank.getVarType("vx"), vx);
97  *generatedp << addVector(GENERATED_PARTICLES_BANK_TAG, bank.getVarId("vy"), bank.getVarType("vy"), vy);
98  *generatedp << addVector(GENERATED_PARTICLES_BANK_TAG, bank.getVarId("vz"), bank.getVarType("vz"), vz);
99 
100  if(SAVE_ALL_MOTHERS)
101  {
102  vector<string> dname;
103  vector<int> stat;
104  vector<double> etot;
105  vector<double> nphe;
106  vector<double> time;
107 
108  for(unsigned int i=0; i<MAXP && i<MGP.size(); i++)
109  {
110 
111 
112  for(unsigned d=0; d<MGP[i].pSum.size(); d++)
113  {
114  dname.push_back(MGP[i].pSum[d].dname);
115  stat.push_back(MGP[i].pSum[d].stat);
116  etot.push_back(MGP[i].pSum[d].etot);
117  nphe.push_back(MGP[i].pSum[d].nphe);
118  time.push_back(MGP[i].pSum[d].t);
119  }
120 
121  }
122 
123  evioDOMNodeP summaryBank = evioDOMNode::createEvioDOMNode(GENERATED_SUMMARY_BANK_TAG, 0);
124  *summaryBank << addVector(GENERATED_SUMMARY_BANK_TAG, sbank.getVarId("dname"), bank.getVarType("dname"), dname);
125  *summaryBank << addVector(GENERATED_SUMMARY_BANK_TAG, sbank.getVarId("stat"), bank.getVarType("stat"), stat);
126  *summaryBank << addVector(GENERATED_SUMMARY_BANK_TAG, sbank.getVarId("etot"), bank.getVarType("etot"), etot);
127  *summaryBank << addVector(GENERATED_SUMMARY_BANK_TAG, sbank.getVarId("nphe"), bank.getVarType("nphe"), etot);
128  *summaryBank << addVector(GENERATED_SUMMARY_BANK_TAG, sbank.getVarId("t"), bank.getVarType("t"), time);
129  *generatedp << summaryBank;
130  }
131 
132  *event << generatedp;
133 
134 }
135 
136 void evio_output :: initBank(outputContainer* output, gBank thisHitBank, int what)
137 {
138  static int oldEvn;
139 
140  // new event, initialize everything
141  if(oldEvn != evn)
142  {
143  insideBank.clear();
144  insideRawIntBank.clear();
145  insideDgtIntBank.clear();
146  insideRawAllBank.clear();
147  oldEvn = evn;
148  }
149 
150  if(!insideBank[thisHitBank.bankName])
151  {
152  // master bank
153  detectorBank = evioDOMNode::createEvioDOMNode(thisHitBank.idtag, DETECTOR_BANK_ID);
154  *event << detectorBank;
155  insideBank[thisHitBank.bankName] = 1;
156  }
157 
158  // true information (integrated)
159  if(!insideRawIntBank[thisHitBank.bankName] && what == RAWINT_ID)
160  {
161  detectorRawIntBank[thisHitBank.bankName] = evioDOMNode::createEvioDOMNode(thisHitBank.idtag + RAWINT_ID, 0);
162  *detectorBank << detectorRawIntBank[thisHitBank.bankName];
163  insideRawIntBank[thisHitBank.bankName] = 1;
164  }
165 
166  // digitized information
167  if(!insideDgtIntBank[thisHitBank.bankName] && what == DGTINT_ID)
168  {
169  detectorDgtIntBank[thisHitBank.bankName] = evioDOMNode::createEvioDOMNode(thisHitBank.idtag + DGTINT_ID, 0);
170  *detectorBank << detectorDgtIntBank[thisHitBank.bankName];
171  insideDgtIntBank[thisHitBank.bankName] = 1;
172  }
173 
174  // true information (step by step)
175  if(!insideRawAllBank[thisHitBank.bankName] && what == RAWSTEP_ID)
176  {
177  detectorRawAllBank[thisHitBank.bankName] = evioDOMNode::createEvioDOMNode(thisHitBank.idtag + RAWSTEP_ID, 0);
178  *detectorBank << detectorRawAllBank[thisHitBank.bankName];
179  insideRawAllBank[thisHitBank.bankName] = 1;
180  }
181 
182 }
183 
184 
185 void evio_output :: writeG4RawIntegrated(outputContainer* output, vector<hitOutput> HO, string hitType, map<string, gBank> *banksMap)
186 {
187  gBank thisHitBank = getBankFromMap(hitType, banksMap);
188  gBank rawBank = getBankFromMap("raws", banksMap);
189 
190  initBank(output, thisHitBank, RAWINT_ID);
191 
192  for(map<int, string>::iterator it = rawBank.orderedNames.begin(); it != rawBank.orderedNames.end(); it++)
193  {
194  int bankId = rawBank.getVarId(it->second);
195  int bankType = rawBank.getVarBankType(it->second);
196 
197  // we only need the first hit to get the definitions
198  map<string, double> raws = HO[0].getRaws();
199 
200  if(raws.find(it->second) != raws.end() && bankId > 0 && bankType == RAWINT_ID)
201  {
202  vector<double> thisVar;
203  for(unsigned int nh=0; nh<HO.size(); nh++)
204  {
205  map<string, double> theseRaws = HO[nh].getRaws();
206  thisVar.push_back(theseRaws[it->second]);
207  }
208  *(detectorRawIntBank[thisHitBank.bankName]) << addVector(rawBank.idtag + thisHitBank.idtag, bankId, rawBank.getVarType(it->second), thisVar);
209  }
210  }
211 }
212 
213 
214 
215 void evio_output :: writeG4DgtIntegrated(outputContainer* output, vector<hitOutput> HO, string hitType, map<string, gBank> *banksMap)
216 {
217  gBank thisHitBank = getBankFromMap(hitType, banksMap);
218  gBank dgtBank = getDgtBankFromMap(hitType, banksMap);
219 
220  initBank(output, thisHitBank, DGTINT_ID);
221 
222  for(map<int, string>::iterator it = dgtBank.orderedNames.begin(); it != dgtBank.orderedNames.end(); it++)
223  {
224  int bankId = dgtBank.getVarId(it->second);
225  int bankType = dgtBank.getVarBankType(it->second);
226 
227  // we only need the first hit to get the definitions
228  map<string, double> dgts = HO[0].getDgtz();
229 
230  if(dgts.find(it->second) != dgts.end() && bankId > 0 && bankType == DGTINT_ID)
231  {
232  vector<double> thisVar;
233  for(unsigned int nh=0; nh<HO.size(); nh++)
234  {
235  map<string, double> theseDgts = HO[nh].getDgtz();
236  thisVar.push_back(theseDgts[it->second]);
237  }
238  *(detectorDgtIntBank[thisHitBank.bankName]) << addVector(dgtBank.idtag + thisHitBank.idtag, bankId, dgtBank.getVarType(it->second), thisVar);
239  }
240  }
241 
242 }
243 
244 
245 void evio_output :: writeG4RawAll(outputContainer* output, vector<hitOutput> HO, string hitType, map<string, gBank> *banksMap)
246 {
247  gBank thisHitBank = getBankFromMap(hitType, banksMap);
248  gBank allRawsBank = getBankFromMap("allraws", banksMap);
249 
250  initBank(output, thisHitBank, RAWSTEP_ID);
251 
252  for(map<int, string>::iterator it = allRawsBank.orderedNames.begin(); it != allRawsBank.orderedNames.end(); it++)
253  {
254  int bankId = allRawsBank.getVarId(it->second);
255  int bankType = allRawsBank.getVarBankType(it->second);
256 
257  // we only need the first hit to get the definitions
258  map<string, vector<double> > allRaws = HO[0].getAllRaws();
259 
260  if(allRaws.find(it->second) != allRaws.end() && bankId > 0 && bankType == RAWSTEP_ID)
261  {
262  vector<double> thisVar;
263  for(unsigned int nh=0; nh<HO.size(); nh++)
264  {
265  map<string, vector<double> > theseRaws = HO[nh].getAllRaws();
266 
267  vector<double> theseRawsSteps = theseRaws[it->second];
268 
269  for(unsigned s=0; s<theseRawsSteps.size(); s++)
270  thisVar.push_back(theseRawsSteps[s]);
271 
272  }
273 
274 
275  *(detectorRawAllBank[thisHitBank.bankName]) << addVector(allRawsBank.idtag + thisHitBank.idtag, bankId, allRawsBank.getVarType(it->second), thisVar);
276  }
277  }
278 }
279 
280 
281 
282 
283 evioDOMNodeP addVariable(int tag, int num, string type, double value)
284 {
285  // return right away if "d"
286  if(type == "d")
287  return evioDOMNode::createEvioDOMNode(tag, num, &value, 1);
288 
289  // otherwise check
290  if(type == "i")
291  {
292  int varI = (int) value;
293  return evioDOMNode::createEvioDOMNode(tag, num, &varI, 1);
294  }
295 
296  // repeated return to make compiler happy
297  return evioDOMNode::createEvioDOMNode(tag, num, &value, 1);
298 
299 }
300 
301 
302 evioDOMNodeP addVariable(int tag, int num, string type, int value)
303 {
304  return evioDOMNode::createEvioDOMNode(tag, num, &value, 1);
305 }
306 
307 evioDOMNodeP addVariable(int tag, int num, string type, string value)
308 {
309  return evioDOMNode::createEvioDOMNode(tag, num, &value, 1);
310 }
311 
312 
313 evioDOMNodeP addVector(int tag, int num, string type, vector<double> value)
314 {
315  // return right away if "d"
316  if(type == "d")
317  return evioDOMNode::createEvioDOMNode(tag, num, value);
318 
319  // otherwise convert the double into int
320  if(type == "i")
321  {
322  vector<int> VI;
323  for(unsigned i=0; i<value.size(); i++)
324  VI.push_back(value[i]);
325  return evioDOMNode::createEvioDOMNode(tag, num, VI);
326  }
327 
328  return evioDOMNode::createEvioDOMNode(tag, num, value);
329 }
330 
331 // we don't convert back to double, that should be in the
332 // variable definition
333 evioDOMNodeP addVector(int tag, int num, string type, vector<int> value)
334 {
335  return evioDOMNode::createEvioDOMNode(tag, num, value);
336 }
337 
338 
339 evioDOMNodeP addVector(int tag, int num, string type, vector<string> value)
340 {
341  return evioDOMNode::createEvioDOMNode(tag, num, value);
342 }
343 
344 
345 
346 
348 {
349  output->pchan->write(*event);
350  delete event;
351 }
352 
void writeGenerated(outputContainer *, vector< generatedParticle >, map< string, gBank > *banksMap)
Definition: evio_output.cc:62
string timeStamp()
Definition: utils.cc:318
string getVarType(string)
Definition: gbank.cc:369
void recordSimConditions(outputContainer *, map< string, string >)
Definition: evio_output.cc:16
gBank getDgtBankFromMap(string name, map< string, gBank > *banksMap)
Definition: gbank.cc:438
int idtag
unique id for the bank
Definition: gbank.h:102
int getVarBankType(string)
Definition: gbank.cc:381
void writeHeader(outputContainer *, map< string, double >, gBank)
Definition: evio_output.cc:36
#define GENERATED_PARTICLES_BANK_TAG
Definition: gbank.h:27
void writeG4RawIntegrated(outputContainer *, vector< hitOutput >, string, map< string, gBank > *)
Definition: evio_output.cc:185
void writeG4DgtIntegrated(outputContainer *, vector< hitOutput >, string, map< string, gBank > *)
Definition: evio_output.cc:215
#define HEADER_BANK_TAG
Definition: gbank.h:24
void writeEvent(outputContainer *)
Definition: evio_output.cc:347
evioDOMNodeP addVariable(int tag, int num, string type, double value)
Definition: evio_output.cc:283
gBank getBankFromMap(string name, map< string, gBank > *banksMap)
Definition: gbank.cc:424
map< string, aopt > optMap
Options map.
Definition: options.h:75
evioDOMNodeP addVector(int tag, int num, string type, vector< double > value)
Definition: evio_output.cc:313
#define DETECTOR_BANK_ID
Definition: gbank.h:39
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
#define SIMULATION_CONDITIONS_BANK_TAG
Definition: gbank.h:21
#define RAWSTEP_ID
Definition: gbank.h:65
virtual void writeG4RawAll(outputContainer *, vector< hitOutput >, string, map< string, gBank > *)
Definition: evio_output.cc:245
#define RAWINT_ID
Definition: gbank.h:50
void initBank(outputContainer *, gBank, int what)
Definition: evio_output.cc:136
Definition: gbank.h:86
evioFileChannel * pchan
#define DGTINT_ID
Definition: gbank.h:61