Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // This example is provided by the Geant4-DNA 26 // This example is provided by the Geant4-DNA collaboration 27 // Any report or published results obtained us << 27 // Any report or published results obtained using the Geant4-DNA software 28 // shall cite the following Geant4-DNA collabo << 28 // shall cite the following Geant4-DNA collaboration publication: 29 // Med. Phys. 45 (2018) e722-e739 << 30 // Phys. Med. 31 (2015) 861-874 << 31 // Med. Phys. 37 (2010) 4692-4708 29 // Med. Phys. 37 (2010) 4692-4708 32 // Int. J. Model. Simul. Sci. Comput. 1 (2010) << 33 // The Geant4-DNA web site is available at htt 30 // The Geant4-DNA web site is available at http://geant4-dna.org 34 // 31 // >> 32 // $Id: DetectorConstruction.cc 87359 2014-12-01 16:04:27Z gcosmo $ >> 33 // 35 /// \file DetectorConstruction.cc 34 /// \file DetectorConstruction.cc 36 /// \brief Implementation of the DetectorConst 35 /// \brief Implementation of the DetectorConstruction class 37 << 36 38 #include "DetectorConstruction.hh" 37 #include "DetectorConstruction.hh" 39 << 38 #include "G4SDManager.hh" 40 #include "DetectorMessenger.hh" << 41 #include "TrackerSD.hh" 39 #include "TrackerSD.hh" 42 40 43 #include "G4Box.hh" << 41 #include "G4Material.hh" 44 #include "G4GeometryManager.hh" << 45 #include "G4GeometryTolerance.hh" << 46 #include "G4NistManager.hh" 42 #include "G4NistManager.hh" >> 43 >> 44 #include "G4Box.hh" 47 #include "G4PVPlacement.hh" 45 #include "G4PVPlacement.hh" 48 #include "G4SDManager.hh" << 46 >> 47 #include "G4GeometryTolerance.hh" >> 48 #include "G4GeometryManager.hh" >> 49 49 #include "G4SystemOfUnits.hh" 50 #include "G4SystemOfUnits.hh" 50 #include "G4UnitsTable.hh" << 51 #include "G4UserLimits.hh" << 52 51 53 //....oooOO0OOooo........oooOO0OOooo........oo 52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 54 << 53 55 DetectorConstruction::DetectorConstruction() : << 54 DetectorConstruction::DetectorConstruction() >> 55 :G4VUserDetectorConstruction() 56 { 56 { 57 // Create commands for interactive definitio << 58 fDetectorMessenger = std::make_unique<Detect << 59 } 57 } 60 58 61 //....oooOO0OOooo........oooOO0OOooo........oo 59 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 62 << 60 63 DetectorConstruction::~DetectorConstruction() << 61 DetectorConstruction::~DetectorConstruction() >> 62 { >> 63 } 64 64 65 //....oooOO0OOooo........oooOO0OOooo........oo 65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 66 << 66 67 G4VPhysicalVolume* DetectorConstruction::Const 67 G4VPhysicalVolume* DetectorConstruction::Construct() 68 { 68 { 69 // Define materials 69 // Define materials 70 DefineMaterials(); 70 DefineMaterials(); 71 71 72 // Define volumes 72 // Define volumes 73 return DefineVolumes(); 73 return DefineVolumes(); 74 } 74 } 75 75 76 //....oooOO0OOooo........oooOO0OOooo........oo 76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 77 77 78 void DetectorConstruction::DefineMaterials() 78 void DetectorConstruction::DefineMaterials() 79 { 79 { 80 // Water is defined from NIST material datab 80 // Water is defined from NIST material database 81 G4NistManager* man = G4NistManager::Instance << 81 G4NistManager * man = G4NistManager::Instance(); 82 G4Material* H2O = man->FindOrBuildMaterial(" << 82 >> 83 G4Material * H2O = man->FindOrBuildMaterial("G4_WATER"); >> 84 83 fpWaterMaterial = H2O; 85 fpWaterMaterial = H2O; 84 86 85 // Print materials 87 // Print materials 86 G4cout << *(G4Material::GetMaterialTable()) 88 G4cout << *(G4Material::GetMaterialTable()) << G4endl; 87 } 89 } 88 90 89 //....oooOO0OOooo........oooOO0OOooo........oo 91 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 90 92 91 G4VPhysicalVolume* DetectorConstruction::Defin 93 G4VPhysicalVolume* DetectorConstruction::DefineVolumes() 92 { 94 { 93 G4double worldLength = 10 * m; << 95 G4double worldLength = 200*um; 94 96 95 // World 97 // World 96 98 97 G4GeometryManager::GetInstance()->SetWorldMa 99 G4GeometryManager::GetInstance()->SetWorldMaximumExtent(worldLength); 98 100 99 G4cout << "Computed tolerance = " 101 G4cout << "Computed tolerance = " 100 << G4GeometryTolerance::GetInstance() << 102 << G4GeometryTolerance::GetInstance()->GetSurfaceTolerance()/nm 101 << 103 << " nm" << G4endl; 102 auto* worldS = new G4Box("world", // its na << 103 worldLength / 2, wo << 104 << 105 auto* worldLV = new G4LogicalVolume(worldS, << 106 fpWaterM << 107 "World_L << 108 << 109 G4VPhysicalVolume* worldPV = new G4PVPlaceme << 110 << 111 << 112 << 113 << 114 << 115 << 116 << 117 << 118 worldLV->SetUserLimits(new G4UserLimits(fpMa << 119 << 120 PrintParameters(); << 121 104 >> 105 G4Box* worldS >> 106 = new G4Box("world", //its name >> 107 worldLength/2,worldLength/2,worldLength/2); //its size >> 108 >> 109 G4LogicalVolume* worldLV >> 110 = new G4LogicalVolume( >> 111 worldS, //its solid >> 112 fpWaterMaterial, //its material >> 113 "World_LV"); //its name >> 114 >> 115 G4VPhysicalVolume* worldPV >> 116 = new G4PVPlacement( >> 117 0, // no rotation >> 118 G4ThreeVector(), // at (0,0,0) >> 119 worldLV, // its logical volume >> 120 "World", // its name >> 121 0, // its mother volume >> 122 false, // no boolean operations >> 123 0, // copy number >> 124 false); // checking overlaps >> 125 122 return worldPV; 126 return worldPV; 123 } 127 } 124 128 125 //....oooOO0OOooo........oooOO0OOooo........oo 129 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 126 << 130 127 void DetectorConstruction::ConstructSDandField 131 void DetectorConstruction::ConstructSDandField() 128 { 132 { 129 // Sensitive detector << 133 // Sensitive detectors 130 134 131 G4String trackerChamberSDname = "TrackerCham 135 G4String trackerChamberSDname = "TrackerChamberSD"; 132 << 136 133 auto* aTrackerSD = new TrackerSD(trackerCham << 137 TrackerSD* aTrackerSD = new TrackerSD(trackerChamberSDname, 134 aTrackerSD->SetRadius(fRadius); << 138 "TrackerHitsCollection"); 135 << 139 G4SDManager::GetSDMpointer()->AddNewDetector(aTrackerSD); 136 G4SDManager::GetSDMpointer()->AddNewDetector << 140 // Setting aTrackerSD to all logical volumes with the same name 137 << 141 // of "Chamber_LV". 138 SetSensitiveDetector("World_LV", aTrackerSD, 142 SetSensitiveDetector("World_LV", aTrackerSD, true); 139 } << 140 << 141 //....oooOO0OOooo........oooOO0OOooo........oo << 142 << 143 void DetectorConstruction::SetTrackingCut(cons << 144 { << 145 fpTrackingCut = value; << 146 } << 147 << 148 //....oooOO0OOooo........oooOO0OOooo........oo << 149 143 150 void DetectorConstruction::SetMaxStepSize(cons << 144 } 151 { << 152 fpMaxStepSize = value; << 153 } << 154 << 155 void DetectorConstruction::SetTrackerSDRadius( << 156 { << 157 fRadius = value; << 158 } << 159 << 160 //....oooOO0OOooo........oooOO0OOooo........oo << 161 << 162 void DetectorConstruction::PrintParameters() c << 163 { << 164 G4cout << "\n------------------------------- << 165 G4cout << "---> The tracking cut is set to " << 166 G4cout << "---> The maximum step size is set << 167 << G4endl; << 168 G4cout << "---> The TrackerSD radius is set << 169 G4cout << "\n------------------------------- << 170 } << 171 << 172 //....oooOO0OOooo........oooOO0OOooo........oo << 173 145