Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 27 // Author: Ivana Hrivnacova, 18/06/2013 (ivan 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 41 G4Mutex mergeHnMutex = G4MUTEX_INITIALIZER; 42 } 43 44 //____________________________________________ 45 G4ToolsAnalysisManager* G4ToolsAnalysisManager 46 { 47 return fgToolsInstance; 48 } 49 50 //____________________________________________ 51 G4bool G4ToolsAnalysisManager::IsInstance() 52 { 53 return ( fgToolsInstance != nullptr ); 54 } 55 56 //____________________________________________ 57 G4ToolsAnalysisManager::G4ToolsAnalysisManager 58 : G4VAnalysisManager(type) 59 { 60 // Set instance pointer 61 if ( ! G4Threading::IsWorkerThread() ) fgMas 62 fgToolsInstance = this; 63 64 // Create managers 65 fH1Manager = new G4THnToolsManager<kDim1, to 66 fH2Manager = new G4THnToolsManager<kDim2, to 67 fH3Manager = new G4THnToolsManager<kDim3, to 68 fP1Manager = new G4THnToolsManager<kDim2, to 69 fP2Manager = new G4THnToolsManager<kDim3, to 70 // The managers will be deleted by the b 71 72 // Set managers to base class which takes th 73 SetH1Manager(fH1Manager); 74 SetH2Manager(fH2Manager); 75 SetH3Manager(fH3Manager); 76 SetP1Manager(fP1Manager); 77 SetP2Manager(fP2Manager); 78 79 // Plot manager 80 fPlotManager = std::make_unique<G4PlotManage 81 } 82 83 //____________________________________________ 84 G4ToolsAnalysisManager::~G4ToolsAnalysisManage 85 { 86 if ( fState.GetIsMaster() ) fgMasterToolsIns 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 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() ) retur 133 134 if (fgMasterToolsInstance == nullptr) { 135 if (! IsEmpty() ) { 136 Warn("No master G4AnalysisManager instan 137 "Histogram/profile data will not be 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 histogra 147 fH1Manager->Merge(mergeHnMutex, fgMasterTool 148 fH2Manager->Merge(mergeHnMutex, fgMasterTool 149 fH3Manager->Merge(mergeHnMutex, fgMasterTool 150 fP1Manager->Merge(mergeHnMutex, fgMasterTool 151 fP2Manager->Merge(mergeHnMutex, fgMasterTool 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(co 164 { 165 // Create ntuple manager(s) 166 // and set it to base class which takes then 167 SetNtupleManager(fVNtupleFileManager->Create 168 169 auto result = true; 170 171 // Open file 172 if ( fVNtupleFileManager->GetMergeMode() != 173 result &= fVFileManager->OpenFile(fileName 174 } 175 176 // Open ntuple files and create ntuples from 177 result &= fVNtupleFileManager->ActionAtOpenF 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->ActionAtWri 202 } 203 204 // Files 205 if ( (fVNtupleFileManager == nullptr) || 206 (fVNtupleFileManager->GetMergeMode() != 207 result &= fVFileManager->WriteFiles(); 208 } 209 210 // Write ASCII if activated 211 if ( IsAscii() ) { 212 result &= WriteAscii(fVFileManager->GetFil 213 } 214 215 Message(kVL3, "write", "files", "", result); 216 217 return result; 218 } 219 220 //____________________________________________ 221 G4bool G4ToolsAnalysisManager::CloseFileImpl(G 222 { 223 Message(kVL4, "close", "files"); 224 225 auto result = true; 226 if (fVNtupleFileManager) { 227 result &= fVNtupleFileManager->ActionAtClo 228 } 229 230 // close file 231 if ( (fVNtupleFileManager == nullptr) || 232 (fVNtupleFileManager->GetMergeMode() != 233 if ( ! fVFileManager->CloseFiles() ) { 234 Warn("Closing files failed", fkClass, "C 235 result = false; 236 } 237 } 238 239 // delete empty files 240 if ( ! fVFileManager->DeleteEmptyFiles() ) { 241 Warn("Deleting empty files failed", fkClas 242 result = false; 243 } 244 245 // reset histograms 246 if ( reset ) { 247 if ( ! Reset() ) { 248 Warn("Resetting data failed", fkClass, " 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 294 295 auto result = true; 296 297 // Open output file 298 fPlotManager->OpenFile(fVFileManager->GetPlo 299 300 // H1 301 result 302 &= fPlotManager->PlotAndWrite<tools::histo 303 304 // H2 305 result 306 &= fPlotManager->PlotAndWrite<tools::histo 307 308 // H3 309 // not yet available in tools 310 311 // P1 312 result 313 &= fPlotManager->PlotAndWrite<tools::histo 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 326 { 327 328 // if ( G4Threading::IsWorkerThread() ) ret 329 330 if (hmpi == nullptr) return false; 331 332 auto result = true; 333 334 // Create MPI manager 335 G4MPIToolsManager mpiToolsManager(fState, hm 336 337 // H1 338 result &= mpiToolsManager.Merge<tools::histo 339 340 // H2 341 result &= mpiToolsManager.Merge<tools::histo 342 343 // H3 344 result &= mpiToolsManager.Merge<tools::histo 345 346 // P1 347 result &= mpiToolsManager.Merge<tools::histo 348 349 // P2 350 result &= mpiToolsManager.Merge<tools::histo 351 352 return result; 353 } 354 355 356 //____________________________________________ 357 G4bool G4ToolsAnalysisManager::IsEmpty() 358 { 359 return fH1Manager->IsEmpty() && fH2Manager-> 360 fP1Manager->IsEmpty() && fP2Manager-> 361 } 362