Geant4 Cross Reference |
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 /// \file radiobiology/src/Manager.cc 28 /// \brief Implementation of the RadioBio::Manager class 29 30 #include "Manager.hh" 31 32 #include "G4AccumulableManager.hh" 33 34 #include <map> 35 #include <mutex> 36 37 std::mutex init_mutex; 38 39 namespace RadioBio 40 { 41 42 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 43 44 #define width 15L 45 46 // To create the instance the DetectorConstruction must 47 // be passed (to account for correct voxelization) 48 Manager* Manager::CreateInstance() 49 { 50 if (fInstance) { 51 G4Exception("RadioBioManager::createInstance", "RecreatingRadioBioManager", FatalException, 52 "Creating another, new, instance of RadioBioManager"); 53 delete fInstance; 54 } 55 56 fInstance = new Manager(); 57 return fInstance; 58 } 59 60 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 61 62 Manager* Manager::GetInstance() 63 { 64 return fInstance; 65 } 66 67 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 68 69 // Destructor deletes all the quantities 70 Manager::~Manager() 71 { 72 for (auto q : fQuantities) 73 delete q.second; 74 } 75 76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 77 78 void Manager::InitializeAll() 79 { 80 std::lock_guard<std::mutex> lock(init_mutex); 81 for (auto const& q : fQuantities) 82 (q.second)->Initialize(); 83 } 84 85 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 86 87 void Manager::ComputeAll() 88 { 89 for (auto const& q : fQuantities) 90 (q.second)->Compute(); 91 } 92 93 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 94 95 void Manager::ResetAll() 96 { 97 for (auto const& q : fQuantities) 98 (q.second)->Reset(); 99 } 100 101 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 102 103 void Manager::StoreAll() 104 { 105 for (auto const& q : fQuantities) 106 (q.second)->Store(); 107 } 108 109 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 110 111 VRadiobiologicalQuantity* Manager::GetQuantity(G4String str) 112 { 113 return fQuantities.find(str)->second; 114 } 115 116 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 117 118 void Manager::PrintParameters() 119 { 120 G4cout << "*******************************************" << G4endl 121 << "*** right now registered quantities are ***" << G4endl; 122 for (auto const& q : fQuantities) 123 G4cout << "*** " << q.first; 124 G4cout << "*** but their calculation might be not ****" << G4endl 125 << "*** active. Ask for parameters of each ****" << G4endl 126 << "*******************************************" << G4endl; 127 } 128 129 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 130 131 void Manager::DigestAccumulables() 132 { 133 for (auto q : fQuantities) { 134 // Hook in the accumulable manager the one named as the quantity (eg "Dose") 135 G4VAccumulable* GenAcc = G4AccumulableManager::Instance()->GetAccumulable(q.first); 136 137 if (!GenAcc) { 138 G4Exception("RadioBioManager::AddFromAccumulable", "NoAccumulable", FatalException, q.first); 139 } 140 141 // If calculation is not set enabled, exit 142 if (!q.second->IsCalculationEnabled()) continue; 143 144 // Add from the accumulable. 145 q.second->AddFromAccumulable(GenAcc); 146 } 147 } 148 149 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 150 151 bool Manager::Register(VRadiobiologicalQuantity* q, G4String name) 152 { 153 if (q == nullptr) { 154 G4Exception("RadioBioManager::Register", "RegisteringNullptr", JustWarning, 155 "Asking to register a quantity with null pointer!"); 156 return false; 157 } 158 159 if (fQuantities.find(name) != fQuantities.end()) { 160 G4Exception("RadioBioManager::Register", "RegisteringSameQuantity", FatalException, 161 "Registering two radiobiological quantities with the same name!"); 162 return false; 163 } 164 fQuantities[name] = q; 165 return true; 166 } 167 168 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 169 170 } // namespace RadioBio