Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // Author: Haegin Han 28 // Reference: ICRP Publication 145. Ann. ICRP 29 // Geant4 Contributors: J. Allison and S. Guat 30 // 31 32 #include "TETDetectorConstruction.hh" 33 34 #include "G4VisAttributes.hh" 35 36 TETDetectorConstruction::TETDetectorConstructi 37 :fWorldPhysical(nullptr), fContainer_logic(nul 38 { 39 // initialisation of the variables for phanto 40 fPhantomSize = fTetData -> GetPhantomSize 41 fPhantomBoxMin = fTetData -> GetPhantomBoxM 42 fPhantomBoxMax = fTetData -> GetPhantomBoxM 43 fNOfTetrahedrons = fTetData -> GetNumTetrahed 44 } 45 46 TETDetectorConstruction::~TETDetectorConstruct 47 { 48 delete fTetData; 49 } 50 51 G4VPhysicalVolume* TETDetectorConstruction::Co 52 { 53 SetupWorldGeometry(); 54 ConstructPhantom(); 55 PrintPhantomInformation(); 56 return fWorldPhysical; 57 } 58 59 void TETDetectorConstruction::SetupWorldGeomet 60 { 61 // Define the world box (size: 10*10*10 m3) 62 // 63 G4double worldXYZ = 10. * m; 64 G4Material* vacuum = G4NistManager::Instance( 65 66 G4VSolid* worldSolid = new G4Box("worldSolid" 67 68 auto* worldLogical = new G4LogicalVolume(worl 69 70 fWorldPhysical = new G4PVPlacement(nullptr,G4 71 72 // Define the phantom container (10-cm margin 73 // 74 auto* containerSolid = new G4Box("phantomBox" 75 fPhantomSize.y()/2 + 10.* 76 fPhantomSize.z()/2 + 10.*cm); 77 78 fContainer_logic = new G4LogicalVolume(contai 79 80 new G4PVPlacement(nullptr, G4ThreeVector(), f 81 worldLogical, false, 0); 82 83 fContainer_logic->SetOptimisation(TRUE); 84 fContainer_logic->SetSmartless( 0.5 ); // for 85 } 86 87 void TETDetectorConstruction::ConstructPhantom 88 { 89 // Define the tetrahedral mesh phantom as a p 90 // 91 // solid and logical volume to be used for pa 92 G4VSolid* tetraSolid = new G4Tet("TetSolid", 93 G4ThreeVector(1.*cm,0,0), 94 G4ThreeVector(0,1.*cm,0), 95 G4ThreeVector(0,0,1.*cm)); 96 97 G4Material* vacuum = G4NistManager::Instance 98 fTetLogic = new G4LogicalVolume(tetraSolid, 99 100 // physical volume (phantom) constructed as 101 new G4PVParameterised("wholePhantom",fTetLog 102 kUndefined, fTetData->GetNumTetrahedro 103 new TETParameterisation(fTetData)); 104 } 105 106 void TETDetectorConstruction::ConstructSDandFi 107 { 108 // Define detector (Phantom SD) and scorer (e 109 // 110 G4SDManager* pSDman = G4SDManager::GetSDMpoin 111 G4String phantomSDname = "PhantomSD"; 112 113 // MultiFunctional detector 114 auto* MFDet = new G4MultiFunctionalDetector(p 115 pSDman->AddNewDetector( MFDet ); 116 117 // scorer for energy depositon in each organ 118 MFDet->RegisterPrimitive(new TETPSEnergyDepos 119 120 // attach the detector to logical volume for 121 SetSensitiveDetector(fTetLogic, MFDet); 122 } 123 124 void TETDetectorConstruction::PrintPhantomInfo 125 { 126 // print brief information on the imported ph 127 G4cout<< G4endl; 128 G4cout.precision(3); 129 G4cout<<" Phantom name "<<fTe 130 G4cout<<" Phantom size "<<fPh 131 G4cout<<" Phantom box position (min) "<<fPh 132 G4cout<<" Phantom box position (max) "<<fPh 133 G4cout<<" Number of tetrahedrons "<<fNO 134 } 135