File indexing completed on 2025-02-23 09:20:48
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
0035
0036
0037 #include "DetectorConstruction.hh"
0038
0039 #include "DetectorMessenger.hh"
0040
0041 #include "G4Box.hh"
0042 #include "G4GeometryManager.hh"
0043 #include "G4LogicalVolume.hh"
0044 #include "G4LogicalVolumeStore.hh"
0045 #include "G4Material.hh"
0046 #include "G4NistManager.hh"
0047 #include "G4PVPlacement.hh"
0048 #include "G4PhysicalVolumeStore.hh"
0049 #include "G4SolidStore.hh"
0050 #include "G4SystemOfUnits.hh"
0051 #include "G4UnitsTable.hh"
0052
0053
0054
0055 DetectorConstruction::DetectorConstruction()
0056 {
0057 fBoxSize = 1 * mm;
0058 DefineMaterials();
0059 SetMaterial("Germanium");
0060 fDetectorMessenger = new DetectorMessenger(this);
0061 }
0062
0063
0064
0065 DetectorConstruction::~DetectorConstruction()
0066 {
0067 delete fDetectorMessenger;
0068 }
0069
0070
0071
0072 void DetectorConstruction::DefineMaterials()
0073 {
0074
0075
0076
0077 G4double z, a;
0078
0079 G4Element* H = new G4Element("Hydrogen", "H", z = 1., a = 1.01 * g / mole);
0080 G4Element* C = new G4Element("Carbon", "C", z = 6., a = 12.01 * g / mole);
0081 G4Element* N = new G4Element("Nitrogen", "N", z = 7., a = 14.01 * g / mole);
0082 G4Element* O = new G4Element("Oxygen", "O", z = 8., a = 16.00 * g / mole);
0083 G4Element* Ge = new G4Element("Germanium", "Ge", z = 32., a = 72.59 * g / mole);
0084 G4Element* Pb = new G4Element("Lead", "Pb", z = 82., a = 207.19 * g / mole);
0085 G4Element* Bi = new G4Element("Bismuth", "Bi", z = 83., a = 208.98 * g / mole);
0086
0087
0088
0089
0090 G4double density;
0091 G4int ncomponents, natoms;
0092 G4double fractionmass;
0093
0094 G4Material* Air = new G4Material("Air", density = 1.290 * mg / cm3, ncomponents = 2);
0095 Air->AddElement(N, fractionmass = 70. * perCent);
0096 Air->AddElement(O, fractionmass = 30. * perCent);
0097
0098 G4Material* H2l = new G4Material("H2liquid", density = 70.8 * mg / cm3, ncomponents = 1);
0099 H2l->AddElement(H, fractionmass = 1.);
0100
0101 G4Material* H2O = new G4Material("Water", density = 1.000 * g / cm3, ncomponents = 2);
0102 H2O->AddElement(H, natoms = 2);
0103 H2O->AddElement(O, natoms = 1);
0104
0105 H2O->GetIonisation()->SetMeanExcitationEnergy(78.0 * eV);
0106
0107 G4Material* steam = new G4Material("WaterSteam", density = 1.0 * mg / cm3, ncomponents = 1);
0108 steam->AddMaterial(H2O, fractionmass = 1.);
0109 steam->GetIonisation()->SetMeanExcitationEnergy(71.6 * eV);
0110
0111 G4Material* BGO = new G4Material("BGO", density = 7.10 * g / cm3, ncomponents = 3);
0112 BGO->AddElement(O, natoms = 12);
0113 BGO->AddElement(Ge, natoms = 3);
0114 BGO->AddElement(Bi, natoms = 4);
0115
0116 new G4Material("Aluminium", z = 13., a = 26.98 * g / mole, density = 2.700 * g / cm3);
0117 new G4Material("Silicon", z = 14., a = 28.09 * g / mole, density = 2.330 * g / cm3);
0118 new G4Material("liquidArgon", z = 18., a = 39.95 * g / mole, density = 1.390 * g / cm3);
0119 new G4Material("Iron", z = 26., a = 55.85 * g / mole, density = 7.870 * g / cm3);
0120 new G4Material("Copper", z = 29., a = 63.55 * g / mole, density = 8.960 * g / cm3);
0121 new G4Material("Germanium", z = 32., a = 72.61 * g / mole, density = 5.323 * g / cm3);
0122 new G4Material("Silver", z = 47., a = 107.87 * g / mole, density = 10.50 * g / cm3);
0123 new G4Material("Tungsten", z = 74., a = 183.85 * g / mole, density = 19.30 * g / cm3);
0124 new G4Material("Lead", z = 82., a = 207.19 * g / mole, density = 11.35 * g / cm3);
0125 new G4Material("Uranium", z = 92., a = 238.03 * g / mole, density = 18.95 * g / cm3);
0126
0127 G4Material* ams = new G4Material("ams", density = 7.409 * g / cm3, ncomponents = 3);
0128 ams->AddElement(Pb, fractionmass = 94.81 * perCent);
0129 ams->AddElement(C, fractionmass = 4.79 * perCent);
0130 ams->AddElement(H, fractionmass = 0.40 * perCent);
0131
0132 G4Material* argonGas =
0133 new G4Material("ArgonGas", z = 18, a = 39.948 * g / mole, density = 1.782 * mg / cm3, kStateGas,
0134 273.15 * kelvin, 1 * atmosphere);
0135
0136 G4Material* butane = new G4Material("Isobutane", density = 2.42 * mg / cm3, ncomponents = 2,
0137 kStateGas, 273.15 * kelvin, 1 * atmosphere);
0138 butane->AddElement(C, natoms = 4);
0139 butane->AddElement(H, natoms = 10);
0140
0141 G4Material* ArButane = new G4Material("ArgonButane", density = 1.835 * mg / cm3, ncomponents = 2,
0142 kStateGas, 273.15 * kelvin, 1. * atmosphere);
0143 ArButane->AddMaterial(argonGas, fractionmass = 70 * perCent);
0144 ArButane->AddMaterial(butane, fractionmass = 30 * perCent);
0145
0146
0147
0148 G4Element* Xe = new G4Element("Xenon", "Xe", z = 54., a = 131.29 * g / mole);
0149
0150
0151 G4double temperature0 = 293.15 * kelvin;
0152 G4double pressure0 = 1 * atmosphere;
0153 G4double density0 = 2.953 * mg / cm3;
0154 G4Material* matXe0 =
0155 new G4Material("XenonGas0", density0, ncomponents = 1, kStateGas, temperature0, pressure0);
0156 matXe0->AddElement(Xe, natoms = 1);
0157
0158
0159 G4double temperature1 = 293.15 * kelvin;
0160 G4double pressure1 = 50 * atmosphere;
0161 G4double density1 = density0 * (pressure1 / pressure0) * (temperature0 / temperature1);
0162 G4Material* matXe1 =
0163 new G4Material("XenonGas1", density1, ncomponents = 1, kStateGas, temperature1, pressure1);
0164 matXe1->AddElement(Xe, natoms = 1);
0165
0166
0167 }
0168
0169
0170
0171 G4VPhysicalVolume* DetectorConstruction::Construct()
0172 {
0173
0174 if (fBox) {
0175 return fBox;
0176 }
0177
0178 G4Box* sBox = new G4Box("Container",
0179 fBoxSize / 2, fBoxSize / 2, fBoxSize / 2);
0180
0181 G4LogicalVolume* lBox = new G4LogicalVolume(sBox,
0182 fMaterial,
0183 fMaterial->GetName());
0184
0185 fBox = new G4PVPlacement(0,
0186 G4ThreeVector(0., 0., 0.),
0187 lBox,
0188 fMaterial->GetName(),
0189 0,
0190 false,
0191 0);
0192
0193
0194
0195 return fBox;
0196 }
0197
0198
0199
0200 void DetectorConstruction::PrintParameters() const
0201 {
0202 G4cout << "\n The Box is " << G4BestUnit(fBoxSize, "Length") << " of " << fMaterial->GetName()
0203 << G4endl;
0204 }
0205
0206
0207
0208 #include "G4RunManager.hh"
0209
0210 void DetectorConstruction::SetMaterial(const G4String& materialChoice)
0211 {
0212
0213 G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
0214
0215 if (pttoMaterial) {
0216 fMaterial = pttoMaterial;
0217 if (fBox) {
0218 fBox->GetLogicalVolume()->SetMaterial(fMaterial);
0219 }
0220 G4RunManager::GetRunManager()->PhysicsHasBeenModified();
0221 G4cout << "\n " << fMaterial << G4endl;
0222 }
0223 else {
0224 G4cout << "\n--> warning from DetectorConstruction::SetMaterial : " << materialChoice
0225 << " not found" << G4endl;
0226 }
0227 }
0228
0229