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.17 2007/05/30 08:22:20 kurasige Exp $ 29 // Modifications: H.Kurashige, 2004-2008 << 28 // GEANT4 tag $Name: geant4-09-00 $ 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 // ------------------------------------------- << 245 331 G4double G4ProductionCutsTable::ConvertRangeTo 246 G4double G4ProductionCutsTable::ConvertRangeToEnergy( 332 const G4Part << 247 const G4ParticleDefinition* particle, 333 const G4Mate << 248 const G4Material* material, 334 G4double << 249 G4double range >> 250 ) 335 { 251 { 336 // This method gives energy corresponding to 252 // This method gives energy corresponding to range value 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 253 // check material 354 if (material == nullptr) return -1.0; << 254 if (material ==0) return -1.0; 355 255 356 // check range 256 // check range 357 if (range == 0.0) return 0.0; << 257 if (range <=0.0) return -1.0; 358 if (range <0.0) return -1.0; << 359 258 360 // check particle 259 // check particle 361 G4int index = G4ProductionCuts::GetIndex(par << 260 G4int index = -1; 362 << 261 if (particle->GetParticleName() == "gamma") index = 0; 363 if (index<0 || converters[index] == nullptr) << 262 if (particle->GetParticleName() == "e-") index = 1; 364 { << 263 if (particle->GetParticleName() == "e+") index = 2; 365 #ifdef G4VERBOSE << 264 if (index<0) { 366 if(verboseLevel>0) << 265 #ifdef G4VERBOSE 367 { << 266 if (verboseLevel >1) { 368 G4ExceptionDescription ed; << 267 G4cout << "G4ProductionCutsTable::ConvertRangeToEnergy" ; 369 ed << "Invoked "; << 268 G4cout << particle->GetParticleName() << " has no cut value " << G4endl; 370 if(particle != nullptr) << 269 } 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 270 #endif 378 return -1.0; 271 return -1.0; 379 } 272 } 380 273 381 return converters[index]->Convert(range, mat 274 return converters[index]->Convert(range, material); >> 275 382 } 276 } 383 277 384 // ------------------------------------------- << 385 void G4ProductionCutsTable::ResetConverters() << 386 {} << 387 278 388 // ------------------------------------------- << 279 389 void G4ProductionCutsTable::SetEnergyRange(G4d 280 void G4ProductionCutsTable::SetEnergyRange(G4double lowedge, G4double highedge) 390 { 281 { 391 G4VRangeToEnergyConverter::SetEnergyRange(lo 282 G4VRangeToEnergyConverter::SetEnergyRange(lowedge,highedge); 392 } 283 } 393 284 394 // ------------------------------------------- << 395 G4double G4ProductionCutsTable::GetLowEdgeEne 285 G4double G4ProductionCutsTable::GetLowEdgeEnergy() const 396 { 286 { 397 return G4VRangeToEnergyConverter::GetLowEdge 287 return G4VRangeToEnergyConverter::GetLowEdgeEnergy(); 398 } 288 } 399 289 400 // ------------------------------------------- << 401 G4double G4ProductionCutsTable::GetHighEdgeEne 290 G4double G4ProductionCutsTable::GetHighEdgeEnergy() const 402 { 291 { 403 return G4VRangeToEnergyConverter::GetHighEdg 292 return G4VRangeToEnergyConverter::GetHighEdgeEnergy(); 404 } 293 } 405 294 406 // ------------------------------------------- << 295 407 void G4ProductionCutsTable::ScanAndSetCouple(G 296 void G4ProductionCutsTable::ScanAndSetCouple(G4LogicalVolume* aLV, 408 G 297 G4MaterialCutsCouple* aCouple, 409 G 298 G4Region* aRegion) 410 { 299 { 411 // Check whether or not this logical volume << 300 //Check whether or not this logical volume belongs to the same region 412 if((aRegion!=nullptr) && aLV->GetRegion()!=a << 301 if((aRegion!=0) && aLV->GetRegion()!=aRegion) return; 413 302 414 // Check if this particular volume has a mat << 303 //Check if this particular volume has a material matched to the couple 415 if(aLV->GetMaterial()==aCouple->GetMaterial( << 304 if(aLV->GetMaterial()==aCouple->GetMaterial()) { 416 { << 417 aLV->SetMaterialCutsCouple(aCouple); 305 aLV->SetMaterialCutsCouple(aCouple); 418 } 306 } 419 307 420 std::size_t noDaughters = aLV->GetNoDaughter << 308 size_t noDaughters = aLV->GetNoDaughters(); 421 if(noDaughters==0) return; 309 if(noDaughters==0) return; 422 310 423 // Loop over daughters with same region << 311 //Loop over daughters with same region 424 for(std::size_t i=0; i<noDaughters; ++i) << 312 for(size_t i=0;i<noDaughters;i++){ 425 { << 426 G4LogicalVolume* daughterLVol = aLV->GetDa 313 G4LogicalVolume* daughterLVol = aLV->GetDaughter(i)->GetLogicalVolume(); 427 ScanAndSetCouple(daughterLVol,aCouple,aReg 314 ScanAndSetCouple(daughterLVol,aCouple,aRegion); 428 } 315 } 429 } 316 } 430 317 431 // ------------------------------------------- << 432 void G4ProductionCutsTable::DumpCouples() cons 318 void G4ProductionCutsTable::DumpCouples() const 433 { 319 { 434 G4cout << G4endl; 320 G4cout << G4endl; 435 G4cout << "========= Table of registered cou << 321 G4cout << "========= Table of registered couples ==============================" 436 << G4endl; 322 << G4endl; 437 for(auto cItr=coupleTable.cbegin(); cItr!=co << 323 for(CoupleTableIterator cItr=coupleTable.begin(); 438 { << 324 cItr!=coupleTable.end();cItr++) { 439 G4MaterialCutsCouple* aCouple = (*cItr); 325 G4MaterialCutsCouple* aCouple = (*cItr); 440 G4ProductionCuts* aCut = aCouple->GetProdu 326 G4ProductionCuts* aCut = aCouple->GetProductionCuts(); 441 G4cout << G4endl; 327 G4cout << G4endl; 442 G4cout << "Index : " << aCouple->GetIndex( 328 G4cout << "Index : " << aCouple->GetIndex() 443 << " used in the geometry : "; 329 << " used in the geometry : "; 444 if(aCouple->IsUsed()) G4cout << "Yes"; 330 if(aCouple->IsUsed()) G4cout << "Yes"; 445 else G4cout << "No "; 331 else G4cout << "No "; 446 //// G4cout << " recalculation needed : << 332 G4cout << " recalculation needed : "; 447 //// if(aCouple->IsRecalcNeeded()) G4cout < << 333 if(aCouple->IsRecalcNeeded()) G4cout << "Yes"; 448 //// else G4cout < << 334 else G4cout << "No "; 449 G4cout << G4endl; 335 G4cout << G4endl; 450 G4cout << " Material : " << aCouple->GetMa 336 G4cout << " Material : " << aCouple->GetMaterial()->GetName() << G4endl; 451 G4cout << " Range cuts : " 337 G4cout << " Range cuts : " 452 << " gamma " << G4BestUnit(aCut->G << 338 << " gamma " << G4BestUnit(aCut->GetProductionCut("gamma"),"Length") 453 << " e- " << G4BestUnit(aCut->G << 339 << " e- " << G4BestUnit(aCut->GetProductionCut("e-"),"Length") 454 << " e+ " << G4BestUnit(aCut->G << 340 << " e+ " << G4BestUnit(aCut->GetProductionCut("e+"),"Length") 455 << " proton " << G4BestUnit(aCut->G << 456 << G4endl; 341 << G4endl; 457 G4cout << " Energy thresholds : " ; 342 G4cout << " Energy thresholds : " ; 458 //// if(aCouple->IsRecalcNeeded()) { << 343 if(aCouple->IsRecalcNeeded()) { 459 //// G4cout << " is not ready to print"; << 344 G4cout << " is not ready to print"; 460 //// } else { << 345 } else { 461 G4cout << " gamma " << G4BestUnit((*(ener << 346 G4cout << " gamma " << G4BestUnit((*(energyCutTable[0]))[aCouple->GetIndex()],"Energy") 462 << " e- " << G4BestUnit((*(ener << 347 << " e- " << G4BestUnit((*(energyCutTable[1]))[aCouple->GetIndex()],"Energy") 463 << " e+ " << G4BestUnit((*(ener << 348 << " e+ " << G4BestUnit((*(energyCutTable[2]))[aCouple->GetIndex()],"Energy"); 464 << " proton " << G4BestUnit((*(ener << 349 } 465 //// } << 466 G4cout << G4endl; 350 G4cout << G4endl; 467 351 468 if(aCouple->IsUsed()) << 352 if(aCouple->IsUsed()) { 469 { << 470 G4cout << " Region(s) which use this cou 353 G4cout << " Region(s) which use this couple : " << G4endl; 471 for(auto rItr=fG4RegionStore->cbegin(); << 354 typedef std::vector<G4Region*>::iterator regionIterator; 472 rItr!=fG4RegionStore->cend(); + << 355 for(regionIterator rItr=fG4RegionStore->begin(); 473 { << 356 rItr!=fG4RegionStore->end();rItr++) { 474 if (IsCoupleUsedInTheRegion(aCouple, * << 357 if (IsCoupleUsedInTheRegion(aCouple, *rItr) ){ 475 { << 476 G4cout << " " << (*rItr)->GetName 358 G4cout << " " << (*rItr)->GetName() << G4endl; 477 } 359 } 478 } 360 } 479 } 361 } 480 } 362 } 481 G4cout << G4endl; 363 G4cout << G4endl; 482 G4cout << "================================= << 364 G4cout << "====================================================================" << G4endl; 483 G4cout << G4endl; 365 G4cout << G4endl; 484 } 366 } 485 367 486 // ------------------------------------------- << 368 >> 369 // Store cuts and material information in files under the specified directory. 487 G4bool G4ProductionCutsTable::StoreCutsTable( 370 G4bool G4ProductionCutsTable::StoreCutsTable(const G4String& dir, 488 << 371 G4bool ascii) 489 { 372 { 490 // Store cuts and material information in fi << 491 << 492 if (!StoreMaterialInfo(dir, ascii)) return f 373 if (!StoreMaterialInfo(dir, ascii)) return false; 493 if (!StoreMaterialCutsCoupleInfo(dir, ascii) 374 if (!StoreMaterialCutsCoupleInfo(dir, ascii)) return false; 494 if (!StoreCutsInfo(dir, ascii)) return false 375 if (!StoreCutsInfo(dir, ascii)) return false; 495 376 496 #ifdef G4VERBOSE 377 #ifdef G4VERBOSE 497 if (verboseLevel >2) << 378 if (verboseLevel >1) { 498 { << 379 G4cout << "G4ProductionCutsTable::StoreCutsTable " ; 499 G4cout << "G4ProductionCutsTable::StoreCut << 380 G4cout << " Material/Cuts information have been succesfully stored "; 500 G4cout << " Material/Cuts information have << 381 if (ascii) { 501 if (ascii) << 502 { << 503 G4cout << " in Ascii mode "; 382 G4cout << " in Ascii mode "; 504 } << 383 }else{ 505 else << 506 { << 507 G4cout << " in Binary mode "; 384 G4cout << " in Binary mode "; 508 } 385 } 509 G4cout << " under " << dir << G4endl; 386 G4cout << " under " << dir << G4endl; 510 } 387 } 511 #endif 388 #endif 512 return true; 389 return true; 513 } 390 } 514 391 515 // ------------------------------------------- << 516 G4bool G4ProductionCutsTable::RetrieveCutsTab 392 G4bool G4ProductionCutsTable::RetrieveCutsTable(const G4String& dir, 517 << 393 G4bool ascii) 518 { 394 { 519 if (!CheckForRetrieveCutsTable(dir, ascii)) 395 if (!CheckForRetrieveCutsTable(dir, ascii)) return false; 520 if (!RetrieveCutsInfo(dir, ascii)) return fa 396 if (!RetrieveCutsInfo(dir, ascii)) return false; 521 #ifdef G4VERBOSE 397 #ifdef G4VERBOSE 522 if (verboseLevel >2) << 398 if (verboseLevel >1) { 523 { << 399 G4cout << "G4ProductionCutsTable::RetrieveCutsTable " ; 524 G4cout << "G4ProductionCutsTable::Retrieve << 400 G4cout << " Material/Cuts information have been succesfully retreived "; 525 G4cout << " Material/Cuts information have << 401 if (ascii) { 526 if (ascii) << 527 { << 528 G4cout << " in Ascii mode "; 402 G4cout << " in Ascii mode "; 529 } << 403 }else{ 530 else << 531 { << 532 G4cout << " in Binary mode "; 404 G4cout << " in Binary mode "; 533 } 405 } 534 G4cout << " under " << dir << G4endl; 406 G4cout << " under " << dir << G4endl; 535 } 407 } 536 #endif 408 #endif 537 return true; 409 return true; 538 } 410 } 539 411 540 // ------------------------------------------- << 412 // check stored material and cut values are consistent >> 413 // with the current detector setup. >> 414 // 541 G4bool 415 G4bool 542 G4ProductionCutsTable::CheckForRetrieveCutsTab << 416 G4ProductionCutsTable::CheckForRetrieveCutsTable(const G4String& directory, 543 << 417 G4bool ascii) 544 { 418 { 545 // check stored material and cut values are << 419 G4cerr << "G4ProductionCutsTable::CheckForRetrieveCutsTable!!"<< G4endl; 546 // with the current detector setup << 547 << 548 G4cerr << "G4ProductionCutsTable::CheckForRe << 549 // isNeedForRestoreCoupleInfo = false; 420 // isNeedForRestoreCoupleInfo = false; 550 if (!CheckMaterialInfo(directory, ascii)) re 421 if (!CheckMaterialInfo(directory, ascii)) return false; 551 if (verboseLevel >2) << 422 if (verboseLevel >1) { 552 { << 423 G4cerr << "G4ProductionCutsTable::CheckMaterialInfo passed !!"<< G4endl; 553 G4cerr << "G4ProductionCutsTable::CheckM << 554 } 424 } 555 if (!CheckMaterialCutsCoupleInfo(directory, 425 if (!CheckMaterialCutsCoupleInfo(directory, ascii)) return false; 556 if (verboseLevel >2) << 426 if (verboseLevel >1) { 557 { << 427 G4cerr << "G4ProductionCutsTable::CheckMaterialCutsCoupleInfo passed !!"<< G4endl; 558 G4cerr << "G4ProductionCutsTable::CheckMat << 559 << G4endl; << 560 } 428 } 561 return true; 429 return true; 562 } 430 } 563 431 564 // ------------------------------------------- << 432 // Store material information in files under the specified directory. 565 G4bool G4ProductionCutsTable::StoreMaterialInf << 433 // 566 << 434 G4bool G4ProductionCutsTable::StoreMaterialInfo(const G4String& directory, >> 435 G4bool ascii) 567 { 436 { 568 // Store material information in files under << 569 << 570 const G4String fileName = directory + "/" + 437 const G4String fileName = directory + "/" + "material.dat"; 571 const G4String key = "MATERIAL-V3.0"; << 438 const G4String key = "MATERIAL-V2.0"; 572 std::ofstream fOut; 439 std::ofstream fOut; 573 440 574 // open output file << 441 // open output file // 575 if (!ascii ) fOut.open(fileName,std::ios::o << 442 if (!ascii ) 576 else fOut.open(fileName,std::ios::o << 443 fOut.open(fileName,std::ios::out|std::ios::binary); >> 444 else >> 445 fOut.open(fileName,std::ios::out); 577 446 >> 447 578 // check if the file has been opened success 448 // check if the file has been opened successfully 579 if (!fOut) << 449 if (!fOut) { 580 { << 581 #ifdef G4VERBOSE 450 #ifdef G4VERBOSE 582 if (verboseLevel>0) << 451 if (verboseLevel>0) { 583 { << 452 G4cerr << "G4ProductionCutsTable::StoreMaterialInfo "; 584 G4cerr << "G4ProductionCutsTable::StoreM << 453 G4cerr << " Can not open file " << fileName << G4endl; 585 G4cerr << "Cannot open file: " << fileNa << 586 } 454 } 587 #endif 455 #endif 588 G4Exception( "G4ProductionCutsTable::Store << 589 "ProcCuts102", JustWarning, " << 590 return false; 456 return false; 591 } 457 } 592 458 593 const G4MaterialTable* matTable = G4Material 459 const G4MaterialTable* matTable = G4Material::GetMaterialTable(); 594 // number of materials in the table 460 // number of materials in the table 595 G4int numberOfMaterial = (G4int)matTable->si << 461 G4int numberOfMaterial = matTable->size(); 596 462 597 if (ascii) << 463 if (ascii) { 598 { << 599 /////////////// ASCII mode ////////////// 464 /////////////// ASCII mode ///////////////// 600 // key word 465 // key word 601 fOut << key << G4endl; 466 fOut << key << G4endl; 602 467 603 // number of materials in the table 468 // number of materials in the table 604 fOut << numberOfMaterial << G4endl; 469 fOut << numberOfMaterial << G4endl; 605 470 606 fOut.setf(std::ios::scientific); 471 fOut.setf(std::ios::scientific); 607 472 608 // material name and density 473 // material name and density 609 for (std::size_t idx=0; static_cast<G4int> << 474 for (size_t idx=0; G4int(idx)<numberOfMaterial; ++idx){ 610 { << 611 fOut << std::setw(FixedStringLengthForSt 475 fOut << std::setw(FixedStringLengthForStore) 612 << ((*matTable)[idx])->GetName(); 476 << ((*matTable)[idx])->GetName(); 613 fOut << std::setw(FixedStringLengthForSt 477 fOut << std::setw(FixedStringLengthForStore) 614 << ((*matTable)[idx])->GetDensity() 478 << ((*matTable)[idx])->GetDensity()/(g/cm3) << G4endl; 615 } 479 } 616 480 617 fOut.unsetf(std::ios::scientific); 481 fOut.unsetf(std::ios::scientific); 618 482 619 } << 483 } else { 620 else << 621 { << 622 /////////////// Binary mode ///////////// 484 /////////////// Binary mode ///////////////// 623 char temp[FixedStringLengthForStore]; 485 char temp[FixedStringLengthForStore]; 624 std::size_t i; << 486 size_t i; 625 487 626 // key word 488 // key word 627 for (i=0; i<FixedStringLengthForStore; ++i << 489 for (i=0; i<FixedStringLengthForStore; ++i){ 628 { << 629 temp[i] = '\0'; 490 temp[i] = '\0'; 630 } 491 } 631 for (i=0; i<key.length() && i<FixedStringL << 492 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i){ 632 { << 493 temp[i]=key[i]; 633 temp[i]=key[(G4int)i]; << 634 } 494 } 635 fOut.write(temp, FixedStringLengthForStore 495 fOut.write(temp, FixedStringLengthForStore); 636 496 637 // number of materials in the table 497 // number of materials in the table 638 fOut.write( (char*)(&numberOfMaterial), si << 498 fOut.write( (char*)(&numberOfMaterial), sizeof (G4int)); 639 499 640 // material name and density 500 // material name and density 641 for (std::size_t imat=0; static_cast<G4int << 501 for (size_t imat=0; G4int(imat)<numberOfMaterial; ++imat){ 642 { << 643 G4String name = ((*matTable)[imat])->Ge 502 G4String name = ((*matTable)[imat])->GetName(); 644 G4double density = ((*matTable)[imat])-> 503 G4double density = ((*matTable)[imat])->GetDensity(); 645 for (i=0; i<FixedStringLengthForStore; + << 504 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 646 temp[i] = '\0'; << 647 for (i=0; i<name.length() && i<FixedStri 505 for (i=0; i<name.length() && i<FixedStringLengthForStore-1; ++i) 648 temp[i]=name[(G4int)i]; << 506 temp[i]=name[i]; 649 fOut.write(temp, FixedStringLengthForSto 507 fOut.write(temp, FixedStringLengthForStore); 650 fOut.write( (char*)(&density), sizeof(G4 << 508 fOut.write( (char*)(&density), sizeof (G4double)); 651 } 509 } 652 } << 510 } 653 511 654 fOut.close(); 512 fOut.close(); 655 return true; 513 return true; 656 } 514 } 657 515 658 // ------------------------------------------- << 516 // check stored material is consistent with the current detector setup. 659 G4bool G4ProductionCutsTable::CheckMaterialInf << 517 G4bool G4ProductionCutsTable::CheckMaterialInfo(const G4String& directory, 660 << 518 G4bool ascii) 661 { 519 { 662 // Check stored material is consistent with << 663 << 664 const G4String fileName = directory + "/" + 520 const G4String fileName = directory + "/" + "material.dat"; 665 const G4String key = "MATERIAL-V3.0"; << 521 const G4String key = "MATERIAL-V2.0"; 666 std::ifstream fIn; 522 std::ifstream fIn; 667 523 668 // open input file << 524 // open input file // 669 if (!ascii ) fIn.open(fileName,std::ios::in| << 525 if (!ascii ) 670 else fIn.open(fileName,std::ios::in) << 526 fIn.open(fileName,std::ios::in|std::ios::binary); >> 527 else >> 528 fIn.open(fileName,std::ios::in); 671 529 672 // check if the file has been opened success 530 // check if the file has been opened successfully 673 if (!fIn) << 531 if (!fIn) { 674 { << 675 #ifdef G4VERBOSE 532 #ifdef G4VERBOSE 676 if (verboseLevel >0) << 533 if (verboseLevel >0) { 677 { << 534 G4cerr << "G4ProductionCutsTable::CheckMaterialInfo "; 678 G4cerr << "G4ProductionCutsTable::CheckM << 535 G4cerr << " Can not open file " << fileName << G4endl; 679 G4cerr << "Cannot open file: " << fileNa << 680 } 536 } 681 #endif 537 #endif 682 G4Exception( "G4ProductionCutsTable::Check << 683 "ProcCuts102", JustWarning, " << 684 return false; 538 return false; 685 } 539 } 686 540 687 char temp[FixedStringLengthForStore]; 541 char temp[FixedStringLengthForStore]; 688 542 689 // key word 543 // key word 690 G4String keyword; 544 G4String keyword; 691 if (ascii) << 545 if (ascii) { 692 { << 693 fIn >> keyword; 546 fIn >> keyword; 694 } << 547 } else { 695 else << 696 { << 697 fIn.read(temp, FixedStringLengthForStore); 548 fIn.read(temp, FixedStringLengthForStore); 698 keyword = (const char*)(temp); 549 keyword = (const char*)(temp); 699 } 550 } 700 if (key!=keyword) << 551 if (key!=keyword) { 701 { << 702 #ifdef G4VERBOSE 552 #ifdef G4VERBOSE 703 if (verboseLevel >0) << 553 if (verboseLevel >0) { 704 { << 554 G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; 705 G4cerr << "G4ProductionCutsTable::CheckM << 555 G4cout << " Key word in " << fileName << "= " << keyword ; 706 G4cerr << "Key word in " << fileName << << 556 G4cout <<"( should be "<< key << ")" <<G4endl; 707 G4cerr <<"( should be "<< key << ")" < << 708 } 557 } 709 #endif 558 #endif 710 G4Exception( "G4ProductionCutsTable::Check << 711 "ProcCuts103", JustWarning, " << 712 return false; 559 return false; 713 } 560 } 714 561 715 // number of materials in the table 562 // number of materials in the table 716 G4int nmat; 563 G4int nmat; 717 if (ascii) << 564 if (ascii) { 718 { << 719 fIn >> nmat; 565 fIn >> nmat; 720 } << 566 } else { 721 else << 567 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 } 568 } 732 569 733 // list of material 570 // list of material 734 for (G4int idx=0; idx<nmat ; ++idx) << 571 for (G4int idx=0; idx<nmat ; ++idx){ 735 { << 736 // check eof 572 // check eof 737 if(fIn.eof()) << 573 if(fIn.eof()) { 738 { << 739 #ifdef G4VERBOSE 574 #ifdef G4VERBOSE 740 if (verboseLevel >0) << 575 if (verboseLevel >0) { 741 { << 576 G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; 742 G4cout << "G4ProductionCutsTable::Chec << 577 G4cout << " encountered End of File " ; 743 G4cout << "Encountered End of File " ; << 744 G4cout << " at " << idx+1 << "th mate 578 G4cout << " at " << idx+1 << "th material "<< G4endl; 745 } 579 } 746 #endif 580 #endif 747 fIn.close(); 581 fIn.close(); 748 return false; 582 return false; 749 } 583 } 750 584 751 // check material name and density 585 // check material name and density 752 char name[FixedStringLengthForStore]; 586 char name[FixedStringLengthForStore]; 753 G4double density; << 587 double density; 754 if (ascii) << 588 if (ascii) { 755 { << 756 fIn >> name >> density; 589 fIn >> name >> density; 757 density *= (g/cm3); 590 density *= (g/cm3); 758 591 759 } << 592 } else { 760 else << 761 { << 762 fIn.read(name, FixedStringLengthForStore 593 fIn.read(name, FixedStringLengthForStore); 763 fIn.read((char*)(&density), sizeof(G4dou << 594 fIn.read((char*)(&density), sizeof (G4double)); 764 } 595 } 765 if (fIn.fail()) << 596 if (fIn.fail()) { 766 { << 767 #ifdef G4VERBOSE 597 #ifdef G4VERBOSE 768 if (verboseLevel >0) << 598 if (verboseLevel >0) { 769 { << 599 G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; 770 G4cerr << "G4ProductionCutsTable::Chec << 600 G4cout << " Bad data format "; 771 G4cerr << "Bad data format "; << 601 G4cout << " at " << idx+1 << "th material "<< G4endl; 772 G4cerr << " at " << idx+1 << "th mate << 773 } 602 } 774 #endif 603 #endif 775 G4Exception( "G4ProductionCutsTable::Che << 776 "ProcCuts103", JustWarning, << 777 fIn.close(); 604 fIn.close(); 778 return false; 605 return false; 779 } 606 } 780 607 781 G4Material* aMaterial = G4Material::GetMat 608 G4Material* aMaterial = G4Material::GetMaterial(name); 782 if (aMaterial == nullptr ) continue; << 609 if (aMaterial ==0 ) continue; 783 610 784 G4double ratio = std::fabs(density/aMateri << 611 G4double ratio = std::abs(density/aMaterial->GetDensity() ); 785 if ((0.999>ratio) || (ratio>1.001) ) << 612 if ((0.999>ratio) || (ratio>1.001) ){ 786 { << 787 #ifdef G4VERBOSE 613 #ifdef G4VERBOSE 788 if (verboseLevel >0) << 614 if (verboseLevel >0) { 789 { << 615 G4cout << "G4ProductionCutsTable::CheckMaterialInfo "; 790 G4cerr << "G4ProductionCutsTable::Chec << 616 G4cout << " Inconsistent material density" << G4endl;; 791 G4cerr << "Inconsistent material densi << 617 G4cout << " at " << idx+1 << "th material "<< G4endl; 792 G4cerr << " at " << idx+1 << "th mate << 618 G4cout << "Name: " << name << G4endl; 793 G4cerr << "Name: " << name << G4endl << 619 G4cout << "Density:" << std::setiosflags(std::ios::scientific) << density / (g/cm3) ; 794 G4cerr << "Density:" << std::setiosfla << 620 G4cout << "(should be " << aMaterial->GetDensity()/(g/cm3)<< ")" << " [g/cm3]"<< G4endl; 795 << density / (g/cm3) ; << 621 G4cout << std::resetiosflags(std::ios::scientific); 796 G4cerr << "(should be " << aMaterial-> << 797 << " [g/cm3]"<< G4endl; << 798 G4cerr << std::resetiosflags(std::ios: << 799 } 622 } 800 #endif 623 #endif 801 G4Exception( "G4ProductionCutsTable::Che << 802 "ProcCuts104", JustWarning, << 803 fIn.close(); 624 fIn.close(); 804 return false; 625 return false; 805 } 626 } >> 627 806 } 628 } 807 629 808 fIn.close(); 630 fIn.close(); 809 return true; 631 return true; >> 632 810 } 633 } >> 634 811 635 812 // ------------------------------------------- << 636 // Store materialCutsCouple information in files under the specified directory. >> 637 // 813 G4bool 638 G4bool 814 G4ProductionCutsTable::StoreMaterialCutsCouple << 639 G4ProductionCutsTable::StoreMaterialCutsCoupleInfo(const G4String& directory, 815 << 640 G4bool ascii) 816 { 641 { 817 // Store materialCutsCouple information in f << 818 << 819 const G4String fileName = directory + "/" + 642 const G4String fileName = directory + "/" + "couple.dat"; 820 const G4String key = "COUPLE-V3.0"; << 643 const G4String key = "COUPLE-V2.0"; 821 std::ofstream fOut; 644 std::ofstream fOut; 822 char temp[FixedStringLengthForStore]; 645 char temp[FixedStringLengthForStore]; 823 646 824 // open output file << 647 // open output file // 825 if (!ascii ) fOut.open(fileName,std::ios::ou << 648 if (!ascii ) 826 else fOut.open(fileName,std::ios::ou << 649 fOut.open(fileName,std::ios::out|std::ios::binary); >> 650 else >> 651 fOut.open(fileName,std::ios::out); 827 652 828 653 829 // check if the file has been opened success 654 // check if the file has been opened successfully 830 if (!fOut) << 655 if (!fOut) { 831 { << 832 #ifdef G4VERBOSE 656 #ifdef G4VERBOSE 833 if (verboseLevel >0) << 657 if (verboseLevel >0) { 834 { << 658 G4cerr << "G4ProductionCutsTable::StoreMaterialCutsCoupleInfo "; 835 G4cerr << "G4ProductionCutsTable::StoreM << 659 G4cerr << " Can not open file " << fileName << G4endl; 836 G4cerr << "Cannot open file: " << fileNa << 837 } 660 } 838 #endif 661 #endif 839 G4Exception( "G4ProductionCutsTable::Store << 662 return false; 840 "ProcCuts102", << 841 JustWarning, "Cannot open fil << 842 return false; << 843 } 663 } 844 G4int numberOfCouples = (G4int)coupleTable.s << 664 G4int numberOfCouples = coupleTable.size(); 845 if (ascii) << 665 if (ascii) { 846 { << 847 /////////////// ASCII mode ////////////// 666 /////////////// ASCII mode ///////////////// 848 // key word 667 // key word 849 fOut << std::setw(FixedStringLengthForStor 668 fOut << std::setw(FixedStringLengthForStore) << key << G4endl; 850 669 851 // number of couples in the table 670 // number of couples in the table 852 fOut << numberOfCouples << G4endl; 671 fOut << numberOfCouples << G4endl; 853 } << 672 } else { 854 else << 855 { << 856 /////////////// Binary mode ///////////// 673 /////////////// Binary mode ///////////////// 857 // key word 674 // key word 858 std::size_t i; << 675 size_t i; 859 for (i=0; i<FixedStringLengthForStore; ++i << 676 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 860 temp[i] = '\0'; << 861 for (i=0; i<key.length() && i<FixedStringL 677 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i) 862 temp[i]=key[(G4int)i]; << 678 temp[i]=key[i]; 863 fOut.write(temp, FixedStringLengthForStore 679 fOut.write(temp, FixedStringLengthForStore); 864 680 865 // number of couples in the table 681 // number of couples in the table 866 fOut.write( (char*)(&numberOfCouples), siz << 682 fOut.write( (char*)(&numberOfCouples), sizeof (G4int)); 867 } 683 } 868 684 >> 685 869 // Loop over all couples 686 // Loop over all couples 870 for (auto cItr=coupleTable.cbegin(); cItr!=c << 687 CoupleTableIterator cItr; 871 { << 688 for (cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++){ 872 G4MaterialCutsCouple* aCouple = (*cItr); 689 G4MaterialCutsCouple* aCouple = (*cItr); 873 G4int index = aCouple->GetIndex(); 690 G4int index = aCouple->GetIndex(); 874 // cut value 691 // cut value 875 G4ProductionCuts* aCut = aCouple->GetProdu 692 G4ProductionCuts* aCut = aCouple->GetProductionCuts(); 876 G4double cutValues[NumberOfG4CutIndex]; 693 G4double cutValues[NumberOfG4CutIndex]; 877 for (std::size_t idx=0; idx <NumberOfG4Cut << 694 for (size_t idx=0; idx <NumberOfG4CutIndex; idx++) { 878 { << 695 cutValues[idx] = aCut->GetProductionCut(idx); 879 cutValues[idx] = aCut->GetProductionCut( << 880 } 696 } 881 // material/region info 697 // material/region info 882 G4String materialName = aCouple->GetMateri 698 G4String materialName = aCouple->GetMaterial()->GetName(); 883 G4String regionName = "NONE"; 699 G4String regionName = "NONE"; 884 if (aCouple->IsUsed()) << 700 if (aCouple->IsUsed()){ 885 { << 701 typedef std::vector<G4Region*>::iterator regionIterator; 886 for(auto rItr=fG4RegionStore->cbegin(); << 702 for(regionIterator rItr=fG4RegionStore->begin(); 887 rItr!=fG4RegionStore->cend(); + << 703 rItr!=fG4RegionStore->end();rItr++){ 888 { << 704 if (IsCoupleUsedInTheRegion(aCouple, *rItr) ){ 889 if (IsCoupleUsedInTheRegion(aCouple, * << 890 { << 891 regionName = (*rItr)->GetName(); 705 regionName = (*rItr)->GetName(); 892 break; 706 break; 893 } 707 } 894 } 708 } 895 } 709 } 896 710 897 if (ascii) << 711 if (ascii) { 898 { << 899 /////////////// ASCII mode //////////// 712 /////////////// ASCII mode ///////////////// 900 // index number 713 // index number 901 fOut << index << G4endl; 714 fOut << index << G4endl; 902 715 903 // material name 716 // material name 904 fOut << std::setw(FixedStringLengthForSt 717 fOut << std::setw(FixedStringLengthForStore) << materialName<< G4endl; 905 718 906 // region name 719 // region name 907 fOut << std::setw(FixedStringLengthForSt 720 fOut << std::setw(FixedStringLengthForStore) << regionName<< G4endl; 908 721 909 fOut.setf(std::ios::scientific); 722 fOut.setf(std::ios::scientific); 910 // cut values 723 // cut values 911 for (std::size_t idx=0; idx< NumberOfG4C << 724 for (size_t idx=0; idx< NumberOfG4CutIndex; idx++) { 912 { << 913 fOut << std::setw(FixedStringLengthFor 725 fOut << std::setw(FixedStringLengthForStore) << cutValues[idx]/(mm) 914 << G4endl; 726 << G4endl; 915 } 727 } 916 fOut.unsetf(std::ios::scientific); 728 fOut.unsetf(std::ios::scientific); 917 729 918 } << 730 } else { 919 else << 920 { << 921 /////////////// Binary mode /////////// 731 /////////////// Binary mode ///////////////// 922 // index 732 // index 923 fOut.write( (char*)(&index), sizeof(G4in << 733 fOut.write( (char*)(&index), sizeof (G4int)); 924 734 925 // material name 735 // material name 926 std::size_t i; << 736 size_t i; 927 for (i=0; i<FixedStringLengthForStore; + << 737 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 928 temp[i] = '\0'; << 738 for (i=0; i<materialName.length() && i<FixedStringLengthForStore-1; ++i) { 929 for (i=0; i<materialName.length() && i<F << 739 temp[i]=materialName[i]; 930 temp[i]=materialName[(G4int)i]; << 740 } 931 fOut.write(temp, FixedStringLengthForSto 741 fOut.write(temp, FixedStringLengthForStore); 932 742 933 // region name 743 // region name 934 for (i=0; i<FixedStringLengthForStore; + << 744 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 935 temp[i] = '\0'; << 745 for (i=0; i<regionName.length() && i<FixedStringLengthForStore-1; ++i) { 936 for (i=0; i<regionName.length() && i<Fix << 746 temp[i]=regionName[i]; 937 temp[i]=regionName[(G4int)i]; << 747 } 938 fOut.write(temp, FixedStringLengthForSto 748 fOut.write(temp, FixedStringLengthForStore); 939 749 940 // cut values 750 // cut values 941 for (std::size_t idx=0; idx< NumberOfG4C << 751 for (size_t idx=0; idx< NumberOfG4CutIndex; idx++) { 942 { << 752 fOut.write( (char*)(&(cutValues[idx])), sizeof (G4double)); 943 fOut.write( (char*)(&(cutValues[idx]) << 944 } 753 } 945 } 754 } 946 } << 755 } >> 756 947 fOut.close(); 757 fOut.close(); 948 return true; 758 return true; 949 } 759 } 950 760 951 // ------------------------------------------- << 761 >> 762 // check stored materialCutsCouple is consistent >> 763 // with the current detector setup. >> 764 // 952 G4bool 765 G4bool 953 G4ProductionCutsTable::CheckMaterialCutsCouple 766 G4ProductionCutsTable::CheckMaterialCutsCoupleInfo(const G4String& directory, 954 << 767 G4bool ascii ) 955 { 768 { 956 // Check stored materialCutsCouple is consis << 957 // with the current detector setup. << 958 << 959 const G4String fileName = directory + "/" + 769 const G4String fileName = directory + "/" + "couple.dat"; 960 const G4String key = "COUPLE-V3.0"; << 770 const G4String key = "COUPLE-V2.0"; 961 std::ifstream fIn; 771 std::ifstream fIn; 962 772 963 // open input file << 773 // open input file // 964 if (!ascii ) fIn.open(fileName,std::ios::in| << 774 if (!ascii ) 965 else fIn.open(fileName,std::ios::in) << 775 fIn.open(fileName,std::ios::in|std::ios::binary); >> 776 else >> 777 fIn.open(fileName,std::ios::in); 966 778 967 // check if the file has been opened success 779 // check if the file has been opened successfully 968 if (!fIn) << 780 if (!fIn) { 969 { << 970 #ifdef G4VERBOSE 781 #ifdef G4VERBOSE 971 if (verboseLevel >0) << 782 if (verboseLevel >0) { 972 { << 783 G4cerr << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 973 G4cerr << "G4ProductionCutTable::CheckMa << 784 G4cerr << " Can not open file " << fileName << G4endl; 974 G4cerr << "Cannot open file!" << fileNam << 975 } 785 } 976 #endif 786 #endif 977 G4Exception( "G4ProductionCutsTable::Check << 978 "ProcCuts102", JustWarning, " << 979 return false; 787 return false; 980 } 788 } 981 789 982 char temp[FixedStringLengthForStore]; 790 char temp[FixedStringLengthForStore]; 983 791 984 // key word 792 // key word 985 G4String keyword; 793 G4String keyword; 986 if (ascii) << 794 if (ascii) { 987 { << 988 fIn >> keyword; 795 fIn >> keyword; 989 } << 796 } else { 990 else << 991 { << 992 fIn.read(temp, FixedStringLengthForStore); 797 fIn.read(temp, FixedStringLengthForStore); 993 keyword = (const char*)(temp); 798 keyword = (const char*)(temp); 994 } 799 } 995 if (key!=keyword) << 800 if (key!=keyword) { 996 { << 997 #ifdef G4VERBOSE 801 #ifdef G4VERBOSE 998 if (verboseLevel >0) << 802 if (verboseLevel >0) { 999 { << 803 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1000 G4cerr << "G4ProductionCutTable::CheckM << 804 G4cout << " Key word in " << fileName << "= " << keyword ; 1001 G4cerr << "Key word in " << fileName << << 805 G4cout <<"( should be "<< key << ")" <<G4endl; 1002 G4cerr <<"( should be "<< key << ")" << 1003 } 806 } 1004 #endif 807 #endif 1005 G4Exception( "G4ProductionCutsTable::Chec << 1006 "ProcCuts103", JustWarning, << 1007 fIn.close(); 808 fIn.close(); 1008 return false; 809 return false; 1009 } 810 } 1010 811 1011 // numberOfCouples 812 // numberOfCouples 1012 G4int numberOfCouples; 813 G4int numberOfCouples; 1013 if (ascii) << 814 if (ascii) { 1014 { << 1015 fIn >> numberOfCouples; 815 fIn >> numberOfCouples; 1016 } << 816 } else { 1017 else << 817 fIn.read( (char*)(&numberOfCouples), sizeof (G4int)); 1018 { << 1019 fIn.read( (char*)(&numberOfCouples), size << 1020 } 818 } 1021 819 1022 // Reset MCCIndexConversionTable 820 // Reset MCCIndexConversionTable 1023 mccConversionTable.Reset(numberOfCouples); 821 mccConversionTable.Reset(numberOfCouples); 1024 822 1025 // Read in couple information 823 // Read in couple information 1026 for (G4int idx=0; idx<numberOfCouples; ++id << 824 for (G4int idx=0; idx<numberOfCouples; idx+=1){ 1027 { << 1028 // read in index 825 // read in index 1029 G4int index; 826 G4int index; 1030 if (ascii) << 827 if (ascii) { 1031 { << 1032 fIn >> index; 828 fIn >> index; 1033 } << 829 } else { 1034 else << 830 fIn.read( (char*)(&index), sizeof (G4int)); 1035 { << 1036 fIn.read( (char*)(&index), sizeof(G4int << 1037 } 831 } 1038 // read in index material name 832 // read in index material name 1039 char mat_name[FixedStringLengthForStore]; 833 char mat_name[FixedStringLengthForStore]; 1040 if (ascii) << 834 if (ascii) { 1041 { << 1042 fIn >> mat_name; 835 fIn >> mat_name; 1043 } << 836 } else { 1044 else << 1045 { << 1046 fIn.read(mat_name, FixedStringLengthFor 837 fIn.read(mat_name, FixedStringLengthForStore); 1047 } 838 } 1048 // read in index and region name 839 // read in index and region name 1049 char region_name[FixedStringLengthForStor 840 char region_name[FixedStringLengthForStore]; 1050 if (ascii) << 841 if (ascii) { 1051 { << 1052 fIn >> region_name; 842 fIn >> region_name; 1053 } << 843 } else { 1054 else << 844 fIn.read(region_name, FixedStringLengthForStore); 1055 { << 1056 fIn.read(region_name, FixedStringLength << 1057 } 845 } 1058 // cut value 846 // cut value 1059 G4double cutValues[NumberOfG4CutIndex]; 847 G4double cutValues[NumberOfG4CutIndex]; 1060 for (std::size_t i=0; i< NumberOfG4CutInd << 848 for (size_t i=0; i< NumberOfG4CutIndex; i++) { 1061 { << 849 if (ascii) { 1062 if (ascii) << 1063 { << 1064 fIn >> cutValues[i]; 850 fIn >> cutValues[i]; 1065 cutValues[i] *= (mm); 851 cutValues[i] *= (mm); 1066 } << 852 } else { 1067 else << 853 fIn.read( (char*)(&(cutValues[i])), sizeof (G4double)); 1068 { << 1069 fIn.read( (char*)(&(cutValues[i])), s << 1070 } 854 } 1071 } 855 } 1072 856 1073 // Loop over all couples 857 // Loop over all couples >> 858 CoupleTableIterator cItr; 1074 G4bool fOK = false; 859 G4bool fOK = false; 1075 G4MaterialCutsCouple* aCouple = nullptr; << 860 G4MaterialCutsCouple* aCouple =0; 1076 for (auto cItr=coupleTable.cbegin(); cItr << 861 for (cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++){ 1077 { << 1078 aCouple = (*cItr); 862 aCouple = (*cItr); 1079 // check material name 863 // check material name 1080 if ( mat_name != aCouple->GetMaterial( 864 if ( mat_name != aCouple->GetMaterial()->GetName() ) continue; 1081 // check cut values 865 // check cut values 1082 G4ProductionCuts* aCut = aCouple->GetPr 866 G4ProductionCuts* aCut = aCouple->GetProductionCuts(); 1083 G4bool fRatio = true; 867 G4bool fRatio = true; 1084 for (std::size_t j=0; j< NumberOfG4CutI << 868 for (size_t j=0; j< NumberOfG4CutIndex; j++) { 1085 { << 869 G4double ratio = cutValues[j]/aCut->GetProductionCut(j); 1086 // check ratio only if values are not << 870 fRatio = fRatio && (0.999<ratio) && (ratio<1.001) ; 1087 if (cutValues[j] != aCut->GetProducti << 871 } 1088 { << 1089 G4double ratio = cutValues[j]/aCut << 1090 fRatio = fRatio && (0.999<ratio) && << 1091 } << 1092 } << 1093 if (!fRatio) continue; 872 if (!fRatio) continue; 1094 // MCC matched 873 // MCC matched 1095 fOK = true; 874 fOK = true; 1096 mccConversionTable.SetNewIndex(index, a 875 mccConversionTable.SetNewIndex(index, aCouple->GetIndex()); 1097 break; 876 break; 1098 } 877 } 1099 878 1100 if (fOK) << 1101 { << 1102 #ifdef G4VERBOSE 879 #ifdef G4VERBOSE 1103 // debug information << 880 // debug information 1104 if (verboseLevel >1) << 881 if (verboseLevel >1) { 1105 { << 882 if (fOK) { 1106 G4String regionname(region_name); << 883 G4String regionname(region_name); 1107 G4Region* fRegion = nullptr; << 884 G4Region* fRegion = 0; 1108 if ( regionname != "NONE" ) << 885 if ( regionname != "NONE" ) fRegion = fG4RegionStore->GetRegion(region_name); 1109 { << 886 if ( (( regionname == "NONE" ) && (aCouple->IsUsed()) ) || 1110 fRegion = fG4RegionStore->GetRegion << 887 (( regionname != "NONE" ) && (fRegion==0) ) || 1111 if (fRegion == nullptr) << 888 !IsCoupleUsedInTheRegion(aCouple, fRegion) ) { 1112 { << 889 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1113 G4cout << "G4ProductionCutTable:: << 890 G4cout << "A Couple is used differnt region in the current setup "; 1114 G4cout << "Region " << regionname << 891 G4cout << index << ": in " << fileName << G4endl; 1115 G4cout << index << ": in " << fil << 892 G4cout << " material: " << mat_name ; 1116 } << 893 G4cout << " region: " << region_name << G4endl; 1117 } << 894 for (size_t ii=0; ii< NumberOfG4CutIndex; ii++) { 1118 if (((regionname == "NONE") && (aCou << 895 G4cout << "cut[" << ii << "]=" << cutValues[ii]/mm; 1119 || ((fRegion!=nullptr) && !IsCoupleU << 896 G4cout << " mm : "; 1120 { << 897 } 1121 G4cout << "G4ProductionCutTable::Ch << 898 G4cout << G4endl; 1122 << G4endl; << 899 } else if ( index != aCouple->GetIndex() ) { 1123 G4cout << "A Couple is used differe << 900 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1124 G4cout << index << ": in " << fileN << 901 G4cout << "Index of couples was modified "<< G4endl; 1125 G4cout << " material: " << mat_name << 902 G4cout << aCouple->GetIndex() << ":" <<aCouple->GetMaterial()->GetName(); 1126 G4cout << " region: " << region_nam << 903 G4cout <<" is defined as " ; 1127 for (std::size_t ii=0; ii< NumberOf << 904 G4cout << index << ":" << mat_name << " in " << fileName << G4endl; 1128 { << 905 } else { 1129 G4cout << "cut[" << ii << "]=" << << 906 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1130 G4cout << " mm : "; << 907 G4cout << index << ":" << mat_name << " in " << fileName ; 1131 } << 908 G4cout << " is consistent with current setup" << G4endl; 1132 G4cout << G4endl; << 909 } 1133 } << 1134 else if ( index != aCouple->GetIndex << 1135 { << 1136 G4cout << "G4ProductionCutTable::Ch << 1137 G4cout << "Index of couples was mod << 1138 G4cout << aCouple->GetIndex() << ": << 1139 << aCouple->GetMaterial()->G << 1140 G4cout <<" is defined as " ; << 1141 G4cout << index << ":" << mat_name << 1142 } << 1143 else << 1144 { << 1145 G4cout << "G4ProductionCutTable::Ch << 1146 G4cout << index << ":" << mat_name << 1147 G4cout << " is consistent with curr << 1148 } << 1149 } 910 } 1150 #endif << 1151 } 911 } 1152 else << 912 if ((!fOK) && (verboseLevel >0)) { 1153 { << 913 G4cout << "G4ProductionCutTable::CheckMaterialCutsCoupleInfo "; 1154 #ifdef G4VERBOSE << 914 G4cout << "Couples is not defined in the current detector setup "; 1155 if (verboseLevel >0) << 915 G4cout << index << ": in " << fileName << G4endl; 1156 { << 916 G4cout << " material: " << mat_name ; 1157 G4cout << "G4ProductionCutTable::Chec << 917 G4cout << " region: " << region_name << G4endl; 1158 << G4endl; << 918 for (size_t ii=0; ii< NumberOfG4CutIndex; ii++) { 1159 G4cout << "Couples are not defined in << 919 G4cout << "cut[" << ii << "]=" << cutValues[ii]/mm; 1160 G4cout << index << ": in " << fileNam << 920 G4cout << " mm : "; 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 } 921 } 1170 #endif << 922 G4cout << G4endl; 1171 } 923 } >> 924 #endif >> 925 1172 } 926 } 1173 fIn.close(); 927 fIn.close(); 1174 return true; 928 return true; 1175 } 929 } 1176 930 1177 // ------------------------------------------ << 1178 G4bool G4ProductionCutsTable::StoreCutsInfo(c << 1179 G << 1180 { << 1181 // Store cut values information in files un << 1182 931 >> 932 // Store cut values information in files under the specified directory. >> 933 // >> 934 G4bool G4ProductionCutsTable::StoreCutsInfo(const G4String& directory, >> 935 G4bool ascii) >> 936 { 1183 const G4String fileName = directory + "/" + 937 const G4String fileName = directory + "/" + "cut.dat"; 1184 const G4String key = "CUT-V3.0"; << 938 const G4String key = "CUT-V2.0"; 1185 std::ofstream fOut; 939 std::ofstream fOut; 1186 char temp[FixedStringLengthForStore]; 940 char temp[FixedStringLengthForStore]; 1187 941 1188 // open output file << 942 // open output file // 1189 if (!ascii ) fOut.open(fileName,std::ios::o << 943 if (!ascii ) 1190 else fOut.open(fileName,std::ios::o << 944 fOut.open(fileName,std::ios::out|std::ios::binary); 1191 << 945 else >> 946 fOut.open(fileName,std::ios::out); >> 947 >> 948 1192 // check if the file has been opened succes 949 // check if the file has been opened successfully 1193 if (!fOut) << 950 if (!fOut) { 1194 { << 951 if(verboseLevel>0) { 1195 if(verboseLevel>0) << 952 G4cerr << "G4ProductionCutsTable::StoreCutsInfo "; 1196 { << 953 G4cerr << " Can not open file " << fileName << G4endl; 1197 G4cerr << "G4ProductionCutsTable::Store << 1198 G4cerr << "Cannot open file: " << fileN << 1199 } 954 } 1200 G4Exception( "G4ProductionCutsTable::Stor << 1201 "ProcCuts102", JustWarning, << 1202 return false; 955 return false; 1203 } 956 } 1204 957 1205 G4int numberOfCouples = (G4int)coupleTable. << 958 G4int numberOfCouples = coupleTable.size(); 1206 if (ascii) << 959 if (ascii) { 1207 { << 1208 /////////////// ASCII mode ///////////// 960 /////////////// ASCII mode ///////////////// 1209 // key word 961 // key word 1210 fOut << key << G4endl; << 962 fOut << key << G4endl; 1211 963 1212 // number of couples in the table 964 // number of couples in the table 1213 fOut << numberOfCouples << G4endl; << 965 fOut << numberOfCouples << G4endl; 1214 } << 966 } else { 1215 else << 1216 { << 1217 /////////////// Binary mode //////////// 967 /////////////// Binary mode ///////////////// 1218 // key word 968 // key word 1219 std::size_t i; << 969 size_t i; 1220 for (i=0; i<FixedStringLengthForStore; ++ << 970 for (i=0; i<FixedStringLengthForStore; ++i) temp[i] = '\0'; 1221 temp[i] = '\0'; << 1222 for (i=0; i<key.length() && i<FixedString 971 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i) 1223 temp[i]=key[(G4int)i]; << 972 temp[i]=key[i]; 1224 fOut.write(temp, FixedStringLengthForStor 973 fOut.write(temp, FixedStringLengthForStore); 1225 974 1226 // number of couples in the table 975 // number of couples in the table 1227 fOut.write( (char*)(&numberOfCouples), si << 976 fOut.write( (char*)(&numberOfCouples), sizeof (G4int)); 1228 } 977 } 1229 978 1230 for (std::size_t idx=0; idx <NumberOfG4CutI << 979 1231 { << 980 for (size_t idx=0; idx <NumberOfG4CutIndex; idx++) { 1232 const std::vector<G4double>* fRange = Ge 981 const std::vector<G4double>* fRange = GetRangeCutsVector(idx); 1233 const std::vector<G4double>* fEnergy = Ge 982 const std::vector<G4double>* fEnergy = GetEnergyCutsVector(idx); 1234 std::size_t i=0; << 983 size_t i=0; 1235 // Loop over all couples 984 // Loop over all couples 1236 for (auto cItr=coupleTable.cbegin();cItr! << 985 CoupleTableIterator cItr; 1237 { << 986 for (cItr=coupleTable.begin();cItr!=coupleTable.end();cItr++, i++){ 1238 if (ascii) << 987 if (ascii) { 1239 { << 1240 /////////////// ASCII mode ///////// 988 /////////////// ASCII mode ///////////////// 1241 fOut.setf(std::ios::scientific); 989 fOut.setf(std::ios::scientific); 1242 fOut << std::setw(20) << (*fRange)[i] 990 fOut << std::setw(20) << (*fRange)[i]/mm ; 1243 fOut << std::setw(20) << (*fEnergy)[i 991 fOut << std::setw(20) << (*fEnergy)[i]/keV << G4endl; 1244 fOut.unsetf(std::ios::scientific); 992 fOut.unsetf(std::ios::scientific); 1245 } << 993 } else { 1246 else << 1247 { << 1248 /////////////// Binary mode //////// 994 /////////////// Binary mode ///////////////// 1249 G4double cut = (*fRange)[i]; 995 G4double cut = (*fRange)[i]; 1250 fOut.write((char*)(&cut), sizeof(G4do << 996 fOut.write((char*)(&cut), sizeof (G4double)); 1251 cut = (*fEnergy)[i]; 997 cut = (*fEnergy)[i]; 1252 fOut.write((char*)(&cut), sizeof(G4do << 998 fOut.write((char*)(&cut), sizeof (G4double)); 1253 } 999 } 1254 } 1000 } 1255 } 1001 } 1256 fOut.close(); 1002 fOut.close(); 1257 return true; 1003 return true; 1258 } 1004 } 1259 1005 1260 // ------------------------------------------ << 1006 // Retrieve cut values information in files under the specified directory. 1261 G4bool G4ProductionCutsTable::RetrieveCutsInf << 1007 // 1262 << 1008 G4bool G4ProductionCutsTable::RetrieveCutsInfo(const G4String& directory, >> 1009 G4bool ascii) 1263 { 1010 { 1264 // Retrieve cut values information in files << 1265 << 1266 const G4String fileName = directory + "/" + 1011 const G4String fileName = directory + "/" + "cut.dat"; 1267 const G4String key = "CUT-V3.0"; << 1012 const G4String key = "CUT-V2.0"; 1268 std::ifstream fIn; 1013 std::ifstream fIn; 1269 1014 1270 // open input file << 1015 // open input file // 1271 if (!ascii ) fIn.open(fileName,std::ios::in << 1016 if (!ascii ) 1272 else fIn.open(fileName,std::ios::in << 1017 fIn.open(fileName,std::ios::in|std::ios::binary); >> 1018 else >> 1019 fIn.open(fileName,std::ios::in); 1273 1020 1274 // check if the file has been opened succes 1021 // check if the file has been opened successfully 1275 if (!fIn) << 1022 if (!fIn) { 1276 { << 1023 if (verboseLevel >0) { 1277 if (verboseLevel >0) << 1024 G4cerr << "G4ProductionCutTable::RetrieveCutsInfo "; 1278 { << 1025 G4cerr << " Can not open file " << fileName << G4endl; 1279 G4cerr << "G4ProductionCutTable::Retrie << 1280 G4cerr << "Cannot open file: " << fileN << 1281 } 1026 } 1282 G4Exception( "G4ProductionCutsTable::Retr << 1283 "ProcCuts102", JustWarning, << 1284 return false; 1027 return false; 1285 } 1028 } 1286 1029 1287 char temp[FixedStringLengthForStore]; 1030 char temp[FixedStringLengthForStore]; 1288 1031 1289 // key word 1032 // key word 1290 G4String keyword; 1033 G4String keyword; 1291 if (ascii) << 1034 if (ascii) { 1292 { << 1293 fIn >> keyword; 1035 fIn >> keyword; 1294 } << 1036 } else { 1295 else << 1296 { << 1297 fIn.read(temp, FixedStringLengthForStore) 1037 fIn.read(temp, FixedStringLengthForStore); 1298 keyword = (const char*)(temp); 1038 keyword = (const char*)(temp); 1299 } 1039 } 1300 if (key!=keyword) << 1040 if (key!=keyword) { 1301 { << 1041 if (verboseLevel >0) { 1302 if (verboseLevel >0) << 1042 G4cout << "G4ProductionCutTable::RetrieveCutsInfo "; 1303 { << 1043 G4cout << " Key word in " << fileName << "= " << keyword ; 1304 G4cerr << "G4ProductionCutTable::Retrie << 1044 G4cout <<"( should be "<< key << ")" <<G4endl; 1305 G4cerr << "Key word in " << fileName << << 1306 G4cerr <<"( should be "<< key << ")" << 1307 } 1045 } 1308 G4Exception( "G4ProductionCutsTable::Retr << 1309 "ProcCuts103", JustWarning, << 1310 return false; 1046 return false; 1311 } 1047 } 1312 1048 1313 // numberOfCouples 1049 // numberOfCouples 1314 G4int numberOfCouples; 1050 G4int numberOfCouples; 1315 if (ascii) << 1051 if (ascii) { 1316 { << 1317 fIn >> numberOfCouples; 1052 fIn >> numberOfCouples; 1318 if (fIn.fail()) << 1053 } else { 1319 { << 1054 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 } 1055 } 1329 1056 1330 if (numberOfCouples > static_cast<G4int>(mc << 1057 for (size_t idx=0; G4int(idx) <NumberOfG4CutIndex; idx++) { 1331 { << 1058 G4CutVectorForAParticle* fRange = rangeCutTable[idx]; 1332 G4Exception( "G4ProductionCutsTable::Retr << 1059 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(); 1060 fRange->clear(); 1343 fEnergy->clear(); 1061 fEnergy->clear(); 1344 1062 1345 // Loop over all couples 1063 // Loop over all couples 1346 for (std::size_t i=0; static_cast<G4int>( << 1064 for (size_t i=0; G4int(i)< numberOfCouples; i++){ 1347 { << 1348 G4double rcut, ecut; 1065 G4double rcut, ecut; 1349 if (ascii) << 1066 if (ascii) { 1350 { << 1351 fIn >> rcut >> ecut; 1067 fIn >> rcut >> ecut; 1352 if (fIn.fail()) << 1353 { << 1354 G4Exception( "G4ProductionCutsTable << 1355 "ProcCuts103", JustWar << 1356 return false; << 1357 } << 1358 rcut *= mm; 1068 rcut *= mm; 1359 ecut *= keV; 1069 ecut *= keV; >> 1070 } else { >> 1071 fIn.read((char*)(&rcut), sizeof (G4double)); >> 1072 fIn.read((char*)(&ecut), sizeof (G4double)); 1360 } 1073 } 1361 else << 1074 if (!mccConversionTable.IsUsed(i)) continue; 1362 { << 1075 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; 1076 (*fRange)[new_index] = rcut; 1369 (*fEnergy)[new_index] = ecut; 1077 (*fEnergy)[new_index] = ecut; 1370 } 1078 } 1371 } 1079 } 1372 return true; 1080 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 } 1081 } 1401 1082