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