Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 /// \file biasing/ReverseMC01/src/RMC01DetectorConstruction.cc 27 /// \brief Implementation of the RMC01DetectorConstruction class 28 // 29 // 30 ////////////////////////////////////////////////////////////// 31 // Class Name: RMC01DetectorConstruction 32 // Author: L. Desorgher 33 // Organisation: SpaceIT GmbH 34 // Contract: ESA contract 21435/08/NL/AT 35 // Customer: ESA/ESTEC 36 ////////////////////////////////////////////////////////////// 37 38 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 39 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 40 41 #include "RMC01DetectorConstruction.hh" 42 43 #include "RMC01DetectorMessenger.hh" 44 #include "RMC01SD.hh" 45 46 #include "G4Box.hh" 47 #include "G4Colour.hh" 48 #include "G4GeometryManager.hh" 49 #include "G4LogicalVolume.hh" 50 #include "G4LogicalVolumeStore.hh" 51 #include "G4Material.hh" 52 #include "G4Orb.hh" 53 #include "G4PVPlacement.hh" 54 #include "G4PhysicalConstants.hh" 55 #include "G4PhysicalVolumeStore.hh" 56 #include "G4RunManager.hh" 57 #include "G4SDManager.hh" 58 #include "G4SolidStore.hh" 59 #include "G4SystemOfUnits.hh" 60 #include "G4Tubs.hh" 61 #include "G4VisAttributes.hh" 62 63 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 64 65 RMC01DetectorConstruction::RMC01DetectorConstruction() 66 : G4VUserDetectorConstruction(), 67 fDetectorMessenger(0), 68 fShield_Thickness(5. * mm), 69 fSensitive_cylinder_H(1. * mm), 70 fSensitive_cylinder_Rout(1. * mm) 71 { 72 fDetectorMessenger = new RMC01DetectorMessenger(this); 73 } 74 75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 76 77 RMC01DetectorConstruction::~RMC01DetectorConstruction() 78 { 79 delete fDetectorMessenger; 80 } 81 82 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 83 84 G4VPhysicalVolume* RMC01DetectorConstruction::Construct() 85 { 86 DefineMaterials(); 87 return ConstructSimpleGeometry(); 88 } 89 90 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 91 92 void RMC01DetectorConstruction::DefineMaterials() 93 { 94 G4String symbol; // a=mass of a mole; 95 G4double a, z, density; // z=mean number of protons; 96 G4double fractionmass; 97 G4int ncomponents; 98 99 // 100 // define Elements 101 // 102 103 G4Element* N = new G4Element("Nitrogen", symbol = "N", z = 7., a = 14.01 * g / mole); 104 G4Element* O = new G4Element("Oxygen", symbol = "O", z = 8., a = 16.00 * g / mole); 105 106 // 107 // define simple materials 108 // 109 110 new G4Material("Aluminum", z = 13., a = 26.98 * g / mole, density = 2.700 * g / cm3); 111 new G4Material("Silicon", z = 14., a = 28.09 * g / mole, density = 2.33 * g / cm3); 112 new G4Material("Tantalum", z = 73., a = 180.9479 * g / mole, density = 16.654 * g / cm3); 113 114 // 115 // define air 116 // 117 118 G4Material* Air = new G4Material("Air", density = 1.290 * mg / cm3, ncomponents = 2); 119 Air->AddElement(N, fractionmass = 0.7); 120 Air->AddElement(O, fractionmass = 0.3); 121 122 // 123 // Example of Vacuum 124 // 125 126 new G4Material("Vacuum", z = 1., a = 1.01 * g / mole, density = universe_mean_density, kStateGas, 127 3.e-18 * pascal, 2.73 * kelvin); 128 } 129 130 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 131 132 G4VPhysicalVolume* RMC01DetectorConstruction::ConstructSimpleGeometry() 133 { 134 // Clean old geometry, if any 135 136 G4GeometryManager::GetInstance()->OpenGeometry(); 137 G4PhysicalVolumeStore::GetInstance()->Clean(); 138 G4LogicalVolumeStore::GetInstance()->Clean(); 139 G4SolidStore::GetInstance()->Clean(); 140 141 // World 142 //----------- 143 144 G4Box* solidWorld = new G4Box("World", 15. * cm, 15. * cm, 15. * cm); 145 G4LogicalVolume* logicWorld = 146 new G4LogicalVolume(solidWorld, G4Material::GetMaterial("Vacuum"), "World"); 147 148 G4VPhysicalVolume* physiWorld = new G4PVPlacement(0, // no rotation 149 G4ThreeVector(), // at (0,0,0) 150 logicWorld, // its logical volume 151 "World", // its name 152 0, // its mother volume 153 false, // no boolean operation 154 0); 155 156 // Shielding Aluminum Sphere 157 //------------------- 158 159 G4double radiusShieldingSphere = 10. * cm; 160 161 G4Orb* solidShieldingSphere = new G4Orb("Shielding", radiusShieldingSphere); 162 G4LogicalVolume* logicShieldingSphere = 163 new G4LogicalVolume(solidShieldingSphere, G4Material::GetMaterial("Aluminum"), 164 "Shielding"); // its name; 165 166 new G4PVPlacement(0, // no rotation 167 G4ThreeVector(), // at (0,0,0) 168 logicShieldingSphere, // its logical volume 169 "Shielding", // its name 170 logicWorld, // its mother volume 171 false, // no boolean operation 172 0); 173 174 // Bulk Sphere 175 //------------------- 176 177 G4Orb* solidBulkSphere = new G4Orb("Bulk", radiusShieldingSphere - fShield_Thickness); 178 G4LogicalVolume* logicBulkSphere = 179 new G4LogicalVolume(solidBulkSphere, // its solid 180 G4Material::GetMaterial("Air"), // its material 181 "Bulk"); // its name; 182 183 new G4PVPlacement(0, // no rotation 184 G4ThreeVector(), // at (0,0,0) 185 logicBulkSphere, // its logical volume 186 "Bulk", // its name 187 logicShieldingSphere, // its mother volume 188 false, // no boolean operation 189 0); 190 191 // Detecting cylinder 192 //------------------- 193 194 G4Tubs* solidDetecting = new G4Tubs("SensitiveVolume", 0., fSensitive_cylinder_Rout, 195 fSensitive_cylinder_H / 2., 0., twopi); 196 197 G4LogicalVolume* logicDetectingCylinder = 198 new G4LogicalVolume(solidDetecting, G4Material::GetMaterial("Silicon"), "SensitiveVolume"); 199 200 new G4PVPlacement(0, // no rotation 201 G4ThreeVector(0., 0., 0.), // at (0,0,0) 202 logicDetectingCylinder, // its logical volume 203 "SensitiveVolume", // its name 204 logicBulkSphere, // its mother volume 205 false, // no boolean operation 206 0); 207 208 RMC01SD* theSensitiveDetector = new RMC01SD("/SensitiveCylinder"); 209 210 G4SDManager::GetSDMpointer()->AddNewDetector(theSensitiveDetector); 211 logicDetectingCylinder->SetSensitiveDetector(theSensitiveDetector); 212 213 // Tantalum Plates on the top and beside 214 //------------------------------------- 215 G4Box* solidPlate = new G4Box("TantalumPlate", 4. * cm, 4. * cm, 0.25 * mm); 216 G4LogicalVolume* logicPlate = 217 new G4LogicalVolume(solidPlate, // its solid 218 G4Material::GetMaterial("Tantalum"), // its material 219 "TantalumPlate"); // its name; 220 221 new G4PVPlacement(0, // no rotation 222 G4ThreeVector(0., 0., 6. * cm), // at (0,0,0) 223 logicPlate, // its logical volume 224 "TantalumPlate1", // its name 225 logicBulkSphere, // its mother volume 226 false, // no boolean operation 227 0); 228 229 new G4PVPlacement(0, // no rotation 230 G4ThreeVector(0., 0., -6. * cm), // at (0,0,0) 231 logicPlate, // its logical volume 232 "TantalumPlate2", // its name 233 logicBulkSphere, // its mother volume 234 false, // no boolean operation 235 0); 236 237 return physiWorld; 238 } 239 240 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 241 242 void RMC01DetectorConstruction::SetSensitiveVolumeRadius(G4double r) 243 { 244 fSensitive_cylinder_Rout = r; 245 } 246 247 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 248 249 void RMC01DetectorConstruction::SetSensitiveVolumeHeight(G4double h) 250 { 251 fSensitive_cylinder_H = h; 252 } 253 254 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 255 256 void RMC01DetectorConstruction::SetShieldingThickness(G4double d) 257 { 258 fShield_Thickness = d; 259 } 260 261 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 262