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