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 // 26 // 27 /// \file GB03DetectorConstruction.cc 27 /// \file GB03DetectorConstruction.cc 28 /// \brief Implementation of the GB03DetectorC 28 /// \brief Implementation of the GB03DetectorConstruction class 29 29 30 #include "GB03DetectorConstruction.hh" 30 #include "GB03DetectorConstruction.hh" 31 31 32 #include "GB03BOptrGeometryBasedBiasing.hh" << 32 #include "G4RunManager.hh" 33 #include "GB03DetectorMessenger.hh" << 34 33 >> 34 #include "G4Material.hh" 35 #include "G4Box.hh" 35 #include "G4Box.hh" 36 #include "G4Colour.hh" << 37 #include "G4LogicalVolume.hh" 36 #include "G4LogicalVolume.hh" 38 #include "G4Material.hh" << 39 #include "G4MultiFunctionalDetector.hh" << 40 #include "G4PSEnergyDeposit.hh" << 41 #include "G4PSFlatSurfaceFlux.hh" << 42 #include "G4PVPlacement.hh" 37 #include "G4PVPlacement.hh" 43 #include "G4PVReplica.hh" 38 #include "G4PVReplica.hh" 44 #include "G4PhysicalConstants.hh" << 39 45 #include "G4RunManager.hh" << 40 #include "G4VisAttributes.hh" 46 #include "G4SDChargedFilter.hh" << 41 #include "G4Colour.hh" >> 42 47 #include "G4SDManager.hh" 43 #include "G4SDManager.hh" >> 44 #include "G4MultiFunctionalDetector.hh" >> 45 #include "G4PSEnergyDeposit.hh" >> 46 #include "G4PSFlatSurfaceFlux.hh" 48 #include "G4SDNeutralFilter.hh" 47 #include "G4SDNeutralFilter.hh" 49 #include "G4SystemOfUnits.hh" << 48 #include "G4SDChargedFilter.hh" 50 #include "G4VisAttributes.hh" << 51 #include "G4ios.hh" 49 #include "G4ios.hh" 52 50 >> 51 #include "GB03DetectorMessenger.hh" >> 52 >> 53 #include "GB03BOptrGeometryBasedBiasing.hh" >> 54 >> 55 #include "G4PhysicalConstants.hh" >> 56 #include "G4SystemOfUnits.hh" >> 57 53 G4int GB03DetectorConstruction::fNumberOfLayer 58 G4int GB03DetectorConstruction::fNumberOfLayers = 40; 54 G4ThreadLocal G4bool GB03DetectorConstruction: 59 G4ThreadLocal G4bool GB03DetectorConstruction::fConstructedSDandField = false; 55 60 56 //....oooOO0OOooo........oooOO0OOooo........oo 61 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 57 62 58 GB03DetectorConstruction::GB03DetectorConstruc 63 GB03DetectorConstruction::GB03DetectorConstruction() 59 : G4VUserDetectorConstruction(), << 64 : G4VUserDetectorConstruction(), 60 fTotalThickness(2.0 * m), << 65 fTotalThickness (2.0*m), fLayerThickness(0.), 61 fLayerThickness(0.), << 66 fConstructed(false), 62 fConstructed(false), << 67 fWorldMaterial(0), fAbsorberMaterial(0), fGapMaterial(0), 63 fWorldMaterial(0), << 68 fLayerSolid(0), fGapSolid(0), 64 fAbsorberMaterial(0), << 69 fWorldLogical(0), fCalorLogical(0), fLayerLogical(0), fGapLogical(0), 65 fGapMaterial(0), << 70 fWorldPhysical(0), fCalorPhysical(0), fLayerPhysical(0), fGapPhysical(0), 66 fLayerSolid(0), << 71 fDetectorMessenger(0), fVerboseLevel(1) 67 fGapSolid(0), << 68 fWorldLogical(0), << 69 fCalorLogical(0), << 70 fLayerLogical(0), << 71 fGapLogical(0), << 72 fWorldPhysical(0), << 73 fCalorPhysical(0), << 74 fLayerPhysical(0), << 75 fGapPhysical(0), << 76 fDetectorMessenger(0), << 77 fVerboseLevel(1) << 78 { 72 { 79 fLayerThickness = fTotalThickness / fNumberO 73 fLayerThickness = fTotalThickness / fNumberOfLayers; 80 fCalName = "Calor"; 74 fCalName = "Calor"; 81 fDetectorMessenger = new GB03DetectorMesseng 75 fDetectorMessenger = new GB03DetectorMessenger(this); 82 } 76 } 83 77 84 //....oooOO0OOooo........oooOO0OOooo........oo 78 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 85 79 86 GB03DetectorConstruction::~GB03DetectorConstru 80 GB03DetectorConstruction::~GB03DetectorConstruction() 87 { << 81 { delete fDetectorMessenger;} 88 delete fDetectorMessenger; << 89 } << 90 82 91 //....oooOO0OOooo........oooOO0OOooo........oo 83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 92 84 93 G4VPhysicalVolume* GB03DetectorConstruction::C 85 G4VPhysicalVolume* GB03DetectorConstruction::Construct() 94 { 86 { 95 if (!fConstructed) { << 87 if(!fConstructed) >> 88 { 96 fConstructed = true; 89 fConstructed = true; 97 DefineMaterials(); 90 DefineMaterials(); 98 SetupGeometry(); 91 SetupGeometry(); 99 } 92 } 100 if (GetVerboseLevel() > 0) { << 93 if (GetVerboseLevel()>0) 101 PrintCalorParameters(); << 94 { PrintCalorParameters(); } 102 } << 103 95 104 return fWorldPhysical; 96 return fWorldPhysical; 105 } 97 } 106 98 107 //....oooOO0OOooo........oooOO0OOooo........oo 99 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 108 100 109 void GB03DetectorConstruction::ConstructSDandF 101 void GB03DetectorConstruction::ConstructSDandField() 110 { 102 { 111 if (!fConstructedSDandField) { << 103 if(!fConstructedSDandField) >> 104 { 112 fConstructedSDandField = true; 105 fConstructedSDandField = true; 113 SetupDetectors(); 106 SetupDetectors(); 114 SetupBiasing(); 107 SetupBiasing(); 115 } 108 } 116 } 109 } 117 110 118 //....oooOO0OOooo........oooOO0OOooo........oo 111 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 119 112 120 void GB03DetectorConstruction::DefineMaterials 113 void GB03DetectorConstruction::DefineMaterials() 121 { << 114 { 122 G4String name, symbol; // a=mass of a mole; << 115 G4String name, symbol; //a=mass of a mole; 123 G4double a, z, density; // z=mean number of << 116 G4double a, z, density; //z=mean number of protons; 124 G4int iz; // iz=number of protons in an is << 117 G4int iz; //iz=number of protons in an isotope; 125 G4int n; // n=number of nucleons in an isot << 118 G4int n; // n=number of nucleons in an isotope; 126 119 127 G4int ncomponents, natoms; 120 G4int ncomponents, natoms; 128 G4double abundance, fractionmass; 121 G4double abundance, fractionmass; 129 G4double temperature, pressure; 122 G4double temperature, pressure; 130 123 131 // 124 // 132 // define Elements 125 // define Elements 133 // 126 // 134 127 135 a = 1.01 * g / mole; << 128 a = 1.01*g/mole; 136 G4Element* H = new G4Element(name = "Hydroge << 129 G4Element* H = new G4Element(name="Hydrogen",symbol="H" , z= 1., a); 137 130 138 a = 12.01 * g / mole; << 131 a = 12.01*g/mole; 139 G4Element* C = new G4Element(name = "Carbon" << 132 G4Element* C = new G4Element(name="Carbon" ,symbol="C" , z= 6., a); 140 133 141 a = 14.01 * g / mole; << 134 a = 14.01*g/mole; 142 G4Element* N = new G4Element(name = "Nitroge << 135 G4Element* N = new G4Element(name="Nitrogen",symbol="N" , z= 7., a); 143 136 144 a = 16.00 * g / mole; << 137 a = 16.00*g/mole; 145 G4Element* O = new G4Element(name = "Oxygen" << 138 G4Element* O = new G4Element(name="Oxygen" ,symbol="O" , z= 8., a); 146 139 147 // 140 // 148 // define an Element from isotopes, by relat << 141 // define an Element from isotopes, by relative abundance 149 // 142 // 150 143 151 G4Isotope* U5 = new G4Isotope(name = "U235", << 144 G4Isotope* U5 = new G4Isotope(name="U235", iz=92, n=235, a=235.01*g/mole); 152 G4Isotope* U8 = new G4Isotope(name = "U238", << 145 G4Isotope* U8 = new G4Isotope(name="U238", iz=92, n=238, a=238.03*g/mole); 153 146 154 G4Element* U = new G4Element(name = "enriche << 147 G4Element* U = new G4Element(name="enriched Uranium",symbol="U",ncomponents=2); 155 U->AddIsotope(U5, abundance = 90. * perCent) << 148 U->AddIsotope(U5, abundance= 90.*perCent); 156 U->AddIsotope(U8, abundance = 10. * perCent) << 149 U->AddIsotope(U8, abundance= 10.*perCent); 157 150 158 // 151 // 159 // define simple materials 152 // define simple materials 160 // 153 // 161 154 162 new G4Material(name = "Aluminium", z = 13., << 155 new G4Material(name="Aluminium", z=13., a=26.98*g/mole, density=2.700*g/cm3); 163 new G4Material(name = "Silicon", z = 14., a << 156 new G4Material(name="Silicon", z=14., a= 28.09*g/mole, density= 2.33*g/cm3); 164 new G4Material(name = "Iron", z = 26., a = 5 << 157 new G4Material(name="Iron", z=26., a=55.85*g/mole, density=7.87*g/cm3); 165 new G4Material(name = "ArgonGas", z = 18., a << 158 new G4Material(name="ArgonGas",z=18., a= 39.95*g/mole, density=1.782*mg/cm3); 166 new G4Material(name = "He", z = 2., a = 4.0 << 159 new G4Material(name="He", z=2., a=4.0*g/mole, density=0.1786e-03*g/cm3); 167 << 160 168 density = 1.390 * g / cm3; << 161 density = 1.390*g/cm3; 169 a = 39.95 * g / mole; << 162 a = 39.95*g/mole; 170 new G4Material(name = "liquidArgon", z = 18. << 163 new G4Material(name="liquidArgon", z=18., a, density); 171 << 164 172 density = 11.35 * g / cm3; << 165 density = 11.35*g/cm3; 173 a = 207.19 * g / mole; << 166 a = 207.19*g/mole; 174 G4Material* Pb = new G4Material(name = "Lead << 167 G4Material* Pb = new G4Material(name="Lead" , z=82., a, density); 175 168 176 // 169 // 177 // define a material from elements. case 1 170 // define a material from elements. case 1: chemical molecule 178 // 171 // 179 << 172 180 density = 1.000 * g / cm3; << 173 density = 1.000*g/cm3; 181 G4Material* H2O = new G4Material(name = "Wat << 174 G4Material* H2O = new G4Material(name="Water", density, ncomponents=2); 182 H2O->AddElement(H, natoms = 2); << 175 H2O->AddElement(H, natoms=2); 183 H2O->AddElement(O, natoms = 1); << 176 H2O->AddElement(O, natoms=1); 184 << 177 185 density = 1.032 * g / cm3; << 178 density = 1.032*g/cm3; 186 G4Material* Sci = new G4Material(name = "Sci << 179 G4Material* Sci = new G4Material(name="Scintillator", density, ncomponents=2); 187 Sci->AddElement(C, natoms = 9); << 180 Sci->AddElement(C, natoms=9); 188 Sci->AddElement(H, natoms = 10); << 181 Sci->AddElement(H, natoms=10); 189 182 190 // 183 // 191 // define a material from elements. case 2 184 // define a material from elements. case 2: mixture by fractional mass 192 // 185 // 193 186 194 density = 1.290 * mg / cm3; << 187 density = 1.290*mg/cm3; 195 G4Material* Air = new G4Material(name = "Air << 188 G4Material* Air = new G4Material(name="Air" , density, ncomponents=2); 196 Air->AddElement(N, fractionmass = 0.7); << 189 Air->AddElement(N, fractionmass=0.7); 197 Air->AddElement(O, fractionmass = 0.3); << 190 Air->AddElement(O, fractionmass=0.3); 198 191 199 // 192 // 200 // examples of vacuum 193 // examples of vacuum 201 // 194 // 202 195 203 density = universe_mean_density; << 196 density = universe_mean_density; 204 pressure = 3.e-18 * pascal; << 197 pressure = 3.e-18*pascal; 205 temperature = 2.73 * kelvin; << 198 temperature = 2.73*kelvin; 206 G4Material* Vacuum = new G4Material(name = " << 199 G4Material* Vacuum = new G4Material(name="Galactic", z=1., a=1.01*g/mole, 207 kStateGa << 200 density,kStateGas,temperature,pressure); 208 201 209 if (GetVerboseLevel() > 1) { << 202 if (GetVerboseLevel()>1) { 210 G4cout << *(G4Material::GetMaterialTable() 203 G4cout << *(G4Material::GetMaterialTable()) << G4endl; 211 } 204 } 212 205 213 // default materials of the calorimeter << 206 //default materials of the calorimeter 214 fWorldMaterial = Vacuum; << 207 fWorldMaterial = Vacuum; 215 fAbsorberMaterial = Pb; 208 fAbsorberMaterial = Pb; 216 fGapMaterial = Sci; << 209 fGapMaterial = Sci; 217 } 210 } 218 211 219 //....oooOO0OOooo........oooOO0OOooo........oo 212 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 220 213 221 void GB03DetectorConstruction::SetupGeometry() 214 void GB03DetectorConstruction::SetupGeometry() 222 { 215 { 223 // << 216 // 224 // World 217 // World 225 // 218 // 226 G4VSolid* worldSolid = new G4Box("World", 2. << 219 G4VSolid* worldSolid = new G4Box("World",2.*m,2.*m,fTotalThickness*2.); 227 fWorldLogical = new G4LogicalVolume(worldSol << 220 fWorldLogical = new G4LogicalVolume(worldSolid,fWorldMaterial,"World"); 228 fWorldPhysical = new G4PVPlacement(0, G4Thre << 221 fWorldPhysical = new G4PVPlacement(0,G4ThreeVector(),fWorldLogical,"World", 229 << 222 0,false,0); 230 // << 223 >> 224 // 231 // Calorimeter 225 // Calorimeter 232 // << 226 // 233 G4VSolid* calorSolid = new G4Box("Calor", 0. << 227 G4VSolid* calorSolid = new G4Box("Calor",0.5*m,0.5*m,fTotalThickness/2.); 234 fCalorLogical = new G4LogicalVolume(calorSol << 228 fCalorLogical = new G4LogicalVolume(calorSolid,fAbsorberMaterial,fCalName); 235 fCalorPhysical = new G4PVPlacement(0, G4Thre << 229 fCalorPhysical = new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), 236 fWorldLog << 230 fCalorLogical,fCalName,fWorldLogical,false,0); 237 << 231 238 // << 232 // 239 // Layers --- as absorbers 233 // Layers --- as absorbers 240 // 234 // 241 fLayerSolid = new G4Box("Layer", 0.5 * m, 0. << 235 fLayerSolid = new G4Box("Layer",0.5*m,0.5*m,fLayerThickness/2.); 242 fLayerLogical = new G4LogicalVolume(fLayerSo << 236 fLayerLogical 243 fLayerPhysical = new G4PVReplica(fCalName + << 237 = new G4LogicalVolume(fLayerSolid,fAbsorberMaterial,fCalName+"_LayerLog"); 244 fNumberOfLa << 238 fLayerPhysical 245 << 239 = new G4PVReplica(fCalName+"_Layer",fLayerLogical,fCalorLogical, >> 240 kZAxis,fNumberOfLayers,fLayerThickness); >> 241 246 // 242 // 247 // Gap 243 // Gap 248 // 244 // 249 fGapSolid = new G4Box("Gap", 0.5 * m, 0.5 * << 245 fGapSolid = new G4Box("Gap",0.5*m,0.5*m,fLayerThickness/4.); 250 fGapLogical = new G4LogicalVolume(fGapSolid, << 246 fGapLogical = new G4LogicalVolume(fGapSolid,fGapMaterial,fCalName+"_Gap"); 251 fGapPhysical = new G4PVPlacement(0, G4ThreeV << 247 fGapPhysical = new G4PVPlacement(0,G4ThreeVector(0.,0.,fLayerThickness/4.), 252 fCalName + << 248 fGapLogical,fCalName+"_gap",fLayerLogical,false,0); 253 249 254 // << 250 // 255 // Visualization attributes 251 // Visualization attributes 256 // 252 // 257 fWorldLogical->SetVisAttributes(G4VisAttribu 253 fWorldLogical->SetVisAttributes(G4VisAttributes::GetInvisible()); 258 G4VisAttributes* simpleBoxVisAtt = new G4Vis << 254 G4VisAttributes* simpleBoxVisAtt= new G4VisAttributes(G4Colour(1.0,1.0,1.0)); 259 simpleBoxVisAtt->SetVisibility(true); 255 simpleBoxVisAtt->SetVisibility(true); 260 fCalorLogical->SetVisAttributes(simpleBoxVis 256 fCalorLogical->SetVisAttributes(simpleBoxVisAtt); 261 fLayerLogical->SetVisAttributes(simpleBoxVis 257 fLayerLogical->SetVisAttributes(simpleBoxVisAtt); 262 fGapLogical->SetVisAttributes(simpleBoxVisAt 258 fGapLogical->SetVisAttributes(simpleBoxVisAtt); >> 259 263 } 260 } 264 261 265 //....oooOO0OOooo........oooOO0OOooo........oo 262 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 266 263 267 void GB03DetectorConstruction::SetupDetectors( 264 void GB03DetectorConstruction::SetupDetectors() 268 { 265 { 269 G4SDManager::GetSDMpointer()->SetVerboseLeve 266 G4SDManager::GetSDMpointer()->SetVerboseLevel(1); 270 G4String filterName; 267 G4String filterName; 271 268 272 G4SDNeutralFilter* neutralFilter = new G4SDN << 269 G4SDNeutralFilter* neutralFilter 273 G4SDChargedFilter* chargedFilter = new G4SDC << 270 = new G4SDNeutralFilter(filterName="neutralFilter"); >> 271 G4SDChargedFilter* chargedFilter >> 272 = new G4SDChargedFilter(filterName="chargedFilter"); 274 273 275 for (G4int j = 0; j < 2; j++) { << 274 for(G4int j=0;j<2;j++) >> 275 { 276 // Loop counter j = 0 : absorber 276 // Loop counter j = 0 : absorber 277 // = 1 : gap 277 // = 1 : gap 278 G4String detName = fCalName; 278 G4String detName = fCalName; 279 if (j == 0) { << 279 if(j==0) 280 detName += "_abs"; << 280 { detName += "_abs"; } 281 } << 281 else 282 else { << 282 { detName += "_gap"; } 283 detName += "_gap"; << 284 } << 285 G4MultiFunctionalDetector* det = new G4Mul 283 G4MultiFunctionalDetector* det = new G4MultiFunctionalDetector(detName); 286 G4SDManager::GetSDMpointer()->AddNewDetect 284 G4SDManager::GetSDMpointer()->AddNewDetector(det); 287 // The second argument in each primitive m << 285 // The second argument in each primitive means the "level" of geometrical 288 // hierarchy, the copy number of that leve << 286 // hierarchy, the copy number of that level is used as the key of the 289 // G4THitsMap. 287 // G4THitsMap. 290 // For absorber (j = 0), the copy number o 288 // For absorber (j = 0), the copy number of its own physical volume is used. 291 // For gap (j = 1), the copy number of its << 289 // For gap (j = 1), the copy number of its mother physical volume is used, 292 // since there is only one physical volume << 290 // since there is only one physical volume of gap is placed with respect 293 // to its mother. 291 // to its mother. 294 G4VPrimitiveScorer* primitive; 292 G4VPrimitiveScorer* primitive; 295 primitive = new G4PSEnergyDeposit("eDep", << 293 primitive = new G4PSEnergyDeposit("eDep",j); 296 det->RegisterPrimitive(primitive); 294 det->RegisterPrimitive(primitive); 297 primitive = new G4PSFlatSurfaceFlux("nNeut << 295 primitive = new G4PSFlatSurfaceFlux("nNeutral",1,j); 298 primitive->SetFilter(neutralFilter); 296 primitive->SetFilter(neutralFilter); 299 det->RegisterPrimitive(primitive); 297 det->RegisterPrimitive(primitive); 300 primitive = new G4PSFlatSurfaceFlux("nChar << 298 primitive = new G4PSFlatSurfaceFlux("nCharged",1,j); 301 primitive->SetFilter(chargedFilter); 299 primitive->SetFilter(chargedFilter); 302 det->RegisterPrimitive(primitive); 300 det->RegisterPrimitive(primitive); 303 301 304 if (j == 0) { << 302 if(j==0) 305 SetSensitiveDetector(fLayerLogical, det) << 303 { SetSensitiveDetector(fLayerLogical, det); } 306 } << 304 else 307 else { << 305 { SetSensitiveDetector(fGapLogical, det);} 308 SetSensitiveDetector(fGapLogical, det); << 306 309 } << 310 } 307 } 311 G4SDManager::GetSDMpointer()->SetVerboseLeve 308 G4SDManager::GetSDMpointer()->SetVerboseLevel(0); 312 } 309 } 313 310 314 //....oooOO0OOooo........oooOO0OOooo........oo 311 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 315 312 316 void GB03DetectorConstruction::SetupBiasing() 313 void GB03DetectorConstruction::SetupBiasing() 317 { 314 { 318 GB03BOptrGeometryBasedBiasing* biasingOperat 315 GB03BOptrGeometryBasedBiasing* biasingOperator = new GB03BOptrGeometryBasedBiasing(); 319 biasingOperator->AttachTo(fLayerLogical); 316 biasingOperator->AttachTo(fLayerLogical); 320 } 317 } 321 318 322 //....oooOO0OOooo........oooOO0OOooo........oo 319 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 323 320 324 void GB03DetectorConstruction::PrintCalorParam 321 void GB03DetectorConstruction::PrintCalorParameters() const 325 { 322 { 326 G4cout << "--------------------------------- << 323 G4cout 327 G4cout << " Absorber is made of " << fAbsorb << 324 << "--------------------------------------------------------" << G4endl; 328 << fGapMaterial->GetName() << G4endl << 325 G4cout 329 << "--------------------------------- << 326 << " Absorber is made of " << fAbsorberMaterial->GetName() << G4endl >> 327 << " Gap is made of " << fGapMaterial->GetName() << G4endl >> 328 << "--------------------------------------------------------" << G4endl; 330 } 329 } 331 330 332 //....oooOO0OOooo........oooOO0OOooo........oo 331 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 333 332 334 void GB03DetectorConstruction::SetAbsorberMate 333 void GB03DetectorConstruction::SetAbsorberMaterial(G4String materialChoice) 335 { 334 { 336 // search the material by its name << 335 // search the material by its name 337 G4Material* pttoMaterial = G4Material::GetMa << 336 G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice); 338 if (pttoMaterial) { << 337 if(pttoMaterial) >> 338 { 339 fAbsorberMaterial = pttoMaterial; 339 fAbsorberMaterial = pttoMaterial; 340 if (fConstructed) { << 340 if(fConstructed) >> 341 { 341 fCalorLogical->SetMaterial(fAbsorberMate 342 fCalorLogical->SetMaterial(fAbsorberMaterial); 342 fLayerLogical->SetMaterial(fAbsorberMate 343 fLayerLogical->SetMaterial(fAbsorberMaterial); 343 } 344 } 344 G4RunManager::GetRunManager()->GeometryHas 345 G4RunManager::GetRunManager()->GeometryHasBeenModified(); 345 if (GetVerboseLevel() > 1) { << 346 if (GetVerboseLevel()>1) { 346 PrintCalorParameters(); 347 PrintCalorParameters(); 347 } 348 } 348 } 349 } 349 else { << 350 else 350 G4cerr << materialChoice << " is not defin << 351 { >> 352 G4cerr >> 353 << materialChoice << " is not defined. - Command is ignored." << G4endl; 351 } 354 } 352 } 355 } 353 356 354 //....oooOO0OOooo........oooOO0OOooo........oo 357 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 355 358 356 G4String GB03DetectorConstruction::GetAbsorber 359 G4String GB03DetectorConstruction::GetAbsorberMaterial() const 357 { << 360 { return fAbsorberMaterial->GetName(); } 358 return fAbsorberMaterial->GetName(); << 359 } << 360 361 361 //....oooOO0OOooo........oooOO0OOooo........oo 362 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 362 363 363 void GB03DetectorConstruction::SetGapMaterial( 364 void GB03DetectorConstruction::SetGapMaterial(G4String materialChoice) 364 { 365 { 365 // search the material by its name << 366 // search the material by its name 366 G4Material* pttoMaterial = G4Material::GetMa << 367 G4Material* pttoMaterial = G4Material::GetMaterial(materialChoice); 367 if (pttoMaterial) { << 368 if(pttoMaterial) >> 369 { 368 fGapMaterial = pttoMaterial; 370 fGapMaterial = pttoMaterial; 369 if (fConstructed) { << 371 if(fConstructed) 370 fGapLogical->SetMaterial(fGapMaterial); << 372 { fGapLogical->SetMaterial(fGapMaterial); } 371 } << 372 G4RunManager::GetRunManager()->GeometryHas 373 G4RunManager::GetRunManager()->GeometryHasBeenModified(); 373 if (GetVerboseLevel() > 1) { << 374 if (GetVerboseLevel()>1) { 374 PrintCalorParameters(); 375 PrintCalorParameters(); 375 } 376 } 376 } 377 } 377 else { << 378 else 378 G4cerr << materialChoice << " is not defin << 379 { >> 380 G4cerr >> 381 << materialChoice << " is not defined. - Command is ignored." << G4endl; 379 } 382 } 380 } 383 } 381 384 382 //....oooOO0OOooo........oooOO0OOooo........oo 385 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 383 386 384 G4String GB03DetectorConstruction::GetGapMater 387 G4String GB03DetectorConstruction::GetGapMaterial() const 385 { << 388 { return fGapMaterial->GetName(); } 386 return fGapMaterial->GetName(); << 387 } << 388 389 389 //....oooOO0OOooo........oooOO0OOooo........oo 390 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 390 391 391 void GB03DetectorConstruction::SetNumberOfLaye 392 void GB03DetectorConstruction::SetNumberOfLayers(G4int nl) 392 { 393 { 393 fNumberOfLayers = nl; 394 fNumberOfLayers = nl; 394 fLayerThickness = fTotalThickness / fNumberO << 395 fLayerThickness = fTotalThickness/fNumberOfLayers; 395 if (!fConstructed) return; << 396 if(!fConstructed) return; 396 397 397 fLayerSolid->SetZHalfLength(fLayerThickness << 398 fLayerSolid->SetZHalfLength(fLayerThickness/2.); 398 fGapSolid->SetZHalfLength(fLayerThickness / << 399 fGapSolid->SetZHalfLength(fLayerThickness/4.); 399 400 400 fCalorLogical->RemoveDaughter(fLayerPhysical 401 fCalorLogical->RemoveDaughter(fLayerPhysical); 401 delete fLayerPhysical; 402 delete fLayerPhysical; 402 fLayerPhysical = new G4PVReplica(fCalName + << 403 fLayerPhysical 403 fNumberOfLa << 404 = new G4PVReplica(fCalName+"_Layer",fLayerLogical,fCalorLogical, 404 fGapPhysical->SetTranslation(G4ThreeVector(0 << 405 kZAxis,fNumberOfLayers,fLayerThickness); 405 << 406 fGapPhysical->SetTranslation(G4ThreeVector(0.,0.,fLayerThickness/4.)); >> 407 406 G4RunManager::GetRunManager()->GeometryHasBe 408 G4RunManager::GetRunManager()->GeometryHasBeenModified(); 407 } 409 } 408 410 409 //....oooOO0OOooo........oooOO0OOooo........oo 411 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 410 412