File indexing completed on 2025-02-23 09:20: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
0030
0031
0032
0033 #include "DetectorConstruction.hh"
0034
0035 #include "DetectorMessenger.hh"
0036
0037 #include "G4Box.hh"
0038 #include "G4GeometryManager.hh"
0039 #include "G4LogicalVolume.hh"
0040 #include "G4LogicalVolumeStore.hh"
0041 #include "G4Material.hh"
0042 #include "G4NistManager.hh"
0043 #include "G4PVPlacement.hh"
0044 #include "G4PhysicalVolumeStore.hh"
0045 #include "G4RunManager.hh"
0046 #include "G4SolidStore.hh"
0047 #include "G4SystemOfUnits.hh"
0048 #include "G4UnitsTable.hh"
0049
0050
0051
0052 DetectorConstruction::DetectorConstruction()
0053 {
0054 fBoxSize = 1 * cm;
0055 DefineMaterials();
0056 SetMaterial("Water");
0057 fDetectorMessenger = new DetectorMessenger(this);
0058 }
0059
0060
0061
0062 DetectorConstruction::~DetectorConstruction()
0063 {
0064 delete fDetectorMessenger;
0065 }
0066
0067
0068
0069 G4VPhysicalVolume* DetectorConstruction::Construct()
0070 {
0071 return ConstructVolumes();
0072 }
0073
0074
0075
0076 void DetectorConstruction::DefineMaterials()
0077 {
0078
0079
0080
0081 G4double z, a;
0082
0083 G4Element* H = new G4Element("Hydrogen", "H", z = 1., a = 1.01 * g / mole);
0084 G4Element* N = new G4Element("Nitrogen", "N", z = 7., a = 14.01 * g / mole);
0085 G4Element* O = new G4Element("Oxygen", "O", z = 8., a = 16.00 * g / mole);
0086 G4Element* Na = new G4Element("Sodium", "Na", z = 11., a = 22.99 * g / mole);
0087 G4Element* Ge = new G4Element("Germanium", "Ge", z = 32., a = 72.59 * g / mole);
0088 G4Element* I = new G4Element("Iodine", "I", z = 53., a = 126.90 * g / mole);
0089 G4Element* Bi = new G4Element("Bismuth", "Bi", z = 83., a = 208.98 * g / mole);
0090
0091
0092
0093
0094 G4double density;
0095 G4int ncomponents, natoms;
0096 G4double fractionmass;
0097
0098 G4Material* Air = new G4Material("Air", density = 1.290 * mg / cm3, ncomponents = 2);
0099 Air->AddElement(N, fractionmass = 70. * perCent);
0100 Air->AddElement(O, fractionmass = 30. * perCent);
0101
0102 G4Material* H2l = new G4Material("H2liquid", density = 70.8 * mg / cm3, ncomponents = 1);
0103 H2l->AddElement(H, fractionmass = 1.);
0104
0105 G4Material* H2O = new G4Material("Water", density = 1.000 * g / cm3, ncomponents = 2);
0106 H2O->AddElement(H, natoms = 2);
0107 H2O->AddElement(O, natoms = 1);
0108 H2O->SetChemicalFormula("H_2O");
0109 H2O->GetIonisation()->SetMeanExcitationEnergy(78.0 * eV);
0110
0111 new G4Material("liquidArgon", z = 18., a = 39.95 * g / mole, density = 1.390 * g / cm3);
0112
0113 new G4Material("Carbon", z = 6., a = 12.01 * g / mole, density = 2.267 * g / cm3);
0114
0115 new G4Material("Aluminium", z = 13., a = 26.98 * g / mole, density = 2.700 * g / cm3);
0116
0117 new G4Material("Silicon", z = 14., a = 28.09 * g / mole, density = 2.330 * g / cm3);
0118
0119 new G4Material("Germanium", z = 32., a = 72.61 * g / mole, density = 5.323 * g / cm3);
0120
0121 G4Material* NaI = new G4Material("NaI", density = 3.67 * g / cm3, ncomponents = 2);
0122 NaI->AddElement(Na, natoms = 1);
0123 NaI->AddElement(I, natoms = 1);
0124 NaI->GetIonisation()->SetMeanExcitationEnergy(452 * eV);
0125
0126 G4Material* Iod = new G4Material("Iodine", density = 4.93 * g / cm3, ncomponents = 1);
0127 Iod->AddElement(I, natoms = 1);
0128
0129 G4Material* BGO = new G4Material("BGO", density = 7.10 * g / cm3, ncomponents = 3);
0130 BGO->AddElement(O, natoms = 12);
0131 BGO->AddElement(Ge, natoms = 3);
0132 BGO->AddElement(Bi, natoms = 4);
0133
0134 new G4Material("Iron", z = 26., a = 55.85 * g / mole, density = 7.870 * g / cm3);
0135
0136 new G4Material("Tungsten", z = 74., a = 183.85 * g / mole, density = 19.30 * g / cm3);
0137
0138 new G4Material("Lead", z = 82., a = 207.19 * g / mole, density = 11.35 * g / cm3);
0139
0140 new G4Material("Uranium", z = 92., a = 238.03 * g / mole, density = 18.95 * g / cm3);
0141
0142
0143 }
0144
0145
0146
0147 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes()
0148 {
0149
0150 G4GeometryManager::GetInstance()->OpenGeometry();
0151 G4PhysicalVolumeStore::GetInstance()->Clean();
0152 G4LogicalVolumeStore::GetInstance()->Clean();
0153 G4SolidStore::GetInstance()->Clean();
0154
0155 G4Box* sBox = new G4Box("Container",
0156 fBoxSize / 2, fBoxSize / 2, fBoxSize / 2);
0157
0158 fLBox = new G4LogicalVolume(sBox,
0159 fMaterial,
0160 fMaterial->GetName());
0161
0162 fPBox = new G4PVPlacement(0,
0163 G4ThreeVector(),
0164 fLBox,
0165 fMaterial->GetName(),
0166 0,
0167 false,
0168 0);
0169
0170 PrintParameters();
0171
0172
0173
0174 return fPBox;
0175 }
0176
0177
0178
0179 void DetectorConstruction::PrintParameters()
0180 {
0181 G4cout << "\n The Box is " << G4BestUnit(fBoxSize, "Length") << " of " << fMaterial->GetName()
0182 << G4endl;
0183 G4cout << "\n" << fMaterial << G4endl;
0184 }
0185
0186
0187
0188 void DetectorConstruction::SetMaterial(G4String materialChoice)
0189 {
0190
0191 G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
0192
0193 if (pttoMaterial) {
0194 fMaterial = pttoMaterial;
0195 G4RunManager::GetRunManager()->PhysicsHasBeenModified();
0196 }
0197 else {
0198 G4cout << "\n--> warning from DetectorConstruction::SetMaterial : " << materialChoice
0199 << " not found" << G4endl;
0200 }
0201 }
0202
0203
0204
0205 void DetectorConstruction::SetSize(G4double value)
0206 {
0207 fBoxSize = value;
0208 G4RunManager::GetRunManager()->ReinitializeGeometry();
0209 }
0210
0211