File indexing completed on 2025-02-23 09:20:55
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 #include "DetectorConstruction.hh"
0035
0036 #include "DetectorMessenger.hh"
0037
0038 #include "G4Box.hh"
0039 #include "G4GeometryManager.hh"
0040 #include "G4LogicalVolume.hh"
0041 #include "G4LogicalVolumeStore.hh"
0042 #include "G4Material.hh"
0043 #include "G4NistManager.hh"
0044 #include "G4PVPlacement.hh"
0045 #include "G4PhysicalConstants.hh"
0046 #include "G4PhysicalVolumeStore.hh"
0047 #include "G4RunManager.hh"
0048 #include "G4SolidStore.hh"
0049 #include "G4SystemOfUnits.hh"
0050 #include "G4UnitsTable.hh"
0051
0052
0053
0054 DetectorConstruction::DetectorConstruction()
0055 : G4VUserDetectorConstruction(), fPBox(0), fLBox(0), fMaterial(0), fDetectorMessenger(0)
0056 {
0057 fBoxSize = 1 * m;
0058 DefineMaterials();
0059 SetMaterial("G4_Fe");
0060 fDetectorMessenger = new DetectorMessenger(this);
0061 }
0062
0063
0064
0065 DetectorConstruction::~DetectorConstruction()
0066 {
0067 delete fDetectorMessenger;
0068 }
0069
0070
0071
0072 G4VPhysicalVolume* DetectorConstruction::Construct()
0073 {
0074 return ConstructVolumes();
0075 }
0076
0077
0078
0079 void DetectorConstruction::DefineMaterials()
0080 {
0081
0082
0083
0084 G4double z, a;
0085
0086 G4Element* C = new G4Element("Carbon", "C", z = 6., a = 12.01 * g / mole);
0087 G4Element* N = new G4Element("Nitrogen", "N", z = 7., a = 14.01 * g / mole);
0088 G4Element* O = new G4Element("Oxygen", "O", z = 8., a = 16.00 * g / mole);
0089 G4Element* Ca = new G4Element("Calcium", "Ca", z = 20., a = 40.08 * g / mole);
0090 G4Element* H = new G4Element("Hydrogen", "H", z = 1., a = 1.01 * g / mole);
0091 G4Element* I = new G4Element("Iodine", "I", z = 53., a = 126.90 * g / mole);
0092
0093
0094
0095
0096 G4double density;
0097 G4int ncomponents, natoms;
0098 G4double fractionmass;
0099
0100 new G4Material("galactic", z = 1., a = 1.01 * g / mole, universe_mean_density, kStateGas,
0101 2.73 * kelvin, 3.e-18 * pascal);
0102
0103 G4Material* Air = new G4Material("Air", density = 1.290 * mg / cm3, ncomponents = 2);
0104 Air->AddElement(N, fractionmass = 70. * perCent);
0105 Air->AddElement(O, fractionmass = 30. * perCent);
0106
0107 G4Material* CaCO3 = new G4Material("CaCO3", density = 2.80 * g / cm3, ncomponents = 3);
0108 CaCO3->AddElement(Ca, natoms = 1);
0109 CaCO3->AddElement(C, natoms = 1);
0110 CaCO3->AddElement(O, natoms = 3);
0111
0112 new G4Material("Carbon", z = 6., a = 12.01 * g / mole, density = 2.265 * g / cm3);
0113 new G4Material("Iron", z = 26., a = 55.85 * g / mole, density = 7.870 * g / cm3);
0114 new G4Material("Tin", z = 50., a = 118.7 * g / mole, density = 7.310 * g / cm3);
0115
0116 G4Material* HI = new G4Material("HI", density = 2.8 * g / cm3, ncomponents = 2);
0117 HI->AddElement(H, natoms = 1);
0118 HI->AddElement(I, natoms = 1);
0119
0120 G4cout << *(G4Material::GetMaterialTable()) << G4endl;
0121 }
0122
0123
0124
0125 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes()
0126 {
0127 if (fPBox) {
0128 return fPBox;
0129 }
0130
0131 G4Box* sBox = new G4Box("Container",
0132 fBoxSize / 2, fBoxSize / 2, fBoxSize / 2);
0133
0134 fLBox = new G4LogicalVolume(sBox,
0135 fMaterial,
0136 fMaterial->GetName());
0137
0138 fPBox = new G4PVPlacement(0,
0139 G4ThreeVector(),
0140 fLBox,
0141 fMaterial->GetName(),
0142 0,
0143 false,
0144 0);
0145
0146 PrintParameters();
0147
0148
0149
0150 return fPBox;
0151 }
0152
0153
0154
0155 void DetectorConstruction::PrintParameters()
0156 {
0157 G4cout << "\n The Box is " << G4BestUnit(fBoxSize, "Length") << " of " << fMaterial->GetName()
0158 << G4endl;
0159 }
0160
0161
0162
0163 void DetectorConstruction::SetMaterial(const G4String& materialChoice)
0164 {
0165
0166 G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
0167
0168 if (pttoMaterial && fMaterial != pttoMaterial) {
0169 fMaterial = pttoMaterial;
0170 if (fLBox) {
0171 fLBox->SetMaterial(fMaterial);
0172 }
0173 G4RunManager::GetRunManager()->PhysicsHasBeenModified();
0174 }
0175 }
0176
0177
0178
0179 void DetectorConstruction::SetSize(G4double value)
0180 {
0181 fBoxSize = value;
0182 }
0183
0184
0185
0186 void DetectorConstruction::UpdateGeometry()
0187 {
0188 G4RunManager::GetRunManager()->DefineWorldVolume(ConstructVolumes());
0189 }
0190
0191