File indexing completed on 2026-04-05 07:50:47
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 "ExP01DetectorConstruction.hh"
0030
0031 #include "ExP01ChamberParameterisation.hh"
0032 #include "ExP01DetectorMessenger.hh"
0033 #include "ExP01MagneticField.hh"
0034 #include "ExP01TrackerSD.hh"
0035
0036 #include "G4Box.hh"
0037 #include "G4Colour.hh"
0038 #include "G4LogicalVolume.hh"
0039 #include "G4Material.hh"
0040 #include "G4PVParameterised.hh"
0041 #include "G4PVPlacement.hh"
0042 #include "G4SDManager.hh"
0043 #include "G4SystemOfUnits.hh"
0044 #include "G4UserLimits.hh"
0045 #include "G4VisAttributes.hh"
0046 #include "G4ios.hh"
0047
0048
0049
0050 ExP01DetectorConstruction::ExP01DetectorConstruction()
0051 : G4VUserDetectorConstruction(),
0052 fSolidWorld(0),
0053 fLogicWorld(0),
0054 fPhysiWorld(0),
0055 fSolidTarget(0),
0056 fLogicTarget(0),
0057 fPhysiTarget(0),
0058 fSolidTracker(0),
0059 fLogicTracker(0),
0060 fPhysiTracker(0),
0061 fSolidChamber(0),
0062 fLogicChamber(0),
0063 fPhysiChamber(0),
0064 fTargetMater(0),
0065 fChamberMater(0),
0066 fPMagField(0),
0067 fDetectorMessenger(0),
0068 fWorldLength(0.),
0069 fTargetLength(0.),
0070 fTrackerLength(0.),
0071 fNbOfChambers(0),
0072 fChamberWidth(0.),
0073 fChamberSpacing(0.)
0074 {
0075 fPMagField = new ExP01MagneticField();
0076 fDetectorMessenger = new ExP01DetectorMessenger(this);
0077 }
0078
0079
0080
0081 ExP01DetectorConstruction::~ExP01DetectorConstruction()
0082 {
0083 delete fPMagField;
0084 delete fDetectorMessenger;
0085 }
0086
0087
0088
0089 G4VPhysicalVolume* ExP01DetectorConstruction::Construct()
0090 {
0091
0092
0093 G4double a, z;
0094 G4double density, temperature, pressure;
0095 G4int nel;
0096
0097
0098 G4Element* N = new G4Element("Nitrogen", "N", z = 7., a = 14.01 * g / mole);
0099 G4Element* O = new G4Element("Oxygen", "O", z = 8., a = 16.00 * g / mole);
0100
0101 G4Material* Air = new G4Material("Air", density = 1.29 * mg / cm3, nel = 2);
0102 Air->AddElement(N, 70 * perCent);
0103 Air->AddElement(O, 30 * perCent);
0104
0105
0106 G4Material* Pb =
0107 new G4Material("Lead", z = 82., a = 207.19 * g / mole, density = 11.35 * g / cm3);
0108
0109
0110 G4Material* Xenon =
0111 new G4Material("XenonGas", z = 54., a = 131.29 * g / mole, density = 5.458 * mg / cm3,
0112 kStateGas, temperature = 293.15 * kelvin, pressure = 1 * atmosphere);
0113
0114
0115
0116 G4cout << G4endl << "The materials defined are : " << G4endl << G4endl;
0117 G4cout << *(G4Material::GetMaterialTable()) << G4endl;
0118
0119
0120
0121 fNbOfChambers = 5;
0122 fChamberWidth = 20 * cm;
0123 fChamberSpacing = 80 * cm;
0124
0125 fTrackerLength = (fNbOfChambers + 1) * fChamberSpacing;
0126 fTargetLength = 5.0 * cm;
0127
0128 fTargetMater = Pb;
0129 fChamberMater = Xenon;
0130
0131 fWorldLength = 1.2 * (fTargetLength + fTrackerLength);
0132
0133 G4double targetSize = 0.5 * fTargetLength;
0134 G4double trackerSize = 0.5 * fTrackerLength;
0135
0136
0137
0138
0139
0140
0141
0142 G4double HalfWorldLength = 0.5 * fWorldLength;
0143
0144 fSolidWorld = new G4Box("world", HalfWorldLength, HalfWorldLength, HalfWorldLength);
0145 fLogicWorld = new G4LogicalVolume(fSolidWorld, Air, "World", 0, 0, 0);
0146
0147
0148
0149 fPhysiWorld = new G4PVPlacement(0,
0150 G4ThreeVector(),
0151 fLogicWorld,
0152 "World",
0153 0,
0154 false,
0155 0);
0156
0157
0158
0159
0160
0161 G4ThreeVector positionTarget = G4ThreeVector(0, 0, -(targetSize + trackerSize));
0162
0163 fSolidTarget = new G4Box("target", targetSize, targetSize, targetSize);
0164 fLogicTarget = new G4LogicalVolume(fSolidTarget, fTargetMater, "Target", 0, 0, 0);
0165 fPhysiTarget = new G4PVPlacement(0,
0166 positionTarget,
0167 fLogicTarget,
0168 "Target",
0169 fLogicWorld,
0170 false,
0171 0);
0172
0173 G4cout << "Target is " << fTargetLength / cm << " cm of " << fTargetMater->GetName() << G4endl;
0174
0175
0176
0177
0178
0179 G4ThreeVector positionTracker = G4ThreeVector(0, 0, 0);
0180
0181 fSolidTracker = new G4Box("tracker", trackerSize, trackerSize, trackerSize);
0182 fLogicTracker = new G4LogicalVolume(fSolidTracker, Air, "Tracker", 0, 0, 0);
0183 fPhysiTracker = new G4PVPlacement(0,
0184 positionTracker,
0185 fLogicTracker,
0186 "Tracker",
0187 fLogicWorld,
0188 false,
0189 0);
0190
0191
0192
0193
0194
0195
0196
0197
0198 fSolidChamber = new G4Box("chamber", 100 * cm, 100 * cm, 10 * cm);
0199 fLogicChamber = new G4LogicalVolume(fSolidChamber, fChamberMater, "Chamber", 0, 0, 0);
0200
0201 G4double firstPosition = -trackerSize + 0.5 * fChamberWidth;
0202 G4double firstLength = fTrackerLength / 10;
0203 G4double lastLength = fTrackerLength;
0204
0205 G4VPVParameterisation* chamberParam =
0206 new ExP01ChamberParameterisation(fNbOfChambers,
0207 firstPosition,
0208 fChamberSpacing,
0209 fChamberWidth,
0210 firstLength,
0211 lastLength);
0212
0213
0214
0215 fPhysiChamber = new G4PVParameterised("Chamber",
0216 fLogicChamber,
0217 fLogicTracker,
0218 kZAxis,
0219 fNbOfChambers,
0220 chamberParam);
0221
0222 G4cout << "There are " << fNbOfChambers << " chambers in the tracker region. "
0223 << "The chambers are " << fChamberWidth / mm << " mm of " << fChamberMater->GetName()
0224 << "\n The distance between chamber is " << fChamberSpacing / cm << " cm" << G4endl;
0225
0226
0227
0228
0229
0230 G4SDManager* SDman = G4SDManager::GetSDMpointer();
0231
0232 G4String trackerChamberSDname = "ExP01/TrackerChamberSD";
0233 ExP01TrackerSD* aTrackerSD = new ExP01TrackerSD(trackerChamberSDname);
0234 SDman->AddNewDetector(aTrackerSD);
0235 fLogicChamber->SetSensitiveDetector(aTrackerSD);
0236
0237
0238
0239 G4VisAttributes* BoxVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 1.0));
0240 fLogicWorld->SetVisAttributes(BoxVisAtt);
0241 fLogicTarget->SetVisAttributes(BoxVisAtt);
0242 fLogicTracker->SetVisAttributes(BoxVisAtt);
0243
0244 G4VisAttributes* ChamberVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 0.0));
0245 fLogicChamber->SetVisAttributes(ChamberVisAtt);
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255 G4double maxStep = 0.5 * fChamberWidth;
0256 fLogicTracker->SetUserLimits(new G4UserLimits(maxStep));
0257
0258
0259
0260
0261
0262
0263
0264 return fPhysiWorld;
0265 }
0266
0267
0268
0269 void ExP01DetectorConstruction::SetTargetMaterial(G4String materialName)
0270 {
0271
0272 G4Material* pttoMaterial = G4Material::GetMaterial(materialName);
0273 if (pttoMaterial) {
0274 fTargetMater = pttoMaterial;
0275 fLogicTarget->SetMaterial(pttoMaterial);
0276 G4cout << "\n----> The target is " << fTargetLength / cm << " cm of " << materialName << G4endl;
0277 }
0278 }
0279
0280
0281
0282 void ExP01DetectorConstruction::SetChamberMaterial(G4String materialName)
0283 {
0284
0285 G4Material* pttoMaterial = G4Material::GetMaterial(materialName);
0286 if (pttoMaterial) {
0287 fChamberMater = pttoMaterial;
0288 fLogicChamber->SetMaterial(pttoMaterial);
0289 G4cout << "\n----> The chambers are " << fChamberWidth / cm << " cm of " << materialName
0290 << G4endl;
0291 }
0292 }
0293
0294
0295
0296 void ExP01DetectorConstruction::SetMagField(G4double fieldValue)
0297 {
0298 fPMagField->SetFieldValue(fieldValue);
0299 }
0300
0301