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