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 // History : << 27 // 21/10/2021 : DLa update to modify the m << 28 // ------------------------------------------- 26 // ------------------------------------------------------------------- >> 27 // $Id: DetectorConstruction.cc,v 1.1 2012-09-20 mraine Exp $ 29 // ------------------------------------------- 28 // ------------------------------------------------------------------- 30 29 31 #include "DetectorConstruction.hh" 30 #include "DetectorConstruction.hh" 32 #include "DetectorMessenger.hh" << 33 #include "G4SystemOfUnits.hh" 31 #include "G4SystemOfUnits.hh" 34 #include "G4Region.hh" 32 #include "G4Region.hh" 35 #include "G4ProductionCuts.hh" 33 #include "G4ProductionCuts.hh" 36 #include "G4RunManager.hh" << 37 34 38 //....oooOO0OOooo........oooOO0OOooo........oo 35 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 39 36 40 DetectorConstruction::DetectorConstruction() 37 DetectorConstruction::DetectorConstruction() 41 :G4VUserDetectorConstruction(), fPhysiWorld(nu << 38 :fPhysiWorld(NULL), fLogicWorld(NULL), fSolidWorld(NULL) 42 { << 39 {} 43 fBoxSize = 1.0*um; << 44 DefineMaterials(); << 45 SetMaterial("G4_Si"); << 46 fDetectorMessenger = new DetectorMessenger(t << 47 } << 48 40 49 //....oooOO0OOooo........oooOO0OOooo........oo 41 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 50 42 51 DetectorConstruction::~DetectorConstruction() 43 DetectorConstruction::~DetectorConstruction() 52 { << 44 {} 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 45 64 //....oooOO0OOooo........oooOO0OOooo........oo 46 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 65 47 66 G4VPhysicalVolume* DetectorConstruction::Const 48 G4VPhysicalVolume* DetectorConstruction::Construct() 67 49 68 { 50 { 69 DefineMaterials(); 51 DefineMaterials(); 70 return ConstructDetector(); 52 return ConstructDetector(); 71 } 53 } 72 54 73 //....oooOO0OOooo........oooOO0OOooo........oo 55 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 74 56 75 void DetectorConstruction::DefineMaterials() 57 void DetectorConstruction::DefineMaterials() 76 { 58 { 77 59 78 // Silicon is defined from NIST material dat 60 // Silicon is defined from NIST material database 79 G4NistManager * man = G4NistManager::Instanc 61 G4NistManager * man = G4NistManager::Instance(); 80 fMaterial = man->FindOrBuildMaterial("G4_Si << 62 G4Material * Si = man->FindOrBuildMaterial("G4_Si"); 81 fWorldMaterial = man->FindOrBuildMaterial(" << 82 << 83 } << 84 63 85 //....oooOO0OOooo........oooOO0OOooo........oo << 64 // Default materials in setup. 86 << 65 fSiMaterial = Si; 87 << 66 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 } 67 } 104 68 105 //....oooOO0OOooo........oooOO0OOooo........oo << 106 << 107 << 108 //....oooOO0OOooo........oooOO0OOooo........oo 69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 109 G4VPhysicalVolume* DetectorConstruction::Const 70 G4VPhysicalVolume* DetectorConstruction::ConstructDetector() 110 { 71 { 111 72 112 << 113 //....oooOO0OOooo........oooOO0OOooo........oo 73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 114 74 115 // WORLD VOLUME 75 // WORLD VOLUME 116 76 117 << 77 fWorldSizeX = 1*um; 118 G4double TargetSizeX = 1*um; << 78 fWorldSizeY = 1*um; 119 G4double TargetSizeY = TargetSizeX; << 79 fWorldSizeZ = 1*um; 120 G4double TargetSizeZ = TargetSizeX; << 121 fBoxSize = TargetSizeX; << 122 << 123 fWorldSizeX = TargetSizeX*2; << 124 fWorldSizeY = TargetSizeY*2; << 125 fWorldSizeZ = TargetSizeZ*2; << 126 80 127 fSolidWorld = new G4Box("World", 81 fSolidWorld = new G4Box("World", //its name 128 fWorldSizeX/2,fWorldSizeY/2,fWorldSiz 82 fWorldSizeX/2,fWorldSizeY/2,fWorldSizeZ/2); //its size 129 83 130 84 131 fLogicWorld = new G4LogicalVolume(fSolidWorl 85 fLogicWorld = new G4LogicalVolume(fSolidWorld, //its solid 132 fWorldMaterial, //its material << 86 fSiMaterial, //its material 133 "World"); //its name 87 "World"); //its name 134 88 135 fPhysiWorld = new G4PVPlacement(0, //no 89 fPhysiWorld = new G4PVPlacement(0, //no rotation 136 G4ThreeVector(), //at (0,0,0) 90 G4ThreeVector(), //at (0,0,0) 137 "World", // 91 "World", //its name 138 fLogicWorld, 92 fLogicWorld, //its logical volume 139 0, //its 93 0, //its mother volume 140 false, // 94 false, //no boolean operation 141 0); //co 95 0); //copy number 142 96 >> 97 G4double TargetSizeZ = 0.2*um; 143 98 144 << 99 G4Box* targetSolid = new G4Box("Target", //its name 145 ftargetSolid = new G4Box("Target", << 100 fWorldSizeX/2,fWorldSizeY/2,TargetSizeZ/2); //its size 146 TargetSizeX/2,TargetSizeY/2,TargetSiz << 147 101 148 102 149 flogicTarget = new G4LogicalVolume(ftargetSo << 103 G4LogicalVolume* logicTarget = new G4LogicalVolume(targetSolid, //its solid 150 fMaterial, //its material << 104 fSiMaterial, //its material 151 "Target"); //its name 105 "Target"); //its name 152 106 153 new G4PVPlacement(0, 107 new G4PVPlacement(0, //no rotation 154 G4ThreeVector(), 108 G4ThreeVector(), //at (0,0,0) 155 "Target", //its name 109 "Target", //its name 156 flogicTarget, //its logical volume << 110 logicTarget, //its logical volume 157 fPhysiWorld, //its mother volume 111 fPhysiWorld, //its mother volume 158 false, //no boolean operation 112 false, //no boolean operation 159 0); //copy number 113 0); //copy number 160 114 161 // Visualization attributes 115 // Visualization attributes 162 G4VisAttributes* worldVisAtt= new G4VisAttri 116 G4VisAttributes* worldVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); //White 163 worldVisAtt->SetVisibility(true); 117 worldVisAtt->SetVisibility(true); 164 fLogicWorld->SetVisAttributes(worldVisAtt); 118 fLogicWorld->SetVisAttributes(worldVisAtt); 165 119 166 G4VisAttributes* worldVisAtt1 = new G4VisAtt 120 G4VisAttributes* worldVisAtt1 = new G4VisAttributes(G4Colour(1.0,0.0,0.0)); 167 worldVisAtt1->SetVisibility(true); 121 worldVisAtt1->SetVisibility(true); 168 flogicTarget->SetVisAttributes(worldVisAtt1) << 122 logicTarget->SetVisAttributes(worldVisAtt1); 169 123 170 // Create Target G4Region and add logical vo 124 // Create Target G4Region and add logical volume 171 125 172 fRegion = new G4Region("Target"); 126 fRegion = new G4Region("Target"); 173 127 174 G4ProductionCuts* cuts = new G4ProductionCut 128 G4ProductionCuts* cuts = new G4ProductionCuts(); 175 129 176 G4double defCut = 1*nanometer; 130 G4double defCut = 1*nanometer; 177 cuts->SetProductionCut(defCut,"gamma"); 131 cuts->SetProductionCut(defCut,"gamma"); 178 cuts->SetProductionCut(defCut,"e-"); 132 cuts->SetProductionCut(defCut,"e-"); 179 cuts->SetProductionCut(defCut,"e+"); 133 cuts->SetProductionCut(defCut,"e+"); 180 cuts->SetProductionCut(defCut,"proton"); 134 cuts->SetProductionCut(defCut,"proton"); 181 135 182 fRegion->SetProductionCuts(cuts); 136 fRegion->SetProductionCuts(cuts); 183 fRegion->AddRootLogicalVolume(flogicTarget); << 137 fRegion->AddRootLogicalVolume(logicTarget); 184 138 185 return fPhysiWorld; 139 return fPhysiWorld; 186 } 140 } 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 141