source: trunk/examples/advanced/radiation_monitor/analysis/src/RadmonAnalysis.cc@ 1307

Last change on this file since 1307 was 807, checked in by garnier, 17 years ago

update

File size: 10.3 KB
Line 
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// File name: RadmonAnalysis.cc
28// Creation date: Nov 2005
29// Main author: Riccardo Capra <capra@ge.infn.it>
30//
31// Id: $Id: RadmonAnalysis.cc,v 1.2.2.2 2006/06/29 16:07:35 gunter Exp $
32// Tag: $Name: geant4-09-01-patch-02 $
33//
34
35// Include files
36#include "RadmonAnalysis.hh"
37
38#include "RadmonVDataAnalysisFactory.hh"
39#include "RadmonVDataAnalysis.hh"
40#include "RadmonVAnalysisLayout.hh"
41#include "RadmonSensitiveDetector.hh"
42#include "G4UIcommand.hh"
43#include "G4Event.hh"
44#include "G4SDManager.hh"
45#include "G4RunManager.hh"
46#include "G4Run.hh"
47#include <fstream>
48#include <exception>
49
50using namespace std;
51
52 RadmonAnalysis :: RadmonAnalysis(RadmonVAnalysisLayout * layout, RadmonVDataAnalysisFactory * factory, AIDA::IAnalysisFactory * analysis)
53:
54 analysisLayout(layout),
55 dataFactory(factory),
56 analysisFactory(analysis),
57 treeFactory(0),
58 tree(0),
59 changed(true)
60{
61 if (analysisLayout==0)
62 G4Exception("RadmonAnalysis::RadmonAnalysis: layout==0.");
63
64 if (dataFactory==0)
65 G4Exception("RadmonAnalysis::RadmonAnalysis: factory==0.");
66
67 if (analysisFactory==0)
68 G4Exception("RadmonAnalysis::RadmonAnalysis: analysis==0.");
69
70 analysisLayout->AttachObserver(this);
71
72 treeFactory=analysisFactory->createTreeFactory();
73}
74
75
76
77 RadmonAnalysis :: ~RadmonAnalysis()
78{
79 analysisLayout->DetachObserver(this);
80
81 Destruct();
82
83 delete treeFactory;
84 delete analysisFactory;
85 delete dataFactory;
86}
87
88
89
90
91
92void RadmonAnalysis :: OnLayoutChange(void)
93{
94 changed=true;
95}
96
97
98
99
100
101void RadmonAnalysis :: OnBeginOfEvent(const G4Event * /* event */)
102{
103 if (!changed)
104 return;
105
106 Destruct();
107
108 list<G4String> tupleLabels;
109 G4String columns("int runId; int eventId");
110
111 if (!InitializeSensitiveDetectorsList(tupleLabels, columns))
112 {
113 changed=true;
114 return;
115 }
116
117 if (!OpenFile())
118 {
119 changed=true;
120 return;
121 }
122
123 if (!InitializeTuple(tupleLabels, columns))
124 {
125 changed=false;
126 return;
127 }
128
129 indexRunId=tuple->findColumn("runId");
130 indexEventId=tuple->findColumn("eventId");
131
132 changed=false;
133}
134
135
136
137
138
139void RadmonAnalysis :: OnEndOfEvent(const G4Event * event)
140{
141 if (!tuple)
142 return;
143
144 if (sensitiveDetectorsList.empty())
145 return;
146
147 SensitiveDetectorsList::iterator sd(sensitiveDetectorsList.begin());
148 const SensitiveDetectorsList::iterator sdEnd(sensitiveDetectorsList.end());
149
150 G4SDManager * manager(G4SDManager::GetSDMpointer());
151
152 if (!manager)
153 return;
154
155 tuple->fill(indexRunId, G4RunManager::GetRunManager()->GetCurrentRun()->GetRunID());
156 tuple->fill(indexEventId, event->GetEventID());
157
158 while (sd!=sdEnd)
159 {
160 RadmonSensitiveDetector * radmonSensitiveDetector(sd->first);
161 DataAnalysesList * dataAnalysesList(sd->second);
162
163 RadmonHitsCollection * collection(radmonSensitiveDetector->GetDetectorCollection());
164
165 DataAnalysesList::iterator i(dataAnalysesList->begin());
166 DataAnalysesList::iterator end(dataAnalysesList->end());
167
168 while (i!=end)
169 {
170 (*i)->StoreIntoTuple(collection, tuple);
171 i++;
172 }
173
174 sd++;
175 }
176
177 tuple->addRow();
178}
179
180
181
182
183
184G4bool RadmonAnalysis :: InitializeSensitiveDetectorsList(list<G4String> & tupleLabels, G4String & columns)
185{
186 G4SDManager * manager(G4SDManager::GetSDMpointer());
187
188 if (!manager)
189 return false;
190
191 RadmonVAnalysisLayout const * const constLayout(analysisLayout);
192 G4int n(constLayout->GetNSensitiveDetectors());
193
194 tupleLabels.clear();
195
196 while (n>0)
197 {
198 n--;
199
200 const G4String & sensitiveDetectorLabel(constLayout->GetSensitiveDetectorLabel(n));
201 G4VSensitiveDetector * sensitiveDetector(manager->FindSensitiveDetector(sensitiveDetectorLabel, false));
202
203 if (!sensitiveDetector)
204 {
205 G4cout << "RadmonAnalysis::InitializeSensitiveDetectorsList: \"" << sensitiveDetectorLabel << "\" is not attached to any volume." << G4endl;
206 continue;
207 }
208
209 RadmonSensitiveDetector * radmonSensitiveDetector;
210 try
211 {
212 radmonSensitiveDetector=dynamic_cast<RadmonSensitiveDetector *>(sensitiveDetector);
213 }
214 catch (exception e)
215 {
216 G4cout << "RadmonAnalysis::InitializeSensitiveDetectorsList: \"" << sensitiveDetectorLabel << "\" is not a RadmonSensitiveDetector object." << G4endl;
217 radmonSensitiveDetector=0;
218 }
219
220 if (!radmonSensitiveDetector)
221 continue;
222
223 const G4String & sensitiveDetectorType(constLayout->GetSensitiveDetectorType(sensitiveDetectorLabel));
224
225 G4int m(constLayout->GetNDataAnalyses(sensitiveDetectorType));
226
227 if (m==0)
228 continue;
229
230 DataAnalysesList * dataAnalysesList(new DataAnalysesList);
231
232 G4String sensitiveDetectorColumns;
233 while (m>0)
234 {
235 m--;
236
237 const G4String & dataAnalysisLabel(constLayout->GetDataAnalysisLabel(sensitiveDetectorType, m));
238 const G4String & dataAnalysisType(constLayout->GetDataAnalysisType(sensitiveDetectorType, dataAnalysisLabel));
239
240 RadmonVDataAnalysis * dataAnalysis(dataFactory->CreateDataAnalysis(dataAnalysisType));
241
242 if (dataAnalysis==0)
243 {
244 G4cout << "RadmonAnalysis::InitializeSensitiveDetectorsList: \"" << dataAnalysisLabel << "\" defined in \"" << sensitiveDetectorType << "\" not found in the analysis factory." << G4endl;
245 continue;
246 }
247
248 G4String tupleLabel(sensitiveDetectorLabel);
249 tupleLabel+='_';
250 tupleLabel+=dataAnalysisLabel;
251
252 G4String dataAnalysisColumns(dataAnalysis->ObtainColumnsDeclaration(tupleLabel));
253
254 if (dataAnalysisColumns.empty())
255 continue;
256
257 dataAnalysesList->push_back(dataAnalysis);
258 tupleLabels.push_back(tupleLabel);
259
260 columns+="; ";
261 columns+=dataAnalysisColumns;
262 }
263
264 if (dataAnalysesList->empty())
265 delete dataAnalysesList;
266 else
267 sensitiveDetectorsList.push_back(SensitiveDetectorPair(radmonSensitiveDetector, dataAnalysesList));
268 }
269
270 return !sensitiveDetectorsList.empty();
271}
272
273
274
275G4bool RadmonAnalysis :: OpenFile(void)
276{
277 RadmonVAnalysisLayout const * const constLayout(analysisLayout);
278 const G4String & original(constLayout->GetOutputFileName());
279 G4String fileName(original);
280
281 for(G4int index(1); ; index++)
282 {
283 ifstream in(fileName);
284
285 if (!in.is_open())
286 break;
287
288 fileName=(original+'_')+G4UIcommand::ConvertToString(index);
289 }
290
291 if (fileName!=original)
292 G4cout << "RadmonAnalysis::OpenFile: \"" << original << "\" just exists. \"" << fileName << "\" will be used." << G4endl;
293
294 try
295 {
296 tree=treeFactory->create(fileName, constLayout->GetOutputFileFormat(), false, true);
297 }
298 catch (exception e)
299 {
300 G4cout << "RadmonAnalysis::OpenFile: " << e.what() << G4endl;
301 tree=0;
302 }
303
304 if (!tree)
305 return false;
306
307 tupleFactory=analysisFactory->createTupleFactory(* tree);
308
309 if (!tupleFactory)
310 {
311 delete tree;
312 tree=0;
313 return false;
314 }
315
316 return true;
317}
318
319
320
321G4bool RadmonAnalysis :: InitializeTuple(const list<G4String> & tupleLabels, const G4String & columns)
322{
323 try
324 {
325 tuple=tupleFactory->create("1", "Radmon", columns);
326 }
327 catch (exception e)
328 {
329 G4cout << "RadmonAnalysis::InitializeTuple: " << e.what() << G4endl;
330 tuple=0;
331 }
332
333 SensitiveDetectorsList::iterator sd(sensitiveDetectorsList.begin());
334 const SensitiveDetectorsList::iterator sdEnd(sensitiveDetectorsList.end());
335 list<G4String>::const_iterator j(tupleLabels.begin());
336
337 while (sd!=sdEnd)
338 {
339 RadmonSensitiveDetector * radmonSensitiveDetector(sd->first);
340 DataAnalysesList * dataAnalysesList(sd->second);
341
342 DataAnalysesList::iterator i(dataAnalysesList->begin());
343 DataAnalysesList::iterator end(dataAnalysesList->end());
344
345 if (tuple==0)
346 {
347 while (i!=end)
348 {
349 delete *i;
350 i=dataAnalysesList->erase(i);
351 }
352 }
353
354 if (dataAnalysesList->empty())
355 {
356 delete dataAnalysesList;
357 sd=sensitiveDetectorsList.erase(sd);
358 }
359 else
360 {
361 radmonSensitiveDetector->Activate(true);
362
363 i=dataAnalysesList->begin();
364 end=dataAnalysesList->end();
365
366 while (i!=end)
367 {
368 radmonSensitiveDetector->AttachDataStorer(*i);
369 (*i)->InitializeFromTuple(*j, tuple);
370 j++;
371 i++;
372 }
373
374 sd++;
375 }
376 }
377
378 return !sensitiveDetectorsList.empty();
379}
380
381
382
383
384
385
386void RadmonAnalysis :: Destruct(void)
387{
388 if (tree)
389 {
390 tree->commit();
391 tree->close();
392
393 delete tupleFactory;
394 delete tree;
395 tree=0;
396 tupleFactory=0;
397 }
398
399 while (!sensitiveDetectorsList.empty())
400 {
401 SensitiveDetectorPair sensitiveDetectorPair(sensitiveDetectorsList.back());
402 sensitiveDetectorsList.pop_back();
403 sensitiveDetectorPair.first->Activate(false);
404 sensitiveDetectorPair.first->ClearDataStorersList();
405
406 DataAnalysesList::iterator i(sensitiveDetectorPair.second->begin());
407 const DataAnalysesList::iterator end(sensitiveDetectorPair.second->end());
408
409 while (i!=end)
410 {
411 delete (*i);
412 i++;
413 }
414
415 delete sensitiveDetectorPair.second;
416 }
417}
Note: See TracBrowser for help on using the repository browser.