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 // $Id: ElectronBenchmarkDetector.cc 93389 2015-10-20 07:04:35Z gcosmo $ 26 // 27 // 27 /// \file medical/electronScattering2/src/Elec 28 /// \file medical/electronScattering2/src/ElectronBenchmarkDetector.cc 28 /// \brief Implementation of the ElectronBench 29 /// \brief Implementation of the ElectronBenchmarkDetector class 29 30 30 #include "ElectronBenchmarkDetector.hh" 31 #include "ElectronBenchmarkDetector.hh" 31 << 32 32 #include "ElectronBenchmarkDetectorMessenger.h 33 #include "ElectronBenchmarkDetectorMessenger.hh" 33 34 34 #include "G4Colour.hh" << 35 #include "G4RunManager.hh" >> 36 #include "G4UImanager.hh" >> 37 #include "G4NistManager.hh" 35 #include "G4GeometryManager.hh" 38 #include "G4GeometryManager.hh" 36 #include "G4LogicalVolume.hh" << 39 #include "G4PhysicalVolumeStore.hh" 37 #include "G4LogicalVolumeStore.hh" 40 #include "G4LogicalVolumeStore.hh" >> 41 #include "G4SolidStore.hh" 38 #include "G4Material.hh" 42 #include "G4Material.hh" 39 #include "G4MultiFunctionalDetector.hh" << 43 #include "G4Tubs.hh" 40 #include "G4NistManager.hh" << 44 #include "G4LogicalVolume.hh" 41 #include "G4PSCellFlux.hh" << 42 #include "G4PSPopulation.hh" << 43 #include "G4PVPlacement.hh" 45 #include "G4PVPlacement.hh" 44 #include "G4PVReplica.hh" 46 #include "G4PVReplica.hh" 45 #include "G4PhysicalVolumeStore.hh" << 47 #include "G4VisAttributes.hh" 46 #include "G4RunManager.hh" << 48 #include "G4Colour.hh" 47 #include "G4SDManager.hh" 49 #include "G4SDManager.hh" 48 #include "G4SDParticleFilter.hh" 50 #include "G4SDParticleFilter.hh" 49 #include "G4SolidStore.hh" << 51 #include "G4MultiFunctionalDetector.hh" 50 #include "G4SystemOfUnits.hh" << 51 #include "G4Tubs.hh" << 52 #include "G4UImanager.hh" << 53 #include "G4VPrimitiveScorer.hh" 52 #include "G4VPrimitiveScorer.hh" 54 #include "G4VisAttributes.hh" << 53 #include "G4PSCellFlux.hh" >> 54 #include "G4PSPopulation.hh" >> 55 #include "G4SystemOfUnits.hh" 55 56 56 //....oooOO0OOooo........oooOO0OOooo........oo 57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 57 58 58 ElectronBenchmarkDetector::ElectronBenchmarkDe << 59 ElectronBenchmarkDetector::ElectronBenchmarkDetector() 59 { << 60 :G4VUserDetectorConstruction(), 60 // Exit Window << 61 fMaterialPrimFoil(0), 61 fPosWindow0 = 0.000000 * cm; << 62 fLogPrimFoil(0), 62 fPosWindow1 = 0.004120 * cm; << 63 fSolidPrimFoil(0), 63 << 64 fScorerRingLog(0), 64 // Scattering Foil << 65 fLogWorld(0), 65 fPosPrimFoil = 2.650000 * cm; << 66 fMessenger(0), 66 fHalfThicknessPrimFoil = 0.0 * cm; << 67 fWorldVisAtt(0), 67 << 68 fWindowVisAtt(0), 68 // Monitor Chamber << 69 fPrimFoilVisAtt(0), 69 fPosMon0 = 5.000000 * cm; << 70 fMonVisAtt(0), 70 fPosMon1 = 5.011270 * cm; << 71 fBagVisAtt(0), 71 << 72 fHeliumVisAtt(0), 72 // Helium Bag << 73 fRingVisAtt(0), 73 fPosBag0 = 6.497500 * cm; << 74 fScorerVisAtt(0) 74 fPosHelium0 = 6.500000 * cm; << 75 { 75 fPosHelium1 = 116.500000 * cm; << 76 // Exit Window 76 fPosBag1 = 116.502500 * cm; << 77 fPosWindow0 = 0.000000*cm; 77 fThicknessRing = 1.4 * cm; << 78 fPosWindow1 = 0.004120*cm; 78 << 79 79 // Scoring Plane << 80 // Scattering Foil 80 fPosScorer = 118.200000 * cm; << 81 fPosPrimFoil = 2.650000*cm; 81 fThicknessScorer = 0.001 * cm; << 82 fHalfThicknessPrimFoil = 0.0*cm; 82 fWidthScorerRing = 0.1 * cm; << 83 83 << 84 // Monitor Chamber 84 // Radii << 85 fPosMon0 = 5.000000*cm; 85 fRadOverall = 23.3 * cm; << 86 fPosMon1 = 5.011270*cm; 86 fRadRingInner = 20.0 * cm; << 87 87 << 88 // Helium Bag 88 // Extra space remaining in world volume aro << 89 fPosBag0 = 6.497500*cm; 89 fPosDelta = 1. * cm; << 90 fPosHelium0 = 6.500000*cm; 90 fRadDelta = 0.1 * cm; << 91 fPosHelium1 = 116.500000*cm; >> 92 fPosBag1 = 116.502500*cm; >> 93 fThicknessRing = 1.4*cm; >> 94 >> 95 // Scoring Plane >> 96 fPosScorer = 118.200000*cm; >> 97 fThicknessScorer= 0.001*cm; >> 98 fWidthScorerRing= 0.1*cm; >> 99 >> 100 // Radii >> 101 fRadOverall = 23.3*cm; >> 102 fRadRingInner = 20.0*cm; >> 103 >> 104 // Extra space remaining in world volume around apparatus >> 105 fPosDelta = 1.*cm; >> 106 fRadDelta = 0.1*cm; 91 107 92 fMessenger = new ElectronBenchmarkDetectorMe << 108 fMessenger = new ElectronBenchmarkDetectorMessenger(this); 93 DefineMaterials(); << 109 DefineMaterials(); 94 } 110 } 95 111 96 //....oooOO0OOooo........oooOO0OOooo........oo 112 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 97 113 98 ElectronBenchmarkDetector::~ElectronBenchmarkD 114 ElectronBenchmarkDetector::~ElectronBenchmarkDetector() 99 { 115 { 100 delete fMessenger; << 116 delete fMessenger; 101 << 117 102 delete fWorldVisAtt; << 118 delete fWorldVisAtt; 103 delete fWindowVisAtt; << 119 delete fWindowVisAtt; 104 delete fPrimFoilVisAtt; << 120 delete fPrimFoilVisAtt; 105 delete fMonVisAtt; << 121 delete fMonVisAtt; 106 delete fBagVisAtt; << 122 delete fBagVisAtt; 107 delete fHeliumVisAtt; << 123 delete fHeliumVisAtt; 108 delete fRingVisAtt; << 124 delete fRingVisAtt; 109 delete fScorerVisAtt; << 125 delete fScorerVisAtt; 110 } 126 } 111 127 112 //....oooOO0OOooo........oooOO0OOooo........oo 128 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 113 129 114 G4VPhysicalVolume* ElectronBenchmarkDetector:: 130 G4VPhysicalVolume* ElectronBenchmarkDetector::Construct() 115 { 131 { 116 return CreateGeometry(); << 132 return CreateGeometry(); 117 } << 118 << 119 //....oooOO0OOooo........oooOO0OOooo........oo << 120 << 121 void ElectronBenchmarkDetector::DefineMaterial << 122 { << 123 // Use NIST database for elements and materi << 124 G4NistManager* man = G4NistManager::Instance << 125 man->SetVerbose(1); << 126 << 127 // Take all elements and materials from NIST << 128 man->FindOrBuildMaterial("G4_He"); << 129 man->FindOrBuildMaterial("G4_Be"); << 130 man->FindOrBuildMaterial("G4_Al"); << 131 man->FindOrBuildMaterial("G4_Ti"); << 132 man->FindOrBuildMaterial("G4_Ta"); << 133 man->FindOrBuildMaterial("G4_AIR"); << 134 man->FindOrBuildMaterial("G4_MYLAR"); << 135 << 136 G4Element* C = man->FindOrBuildElement("C"); << 137 G4Element* Cu = man->FindOrBuildElement("Cu" << 138 G4Element* Au = man->FindOrBuildElement("Au" << 139 G4Element* Ti = man->FindOrBuildElement("Ti" << 140 G4Element* Al = man->FindOrBuildElement("Al" << 141 G4Element* V = man->FindOrBuildElement("V"); << 142 << 143 // Define materials not in NIST. << 144 // While the NIST database does contain defa << 145 // those defaults have different densities t << 146 // benchmark specification. << 147 G4double density; << 148 G4int ncomponents; << 149 G4double fractionmass; << 150 << 151 G4Material* G4_C = new G4Material("G4_C", de << 152 G4_C->AddElement(C, fractionmass = 1.00); << 153 << 154 G4Material* G4_Cu = new G4Material("G4_Cu", << 155 G4_Cu->AddElement(Cu, fractionmass = 1.00); << 156 << 157 G4Material* G4_Au = new G4Material("G4_Au", << 158 G4_Au->AddElement(Au, fractionmass = 1.00); << 159 << 160 G4Material* TiAlloy = new G4Material("TiAllo << 161 TiAlloy->AddElement(Ti, fractionmass = 0.90) << 162 TiAlloy->AddElement(Al, fractionmass = 0.06) << 163 TiAlloy->AddElement(V, fractionmass = 0.04); << 164 << 165 // Print materials table << 166 G4cout << *(G4Material::GetMaterialTable()) << 167 } << 168 << 169 //....oooOO0OOooo........oooOO0OOooo........oo << 170 << 171 G4VPhysicalVolume* ElectronBenchmarkDetector:: << 172 { << 173 if (fPhysiWorld) return fPhysiWorld; << 174 << 175 // Instantiate the world << 176 fPhysiWorld = CreateWorld(); << 177 fLogWorld = fPhysiWorld->GetLogicalVolume(); << 178 << 179 // Instantiate the geometry << 180 CreateExitWindow(fLogWorld); << 181 CreatePrimaryFoil(fLogWorld); << 182 CreateMonitor(fLogWorld); << 183 CreateHeliumBag(fLogWorld); << 184 << 185 // Create the scorers << 186 CreateScorer(fLogWorld); << 187 << 188 return fPhysiWorld; << 189 } 133 } 190 134 191 //....oooOO0OOooo........oooOO0OOooo........oo 135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 192 136 193 G4VPhysicalVolume* ElectronBenchmarkDetector:: << 137 void ElectronBenchmarkDetector::DefineMaterials(){ 194 { << 138 // Use NIST database for elements and materials whereever possible. 195 G4double halfLengthWorld = fPosScorer / 2. + << 139 G4NistManager* man = G4NistManager::Instance(); 196 G4double radWorld = fRadOverall + fRadDelta; << 140 man->SetVerbose(1); 197 G4VSolid* worldSolid = << 141 198 new G4Tubs("WorldSolid", 0. * cm, radWorld << 142 // Take all elements and materials from NIST 199 G4LogicalVolume* worldLog = << 143 man->FindOrBuildMaterial("G4_He"); 200 new G4LogicalVolume(worldSolid, G4Material << 144 man->FindOrBuildMaterial("G4_Be"); 201 << 145 man->FindOrBuildMaterial("G4_Al"); 202 fWorldVisAtt = new G4VisAttributes(G4Colour( << 146 man->FindOrBuildMaterial("G4_Ti"); 203 worldLog->SetVisAttributes(fWorldVisAtt); << 147 man->FindOrBuildMaterial("G4_Ta"); >> 148 man->FindOrBuildMaterial("G4_AIR"); >> 149 man->FindOrBuildMaterial("G4_MYLAR"); >> 150 >> 151 G4Element* C = man->FindOrBuildElement("C"); >> 152 G4Element* Cu = man->FindOrBuildElement("Cu"); >> 153 G4Element* Au = man->FindOrBuildElement("Au"); >> 154 G4Element* Ti = man->FindOrBuildElement("Ti"); >> 155 G4Element* Al = man->FindOrBuildElement("Al"); >> 156 G4Element* V = man->FindOrBuildElement("V"); >> 157 >> 158 // Define materials not in NIST. >> 159 // While the NIST database does contain default materials for C, Cu and Au, >> 160 // those defaults have different densities than the ones used in the >> 161 // benchmark specification. >> 162 G4double density; >> 163 G4int ncomponents; >> 164 G4double fractionmass; >> 165 >> 166 G4Material* G4_C = new G4Material("G4_C", density= 2.18*g/cm3, >> 167 ncomponents=1); >> 168 G4_C->AddElement(C, fractionmass=1.00); >> 169 >> 170 G4Material* G4_Cu = new G4Material("G4_Cu", density= 8.92*g/cm3, >> 171 ncomponents=1); >> 172 G4_Cu->AddElement(Cu, fractionmass=1.00); >> 173 >> 174 G4Material* G4_Au = new G4Material("G4_Au", density= 19.30*g/cm3, >> 175 ncomponents=1); >> 176 G4_Au->AddElement(Au, fractionmass=1.00); >> 177 >> 178 G4Material* TiAlloy = new G4Material("TiAlloy", density= 4.42*g/cm3, >> 179 ncomponents=3); >> 180 TiAlloy->AddElement(Ti, fractionmass=0.90); >> 181 TiAlloy->AddElement(Al, fractionmass=0.06); >> 182 TiAlloy->AddElement(V, fractionmass=0.04); >> 183 >> 184 // Print materials table >> 185 G4cout << *(G4Material::GetMaterialTable()) << G4endl; >> 186 } >> 187 >> 188 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 189 >> 190 G4VPhysicalVolume* ElectronBenchmarkDetector::CreateGeometry(){ >> 191 // Clean old geometry, if any >> 192 G4GeometryManager::GetInstance()->OpenGeometry(); >> 193 G4PhysicalVolumeStore::GetInstance()->Clean(); >> 194 G4LogicalVolumeStore::GetInstance()->Clean(); >> 195 G4SolidStore::GetInstance()->Clean(); >> 196 >> 197 // Instantiate the world >> 198 G4VPhysicalVolume* physiworld = CreateWorld(); >> 199 fLogWorld = physiworld->GetLogicalVolume(); >> 200 >> 201 // Instantiate the geometry >> 202 CreateExitWindow(fLogWorld); >> 203 CreatePrimaryFoil(fLogWorld); >> 204 CreateMonitor(fLogWorld); >> 205 CreateHeliumBag(fLogWorld); >> 206 >> 207 // Create the scorers >> 208 CreateScorer(fLogWorld); >> 209 >> 210 return physiworld; >> 211 } >> 212 >> 213 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 214 >> 215 G4VPhysicalVolume* ElectronBenchmarkDetector::CreateWorld(){ >> 216 G4double halfLengthWorld = fPosScorer/2. + fPosDelta; >> 217 G4double radWorld = fRadOverall + fRadDelta; >> 218 G4VSolid* worldSolid = new G4Tubs("WorldSolid", 0.*cm, radWorld, >> 219 halfLengthWorld, 0.*deg, 360.*deg); >> 220 G4LogicalVolume* worldLog = new G4LogicalVolume(worldSolid, >> 221 G4Material::GetMaterial("G4_AIR"), "WorldLog"); >> 222 >> 223 fWorldVisAtt = new G4VisAttributes(G4Colour(1.0,1.0,1.0)); >> 224 worldLog->SetVisAttributes(fWorldVisAtt); >> 225 >> 226 G4VPhysicalVolume* worldPhys = >> 227 new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), >> 228 worldLog,"World", 0, false, 0); >> 229 >> 230 return worldPhys; >> 231 } >> 232 >> 233 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 234 >> 235 void ElectronBenchmarkDetector::CreateExitWindow(G4LogicalVolume* worldLog){ >> 236 G4double halfLengthWorld = fPosScorer/2.; >> 237 G4double halfThicknessWindow = fPosWindow1/2.; >> 238 G4VSolid* windowSolid = new G4Tubs("windowSolid", 0.*cm, fRadOverall, >> 239 halfThicknessWindow, 0.*deg, 360.*deg); >> 240 G4LogicalVolume* windowLog = new G4LogicalVolume(windowSolid, >> 241 G4Material::GetMaterial("TiAlloy"), >> 242 "windowLog"); >> 243 >> 244 fWindowVisAtt = new G4VisAttributes(G4Colour(0.5,1.0,0.5)); >> 245 windowLog->SetVisAttributes(fWindowVisAtt); >> 246 >> 247 new G4PVPlacement(0, >> 248 G4ThreeVector(0.,0., >> 249 halfThicknessWindow - halfLengthWorld), >> 250 windowLog,"ExitWindow",worldLog,false,0); >> 251 } >> 252 >> 253 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 254 >> 255 void ElectronBenchmarkDetector::CreatePrimaryFoil(G4LogicalVolume* worldLog){ >> 256 G4double halfLengthWorld = fPosScorer/2.; >> 257 >> 258 // For some energies, we have no Primary Foil. >> 259 if (fHalfThicknessPrimFoil==0.) return; >> 260 >> 261 fSolidPrimFoil = new G4Tubs("PrimFoilSolid", 0.*cm, fRadOverall, >> 262 fHalfThicknessPrimFoil, 0.*deg, 360.*deg); >> 263 fLogPrimFoil = new G4LogicalVolume(fSolidPrimFoil, >> 264 fMaterialPrimFoil, "PrimFoilLog"); >> 265 >> 266 fPrimFoilVisAtt = new G4VisAttributes(G4Colour(0.5,1.0,0.5)); >> 267 fLogPrimFoil->SetVisAttributes(fPrimFoilVisAtt); >> 268 >> 269 new G4PVPlacement(0, >> 270 G4ThreeVector(0.,0., >> 271 fPosPrimFoil + fHalfThicknessPrimFoil - halfLengthWorld), >> 272 fLogPrimFoil,"ScatteringFoil",worldLog,false,0); >> 273 } >> 274 >> 275 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 276 >> 277 void ElectronBenchmarkDetector::CreateMonitor(G4LogicalVolume* worldLog){ >> 278 G4double halfLengthWorld = fPosScorer/2.; >> 279 G4double halfThicknessMon = (fPosMon1 - fPosMon0) /2.; >> 280 G4VSolid* monSolid = new G4Tubs("monSolid", 0.*cm, fRadOverall, >> 281 halfThicknessMon, 0.*deg, 360.*deg); >> 282 G4LogicalVolume* monLog = new G4LogicalVolume(monSolid, >> 283 G4Material::GetMaterial("G4_MYLAR"), >> 284 "monLog"); >> 285 >> 286 fMonVisAtt = new G4VisAttributes(G4Colour(0.5,1.0,0.5)); >> 287 monLog->SetVisAttributes(fMonVisAtt); >> 288 >> 289 new G4PVPlacement(0, >> 290 G4ThreeVector(0.,0., >> 291 fPosMon0 + halfThicknessMon - halfLengthWorld), >> 292 monLog,"MonitorChamber",worldLog,false,0); >> 293 } >> 294 >> 295 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 296 >> 297 void ElectronBenchmarkDetector::CreateHeliumBag(G4LogicalVolume* worldLog){ >> 298 G4double halfLengthWorld = fPosScorer/2.; >> 299 >> 300 // Construct cylinder of Mylar >> 301 G4double halfThicknessBag = (fPosBag1 - fPosBag0) /2.; >> 302 G4VSolid* bagSolid = new G4Tubs("bagSolid", 0.*cm, fRadOverall, >> 303 halfThicknessBag, 0.*deg, 360.*deg); >> 304 G4LogicalVolume* bagLog = new G4LogicalVolume(bagSolid, >> 305 G4Material::GetMaterial("G4_MYLAR"), >> 306 "bagLog"); >> 307 >> 308 fBagVisAtt = new G4VisAttributes(G4Colour(0.5,1.0,0.5)); >> 309 bagLog->SetVisAttributes(fBagVisAtt); >> 310 >> 311 new G4PVPlacement(0, >> 312 G4ThreeVector(0.,0., >> 313 fPosBag0 + halfThicknessBag - halfLengthWorld), >> 314 bagLog,"HeliumBag",worldLog,false,0); >> 315 >> 316 // Insert cylinder of Helium into the Cylinder of Mylar >> 317 G4double halfThicknessHelium = (fPosHelium1 - fPosHelium0) /2.; >> 318 G4VSolid* heliumSolid = new G4Tubs("heliumSolid", 0.*cm, fRadOverall, >> 319 halfThicknessHelium, 0.*deg, 360.*deg); >> 320 G4LogicalVolume* heliumLog = new G4LogicalVolume(heliumSolid, >> 321 G4Material::GetMaterial("G4_He"), >> 322 "heliumLog"); >> 323 >> 324 fHeliumVisAtt = new G4VisAttributes(G4Colour(0.5,1.0,0.5)); >> 325 heliumLog->SetVisAttributes(fHeliumVisAtt); >> 326 >> 327 new G4PVPlacement(0, G4ThreeVector(0.,0.,0.), >> 328 heliumLog,"Helium",bagLog,false,0); >> 329 >> 330 // Insert two rings of Aluminum into the Cylinder of Helium >> 331 G4double halfThicknessRing = fThicknessRing /2.; >> 332 G4VSolid* ringSolid = new G4Tubs("ringSolid", fRadRingInner, fRadOverall, >> 333 halfThicknessRing, 0.*deg, 360.*deg); >> 334 G4LogicalVolume* ring0Log = new G4LogicalVolume(ringSolid, >> 335 G4Material::GetMaterial("G4_Al"), >> 336 "ring0Log"); >> 337 G4LogicalVolume* ring1Log = new G4LogicalVolume(ringSolid, >> 338 G4Material::GetMaterial("G4_Al"), >> 339 "ring1Log"); >> 340 >> 341 fRingVisAtt = new G4VisAttributes(G4Colour(0.5,1.0,0.5)); >> 342 ring0Log->SetVisAttributes(fRingVisAtt); >> 343 ring1Log->SetVisAttributes(fRingVisAtt); >> 344 >> 345 new G4PVPlacement(0, >> 346 G4ThreeVector(0.,0., >> 347 -halfThicknessHelium + halfThicknessRing), >> 348 ring0Log,"Ring0",heliumLog,false,0); >> 349 >> 350 new G4PVPlacement(0, >> 351 G4ThreeVector(0.,0., >> 352 halfThicknessHelium - halfThicknessRing), >> 353 ring1Log,"Ring1",heliumLog,false,0); >> 354 } >> 355 >> 356 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... >> 357 >> 358 void ElectronBenchmarkDetector::CreateScorer(G4LogicalVolume* worldLog){ >> 359 G4double halfLengthWorld = fPosScorer/2.; >> 360 G4double halfThicknessScorer = fThicknessScorer /2.; >> 361 >> 362 G4VSolid* scorerSolid = new G4Tubs("scorerSolid", 0.*cm, fRadOverall, >> 363 halfThicknessScorer, 0.*deg, 360.*deg); >> 364 G4LogicalVolume* scorerLog = new G4LogicalVolume(scorerSolid, >> 365 G4Material::GetMaterial("G4_AIR"), >> 366 "scorerLog"); >> 367 >> 368 fScorerVisAtt = new G4VisAttributes(G4Colour(0.5,1.0,0.5)); >> 369 scorerLog->SetVisAttributes(fScorerVisAtt); >> 370 new G4PVPlacement(0, >> 371 G4ThreeVector(0.,0., >> 372 halfLengthWorld - halfThicknessScorer), >> 373 scorerLog,"Scorer",worldLog,false,0); >> 374 >> 375 G4VSolid* scorerRingSolid = new G4Tubs("scorerRingSolid", 0.*cm, >> 376 fRadOverall, >> 377 halfThicknessScorer, 0.*deg, 360.*deg); >> 378 fScorerRingLog = new G4LogicalVolume(scorerRingSolid, >> 379 G4Material::GetMaterial("G4_AIR"), "scorerRingLog"); >> 380 new G4PVReplica("ScorerRing",fScorerRingLog,scorerLog,kRho, >> 381 G4int(fRadOverall/fWidthScorerRing),fWidthScorerRing); 204 382 205 G4VPhysicalVolume* worldPhys = << 383 ConstructSDandField(); 206 new G4PVPlacement(0, G4ThreeVector(0., 0., << 207 << 208 return worldPhys; << 209 } << 210 << 211 //....oooOO0OOooo........oooOO0OOooo........oo << 212 << 213 void ElectronBenchmarkDetector::CreateExitWind << 214 { << 215 G4double halfLengthWorld = fPosScorer / 2.; << 216 G4double halfThicknessWindow = fPosWindow1 / << 217 G4VSolid* windowSolid = << 218 new G4Tubs("windowSolid", 0. * cm, fRadOve << 219 G4LogicalVolume* windowLog = << 220 new G4LogicalVolume(windowSolid, G4Materia << 221 << 222 fWindowVisAtt = new G4VisAttributes(G4Colour << 223 windowLog->SetVisAttributes(fWindowVisAtt); << 224 << 225 new G4PVPlacement(0, G4ThreeVector(0., 0., h << 226 "ExitWindow", worldLog, fa << 227 } << 228 << 229 //....oooOO0OOooo........oooOO0OOooo........oo << 230 << 231 void ElectronBenchmarkDetector::CreatePrimaryF << 232 { << 233 G4double halfLengthWorld = fPosScorer / 2.; << 234 << 235 // For some energies, we have no Primary Foi << 236 if (fHalfThicknessPrimFoil == 0.) return; << 237 << 238 fSolidPrimFoil = << 239 new G4Tubs("PrimFoilSolid", 0. * cm, fRadO << 240 fLogPrimFoil = new G4LogicalVolume(fSolidPri << 241 << 242 fPrimFoilVisAtt = new G4VisAttributes(G4Colo << 243 fLogPrimFoil->SetVisAttributes(fPrimFoilVisA << 244 << 245 new G4PVPlacement(0, << 246 G4ThreeVector(0., 0., fPos << 247 fLogPrimFoil, "ScatteringF << 248 } << 249 << 250 //....oooOO0OOooo........oooOO0OOooo........oo << 251 << 252 void ElectronBenchmarkDetector::CreateMonitor( << 253 { << 254 G4double halfLengthWorld = fPosScorer / 2.; << 255 G4double halfThicknessMon = (fPosMon1 - fPos << 256 G4VSolid* monSolid = << 257 new G4Tubs("monSolid", 0. * cm, fRadOveral << 258 G4LogicalVolume* monLog = << 259 new G4LogicalVolume(monSolid, G4Material:: << 260 << 261 fMonVisAtt = new G4VisAttributes(G4Colour(0. << 262 monLog->SetVisAttributes(fMonVisAtt); << 263 << 264 new G4PVPlacement(0, G4ThreeVector(0., 0., f << 265 "MonitorChamber", worldLog << 266 } << 267 << 268 //....oooOO0OOooo........oooOO0OOooo........oo << 269 << 270 void ElectronBenchmarkDetector::CreateHeliumBa << 271 { << 272 G4double halfLengthWorld = fPosScorer / 2.; << 273 << 274 // Construct cylinder of Mylar << 275 G4double halfThicknessBag = (fPosBag1 - fPos << 276 G4VSolid* bagSolid = << 277 new G4Tubs("bagSolid", 0. * cm, fRadOveral << 278 G4LogicalVolume* bagLog = << 279 new G4LogicalVolume(bagSolid, G4Material:: << 280 << 281 fBagVisAtt = new G4VisAttributes(G4Colour(0. << 282 bagLog->SetVisAttributes(fBagVisAtt); << 283 << 284 new G4PVPlacement(0, G4ThreeVector(0., 0., f << 285 "HeliumBag", worldLog, fal << 286 << 287 // Insert cylinder of Helium into the Cylind << 288 G4double halfThicknessHelium = (fPosHelium1 << 289 G4VSolid* heliumSolid = << 290 new G4Tubs("heliumSolid", 0. * cm, fRadOve << 291 G4LogicalVolume* heliumLog = << 292 new G4LogicalVolume(heliumSolid, G4Materia << 293 << 294 fHeliumVisAtt = new G4VisAttributes(G4Colour << 295 heliumLog->SetVisAttributes(fHeliumVisAtt); << 296 << 297 new G4PVPlacement(0, G4ThreeVector(0., 0., 0 << 298 << 299 // Insert two rings of Aluminum into the Cyl << 300 G4double halfThicknessRing = fThicknessRing << 301 G4VSolid* ringSolid = << 302 new G4Tubs("ringSolid", fRadRingInner, fRa << 303 G4LogicalVolume* ring0Log = << 304 new G4LogicalVolume(ringSolid, G4Material: << 305 G4LogicalVolume* ring1Log = << 306 new G4LogicalVolume(ringSolid, G4Material: << 307 << 308 fRingVisAtt = new G4VisAttributes(G4Colour(0 << 309 ring0Log->SetVisAttributes(fRingVisAtt); << 310 ring1Log->SetVisAttributes(fRingVisAtt); << 311 << 312 new G4PVPlacement(0, G4ThreeVector(0., 0., - << 313 "Ring0", heliumLog, false, << 314 << 315 new G4PVPlacement(0, G4ThreeVector(0., 0., h << 316 "Ring1", heliumLog, false, << 317 } << 318 << 319 //....oooOO0OOooo........oooOO0OOooo........oo << 320 << 321 void ElectronBenchmarkDetector::CreateScorer(G << 322 { << 323 G4double halfLengthWorld = fPosScorer / 2.; << 324 G4double halfThicknessScorer = fThicknessSco << 325 << 326 G4VSolid* scorerSolid = << 327 new G4Tubs("scorerSolid", 0. * cm, fRadOve << 328 G4LogicalVolume* scorerLog = << 329 new G4LogicalVolume(scorerSolid, G4Materia << 330 << 331 fScorerVisAtt = new G4VisAttributes(G4Colour << 332 scorerLog->SetVisAttributes(fScorerVisAtt); << 333 new G4PVPlacement(0, G4ThreeVector(0., 0., h << 334 "Scorer", worldLog, false, << 335 << 336 G4VSolid* scorerRingSolid = << 337 new G4Tubs("scorerRingSolid", 0. * cm, fRa << 338 fScorerRingLog = << 339 new G4LogicalVolume(scorerRingSolid, G4Mat << 340 new G4PVReplica("ScorerRing", fScorerRingLog << 341 G4int(fRadOverall / fWidthSc << 342 } 384 } 343 385 344 //....oooOO0OOooo........oooOO0OOooo........oo 386 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 345 387 346 // Note that this method is called both at sta 388 // Note that this method is called both at start of job and again after 347 // any command causes a change to detector geo 389 // any command causes a change to detector geometry 348 void ElectronBenchmarkDetector::ConstructSDand 390 void ElectronBenchmarkDetector::ConstructSDandField() 349 { 391 { 350 G4SDManager::GetSDMpointer()->SetVerboseLeve << 392 G4SDManager::GetSDMpointer()->SetVerboseLevel(1); 351 << 393 352 // G4Cache mechanism is necessary for multi- << 394 // G4Cache mechanism is necessary for multi-threaded operation 353 // as it allows us to store separate detecto << 395 // as it allows us to store separate detector pointer per thread 354 G4MultiFunctionalDetector*& sensitiveDetecto << 396 G4MultiFunctionalDetector*& sensitiveDetector = 355 << 397 fSensitiveDetectorCache.Get(); 356 if (!sensitiveDetector) { << 398 357 sensitiveDetector = new G4MultiFunctionalD << 399 if (!sensitiveDetector) { 358 << 400 sensitiveDetector = new G4MultiFunctionalDetector("MyDetector"); 359 G4VPrimitiveScorer* primitive; << 401 360 << 402 G4VPrimitiveScorer* primitive; 361 G4SDParticleFilter* electronFilter = new G << 403 362 << 404 G4SDParticleFilter* electronFilter = 363 primitive = new G4PSCellFlux("cell flux"); << 405 new G4SDParticleFilter("electronFilter", "e-"); 364 sensitiveDetector->RegisterPrimitive(primi << 406 365 << 407 primitive = new G4PSCellFlux("cell flux"); 366 primitive = new G4PSCellFlux("e cell flux" << 408 sensitiveDetector->RegisterPrimitive(primitive); 367 primitive->SetFilter(electronFilter); << 409 368 sensitiveDetector->RegisterPrimitive(primi << 410 primitive = new G4PSCellFlux("e cell flux"); 369 << 411 primitive->SetFilter(electronFilter); 370 primitive = new G4PSPopulation("population << 412 sensitiveDetector->RegisterPrimitive(primitive); 371 sensitiveDetector->RegisterPrimitive(primi << 413 372 << 414 primitive = new G4PSPopulation("population"); 373 primitive = new G4PSPopulation("e populati << 415 sensitiveDetector->RegisterPrimitive(primitive); 374 primitive->SetFilter(electronFilter); << 416 375 sensitiveDetector->RegisterPrimitive(primi << 417 primitive = new G4PSPopulation("e population"); 376 } << 418 primitive->SetFilter(electronFilter); 377 G4SDManager::GetSDMpointer()->AddNewDetector << 419 sensitiveDetector->RegisterPrimitive(primitive); 378 fScorerRingLog->SetSensitiveDetector(sensiti << 420 } >> 421 >> 422 SetSensitiveDetector("scorerRingLog",sensitiveDetector); 379 } 423 } 380 424 381 //....oooOO0OOooo........oooOO0OOooo........oo 425 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 382 426 383 void ElectronBenchmarkDetector::SetPrimFoilMat << 427 void ElectronBenchmarkDetector::SetPrimFoilMaterial(G4String matname){ 384 { << 428 fMaterialPrimFoil = G4Material::GetMaterial(matname); 385 G4Material* material = G4NistManager::Instan << 386 << 387 if (material && material != fMaterialPrimFoi << 388 fMaterialPrimFoil = material; << 389 if (fLogPrimFoil) { 429 if (fLogPrimFoil) { 390 fLogPrimFoil->SetMaterial(fMaterialPrimF 430 fLogPrimFoil->SetMaterial(fMaterialPrimFoil); 391 } 431 } >> 432 else CreatePrimaryFoil(fLogWorld); 392 G4RunManager::GetRunManager()->PhysicsHasB 433 G4RunManager::GetRunManager()->PhysicsHasBeenModified(); 393 } << 394 } 434 } 395 435 396 //....oooOO0OOooo........oooOO0OOooo........oo 436 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 397 437 398 void ElectronBenchmarkDetector::SetPrimFoilThi 438 void ElectronBenchmarkDetector::SetPrimFoilThickness(G4double thicknessPrimFoil) 399 { 439 { 400 fHalfThicknessPrimFoil = thicknessPrimFoil / << 440 fHalfThicknessPrimFoil = thicknessPrimFoil / 2.; >> 441 if (fSolidPrimFoil) { >> 442 fSolidPrimFoil->SetZHalfLength(fHalfThicknessPrimFoil); >> 443 } >> 444 else CreatePrimaryFoil(fLogWorld); >> 445 G4RunManager::GetRunManager()->GeometryHasBeenModified(); 401 } 446 } 402 447 403 //....oooOO0OOooo........oooOO0OOooo........oo 448 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 404 449