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