File indexing completed on 2025-02-23 09:20:54
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 "G4PhysicalConstants.hh"
0045 #include "G4PhysicalVolumeStore.hh"
0046 #include "G4SolidStore.hh"
0047 #include "G4SystemOfUnits.hh"
0048 #include "G4UnitsTable.hh"
0049
0050
0051
0052 DetectorConstruction::DetectorConstruction()
0053 : G4VUserDetectorConstruction(),
0054 fWorld(0),
0055 fBox(0),
0056 fMaterial(0),
0057 fWMaterial(0),
0058 fDetectorMessenger(0)
0059 {
0060 fBoxSize = 100 * m;
0061 fWorldSize = 1.2 * fBoxSize;
0062 DefineMaterials();
0063 SetMaterial("Water");
0064 fDetectorMessenger = new DetectorMessenger(this);
0065 }
0066
0067
0068
0069 DetectorConstruction::~DetectorConstruction()
0070 {
0071 delete fDetectorMessenger;
0072 }
0073
0074
0075
0076 G4VPhysicalVolume* DetectorConstruction::Construct()
0077 {
0078 return ConstructVolumes();
0079 }
0080
0081
0082
0083 void DetectorConstruction::DefineMaterials()
0084 {
0085
0086
0087
0088 G4double z, a;
0089
0090 G4Element* H = new G4Element("Hydrogen", "H", z = 1., a = 1.01 * g / mole);
0091 G4Element* N = new G4Element("Nitrogen", "N", z = 7., a = 14.01 * g / mole);
0092 G4Element* O = new G4Element("Oxygen", "O", z = 8., a = 16.00 * g / mole);
0093 G4Element* Na = new G4Element("Sodium", "Na", z = 11., a = 22.99 * g / mole);
0094 G4Element* Ge = new G4Element("Germanium", "Ge", z = 32., a = 72.59 * g / mole);
0095 G4Element* I = new G4Element("Iodine", "I", z = 53., a = 126.90 * g / mole);
0096 G4Element* Bi = new G4Element("Bismuth", "Bi", z = 83., a = 208.98 * g / mole);
0097
0098
0099
0100
0101 G4double density;
0102 G4int ncomponents, natoms;
0103 G4double fractionmass;
0104
0105 G4Material* Air = new G4Material("Air", density = 1.290 * mg / cm3, ncomponents = 2);
0106 Air->AddElement(N, fractionmass = 70. * perCent);
0107 Air->AddElement(O, fractionmass = 30. * perCent);
0108
0109 G4Material* H2l = new G4Material("H2liquid", density = 70.8 * mg / cm3, ncomponents = 1);
0110 H2l->AddElement(H, fractionmass = 1.);
0111
0112 G4Material* H2O = new G4Material("Water", density = 1.000 * g / cm3, ncomponents = 2);
0113 H2O->AddElement(H, natoms = 2);
0114 H2O->AddElement(O, natoms = 1);
0115 H2O->SetChemicalFormula("H_2O");
0116 H2O->GetIonisation()->SetMeanExcitationEnergy(75.0 * eV);
0117
0118 new G4Material("liquidArgon", z = 18., a = 39.95 * g / mole, density = 1.390 * g / cm3);
0119
0120 new G4Material("Carbon", z = 6., a = 12.01 * g / mole, density = 2.267 * g / cm3);
0121
0122 new G4Material("Aluminium", z = 13., a = 26.98 * g / mole, density = 2.700 * g / cm3);
0123
0124 new G4Material("Silicon", z = 14., a = 28.09 * g / mole, density = 2.330 * g / cm3);
0125
0126 new G4Material("Germanium", z = 32., a = 72.61 * g / mole, density = 5.323 * g / cm3);
0127
0128 G4Material* NaI = new G4Material("NaI", density = 3.67 * g / cm3, ncomponents = 2);
0129 NaI->AddElement(Na, natoms = 1);
0130 NaI->AddElement(I, natoms = 1);
0131 NaI->GetIonisation()->SetMeanExcitationEnergy(452 * eV);
0132
0133 G4Material* Iod = new G4Material("Iodine", density = 4.93 * g / cm3, ncomponents = 1);
0134 Iod->AddElement(I, natoms = 1);
0135
0136 G4Material* BGO = new G4Material("BGO", density = 7.10 * g / cm3, ncomponents = 3);
0137 BGO->AddElement(O, natoms = 12);
0138 BGO->AddElement(Ge, natoms = 3);
0139 BGO->AddElement(Bi, natoms = 4);
0140
0141 new G4Material("Iron", z = 26., a = 55.85 * g / mole, density = 7.870 * g / cm3);
0142
0143 new G4Material("Tungsten", z = 74., a = 183.85 * 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 density = universe_mean_density;
0150 G4double pressure = 3.e-18 * pascal;
0151 G4double temperature = 2.73 * kelvin;
0152 G4Material* vacuum = new G4Material("Galactic", z = 1, a = 1.008 * g / mole, density, kStateGas,
0153 temperature, pressure);
0154
0155 G4cout << *(G4Material::GetMaterialTable()) << G4endl;
0156
0157
0158 fWMaterial = vacuum;
0159 }
0160
0161
0162
0163 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes()
0164 {
0165
0166 G4GeometryManager::GetInstance()->OpenGeometry();
0167 G4PhysicalVolumeStore::GetInstance()->Clean();
0168 G4LogicalVolumeStore::GetInstance()->Clean();
0169 G4SolidStore::GetInstance()->Clean();
0170
0171
0172
0173 G4Box* sWorld = new G4Box("World",
0174 fWorldSize / 2, fWorldSize / 2, fWorldSize / 2);
0175
0176 G4LogicalVolume* lWorld = new G4LogicalVolume(sWorld,
0177 fWMaterial,
0178 "World");
0179
0180 fWorld = new G4PVPlacement(0,
0181 G4ThreeVector(),
0182 lWorld,
0183 "World",
0184 0,
0185 false,
0186 0);
0187
0188
0189
0190 G4Box* sBox = new G4Box("Container",
0191 fBoxSize / 2, fBoxSize / 2, fBoxSize / 2);
0192
0193 G4LogicalVolume* lBox = new G4LogicalVolume(sBox,
0194 fMaterial,
0195 fMaterial->GetName());
0196
0197 fBox = new G4PVPlacement(0,
0198 G4ThreeVector(),
0199 lBox,
0200 fMaterial->GetName(),
0201 lWorld,
0202 false,
0203 0);
0204
0205 PrintParameters();
0206
0207
0208
0209 return fWorld;
0210 }
0211
0212
0213
0214 void DetectorConstruction::PrintParameters()
0215 {
0216 G4cout << "\n The Box is " << G4BestUnit(fBoxSize, "Length") << " of " << fMaterial->GetName()
0217 << G4endl;
0218 }
0219
0220
0221
0222 void DetectorConstruction::SetMaterial(G4String materialChoice)
0223 {
0224
0225 G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
0226
0227 if (pttoMaterial) {
0228 fMaterial = pttoMaterial;
0229 UpdateGeometry();
0230 }
0231 else {
0232 G4cout << "\n--> warning from DetectorConstruction::SetMaterial : " << materialChoice
0233 << " not found" << G4endl;
0234 }
0235 }
0236
0237
0238
0239 void DetectorConstruction::SetSize(G4double value)
0240 {
0241 fBoxSize = value;
0242 fWorldSize = 1.2 * fBoxSize;
0243 UpdateGeometry();
0244 }
0245
0246
0247
0248 #include "G4RunManager.hh"
0249
0250 void DetectorConstruction::UpdateGeometry()
0251 {
0252 if (fWorld) G4RunManager::GetRunManager()->DefineWorldVolume(ConstructVolumes());
0253 }
0254
0255