Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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 ([email protected])
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