Warning, file /geant4/examples/extended/electromagnetic/TestEm15/src/DetectorConstruction.cc was not indexed
or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).
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 #include "DetectorConstruction.hh"
0030
0031 #include "DetectorMessenger.hh"
0032
0033 #include "G4Box.hh"
0034 #include "G4GeometryManager.hh"
0035 #include "G4LogicalVolume.hh"
0036 #include "G4LogicalVolumeStore.hh"
0037 #include "G4Material.hh"
0038 #include "G4NistManager.hh"
0039 #include "G4PVPlacement.hh"
0040 #include "G4PhysicalConstants.hh"
0041 #include "G4PhysicalVolumeStore.hh"
0042 #include "G4SolidStore.hh"
0043 #include "G4SystemOfUnits.hh"
0044 #include "G4UnitsTable.hh"
0045
0046
0047
0048 DetectorConstruction::DetectorConstruction()
0049 : G4VUserDetectorConstruction(),
0050 fWorld(0),
0051 fBox(0),
0052 fMaterial(0),
0053 fWMaterial(0),
0054 fDetectorMessenger(0)
0055 {
0056 fBoxSize = 100 * m;
0057 fWorldSize = 1.2 * fBoxSize;
0058 DefineMaterials();
0059 SetMaterial("Water");
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* H = new G4Element("Hydrogen", "H", z = 1., a = 1.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* Na = new G4Element("Sodium", "Na", z = 11., a = 22.99 * g / mole);
0090 G4Element* Ge = new G4Element("Germanium", "Ge", z = 32., a = 72.59 * g / mole);
0091 G4Element* I = new G4Element("Iodine", "I", z = 53., a = 126.90 * g / mole);
0092 G4Element* Bi = new G4Element("Bismuth", "Bi", z = 83., a = 208.98 * g / mole);
0093
0094
0095
0096
0097 G4double density;
0098 G4int ncomponents, natoms;
0099 G4double fractionmass;
0100
0101 G4Material* Air = new G4Material("Air", density = 1.290 * mg / cm3, ncomponents = 2);
0102 Air->AddElement(N, fractionmass = 70. * perCent);
0103 Air->AddElement(O, fractionmass = 30. * perCent);
0104
0105 G4Material* H2l = new G4Material("H2liquid", density = 70.8 * mg / cm3, ncomponents = 1);
0106 H2l->AddElement(H, fractionmass = 1.);
0107
0108 G4Material* H2O = new G4Material("Water", density = 1.000 * g / cm3, ncomponents = 2);
0109 H2O->AddElement(H, natoms = 2);
0110 H2O->AddElement(O, natoms = 1);
0111 H2O->SetChemicalFormula("H_2O");
0112 H2O->GetIonisation()->SetMeanExcitationEnergy(75.0 * eV);
0113
0114 new G4Material("liquidArgon", z = 18., a = 39.95 * g / mole, density = 1.390 * g / cm3);
0115
0116 new G4Material("Carbon", z = 6., a = 12.01 * g / mole, density = 2.267 * g / cm3);
0117
0118 new G4Material("Aluminium", z = 13., a = 26.98 * g / mole, density = 2.700 * g / cm3);
0119
0120 new G4Material("Silicon", z = 14., a = 28.09 * g / mole, density = 2.330 * g / cm3);
0121
0122 new G4Material("Germanium", z = 32., a = 72.61 * g / mole, density = 5.323 * g / cm3);
0123
0124 G4Material* NaI = new G4Material("NaI", density = 3.67 * g / cm3, ncomponents = 2);
0125 NaI->AddElement(Na, natoms = 1);
0126 NaI->AddElement(I, natoms = 1);
0127 NaI->GetIonisation()->SetMeanExcitationEnergy(452 * eV);
0128
0129 G4Material* Iod = new G4Material("Iodine", density = 4.93 * g / cm3, ncomponents = 1);
0130 Iod->AddElement(I, natoms = 1);
0131
0132 G4Material* BGO = new G4Material("BGO", density = 7.10 * g / cm3, ncomponents = 3);
0133 BGO->AddElement(O, natoms = 12);
0134 BGO->AddElement(Ge, natoms = 3);
0135 BGO->AddElement(Bi, natoms = 4);
0136
0137 new G4Material("Iron", z = 26., a = 55.85 * g / mole, density = 7.870 * g / cm3);
0138
0139 new G4Material("Tungsten", z = 74., a = 183.85 * g / mole, density = 19.30 * g / cm3);
0140
0141 new G4Material("Lead", z = 82., a = 207.19 * g / mole, density = 11.35 * g / cm3);
0142
0143 new G4Material("Uranium", z = 92., a = 238.03 * g / mole, density = 18.95 * g / cm3);
0144
0145 density = universe_mean_density;
0146 G4double pressure = 3.e-18 * pascal;
0147 G4double temperature = 2.73 * kelvin;
0148 G4Material* vacuum = new G4Material("Galactic", z = 1, a = 1.008 * g / mole, density, kStateGas,
0149 temperature, pressure);
0150
0151 G4cout << *(G4Material::GetMaterialTable()) << G4endl;
0152
0153
0154 fWMaterial = vacuum;
0155 }
0156
0157
0158
0159 G4VPhysicalVolume* DetectorConstruction::ConstructVolumes()
0160 {
0161
0162 G4GeometryManager::GetInstance()->OpenGeometry();
0163 G4PhysicalVolumeStore::GetInstance()->Clean();
0164 G4LogicalVolumeStore::GetInstance()->Clean();
0165 G4SolidStore::GetInstance()->Clean();
0166
0167
0168
0169 G4Box* sWorld = new G4Box("World",
0170 fWorldSize / 2, fWorldSize / 2, fWorldSize / 2);
0171
0172 G4LogicalVolume* lWorld = new G4LogicalVolume(sWorld,
0173 fWMaterial,
0174 "World");
0175
0176 fWorld = new G4PVPlacement(0,
0177 G4ThreeVector(),
0178 lWorld,
0179 "World",
0180 0,
0181 false,
0182 0);
0183
0184
0185
0186 G4Box* sBox = new G4Box("Container",
0187 fBoxSize / 2, fBoxSize / 2, fBoxSize / 2);
0188
0189 G4LogicalVolume* lBox = new G4LogicalVolume(sBox,
0190 fMaterial,
0191 fMaterial->GetName());
0192
0193 fBox = new G4PVPlacement(0,
0194 G4ThreeVector(),
0195 lBox,
0196 fMaterial->GetName(),
0197 lWorld,
0198 false,
0199 0);
0200
0201 PrintParameters();
0202
0203
0204
0205 return fWorld;
0206 }
0207
0208
0209
0210 void DetectorConstruction::PrintParameters()
0211 {
0212 G4cout << "\n The Box is " << G4BestUnit(fBoxSize, "Length") << " of " << fMaterial->GetName()
0213 << G4endl;
0214 }
0215
0216
0217
0218 void DetectorConstruction::SetMaterial(G4String materialChoice)
0219 {
0220
0221 G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(materialChoice);
0222
0223 if (pttoMaterial) {
0224 fMaterial = pttoMaterial;
0225 UpdateGeometry();
0226 }
0227 else {
0228 G4cout << "\n--> warning from DetectorConstruction::SetMaterial : " << materialChoice
0229 << " not found" << G4endl;
0230 }
0231 }
0232
0233
0234
0235 void DetectorConstruction::SetSize(G4double value)
0236 {
0237 fBoxSize = value;
0238 fWorldSize = 1.2 * fBoxSize;
0239 UpdateGeometry();
0240 }
0241
0242
0243
0244 #include "G4RunManager.hh"
0245
0246 void DetectorConstruction::UpdateGeometry()
0247 {
0248 if (fWorld) G4RunManager::GetRunManager()->DefineWorldVolume(ConstructVolumes());
0249 }
0250
0251