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 /// \file hadronic/Hadr00/src/DetectorConstruc 26 /// \file hadronic/Hadr00/src/DetectorConstruction.cc 27 /// \brief Implementation of the DetectorConst 27 /// \brief Implementation of the DetectorConstruction class 28 // 28 // >> 29 // $Id: DetectorConstruction.cc 77254 2013-11-22 10:08:02Z gcosmo $ 29 // 30 // 30 ////////////////////////////////////////////// 31 ///////////////////////////////////////////////////////////////////////// 31 // 32 // 32 // DetectorConstruction 33 // DetectorConstruction 33 // 34 // 34 // Created: 20.06.2008 V.Ivanchenko 35 // Created: 20.06.2008 V.Ivanchenko 35 // 36 // 36 // Modified: 37 // Modified: 37 // 38 // 38 ////////////////////////////////////////////// 39 //////////////////////////////////////////////////////////////////////// 39 // << 40 // 40 41 41 #include "DetectorConstruction.hh" 42 #include "DetectorConstruction.hh" 42 << 43 #include "DetectorMessenger.hh" 43 #include "DetectorMessenger.hh" 44 44 45 #include "G4Colour.hh" << 45 #include "G4Tubs.hh" 46 #include "G4GeometryManager.hh" << 47 #include "G4LogicalVolume.hh" 46 #include "G4LogicalVolume.hh" 48 #include "G4LogicalVolumeStore.hh" << 49 #include "G4NistManager.hh" << 50 #include "G4PVPlacement.hh" 47 #include "G4PVPlacement.hh" 51 #include "G4PhysicalConstants.hh" << 48 52 #include "G4PhysicalVolumeStore.hh" << 53 #include "G4RunManager.hh" 49 #include "G4RunManager.hh" >> 50 >> 51 #include "G4GeometryManager.hh" >> 52 #include "G4PhysicalVolumeStore.hh" >> 53 #include "G4LogicalVolumeStore.hh" 54 #include "G4SolidStore.hh" 54 #include "G4SolidStore.hh" 55 #include "G4SystemOfUnits.hh" << 55 56 #include "G4Tubs.hh" << 57 #include "G4UnitsTable.hh" << 58 #include "G4VisAttributes.hh" 56 #include "G4VisAttributes.hh" >> 57 #include "G4Colour.hh" >> 58 >> 59 #include "G4UnitsTable.hh" 59 #include "G4ios.hh" 60 #include "G4ios.hh" 60 61 >> 62 #include "G4NistManager.hh" >> 63 >> 64 #include "G4PhysicalConstants.hh" >> 65 #include "G4SystemOfUnits.hh" >> 66 61 //....oooOO0OOooo........oooOO0OOooo........oo 67 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 62 68 63 DetectorConstruction::DetectorConstruction() 69 DetectorConstruction::DetectorConstruction() 64 : G4VUserDetectorConstruction(), << 70 : G4VUserDetectorConstruction(), 65 fTargetMaterial(nullptr), << 71 fTargetMaterial(0), fWorldMaterial(0), 66 fWorldMaterial(nullptr), << 72 fLogicTarget(0), fLogicWorld(0), 67 fSolidW(nullptr), << 73 fDetectorMessenger(0) 68 fSolidA(nullptr), << 69 fLogicTarget(nullptr), << 70 fLogicWorld(nullptr), << 71 fPhysWorld(nullptr), << 72 fPhysList(nullptr) << 73 { 74 { 74 fDetectorMessenger = new DetectorMessenger(t 75 fDetectorMessenger = new DetectorMessenger(this); 75 76 76 fRadius = 5. * cm; << 77 fRadius = 5.*cm; 77 fLength = 10. * cm; << 78 fLength = 10.*cm; 78 79 79 fTargetMaterial = G4NistManager::Instance()- 80 fTargetMaterial = G4NistManager::Instance()->FindOrBuildMaterial("G4_Al"); 80 fWorldMaterial = G4NistManager::Instance()-> << 81 fWorldMaterial = 81 << 82 G4NistManager::Instance()->FindOrBuildMaterial("G4_Galactic"); 82 ComputeGeomParameters(); << 83 } 83 } 84 84 85 //....oooOO0OOooo........oooOO0OOooo........oo 85 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 86 86 87 DetectorConstruction::~DetectorConstruction() 87 DetectorConstruction::~DetectorConstruction() 88 { << 88 { 89 delete fDetectorMessenger; 89 delete fDetectorMessenger; 90 } 90 } 91 91 92 void DetectorConstruction::ComputeGeomParamete << 93 { << 94 // Sizes << 95 fWorldR = fRadius + CLHEP::cm; << 96 fWorldZ = fLength + CLHEP::cm; << 97 if (fPhysWorld) { << 98 fSolidW->SetOuterRadius(fWorldR); << 99 fSolidW->SetZHalfLength(fWorldZ * 0.5); << 100 fSolidA->SetOuterRadius(fRadius); << 101 fSolidA->SetZHalfLength(fLength * 0.5); << 102 } << 103 } << 104 << 105 G4VPhysicalVolume* DetectorConstruction::Const 92 G4VPhysicalVolume* DetectorConstruction::Construct() 106 { 93 { 107 if (fPhysWorld) { << 94 // Cleanup old geometry 108 return fPhysWorld; << 95 109 } << 96 G4GeometryManager::GetInstance()->OpenGeometry(); 110 ComputeGeomParameters(); << 97 G4PhysicalVolumeStore::GetInstance()->Clean(); >> 98 G4LogicalVolumeStore::GetInstance()->Clean(); >> 99 G4SolidStore::GetInstance()->Clean(); >> 100 >> 101 // Sizes >> 102 G4double worldR = fRadius + cm; >> 103 G4double worldZ = fLength + cm; 111 104 112 // 105 // 113 // World 106 // World 114 // 107 // 115 fSolidW = new G4Tubs("World", 0., fWorldR, 0 << 108 G4Tubs* solidW = new G4Tubs("World", 0., worldR, 0.5*worldZ, 0., twopi); 116 fLogicWorld = new G4LogicalVolume(fSolidW, f << 109 fLogicWorld = new G4LogicalVolume(solidW, fWorldMaterial,"World"); 117 fPhysWorld = << 110 G4VPhysicalVolume* world = new G4PVPlacement(0, G4ThreeVector(), 118 new G4PVPlacement(nullptr, G4ThreeVector(0 << 111 fLogicWorld, "World", >> 112 0, false, 0); 119 113 120 // 114 // 121 // Target volume 115 // Target volume 122 // 116 // 123 fSolidA = new G4Tubs("Target", 0., fRadius, << 117 G4Tubs* solidA = new G4Tubs("Target", 0., fRadius, 0.5*fLength, 0.,twopi); 124 fLogicTarget = new G4LogicalVolume(fSolidA, << 118 fLogicTarget = new G4LogicalVolume( solidA, fTargetMaterial, "Target"); 125 new G4PVPlacement(nullptr, G4ThreeVector(), << 119 new G4PVPlacement(0, G4ThreeVector(), fLogicTarget, "Target", 126 << 120 fLogicWorld, false, 0); 127 G4cout << "### Target consist of " << fTarge << 121 128 << " disks with R(mm)= " << fRadius / << 122 G4cout << "### Target consist of " 129 << G4endl; << 123 << fTargetMaterial->GetName() >> 124 << " disks with R(mm)= " << fRadius/mm >> 125 << " fLength(mm)= " << fLength/mm >> 126 << " ###" << G4endl; 130 127 131 // colors 128 // colors 132 fLogicWorld->SetVisAttributes(G4VisAttribute << 129 fLogicWorld->SetVisAttributes(G4VisAttributes::Invisible); 133 130 134 G4VisAttributes* regCcolor = new G4VisAttrib 131 G4VisAttributes* regCcolor = new G4VisAttributes(G4Colour(0., 0.3, 0.7)); 135 fLogicTarget->SetVisAttributes(regCcolor); 132 fLogicTarget->SetVisAttributes(regCcolor); 136 133 137 G4cout << *(G4Material::GetMaterialTable()) 134 G4cout << *(G4Material::GetMaterialTable()) << G4endl; 138 135 139 return fPhysWorld; << 136 return world; 140 } 137 } 141 138 142 //....oooOO0OOooo........oooOO0OOooo........oo 139 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 143 140 144 void DetectorConstruction::SetTargetMaterial(c 141 void DetectorConstruction::SetTargetMaterial(const G4String& mat) 145 { 142 { 146 // search the material by its name 143 // search the material by its name 147 G4Material* material = G4NistManager::Instan 144 G4Material* material = G4NistManager::Instance()->FindOrBuildMaterial(mat); 148 145 149 if (material && material != fTargetMaterial) 146 if (material && material != fTargetMaterial) { 150 fTargetMaterial = material; 147 fTargetMaterial = material; 151 if (fLogicTarget) { << 148 if(fLogicTarget) fLogicTarget->SetMaterial(fTargetMaterial); 152 fLogicTarget->SetMaterial(fTargetMateria << 153 } << 154 G4RunManager::GetRunManager()->PhysicsHasB 149 G4RunManager::GetRunManager()->PhysicsHasBeenModified(); 155 } 150 } 156 } 151 } 157 152 158 //....oooOO0OOooo........oooOO0OOooo........oo 153 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 159 154 160 void DetectorConstruction::SetWorldMaterial(co 155 void DetectorConstruction::SetWorldMaterial(const G4String& mat) 161 { 156 { 162 // search the material by its name 157 // search the material by its name 163 G4Material* material = G4NistManager::Instan 158 G4Material* material = G4NistManager::Instance()->FindOrBuildMaterial(mat); 164 159 165 if (material && material != fWorldMaterial) 160 if (material && material != fWorldMaterial) { 166 fWorldMaterial = material; 161 fWorldMaterial = material; 167 if (fLogicWorld) { << 162 if(fLogicWorld) fLogicWorld->SetMaterial(fWorldMaterial); 168 fLogicWorld->SetMaterial(fWorldMaterial) << 169 } << 170 G4RunManager::GetRunManager()->PhysicsHasB 163 G4RunManager::GetRunManager()->PhysicsHasBeenModified(); 171 } 164 } 172 } 165 } 173 166 174 void DetectorConstruction::SetTargetRadius(G4d << 167 void DetectorConstruction::SetTargetRadius(G4double val) 175 { 168 { 176 if (val > 0.0 && val != fRadius) { << 169 if(val > 0.0 && val != fRadius) { 177 fRadius = val; 170 fRadius = val; 178 ComputeGeomParameters(); << 171 G4RunManager::GetRunManager()->ReinitializeGeometry(); 179 } << 172 } 180 } 173 } 181 174 182 //....oooOO0OOooo........oooOO0OOooo........oo 175 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 183 176 184 void DetectorConstruction::SetTargetLength(G4d << 177 void DetectorConstruction::SetTargetLength(G4double val) 185 { 178 { 186 if (val > 0.0 && val != fLength) { << 179 if(val > 0.0 && val != fLength) { 187 fLength = val; 180 fLength = val; 188 ComputeGeomParameters(); << 181 G4RunManager::GetRunManager()->ReinitializeGeometry(); 189 } << 182 } 190 } 183 } 191 184 192 //....oooOO0OOooo........oooOO0OOooo........oo 185 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 193 186