Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4AccumulableManager.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
27// Author: Ivana Hrivnacova, 18/06/2013 (ivana@ipno.in2p3.fr)
28
31#include "G4Threading.hh"
32#include "G4AutoLock.hh"
33
34// mutex in a file scope
35
36namespace {
37 //Mutex to lock master manager when merging accumulables
38 G4Mutex mergeMutex = G4MUTEX_INITIALIZER;
39}
40
41//_____________________________________________________________________________
43{
45 return instance.Instance();
46}
47
48//_____________________________________________________________________________
49G4AccumulableManager::G4AccumulableManager()
50{
51 if ( ! G4Threading::IsWorkerThread() ) fgMasterInstance = this;
52}
53
54//_____________________________________________________________________________
56{
57 // delete only accumulables create by the mager itself
58 for ( auto it : fAccumulablesToDelete ) {
59 delete it;
60 }
61}
62
63//
64// private methods
65//
66
67//_____________________________________________________________________________
68G4String G4AccumulableManager::GenerateName() const
69{
70 G4String name = kBaseName;
71 std::ostringstream os;
72 os << fVector.size();
73 name.append("_");
74 name.append(os.str());
75 return name;
76}
77
78//_____________________________________________________________________________
79G4bool G4AccumulableManager::CheckName(const G4String& name, const G4String& where) const
80{
81 if ( fMap.find(name) == fMap.end() ) return true;
82
83 G4ExceptionDescription description;
84 description << "Name " << name << " is already used." << G4endl;
85 description << "Parameter will be not created/registered.";
86 G4String method("G4AccumulableManager::");
87 method.append(where);
88 G4Exception(method, "Analysis_W001", JustWarning, description);
89 return false;
90}
91
92//
93// public methods
94//
95
96//_____________________________________________________________________________
98{
99 auto name = accumulable->GetName();
100
101 // do not accept name if it is already used
102 if ( ! CheckName(name, "RegisterAccumulable") ) return false;
103
104 // generate name if empty
105 if (name.length() == 0u) {
106 name = GenerateName();
107 accumulable->fName = name;
108 }
109
110 fMap[name] = accumulable;
111 fVector.push_back(accumulable);
112 return true;
113}
114
115//_____________________________________________________________________________
118{
119 // get G4VParammeter from the map
120 auto it = fMap.find(name);
121 if ( it == fMap.end() ) {
122 if ( warn) {
123 G4ExceptionDescription description;
124 description << "Accumulable " << name << " does not exist.";
125 G4Exception("G4AccumulableManager::GetAccumulable",
126 "Analysis_W001", JustWarning, description);
127 }
128 return nullptr;
129 }
130
131 return it->second;
132}
133
134//_____________________________________________________________________________
137{
138 // get G4VParammeter from the vector
139 if ( id < 0 || id >= G4int(fVector.size()) ) {
140 if ( warn) {
141 G4ExceptionDescription description;
142 description << "Accumulable " << id << " does not exist.";
143 G4Exception("G4AccumulableManager::GetAccumulable",
144 "Analysis_W001", JustWarning, description);
145 }
146 return nullptr;
147 }
148
149 return fVector[id];
150}
151
152//_____________________________________________________________________________
154{
155 // Do nothing if there are no accumulables registered
156 // or if master thread
157 if ((fVector.size() == 0u) || (! G4Threading::IsWorkerThread())) return;
158
159 // The manager on mastter must exist
160 if (fgMasterInstance == nullptr) {
161 G4ExceptionDescription description;
162 description
163 << "No master G4AccumulableManager instance exists." << G4endl
164 << "Accumulables will not be merged.";
165 G4Exception("G4AccumulableManager::Merge()",
166 "Analysis_W001", JustWarning, description);
167 return;
168 }
169
170 // The worker manager just merges its accumulables to the master
171 // This operation needs a lock
172 // G4cout << "Go to merge accumulables" << G4endl;
173 G4AutoLock lock(&mergeMutex);
174
175 // the other manager has the vector with the "same" accumulables
176 auto it = fVector.begin();
177 for ( auto itMaster : fgMasterInstance->fVector ) {
178 // G4VAccumulable* masterAccumulable = itMaster;
179 // G4VAccumulable* accumulable = *(it++);
180 // masterAccumulable->Merge(*(accumulable));
181 itMaster->Merge(*(*(it++)));
182 }
183 lock.unlock();
184}
185
186//_____________________________________________________________________________
188{
189// Reset histograms and profiles
190
191 for ( auto it : fVector ) {
192 it->Reset();
193 }
194}
195
196
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
#define G4MUTEX_INITIALIZER
Definition: G4Threading.hh:85
std::mutex G4Mutex
Definition: G4Threading.hh:81
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4Accumulable< T > * GetAccumulable(const G4String &name, G4bool warn=true) const
static G4AccumulableManager * Instance()
G4bool RegisterAccumulable(G4Accumulable< T > &accumulable)
G4String GetName() const
const char * name(G4int ptype)
G4bool IsWorkerThread()
Definition: G4Threading.cc:123