Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4VAnalysisManager.cc
Go to the documentation of this file.
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// $Id$
27
28// Author: Ivana Hrivnacova, 15/06/2011 ([email protected])
29
30#include "G4VAnalysisManager.hh"
32#include "G4UnitsTable.hh"
33
34#include <iostream>
35
36//_____________________________________________________________________________
38 : fVerboseLevel(0),
39 fActivation(false),
40 fFirstHistoId(0),
41 fFirstNtupleColumnId(0),
42 fFileName(""),
43 fHistoDirectoryName(""),
44 fNtupleDirectoryName(""),
45 fLockFirstHistoId(false),
46 fLockFirstNtupleColumnId(false),
47 fLockFileName(false),
48 fLockHistoDirectoryName(false),
49 fLockNtupleDirectoryName(false),
50 fVerboseL1(type,1),
51 fVerboseL2(type,2),
52 fVerboseL3(type,3),
53 fVerboseL4(type,4),
54 fpVerboseL1(0),
55 fpVerboseL2(0),
56 fpVerboseL3(0),
57 fpVerboseL4(0),
58 fMessenger(0),
59 fNofActiveObjects(0),
60 fNofAsciiObjects(0),
61 fH1Informations(),
62 fH2Informations()
63{
64 fMessenger = new G4AnalysisMessenger(this);
65}
66
67//_____________________________________________________________________________
69{
70 delete fMessenger;
71 // add delete G4HnInformation objects
72}
73
74//
75// protected methods
76//
77
78//_____________________________________________________________________________
80 const G4String& unitName,
81 const G4String& fcnName,
82 G4double unit, G4Fcn fcn)
83{
84 fH1Informations.push_back(
85 new G4HnInformation(name, unitName, unitName, fcnName, fcnName,
86 unit, unit, fcn, fcn));
87 ++fNofActiveObjects;
88}
89
90//_____________________________________________________________________________
92 const G4String& xunitName,
93 const G4String& yunitName,
94 const G4String& xfcnName,
95 const G4String& yfcnName,
96 G4double xunit, G4double yunit,
97 G4Fcn xfcn, G4Fcn yfcn)
98{
99 fH2Informations.push_back(
100 new G4HnInformation(name, xunitName, yunitName, xfcnName, yfcnName,
101 xunit, yunit, xfcn, yfcn));
102 ++fNofActiveObjects;
103}
104
105//_____________________________________________________________________________
107{
108 // Replace or add file extension .ascii
109 G4String name(fFileName);
110 if ( name.find(".") != std::string::npos ) {
111 name.erase(name.find("."), name.length());
112 }
113 name.append(".ascii");
114
115#ifdef G4VERBOSE
116 if ( fpVerboseL3 )
117 fpVerboseL3->Message("write ASCII", "file", name);
118#endif
119
120 std::ofstream output(name, std::ios::out);
121 if ( ! output ) {
122 G4ExceptionDescription description;
123 description
124 << "Cannot open file. File name is not defined.";
125 G4Exception("G4VAnalysisManager::WriteAscii()",
126 "Analysis_W009", JustWarning, description);
127 return false;
128 }
129 output.setf( std::ios::scientific, std::ios::floatfield );
130
131 G4bool result = WriteOnAscii(output);
132
133#ifdef G4VERBOSE
134 if ( fpVerboseL1 )
135 fpVerboseL1->Message("write ASCII", "file", name, result);
136#endif
137
138 return result;
139}
140
141//_____________________________________________________________________________
143{
144 G4HnInformation* info = GetInformation(type, id);
145
146 if ( ! info ) return "";
147
148 return info->fName;
149}
150
151//_____________________________________________________________________________
153{
154 G4HnInformation* info = GetInformation(type, id);
155
156 if ( ! info ) return 1.0;
157
158 return info->fXUnit;
159}
160
161//_____________________________________________________________________________
163{
164 G4HnInformation* info = GetInformation(type, id);
165
166 if ( ! info ) return 1.0;
167
168 return info->fYUnit;
169}
170
171//_____________________________________________________________________________
173{
174 G4HnInformation* info = GetInformation(type, id);
175
176 if ( ! info ) return true;
177
178 return info->fActivation;
179}
180
181//_____________________________________________________________________________
183{
184 G4HnInformation* info = GetInformation(type, id);
185
186 if ( ! info ) return false;
187
188 return info->fAscii;
189}
190
191//_____________________________________________________________________________
193{
194 G4double value = 1.;
195 if ( unit != "none" ) {
196 value = G4UnitDefinition::GetValueOf(unit);
197 if ( value == 0. ) value = 1.;
198 }
199 return value;
200}
201
202//_____________________________________________________________________________
204{
205 G4Fcn fcn = G4FcnIdentity;
206 if ( fcnName != "none" ) {
207 if ( fcnName == "log" ) fcn = std::log;
208 else if ( fcnName == "log10") fcn = std::log10;
209 else if ( fcnName == "exp" ) fcn = std::exp;
210 else {
211 G4ExceptionDescription description;
212 description
213 << " \"" << fcnName << "\" function is not supported." << G4endl
214 << " " << "No function will be applied to h1 values.";
215 G4Exception("G4AnalysisMessenger::GetFunction",
216 "Analysis_W013", JustWarning, description);
217 }
218 }
219 return fcn;
220}
221
222//
223// public methods
224//
225
226//_____________________________________________________________________________
228{
229 if ( verboseLevel == fVerboseLevel || verboseLevel < 0 ) return;
230
231 fVerboseLevel = verboseLevel;
232
233 if ( verboseLevel == 0 ) {
234 fpVerboseL1 = 0;
235 fpVerboseL2 = 0;
236 fpVerboseL3 = 0;
237 fpVerboseL4 = 0;
238 }
239 else if ( verboseLevel == 1 ) {
241 fpVerboseL2 = 0;
242 fpVerboseL3 = 0;
243 fpVerboseL4 = 0;
244 }
245 else if ( verboseLevel == 2 ) {
248 fpVerboseL3 = 0;
249 fpVerboseL4 = 0;
250 }
251 else if ( verboseLevel == 3 ) {
255 fpVerboseL4 = 0;
256 }
257 else {
262 }
263}
264
265//_____________________________________________________________________________
267{
268 if ( fFileName == "" ) {
269 G4ExceptionDescription description;
270 description
271 << "Cannot open file. File name is not defined.";
272 G4Exception("G4VAnalysisManager::OpenFile()",
273 "Analysis_W009", JustWarning, description);
274 return false;
275 }
276
277 return OpenFile(fFileName);
278}
279
280//_____________________________________________________________________________
282{
283 if ( fLockFileName ) {
284 G4ExceptionDescription description;
285 description
286 << "Cannot set File name as its value was already used.";
287 G4Exception("G4VAnalysisManager::SetFileName()",
288 "Analysis_W009", JustWarning, description);
289 return false;
290 }
291
292 fFileName = fileName;
293 return true;
294}
295
296//_____________________________________________________________________________
298{
300 G4ExceptionDescription description;
301 description
302 << "Cannot set Histo directory name as its value was already used.";
303 G4Exception("G4VAnalysisManager::SetHistoDirectoryName()",
304 "Analysis_W009", JustWarning, description);
305 return false;
306 }
307
308 fHistoDirectoryName = dirName;
309 return true;
310}
311
312//_____________________________________________________________________________
314{
316 G4ExceptionDescription description;
317 description
318 << "Cannot set Ntuple directory name as its value was already used.";
319 G4Exception("G4VAnalysisManager::SetNtupleDirectoryName()",
320 "Analysis_W010", JustWarning, description);
321 return false;
322 }
323
324 fNtupleDirectoryName = dirName;
325 return true;
326}
327
328//_____________________________________________________________________________
330{
331 G4String name(fFileName);
332 if ( name.find(".") == std::string::npos ) {
333 name.append(".");
334 name.append(GetFileType());
335 }
336
337 return name;
338}
339
340//_____________________________________________________________________________
342{
343 if ( fLockFirstHistoId ) {
344 G4ExceptionDescription description;
345 description
346 << "Cannot set FirstHistoId as its value was already used.";
347 G4Exception("G4VAnalysisManager::SetFirstHistoId()",
348 "Analysis_W009", JustWarning, description);
349 return false;
350 }
351
352 fFirstHistoId = firstId;
353 return true;
354}
355
356//_____________________________________________________________________________
358{
360 G4ExceptionDescription description;
361 description
362 << "Cannot set FirstNtupleColumnId as its value was already used.";
363 G4Exception("G4VAnalysisManager::SetFirstHistoId()",
364 "Analysis_W010", JustWarning, description);
365 return false;
366 }
367
368 fFirstNtupleColumnId = firstId;
369 return true;
370}
371
372//_____________________________________________________________________________
374{
375 if ( ! fActivation ) return true;
376
377 return ( fNofActiveObjects > 0 );
378}
379
380//_____________________________________________________________________________
382{
383 return ( fNofAsciiObjects > 0 );
384}
385
386//_____________________________________________________________________________
388{
389 G4int index = id - fFirstHistoId;
390 if ( index < 0 || index >= GetNofH1s() ) {
391 G4ExceptionDescription description;
392 description << " " << "histo " << id << " does not exist.";
393 G4Exception("G4VAnalysisManager::GetH1Information()",
394 "Analysis_W007", JustWarning, description);
395 return 0;
396 }
397 return fH1Informations[index];
398}
399
400//_____________________________________________________________________________
402{
403 G4int index = id - fFirstHistoId;
404 if ( index < 0 || index >= GetNofH2s() ) {
405 G4ExceptionDescription description;
406 description << " " << "histo " << id << " does not exist.";
407 G4Exception("G4VAnalysisManager::GetH2Information()",
408 "Analysis_W007", JustWarning, description);
409 return 0;
410 }
411 return fH2Informations[index];
412}
413
414//_____________________________________________________________________________
416{
417 switch ( objType ) {
418 case kH1:
419 return GetH1Information(id);
420 break;
421
422 case kH2:
423 return GetH2Information(id);
424 break;
425
426 case kNtuple:
427 default:
428 return 0;
429 break;
430 }
431
432 // Cannot reach this line
433 G4ExceptionDescription description;
434 description << "Wrong object type.";
435 G4Exception("G4VAnalysisManager::SetFirstHistoId()",
436 "Analysis_W010", FatalException, description);
437 return 0;
438}
439
440//_____________________________________________________________________________
442 G4bool activation)
443{
444// Set activation to a given object
445
446 G4HnInformation* info = GetInformation(type, id);
447
448 if ( ! info ) return;
449
450 // Do nothing if activation does not change
451 if ( info->fActivation == activation ) return;
452
453 // Change activation and account it in fNofActiveObjects
454 info->fActivation = activation;
455 if ( activation )
456 fNofActiveObjects++;
457 else
458 fNofActiveObjects--;
459}
460
461//_____________________________________________________________________________
463{
464// Set activation to all objects of the given type
465
466 std::vector<G4HnInformation*>* informations;
467 if ( type == kH1 )
468 informations = &fH1Informations;
469 else if ( type == kH2 )
470 informations = &fH2Informations;
471 else if ( type == kNtuple ) {
472 return;
473 }
474 else {
475 G4ExceptionDescription description;
476 description << "Wrong object type.";
477 G4Exception("G4VAnalysisManager::SetActivation()",
478 "Analysis_W010", FatalException, description);
479 return;
480 }
481
482 std::vector<G4HnInformation*>::iterator it;
483 for ( it = informations->begin(); it != informations->end(); it++ ) {
484 G4HnInformation* info = *it;
485
486 // Do nothing if activation does not change
487 if ( info->fActivation == activation ) continue;
488
489 // Change activation and account it in fNofActiveObjects
490 info->fActivation = activation;
491 if ( activation )
492 fNofActiveObjects++;
493 else
494 fNofActiveObjects--;
495 }
496}
497
498//_____________________________________________________________________________
500{
501 G4HnInformation* info = GetInformation(type, id);
502
503 if ( ! info ) return;
504
505 // Do nothing if ascii does not change
506 if ( info->fAscii == ascii ) return;
507
508 // Change ascii and account it in fNofAsciiObjects
509 info->fAscii = ascii;
510 if ( ascii )
511 fNofAsciiObjects++;
512 else
513 fNofAsciiObjects--;
514}
515
516//_____________________________________________________________________________
518{
519 G4String fileType = fVerboseL1.GetType();
520 fileType.toLower();
521 return fileType;
522}
@ JustWarning
@ FatalException
G4double G4FcnIdentity(G4double value)
Definition: G4Fcn.hh:39
G4double(* G4Fcn)(G4double)
Definition: G4Fcn.hh:36
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
void Message(const G4String &action, const G4String &object, const G4String &objectName, G4bool success=true)
G4String GetType() const
G4String & append(const G4String &)
void toLower()
static G4double GetValueOf(const G4String &)
virtual G4int GetNofH1s() const
G4double GetUnitValue(const G4String &unit) const
G4bool GetActivation() const
void AddH1Information(const G4String &name, const G4String &unitName, const G4String &fcnName, G4double unit, G4Fcn fx)
G4AnalysisVerbose * fpVerboseL4
void AddH2Information(const G4String &name, const G4String &xunitName, const G4String &yunitName, const G4String &xfcnName, const G4String &yfcnName, G4double xunit, G4double yunit, G4Fcn fx, G4Fcn fy)
void SetAscii(ObjectType type, G4int id, G4bool ascii)
G4AnalysisVerbose fVerboseL2
G4AnalysisVerbose * fpVerboseL2
G4HnInformation * GetH2Information(G4int id) const
G4double GetYUnit(ObjectType type, G4int id) const
G4HnInformation * GetInformation(ObjectType type, G4int id) const
G4AnalysisVerbose fVerboseL3
G4AnalysisVerbose * fpVerboseL3
void SetActivation(G4bool activation)
virtual G4bool SetFirstNtupleColumnId(G4int firstId)
G4AnalysisVerbose fVerboseL4
G4HnInformation * GetH1Information(G4int id) const
virtual G4bool SetHistoDirectoryName(const G4String &dirName)
virtual G4bool OpenFile()
G4AnalysisVerbose * fpVerboseL1
virtual void SetVerboseLevel(G4int verboseLevel)
G4bool GetAscii(ObjectType type, G4int id) const
virtual G4bool WriteOnAscii(std::ofstream &output)=0
G4String GetName(ObjectType type, G4int id) const
G4double GetXUnit(ObjectType type, G4int id) const
G4String GetFileType() const
virtual G4bool SetFileName(const G4String &fileName)
virtual G4bool SetFirstHistoId(G4int firstId)
virtual G4bool SetNtupleDirectoryName(const G4String &dirName)
G4VAnalysisManager(const G4String &type="")
virtual G4String GetFullFileName() const
G4AnalysisVerbose fVerboseL1
G4Fcn GetFunction(const G4String &fcnName) const
virtual G4int GetNofH2s() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76