Geant4  10.03.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ElectronBenchmarkDetector.cc
Go to the documentation of this file.
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // $Id: ElectronBenchmarkDetector.cc 101670 2016-11-21 09:17:10Z gcosmo $
27 //
30 
32 
34 
35 #include "G4RunManager.hh"
36 #include "G4UImanager.hh"
37 #include "G4NistManager.hh"
38 #include "G4GeometryManager.hh"
39 #include "G4PhysicalVolumeStore.hh"
40 #include "G4LogicalVolumeStore.hh"
41 #include "G4SolidStore.hh"
42 #include "G4Material.hh"
43 #include "G4Tubs.hh"
44 #include "G4LogicalVolume.hh"
45 #include "G4PVPlacement.hh"
46 #include "G4PVReplica.hh"
47 #include "G4VisAttributes.hh"
48 #include "G4Colour.hh"
49 #include "G4SDManager.hh"
50 #include "G4SDParticleFilter.hh"
52 #include "G4VPrimitiveScorer.hh"
53 #include "G4PSCellFlux.hh"
54 #include "G4PSPopulation.hh"
55 #include "G4SystemOfUnits.hh"
56 
57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
58 
61 fMaterialPrimFoil(0),
62 fLogPrimFoil(0),
63 fSolidPrimFoil(0),
64 fScorerRingLog(0),
65 fLogWorld(0),
66 fMessenger(0),
67 fWorldVisAtt(0),
68 fWindowVisAtt(0),
69 fPrimFoilVisAtt(0),
70 fMonVisAtt(0),
71 fBagVisAtt(0),
72 fHeliumVisAtt(0),
73 fRingVisAtt(0),
74 fScorerVisAtt(0)
75 {
76  // Exit Window
77  fPosWindow0 = 0.000000*cm;
78  fPosWindow1 = 0.004120*cm;
79 
80  // Scattering Foil
81  fPosPrimFoil = 2.650000*cm;
82  fHalfThicknessPrimFoil = 0.0*cm;
83 
84  // Monitor Chamber
85  fPosMon0 = 5.000000*cm;
86  fPosMon1 = 5.011270*cm;
87 
88  // Helium Bag
89  fPosBag0 = 6.497500*cm;
90  fPosHelium0 = 6.500000*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;
107 
108  fMessenger = new ElectronBenchmarkDetectorMessenger(this);
109  DefineMaterials();
110 }
111 
112 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
113 
115 {
116  delete fMessenger;
117 
118  delete fWorldVisAtt;
119  delete fWindowVisAtt;
120  delete fPrimFoilVisAtt;
121  delete fMonVisAtt;
122  delete fBagVisAtt;
123  delete fHeliumVisAtt;
124  delete fRingVisAtt;
125  delete fScorerVisAtt;
126 }
127 
128 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
129 
131 {
132  return CreateGeometry();
133 }
134 
135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
136 
138  // Use NIST database for elements and materials whereever possible.
140  man->SetVerbose(1);
141 
142  // Take all elements and materials from NIST
143  man->FindOrBuildMaterial("G4_He");
144  man->FindOrBuildMaterial("G4_Be");
145  man->FindOrBuildMaterial("G4_Al");
146  man->FindOrBuildMaterial("G4_Ti");
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
186 }
187 
188 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
189 
191  // Clean old geometry, if any
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 
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 
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 
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 
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 
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 
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);
382 
384 }
385 
386 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
387 
388 // Note that this method is called both at start of job and again after
389 // any command causes a change to detector geometry
391 {
393 
394  // G4Cache mechanism is necessary for multi-threaded operation
395  // as it allows us to store separate detector pointer per thread
396  G4MultiFunctionalDetector*& sensitiveDetector =
397  fSensitiveDetectorCache.Get();
398 
399  if (!sensitiveDetector) {
400  sensitiveDetector = new G4MultiFunctionalDetector("MyDetector");
401 
402  G4VPrimitiveScorer* primitive;
403 
404  G4SDParticleFilter* electronFilter =
405  new G4SDParticleFilter("electronFilter", "e-");
406 
407  primitive = new G4PSCellFlux("cell flux");
408  sensitiveDetector->RegisterPrimitive(primitive);
409 
410  primitive = new G4PSCellFlux("e cell flux");
411  primitive->SetFilter(electronFilter);
412  sensitiveDetector->RegisterPrimitive(primitive);
413 
414  primitive = new G4PSPopulation("population");
415  sensitiveDetector->RegisterPrimitive(primitive);
416 
417  primitive = new G4PSPopulation("e population");
418  primitive->SetFilter(electronFilter);
419  sensitiveDetector->RegisterPrimitive(primitive);
420  }
421  G4SDManager::GetSDMpointer()->AddNewDetector(sensitiveDetector);
422  SetSensitiveDetector("scorerRingLog",sensitiveDetector);
423 }
424 
425 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
426 
428  fMaterialPrimFoil = G4Material::GetMaterial(matname);
429  if (fLogPrimFoil) {
430  fLogPrimFoil->SetMaterial(fMaterialPrimFoil);
431  }
432  else CreatePrimaryFoil(fLogWorld);
434 }
435 
436 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
437 
439 {
440  fHalfThicknessPrimFoil = thicknessPrimFoil / 2.;
441  if (fSolidPrimFoil) {
442  fSolidPrimFoil->SetZHalfLength(fHalfThicknessPrimFoil);
443  }
444  else CreatePrimaryFoil(fLogWorld);
446 }
447 
448 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
void GeometryHasBeenModified(G4bool prop=true)
G4bool RegisterPrimitive(G4VPrimitiveScorer *)
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
virtual G4VPhysicalVolume * Construct()
CLHEP::Hep3Vector G4ThreeVector
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
Definition: G4Material.cc:602
void SetPrimFoilThickness(G4double thicknessPrimFoil)
void SetVerboseLevel(G4int vl)
Definition: G4SDManager.hh:90
void CreateScorer(G4LogicalVolume *logicWorld)
value_type & Get() const
Definition: G4Cache.hh:282
Definition: G4Tubs.hh:85
static G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:587
void SetFilter(G4VSDFilter *f)
static void Clean()
Definition: G4SolidStore.cc:79
Definition of the ElectronBenchmarkDetectorMessenger class.
void CreatePrimaryFoil(G4LogicalVolume *logicWorld)
double C(double temp)
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
static G4PhysicalVolumeStore * GetInstance()
function g(Y1, Y2, PT2)
Definition: hijing1.383.f:5205
void CreateHeliumBag(G4LogicalVolume *logicWorld)
G4GLOB_DLL std::ostream G4cout
void CreateMonitor(G4LogicalVolume *logicWorld)
void PhysicsHasBeenModified()
void SetVerbose(G4int)
static constexpr double cm
Definition: G4SIunits.hh:119
static G4LogicalVolumeStore * GetInstance()
static G4SolidStore * GetInstance()
void CreateExitWindow(G4LogicalVolume *logicWorld)
static G4GeometryManager * GetInstance()
static constexpr double cm3
Definition: G4SIunits.hh:121
void SetSensitiveDetector(const G4String &logVolName, G4VSensitiveDetector *aSD, G4bool multi=false)
void SetPrimFoilMaterial(G4String matname)
void AddNewDetector(G4VSensitiveDetector *aSD)
Definition: G4SDManager.cc:71
static G4RunManager * GetRunManager()
Definition: G4RunManager.cc:79
G4LogicalVolume * GetLogicalVolume() const
static G4SDManager * GetSDMpointer()
Definition: G4SDManager.cc:40
Definition of the ElectronBenchmarkDetector class.
#define G4endl
Definition: G4ios.hh:61
void OpenGeometry(G4VPhysicalVolume *vol=0)
void AddElement(G4Element *element, G4int nAtoms)
Definition: G4Material.cc:362
double G4double
Definition: G4Types.hh:76
Definition: geomdefs.hh:54
static constexpr double deg
Definition: G4SIunits.hh:152
G4Element * FindOrBuildElement(G4int Z, G4bool isotopes=true)
void SetMaterial(G4Material *pMaterial)
void SetVisAttributes(const G4VisAttributes *pVA)
void SetZHalfLength(G4double newDz)