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 // History : 27 // 21/10/2021 : DLa update to modify the material and the size 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........oooOO0OOooo........oooOO0OOooo.... 39 40 DetectorConstruction::DetectorConstruction() 41 :G4VUserDetectorConstruction(), fPhysiWorld(nullptr), fLogicWorld(nullptr), fSolidWorld(nullptr), fWorldMaterial(nullptr), flogicTarget(nullptr), ftargetSolid(nullptr), fMaterial(nullptr), fRegion(nullptr) 42 { 43 fBoxSize = 1.0*um; 44 DefineMaterials(); 45 SetMaterial("G4_Si"); 46 fDetectorMessenger = new DetectorMessenger(this); 47 } 48 49 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 50 51 DetectorConstruction::~DetectorConstruction() 52 { 53 delete fPhysiWorld; 54 delete fLogicWorld; 55 delete fSolidWorld; 56 //delete fWorldMaterial; // no delete because link to database 57 delete flogicTarget; 58 delete ftargetSolid; 59 delete fMaterial; 60 delete fRegion; 61 delete fDetectorMessenger; 62 } 63 64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 65 66 G4VPhysicalVolume* DetectorConstruction::Construct() 67 68 { 69 DefineMaterials(); 70 return ConstructDetector(); 71 } 72 73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 74 75 void DetectorConstruction::DefineMaterials() 76 { 77 78 // Silicon is defined from NIST material database 79 G4NistManager * man = G4NistManager::Instance(); 80 fMaterial = man->FindOrBuildMaterial("G4_Si"); 81 fWorldMaterial = man->FindOrBuildMaterial("G4_Si"); // world material; 82 83 } 84 85 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 86 87 88 89 void DetectorConstruction::SetMaterial(const G4String& materialChoice) 90 { 91 // search the material by its name 92 G4Material* pttoMaterial = 93 G4NistManager::Instance()->FindOrBuildMaterial(materialChoice); 94 95 if (pttoMaterial) { 96 fMaterial = pttoMaterial; 97 if ( flogicTarget ) { flogicTarget->SetMaterial(fMaterial); } 98 } else { 99 G4cout << "\n--> warning from DetectorConstruction::SetMaterial : " 100 << materialChoice << " not found" << G4endl; 101 } 102 G4RunManager::GetRunManager()->PhysicsHasBeenModified(); 103 } 104 105 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 106 107 108 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 109 G4VPhysicalVolume* DetectorConstruction::ConstructDetector() 110 { 111 112 113 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 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", //its name 128 fWorldSizeX/2,fWorldSizeY/2,fWorldSizeZ/2); //its size 129 130 131 fLogicWorld = new G4LogicalVolume(fSolidWorld, //its solid 132 fWorldMaterial, //its material 133 "World"); //its name 134 135 fPhysiWorld = new G4PVPlacement(0, //no rotation 136 G4ThreeVector(), //at (0,0,0) 137 "World", //its name 138 fLogicWorld, //its logical volume 139 0, //its mother volume 140 false, //no boolean operation 141 0); //copy number 142 143 144 145 ftargetSolid = new G4Box("Target", //its name 146 TargetSizeX/2,TargetSizeY/2,TargetSizeZ/2); //its size 147 148 149 flogicTarget = new G4LogicalVolume(ftargetSolid, //its solid 150 fMaterial, //its material 151 "Target"); //its name 152 153 new G4PVPlacement(0, //no rotation 154 G4ThreeVector(), //at (0,0,0) 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 G4VisAttributes(G4Colour(1.0,1.0,1.0)); //White 163 worldVisAtt->SetVisibility(true); 164 fLogicWorld->SetVisAttributes(worldVisAtt); 165 166 G4VisAttributes* worldVisAtt1 = new G4VisAttributes(G4Colour(1.0,0.0,0.0)); 167 worldVisAtt1->SetVisibility(true); 168 flogicTarget->SetVisAttributes(worldVisAtt1); 169 170 // Create Target G4Region and add logical volume 171 172 fRegion = new G4Region("Target"); 173 174 G4ProductionCuts* cuts = new G4ProductionCuts(); 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........oooOO0OOooo........oooOO0OOooo...... 190 191 void DetectorConstruction::SetSize(G4double value) 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