149 (*CoupleItr)->SetUseFlag(
false);
159 if( (*rItr)->IsInMassGeometry() || (*rItr)->IsInParallelGeometry() )
162 auto mItr = (*rItr)->GetMaterialIterator();
163 std::size_t nMaterial = (*rItr)->GetNumberOfMaterials();
166 for(std::size_t iMate=0; iMate<nMaterial; ++iMate)
169 G4bool coupleAlreadyDefined =
false;
173 if( (*cItr)->GetMaterial()==(*mItr)
174 && (*cItr)->GetProductionCuts()==fProductionCut)
176 coupleAlreadyDefined =
true;
183 if(!coupleAlreadyDefined)
191 (*rItr)->RegisterMaterialCouplePair((*mItr),aCouple);
196 auto rootLVItr = (*rItr)->GetRootLogicalVolumeIterator();
197 std::size_t nRootLV = (*rItr)->GetNumberOfRootVolumes();
198 for(std::size_t iLV=0; iLV<nRootLV; ++iLV)
222 G4bool newCoupleAppears = nCouple>nTable;
225 for(std::size_t
n=nCouple-nTable;
n>0; --
n)
246 if((*cItr)->IsRecalcNeeded())
268 G4cout <<
"G4ProductionCutsTable::UpdateCoupleTable() - "
269 <<
"Elapsed time for calculation of energy cuts: " <<
G4endl;
280 if(rangeVOld)
delete [] rangeVOld;
281 if(energyVOld)
delete [] energyVOld;
290 for(std::size_t ixx=0; ixx<(*(
rangeCutTable[ix])).size(); ++ixx)
313 ed <<
"Invoked prematurely before it is fully initialized.";
314 G4Exception(
"G4ProductionCutsTable::ConvertRangeToEnergy()",
322 if (
material ==
nullptr)
return -1.0;
325 if (range == 0.0)
return 0.0;
326 if (range <0.0)
return -1.0;
338 if(particle !=
nullptr)
341 { ed <<
"without valid particle pointer."; }
342 G4Exception(
"G4ProductionCutsTable::ConvertRangeToEnergy()",
380 if((aRegion!=
nullptr) && aLV->
GetRegion()!=aRegion)
return;
389 if(noDaughters==0)
return;
392 for(std::size_t i=0; i<noDaughters; ++i)
403 G4cout <<
"========= Table of registered couples ============================"
411 <<
" used in the geometry : ";
419 G4cout <<
" Range cuts : "
425 G4cout <<
" Energy thresholds : " ;
438 G4cout <<
" Region(s) which use this couple : " <<
G4endl;
450 G4cout <<
"==================================================================" <<
G4endl;
467 G4cout <<
"G4ProductionCutsTable::StoreCutsTable()" <<
G4endl;
468 G4cout <<
" Material/Cuts information have been successfully stored ";
471 G4cout <<
" in Ascii mode ";
475 G4cout <<
" in Binary mode ";
492 G4cout <<
"G4ProductionCutsTable::RetrieveCutsTable()" <<
G4endl;
493 G4cout <<
" Material/Cuts information have been successfully retrieved ";
496 G4cout <<
" in Ascii mode ";
500 G4cout <<
" in Binary mode ";
516 G4cerr <<
"G4ProductionCutsTable::CheckForRetrieveCutsTable()"<<
G4endl;
521 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo passed !!"<<
G4endl;
526 G4cerr <<
"G4ProductionCutsTable::CheckMaterialCutsCoupleInfo passed !!"
538 const G4String fileName = directory +
"/" +
"material.dat";
539 const G4String key =
"MATERIAL-V3.0";
543 if (!ascii ) fOut.open(fileName,std::ios::out|std::ios::binary);
544 else fOut.open(fileName,std::ios::out);
552 G4cerr <<
"G4ProductionCutsTable::StoreMaterialInfo() - ";
556 G4Exception(
"G4ProductionCutsTable::StoreMaterialInfo()",
563 G4int numberOfMaterial = matTable->size();
572 fOut << numberOfMaterial <<
G4endl;
574 fOut.setf(std::ios::scientific);
577 for (std::size_t idx=0;
static_cast<G4int>(idx)<numberOfMaterial; ++idx)
580 << ((*matTable)[idx])->GetName();
582 << ((*matTable)[idx])->GetDensity()/(
g/
cm3) <<
G4endl;
585 fOut.unsetf(std::ios::scientific);
606 fOut.write( (
char*)(&numberOfMaterial),
sizeof(
G4int));
609 for (std::size_t imat=0;
static_cast<G4int>(imat)<numberOfMaterial; ++imat)
612 G4double density = ((*matTable)[imat])->GetDensity();
618 fOut.write( (
char*)(&density),
sizeof(
G4double));
632 const G4String fileName = directory +
"/" +
"material.dat";
633 const G4String key =
"MATERIAL-V3.0";
637 if (!ascii ) fIn.open(fileName,std::ios::in|std::ios::binary);
638 else fIn.open(fileName,std::ios::in);
646 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
650 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
666 keyword = (
const char*)(temp);
673 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
674 G4cerr <<
"Key word in " << fileName <<
"= " << keyword ;
678 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
691 fIn.read( (
char*)(&nmat),
sizeof(
G4int));
693 if ((nmat<=0) || (nmat >100000))
695 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
697 "Number of materials is less than zero or too big");
702 for (
G4int idx=0; idx<nmat ; ++idx)
710 G4cout <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
711 G4cout <<
"Encountered End of File " ;
724 fIn >>
name >> density;
731 fIn.read((
char*)(&density),
sizeof(
G4double));
738 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
739 G4cerr <<
"Bad data format ";
743 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
750 if (aMaterial ==
nullptr )
continue;
753 if ((0.999>ratio) || (ratio>1.001) )
758 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
762 G4cerr <<
"Density:" << std::setiosflags(std::ios::scientific)
763 << density / (
g/
cm3) ;
766 G4cerr << std::resetiosflags(std::ios::scientific);
769 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
770 "ProcCuts104",
JustWarning,
"Inconsistent material density");
787 const G4String fileName = directory +
"/" +
"couple.dat";
793 if (!ascii ) fOut.open(fileName,std::ios::out|std::ios::binary);
794 else fOut.open(fileName,std::ios::out);
803 G4cerr <<
"G4ProductionCutsTable::StoreMaterialCutsCoupleInfo() - ";
807 G4Exception(
"G4ProductionCutsTable::StoreMaterialCutsCoupleInfo()",
820 fOut << numberOfCouples <<
G4endl;
834 fOut.write( (
char*)(&numberOfCouples),
sizeof(
G4int));
859 regionName = (*rItr)->GetName();
877 fOut.setf(std::ios::scientific);
884 fOut.unsetf(std::ios::scientific);
891 fOut.write( (
char*)(&index),
sizeof(
G4int));
898 temp[i]=materialName[i];
905 temp[i]=regionName[i];
911 fOut.write( (
char*)(&(cutValues[idx])),
sizeof(
G4double));
927 const G4String fileName = directory +
"/" +
"couple.dat";
932 if (!ascii ) fIn.open(fileName,std::ios::in|std::ios::binary);
933 else fIn.open(fileName,std::ios::in);
941 G4cerr <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
945 G4Exception(
"G4ProductionCutsTable::CheckMaterialCutsCoupleInfo()",
961 keyword = (
const char*)(temp);
968 G4cerr <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
969 G4cerr <<
"Key word in " << fileName <<
"= " << keyword ;
973 G4Exception(
"G4ProductionCutsTable::CheckMaterialCutsCoupleInfo()",
980 G4int numberOfCouples;
983 fIn >> numberOfCouples;
987 fIn.read( (
char*)(&numberOfCouples),
sizeof(
G4int));
994 for (
G4int idx=0; idx<numberOfCouples; ++idx)
1004 fIn.read( (
char*)(&index),
sizeof(
G4int));
1032 fIn >> cutValues[i];
1033 cutValues[i] *= (
mm);
1037 fIn.read( (
char*)(&(cutValues[i])),
sizeof(
G4double));
1058 fRatio = fRatio && (0.999<ratio) && (ratio<1.001) ;
1061 if (!fRatio)
continue;
1076 if ( regionname !=
"NONE" )
1079 if (fRegion ==
nullptr)
1081 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
1082 G4cout <<
"Region " << regionname <<
" is not found ";
1086 if (((regionname ==
"NONE") && (aCouple->
IsUsed()))
1089 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo()"
1091 G4cout <<
"A Couple is used different region in the current setup ";
1093 G4cout <<
" material: " << mat_name ;
1097 G4cout <<
"cut[" << ii <<
"]=" << cutValues[ii]/
mm;
1102 else if ( index != aCouple->
GetIndex() )
1104 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
1108 G4cout <<
" is defined as " ;
1109 G4cout << index <<
":" << mat_name <<
" in " << fileName <<
G4endl;
1113 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
1114 G4cout << index <<
":" << mat_name <<
" in " << fileName ;
1115 G4cout <<
" is consistent with current setup" <<
G4endl;
1125 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo()"
1127 G4cout <<
"Couples are not defined in the current detector setup ";
1129 G4cout <<
" material: " << mat_name ;
1133 G4cout <<
"cut[" << ii <<
"]=" << cutValues[ii]/
mm;
1151 const G4String fileName = directory +
"/" +
"cut.dat";
1157 if (!ascii ) fOut.open(fileName,std::ios::out|std::ios::binary);
1158 else fOut.open(fileName,std::ios::out);
1165 G4cerr <<
"G4ProductionCutsTable::StoreCutsInfo() - ";
1168 G4Exception(
"G4ProductionCutsTable::StoreCutsInfo()",
1181 fOut << numberOfCouples <<
G4endl;
1195 fOut.write( (
char*)(&numberOfCouples),
sizeof(
G4int));
1209 fOut.setf(std::ios::scientific);
1210 fOut << std::setw(20) << (*fRange)[i]/
mm ;
1211 fOut << std::setw(20) << (*fEnergy)[i]/
keV <<
G4endl;
1212 fOut.unsetf(std::ios::scientific);
1218 fOut.write((
char*)(&cut),
sizeof(
G4double));
1219 cut = (*fEnergy)[i];
1220 fOut.write((
char*)(&cut),
sizeof(
G4double));
1234 const G4String fileName = directory +
"/" +
"cut.dat";
1239 if (!ascii ) fIn.open(fileName,std::ios::in|std::ios::binary);
1240 else fIn.open(fileName,std::ios::in);
1247 G4cerr <<
"G4ProductionCutTable::RetrieveCutsInfo() - ";
1250 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1266 keyword = (
const char*)(temp);
1272 G4cerr <<
"G4ProductionCutTable::RetrieveCutsInfo() - ";
1273 G4cerr <<
"Key word in " << fileName <<
"= " << keyword ;
1276 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1282 G4int numberOfCouples;
1285 fIn >> numberOfCouples;
1288 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1295 fIn.read( (
char*)(&numberOfCouples),
sizeof(
G4int));
1300 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1302 "Number of Couples in the file exceeds defined couples");
1314 for (std::size_t i=0;
static_cast<G4int>(i)< numberOfCouples; ++i)
1319 fIn >> rcut >> ecut;
1322 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1331 fIn.read((
char*)(&rcut),
sizeof(
G4double));
1332 fIn.read((
char*)(&ecut),
sizeof(
G4double));
1336 (*fRange)[new_index] = rcut;
1337 (*fEnergy)[new_index] = ecut;
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
std::vector< G4Material * > G4MaterialTable
static constexpr double cm3
static constexpr double mm
static constexpr double keV
static constexpr double g
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
size_t GetNoDaughters() const
G4Region * GetRegion() const
G4Material * GetMaterial() const
G4VPhysicalVolume * GetDaughter(const G4int i) const
void SetMaterialCutsCouple(G4MaterialCutsCouple *cuts)
void SetNewIndex(std::size_t index, std::size_t new_value)
G4bool IsUsed(std::size_t index) const
G4int GetIndex(std::size_t index) const
void Reset(std::size_t size)
const G4Material * GetMaterial() const
void SetUseFlag(G4bool flg=true)
G4ProductionCuts * GetProductionCuts() const
G4double GetDensity() const
static G4MaterialTable * GetMaterialTable()
const G4String & GetName() const
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
const G4String & GetParticleName() const
static G4ParticleTable * GetParticleTable()
const std::vector< G4double > * GetRangeCutsVector(std::size_t pcIdx) const
virtual G4bool RetrieveCutsInfo(const G4String &directory, G4bool ascii=false)
std::vector< G4MaterialCutsCouple * > coupleTable
G4bool RetrieveCutsTable(const G4String &directory, G4bool ascii=false)
virtual G4bool StoreCutsInfo(const G4String &directory, G4bool ascii=false)
std::vector< std::vector< G4double > * > rangeCutTable
G4double GetLowEdgeEnergy() const
void SetMaxEnergyCut(G4double value)
void UpdateCoupleTable(G4VPhysicalVolume *currentWorld)
G4MCCIndexConversionTable mccConversionTable
G4double GetMaxEnergyCut()
void SetVerboseLevel(G4int value)
G4double * energyDoubleVector[NumberOfG4CutIndex]
G4VRangeToEnergyConverter * converters[NumberOfG4CutIndex]
virtual G4bool CheckMaterialInfo(const G4String &directory, G4bool ascii=false)
G4int GetVerboseLevel() const
virtual G4bool StoreMaterialInfo(const G4String &directory, G4bool ascii=false)
G4double GetHighEdgeEnergy() const
virtual ~G4ProductionCutsTable()
const std::vector< G4double > * GetEnergyCutsVector(std::size_t pcIdx) const
static G4ProductionCutsTable * fProductionCutsTable
G4bool StoreCutsTable(const G4String &directory, G4bool ascii=false)
G4RegionStore * fG4RegionStore
@ FixedStringLengthForStore
G4double * rangeDoubleVector[NumberOfG4CutIndex]
G4bool CheckForRetrieveCutsTable(const G4String &directory, G4bool ascii=false)
void ScanAndSetCouple(G4LogicalVolume *aLV, G4MaterialCutsCouple *aCouple, G4Region *aRegion)
void SetEnergyRange(G4double lowedge, G4double highedge)
static G4ProductionCutsTable * GetProductionCutsTable()
virtual G4bool CheckMaterialCutsCoupleInfo(const G4String &directory, G4bool ascii=false)
G4bool IsCoupleUsedInTheRegion(const G4MaterialCutsCouple *aCouple, const G4Region *aRegion) const
G4ProductionCuts * defaultProductionCuts
G4double ConvertRangeToEnergy(const G4ParticleDefinition *particle, const G4Material *material, G4double range)
virtual G4bool StoreMaterialCutsCoupleInfo(const G4String &directory, G4bool ascii=false)
G4ProductionCutsTableMessenger * fMessenger
std::vector< std::vector< G4double > * > energyCutTable
static G4int GetIndex(const G4String &name)
G4double GetProductionCut(G4int index) const
const std::vector< G4double > & GetProductionCuts() const
static G4RegionStore * GetInstance()
G4Region * GetRegion(const G4String &name, G4bool verbose=true) const
G4LogicalVolume * GetLogicalVolume() const
static void SetMaxEnergyCut(const G4double value)
void SetVerboseLevel(G4int value)
static G4double GetMaxEnergyCut()
virtual G4double Convert(const G4double rangeCut, const G4Material *material)
static void SetEnergyRange(const G4double lowedge, const G4double highedge)
static G4double GetLowEdgeEnergy()
static G4double GetHighEdgeEnergy()
const char * name(G4int ptype)