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 // This example is provided by the Geant4-DNA collaboration 27 // Any report or published results obtained using the Geant4-DNA software 28 // shall cite the following Geant4-DNA collaboration publications: 29 // Med. Phys. 45, (2018) e722-e739 30 // Phys. Med. 31 (2015) 861-874 31 // Med. Phys. 37 (2010) 4692-4708 32 // Int. J. Model. Simul. Sci. Comput. 1 (2010) 157–178 33 // The Geant4-DNA web site is available at http://geant4-dna.org 34 // 35 // 36 /// \file DetectorConstruction.cc 37 /// \brief Implementation of the DetectorConstruction class 38 39 #include "DetectorConstruction.hh" 40 41 #include "DetectorMessenger.hh" 42 #include "PhysicsList.hh" 43 44 #include "G4LogicalVolume.hh" 45 #include "G4RunManager.hh" 46 #include "G4SystemOfUnits.hh" 47 48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 49 50 DetectorConstruction::DetectorConstruction(PhysicsList* ptr) 51 : G4VUserDetectorConstruction(), 52 fpWaterMaterial(nullptr), 53 fLogicWorld(nullptr), 54 fPhysiWorld(nullptr) 55 { 56 fDetectorMessenger = new DetectorMessenger(this, ptr); 57 } 58 59 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 60 61 DetectorConstruction::~DetectorConstruction() 62 { 63 delete fDetectorMessenger; 64 } 65 66 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 67 68 void DetectorConstruction::DefineMaterials() 69 { 70 // Water is defined from NIST material database 71 G4NistManager* man = G4NistManager::Instance(); 72 73 G4Material* H2O = man->FindOrBuildMaterial("G4_WATER"); 74 75 /* 76 If one wishes to test other density value for water material, 77 one should use instead: 78 G4Material * H2O = man->BuildMaterialWithNewDensity("G4_WATER_MODIFIED", 79 "G4_WATER",1.100*g/cm3); 80 81 Note: any string for "G4_WATER_MODIFIED" parameter is accepted 82 and "G4_WATER" parameter should not be changed 83 Both materials are created and can be selected from dna.mac 84 */ 85 fpWaterMaterial = H2O; 86 87 // G4cout << "-> Density of water material (g/cm3)=" 88 // << fpWaterMaterial->GetDensity()/(g/cm/cm/cm) << G4endl; 89 90 G4cout << *(G4Material::GetMaterialTable()) << G4endl; 91 } 92 93 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 94 95 G4VPhysicalVolume* DetectorConstruction::Construct() 96 { 97 if (fPhysiWorld) { 98 return fPhysiWorld; 99 } 100 DefineMaterials(); 101 102 // World volume 103 104 G4double worldSizeX = 10 * micrometer; 105 G4double worldSizeY = worldSizeX; 106 G4double worldSizeZ = worldSizeX; 107 108 G4Box* solidWorld = new G4Box("World", // its name 109 worldSizeX / 2, worldSizeY / 2, worldSizeZ / 2); // its size 110 111 fLogicWorld = new G4LogicalVolume(solidWorld, // its solid 112 fpWaterMaterial, // its material 113 "World"); // its name 114 115 fPhysiWorld = new G4PVPlacement(0, // no rotation 116 G4ThreeVector(), // at (0,0,0) 117 "World", // its name 118 fLogicWorld, // its logical volume 119 0, // its mother volume 120 false, // no boolean operation 121 0); // copy number 122 123 // Target volume 124 125 G4Box* solidTarget = new G4Box("volumeTarget", // its name 126 worldSizeX / 10, worldSizeY / 2, worldSizeZ / 2); // its size 127 128 fLogicTarget = new G4LogicalVolume(solidTarget, // its solid 129 fpWaterMaterial, // its material 130 "volumeTarget"); // its name 131 132 fPhysiTarget = new G4PVPlacement(0, // no rotation 133 G4ThreeVector(), // at (0,0,0) 134 "volumeTarget", // its name 135 fLogicTarget, // its logical volume 136 fPhysiWorld, // its mother volume 137 false, // no boolean operation 138 0); // copy number 139 140 // Target region 141 142 G4Region* targetRegion = new G4Region("regionTarget"); 143 144 // Cuts needed to allow combination of Physics 145 // Default EM settings for fast simulation for e+, e-, gammas 146 // 1 um proton cut avoids creation of very slow recoil ions 147 G4ProductionCuts* cuts = new G4ProductionCuts(); 148 cuts->SetProductionCut(0.7 * mm, "gamma"); 149 cuts->SetProductionCut(0.7 * mm, "e-"); 150 cuts->SetProductionCut(0.7 * mm, "e+"); 151 cuts->SetProductionCut(1 * micrometer, "proton"); 152 targetRegion->SetProductionCuts(cuts); 153 154 targetRegion->AddRootLogicalVolume(fLogicTarget); 155 156 // Visualization attributes - white 157 G4VisAttributes* worldVisAtt = new G4VisAttributes(G4Colour(1.0, 1.0, 1.0)); 158 worldVisAtt->SetVisibility(true); 159 fLogicWorld->SetVisAttributes(worldVisAtt); 160 161 G4VisAttributes* targetVisAtt = new G4VisAttributes(G4Colour(1.0, 0.0, 0.0)); 162 targetVisAtt->SetVisibility(true); 163 fLogicTarget->SetVisAttributes(targetVisAtt); 164 165 return fPhysiWorld; 166 } 167 168 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 169 170 void DetectorConstruction::SetMaterial(const G4String& materialChoice) 171 { 172 // Search the material by its name 173 G4Material* pttoMaterial = G4NistManager::Instance()->FindOrBuildMaterial(materialChoice); 174 175 if (pttoMaterial) { 176 fpWaterMaterial = pttoMaterial; 177 if (fLogicWorld) { 178 fLogicWorld->SetMaterial(fpWaterMaterial); 179 } 180 G4RunManager::GetRunManager()->GeometryHasBeenModified(); 181 } 182 } 183