Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/analysis/hntools/src/G4ToolsAnalysisManager.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 
 29 #include "G4ToolsAnalysisManager.hh"
 30 #include "G4VNtupleFileManager.hh"
 31 #include "G4PlotManager.hh"
 32 #include "G4MPIToolsManager.hh"
 33 #include "G4AnalysisUtilities.hh"
 34 #include "G4AutoLock.hh"
 35 #include "G4Threading.hh"
 36 
 37 using namespace G4Analysis;
 38 
 39 namespace {
 40   //Mutex to lock master manager when merging histograms
 41   G4Mutex mergeHnMutex = G4MUTEX_INITIALIZER;
 42 }
 43 
 44 //_____________________________________________________________________________
 45 G4ToolsAnalysisManager* G4ToolsAnalysisManager::Instance()
 46 {
 47   return fgToolsInstance;
 48 }
 49 
 50 //_____________________________________________________________________________
 51 G4bool G4ToolsAnalysisManager::IsInstance()
 52 {
 53   return ( fgToolsInstance != nullptr );
 54 }
 55 
 56 //_____________________________________________________________________________
 57 G4ToolsAnalysisManager::G4ToolsAnalysisManager(const G4String& type)
 58  : G4VAnalysisManager(type)
 59 {
 60   // Set instance pointer
 61   if ( ! G4Threading::IsWorkerThread() ) fgMasterToolsInstance = this;
 62   fgToolsInstance = this;
 63 
 64   // Create managers
 65   fH1Manager = new G4THnToolsManager<kDim1, tools::histo::h1d>(fState);
 66   fH2Manager = new G4THnToolsManager<kDim2, tools::histo::h2d>(fState);
 67   fH3Manager = new G4THnToolsManager<kDim3, tools::histo::h3d>(fState);
 68   fP1Manager = new G4THnToolsManager<kDim2, tools::histo::p1d>(fState);
 69   fP2Manager = new G4THnToolsManager<kDim3, tools::histo::p2d>(fState);
 70       // The managers will be deleted by the base class
 71 
 72   // Set managers to base class which takes then their ownership
 73   SetH1Manager(fH1Manager);
 74   SetH2Manager(fH2Manager);
 75   SetH3Manager(fH3Manager);
 76   SetP1Manager(fP1Manager);
 77   SetP2Manager(fP2Manager);
 78 
 79   // Plot manager
 80   fPlotManager = std::make_unique<G4PlotManager>(fState);
 81 }
 82 
 83 //_____________________________________________________________________________
 84 G4ToolsAnalysisManager::~G4ToolsAnalysisManager()
 85 {
 86   if ( fState.GetIsMaster() ) fgMasterToolsInstance = nullptr;
 87   fgToolsInstance = nullptr;
 88 }
 89 
 90 //
 91 // private methods
 92 //
 93 
 94 //_____________________________________________________________________________
 95 G4bool 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 //_____________________________________________________________________________
113 G4bool 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 //_____________________________________________________________________________
129 G4bool 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
147   fH1Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fH1Manager);
148   fH2Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fH2Manager);
149   fH3Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fH3Manager);
150   fP1Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fP1Manager);
151   fP2Manager->Merge(mergeHnMutex, fgMasterToolsInstance->fP2Manager);
152 
153   Message(kVL3, "merge on worker", "histograms");
154 
155   return true;
156 }
157 
158 //
159 // protected methods
160 //
161 
162 //_____________________________________________________________________________
163 G4bool G4ToolsAnalysisManager::OpenFileImpl(const G4String& fileName)
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 //_____________________________________________________________________________
183 G4bool G4ToolsAnalysisManager::WriteImpl()
184 {
185   Message(kVL4, "write", "files");
186 
187   auto result = true;
188   if ( G4Threading::IsWorkerThread() )  {
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
200   if (fVNtupleFileManager) {
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 //_____________________________________________________________________________
221 G4bool G4ToolsAnalysisManager::CloseFileImpl(G4bool reset)
222 {
223   Message(kVL4, "close", "files");
224 
225   auto result = true;
226   if (fVNtupleFileManager) {
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 //_____________________________________________________________________________
259 G4bool G4ToolsAnalysisManager::ResetImpl()
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 //_____________________________________________________________________________
277 void G4ToolsAnalysisManager::ClearImpl()
278 {
279 // Reset histograms and profiles
280 
281   fH1Manager->ClearData();
282   fH2Manager->ClearData();
283   fH3Manager->ClearData();
284   fP1Manager->ClearData();
285   fP2Manager->ClearData();
286 }
287 
288 //_____________________________________________________________________________
289 G4bool G4ToolsAnalysisManager::PlotImpl()
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 //_____________________________________________________________________________
325 G4bool G4ToolsAnalysisManager::MergeImpl(tools::histo::hmpi* hmpi)
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 //_____________________________________________________________________________
357 G4bool G4ToolsAnalysisManager::IsEmpty()
358 {
359   return fH1Manager->IsEmpty() && fH2Manager->IsEmpty() && fH3Manager->IsEmpty() &&
360          fP1Manager->IsEmpty() && fP2Manager->IsEmpty();
361 }
362