61 if(fProductionCutsTable ==
nullptr)
63 fProductionCutsTable = &theProductionCutsTable;
65 return fProductionCutsTable;
73 rangeCutTable.push_back(
new std::vector<G4double>);
74 energyCutTable.push_back(
new std::vector<G4double>);
75 rangeDoubleVector[i] =
nullptr;
76 energyDoubleVector[i] =
nullptr;
77 converters[i] =
nullptr;
89 delete defaultProductionCuts;
90 defaultProductionCuts =
nullptr;
92 for(
auto itr=coupleTable.cbegin(); itr!=coupleTable.cend(); ++itr)
100 delete rangeCutTable[i];
101 delete energyCutTable[i];
102 delete converters[i];
103 if(rangeDoubleVector[i] !=
nullptr)
delete [] rangeDoubleVector[i];
104 if(energyDoubleVector[i] !=
nullptr)
delete [] energyDoubleVector[i];
105 rangeCutTable[i] =
nullptr;
106 energyCutTable[i] =
nullptr;
107 converters[i] =
nullptr;
108 rangeDoubleVector[i] =
nullptr;
109 energyDoubleVector[i] =
nullptr;
112 delete userEnergyCuts[i];
115 fProductionCutsTable =
nullptr;
118 fMessenger =
nullptr;
127 ed <<
"Wrong index= " << idx <<
"; it should be < 4";
128 G4Exception(
"G4ProductionCutsTable::SetEnergyCutVector()",
132 userEnergyCuts[idx] =
new std::vector<G4double>(cutE);
139 for(
auto CoupleItr=coupleTable.cbegin();
140 CoupleItr!=coupleTable.cend(); ++CoupleItr)
142 (*CoupleItr)->SetUseFlag(
false);
146 for(
auto rItr=fG4RegionStore->cbegin(); rItr!=fG4RegionStore->cend(); ++rItr)
152 if( (*rItr)->IsInMassGeometry() || (*rItr)->IsInParallelGeometry() )
155 auto mItr = (*rItr)->GetMaterialIterator();
156 std::size_t nMaterial = (*rItr)->GetNumberOfMaterials();
159 for(std::size_t iMate=0; iMate<nMaterial; ++iMate)
162 G4bool coupleAlreadyDefined =
false;
164 for(
auto cItr=coupleTable.cbegin(); cItr!=coupleTable.cend(); ++cItr)
166 if( (*cItr)->GetMaterial()==(*mItr)
167 && (*cItr)->GetProductionCuts()==fProductionCut)
169 coupleAlreadyDefined =
true;
176 if(!coupleAlreadyDefined)
179 coupleTable.push_back(aCouple);
184 (*rItr)->RegisterMaterialCouplePair((*mItr),aCouple);
189 auto rootLVItr = (*rItr)->GetRootLogicalVolumeIterator();
190 std::size_t nRootLV = (*rItr)->GetNumberOfRootVolumes();
191 for(std::size_t iLV=0; iLV<nRootLV; ++iLV)
197 ScanAndSetCouple(aLV,aCouple,aR);
213 std::size_t nCouple = coupleTable.size();
214 std::size_t nTable = energyCutTable[0]->size();
215 G4bool newCoupleAppears = nCouple>nTable;
218 for(std::size_t n=nCouple-nTable; n>0; --n)
222 rangeCutTable[nn]->push_back(-1.);
223 energyCutTable[nn]->push_back(-1.);
233 G4double* rangeVOld = rangeDoubleVector[ix];
234 G4double* energyVOld = energyDoubleVector[ix];
235 if(rangeVOld)
delete [] rangeVOld;
236 if(energyVOld)
delete [] energyVOld;
237 rangeDoubleVector[ix] =
new G4double[(*(rangeCutTable[ix])).size()];
238 energyDoubleVector[ix] =
new G4double[(*(energyCutTable[ix])).size()];
274 G4bool isRecalcNeeded =
false;
275 for (
const auto* userVector : userEnergyCuts) {
276 if (userVector !=
nullptr) {
277 isRecalcNeeded =
true;
289 for(
auto cItr=coupleTable.cbegin(); cItr!=coupleTable.cend(); ++cItr)
293 if((*cItr)->IsRecalcNeeded() || isRecalcNeeded)
298 (*(rangeCutTable[ptcl]))[idx] = rCut;
300 if(
nullptr != converters[ptcl])
303 if(
nullptr == userEnergyCuts[ptcl] || userEnergyCuts[ptcl]->size() <= idx)
305 (*(energyCutTable[ptcl]))[idx] = converters[ptcl]->Convert(rCut,aMat);
309 (*(energyCutTable[ptcl]))[idx] = (*(userEnergyCuts[ptcl]))[idx];
314 (*(energyCutTable[ptcl]))[idx] = -1.;
323 G4cout <<
"G4ProductionCutsTable::UpdateCoupleTable() - "
324 <<
"Elapsed time for calculation of energy cuts: " <<
G4endl;
331 for(std::size_t ixx=0; ixx<(*(rangeCutTable[ix])).size(); ++ixx)
333 rangeDoubleVector[ix][ixx] = (*(rangeCutTable[ix]))[ixx];
334 energyDoubleVector[ix][ixx] = (*(energyCutTable[ix]))[ixx];
354 ed <<
"Invoked prematurely before it is fully initialized.";
355 G4Exception(
"G4ProductionCutsTable::ConvertRangeToEnergy()",
363 if (material ==
nullptr)
return -1.0;
366 if (range == 0.0)
return 0.0;
367 if (range <0.0)
return -1.0;
372 if (index<0 || converters[index] ==
nullptr)
379 if(particle !=
nullptr)
382 { ed <<
"without valid particle pointer."; }
383 G4Exception(
"G4ProductionCutsTable::ConvertRangeToEnergy()",
390 return converters[index]->Convert(range, material);
421 if((aRegion!=
nullptr) && aLV->
GetRegion()!=aRegion)
return;
430 if(noDaughters==0)
return;
433 for(std::size_t i=0; i<noDaughters; ++i)
436 ScanAndSetCouple(daughterLVol,aCouple,aRegion);
444 G4cout <<
"========= Table of registered couples ============================"
446 for(
auto cItr=coupleTable.cbegin(); cItr!=coupleTable.cend(); ++cItr)
452 <<
" used in the geometry : ";
460 G4cout <<
" Range cuts : "
466 G4cout <<
" Energy thresholds : " ;
479 G4cout <<
" Region(s) which use this couple : " <<
G4endl;
480 for(
auto rItr=fG4RegionStore->cbegin();
481 rItr!=fG4RegionStore->cend(); ++rItr)
483 if (IsCoupleUsedInTheRegion(aCouple, *rItr) )
491 G4cout <<
"==================================================================" <<
G4endl;
508 G4cout <<
"G4ProductionCutsTable::StoreCutsTable()" <<
G4endl;
509 G4cout <<
" Material/Cuts information have been successfully stored ";
512 G4cout <<
" in Ascii mode ";
516 G4cout <<
" in Binary mode ";
533 G4cout <<
"G4ProductionCutsTable::RetrieveCutsTable()" <<
G4endl;
534 G4cout <<
" Material/Cuts information have been successfully retrieved ";
537 G4cout <<
" in Ascii mode ";
541 G4cout <<
" in Binary mode ";
557 G4cerr <<
"G4ProductionCutsTable::CheckForRetrieveCutsTable()"<<
G4endl;
562 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo passed !!"<<
G4endl;
567 G4cerr <<
"G4ProductionCutsTable::CheckMaterialCutsCoupleInfo passed !!"
579 const G4String fileName = directory +
"/" +
"material.dat";
580 const G4String key =
"MATERIAL-V3.0";
584 if (!ascii ) fOut.open(fileName,std::ios::out|std::ios::binary);
585 else fOut.open(fileName,std::ios::out);
593 G4cerr <<
"G4ProductionCutsTable::StoreMaterialInfo() - ";
597 G4Exception(
"G4ProductionCutsTable::StoreMaterialInfo()",
604 G4int numberOfMaterial = (
G4int)matTable->size();
613 fOut << numberOfMaterial <<
G4endl;
615 fOut.setf(std::ios::scientific);
618 for (std::size_t idx=0;
static_cast<G4int>(idx)<numberOfMaterial; ++idx)
620 fOut << std::setw(FixedStringLengthForStore)
621 << ((*matTable)[idx])->GetName();
622 fOut << std::setw(FixedStringLengthForStore)
623 << ((*matTable)[idx])->GetDensity()/(g/cm3) <<
G4endl;
626 fOut.unsetf(std::ios::scientific);
632 char temp[FixedStringLengthForStore];
636 for (i=0; i<FixedStringLengthForStore; ++i)
640 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i)
642 temp[i]=key[(
G4int)i];
644 fOut.write(temp, FixedStringLengthForStore);
647 fOut.write( (
char*)(&numberOfMaterial),
sizeof(
G4int));
650 for (std::size_t imat=0;
static_cast<G4int>(imat)<numberOfMaterial; ++imat)
652 G4String name = ((*matTable)[imat])->GetName();
653 G4double density = ((*matTable)[imat])->GetDensity();
654 for (i=0; i<FixedStringLengthForStore; ++i)
656 for (i=0; i<name.length() && i<FixedStringLengthForStore-1; ++i)
657 temp[i]=name[(
G4int)i];
658 fOut.write(temp, FixedStringLengthForStore);
659 fOut.write( (
char*)(&density),
sizeof(
G4double));
673 const G4String fileName = directory +
"/" +
"material.dat";
674 const G4String key =
"MATERIAL-V3.0";
678 if (!ascii ) fIn.open(fileName,std::ios::in|std::ios::binary);
679 else fIn.open(fileName,std::ios::in);
687 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
691 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
696 char temp[FixedStringLengthForStore];
706 fIn.read(temp, FixedStringLengthForStore);
707 keyword = (
const char*)(temp);
714 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
715 G4cerr <<
"Key word in " << fileName <<
"= " << keyword ;
719 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
732 fIn.read( (
char*)(&nmat),
sizeof(
G4int));
734 if ((nmat<=0) || (nmat >100000))
736 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
738 "Number of materials is less than zero or too big");
743 for (
G4int idx=0; idx<nmat ; ++idx)
751 G4cout <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
752 G4cout <<
"Encountered End of File " ;
761 char name[FixedStringLengthForStore];
765 fIn >> name >> density;
771 fIn.read(name, FixedStringLengthForStore);
772 fIn.read((
char*)(&density),
sizeof(
G4double));
779 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
780 G4cerr <<
"Bad data format ";
784 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
791 if (aMaterial ==
nullptr )
continue;
794 if ((0.999>ratio) || (ratio>1.001) )
799 G4cerr <<
"G4ProductionCutsTable::CheckMaterialInfo() - ";
803 G4cerr <<
"Density:" << std::setiosflags(std::ios::scientific)
804 << density / (g/cm3) ;
807 G4cerr << std::resetiosflags(std::ios::scientific);
810 G4Exception(
"G4ProductionCutsTable::CheckMaterialInfo()",
811 "ProcCuts104",
JustWarning,
"Inconsistent material density");
828 const G4String fileName = directory +
"/" +
"couple.dat";
831 char temp[FixedStringLengthForStore];
834 if (!ascii ) fOut.open(fileName,std::ios::out|std::ios::binary);
835 else fOut.open(fileName,std::ios::out);
844 G4cerr <<
"G4ProductionCutsTable::StoreMaterialCutsCoupleInfo() - ";
848 G4Exception(
"G4ProductionCutsTable::StoreMaterialCutsCoupleInfo()",
853 G4int numberOfCouples = (
G4int)coupleTable.size();
858 fOut << std::setw(FixedStringLengthForStore) << key <<
G4endl;
861 fOut << numberOfCouples <<
G4endl;
868 for (i=0; i<FixedStringLengthForStore; ++i)
870 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i)
871 temp[i]=key[(
G4int)i];
872 fOut.write(temp, FixedStringLengthForStore);
875 fOut.write( (
char*)(&numberOfCouples),
sizeof(
G4int));
879 for (
auto cItr=coupleTable.cbegin(); cItr!=coupleTable.cend(); ++cItr)
895 for(
auto rItr=fG4RegionStore->cbegin();
896 rItr!=fG4RegionStore->cend(); ++rItr)
898 if (IsCoupleUsedInTheRegion(aCouple, *rItr))
900 regionName = (*rItr)->GetName();
913 fOut << std::setw(FixedStringLengthForStore) << materialName<<
G4endl;
916 fOut << std::setw(FixedStringLengthForStore) << regionName<<
G4endl;
918 fOut.setf(std::ios::scientific);
922 fOut << std::setw(FixedStringLengthForStore) << cutValues[idx]/(mm)
925 fOut.unsetf(std::ios::scientific);
932 fOut.write( (
char*)(&index),
sizeof(
G4int));
936 for (i=0; i<FixedStringLengthForStore; ++i)
938 for (i=0; i<materialName.length() && i<FixedStringLengthForStore-1; ++i)
939 temp[i]=materialName[(
G4int)i];
940 fOut.write(temp, FixedStringLengthForStore);
943 for (i=0; i<FixedStringLengthForStore; ++i)
945 for (i=0; i<regionName.length() && i<FixedStringLengthForStore-1; ++i)
946 temp[i]=regionName[(
G4int)i];
947 fOut.write(temp, FixedStringLengthForStore);
952 fOut.write( (
char*)(&(cutValues[idx])),
sizeof(
G4double));
968 const G4String fileName = directory +
"/" +
"couple.dat";
973 if (!ascii ) fIn.open(fileName,std::ios::in|std::ios::binary);
974 else fIn.open(fileName,std::ios::in);
982 G4cerr <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
986 G4Exception(
"G4ProductionCutsTable::CheckMaterialCutsCoupleInfo()",
991 char temp[FixedStringLengthForStore];
1001 fIn.read(temp, FixedStringLengthForStore);
1002 keyword = (
const char*)(temp);
1007 if (verboseLevel >0)
1009 G4cerr <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
1010 G4cerr <<
"Key word in " << fileName <<
"= " << keyword ;
1014 G4Exception(
"G4ProductionCutsTable::CheckMaterialCutsCoupleInfo()",
1021 G4int numberOfCouples;
1024 fIn >> numberOfCouples;
1028 fIn.read( (
char*)(&numberOfCouples),
sizeof(
G4int));
1032 mccConversionTable.Reset(numberOfCouples);
1035 for (
G4int idx=0; idx<numberOfCouples; ++idx)
1045 fIn.read( (
char*)(&index),
sizeof(
G4int));
1048 char mat_name[FixedStringLengthForStore];
1055 fIn.read(mat_name, FixedStringLengthForStore);
1058 char region_name[FixedStringLengthForStore];
1065 fIn.read(region_name, FixedStringLengthForStore);
1073 fIn >> cutValues[i];
1074 cutValues[i] *= (mm);
1078 fIn.read( (
char*)(&(cutValues[i])),
sizeof(
G4double));
1085 for (
auto cItr=coupleTable.cbegin(); cItr!=coupleTable.cend(); ++cItr)
1099 fRatio = fRatio && (0.999<ratio) && (ratio<1.001) ;
1102 if (!fRatio)
continue;
1105 mccConversionTable.SetNewIndex(index, aCouple->
GetIndex());
1113 if (verboseLevel >1)
1117 if ( regionname !=
"NONE" )
1119 fRegion = fG4RegionStore->GetRegion(region_name);
1120 if (fRegion ==
nullptr)
1122 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
1123 G4cout <<
"Region " << regionname <<
" is not found ";
1127 if (((regionname ==
"NONE") && (aCouple->
IsUsed()))
1128 || ((fRegion!=
nullptr) && !IsCoupleUsedInTheRegion(aCouple, fRegion)))
1130 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo()"
1132 G4cout <<
"A Couple is used different region in the current setup ";
1134 G4cout <<
" material: " << mat_name ;
1138 G4cout <<
"cut[" << ii <<
"]=" << cutValues[ii]/mm;
1143 else if ( index != aCouple->
GetIndex() )
1145 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
1149 G4cout <<
" is defined as " ;
1150 G4cout << index <<
":" << mat_name <<
" in " << fileName <<
G4endl;
1154 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo() - ";
1155 G4cout << index <<
":" << mat_name <<
" in " << fileName ;
1156 G4cout <<
" is consistent with current setup" <<
G4endl;
1164 if (verboseLevel >0)
1166 G4cout <<
"G4ProductionCutTable::CheckMaterialCutsCoupleInfo()"
1168 G4cout <<
"Couples are not defined in the current detector setup ";
1170 G4cout <<
" material: " << mat_name ;
1174 G4cout <<
"cut[" << ii <<
"]=" << cutValues[ii]/mm;
1192 const G4String fileName = directory +
"/" +
"cut.dat";
1195 char temp[FixedStringLengthForStore];
1198 if (!ascii ) fOut.open(fileName,std::ios::out|std::ios::binary);
1199 else fOut.open(fileName,std::ios::out);
1206 G4cerr <<
"G4ProductionCutsTable::StoreCutsInfo() - ";
1209 G4Exception(
"G4ProductionCutsTable::StoreCutsInfo()",
1214 G4int numberOfCouples = (
G4int)coupleTable.size();
1222 fOut << numberOfCouples <<
G4endl;
1229 for (i=0; i<FixedStringLengthForStore; ++i)
1231 for (i=0; i<key.length() && i<FixedStringLengthForStore-1; ++i)
1232 temp[i]=key[(
G4int)i];
1233 fOut.write(temp, FixedStringLengthForStore);
1236 fOut.write( (
char*)(&numberOfCouples),
sizeof(
G4int));
1245 for (
auto cItr=coupleTable.cbegin();cItr!=coupleTable.cend(); ++cItr, ++i)
1250 fOut.setf(std::ios::scientific);
1251 fOut << std::setw(20) << (*fRange)[i]/mm ;
1252 fOut << std::setw(20) << (*fEnergy)[i]/keV <<
G4endl;
1253 fOut.unsetf(std::ios::scientific);
1259 fOut.write((
char*)(&cut),
sizeof(
G4double));
1260 cut = (*fEnergy)[i];
1261 fOut.write((
char*)(&cut),
sizeof(
G4double));
1275 const G4String fileName = directory +
"/" +
"cut.dat";
1280 if (!ascii ) fIn.open(fileName,std::ios::in|std::ios::binary);
1281 else fIn.open(fileName,std::ios::in);
1286 if (verboseLevel >0)
1288 G4cerr <<
"G4ProductionCutTable::RetrieveCutsInfo() - ";
1291 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1296 char temp[FixedStringLengthForStore];
1306 fIn.read(temp, FixedStringLengthForStore);
1307 keyword = (
const char*)(temp);
1311 if (verboseLevel >0)
1313 G4cerr <<
"G4ProductionCutTable::RetrieveCutsInfo() - ";
1314 G4cerr <<
"Key word in " << fileName <<
"= " << keyword ;
1317 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1323 G4int numberOfCouples;
1326 fIn >> numberOfCouples;
1329 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1336 fIn.read( (
char*)(&numberOfCouples),
sizeof(
G4int));
1339 if (numberOfCouples >
static_cast<G4int>(mccConversionTable.size()) )
1341 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1343 "Number of Couples in the file exceeds defined couples");
1345 numberOfCouples = (
G4int)mccConversionTable.size();
1349 std::vector<G4double>* fRange = rangeCutTable[idx];
1350 std::vector<G4double>* fEnergy = energyCutTable[idx];
1355 for (std::size_t i=0;
static_cast<G4int>(i)< numberOfCouples; ++i)
1360 fIn >> rcut >> ecut;
1363 G4Exception(
"G4ProductionCutsTable::RetrieveCutsInfo()",
1372 fIn.read((
char*)(&rcut),
sizeof(
G4double));
1373 fIn.read((
char*)(&ecut),
sizeof(
G4double));
1375 if (!mccConversionTable.IsUsed(i))
continue;
1376 std::size_t new_index = mccConversionTable.GetIndex(i);
1377 (*fRange)[new_index] = rcut;
1378 (*fEnergy)[new_index] = ecut;
1389 verboseLevel = value;
1392 if (converters[ip] !=
nullptr )
1394 converters[ip]->SetVerboseLevel(value);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
std::vector< G4Material * > G4MaterialTable
G4GLOB_DLL std::ostream G4cerr
G4GLOB_DLL std::ostream G4cout
G4LogicalVolume represents a leaf node or unpositioned subtree in the geometry hierarchy....
std::size_t GetNoDaughters() const
G4Region * GetRegion() const
G4Material * GetMaterial() const
G4VPhysicalVolume * GetDaughter(const std::size_t i) const
void SetMaterialCutsCouple(G4MaterialCutsCouple *cuts)
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)
G4bool RetrieveCutsTable(const G4String &directory, G4bool ascii=false)
virtual G4bool StoreCutsInfo(const G4String &directory, G4bool ascii=false)
G4double GetLowEdgeEnergy() const
void SetMaxEnergyCut(G4double value)
void UpdateCoupleTable(G4VPhysicalVolume *currentWorld)
G4double GetMaxEnergyCut()
void SetVerboseLevel(G4int value)
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
G4bool StoreCutsTable(const G4String &directory, G4bool ascii=false)
G4bool CheckForRetrieveCutsTable(const G4String &directory, G4bool ascii=false)
void CreateCoupleTables()
void SetEnergyRange(G4double lowedge, G4double highedge)
static G4ProductionCutsTable * GetProductionCutsTable()
virtual G4bool CheckMaterialCutsCoupleInfo(const G4String &directory, G4bool ascii=false)
void SetEnergyCutVector(const std::vector< G4double > &cutE, std::size_t idx)
G4ProductionCutsTable(const G4ProductionCutsTable &)=delete
G4double ConvertRangeToEnergy(const G4ParticleDefinition *particle, const G4Material *material, G4double range)
virtual G4bool StoreMaterialCutsCoupleInfo(const G4String &directory, G4bool ascii=false)
static G4int GetIndex(const G4String &name)
G4double GetProductionCut(G4int index) const
const std::vector< G4double > & GetProductionCuts() const
static G4RegionStore * GetInstance()
G4Region defines a region or a group of regions in the detector geometry setup, sharing properties as...
G4VPhysicalVolume is an abstract base class for the representation of a positioned volume....
G4LogicalVolume * GetLogicalVolume() const
static void SetMaxEnergyCut(const G4double value)
static G4double GetMaxEnergyCut()
static void SetEnergyRange(const G4double lowedge, const G4double highedge)
static G4double GetLowEdgeEnergy()
static G4double GetHighEdgeEnergy()