File indexing completed on 2025-04-10 08:06:17
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
0031
0032
0033
0034 #include "DetectorConstruction.hh"
0035
0036 #include "DetectorMessenger.hh"
0037 #include "PrimaryGeneratorAction.hh"
0038
0039 #include "G4Box.hh"
0040 #include "G4GeometryManager.hh"
0041 #include "G4LogicalVolume.hh"
0042 #include "G4LogicalVolumeStore.hh"
0043 #include "G4Material.hh"
0044 #include "G4NistManager.hh"
0045 #include "G4PVPlacement.hh"
0046 #include "G4PhysicalConstants.hh"
0047 #include "G4PhysicalVolumeStore.hh"
0048 #include "G4RunManager.hh"
0049 #include "G4SolidStore.hh"
0050 #include "G4Sphere.hh"
0051 #include "G4SystemOfUnits.hh"
0052 #include "G4ThreeVector.hh"
0053 #include "globals.hh"
0054
0055
0056
0057 DetectorConstruction::DetectorConstruction()
0058 : fMaterialTracker(nullptr),
0059 fMaterialEmCalo(nullptr),
0060 fMaterialHadCalo(nullptr),
0061 fExperimentalHall_log(nullptr),
0062 fExperimentalHall_phys(nullptr),
0063 fLogicTrackerShell(nullptr),
0064 fPhysiTrackerShell(nullptr),
0065 fLogicEmCaloShell(nullptr),
0066 fPhysiEmCaloShell(nullptr),
0067 fLogicHadCaloShell(nullptr),
0068 fPhysiHadCaloShell(nullptr),
0069 fLogicScoringTrackerShell(nullptr),
0070 fPhysiScoringTrackerShell(nullptr),
0071 fLogicScoringEmCaloShell(nullptr),
0072 fPhysiScoringEmCaloShell(nullptr),
0073 fLogicScoringHadCaloShell(nullptr),
0074 fPhysiScoringHadCaloShell(nullptr),
0075 fDetectorMessenger(nullptr),
0076 fInnerRadiusTracker(10.0 * cm),
0077 fOuterRadiusTracker(20.0 * cm),
0078 fInnerRadiusEmCalo(30.0 * cm),
0079 fOuterRadiusEmCalo(60.0 * cm),
0080 fInnerRadiusHadCalo(70.0 * cm),
0081 fOuterRadiusHadCalo(170.0 * cm)
0082 {
0083
0084 fMaterialTracker = G4NistManager::Instance()->FindOrBuildMaterial("G4_Si");
0085
0086 fMaterialEmCalo = G4NistManager::Instance()->FindOrBuildMaterial("G4_PbWO4");
0087 fMaterialHadCalo = G4NistManager::Instance()->FindOrBuildMaterial("G4_Fe");
0088 fDetectorMessenger = new DetectorMessenger(this);
0089
0090 }
0091
0092
0093
0094 DetectorConstruction::~DetectorConstruction()
0095 {
0096 delete fDetectorMessenger;
0097 }
0098
0099
0100
0101 G4VPhysicalVolume* DetectorConstruction::Construct()
0102 {
0103
0104 return ConstructDetector();
0105 }
0106
0107
0108
0109 G4VPhysicalVolume* DetectorConstruction::ConstructDetector()
0110 {
0111
0112
0113
0114 G4GeometryManager::GetInstance()->OpenGeometry();
0115
0116 G4PhysicalVolumeStore::GetInstance()->Clean();
0117 G4LogicalVolumeStore::GetInstance()->Clean();
0118 G4SolidStore::GetInstance()->Clean();
0119
0120
0121 G4bool isOK = true;
0122 if (fInnerRadiusTracker < 0.0 || fOuterRadiusTracker < fInnerRadiusTracker
0123 || fInnerRadiusEmCalo < fOuterRadiusTracker + fScoringThickness
0124 || fOuterRadiusEmCalo < fInnerRadiusEmCalo
0125 || fInnerRadiusHadCalo < fOuterRadiusEmCalo + fScoringThickness
0126 || fOuterRadiusHadCalo < fInnerRadiusHadCalo)
0127 {
0128 isOK = false;
0129 }
0130 if (!isOK) {
0131 G4cerr << G4endl << "ERROR: the radii are inconsistent !" << G4endl
0132 << " InnerRadiusTracker = " << fInnerRadiusTracker << " mm" << G4endl
0133 << " OuterRadiusTracker = " << fOuterRadiusTracker << " mm" << G4endl
0134 << " InnerRadiusEmCalo = " << fInnerRadiusEmCalo << " mm" << G4endl
0135 << " OuterRadiusEmCalo = " << fOuterRadiusEmCalo << " mm" << G4endl
0136 << " InnerRadiusHadCalo = " << fInnerRadiusHadCalo << " mm" << G4endl
0137 << " OuterRadiusHadCalo = " << fOuterRadiusHadCalo << " mm" << G4endl
0138 << " ScoringThickness = " << fScoringThickness << " mm" << G4endl << G4endl;
0139 return nullptr;
0140 }
0141
0142
0143
0144
0145
0146
0147
0148 G4double expHall_x = 1.1 * fOuterRadiusHadCalo;
0149 G4double expHall_y = 1.1 * fOuterRadiusHadCalo;
0150 G4double expHall_z = 1.1 * fOuterRadiusHadCalo;
0151
0152 G4Material* vacuum = G4NistManager::Instance()->FindOrBuildMaterial("G4_Galactic");
0153
0154 G4Box* experimentalHall_box = new G4Box("expHall_box", expHall_x, expHall_y, expHall_z);
0155
0156 fExperimentalHall_log = new G4LogicalVolume(experimentalHall_box,
0157 vacuum,
0158 "expHall_log",
0159 0,
0160 0,
0161 0);
0162
0163 fExperimentalHall_phys = new G4PVPlacement(0,
0164 G4ThreeVector(),
0165 "expHall",
0166 fExperimentalHall_log,
0167 0,
0168 false,
0169 0);
0170
0171
0172 G4Sphere* solidTrackerShell = new G4Sphere("solidTrackerShell",
0173 fInnerRadiusTracker,
0174 fOuterRadiusTracker,
0175 0.0,
0176
0177 2.0 * CLHEP::pi,
0178
0179 0.0,
0180
0181 CLHEP::pi);
0182
0183 fLogicTrackerShell = new G4LogicalVolume(solidTrackerShell,
0184 fMaterialTracker,
0185 "logicTrackerShell",
0186 0,
0187 0,
0188 0);
0189 fPhysiTrackerShell = new G4PVPlacement(0,
0190 G4ThreeVector(),
0191 "physiTrackerShell",
0192 fLogicTrackerShell,
0193 fExperimentalHall_phys,
0194 false,
0195 0);
0196
0197
0198 G4Sphere* solidScoringTrackerShell =
0199 new G4Sphere("solidScoringTrackerShell",
0200 fOuterRadiusTracker,
0201 fOuterRadiusTracker + fScoringThickness,
0202 0.0,
0203
0204 2.0 * CLHEP::pi,
0205
0206 0.0,
0207
0208 CLHEP::pi);
0209
0210 fLogicScoringTrackerShell = new G4LogicalVolume(solidScoringTrackerShell,
0211 vacuum,
0212 "logicScoringTrackerShell",
0213 0,
0214 0,
0215
0216 0);
0217 fPhysiScoringTrackerShell = new G4PVPlacement(0,
0218 G4ThreeVector(),
0219 "physiScoringTrackerShell",
0220 fLogicScoringTrackerShell,
0221 fExperimentalHall_phys,
0222
0223 false,
0224
0225 0);
0226
0227
0228 G4Sphere* solidEmCaloShell = new G4Sphere("solidEmCaloShell",
0229 fInnerRadiusEmCalo,
0230 fOuterRadiusEmCalo,
0231 0.0,
0232
0233 2.0 * CLHEP::pi,
0234
0235 0.0,
0236
0237 CLHEP::pi);
0238
0239 fLogicEmCaloShell = new G4LogicalVolume(solidEmCaloShell,
0240 fMaterialEmCalo,
0241 "logicEmCaloShell",
0242 0,
0243 0,
0244 0);
0245 fPhysiEmCaloShell = new G4PVPlacement(0,
0246 G4ThreeVector(),
0247 "physiEmCaloShell",
0248 fLogicEmCaloShell,
0249 fExperimentalHall_phys,
0250 false,
0251 0);
0252
0253
0254 G4Sphere* solidScoringEmCaloShell =
0255 new G4Sphere("solidScoringEmCaloShell",
0256 fOuterRadiusEmCalo,
0257 fOuterRadiusEmCalo + fScoringThickness,
0258 0.0,
0259
0260 2.0 * CLHEP::pi,
0261
0262 0.0,
0263
0264 CLHEP::pi);
0265
0266 fLogicScoringEmCaloShell = new G4LogicalVolume(solidScoringEmCaloShell,
0267 vacuum,
0268 "logicScoringEmCaloShell",
0269 0,
0270 0,
0271
0272 0);
0273 fPhysiScoringEmCaloShell = new G4PVPlacement(0,
0274 G4ThreeVector(),
0275 "physiScoringEmCaloShell",
0276 fLogicScoringEmCaloShell,
0277 fExperimentalHall_phys,
0278
0279 false,
0280 0);
0281
0282
0283 G4Sphere* solidHadCaloShell = new G4Sphere("solidHadCaloShell",
0284 fInnerRadiusHadCalo,
0285 fOuterRadiusHadCalo,
0286 0.0,
0287
0288 2.0 * CLHEP::pi,
0289
0290 0.0,
0291
0292 CLHEP::pi);
0293
0294 fLogicHadCaloShell = new G4LogicalVolume(solidHadCaloShell,
0295 fMaterialHadCalo,
0296 "logicHadCaloShell",
0297 0,
0298 0,
0299 0);
0300 fPhysiHadCaloShell = new G4PVPlacement(0,
0301 G4ThreeVector(),
0302 "physiHadCaloShell",
0303 fLogicHadCaloShell,
0304 fExperimentalHall_phys,
0305 false,
0306 0);
0307
0308
0309 G4Sphere* solidScoringHadCaloShell =
0310 new G4Sphere("solidScoringHadCaloShell",
0311 fOuterRadiusHadCalo,
0312 fOuterRadiusHadCalo + fScoringThickness,
0313 0.0,
0314
0315 2.0 * CLHEP::pi,
0316
0317 0.0,
0318
0319 CLHEP::pi);
0320
0321 fLogicScoringHadCaloShell = new G4LogicalVolume(solidScoringHadCaloShell,
0322 vacuum,
0323 "logicScoringHadCaloShell",
0324 0,
0325 0,
0326
0327 0);
0328 fPhysiScoringHadCaloShell = new G4PVPlacement(0,
0329 G4ThreeVector(),
0330 "physiScoringHadCaloShell",
0331 fLogicScoringHadCaloShell,
0332 fExperimentalHall_phys,
0333
0334 false,
0335
0336 0);
0337
0338 G4cout << "DetectorConstruction::ConstructSphere() : " << G4endl
0339 << "\t World (box) size: " << G4endl << "\t \t x : -/+ " << expHall_x << " mm ;"
0340 << "\t y : -/+ " << expHall_y << " mm ;"
0341 << "\t z : -/+ " << expHall_z << " mm ;" << G4endl << G4endl;
0342 PrintParameters();
0343
0344
0345 return fExperimentalHall_phys;
0346 }
0347
0348
0349
0350 void DetectorConstruction::SetMaterialTracker(const G4String name)
0351 {
0352 fMaterialTracker = G4NistManager::Instance()->FindOrBuildMaterial(name);
0353 if (!fMaterialTracker) {
0354 G4cout << G4endl << G4endl << "WARNING: the name of the material has not been recognized!"
0355 << G4endl << " ===> the default * G4_Si * will be used." << G4endl << G4endl;
0356 fMaterialTracker = G4NistManager::Instance()->FindOrBuildMaterial("G4_Si");
0357 }
0358 if (fLogicTrackerShell) fLogicTrackerShell->SetMaterial(fMaterialTracker);
0359 }
0360
0361
0362
0363 void DetectorConstruction::SetMaterialEmCalo(const G4String name)
0364 {
0365 fMaterialEmCalo = G4NistManager::Instance()->FindOrBuildMaterial(name);
0366 if (!fMaterialEmCalo) {
0367 G4cout << G4endl << G4endl << "WARNING: the name of the material has not been recognized!"
0368 << G4endl << " ===> the default * G4_Pb * will be used." << G4endl << G4endl;
0369 fMaterialEmCalo = G4NistManager::Instance()->FindOrBuildMaterial("G4_Pb");
0370 }
0371 if (fLogicEmCaloShell) fLogicEmCaloShell->SetMaterial(fMaterialEmCalo);
0372 }
0373
0374
0375
0376 void DetectorConstruction::SetMaterialHadCalo(const G4String name)
0377 {
0378 fMaterialHadCalo = G4NistManager::Instance()->FindOrBuildMaterial(name);
0379 if (fMaterialHadCalo == nullptr) {
0380 G4cout << G4endl << G4endl << "WARNING: the name of the material has not been recognized!"
0381 << G4endl << " ===> the default * G4_Fe * will be used." << G4endl << G4endl;
0382 fMaterialHadCalo = G4NistManager::Instance()->FindOrBuildMaterial("G4_Fe");
0383 }
0384 if (fLogicHadCaloShell) fLogicHadCaloShell->SetMaterial(fMaterialHadCalo);
0385 }
0386
0387
0388
0389 void DetectorConstruction::UpdateGeometry()
0390 {
0391
0392 G4RunManager::GetRunManager()->ReinitializeGeometry();
0393 PrintParameters();
0394
0395 const PrimaryGeneratorAction* pPrimaryAction = dynamic_cast<const PrimaryGeneratorAction*>(
0396 G4RunManager::GetRunManager()->GetUserPrimaryGeneratorAction());
0397 if (pPrimaryAction) pPrimaryAction->SetGunPosition();
0398
0399 }
0400
0401
0402
0403 void DetectorConstruction::PrintParameters()
0404 {
0405 G4cout << G4endl << " ------ DetectorConstruction::PrintParameters() ------ " << G4endl
0406 << " MaterialTracker = " << fMaterialTracker->GetName() << G4endl
0407 << " MaterialEmCalo = " << fMaterialEmCalo->GetName() << G4endl
0408 << " MaterialHadCalo = " << fMaterialHadCalo->GetName() << G4endl
0409 << " InnerRadiusTracker = " << fInnerRadiusTracker << " mm" << G4endl
0410 << " OuterRadiusTracker = " << fOuterRadiusTracker << " mm" << G4endl
0411 << " InnerRadiusEmCalo = " << fInnerRadiusEmCalo << " mm" << G4endl
0412 << " OuterRadiusEmCalo = " << fOuterRadiusEmCalo << " mm" << G4endl
0413 << " InnerRadiusHadCalo = " << fInnerRadiusHadCalo << " mm" << G4endl
0414 << " OuterRadiusHadCalo = " << fOuterRadiusHadCalo << " mm" << G4endl
0415 << " ScoringThickness = " << fScoringThickness << " mm" << G4endl
0416 << " -------------------------------------------------------- " << G4endl << G4endl;
0417 }
0418
0419