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