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 // G4PhysicsTableHelper class implementation 27 // 28 // Author: H.Kurashige, 20 August 2004 - First 29 // ------------------------------------------- 30 31 #include "G4PhysicsTableHelper.hh" 32 #include "G4ProductionCutsTable.hh" 33 #include "G4MCCIndexConversionTable.hh" 34 #include "G4Threading.hh" 35 #include "G4ios.hh" 36 37 G4int G4PhysicsTableHelper::verboseLevel = 1; 38 39 // ------------------------------------------- 40 G4PhysicsTableHelper::G4PhysicsTableHelper() 41 { 42 } 43 44 // ------------------------------------------- 45 G4PhysicsTableHelper::~G4PhysicsTableHelper() 46 { 47 } 48 49 // ------------------------------------------- 50 G4PhysicsTable* 51 G4PhysicsTableHelper::PreparePhysicsTable(G4Ph 52 { 53 G4ProductionCutsTable* cutTable 54 = G4ProductionCutsTable::GetProductionCuts 55 std::size_t numberOfMCC = cutTable->GetTable 56 57 if ( physTable != nullptr ) 58 { 59 // compare size of physics table and numbe 60 if ( physTable->size() < numberOfMCC ) 61 { 62 #ifdef G4VERBOSE 63 if (verboseLevel>2) 64 { 65 G4cout << "G4PhysicsTableHelper::Prepa 66 << " the table " << physTable < 67 << physTable->size() 68 << " will be is resized to " << 69 } 70 #endif 71 // enlarge physics table 72 physTable->resize(numberOfMCC, nullptr); 73 } 74 else if ( physTable->size() > numberOfMCC 75 { 76 // ERROR: this situation should not occu 77 // size of physics table is larger than 78 G4ExceptionDescription ed; 79 ed << "table " << physTable << " size=" 80 << " is longer than number of material-cuts 81 G4Exception( "G4PhysicsTableHelper::Prep 82 "ProcCuts001", FatalExcepti 83 } 84 } 85 else 86 { 87 // create PhysicsTable is given poitner is 88 physTable = new G4PhysicsTable(); 89 physTable->resize(numberOfMCC, nullptr); 90 } 91 92 #ifdef G4VERBOSE 93 if (verboseLevel>2) 94 { 95 G4cout << "G4PhysicsTableHelper::PreparePh 96 << " the table "<< physTable 97 << " size=" << numberOfMCC << G4endl; 98 } 99 #endif 100 101 // Reset recal-needed flag for all physics v 102 physTable->ResetFlagArray(); 103 104 for (std::size_t idx = 0; idx <numberOfMCC; 105 { 106 const G4MaterialCutsCouple* mcc = cutTable 107 108 // check if re-calculation of the physics 109 // MCC is not used 110 if ( !mcc->IsUsed() ) physTable->ClearFlag 111 112 // RecalcNeeded flag of MCC is not asserte 113 if ( !mcc->IsRecalcNeeded() ) physTable->C 114 } 115 116 return physTable; 117 } 118 119 // ------------------------------------------- 120 G4bool G4PhysicsTableHelper::RetrievePhysicsTa 121 122 123 { 124 if (physTable == nullptr ) return false; 125 126 // retrieve physics table from the given fil 127 G4PhysicsTable* tempTable = new G4PhysicsTab 128 if (! tempTable->RetrievePhysicsTable(fileNa 129 { 130 G4ExceptionDescription ed; 131 ed << "Cannot retrieve physics table from 132 G4Exception( "G4ProductionCutsTable::Retri 133 "ProcCuts105", JustWarning, e 134 delete tempTable; 135 return false; 136 } 137 138 G4ProductionCutsTable* cutTable 139 = G4ProductionCutsTable::GetProductionCuts 140 const G4MCCIndexConversionTable* converter 141 = cutTable->GetMCCIndexConversionTable(); 142 143 // check physics table size 144 if ( tempTable->size() != converter->size()) 145 { 146 G4ExceptionDescription ed; 147 ed << "Physics table in " << fileName 148 << "\n size=" << tempTable->size() << 149 << " is inconsistent with material-cut- 150 << "size=" << converter->size() << " th 151 G4Exception("G4ProductionCutsTable::Retrie 152 "ProcCuts106", JustWarning, ed 153 delete tempTable; 154 return false; 155 } 156 157 // fill the given physics table with retriev 158 for (std::size_t idx=0; idx<converter->size( 159 { 160 if (converter->IsUsed(idx)) 161 { 162 G4int i = converter->GetIndex(idx); 163 if(i < 0) 164 { 165 tempTable->clearAndDestroy(); 166 delete tempTable; 167 return false; 168 } 169 G4PhysicsVector* vec = (*physTable)[i]; 170 if (vec != nullptr ) delete vec; 171 (*physTable)[i] = (*tempTable)[idx]; 172 physTable->ClearFlag(i); 173 } 174 } 175 tempTable->clear(); 176 delete tempTable; 177 178 return true; 179 } 180 181 // ------------------------------------------- 182 void G4PhysicsTableHelper::SetPhysicsVector(G4 183 st 184 G4 185 { 186 if ( physTable == nullptr) { return; } 187 188 if ( physTable->size() <= idx) 189 { 190 G4ExceptionDescription ed; 191 ed << "Given index (" << idx << ") exceed 192 << "the size of the physics table " 193 << "( size =" << physTable->size() << " 194 G4Exception("G4ProductionCutsTable::SetPhy 195 "ProcCuts107", 196 JustWarning, ed); 197 return; 198 } 199 200 // set physics vector 201 (*physTable)[idx] = vec; 202 // clear flag 203 physTable->ClearFlag(idx); 204 } 205 206 // ------------------------------------------- 207 void G4PhysicsTableHelper::SetVerboseLevel(G4i 208 { 209 if( !G4Threading::IsWorkerThread() ) verbose 210 } 211 212 // ------------------------------------------- 213 G4int G4PhysicsTableHelper::GetVerboseLevel() 214 { 215 return verboseLevel; 216 } 217