Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // G4ProductionCutsTable class implementation << 27 // 26 // 28 // Author: M.Asai, 5 October 2002 - First impl << 27 // $Id: G4ProductionCutsTable.cc,v 1.15 2006/06/29 19:30:16 gunter Exp $ 29 // Modifications: H.Kurashige, 2004-2008 << 28 // GEANT4 tag $Name: geant4-08-01-patch-01 $ 30 // ------------------------------------------- << 29 // >> 30 // >> 31 // -------------------------------------------------------------- >> 32 // GEANT 4 class implementation file/ History: >> 33 // 06/Oct. 2002, M.Asai : First implementation >> 34 // -------------------------------------------------------------- 31 35 32 #include "G4ProductionCutsTable.hh" 36 #include "G4ProductionCutsTable.hh" 33 #include "G4ProductionCuts.hh" 37 #include "G4ProductionCuts.hh" 34 #include "G4MCCIndexConversionTable.hh" 38 #include "G4MCCIndexConversionTable.hh" 35 #include "G4ProductionCutsTableMessenger.hh" << 36 #include "G4ParticleDefinition.hh" 39 #include "G4ParticleDefinition.hh" 37 #include "G4ParticleTable.hh" 40 #include "G4ParticleTable.hh" 38 #include "G4RegionStore.hh" 41 #include "G4RegionStore.hh" 39 #include "G4LogicalVolume.hh" 42 #include "G4LogicalVolume.hh" 40 #include "G4VPhysicalVolume.hh" 43 #include "G4VPhysicalVolume.hh" 41 #include "G4RToEConvForElectron.hh" 44 #include "G4RToEConvForElectron.hh" 42 #include "G4RToEConvForGamma.hh" 45 #include "G4RToEConvForGamma.hh" 43 #include "G4RToEConvForPositron.hh" 46 #include "G4RToEConvForPositron.hh" 44 #include "G4RToEConvForProton.hh" << 45 #include "G4MaterialTable.hh" 47 #include "G4MaterialTable.hh" 46 #include "G4Material.hh" 48 #include "G4Material.hh" 47 #include "G4UnitsTable.hh" 49 #include "G4UnitsTable.hh" 48 50 49 #include "G4Timer.hh" << 50 #include "G4SystemOfUnits.hh" << 51 #include "G4ios.hh" 51 #include "G4ios.hh" 52 #include <iomanip> 52 #include <iomanip> 53 #include <fstream> 53 #include <fstream> 54 54 55 G4ProductionCutsTable* G4ProductionCutsTable:: << 56 55 57 // ------------------------------------------- << 56 G4ProductionCutsTable* G4ProductionCutsTable::fG4ProductionCutsTable = 0; >> 57 58 G4ProductionCutsTable* G4ProductionCutsTable:: 58 G4ProductionCutsTable* G4ProductionCutsTable::GetProductionCutsTable() 59 { 59 { 60 static G4ProductionCutsTable theProductionC 60 static G4ProductionCutsTable theProductionCutsTable; 61 if(fProductionCutsTable == nullptr) << 61 if(!fG4ProductionCutsTable){ 62 { << 62 fG4ProductionCutsTable = &theProductionCutsTable; 63 fProductionCutsTable = &theProductionCuts << 64 } 63 } 65 return fProductionCutsTable; << 64 return fG4ProductionCutsTable; 66 } 65 } 67 66 68 // ------------------------------------------- << 69 G4ProductionCutsTable::G4ProductionCutsTable() 67 G4ProductionCutsTable::G4ProductionCutsTable() >> 68 : firstUse(true),verboseLevel(1) 70 { 69 { 71 for(std::size_t i=0; i< NumberOfG4CutIndex; << 70 for(size_t i=0;i< NumberOfG4CutIndex;i++) 72 { 71 { 73 rangeCutTable.push_back(new std::vector<G4 << 72 rangeCutTable.push_back(new G4CutVectorForAParticle); 74 energyCutTable.push_back(new std::vector<G << 73 energyCutTable.push_back(new G4CutVectorForAParticle); 75 rangeDoubleVector[i] = nullptr; << 74 rangeDoubleVector[i] = 0; 76 energyDoubleVector[i] = nullptr; << 75 energyDoubleVector[i] = 0; 77 converters[i] = nullptr; << 76 converters[i] = 0; 78 } 77 } 79 fG4RegionStore = G4RegionStore::GetInstance( 78 fG4RegionStore = G4RegionStore::GetInstance(); 80 defaultProductionCuts = new G4ProductionCuts 79 defaultProductionCuts = new G4ProductionCuts(); 81 << 82 // add messenger for UI << 83 fMessenger = new G4ProductionCutsTableMessen << 84 } 80 } 85 81 86 // ------------------------------------------- << 82 G4ProductionCutsTable::G4ProductionCutsTable(const G4ProductionCutsTable& ) >> 83 {;} >> 84 87 G4ProductionCutsTable::~G4ProductionCutsTable( 85 G4ProductionCutsTable::~G4ProductionCutsTable() 88 { 86 { 89 delete defaultProductionCuts; << 87 if (defaultProductionCuts !=0) { 90 defaultProductionCuts = nullptr; << 88 delete defaultProductionCuts; >> 89 defaultProductionCuts =0; >> 90 } 91 91 92 for(auto itr=coupleTable.cbegin(); itr!=coup << 92 for(CoupleTableIterator itr=coupleTable.begin();itr!=coupleTable.end();itr++){ 93 { << 94 delete (*itr); 93 delete (*itr); 95 } 94 } 96 coupleTable.clear(); 95 coupleTable.clear(); 97 96 98 for(std::size_t i=0; i< NumberOfG4CutIndex; << 97 for(size_t i=0;i< NumberOfG4CutIndex;i++){ 99 { << 100 delete rangeCutTable[i]; 98 delete rangeCutTable[i]; 101 delete energyCutTable[i]; 99 delete energyCutTable[i]; 102 delete converters[i]; 100 delete converters[i]; 103 if(rangeDoubleVector[i] != nullptr) delete << 101 if(rangeDoubleVector[i]!=0) delete [] rangeDoubleVector[i]; 104 if(energyDoubleVector[i] != nullptr) delet << 102 if(energyDoubleVector[i]!=0) delete [] energyDoubleVector[i]; 105 rangeCutTable[i] = nullptr; << 106 energyCutTable[i] = nullptr; << 107 converters[i] = nullptr; << 108 rangeDoubleVector[i] = nullptr; << 109 energyDoubleVector[i] = nullptr; << 110 if(i < 4) << 111 { << 112 delete userEnergyCuts[i]; << 113 } << 114 } 103 } 115 fProductionCutsTable = nullptr; << 104 fG4ProductionCutsTable =0; 116 << 117 delete fMessenger; << 118 fMessenger = nullptr; << 119 } 105 } 120 106 121 // ------------------------------------------- << 107 void G4ProductionCutsTable::UpdateCoupleTable(G4VPhysicalVolume* currentWorld) 122 void G4ProductionCutsTable::SetEnergyCutVector << 123 << 124 { 108 { 125 if (idx >= 4) { << 109 if(firstUse){ 126 G4ExceptionDescription ed; << 110 if(G4ParticleTable::GetParticleTable()->FindParticle("gamma")) 127 ed << "Wrong index= " << idx << "; it shou << 111 { converters[0] = new G4RToEConvForGamma(); } 128 G4Exception("G4ProductionCutsTable::SetEne << 112 if(G4ParticleTable::GetParticleTable()->FindParticle("e-")) 129 "CUTS0100", FatalException, ed); << 113 { converters[1] = new G4RToEConvForElectron(); } 130 return; << 114 if(G4ParticleTable::GetParticleTable()->FindParticle("e+")) >> 115 { converters[2] = new G4RToEConvForPositron(); } >> 116 firstUse = false; 131 } 117 } 132 userEnergyCuts[idx] = new std::vector<G4doub << 133 } << 134 118 135 // ------------------------------------------- << 136 void G4ProductionCutsTable::CreateCoupleTables << 137 { << 138 // Reset "used" flags of all couples 119 // Reset "used" flags of all couples 139 for(auto CoupleItr=coupleTable.cbegin(); << 120 for(CoupleTableIterator CoupleItr=coupleTable.begin(); 140 CoupleItr!=coupleTable.cend(); ++Co << 121 CoupleItr!=coupleTable.end();CoupleItr++) 141 { 122 { 142 (*CoupleItr)->SetUseFlag(false); 123 (*CoupleItr)->SetUseFlag(false); 143 } 124 } 144 125 145 // Update Material-Cut-Couple 126 // Update Material-Cut-Couple 146 for(auto rItr=fG4RegionStore->cbegin(); rItr << 127 typedef std::vector<G4Region*>::iterator regionIterator; >> 128 for(regionIterator rItr=fG4RegionStore->begin(); >> 129 rItr!=fG4RegionStore->end();rItr++) 147 { 130 { 148 // Material scan is to be done only for th 131 // Material scan is to be done only for the regions appear in the 149 // current tracking world. 132 // current tracking world. 150 // if((*rItr)->GetWorldPhysical()!=curr << 133 if((*rItr)->GetWorldPhysical()!=currentWorld) continue; 151 134 152 if( (*rItr)->IsInMassGeometry() || (*rItr) << 135 G4ProductionCuts* fProductionCut = (*rItr)->GetProductionCuts(); 153 { << 136 std::vector<G4Material*>::const_iterator mItr = 154 G4ProductionCuts* fProductionCut = (*rIt << 137 (*rItr)->GetMaterialIterator(); 155 auto mItr = (*rItr)->GetMaterialIterator << 138 size_t nMaterial = (*rItr)->GetNumberOfMaterials(); 156 std::size_t nMaterial = (*rItr)->GetNumb << 139 (*rItr)->ClearMap(); 157 (*rItr)->ClearMap(); << 140 158 << 141 for(size_t iMate=0;iMate<nMaterial;iMate++){ 159 for(std::size_t iMate=0; iMate<nMaterial << 142 //check if this material cut couple has already been made 160 { << 143 G4bool coupleAlreadyDefined = false; 161 //check if this material cut couple ha << 144 G4MaterialCutsCouple* aCouple; 162 G4bool coupleAlreadyDefined = false; << 145 for(CoupleTableIterator cItr=coupleTable.begin(); 163 G4MaterialCutsCouple* aCouple; << 146 cItr!=coupleTable.end();cItr++){ 164 for(auto cItr=coupleTable.cbegin(); cI << 147 if( (*cItr)->GetMaterial()==(*mItr) && 165 { << 148 (*cItr)->GetProductionCuts()==fProductionCut){ 166 if( (*cItr)->GetMaterial()==(*mItr) << 149 coupleAlreadyDefined = true; 167 && (*cItr)->GetProductionCuts()==fP << 150 aCouple = *cItr; 168 { << 151 break; 169 coupleAlreadyDefined = true; << 170 aCouple = *cItr; << 171 break; << 172 } << 173 } 152 } >> 153 } 174 154 175 // If this combination is new, cleate << 155 // If this combination is new, cleate and register a couple 176 if(!coupleAlreadyDefined) << 156 if(!coupleAlreadyDefined){ 177 { << 157 aCouple = new G4MaterialCutsCouple((*mItr),fProductionCut); 178 aCouple = new G4MaterialCutsCouple(( << 158 coupleTable.push_back(aCouple); 179 coupleTable.push_back(aCouple); << 159 aCouple->SetIndex(coupleTable.size()-1); 180 aCouple->SetIndex(G4int(coupleTable. << 160 } 181 } << 182 << 183 // Register this couple to the region << 184 (*rItr)->RegisterMaterialCouplePair((* << 185 161 186 // Set the couple to the proper logica << 162 // Register this couple to the region 187 aCouple->SetUseFlag(); << 163 (*rItr)->RegisterMaterialCouplePair((*mItr),aCouple); 188 164 189 auto rootLVItr = (*rItr)->GetRootLogic << 165 // Set the couple to the proper logical volumes in that region 190 std::size_t nRootLV = (*rItr)->GetNumb << 166 aCouple->SetUseFlag(); 191 for(std::size_t iLV=0; iLV<nRootLV; ++ << 192 { << 193 // Set the couple to the proper logi << 194 G4LogicalVolume* aLV = *rootLVItr; << 195 G4Region* aR = *rItr; << 196 167 197 ScanAndSetCouple(aLV,aCouple,aR); << 168 std::vector<G4LogicalVolume*>::iterator rootLVItr >> 169 = (*rItr)->GetRootLogicalVolumeIterator(); >> 170 size_t nRootLV = (*rItr)->GetNumberOfRootVolumes(); >> 171 for(size_t iLV=0;iLV<nRootLV;iLV++) { >> 172 //Set the couple to the proper logical volumes in that region >> 173 G4LogicalVolume* aLV = *rootLVItr; >> 174 G4Region* aR = *rItr; 198 175 199 // Proceed to the next root logical << 176 ScanAndSetCouple(aLV,aCouple,aR); 200 ++rootLVItr; << 201 } << 202 177 203 // Proceed to next material in this re << 178 // Proceed to the next root logical volume in this region 204 ++mItr; << 179 rootLVItr++; 205 } 180 } >> 181 >> 182 // Proceed to next material in this region >> 183 mItr++; 206 } 184 } 207 } 185 } 208 186 209 // Check if sizes of Range/Energy cuts table 187 // Check if sizes of Range/Energy cuts tables are equal to the size of 210 // the couple table. If new couples are made << 188 // the couple table 211 // nCouple becomes larger then nTable << 189 // If new couples are made during the previous procedure, nCouple becomes 212 << 190 // larger then nTable 213 std::size_t nCouple = coupleTable.size(); << 191 size_t nCouple = coupleTable.size(); 214 std::size_t nTable = energyCutTable[0]->size << 192 size_t nTable = energyCutTable[0]->size(); 215 G4bool newCoupleAppears = nCouple>nTable; 193 G4bool newCoupleAppears = nCouple>nTable; 216 if(newCoupleAppears) << 194 if(newCoupleAppears) { 217 { << 195 for(size_t n=nCouple-nTable;n>0;n--) { 218 for(std::size_t n=nCouple-nTable; n>0; --n << 196 for(size_t nn=0;nn< NumberOfG4CutIndex;nn++){ 219 { << 220 for(std::size_t nn=0; nn< NumberOfG4CutI << 221 { << 222 rangeCutTable[nn]->push_back(-1.); 197 rangeCutTable[nn]->push_back(-1.); 223 energyCutTable[nn]->push_back(-1.); 198 energyCutTable[nn]->push_back(-1.); 224 } 199 } 225 } 200 } 226 } 201 } 227 202 228 // resize Range/Energy cuts double vectors i << 229 if(newCoupleAppears) << 230 { << 231 for(std::size_t ix=0; ix<NumberOfG4CutInde << 232 { << 233 G4double* rangeVOld = rangeDoubleVector[ << 234 G4double* energyVOld = energyDoubleVecto << 235 if(rangeVOld) delete [] rangeVOld; << 236 if(energyVOld) delete [] energyVOld; << 237 rangeDoubleVector[ix] = new G4double[(*( << 238 energyDoubleVector[ix] = new G4double[(* << 239 } << 240 } << 241 } << 242 << 243 // ------------------------------------------- << 244 void G4ProductionCutsTable::UpdateCoupleTable( << 245 { << 246 CreateCoupleTables(); << 247 << 248 if(firstUse) << 249 { << 250 if(G4ParticleTable::GetParticleTable()->Fi << 251 { << 252 converters[0] = new G4RToEConvForGamma() << 253 converters[0]->SetVerboseLevel(GetVerbos << 254 } << 255 if(G4ParticleTable::GetParticleTable()->Fi << 256 { << 257 converters[1] = new G4RToEConvForElectro << 258 converters[1]->SetVerboseLevel(GetVerbos << 259 } << 260 if(G4ParticleTable::GetParticleTable()->Fi << 261 { << 262 converters[2] = new G4RToEConvForPositro << 263 converters[2]->SetVerboseLevel(GetVerbos << 264 } << 265 if(G4ParticleTable::GetParticleTable()->Fi << 266 { << 267 converters[3] = new G4RToEConvForProton( << 268 converters[3]->SetVerboseLevel(GetVerbos << 269 } << 270 firstUse = false; << 271 } << 272 << 273 // Update RangeEnergy cuts tables 203 // Update RangeEnergy cuts tables 274 std::size_t idx = 0; << 204 size_t idx = 0; 275 G4Timer timer; << 205 for(CoupleTableIterator cItr=coupleTable.begin(); 276 if (verboseLevel>2) << 206 cItr!=coupleTable.end();cItr++){ 277 { << 278 timer.Start(); << 279 } << 280 for(auto cItr=coupleTable.cbegin(); cItr!=co << 281 { << 282 G4ProductionCuts* aCut = (*cItr)->GetProdu 207 G4ProductionCuts* aCut = (*cItr)->GetProductionCuts(); 283 const G4Material* aMat = (*cItr)->GetMater 208 const G4Material* aMat = (*cItr)->GetMaterial(); 284 if((*cItr)->IsRecalcNeeded()) << 209 if((*cItr)->IsRecalcNeeded()) { 285 { << 210 for(size_t ptcl=0;ptcl< NumberOfG4CutIndex;ptcl++){ 286 for(std::size_t ptcl=0; ptcl< NumberOfG4 << 211 G4double rCut = aCut->GetProductionCut(ptcl); 287 { << 288 G4double rCut = aCut->GetProductionCut << 289 (*(rangeCutTable[ptcl]))[idx] = rCut; 212 (*(rangeCutTable[ptcl]))[idx] = rCut; 290 << 213 // if(converters[ptcl] && (*cItr)->IsUsed()) 291 if(nullptr != converters[ptcl]) << 214 if(converters[ptcl]) { 292 { << 215 (*(energyCutTable[ptcl]))[idx] = converters[ptcl]->Convert(rCut,aMat); 293 // check user defined cut in energy << 216 } else { 294 if(nullptr == userEnergyCuts[ptcl] | << 295 { << 296 (*(energyCutTable[ptcl]))[idx] = c << 297 } << 298 else << 299 { << 300 (*(energyCutTable[ptcl]))[idx] = ( << 301 } << 302 } << 303 else << 304 { << 305 (*(energyCutTable[ptcl]))[idx] = -1. 217 (*(energyCutTable[ptcl]))[idx] = -1.; 306 } 218 } 307 } 219 } 308 } 220 } 309 ++idx; << 221 idx++; 310 } 222 } 311 if (verboseLevel>2) << 223 312 { << 224 // resize Range/Energy cuts double vectors if new couple is made 313 timer.Stop(); << 225 if(newCoupleAppears){ 314 G4cout << "G4ProductionCutsTable::UpdateCo << 226 for(size_t ix=0;ix<NumberOfG4CutIndex;ix++){ 315 << "Elapsed time for calculation of << 227 G4double* rangeVOld = rangeDoubleVector[ix]; 316 G4cout << timer << G4endl; << 228 G4double* energyVOld = energyDoubleVector[ix]; >> 229 if(rangeVOld) delete [] rangeVOld; >> 230 if(energyVOld) delete [] energyVOld; >> 231 rangeDoubleVector[ix] = new G4double[(*(rangeCutTable[ix])).size()]; >> 232 energyDoubleVector[ix] = new G4double[(*(energyCutTable[ix])).size()]; >> 233 } 317 } 234 } 318 235 319 // Update Range/Energy cuts double vectors 236 // Update Range/Energy cuts double vectors 320 for(std::size_t ix=0; ix<NumberOfG4CutIndex; << 237 for(size_t ix=0;ix<NumberOfG4CutIndex;ix++) { 321 { << 238 for(size_t ixx=0;ixx<(*(rangeCutTable[ix])).size();ixx++) { 322 for(std::size_t ixx=0; ixx<(*(rangeCutTabl << 323 { << 324 rangeDoubleVector[ix][ixx] = (*(rangeCut 239 rangeDoubleVector[ix][ixx] = (*(rangeCutTable[ix]))[ixx]; 325 energyDoubleVector[ix][ixx] = (*(energyC 240 energyDoubleVector[ix][ixx] = (*(energyCutTable[ix]))[ixx]; 326 } 241 } 327 } 242 } 328 } 243 } 329 244 330 // ------------------------------------------- << 331 G4double G4ProductionCutsTable::ConvertRangeTo << 332 const G4Part << 333 const G4Mate << 334 G4double << 335 { << 336 // This method gives energy corresponding to << 337 << 338 // protection against premature call << 339 if(firstUse) << 340 { << 341 #ifdef G4VERBOSE << 342 if(verboseLevel>0) << 343 { << 344 G4ExceptionDescription ed; << 345 ed << "Invoked prematurely before it is << 346 G4Exception("G4ProductionCutsTable::Conv << 347 "CUTS0100", JustWarning, ed) << 348 } << 349 #endif << 350 return -1.0; << 351 } << 352 << 353 // check material << 354 if (material == nullptr) return -1.0; << 355 << 356 // check range << 357 if (range == 0.0) return 0.0; << 358 if (range <0.0) return -1.0; << 359 << 360 // check particle << 361 G4int index = G4ProductionCuts::GetIndex(par << 362 << 363 if (index<0 || converters[index] == nullptr) << 364 { << 365 #ifdef G4VERBOSE << 366 if(verboseLevel>0) << 367 { << 368 G4ExceptionDescription ed; << 369 ed << "Invoked "; << 370 if(particle != nullptr) << 371 { ed << "for particle <" << particle->Ge << 372 else << 373 { ed << "without valid particle pointer. << 374 G4Exception("G4ProductionCutsTable::Conv << 375 "CUTS0101", JustWarning, ed) << 376 } << 377 #endif << 378 return -1.0; << 379 } << 380 << 381 return converters[index]->Convert(range, mat << 382 } << 383 << 384 // ------------------------------------------- << 385 void G4ProductionCutsTable::ResetConverters() << 386 {} << 387 << 388 // ------------------------------------------- << 389 void G4ProductionCutsTable::SetEnergyRange(G4d 245 void G4ProductionCutsTable::SetEnergyRange(G4double lowedge, G4double highedge) 390 { 246 { 391 G4VRangeToEnergyConverter::SetEnergyRange(lo 247 G4VRangeToEnergyConverter::SetEnergyRange(lowedge,highedge); 392 } 248 } 393 249 394 // ------------------------------------------- << 395 G4double G4ProductionCutsTable::GetLowEdgeEne 250 G4double G4ProductionCutsTable::GetLowEdgeEnergy() const 396 { 251 { 397 return G4VRangeToEnergyConverter::GetLowEdge 252 return G4VRangeToEnergyConverter::GetLowEdgeEnergy(); 398 } 253 } 399 254 400 // ------------------------------------------- << 401 G4double G4ProductionCutsTable::GetHighEdgeEne 255 G4double G4ProductionCutsTable::GetHighEdgeEnergy() const 402 { 256 { 403 return G4VRangeToEnergyConverter::GetHighEdg 257 return G4VRangeToEnergyConverter::GetHighEdgeEnergy(); 404 } 258 } 405 259 406 // ------------------------------------------- << 260 407 void G4ProductionCutsTable::ScanAndSetCouple(G 261 void G4ProductionCutsTable::ScanAndSetCouple(G4LogicalVolume* aLV, 408 G 262 G4MaterialCutsCouple* aCouple, 409 G 263 G4Region* aRegion) 410 { 264 { 411 // Check whether or not this logical volume << 265 //Check whether or not this logical volume belongs to the same region 412 if((aRegion!=nullptr) && aLV->GetRegion()!=a << 266 if((aRegion!=0) && aLV->GetRegion()!=aRegion) return; 413 267 414 // Check if this particular volume has a mat << 268 //Check if this particular volume has a material matched to the couple 415 if(aLV->GetMaterial()==aCouple->GetMaterial( << 269 if(aLV->GetMaterial()==aCouple->GetMaterial()) { 416 { << 417 aLV->SetMaterialCutsCouple(aCouple); 270 aLV->SetMaterialCutsCouple(aCouple); 418 } 271 } 419 272 420 std::size_t noDaughters = aLV->GetNoDaughter << 273 size_t noDaughters = aLV->GetNoDaughters(); 421 if(noDaughters==0) return; 274 if(noDaughters==0) return; 422 275 423 // Loop over daughters with same region << 276 //Loop over daughters with same region 424 for(std::size_t i=0; i<noDaughters; ++i) << 277 for(size_t i=0;i<noDaughters;i++){ 425 { << 426 G4LogicalVolume* daughterLVol = aLV->GetDa 278 G4LogicalVolume* daughterLVol = aLV->GetDaughter(i)->GetLogicalVolume(); 427 ScanAndSetCouple(daughterLVol,aCouple,aReg 279 ScanAndSetCouple(daughterLVol,aCouple,aRegion); 428 } 280 } 429 } 281 } 430 282 431 // ------------------------------------------- << 432 void G4ProductionCutsTable::DumpCouples() cons 283 void G4ProductionCutsTable::DumpCouples() const 433 { 284 { 434 G4cout << G4endl; 285 G4cout << G4endl; 435 G4cout << "========= Table of registered cou << 286 G4cout << "========= Table of registered couples ==============================" 436 << G4endl; 287 << G4endl; 437 for(auto cItr=coupleTable.cbegin(); cItr!=co << 288 for(CoupleTableIterator cItr=coupleTable.begin(); 438 { << 289 cItr!=coupleTable.end();cItr++) { 439 G4MaterialCutsCouple* aCouple = (*cItr); 290 G4MaterialCutsCouple* aCouple = (*cItr); 440 G4ProductionCuts* aCut = aCouple->GetProdu 291 G4ProductionCuts* aCut = aCouple->GetProductionCuts(); 441 G4cout << G4endl; 292 G4cout << G4endl; 442 G4cout << "Index : " << aCouple->GetIndex( 293 G4cout << "Index : " << aCouple->GetIndex() 443 << " used in the geometry : "; 294 << " used in the geometry : "; 444 if(aCouple->IsUsed()) G4cout << "Yes"; 295 if(aCouple->IsUsed()) G4cout << "Yes"; 445 else G4cout << "No "; 296 else G4cout << "No "; 446 //// G4cout << " recalculation needed : << 297 G4cout << " recalculation needed : "; 447 //// if(aCouple->IsRecalcNeeded()) G4cout < << 298 if(aCouple->IsRecalcNeeded()) G4cout << "Yes"; 448 //// else G4cout < << 299 else G4cout << "No "; 449 G4cout << G4endl; 300 G4cout << G4endl; 450 G4cout << " Material : " << aCouple->GetMa 301 G4cout << " Material : " << aCouple->GetMaterial()->GetName() << G4endl; 451 G4cout << " Range cuts : " 302 G4cout << " Range cuts : " 452 << " gamma " << G4BestUnit(aCut->G << 303 << " gamma " << G4BestUnit(aCut->GetProductionCut("gamma"),"Length") 453 << " e- " << G4BestUnit(aCut->G << 304 << " e- " << G4BestUnit(aCut->GetProductionCut("e-"),"Length") 454 << " e+ " << G4BestUnit(aCut->G << 305 << " e+ " << G4BestUnit(aCut->GetProductionCut("e+"),"Length") 455 << " proton " << G4BestUnit(aCut->G << 456 << G4endl; 306 << G4endl; 457 G4cout << " Energy thresholds : " ; 307 G4cout << " Energy thresholds : " ; 458 //// if(aCouple->IsRecalcNeeded()) { << 308 if(aCouple->IsRecalcNeeded()) { 459 //// G4cout << " is not ready to print"; << 309 G4cout << " is not ready to print"; 460 //// } else { << 310 } else { 461 G4cout << " gamma " << G4BestUnit((*(ener << 311 G4cout << " gamma " << G4BestUnit((*(energyCutTable[0]))[aCouple->GetIndex()],"Energy") 462 << " e- " << G4BestUnit((*(ener << 312 << " e- " << G4BestUnit((*(energyCutTable[1]))[aCouple->GetIndex()],"Energy") 463 << " e+ " << G4BestUnit((*(ener << 313 << " e+ " << G4BestUnit((*(energyCutTable[2]))[aCouple->GetIndex()],"Energy"); 464 << " proton " << G4BestUnit((*(ener << 314 } 465 //// } << 466 G4cout << G4endl; 315 G4cout << G4endl; 467 316 468 if(aCouple->IsUsed()) << 317 if(aCouple->IsUsed()) { 469 { << 470 G4cout << " Region(s) which use this cou 318 G4cout << " Region(s) which use this couple : " << G4endl; 471 for(auto rItr=fG4RegionStore->cbegin(); << 319 typedef std::vector<G4Region*>::iterator regionIterator; 472 rItr!=fG4RegionStore->cend(); + << 320 for(regionIterator rItr=fG4RegionStore->begin(); 473 { << 321 rItr!=fG4RegionStore->end();rItr++) { 474 if (IsCoupleUsedInTheRegion(aCouple, * << 322 if (IsCoupleUsedInTheRegion(aCouple, *rItr) ){ 475 { << 476 G4cout << " " << (*rItr)->GetName 323 G4cout << " " << (*rItr)->GetName() << G4endl; 477 } 324 } 478 } 325 } 479 } 326 } 480 } 327 } 481 G4cout << G4endl; 328 G4cout << G4endl; 482 G4cout << "================================= << 329 G4cout << "====================================================================" << G4endl; 483 G4cout << G4endl; 330 G4cout << G4endl; 484 } 331 } 485 332 486 // ------------------------------------------- << 333 >> 334 // Store cuts and material information in files under the specified directory. 487 G4bool G4ProductionCutsTable::StoreCutsTable( 335 G4bool G4ProductionCutsTable::StoreCutsTable(const G4String& dir, 488 << 336 G4bool ascii) 489 { 337 { 490 // Store cuts and material information in fi << 491 << 492 if (!StoreMaterialInfo(dir, ascii)) return f 338 if (!StoreMaterialInfo(dir, ascii)) return false; 493 if (!StoreMaterialCutsCoupleInfo(dir, ascii) 339 if (!StoreMaterialCutsCoupleInfo(dir, ascii)) return false; 494 if (!StoreCutsInfo(dir, ascii)) return false 340 if (!StoreCutsInfo(dir, ascii)) return false; 495 341 496 #ifdef G4VERBOSE 342 #ifdef G4VERBOSE 497 if (verboseLevel >2) << 343 if (verboseLevel >1) { 498 { << 344 G4cout << "G4ProductionCutsTable::StoreCutsTable " ; 499 G4cout << "G4ProductionCutsTable::StoreCut << 345 G4cout << " Material/Cuts information have been succesfully stored "; 500 G4cout << " Material/Cuts information have << 346 if (ascii) { 501 if (ascii) << 502 { << 503 G4cout << " in Ascii mode "; 347 G4cout << " in Ascii mode "; 504 } << 348 }else{ 505 else << 506 { << 507 G4cout << " in Binary mode "; 349 G4cout << " in Binary mode "; 508 } 350 } 509 G4cout << " under " << dir << G4endl; 351 G4cout << " under " << dir << G4endl; 510 } 352 } 511 #endif 353 #endif 512 return true; 354 return true; 513 } 355 } 514 356 515 // ------------------------------------------- << 516 G4bool G4ProductionCutsTable::RetrieveCutsTab 357 G4bool G4ProductionCutsTable::RetrieveCutsTable(const G4String& dir, 517 << 358 G4bool ascii) 518 { 359 { 519 if (!CheckForRetrieveCutsTable(dir, ascii)) 360 if (!CheckForRetrieveCutsTable(dir, ascii)) return false; 520 if (!RetrieveCutsInfo(dir, ascii)) return fa 361 if (!RetrieveCutsInfo(dir, ascii)) return false; 521 #ifdef G4VERBOSE 362 #ifdef G4VERBOSE 522 if (verboseLevel >2) << 363 if (verboseLevel >1) { 523 { << 364 G4cout << "G4ProductionCutsTable::RetrieveCutsTable " ; 524 G4cout << "G4ProductionCutsTable::Retrieve << 365 G4cout << " Material/Cuts information have been succesfully retreived "; 525 G4cout << " Material/Cuts information have << 366 if (ascii) { 526 if (ascii) << 527 { << 528 G4cout << " in Ascii mode "; 367 G4cout << " in Ascii mode "; 529 } << 368 }else{ 530 else << 531 { << 532 G4cout << " in Binary mode "; 369 G4cout << " in Binary mode "; 533 } 370 } 534 G4cout << " under " << dir << G4endl; 371 G4cout << " under " << dir << G4endl; 535 } 372 } 536 #endif 373 #endif 537 return true; 374 return true; 538 } 375 } 539 376 540 // ------------------------------------------- << 377 // check stored material and cut values are consistent >> 378 // with the current detector setup. >> 379 // 541 G4bool 380 G4bool 542 G4ProductionCutsTable::CheckForRetrieveCutsTab << 381 G4ProductionCutsTable::CheckForRetrieveCutsTable(const G4String& directory, 543 << 382 G4bool ascii) 544 { 383 { 545 // check stored material and cut values are << 384 G4cerr << "G4ProductionCutsTable::CheckForRetrieveCutsTable!!"<< G4endl; 546 // with the current detector setup << 547 << 548 G4cerr << "G4ProductionCutsTable::CheckForRe << 549 // isNeedForRestoreCoupleInfo = false; 385 // isNeedForRestoreCoupleInfo = false; 550 if (!CheckMaterialInfo(directory, ascii)) re 386 if (!CheckMaterialInfo(directory, ascii)) return false; 551 if (verboseLevel >2) << 387 if (verboseLevel >1) { 552 { << 388 G4cerr << "G4ProductionCutsTable::CheckMaterialInfo passed !!"<< G4endl; 553 G4cerr << "G4ProductionCutsTable::CheckM << 554 } 389 } 555 if (!CheckMaterialCutsCoupleInfo(directory, 390 if (!CheckMaterialCutsCoupleInfo(directory, ascii)) return false; 556 if (verboseLevel >2) << 391 if (verboseLevel >1) { 557 { << 392 G4cerr << "G4ProductionCutsTable::CheckMaterialCutsCoupleInfo passed !!"<< G4endl; 558 G4cerr << "G4ProductionCutsTable::CheckMat << 559 << G4endl; << 560 } 393 } 561 return true; 394 return true; 562 } 395 } 563 396 564 // ------------------------------------------- << 397 // Store material information in files under the specified directory. 565 G4bool G4ProductionCutsTable::StoreMaterialInf << 398 // 566 << 399 G4bool G4ProductionCutsTable::StoreMaterialInfo(const G4String& directory, >> 400 G4bool ascii) 567 { 401 { 568 // Store material information in files under << 569 << 570 const G4String fileName = directory + "/" + 402 const G4String fileName = directory + "/" + "material.dat"; 571 const G4String key = "MATERIAL-V3.0"; << 403 const G4String key = "MATERIAL-V2.0"; 572 std::ofstream fOut; 404 std::ofstream fOut; 573 405 574 // open output file << 406 // open output file // 575 if (!ascii ) fOut.open(fileName,std::ios::o << 407 if (!ascii ) 576 else fOut.open(fileName,std::ios::o << 408 fOut.open(fileName,std::ios::out|std::ios::binary); >> 409 else >> 410 fOut.open(fileName,std::ios::out); 577 411 >> 412 578 // check if the file has been opened success 413 // check if the file has been opened successfully 579 if (!fOut) << 414 if (!fOut) { 580 { << 581 #ifdef G4VERBOSE 415 #ifdef G4VERBOSE 582 if (verboseLevel>0) << 416 if (verboseLevel>0) { 583 { << 417 G4cerr << "G4ProductionCutsTable::StoreMaterialInfo "; 584 G4cerr << "G4ProductionCutsTable::StoreM << 418 G4cerr << " Can not open file " << fileName << G4endl; 585 G4cerr << "Cannot open file: " << fileNa << 586 } 419 } 587 #endif 420 #endif 588 G4Exception( "G4ProductionCutsTable::Store << 589 "ProcCuts102", JustWarning, " << 590 return false; 421 return false; 591 } 422 } 592 423 593 const G4MaterialTable* matTable = G4Material 424 const G4MaterialTable* matTable = G4Material::GetMaterialTable(); 594 // number of materials in the table 425 // number of materials in the table 595 G4int numberOfMaterial = (G4int)matTable->si << 426 G4int numberOfMaterial = matTable->size(); 596 427 597 if (ascii) << 428 if (ascii) { 598 { << 599 /////////////// ASCII mode ////////////// 429 /////////////// ASCII mode ///////////////// 600 // key word 430 // key word 601 fOut << key << G4endl; 431 fOut << key << G4endl; 602 432 603 // number of materials in the table 433 // number of materials in the table 604 fOut << numberOfMaterial << G4endl; 434 fOut << numberOfMaterial << G4endl; 605 435 606 fOut.setf(std::ios::scientific); 436 fOut.setf(std::ios::scientific); 607 437 608 // material name and density 438 // material name and density 609 for (std::size_t idx=0; static_cast<G4int> << 439 for (size_t idx=0; G4int(idx)<numberOfMaterial; ++idx){ 610 { << 611 fOut << std::setw(FixedStringLengthForSt 440 fOut << std::setw(FixedStringLengthForStore) 612 << ((*matTable)[idx])->GetName(); 441 << ((*matTable)[idx])->GetName(); 613 fOut << std::setw(FixedStringLengthForSt 442 fOut << std::setw(FixedStringLengthForStore) 614 << ((*matTable)[idx])->GetDensity() 443 << ((*matTable)[idx])->GetDensity()/(g/cm3) << G4endl; 615 } 444 } 616 445 617 fOut.unsetf(std::ios::scientific); 446 fOut.unsetf(std::ios::scientific); 618 447 619 } << 448 } else { 620 else << 621 { << 622 /////////////// Binary mode ///////////// 449 /////////////// Binary mode ///////////////// 623 char temp[FixedStringLengthForStore]; 450 char temp[FixedStringLengthForStore]; 624 std::size_t i; << 451 size_t i; 625 452 626 // key word 453 // key word 627 for (i=0; i<FixedStringLengthForStore; ++i << 454 for (i=0; i<FixedStringLengthForStore; ++i){ 628 { << 629 temp[i] = '\0'; 455 temp[i] = '\0'; 630 } 456 } 631 for (i=0; i<key.length() && i<FixedStringL << 457 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i){ 632 { << 458 temp[i]=key[i]; 633 temp[i]=key[(G4int)i]; << 634 } 459 } 635 fOut.write(temp, FixedStringLengthForStore 460 fOut.write(temp, FixedStringLengthForStore); 636 461 637 // number of materials in the table 462 // number of materials in the table 638 fOut.write( (char*)(&numberOfMaterial), si << 463 fOut.write( (char*)(&numberOfMaterial), sizeof (G4int)); 639 464 640 // material name and density 465 // material name and density 641 for (std::size_t imat=0; static_cast<G4int << 466 for (size_t imat=0; G4int(imat)<numberOfMaterial; ++imat){ 642 { << 643 G4String name = ((*matTable)[imat])->Ge 467 G4String name = ((*matTable)[imat])->GetName(); 644 G4double density = ((*matTable)[imat])-> 468 G4double density = ((*matTable)[imat])->GetDensity(); 645 for (i=0; i<FixedStringLengthForStore; + << 469 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 646 temp[i] = '\0'; << 647 for (i=0; i<name.length() && i<FixedStri 470 for (i=0; i<name.length() && i<FixedStringLengthForStore-1; ++i) 648 temp[i]=name[(G4int)i]; << 471 temp[i]=name[i]; 649 fOut.write(temp, FixedStringLengthForSto 472 fOut.write(temp, FixedStringLengthForStore); 650 fOut.write( (char*)(&density), sizeof(G4 << 473 fOut.write( (char*)(&density), sizeof (G4double)); 651 } 474 } 652 } << 475 } 653 476 654 fOut.close(); 477 fOut.close(); 655 return true; 478 return true; 656 } 479 } 657 480 658 // ------------------------------------------- << 481 // check stored material is consistent with the current detector setup. 659 G4bool G4ProductionCutsTable::CheckMaterialInf << 482 G4bool G4ProductionCutsTable::CheckMaterialInfo(const G4String& directory, 660 << 483 G4bool ascii) 661 { 484 { 662 // Check stored material is consistent with << 663 << 664 const G4String fileName = directory + "/" + 485 const G4String fileName = directory + "/" + "material.dat"; 665 const G4String key = "MATERIAL-V3.0"; << 486 const G4String key = "MATERIAL-V2.0"; 666 std::ifstream fIn; 487 std::ifstream fIn; 667 488 668 // open input file << 489 // open input file // 669 if (!ascii ) fIn.open(fileName,std::ios::in| << 490 if (!ascii ) 670 else fIn.open(fileName,std::ios::in) << 491 fIn.open(fileName,std::ios::in|std::ios::binary); >> 492 else >> 493 fIn.open(fileName,std::ios::in); 671 494 672 // check if the file has been opened success 495 // check if the file has been opened successfully 673 if (!fIn) << 496 if (!fIn) { 674 { << 675 #ifdef G4VERBOSE 497 #ifdef G4VERBOSE 676 if (verboseLevel >0) << 498 if (verboseLevel >0) { 677 { << 499 G4cerr << "G4ProductionCutsTable::CheckMaterialInfo "; 678 G4cerr << "G4ProductionCutsTable::CheckM << 500 G4cerr << " Can not open file " << fileName << G4endl; 679 G4cerr << "Cannot open file: " << fileNa << 680 } 501 } 681 #endif 502 #endif 682 G4Exception( "G4ProductionCutsTable::Check << 683 "ProcCuts102", JustWarning, " << 684 return false; 503 return false; 685 } 504 } 686 505 687 char temp[FixedStringLengthForStore]; 506 char temp[FixedStringLengthForStore]; 688 507 689 // key word 508 // key word 690 G4String keyword; 509 G4String keyword; 691 if (ascii) << 510 if (ascii) { 692 { << 693 fIn >> keyword; 511 fIn >> keyword; 694 } << 512 } else { 695 else << 696 { << 697 fIn.read(temp, FixedStringLengthForStore); 513 fIn.read(temp, FixedStringLengthForStore); 698 keyword = (const char*)(temp); 514 keyword = (const char*)(temp); 699 } 515 } 700 if (key!=keyword) << 516 if (key!=keyword) { 701 { << 702 #ifdef G4VERBOSE 517 #ifdef G4VERBOSE 703 if (verboseLevel >0) << 518 if (verboseLevel >0) { 704 { << 519 G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; 705 G4cerr << "G4ProductionCutsTable::CheckM << 520 G4cout << " Key word in " << fileName << "= " << keyword ; 706 G4cerr << "Key word in " << fileName << << 521 G4cout <<"( should be "<< key << ")" <<G4endl; 707 G4cerr <<"( should be "<< key << ")" < << 708 } 522 } 709 #endif 523 #endif 710 G4Exception( "G4ProductionCutsTable::Check << 711 "ProcCuts103", JustWarning, " << 712 return false; 524 return false; 713 } 525 } 714 526 715 // number of materials in the table 527 // number of materials in the table 716 G4int nmat; 528 G4int nmat; 717 if (ascii) << 529 if (ascii) { 718 { << 719 fIn >> nmat; 530 fIn >> nmat; 720 } << 531 } else { 721 else << 532 fIn.read( (char*)(&nmat), sizeof (G4int)); 722 { << 723 fIn.read( (char*)(&nmat), sizeof(G4int)); << 724 } << 725 if ((nmat<=0) || (nmat >100000)) << 726 { << 727 G4Exception( "G4ProductionCutsTable::Check << 728 "ProcCuts108", JustWarning, << 729 "Number of materials is less << 730 return false; << 731 } 533 } 732 534 733 // list of material 535 // list of material 734 for (G4int idx=0; idx<nmat ; ++idx) << 536 for (G4int idx=0; idx<nmat ; ++idx){ 735 { << 736 // check eof 537 // check eof 737 if(fIn.eof()) << 538 if(fIn.eof()) { 738 { << 739 #ifdef G4VERBOSE 539 #ifdef G4VERBOSE 740 if (verboseLevel >0) << 540 if (verboseLevel >0) { 741 { << 541 G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; 742 G4cout << "G4ProductionCutsTable::Chec << 542 G4cout << " encountered End of File " ; 743 G4cout << "Encountered End of File " ; << 744 G4cout << " at " << idx+1 << "th mate 543 G4cout << " at " << idx+1 << "th material "<< G4endl; 745 } 544 } 746 #endif 545 #endif 747 fIn.close(); 546 fIn.close(); 748 return false; 547 return false; 749 } 548 } 750 549 751 // check material name and density 550 // check material name and density 752 char name[FixedStringLengthForStore]; 551 char name[FixedStringLengthForStore]; 753 G4double density; << 552 double density; 754 if (ascii) << 553 if (ascii) { 755 { << 756 fIn >> name >> density; 554 fIn >> name >> density; 757 density *= (g/cm3); 555 density *= (g/cm3); 758 556 759 } << 557 } else { 760 else << 761 { << 762 fIn.read(name, FixedStringLengthForStore 558 fIn.read(name, FixedStringLengthForStore); 763 fIn.read((char*)(&density), sizeof(G4dou << 559 fIn.read((char*)(&density), sizeof (G4double)); 764 } 560 } 765 if (fIn.fail()) << 561 if (fIn.fail()) { 766 { << 767 #ifdef G4VERBOSE 562 #ifdef G4VERBOSE 768 if (verboseLevel >0) << 563 if (verboseLevel >0) { 769 { << 564 G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; 770 G4cerr << "G4ProductionCutsTable::Chec << 565 G4cout << " Bad data format "; 771 G4cerr << "Bad data format "; << 566 G4cout << " at " << idx+1 << "th material "<< G4endl; 772 G4cerr << " at " << idx+1 << "th mate << 773 } 567 } 774 #endif 568 #endif 775 G4Exception( "G4ProductionCutsTable::Che << 776 "ProcCuts103", JustWarning, << 777 fIn.close(); 569 fIn.close(); 778 return false; 570 return false; 779 } 571 } 780 572 781 G4Material* aMaterial = G4Material::GetMat 573 G4Material* aMaterial = G4Material::GetMaterial(name); 782 if (aMaterial == nullptr ) continue; << 574 if (aMaterial ==0 ) continue; 783 575 784 G4double ratio = std::fabs(density/aMateri << 576 G4double ratio = std::abs(density/aMaterial->GetDensity() ); 785 if ((0.999>ratio) || (ratio>1.001) ) << 577 if ((0.999>ratio) || (ratio>1.001) ){ 786 { << 787 #ifdef G4VERBOSE 578 #ifdef G4VERBOSE 788 if (verboseLevel >0) << 579 if (verboseLevel >0) { 789 { << 580 G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; 790 G4cerr << "G4ProductionCutsTable::Chec << 581 G4cout << " Inconsistent material density" << G4endl;; 791 G4cerr << "Inconsistent material densi << 582 G4cout << " at " << idx+1 << "th material "<< G4endl; 792 G4cerr << " at " << idx+1 << "th mate << 583 G4cout << "Name: " << name << G4endl; 793 G4cerr << "Name: " << name << G4endl << 584 G4cout << "Density:" << std::setiosflags(std::ios::scientific) << density / (g/cm3) ; 794 G4cerr << "Density:" << std::setiosfla << 585 G4cout << "(should be " << aMaterial->GetDensity()/(g/cm3)<< ")" << " [g/cm3]"<< G4endl; 795 << density / (g/cm3) ; << 586 G4cout << std::resetiosflags(std::ios::scientific); 796 G4cerr << "(should be " << aMaterial-> << 797 << " [g/cm3]"<< G4endl; << 798 G4cerr << std::resetiosflags(std::ios: << 799 } 587 } 800 #endif 588 #endif 801 G4Exception( "G4ProductionCutsTable::Che << 802 "ProcCuts104", JustWarning, << 803 fIn.close(); 589 fIn.close(); 804 return false; 590 return false; 805 } 591 } >> 592 806 } 593 } 807 594 808 fIn.close(); 595 fIn.close(); 809 return true; 596 return true; >> 597 810 } 598 } >> 599 811 600 812 // ------------------------------------------- << 601 // Store materialCutsCouple information in files under the specified directory. >> 602 // 813 G4bool 603 G4bool 814 G4ProductionCutsTable::StoreMaterialCutsCouple << 604 G4ProductionCutsTable::StoreMaterialCutsCoupleInfo(const G4String& directory, 815 << 605 G4bool ascii) 816 { 606 { 817 // Store materialCutsCouple information in f << 818 << 819 const G4String fileName = directory + "/" + 607 const G4String fileName = directory + "/" + "couple.dat"; 820 const G4String key = "COUPLE-V3.0"; << 608 const G4String key = "COUPLE-V2.0"; 821 std::ofstream fOut; 609 std::ofstream fOut; 822 char temp[FixedStringLengthForStore]; 610 char temp[FixedStringLengthForStore]; 823 611 824 // open output file << 612 // open output file // 825 if (!ascii ) fOut.open(fileName,std::ios::ou << 613 if (!ascii ) 826 else fOut.open(fileName,std::ios::ou << 614 fOut.open(fileName,std::ios::out|std::ios::binary); >> 615 else >> 616 fOut.open(fileName,std::ios::out); 827 617 828 618 829 // check if the file has been opened success 619 // check if the file has been opened successfully 830 if (!fOut) << 620 if (!fOut) { 831 { << 832 #ifdef G4VERBOSE 621 #ifdef G4VERBOSE 833 if (verboseLevel >0) << 622 if (verboseLevel >0) { 834 { << 623 G4cerr << "G4ProductionCutsTable::StoreMaterialCutsCoupleInfo "; 835 G4cerr << "G4ProductionCutsTable::StoreM << 624 G4cerr << " Can not open file " << fileName << G4endl; 836 G4cerr << "Cannot open file: " << fileNa << 837 } 625 } 838 #endif 626 #endif 839 G4Exception( "G4ProductionCutsTable::Store << 627 return false; 840 "ProcCuts102", << 841 JustWarning, "Cannot open fil << 842 return false; << 843 } 628 } 844 G4int numberOfCouples = (G4int)coupleTable.s << 629 G4int numberOfCouples = coupleTable.size(); 845 if (ascii) << 630 if (ascii) { 846 { << 847 /////////////// ASCII mode ////////////// 631 /////////////// ASCII mode ///////////////// 848 // key word 632 // key word 849 fOut << std::setw(FixedStringLengthForStor 633 fOut << std::setw(FixedStringLengthForStore) << key << G4endl; 850 634 851 // number of couples in the table 635 // number of couples in the table 852 fOut << numberOfCouples << G4endl; 636 fOut << numberOfCouples << G4endl; 853 } << 637 } else { 854 else << 855 { << 856 /////////////// Binary mode ///////////// 638 /////////////// Binary mode ///////////////// 857 // key word 639 // key word 858 std::size_t i; << 640 size_t i; 859 for (i=0; i<FixedStringLengthForStore; ++i << 641 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 860 temp[i] = '\0'; << 861 for (i=0; i<key.length() && i<FixedStringL 642 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i) 862 temp[i]=key[(G4int)i]; << 643 temp[i]=key[i]; 863 fOut.write(temp, FixedStringLengthForStore 644 fOut.write(temp, FixedStringLengthForStore); 864 645 865 // number of couples in the table 646 // number of couples in the table 866 fOut.write( (char*)(&numberOfCouples), siz << 647 fOut.write( (char*)(&numberOfCouples), sizeof (G4int)); 867 } 648 } 868 649 >> 650 869 // Loop over all couples 651 // Loop over all couples 870 for (auto cItr=coupleTable.cbegin(); cItr!=c << 652 CoupleTableIterator cItr; 871 { << 653 for (cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++){ 872 G4MaterialCutsCouple* aCouple = (*cItr); 654 G4MaterialCutsCouple* aCouple = (*cItr); 873 G4int index = aCouple->GetIndex(); 655 G4int index = aCouple->GetIndex(); 874 // cut value 656 // cut value 875 G4ProductionCuts* aCut = aCouple->GetProdu 657 G4ProductionCuts* aCut = aCouple->GetProductionCuts(); 876 G4double cutValues[NumberOfG4CutIndex]; 658 G4double cutValues[NumberOfG4CutIndex]; 877 for (std::size_t idx=0; idx <NumberOfG4Cut << 659 for (size_t idx=0; idx <NumberOfG4CutIndex; idx++) { 878 { << 660 cutValues[idx] = aCut->GetProductionCut(idx); 879 cutValues[idx] = aCut->GetProductionCut( << 880 } 661 } 881 // material/region info 662 // material/region info 882 G4String materialName = aCouple->GetMateri 663 G4String materialName = aCouple->GetMaterial()->GetName(); 883 G4String regionName = "NONE"; 664 G4String regionName = "NONE"; 884 if (aCouple->IsUsed()) << 665 if (aCouple->IsUsed()){ 885 { << 666 typedef std::vector<G4Region*>::iterator regionIterator; 886 for(auto rItr=fG4RegionStore->cbegin(); << 667 for(regionIterator rItr=fG4RegionStore->begin(); 887 rItr!=fG4RegionStore->cend(); + << 668 rItr!=fG4RegionStore->end();rItr++){ 888 { << 669 if (IsCoupleUsedInTheRegion(aCouple, *rItr) ){ 889 if (IsCoupleUsedInTheRegion(aCouple, * << 890 { << 891 regionName = (*rItr)->GetName(); 670 regionName = (*rItr)->GetName(); 892 break; 671 break; 893 } 672 } 894 } 673 } 895 } 674 } 896 675 897 if (ascii) << 676 if (ascii) { 898 { << 899 /////////////// ASCII mode //////////// 677 /////////////// ASCII mode ///////////////// 900 // index number 678 // index number 901 fOut << index << G4endl; 679 fOut << index << G4endl; 902 680 903 // material name 681 // material name 904 fOut << std::setw(FixedStringLengthForSt 682 fOut << std::setw(FixedStringLengthForStore) << materialName<< G4endl; 905 683 906 // region name 684 // region name 907 fOut << std::setw(FixedStringLengthForSt 685 fOut << std::setw(FixedStringLengthForStore) << regionName<< G4endl; 908 686 909 fOut.setf(std::ios::scientific); 687 fOut.setf(std::ios::scientific); 910 // cut values 688 // cut values 911 for (std::size_t idx=0; idx< NumberOfG4C << 689 for (size_t idx=0; idx< NumberOfG4CutIndex; idx++) { 912 { << 913 fOut << std::setw(FixedStringLengthFor 690 fOut << std::setw(FixedStringLengthForStore) << cutValues[idx]/(mm) 914 << G4endl; 691 << G4endl; 915 } 692 } 916 fOut.unsetf(std::ios::scientific); 693 fOut.unsetf(std::ios::scientific); 917 694 918 } << 695 } else { 919 else << 920 { << 921 /////////////// Binary mode /////////// 696 /////////////// Binary mode ///////////////// 922 // index 697 // index 923 fOut.write( (char*)(&index), sizeof(G4in << 698 fOut.write( (char*)(&index), sizeof (G4int)); 924 699 925 // material name 700 // material name 926 std::size_t i; << 701 size_t i; 927 for (i=0; i<FixedStringLengthForStore; + << 702 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 928 temp[i] = '\0'; << 703 for (i=0; i<materialName.length() && i<FixedStringLengthForStore-1; ++i) { 929 for (i=0; i<materialName.length() && i<F << 704 temp[i]=materialName[i]; 930 temp[i]=materialName[(G4int)i]; << 705 } 931 fOut.write(temp, FixedStringLengthForSto 706 fOut.write(temp, FixedStringLengthForStore); 932 707 933 // region name 708 // region name 934 for (i=0; i<FixedStringLengthForStore; + << 709 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 935 temp[i] = '\0'; << 710 for (i=0; i<regionName.length() && i<FixedStringLengthForStore-1; ++i) { 936 for (i=0; i<regionName.length() && i<Fix << 711 temp[i]=regionName[i]; 937 temp[i]=regionName[(G4int)i]; << 712 } 938 fOut.write(temp, FixedStringLengthForSto 713 fOut.write(temp, FixedStringLengthForStore); 939 714 940 // cut values 715 // cut values 941 for (std::size_t idx=0; idx< NumberOfG4C << 716 for (size_t idx=0; idx< NumberOfG4CutIndex; idx++) { 942 { << 717 fOut.write( (char*)(&(cutValues[idx])), sizeof (G4double)); 943 fOut.write( (char*)(&(cutValues[idx]) << 944 } 718 } 945 } 719 } 946 } << 720 } >> 721 947 fOut.close(); 722 fOut.close(); 948 return true; 723 return true; 949 } 724 } 950 725 951 // ------------------------------------------- << 726 >> 727 // check stored materialCutsCouple is consistent >> 728 // with the current detector setup. >> 729 // 952 G4bool 730 G4bool 953 G4ProductionCutsTable::CheckMaterialCutsCouple 731 G4ProductionCutsTable::CheckMaterialCutsCoupleInfo(const G4String& directory, 954 << 732 G4bool ascii ) 955 { 733 { 956 // Check stored materialCutsCouple is consis << 957 // with the current detector setup. << 958 << 959 const G4String fileName = directory + "/" + 734 const G4String fileName = directory + "/" + "couple.dat"; 960 const G4String key = "COUPLE-V3.0"; << 735 const G4String key = "COUPLE-V2.0"; 961 std::ifstream fIn; 736 std::ifstream fIn; 962 737 963 // open input file << 738 // open input file // 964 if (!ascii ) fIn.open(fileName,std::ios::in| << 739 if (!ascii ) 965 else fIn.open(fileName,std::ios::in) << 740 fIn.open(fileName,std::ios::in|std::ios::binary); >> 741 else >> 742 fIn.open(fileName,std::ios::in); 966 743 967 // check if the file has been opened success 744 // check if the file has been opened successfully 968 if (!fIn) << 745 if (!fIn) { 969 { << 970 #ifdef G4VERBOSE 746 #ifdef G4VERBOSE 971 if (verboseLevel >0) << 747 if (verboseLevel >0) { 972 { << 748 G4cerr << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 973 G4cerr << "G4ProductionCutTable::CheckMa << 749 G4cerr << " Can not open file " << fileName << G4endl; 974 G4cerr << "Cannot open file!" << fileNam << 975 } 750 } 976 #endif 751 #endif 977 G4Exception( "G4ProductionCutsTable::Check << 978 "ProcCuts102", JustWarning, " << 979 return false; 752 return false; 980 } 753 } 981 754 982 char temp[FixedStringLengthForStore]; 755 char temp[FixedStringLengthForStore]; 983 756 984 // key word 757 // key word 985 G4String keyword; 758 G4String keyword; 986 if (ascii) << 759 if (ascii) { 987 { << 988 fIn >> keyword; 760 fIn >> keyword; 989 } << 761 } else { 990 else << 991 { << 992 fIn.read(temp, FixedStringLengthForStore); 762 fIn.read(temp, FixedStringLengthForStore); 993 keyword = (const char*)(temp); 763 keyword = (const char*)(temp); 994 } 764 } 995 if (key!=keyword) << 765 if (key!=keyword) { 996 { << 997 #ifdef G4VERBOSE 766 #ifdef G4VERBOSE 998 if (verboseLevel >0) << 767 if (verboseLevel >0) { 999 { << 768 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1000 G4cerr << "G4ProductionCutTable::CheckM << 769 G4cout << " Key word in " << fileName << "= " << keyword ; 1001 G4cerr << "Key word in " << fileName << << 770 G4cout <<"( should be "<< key << ")" <<G4endl; 1002 G4cerr <<"( should be "<< key << ")" << 1003 } 771 } 1004 #endif 772 #endif 1005 G4Exception( "G4ProductionCutsTable::Chec << 1006 "ProcCuts103", JustWarning, << 1007 fIn.close(); 773 fIn.close(); 1008 return false; 774 return false; 1009 } 775 } 1010 776 1011 // numberOfCouples 777 // numberOfCouples 1012 G4int numberOfCouples; 778 G4int numberOfCouples; 1013 if (ascii) << 779 if (ascii) { 1014 { << 1015 fIn >> numberOfCouples; 780 fIn >> numberOfCouples; 1016 } << 781 } else { 1017 else << 782 fIn.read( (char*)(&numberOfCouples), sizeof (G4int)); 1018 { << 1019 fIn.read( (char*)(&numberOfCouples), size << 1020 } 783 } 1021 784 1022 // Reset MCCIndexConversionTable 785 // Reset MCCIndexConversionTable 1023 mccConversionTable.Reset(numberOfCouples); 786 mccConversionTable.Reset(numberOfCouples); 1024 787 1025 // Read in couple information 788 // Read in couple information 1026 for (G4int idx=0; idx<numberOfCouples; ++id << 789 for (G4int idx=0; idx<numberOfCouples; idx+=1){ 1027 { << 1028 // read in index 790 // read in index 1029 G4int index; 791 G4int index; 1030 if (ascii) << 792 if (ascii) { 1031 { << 1032 fIn >> index; 793 fIn >> index; 1033 } << 794 } else { 1034 else << 795 fIn.read( (char*)(&index), sizeof (G4int)); 1035 { << 1036 fIn.read( (char*)(&index), sizeof(G4int << 1037 } 796 } 1038 // read in index material name 797 // read in index material name 1039 char mat_name[FixedStringLengthForStore]; 798 char mat_name[FixedStringLengthForStore]; 1040 if (ascii) << 799 if (ascii) { 1041 { << 1042 fIn >> mat_name; 800 fIn >> mat_name; 1043 } << 801 } else { 1044 else << 1045 { << 1046 fIn.read(mat_name, FixedStringLengthFor 802 fIn.read(mat_name, FixedStringLengthForStore); 1047 } 803 } 1048 // read in index and region name 804 // read in index and region name 1049 char region_name[FixedStringLengthForStor 805 char region_name[FixedStringLengthForStore]; 1050 if (ascii) << 806 if (ascii) { 1051 { << 1052 fIn >> region_name; 807 fIn >> region_name; 1053 } << 808 } else { 1054 else << 809 fIn.read(region_name, FixedStringLengthForStore); 1055 { << 1056 fIn.read(region_name, FixedStringLength << 1057 } 810 } 1058 // cut value 811 // cut value 1059 G4double cutValues[NumberOfG4CutIndex]; 812 G4double cutValues[NumberOfG4CutIndex]; 1060 for (std::size_t i=0; i< NumberOfG4CutInd << 813 for (size_t i=0; i< NumberOfG4CutIndex; i++) { 1061 { << 814 if (ascii) { 1062 if (ascii) << 1063 { << 1064 fIn >> cutValues[i]; 815 fIn >> cutValues[i]; 1065 cutValues[i] *= (mm); 816 cutValues[i] *= (mm); 1066 } << 817 } else { 1067 else << 818 fIn.read( (char*)(&(cutValues[i])), sizeof (G4double)); 1068 { << 1069 fIn.read( (char*)(&(cutValues[i])), s << 1070 } 819 } 1071 } 820 } 1072 821 1073 // Loop over all couples 822 // Loop over all couples >> 823 CoupleTableIterator cItr; 1074 G4bool fOK = false; 824 G4bool fOK = false; 1075 G4MaterialCutsCouple* aCouple = nullptr; << 825 G4MaterialCutsCouple* aCouple =0; 1076 for (auto cItr=coupleTable.cbegin(); cItr << 826 for (cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++){ 1077 { << 1078 aCouple = (*cItr); 827 aCouple = (*cItr); 1079 // check material name 828 // check material name 1080 if ( mat_name != aCouple->GetMaterial( 829 if ( mat_name != aCouple->GetMaterial()->GetName() ) continue; 1081 // check cut values 830 // check cut values 1082 G4ProductionCuts* aCut = aCouple->GetPr 831 G4ProductionCuts* aCut = aCouple->GetProductionCuts(); 1083 G4bool fRatio = true; 832 G4bool fRatio = true; 1084 for (std::size_t j=0; j< NumberOfG4CutI << 833 for (size_t j=0; j< NumberOfG4CutIndex; j++) { 1085 { << 834 G4double ratio = cutValues[j]/aCut->GetProductionCut(j); 1086 // check ratio only if values are not << 835 fRatio = fRatio && (0.999<ratio) && (ratio<1.001) ; 1087 if (cutValues[j] != aCut->GetProducti << 836 } 1088 { << 1089 G4double ratio = cutValues[j]/aCut << 1090 fRatio = fRatio && (0.999<ratio) && << 1091 } << 1092 } << 1093 if (!fRatio) continue; 837 if (!fRatio) continue; 1094 // MCC matched 838 // MCC matched 1095 fOK = true; 839 fOK = true; 1096 mccConversionTable.SetNewIndex(index, a 840 mccConversionTable.SetNewIndex(index, aCouple->GetIndex()); 1097 break; 841 break; 1098 } 842 } 1099 843 1100 if (fOK) << 1101 { << 1102 #ifdef G4VERBOSE 844 #ifdef G4VERBOSE 1103 // debug information << 845 // debug information 1104 if (verboseLevel >1) << 846 if (verboseLevel >1) { 1105 { << 847 if (fOK) { 1106 G4String regionname(region_name); << 848 G4Region* fRegion = 0; 1107 G4Region* fRegion = nullptr; << 849 if ( region_name != "NONE" ) fRegion = fG4RegionStore->GetRegion(region_name); 1108 if ( regionname != "NONE" ) << 850 if ( (( region_name == "NONE" ) && (aCouple->IsUsed()) ) || 1109 { << 851 (( region_name != "NONE" ) && (fRegion==0) ) || 1110 fRegion = fG4RegionStore->GetRegion << 852 !IsCoupleUsedInTheRegion(aCouple, fRegion) ) { 1111 if (fRegion == nullptr) << 853 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1112 { << 854 G4cout << "A Couple is used differnt region in the current setup "; 1113 G4cout << "G4ProductionCutTable:: << 855 G4cout << index << ": in " << fileName << G4endl; 1114 G4cout << "Region " << regionname << 856 G4cout << " material: " << mat_name ; 1115 G4cout << index << ": in " << fil << 857 G4cout << " region: " << region_name << G4endl; 1116 } << 858 for (size_t ii=0; ii< NumberOfG4CutIndex; ii++) { 1117 } << 859 G4cout << "cut[" << ii << "]=" << cutValues[ii]/mm; 1118 if (((regionname == "NONE") && (aCou << 860 G4cout << " mm : "; 1119 || ((fRegion!=nullptr) && !IsCoupleU << 861 } 1120 { << 862 G4cout << G4endl; 1121 G4cout << "G4ProductionCutTable::Ch << 863 } else if ( index != aCouple->GetIndex() ) { 1122 << G4endl; << 864 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1123 G4cout << "A Couple is used differe << 865 G4cout << "Index of couples was modified "<< G4endl; 1124 G4cout << index << ": in " << fileN << 866 G4cout << aCouple->GetIndex() << ":" <<aCouple->GetMaterial()->GetName(); 1125 G4cout << " material: " << mat_name << 867 G4cout <<" is defined as " ; 1126 G4cout << " region: " << region_nam << 868 G4cout << index << ":" << mat_name << " in " << fileName << G4endl; 1127 for (std::size_t ii=0; ii< NumberOf << 869 } else { 1128 { << 870 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1129 G4cout << "cut[" << ii << "]=" << << 871 G4cout << index << ":" << mat_name << " in " << fileName ; 1130 G4cout << " mm : "; << 872 G4cout << " is consistent with current setup" << G4endl; 1131 } << 873 } 1132 G4cout << G4endl; << 874 } 1133 } << 875 } 1134 else if ( index != aCouple->GetIndex << 876 if ((!fOK) && (verboseLevel >0)) { 1135 { << 877 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1136 G4cout << "G4ProductionCutTable::Ch << 878 G4cout << "Couples is not defined in the current detector setup "; 1137 G4cout << "Index of couples was mod << 879 G4cout << index << ": in " << fileName << G4endl; 1138 G4cout << aCouple->GetIndex() << ": << 880 G4cout << " material: " << mat_name ; 1139 << aCouple->GetMaterial()->G << 881 G4cout << " region: " << region_name << G4endl; 1140 G4cout <<" is defined as " ; << 882 for (size_t ii=0; ii< NumberOfG4CutIndex; ii++) { 1141 G4cout << index << ":" << mat_name << 883 G4cout << "cut[" << ii << "]=" << cutValues[ii]/mm; 1142 } << 884 G4cout << " mm : "; 1143 else << 1144 { << 1145 G4cout << "G4ProductionCutTable::Ch << 1146 G4cout << index << ":" << mat_name << 1147 G4cout << " is consistent with curr << 1148 } << 1149 } 885 } 1150 #endif << 886 G4cout << G4endl; 1151 } 887 } 1152 else << 1153 { << 1154 #ifdef G4VERBOSE << 1155 if (verboseLevel >0) << 1156 { << 1157 G4cout << "G4ProductionCutTable::Chec << 1158 << G4endl; << 1159 G4cout << "Couples are not defined in << 1160 G4cout << index << ": in " << fileNam << 1161 G4cout << " material: " << mat_name ; << 1162 G4cout << " region: " << region_name << 1163 for (std::size_t ii=0; ii< NumberOfG4 << 1164 { << 1165 G4cout << "cut[" << ii << "]=" << c << 1166 G4cout << " mm : "; << 1167 } << 1168 G4cout << G4endl; << 1169 } << 1170 #endif 888 #endif 1171 } << 889 1172 } 890 } 1173 fIn.close(); 891 fIn.close(); 1174 return true; 892 return true; 1175 } 893 } 1176 894 1177 // ------------------------------------------ << 1178 G4bool G4ProductionCutsTable::StoreCutsInfo(c << 1179 G << 1180 { << 1181 // Store cut values information in files un << 1182 895 >> 896 // Store cut values information in files under the specified directory. >> 897 // >> 898 G4bool G4ProductionCutsTable::StoreCutsInfo(const G4String& directory, >> 899 G4bool ascii) >> 900 { 1183 const G4String fileName = directory + "/" + 901 const G4String fileName = directory + "/" + "cut.dat"; 1184 const G4String key = "CUT-V3.0"; << 902 const G4String key = "CUT-V2.0"; 1185 std::ofstream fOut; 903 std::ofstream fOut; 1186 char temp[FixedStringLengthForStore]; 904 char temp[FixedStringLengthForStore]; 1187 905 1188 // open output file << 906 // open output file // 1189 if (!ascii ) fOut.open(fileName,std::ios::o << 907 if (!ascii ) 1190 else fOut.open(fileName,std::ios::o << 908 fOut.open(fileName,std::ios::out|std::ios::binary); 1191 << 909 else >> 910 fOut.open(fileName,std::ios::out); >> 911 >> 912 1192 // check if the file has been opened succes 913 // check if the file has been opened successfully 1193 if (!fOut) << 914 if (!fOut) { 1194 { << 915 if(verboseLevel>0) { 1195 if(verboseLevel>0) << 916 G4cerr << "G4ProductionCutsTable::StoreCutsInfo "; 1196 { << 917 G4cerr << " Can not open file " << fileName << G4endl; 1197 G4cerr << "G4ProductionCutsTable::Store << 1198 G4cerr << "Cannot open file: " << fileN << 1199 } 918 } 1200 G4Exception( "G4ProductionCutsTable::Stor << 1201 "ProcCuts102", JustWarning, << 1202 return false; 919 return false; 1203 } 920 } 1204 921 1205 G4int numberOfCouples = (G4int)coupleTable. << 922 G4int numberOfCouples = coupleTable.size(); 1206 if (ascii) << 923 if (ascii) { 1207 { << 1208 /////////////// ASCII mode ///////////// 924 /////////////// ASCII mode ///////////////// 1209 // key word 925 // key word 1210 fOut << key << G4endl; << 926 fOut << key << G4endl; 1211 927 1212 // number of couples in the table 928 // number of couples in the table 1213 fOut << numberOfCouples << G4endl; << 929 fOut << numberOfCouples << G4endl; 1214 } << 930 } else { 1215 else << 1216 { << 1217 /////////////// Binary mode //////////// 931 /////////////// Binary mode ///////////////// 1218 // key word 932 // key word 1219 std::size_t i; << 933 size_t i; 1220 for (i=0; i<FixedStringLengthForStore; ++ << 934 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 1221 temp[i] = '\0'; << 1222 for (i=0; i<key.length() && i<FixedString 935 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i) 1223 temp[i]=key[(G4int)i]; << 936 temp[i]=key[i]; 1224 fOut.write(temp, FixedStringLengthForStor 937 fOut.write(temp, FixedStringLengthForStore); 1225 938 1226 // number of couples in the table 939 // number of couples in the table 1227 fOut.write( (char*)(&numberOfCouples), si << 940 fOut.write( (char*)(&numberOfCouples), sizeof (G4int)); 1228 } 941 } 1229 942 1230 for (std::size_t idx=0; idx <NumberOfG4CutI << 943 1231 { << 944 for (size_t idx=0; idx <NumberOfG4CutIndex; idx++) { 1232 const std::vector<G4double>* fRange = Ge 945 const std::vector<G4double>* fRange = GetRangeCutsVector(idx); 1233 const std::vector<G4double>* fEnergy = Ge 946 const std::vector<G4double>* fEnergy = GetEnergyCutsVector(idx); 1234 std::size_t i=0; << 947 size_t i=0; 1235 // Loop over all couples 948 // Loop over all couples 1236 for (auto cItr=coupleTable.cbegin();cItr! << 949 CoupleTableIterator cItr; 1237 { << 950 for (cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++, i++){ 1238 if (ascii) << 951 if (ascii) { 1239 { << 1240 /////////////// ASCII mode ///////// 952 /////////////// ASCII mode ///////////////// 1241 fOut.setf(std::ios::scientific); 953 fOut.setf(std::ios::scientific); 1242 fOut << std::setw(20) << (*fRange)[i] 954 fOut << std::setw(20) << (*fRange)[i]/mm ; 1243 fOut << std::setw(20) << (*fEnergy)[i 955 fOut << std::setw(20) << (*fEnergy)[i]/keV << G4endl; 1244 fOut.unsetf(std::ios::scientific); 956 fOut.unsetf(std::ios::scientific); 1245 } << 957 } else { 1246 else << 1247 { << 1248 /////////////// Binary mode //////// 958 /////////////// Binary mode ///////////////// 1249 G4double cut = (*fRange)[i]; 959 G4double cut = (*fRange)[i]; 1250 fOut.write((char*)(&cut), sizeof(G4do << 960 fOut.write((char*)(&cut), sizeof (G4double)); 1251 cut = (*fEnergy)[i]; 961 cut = (*fEnergy)[i]; 1252 fOut.write((char*)(&cut), sizeof(G4do << 962 fOut.write((char*)(&cut), sizeof (G4double)); 1253 } 963 } 1254 } 964 } 1255 } 965 } 1256 fOut.close(); 966 fOut.close(); 1257 return true; 967 return true; 1258 } 968 } 1259 969 1260 // ------------------------------------------ << 970 // Retrieve cut values information in files under the specified directory. 1261 G4bool G4ProductionCutsTable::RetrieveCutsInf << 971 // 1262 << 972 G4bool G4ProductionCutsTable::RetrieveCutsInfo(const G4String& directory, >> 973 G4bool ascii) 1263 { 974 { 1264 // Retrieve cut values information in files << 1265 << 1266 const G4String fileName = directory + "/" + 975 const G4String fileName = directory + "/" + "cut.dat"; 1267 const G4String key = "CUT-V3.0"; << 976 const G4String key = "CUT-V2.0"; 1268 std::ifstream fIn; 977 std::ifstream fIn; 1269 978 1270 // open input file << 979 // open input file // 1271 if (!ascii ) fIn.open(fileName,std::ios::in << 980 if (!ascii ) 1272 else fIn.open(fileName,std::ios::in << 981 fIn.open(fileName,std::ios::in|std::ios::binary); >> 982 else >> 983 fIn.open(fileName,std::ios::in); 1273 984 1274 // check if the file has been opened succes 985 // check if the file has been opened successfully 1275 if (!fIn) << 986 if (!fIn) { 1276 { << 987 if (verboseLevel >0) { 1277 if (verboseLevel >0) << 988 G4cerr << "G4ProductionCutTable::RetrieveCutsInfo "; 1278 { << 989 G4cerr << " Can not open file " << fileName << G4endl; 1279 G4cerr << "G4ProductionCutTable::Retrie << 1280 G4cerr << "Cannot open file: " << fileN << 1281 } 990 } 1282 G4Exception( "G4ProductionCutsTable::Retr << 1283 "ProcCuts102", JustWarning, << 1284 return false; 991 return false; 1285 } 992 } 1286 993 1287 char temp[FixedStringLengthForStore]; 994 char temp[FixedStringLengthForStore]; 1288 995 1289 // key word 996 // key word 1290 G4String keyword; 997 G4String keyword; 1291 if (ascii) << 998 if (ascii) { 1292 { << 1293 fIn >> keyword; 999 fIn >> keyword; 1294 } << 1000 } else { 1295 else << 1296 { << 1297 fIn.read(temp, FixedStringLengthForStore) 1001 fIn.read(temp, FixedStringLengthForStore); 1298 keyword = (const char*)(temp); 1002 keyword = (const char*)(temp); 1299 } 1003 } 1300 if (key!=keyword) << 1004 if (key!=keyword) { 1301 { << 1005 if (verboseLevel >0) { 1302 if (verboseLevel >0) << 1006 G4cout << "G4ProductionCutTable::RetrieveCutsInfo "; 1303 { << 1007 G4cout << " Key word in " << fileName << "= " << keyword ; 1304 G4cerr << "G4ProductionCutTable::Retrie << 1008 G4cout <<"( should be "<< key << ")" <<G4endl; 1305 G4cerr << "Key word in " << fileName << << 1306 G4cerr <<"( should be "<< key << ")" << 1307 } 1009 } 1308 G4Exception( "G4ProductionCutsTable::Retr << 1309 "ProcCuts103", JustWarning, << 1310 return false; 1010 return false; 1311 } 1011 } 1312 1012 1313 // numberOfCouples 1013 // numberOfCouples 1314 G4int numberOfCouples; 1014 G4int numberOfCouples; 1315 if (ascii) << 1015 if (ascii) { 1316 { << 1317 fIn >> numberOfCouples; 1016 fIn >> numberOfCouples; 1318 if (fIn.fail()) << 1017 } else { 1319 { << 1018 fIn.read( (char*)(&numberOfCouples), sizeof (G4int)); 1320 G4Exception( "G4ProductionCutsTable::Re << 1321 "ProcCuts103", JustWarning << 1322 return false; << 1323 } << 1324 } << 1325 else << 1326 { << 1327 fIn.read( (char*)(&numberOfCouples), size << 1328 } 1019 } 1329 1020 1330 if (numberOfCouples > static_cast<G4int>(mc << 1021 for (size_t idx=0; G4int(idx) <NumberOfG4CutIndex; idx++) { 1331 { << 1022 G4CutVectorForAParticle* fRange = rangeCutTable[idx]; 1332 G4Exception( "G4ProductionCutsTable::Retr << 1023 G4CutVectorForAParticle* fEnergy = energyCutTable[idx]; 1333 "ProcCuts109", JustWarning, << 1334 "Number of Couples in the fi << 1335 } << 1336 numberOfCouples = (G4int)mccConversionTable << 1337 << 1338 for (std::size_t idx=0; static_cast<G4int>( << 1339 { << 1340 std::vector<G4double>* fRange = rangeCut << 1341 std::vector<G4double>* fEnergy = energyCu << 1342 fRange->clear(); 1024 fRange->clear(); 1343 fEnergy->clear(); 1025 fEnergy->clear(); 1344 1026 1345 // Loop over all couples 1027 // Loop over all couples 1346 for (std::size_t i=0; static_cast<G4int>( << 1028 for (size_t i=0; G4int(i)< numberOfCouples; i++){ 1347 { << 1348 G4double rcut, ecut; 1029 G4double rcut, ecut; 1349 if (ascii) << 1030 if (ascii) { 1350 { << 1351 fIn >> rcut >> ecut; 1031 fIn >> rcut >> ecut; 1352 if (fIn.fail()) << 1353 { << 1354 G4Exception( "G4ProductionCutsTable << 1355 "ProcCuts103", JustWar << 1356 return false; << 1357 } << 1358 rcut *= mm; 1032 rcut *= mm; 1359 ecut *= keV; 1033 ecut *= keV; >> 1034 } else { >> 1035 fIn.read((char*)(&rcut), sizeof (G4double)); >> 1036 fIn.read((char*)(&ecut), sizeof (G4double)); 1360 } 1037 } 1361 else << 1038 if (!mccConversionTable.IsUsed(i)) continue; 1362 { << 1039 size_t new_index = mccConversionTable.GetIndex(i); 1363 fIn.read((char*)(&rcut), sizeof(G4dou << 1364 fIn.read((char*)(&ecut), sizeof(G4dou << 1365 } << 1366 if (!mccConversionTable.IsUsed(i)) cont << 1367 std::size_t new_index = mccConversionTa << 1368 (*fRange)[new_index] = rcut; 1040 (*fRange)[new_index] = rcut; 1369 (*fEnergy)[new_index] = ecut; 1041 (*fEnergy)[new_index] = ecut; 1370 } 1042 } 1371 } 1043 } 1372 return true; 1044 return true; 1373 } << 1374 << 1375 // ------------------------------------------ << 1376 void G4ProductionCutsTable::SetVerboseLevel(G << 1377 { << 1378 // Set same verbosity to all registered Ran << 1379 << 1380 verboseLevel = value; << 1381 for (G4int ip=0; ip< NumberOfG4CutIndex; ++ << 1382 { << 1383 if (converters[ip] != nullptr ) << 1384 { << 1385 converters[ip]->SetVerboseLevel(value); << 1386 } << 1387 } << 1388 } << 1389 << 1390 // ------------------------------------------ << 1391 G4double G4ProductionCutsTable::GetMaxEnergyC << 1392 { << 1393 return G4VRangeToEnergyConverter::GetMaxEne << 1394 } << 1395 << 1396 // ------------------------------------------ << 1397 void G4ProductionCutsTable::SetMaxEnergyCut(G << 1398 { << 1399 G4VRangeToEnergyConverter::SetMaxEnergyCut( << 1400 } 1045 } 1401 1046