Warning, file /geant4/examples/extended/persistency/P03/src/ExTGRCRegionCutsMgr.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #include "ExTGRCRegionCutsMgr.hh"
0031
0032 #include "ExTGRCRegionData.hh"
0033
0034 #include "G4LogicalVolume.hh"
0035 #include "G4ProductionCuts.hh"
0036 #include "G4Region.hh"
0037 #include "G4RegionStore.hh"
0038 #include "G4UIcommand.hh"
0039 #include "G4tgbVolumeMgr.hh"
0040 #include "G4tgrUtils.hh"
0041
0042 ExTGRCRegionCutsMgr* ExTGRCRegionCutsMgr::fInstance = 0;
0043
0044
0045 ExTGRCRegionCutsMgr* ExTGRCRegionCutsMgr::GetInstance()
0046 {
0047 if (!fInstance) {
0048 fInstance = new ExTGRCRegionCutsMgr;
0049 }
0050 return fInstance;
0051 }
0052
0053
0054 ExTGRCRegionCutsMgr::ExTGRCRegionCutsMgr() {}
0055
0056
0057 ExTGRCRegionCutsMgr::~ExTGRCRegionCutsMgr()
0058 {
0059 delete fInstance;
0060 }
0061
0062
0063 void ExTGRCRegionCutsMgr::AddRegionData(const std::vector<G4String>& rd)
0064 {
0065 if ((rd.size() > 1) && (FindRegionData(rd[0]).size() != 0)) {
0066 G4Exception("ExTGRCRegionCutsMgr::AddRegionData", "InvalidArgument", JustWarning,
0067 G4String("Region already exists: " + rd[0]).c_str());
0068 return;
0069 }
0070 fRegionDatae.push_back(new ExTGRCRegionData(rd));
0071 }
0072
0073
0074 void ExTGRCRegionCutsMgr::AddRegionCuts(const std::vector<G4String>& rc)
0075 {
0076 if (rc.size() == 0) {
0077 G4cerr << "ERROR - ExTGRCRegionCutsMgr::AddRegionCuts()" << G4endl
0078 << " Must have 3 or 4 arguments : REGION_NAME, gamma_CUT,"
0079 << " e-_CUT (e+_CUT)." << G4endl << " It has only " << rc.size() << " !"
0080 << G4endl;
0081 G4Exception("ExTGRCRegionCutsMgr::AddRegionCuts()", "InvalidArgument", FatalErrorInArgument,
0082 G4UIcommand::ConvertToString(G4int(rc.size())));
0083 }
0084
0085
0086
0087 std::vector<ExTGRCRegionData*> regs = FindRegionData(rc[0]);
0088
0089 if (regs.size() == 0) {
0090 G4Exception("ExTGRCRegionCutsMgr::AddRegionCuts()", "InvalidArgument", FatalErrorInArgument,
0091 G4String(" region does not exist: " + rc[0]).c_str());
0092 }
0093
0094 for (size_t ii = 0; ii < regs.size(); ii++) {
0095 regs[ii]->SetCutsData(rc);
0096 }
0097 }
0098
0099 std::vector<ExTGRCRegionData*> ExTGRCRegionCutsMgr::FindRegionData(const G4String& name)
0100 {
0101 std::vector<ExTGRCRegionData*> regs;
0102 std::vector<ExTGRCRegionData*>::const_iterator iter;
0103 for (iter = fRegionDatae.begin(); iter != fRegionDatae.end(); iter++) {
0104 if (G4tgrUtils::AreWordsEquivalent(name, (*iter)->GetRegionName())) {
0105 regs.push_back(*iter);
0106 }
0107 }
0108 return regs;
0109 }
0110
0111
0112 void ExTGRCRegionCutsMgr::BuildRegions()
0113 {
0114 std::vector<ExTGRCRegionData*>::const_iterator iter;
0115 std::vector<G4String>::const_iterator ites;
0116
0117 for (iter = fRegionDatae.begin(); iter != fRegionDatae.end(); iter++) {
0118 G4Region* reg = new G4Region((*iter)->GetRegionName());
0119 std::vector<G4String> lvs = (*iter)->GetLVNames();
0120 for (ites = lvs.begin(); ites != lvs.end(); ites++) {
0121 G4LogicalVolume* logVol = G4tgbVolumeMgr::GetInstance()->FindG4LogVol(*ites, true);
0122 reg->AddRootLogicalVolume(logVol);
0123 }
0124 }
0125 }
0126
0127
0128 void ExTGRCRegionCutsMgr::BuildProductionCuts()
0129 {
0130 std::vector<ExTGRCRegionData*>::const_iterator iter;
0131 G4RegionStore* regions = G4RegionStore::GetInstance();
0132
0133 for (iter = fRegionDatae.begin(); iter != fRegionDatae.end(); iter++) {
0134 if ((*iter)->CutsAreSet()) {
0135 G4Region* reg = regions->GetRegion((*iter)->GetRegionName());
0136 if (!reg) {
0137 G4Exception("ExTGRCRegionCutsMgr::BuildProductionCuts()", "InvalidArgument",
0138 FatalErrorInArgument,
0139 G4String("Region not found: " + (*iter)->GetRegionName()).c_str());
0140 }
0141 G4ProductionCuts* cuts = new G4ProductionCuts;
0142
0143 cuts->SetProductionCut((*iter)->GetGammaCut(), "gamma");
0144 cuts->SetProductionCut((*iter)->GetElectronCut(), "e-");
0145 cuts->SetProductionCut((*iter)->GetPositronCut(), "e+");
0146 reg->SetProductionCuts(cuts);
0147 }
0148 }
0149 }