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 // History : 27 // 21/10/2021 : DLa update to modify the m 28 // ------------------------------------------- 29 // ------------------------------------------- 30 31 #include "DetectorConstruction.hh" 32 #include "DetectorMessenger.hh" 33 #include "G4SystemOfUnits.hh" 34 #include "G4Region.hh" 35 #include "G4ProductionCuts.hh" 36 #include "G4RunManager.hh" 37 38 //....oooOO0OOooo........oooOO0OOooo........oo 39 40 DetectorConstruction::DetectorConstruction() 41 :G4VUserDetectorConstruction(), fPhysiWorld(nu 42 { 43 fBoxSize = 1.0*um; 44 DefineMaterials(); 45 SetMaterial("G4_Si"); 46 fDetectorMessenger = new DetectorMessenger(t 47 } 48 49 //....oooOO0OOooo........oooOO0OOooo........oo 50 51 DetectorConstruction::~DetectorConstruction() 52 { 53 delete fPhysiWorld; 54 delete fLogicWorld; 55 delete fSolidWorld; 56 //delete fWorldMaterial; // no delete beca 57 delete flogicTarget; 58 delete ftargetSolid; 59 delete fMaterial; 60 delete fRegion; 61 delete fDetectorMessenger; 62 } 63 64 //....oooOO0OOooo........oooOO0OOooo........oo 65 66 G4VPhysicalVolume* DetectorConstruction::Const 67 68 { 69 DefineMaterials(); 70 return ConstructDetector(); 71 } 72 73 //....oooOO0OOooo........oooOO0OOooo........oo 74 75 void DetectorConstruction::DefineMaterials() 76 { 77 78 // Silicon is defined from NIST material dat 79 G4NistManager * man = G4NistManager::Instanc 80 fMaterial = man->FindOrBuildMaterial("G4_Si 81 fWorldMaterial = man->FindOrBuildMaterial(" 82 83 } 84 85 //....oooOO0OOooo........oooOO0OOooo........oo 86 87 88 89 void DetectorConstruction::SetMaterial(const G 90 { 91 // search the material by its name 92 G4Material* pttoMaterial = 93 G4NistManager::Instance()->FindOrBuildMat 94 95 if (pttoMaterial) { 96 fMaterial = pttoMaterial; 97 if ( flogicTarget ) { flogicTarget->SetMat 98 } else { 99 G4cout << "\n--> warning from DetectorCons 100 << materialChoice << " not found" < 101 } 102 G4RunManager::GetRunManager()->PhysicsHasBee 103 } 104 105 //....oooOO0OOooo........oooOO0OOooo........oo 106 107 108 //....oooOO0OOooo........oooOO0OOooo........oo 109 G4VPhysicalVolume* DetectorConstruction::Const 110 { 111 112 113 //....oooOO0OOooo........oooOO0OOooo........oo 114 115 // WORLD VOLUME 116 117 118 G4double TargetSizeX = 1*um; 119 G4double TargetSizeY = TargetSizeX; 120 G4double TargetSizeZ = TargetSizeX; 121 fBoxSize = TargetSizeX; 122 123 fWorldSizeX = TargetSizeX*2; 124 fWorldSizeY = TargetSizeY*2; 125 fWorldSizeZ = TargetSizeZ*2; 126 127 fSolidWorld = new G4Box("World", 128 fWorldSizeX/2,fWorldSizeY/2,fWorldSiz 129 130 131 fLogicWorld = new G4LogicalVolume(fSolidWorl 132 fWorldMaterial, //its material 133 "World"); //its name 134 135 fPhysiWorld = new G4PVPlacement(0, //no 136 G4ThreeVector(), //at (0,0,0) 137 "World", // 138 fLogicWorld, 139 0, //its 140 false, // 141 0); //co 142 143 144 145 ftargetSolid = new G4Box("Target", 146 TargetSizeX/2,TargetSizeY/2,TargetSiz 147 148 149 flogicTarget = new G4LogicalVolume(ftargetSo 150 fMaterial, //its material 151 "Target"); //its name 152 153 new G4PVPlacement(0, 154 G4ThreeVector(), 155 "Target", //its name 156 flogicTarget, //its logical volume 157 fPhysiWorld, //its mother volume 158 false, //no boolean operation 159 0); //copy number 160 161 // Visualization attributes 162 G4VisAttributes* worldVisAtt= new G4VisAttri 163 worldVisAtt->SetVisibility(true); 164 fLogicWorld->SetVisAttributes(worldVisAtt); 165 166 G4VisAttributes* worldVisAtt1 = new G4VisAtt 167 worldVisAtt1->SetVisibility(true); 168 flogicTarget->SetVisAttributes(worldVisAtt1) 169 170 // Create Target G4Region and add logical vo 171 172 fRegion = new G4Region("Target"); 173 174 G4ProductionCuts* cuts = new G4ProductionCut 175 176 G4double defCut = 1*nanometer; 177 cuts->SetProductionCut(defCut,"gamma"); 178 cuts->SetProductionCut(defCut,"e-"); 179 cuts->SetProductionCut(defCut,"e+"); 180 cuts->SetProductionCut(defCut,"proton"); 181 182 fRegion->SetProductionCuts(cuts); 183 fRegion->AddRootLogicalVolume(flogicTarget); 184 185 return fPhysiWorld; 186 } 187 188 189 //....oooOO0OOooo........oooOO0OOooo........oo 190 191 void DetectorConstruction::SetSize(G4double va 192 { 193 fBoxSize = value; 194 if(ftargetSolid) { 195 ftargetSolid->SetXHalfLength(fBoxSize/2); 196 ftargetSolid->SetYHalfLength(fBoxSize/2); 197 ftargetSolid->SetZHalfLength(fBoxSize/2); 198 } 199 fWorldSizeX = value*2.0; 200 fWorldSizeY = value*2.0; 201 fWorldSizeZ = value*2.0; 202 203 if(fSolidWorld) { 204 fSolidWorld->SetXHalfLength(fWorldSizeX/2) 205 fSolidWorld->SetYHalfLength(fWorldSizeY/2) 206 fSolidWorld->SetZHalfLength(fWorldSizeZ/2) 207 } 208 209 } 210 211