Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/medical/electronScattering2/src/ElectronBenchmarkDetector.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

Diff markup

Differences between /examples/extended/medical/electronScattering2/src/ElectronBenchmarkDetector.cc (Version 11.3.0) and /examples/extended/medical/electronScattering2/src/ElectronBenchmarkDetector.cc (Version 11.0.p4)


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