File indexing completed on 2025-02-23 09:20:56
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 = 1 * cm;
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
0086
0087
0088
0089 G4double density;
0090 G4int ncomponents, natoms;
0091 G4double fractionmass;
0092
0093 G4Material* Air = new G4Material("Air", density = 1.290 * mg / cm3, ncomponents = 2);
0094 Air->AddElement(N, fractionmass = 70. * perCent);
0095 Air->AddElement(O, fractionmass = 30. * perCent);
0096
0097 G4Material* H2O = new G4Material("Water", density = 1.000 * g / cm3, ncomponents = 2);
0098 H2O->AddElement(H, natoms = 2);
0099 H2O->AddElement(O, natoms = 1);
0100 H2O->GetIonisation()->SetMeanExcitationEnergy(78.0 * eV);
0101
0102 G4Material* vapor = new G4Material("Water_vapor", density = 1.000 * mg / cm3, ncomponents = 2);
0103 vapor->AddElement(H, natoms = 2);
0104 vapor->AddElement(O, natoms = 1);
0105 vapor->GetIonisation()->SetMeanExcitationEnergy(78.0 * eV);
0106
0107 new G4Material("Carbon", z = 6., a = 12.01 * g / mole, density = 2.267 * g / cm3);
0108 new G4Material("Aluminium", z = 13., a = 26.98 * g / mole, density = 2.700 * g / cm3);
0109 new G4Material("Silicon", z = 14., a = 28.09 * g / mole, density = 2.330 * g / cm3);
0110 new G4Material("liquidArgon", z = 18., a = 39.95 * g / mole, density = 1.390 * g / cm3);
0111 new G4Material("Iron", z = 26., a = 55.85 * g / mole, density = 7.870 * g / cm3);
0112 new G4Material("Germanium", z = 32., a = 72.61 * g / mole, density = 5.323 * g / cm3);
0113 new G4Material("Tungsten", z = 74., a = 183.85 * g / mole, density = 19.30 * g / cm3);
0114 new G4Material("Lead", z = 82., a = 207.19 * g / mole, density = 11.35 * g / cm3);
0115
0116 new G4Material("ArgonGas", z = 18., a = 39.948 * g / mole, density = 1.782 * mg / cm3, kStateGas,
0117 273.15 * kelvin, 1 * atmosphere);
0118
0119
0120 }
0121
0122
0123
0124 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes()
0125 {
0126
0127 G4GeometryManager::GetInstance()->OpenGeometry();
0128 G4PhysicalVolumeStore::GetInstance()->Clean();
0129 G4LogicalVolumeStore::GetInstance()->Clean();
0130 G4SolidStore::GetInstance()->Clean();
0131
0132 G4Box* sBox = new G4Box("Container",
0133 fBoxSize / 2, fBoxSize / 2, fBoxSize / 2);
0134
0135 fLBox = new G4LogicalVolume(sBox,
0136 fMaterial,
0137 fMaterial->GetName());
0138
0139 fPBox = new G4PVPlacement(0,
0140 G4ThreeVector(),
0141 fLBox,
0142 fMaterial->GetName(),
0143 0,
0144 false,
0145 0);
0146
0147 PrintParameters();
0148
0149
0150
0151 return fPBox;
0152 }
0153
0154
0155
0156 void DetectorConstruction::PrintParameters()
0157 {
0158 G4cout << "\n The Box is " << G4BestUnit(fBoxSize, "Length") << " of " << fMaterial->GetName()
0159 << "\n " << fMaterial << G4endl;
0160 }
0161
0162
0163
0164 void DetectorConstruction::SetMaterial(const G4String& name)
0165 {
0166
0167 G4Material* mat = G4Material::GetMaterial(name, false);
0168
0169
0170 if (!mat) {
0171 mat = G4NistManager::Instance()->FindOrBuildMaterial(name);
0172 }
0173
0174 if (mat && mat != fMaterial) {
0175 G4cout << "### New material " << mat->GetName() << G4endl;
0176 fMaterial = mat;
0177 UpdateGeometry();
0178 }
0179
0180 if (!mat) {
0181 G4cout << "\n--> warning from DetectorConstruction::SetMaterial : " << name << " not found"
0182 << G4endl;
0183 }
0184 }
0185
0186
0187
0188 void DetectorConstruction::SetSize(G4double value)
0189 {
0190 fBoxSize = value;
0191 UpdateGeometry();
0192 }
0193
0194
0195
0196 #include "G4RunManager.hh"
0197
0198 void DetectorConstruction::UpdateGeometry()
0199 {
0200 G4RunManager::GetRunManager()->GeometryHasBeenModified();
0201 }
0202
0203