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
G4ToolsAnalysisManager.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 "G4PlotManager.hh"
32#include "G4MPIToolsManager.hh"
34#include "G4AutoLock.hh"
35#include "G4Threading.hh"
36
37using namespace G4Analysis;
38
39namespace {
40 //Mutex to lock master manager when merging histograms
41 G4Mutex mergeHnMutex = G4MUTEX_INITIALIZER;
42}
43
44//_____________________________________________________________________________
46{
47 return fgToolsInstance;
48}
49
50//_____________________________________________________________________________
52{
53 return ( fgToolsInstance != nullptr );
54}
55
56//_____________________________________________________________________________
58 : G4VAnalysisManager(type)
59{
60 // Set instance pointer
62 fgToolsInstance = this;
63
64 // Create managers
70 // The managers will be deleted by the base class
71
72 // Set managers to base class which takes then their ownership
78
79 // Plot manager
80 fPlotManager = std::make_unique<G4PlotManager>(fState);
81}
82
83//_____________________________________________________________________________
85{
86 if ( fState.GetIsMaster() ) fgMasterToolsInstance = nullptr;
87 fgToolsInstance = nullptr;
88}
89
90//
91// private methods
92//
93
94//_____________________________________________________________________________
95G4bool G4ToolsAnalysisManager::WriteHns()
96{
97 // Nothing to be done on worker
98 if ( G4Threading::IsWorkerThread() ) return false;
99
100 auto result = true;
101
102 // Write all histograms/profile on master
103 result &= WriteT(fH1Manager->GetTHnVectorRef());
104 result &= WriteT(fH2Manager->GetTHnVectorRef());
105 result &= WriteT(fH3Manager->GetTHnVectorRef());
106 result &= WriteT(fP1Manager->GetTHnVectorRef());
107 result &= WriteT(fP2Manager->GetTHnVectorRef());
108
109 return result;
110}
111
112//_____________________________________________________________________________
113G4bool G4ToolsAnalysisManager::ResetHns()
114{
115// Reset histograms and profiles
116
117 auto result = true;
118
119 result &= fH1Manager->Reset();
120 result &= fH2Manager->Reset();
121 result &= fH3Manager->Reset();
122 result &= fP1Manager->Reset();
123 result &= fP2Manager->Reset();
124
125 return result;
126}
127
128//_____________________________________________________________________________
129G4bool G4ToolsAnalysisManager::MergeHns()
130{
131 // Nothing to be done on master
132 if ( ! G4Threading::IsWorkerThread() ) return false;
133
134 if (fgMasterToolsInstance == nullptr) {
135 if (! IsEmpty() ) {
136 Warn("No master G4AnalysisManager instance exists.\n"
137 "Histogram/profile data will not be merged.",
138 fkClass, "Merge");
139 return false;
140 }
141 return true;
142 }
143
144 Message(kVL4, "merge on worker", "histograms");
145
146 // The worker manager just adds its histograms to the master
152
153 Message(kVL3, "merge on worker", "histograms");
154
155 return true;
156}
157
158//
159// protected methods
160//
161
162//_____________________________________________________________________________
164{
165 // Create ntuple manager(s)
166 // and set it to base class which takes then their ownership
167 SetNtupleManager(fVNtupleFileManager->CreateNtupleManager());
168
169 auto result = true;
170
171 // Open file
172 if ( fVNtupleFileManager->GetMergeMode() != G4NtupleMergeMode::kSlave ) {
173 result &= fVFileManager->OpenFile(fileName);
174 }
175
176 // Open ntuple files and create ntuples from bookings
177 result &= fVNtupleFileManager->ActionAtOpenFile(fVFileManager->GetFullFileName());
178
179 return result;
180}
181
182//_____________________________________________________________________________
184{
185 Message(kVL4, "write", "files");
186
187 auto result = true;
189 result &= MergeHns();
190 }
191 else {
192 // Open all files registered with objects
193 fVFileManager->OpenFiles();
194
195 // Write all histograms/profile on master
196 result &= WriteHns();
197 }
198
199 // Ntuples
201 result &= fVNtupleFileManager->ActionAtWrite();
202 }
203
204 // Files
205 if ( (fVNtupleFileManager == nullptr) ||
206 (fVNtupleFileManager->GetMergeMode() != G4NtupleMergeMode::kSlave) ) {
207 result &= fVFileManager->WriteFiles();
208 }
209
210 // Write ASCII if activated
211 if ( IsAscii() ) {
212 result &= WriteAscii(fVFileManager->GetFileName());
213 }
214
215 Message(kVL3, "write", "files", "", result);
216
217 return result;
218}
219
220//_____________________________________________________________________________
222{
223 Message(kVL4, "close", "files");
224
225 auto result = true;
227 result &= fVNtupleFileManager->ActionAtCloseFile();
228 }
229
230 // close file
231 if ( (fVNtupleFileManager == nullptr) ||
232 (fVNtupleFileManager->GetMergeMode() != G4NtupleMergeMode::kSlave) ) {
233 if ( ! fVFileManager->CloseFiles() ) {
234 Warn("Closing files failed", fkClass, "CloseFileImpl");
235 result = false;
236 }
237 }
238
239 // delete empty files
240 if ( ! fVFileManager->DeleteEmptyFiles() ) {
241 Warn("Deleting empty files failed", fkClass, "CloseFileImpl");
242 result = false;
243 }
244
245 // reset histograms
246 if ( reset ) {
247 if ( ! Reset() ) {
248 Warn("Resetting data failed", fkClass, "CloseFileImpl");
249 result = false;
250 }
251 }
252
253 Message(kVL3, "close", "files", "", result);
254
255 return result;
256}
257
258//_____________________________________________________________________________
260{
261// Reset histograms and ntuple
262
263 Message(kVL4, "reset", "");
264
265 auto result = true;
266 result &= ResetHns();
267 if ( fVNtupleFileManager != nullptr ) {
268 result &= fVNtupleFileManager->Reset();
269 }
270
271 Message(kVL3, "reset", "", "", result);
272
273 return result;
274}
275
276//_____________________________________________________________________________
278{
279// Reset histograms and profiles
280
286}
287
288//_____________________________________________________________________________
290{
291
292 // Only master thread performs plotting
293 if ( G4Threading::IsWorkerThread() ) return true;
294
295 auto result = true;
296
297 // Open output file
298 fPlotManager->OpenFile(fVFileManager->GetPlotFileName());
299
300 // H1
301 result
302 &= fPlotManager->PlotAndWrite<tools::histo::h1d>(fH1Manager->GetTHnVectorRef());
303
304 // H2
305 result
306 &= fPlotManager->PlotAndWrite<tools::histo::h2d>(fH2Manager->GetTHnVectorRef());
307
308 // H3
309 // not yet available in tools
310
311 // P1
312 result
313 &= fPlotManager->PlotAndWrite<tools::histo::p1d>(fP1Manager->GetTHnVectorRef());
314
315 // P2
316 // not yet available in tools
317
318 // Close output file
319 result &= fPlotManager->CloseFile();
320
321 return result;
322}
323
324//_____________________________________________________________________________
326{
327
328 // if ( G4Threading::IsWorkerThread() ) return true;
329
330 if (hmpi == nullptr) return false;
331
332 auto result = true;
333
334 // Create MPI manager
335 G4MPIToolsManager mpiToolsManager(fState, hmpi);
336
337 // H1
338 result &= mpiToolsManager.Merge<tools::histo::h1d>(fH1Manager->GetTHnVectorRef());
339
340 // H2
341 result &= mpiToolsManager.Merge<tools::histo::h2d>(fH2Manager->GetTHnVectorRef());
342
343 // H3
344 result &= mpiToolsManager.Merge<tools::histo::h3d>(fH3Manager->GetTHnVectorRef());
345
346 // P1
347 result &= mpiToolsManager.Merge<tools::histo::p1d>(fP1Manager->GetTHnVectorRef());
348
349 // P2
350 result &= mpiToolsManager.Merge<tools::histo::p2d>(fP2Manager->GetTHnVectorRef());
351
352 return result;
353}
354
355
356//_____________________________________________________________________________
358{
359 return fH1Manager->IsEmpty() && fH2Manager->IsEmpty() && fH3Manager->IsEmpty() &&
361}
#define G4MUTEX_INITIALIZER
Definition: G4Threading.hh:85
std::mutex G4Mutex
Definition: G4Threading.hh:81
bool G4bool
Definition: G4Types.hh:86
G4bool Merge(const std::vector< std::pair< HT *, G4HnInformation * > > &hnVector)
void Merge(G4Mutex &mergeMutex, G4THnManager< HT > *masterInstance)
G4bool Reset()
void ClearData()
G4bool IsEmpty() const
const std::vector< std::pair< HT *, G4HnInformation * > > & GetTHnVectorRef() const
G4THnToolsManager< kDim2, tools::histo::h2d > * fH2Manager
static G4ToolsAnalysisManager * Instance()
static G4ThreadLocal G4ToolsAnalysisManager * fgToolsInstance
G4THnToolsManager< kDim3, tools::histo::p2d > * fP2Manager
static constexpr std::string_view fkClass
G4ToolsAnalysisManager(const G4String &type)
G4bool OpenFileImpl(const G4String &fileName) override
G4THnToolsManager< kDim2, tools::histo::p1d > * fP1Manager
G4bool MergeImpl(tools::histo::hmpi *hmpi) final
G4THnToolsManager< kDim3, tools::histo::h3d > * fH3Manager
static G4ToolsAnalysisManager * fgMasterToolsInstance
G4THnToolsManager< kDim1, tools::histo::h1d > * fH1Manager
G4bool CloseFileImpl(G4bool reset) override
void SetH3Manager(G4VTBaseHnManager< 3 > *h3Manager)
void SetP2Manager(G4VTBaseHnManager< 3 > *p2Manager)
std::shared_ptr< G4VNtupleFileManager > fVNtupleFileManager
void Message(G4int level, const G4String &action, const G4String &objectType, const G4String &objectName="", G4bool success=true) const
G4AnalysisManagerState fState
void SetH1Manager(G4VTBaseHnManager< 1 > *h1Manager)
void SetP1Manager(G4VTBaseHnManager< 2 > *p1Manager)
G4bool WriteAscii(const G4String &fileName)
void SetNtupleManager(std::shared_ptr< G4VNtupleManager > ntupleManager)
std::shared_ptr< G4VFileManager > fVFileManager
void SetH2Manager(G4VTBaseHnManager< 2 > *h2Manager)
constexpr G4int kVL3
constexpr G4int kVL4
void Warn(const G4String &message, const std::string_view inClass, const std::string_view inFunction)
G4bool IsWorkerThread()
Definition: G4Threading.cc:123