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