Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/extended/optical/LXe/src/LXeDetectorConstruction.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/optical/LXe/src/LXeDetectorConstruction.cc (Version 11.3.0) and /examples/extended/optical/LXe/src/LXeDetectorConstruction.cc (Version 11.0.p2)


  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 optical/LXe/src/LXeDetectorConstruct     27 /// \file optical/LXe/src/LXeDetectorConstruction.cc
 28 /// \brief Implementation of the LXeDetectorCo     28 /// \brief Implementation of the LXeDetectorConstruction class
 29 //                                                 29 //
 30 //                                                 30 //
 31 #include "LXeDetectorConstruction.hh"              31 #include "LXeDetectorConstruction.hh"
 32                                                    32 
 33 #include "LXeDetectorMessenger.hh"                 33 #include "LXeDetectorMessenger.hh"
 34 #include "LXeMainVolume.hh"                        34 #include "LXeMainVolume.hh"
 35 #include "LXePMTSD.hh"                             35 #include "LXePMTSD.hh"
 36 #include "LXeScintSD.hh"                           36 #include "LXeScintSD.hh"
 37 #include "LXeWLSSlab.hh"                           37 #include "LXeWLSSlab.hh"
 38                                                    38 
                                                   >>  39 #include "globals.hh"
 39 #include "G4Box.hh"                                40 #include "G4Box.hh"
 40 #include "G4GeometryManager.hh"                    41 #include "G4GeometryManager.hh"
 41 #include "G4LogicalBorderSurface.hh"               42 #include "G4LogicalBorderSurface.hh"
 42 #include "G4LogicalSkinSurface.hh"                 43 #include "G4LogicalSkinSurface.hh"
 43 #include "G4LogicalVolume.hh"                      44 #include "G4LogicalVolume.hh"
 44 #include "G4LogicalVolumeStore.hh"                 45 #include "G4LogicalVolumeStore.hh"
 45 #include "G4Material.hh"                           46 #include "G4Material.hh"
 46 #include "G4MaterialTable.hh"                      47 #include "G4MaterialTable.hh"
 47 #include "G4OpticalSurface.hh"                     48 #include "G4OpticalSurface.hh"
 48 #include "G4PVPlacement.hh"                    << 
 49 #include "G4PhysicalConstants.hh"                  49 #include "G4PhysicalConstants.hh"
 50 #include "G4PhysicalVolumeStore.hh"                50 #include "G4PhysicalVolumeStore.hh"
                                                   >>  51 #include "G4PVPlacement.hh"
 51 #include "G4RunManager.hh"                         52 #include "G4RunManager.hh"
 52 #include "G4SDManager.hh"                          53 #include "G4SDManager.hh"
 53 #include "G4SolidStore.hh"                         54 #include "G4SolidStore.hh"
 54 #include "G4Sphere.hh"                             55 #include "G4Sphere.hh"
 55 #include "G4SystemOfUnits.hh"                      56 #include "G4SystemOfUnits.hh"
 56 #include "G4ThreeVector.hh"                        57 #include "G4ThreeVector.hh"
 57 #include "G4Tubs.hh"                               58 #include "G4Tubs.hh"
 58 #include "G4UImanager.hh"                          59 #include "G4UImanager.hh"
 59 #include "G4VisAttributes.hh"                      60 #include "G4VisAttributes.hh"
 60 #include "globals.hh"                          << 
 61                                                    61 
 62 G4bool LXeDetectorConstruction::fSphereOn = tr     62 G4bool LXeDetectorConstruction::fSphereOn = true;
 63                                                    63 
 64 //....oooOO0OOooo........oooOO0OOooo........oo     64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 65                                                    65 
 66 LXeDetectorConstruction::LXeDetectorConstructi     66 LXeDetectorConstruction::LXeDetectorConstruction()
                                                   >>  67   : fLXe_mt(nullptr)
                                                   >>  68   , fMPTPStyrene(nullptr)
 67 {                                                  69 {
                                                   >>  70   fExperimentalHall_box  = nullptr;
                                                   >>  71   fExperimentalHall_log  = nullptr;
                                                   >>  72   fExperimentalHall_phys = nullptr;
                                                   >>  73 
                                                   >>  74   fLXe = fAl = fAir = fVacuum = fGlass = nullptr;
                                                   >>  75   fPstyrene = fPMMA = fPethylene1 = fPethylene2 = nullptr;
                                                   >>  76 
                                                   >>  77   fN = fO = fC = fH = nullptr;
                                                   >>  78 
                                                   >>  79   fSaveThreshold = 0;
 68   SetDefaults();                                   80   SetDefaults();
                                                   >>  81 
 69   DefineMaterials();                               82   DefineMaterials();
 70   fDetectorMessenger = new LXeDetectorMessenge     83   fDetectorMessenger = new LXeDetectorMessenger(this);
 71 }                                                  84 }
 72                                                    85 
 73 //....oooOO0OOooo........oooOO0OOooo........oo     86 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 74                                                    87 
 75 LXeDetectorConstruction::~LXeDetectorConstruct     88 LXeDetectorConstruction::~LXeDetectorConstruction()
 76 {                                                  89 {
 77   delete fMainVolume;                          <<  90   if(fMainVolume)
                                                   >>  91   {
                                                   >>  92     delete fMainVolume;
                                                   >>  93   }
 78   delete fLXe_mt;                                  94   delete fLXe_mt;
 79   delete fDetectorMessenger;                       95   delete fDetectorMessenger;
 80   delete fMPTPStyrene;                             96   delete fMPTPStyrene;
 81 }                                                  97 }
 82                                                    98 
 83 //....oooOO0OOooo........oooOO0OOooo........oo     99 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 84                                                   100 
 85 void LXeDetectorConstruction::DefineMaterials(    101 void LXeDetectorConstruction::DefineMaterials()
 86 {                                                 102 {
 87   G4double a;  // atomic mass                     103   G4double a;  // atomic mass
 88   G4double z;  // atomic number                   104   G4double z;  // atomic number
 89   G4double density;                               105   G4double density;
 90                                                   106 
 91   G4int polyPMMA = 1;                             107   G4int polyPMMA = 1;
 92   G4int nC_PMMA = 3 + 2 * polyPMMA;            << 108   G4int nC_PMMA  = 3 + 2 * polyPMMA;
 93   G4int nH_PMMA = 6 + 2 * polyPMMA;            << 109   G4int nH_PMMA  = 6 + 2 * polyPMMA;
 94                                                   110 
 95   G4int polyeth = 1;                              111   G4int polyeth = 1;
 96   G4int nC_eth = 2 * polyeth;                  << 112   G4int nC_eth  = 2 * polyeth;
 97   G4int nH_eth = 4 * polyeth;                  << 113   G4int nH_eth  = 4 * polyeth;
 98                                                   114 
 99   //***Elements                                   115   //***Elements
100   fH = new G4Element("H", "H", z = 1., a = 1.0    116   fH = new G4Element("H", "H", z = 1., a = 1.01 * g / mole);
101   fC = new G4Element("C", "C", z = 6., a = 12.    117   fC = new G4Element("C", "C", z = 6., a = 12.01 * g / mole);
102   fN = new G4Element("N", "N", z = 7., a = 14.    118   fN = new G4Element("N", "N", z = 7., a = 14.01 * g / mole);
103   fO = new G4Element("O", "O", z = 8., a = 16.    119   fO = new G4Element("O", "O", z = 8., a = 16.00 * g / mole);
104                                                   120 
105   //***Materials                                  121   //***Materials
106   // Liquid Xenon                                 122   // Liquid Xenon
107   fLXe = new G4Material("LXe", z = 54., a = 13 << 123   fLXe = new G4Material("LXe", z = 54., a = 131.29 * g / mole,
                                                   >> 124                         density = 3.020 * g / cm3);
108   // Aluminum                                     125   // Aluminum
109   fAl = new G4Material("Al", z = 13., a = 26.9 << 126   fAl = new G4Material("Al", z = 13., a = 26.98 * g / mole,
                                                   >> 127                        density = 2.7 * g / cm3);
110   // Vacuum                                       128   // Vacuum
111   fVacuum = new G4Material("Vacuum", z = 1., a << 129   fVacuum = new G4Material("Vacuum", z = 1., a = 1.01 * g / mole,
112                            kStateGas, 0.1 * ke << 130                            density = universe_mean_density, kStateGas,
                                                   >> 131                            0.1 * kelvin, 1.e-19 * pascal);
113   // Air                                          132   // Air
114   fAir = new G4Material("Air", density = 1.29     133   fAir = new G4Material("Air", density = 1.29 * mg / cm3, 2);
115   fAir->AddElement(fN, 70 * perCent);             134   fAir->AddElement(fN, 70 * perCent);
116   fAir->AddElement(fO, 30 * perCent);             135   fAir->AddElement(fO, 30 * perCent);
117   // Glass                                        136   // Glass
118   fGlass = new G4Material("Glass", density = 1    137   fGlass = new G4Material("Glass", density = 1.032 * g / cm3, 2);
119   fGlass->AddElement(fC, 91.533 * perCent);       138   fGlass->AddElement(fC, 91.533 * perCent);
120   fGlass->AddElement(fH, 8.467 * perCent);        139   fGlass->AddElement(fH, 8.467 * perCent);
121   // Polystyrene                                  140   // Polystyrene
122   fPstyrene = new G4Material("Polystyrene", de    141   fPstyrene = new G4Material("Polystyrene", density = 1.03 * g / cm3, 2);
123   fPstyrene->AddElement(fC, 8);                   142   fPstyrene->AddElement(fC, 8);
124   fPstyrene->AddElement(fH, 8);                   143   fPstyrene->AddElement(fH, 8);
125   // Fiber(PMMA)                                  144   // Fiber(PMMA)
126   fPMMA = new G4Material("PMMA", density = 119    145   fPMMA = new G4Material("PMMA", density = 1190. * kg / m3, 3);
127   fPMMA->AddElement(fH, nH_PMMA);                 146   fPMMA->AddElement(fH, nH_PMMA);
128   fPMMA->AddElement(fC, nC_PMMA);                 147   fPMMA->AddElement(fC, nC_PMMA);
129   fPMMA->AddElement(fO, 2);                       148   fPMMA->AddElement(fO, 2);
130   // Cladding(polyethylene)                       149   // Cladding(polyethylene)
131   fPethylene1 = new G4Material("Pethylene1", d    150   fPethylene1 = new G4Material("Pethylene1", density = 1200. * kg / m3, 2);
132   fPethylene1->AddElement(fH, nH_eth);            151   fPethylene1->AddElement(fH, nH_eth);
133   fPethylene1->AddElement(fC, nC_eth);            152   fPethylene1->AddElement(fC, nC_eth);
134   // Double cladding(flourinated polyethylene)    153   // Double cladding(flourinated polyethylene)
135   fPethylene2 = new G4Material("Pethylene2", d    154   fPethylene2 = new G4Material("Pethylene2", density = 1400. * kg / m3, 2);
136   fPethylene2->AddElement(fH, nH_eth);            155   fPethylene2->AddElement(fH, nH_eth);
137   fPethylene2->AddElement(fC, nC_eth);            156   fPethylene2->AddElement(fC, nC_eth);
138                                                   157 
139   //***Material properties tables                 158   //***Material properties tables
140                                                   159 
141   std::vector<G4double> lxe_Energy = {7.0 * eV << 160   std::vector<G4double> lxe_Energy = { 7.0 * eV, 7.07 * eV, 7.14 * eV };
142                                                   161 
143   std::vector<G4double> lxe_SCINT = {0.1, 1.0, << 162   std::vector<G4double> lxe_SCINT = { 0.1, 1.0, 0.1 };
144   std::vector<G4double> lxe_RIND = {1.59, 1.57 << 163   std::vector<G4double> lxe_RIND  = { 1.59, 1.57, 1.54 };
145   std::vector<G4double> lxe_ABSL = {35. * cm,  << 164   std::vector<G4double> lxe_ABSL  = { 35. * cm, 35. * cm, 35. * cm };
146   fLXe_mt = new G4MaterialPropertiesTable();      165   fLXe_mt = new G4MaterialPropertiesTable();
147   fLXe_mt->AddProperty("SCINTILLATIONCOMPONENT    166   fLXe_mt->AddProperty("SCINTILLATIONCOMPONENT1", lxe_Energy, lxe_SCINT);
148   fLXe_mt->AddProperty("SCINTILLATIONCOMPONENT    167   fLXe_mt->AddProperty("SCINTILLATIONCOMPONENT2", lxe_Energy, lxe_SCINT);
149   fLXe_mt->AddProperty("RINDEX", lxe_Energy, l    168   fLXe_mt->AddProperty("RINDEX", lxe_Energy, lxe_RIND);
150   fLXe_mt->AddProperty("ABSLENGTH", lxe_Energy    169   fLXe_mt->AddProperty("ABSLENGTH", lxe_Energy, lxe_ABSL);
151   fLXe_mt->AddConstProperty("SCINTILLATIONYIEL    170   fLXe_mt->AddConstProperty("SCINTILLATIONYIELD", 12000. / MeV);
152   fLXe_mt->AddConstProperty("RESOLUTIONSCALE",    171   fLXe_mt->AddConstProperty("RESOLUTIONSCALE", 1.0);
153   fLXe_mt->AddConstProperty("SCINTILLATIONTIME    172   fLXe_mt->AddConstProperty("SCINTILLATIONTIMECONSTANT1", 20. * ns);
154   fLXe_mt->AddConstProperty("SCINTILLATIONTIME    173   fLXe_mt->AddConstProperty("SCINTILLATIONTIMECONSTANT2", 45. * ns);
155   fLXe_mt->AddConstProperty("SCINTILLATIONYIEL    174   fLXe_mt->AddConstProperty("SCINTILLATIONYIELD1", 1.0);
156   fLXe_mt->AddConstProperty("SCINTILLATIONYIEL    175   fLXe_mt->AddConstProperty("SCINTILLATIONYIELD2", 0.0);
157   fLXe->SetMaterialPropertiesTable(fLXe_mt);      176   fLXe->SetMaterialPropertiesTable(fLXe_mt);
158                                                   177 
159   // Set the Birks Constant for the LXe scinti    178   // Set the Birks Constant for the LXe scintillator
160   fLXe->GetIonisation()->SetBirksConstant(0.12    179   fLXe->GetIonisation()->SetBirksConstant(0.126 * mm / MeV);
161                                                   180 
162   std::vector<G4double> glass_AbsLength = {420 << 181   std::vector<G4double> glass_AbsLength = { 420. * cm, 420. * cm, 420. * cm };
163   auto glass_mt = new G4MaterialPropertiesTabl << 182   G4MaterialPropertiesTable* glass_mt   = new G4MaterialPropertiesTable();
164   glass_mt->AddProperty("ABSLENGTH", lxe_Energ    183   glass_mt->AddProperty("ABSLENGTH", lxe_Energy, glass_AbsLength);
165   glass_mt->AddProperty("RINDEX", "Fused Silic    184   glass_mt->AddProperty("RINDEX", "Fused Silica");
166   fGlass->SetMaterialPropertiesTable(glass_mt)    185   fGlass->SetMaterialPropertiesTable(glass_mt);
167                                                   186 
168   auto vacuum_mt = new G4MaterialPropertiesTab << 187   G4MaterialPropertiesTable* vacuum_mt = new G4MaterialPropertiesTable();
169   vacuum_mt->AddProperty("RINDEX", "Air");        188   vacuum_mt->AddProperty("RINDEX", "Air");
170   fVacuum->SetMaterialPropertiesTable(vacuum_m    189   fVacuum->SetMaterialPropertiesTable(vacuum_mt);
171   fAir->SetMaterialPropertiesTable(vacuum_mt);    190   fAir->SetMaterialPropertiesTable(vacuum_mt);  // Give air the same rindex
172                                                   191 
173   std::vector<G4double> wls_Energy = {2.00 * e << 192   std::vector<G4double> wls_Energy = { 2.00 * eV, 2.87 * eV, 2.90 * eV,
                                                   >> 193                                        3.47 * eV };
174                                                   194 
175   std::vector<G4double> rIndexPstyrene = {1.5, << 195   std::vector<G4double> rIndexPstyrene = { 1.5, 1.5, 1.5, 1.5 };
176   std::vector<G4double> absorption1 = {2. * cm << 196   std::vector<G4double> absorption1    = { 2. * cm, 2. * cm, 2. * cm, 2. * cm };
177   std::vector<G4double> scintilFast = {0.0, 0. << 197   std::vector<G4double> scintilFast    = { 0.0, 0.0, 1.0, 1.0 };
178   fMPTPStyrene = new G4MaterialPropertiesTable    198   fMPTPStyrene = new G4MaterialPropertiesTable();
179   fMPTPStyrene->AddProperty("RINDEX", wls_Ener    199   fMPTPStyrene->AddProperty("RINDEX", wls_Energy, rIndexPstyrene);
180   fMPTPStyrene->AddProperty("ABSLENGTH", wls_E    200   fMPTPStyrene->AddProperty("ABSLENGTH", wls_Energy, absorption1);
181   fMPTPStyrene->AddProperty("SCINTILLATIONCOMP    201   fMPTPStyrene->AddProperty("SCINTILLATIONCOMPONENT1", wls_Energy, scintilFast);
182   fMPTPStyrene->AddConstProperty("SCINTILLATIO    202   fMPTPStyrene->AddConstProperty("SCINTILLATIONYIELD", 10. / keV);
183   fMPTPStyrene->AddConstProperty("RESOLUTIONSC    203   fMPTPStyrene->AddConstProperty("RESOLUTIONSCALE", 1.0);
184   fMPTPStyrene->AddConstProperty("SCINTILLATIO    204   fMPTPStyrene->AddConstProperty("SCINTILLATIONTIMECONSTANT1", 10. * ns);
185   fPstyrene->SetMaterialPropertiesTable(fMPTPS    205   fPstyrene->SetMaterialPropertiesTable(fMPTPStyrene);
186                                                   206 
187   // Set the Birks Constant for the Polystyren    207   // Set the Birks Constant for the Polystyrene scintillator
188   fPstyrene->GetIonisation()->SetBirksConstant    208   fPstyrene->GetIonisation()->SetBirksConstant(0.126 * mm / MeV);
189                                                   209 
190   std::vector<G4double> AbsFiber = {9.0 * m, 9 << 210   std::vector<G4double> AbsFiber    = { 9.0 * m, 9.0 * m, 0.1 * mm, 0.1 * mm };
191   std::vector<G4double> EmissionFib = {1.0, 1. << 211   std::vector<G4double> EmissionFib = { 1.0, 1.0, 0.0, 0.0 };
192   auto fiberProperty = new G4MaterialPropertie << 212   G4MaterialPropertiesTable* fiberProperty = new G4MaterialPropertiesTable();
193   fiberProperty->AddProperty("RINDEX", "PMMA")    213   fiberProperty->AddProperty("RINDEX", "PMMA");
194   fiberProperty->AddProperty("WLSABSLENGTH", w    214   fiberProperty->AddProperty("WLSABSLENGTH", wls_Energy, AbsFiber);
195   fiberProperty->AddProperty("WLSCOMPONENT", w    215   fiberProperty->AddProperty("WLSCOMPONENT", wls_Energy, EmissionFib);
196   fiberProperty->AddConstProperty("WLSTIMECONS    216   fiberProperty->AddConstProperty("WLSTIMECONSTANT", 0.5 * ns);
197   fPMMA->SetMaterialPropertiesTable(fiberPrope    217   fPMMA->SetMaterialPropertiesTable(fiberProperty);
198                                                   218 
199   std::vector<G4double> RefractiveIndexClad1 = << 219   std::vector<G4double> RefractiveIndexClad1 = { 1.49, 1.49, 1.49, 1.49 };
200   auto clad1Property = new G4MaterialPropertie << 220   G4MaterialPropertiesTable* clad1Property   = new G4MaterialPropertiesTable();
201   clad1Property->AddProperty("RINDEX", wls_Ene    221   clad1Property->AddProperty("RINDEX", wls_Energy, RefractiveIndexClad1);
202   clad1Property->AddProperty("ABSLENGTH", wls_    222   clad1Property->AddProperty("ABSLENGTH", wls_Energy, AbsFiber);
203   fPethylene1->SetMaterialPropertiesTable(clad    223   fPethylene1->SetMaterialPropertiesTable(clad1Property);
204                                                   224 
205   std::vector<G4double> RefractiveIndexClad2 = << 225   std::vector<G4double> RefractiveIndexClad2 = { 1.42, 1.42, 1.42, 1.42 };
206   auto clad2Property = new G4MaterialPropertie << 226   G4MaterialPropertiesTable* clad2Property   = new G4MaterialPropertiesTable();
207   clad2Property->AddProperty("RINDEX", wls_Ene    227   clad2Property->AddProperty("RINDEX", wls_Energy, RefractiveIndexClad2);
208   clad2Property->AddProperty("ABSLENGTH", wls_    228   clad2Property->AddProperty("ABSLENGTH", wls_Energy, AbsFiber);
209   fPethylene2->SetMaterialPropertiesTable(clad    229   fPethylene2->SetMaterialPropertiesTable(clad2Property);
210 }                                                 230 }
211                                                   231 
212 //....oooOO0OOooo........oooOO0OOooo........oo    232 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
213                                                   233 
214 G4VPhysicalVolume* LXeDetectorConstruction::Co    234 G4VPhysicalVolume* LXeDetectorConstruction::Construct()
215 {                                                 235 {
216   // The experimental hall walls are all 1m aw    236   // The experimental hall walls are all 1m away from housing walls
217   G4double expHall_x = fScint_x + fD_mtl + 1.     237   G4double expHall_x = fScint_x + fD_mtl + 1. * m;
218   G4double expHall_y = fScint_y + fD_mtl + 1.     238   G4double expHall_y = fScint_y + fD_mtl + 1. * m;
219   G4double expHall_z = fScint_z + fD_mtl + 1.     239   G4double expHall_z = fScint_z + fD_mtl + 1. * m;
220                                                   240 
221   // Create experimental hall                     241   // Create experimental hall
222   fExperimentalHall_box = new G4Box("expHall_b << 242   fExperimentalHall_box =
223   fExperimentalHall_log = new G4LogicalVolume( << 243     new G4Box("expHall_box", expHall_x, expHall_y, expHall_z);
224   fExperimentalHall_phys = new G4PVPlacement(n << 244   fExperimentalHall_log =
225                                              " << 245     new G4LogicalVolume(fExperimentalHall_box, fVacuum, "expHall_log", 0, 0, 0);
                                                   >> 246   fExperimentalHall_phys = new G4PVPlacement(
                                                   >> 247     0, G4ThreeVector(), fExperimentalHall_log, "expHall", 0, false, 0);
226                                                   248 
227   fExperimentalHall_log->SetVisAttributes(G4Vi    249   fExperimentalHall_log->SetVisAttributes(G4VisAttributes::GetInvisible());
228                                                   250 
229   // Place the main volume                        251   // Place the main volume
230   if (fMainVolumeOn) {                         << 252   if(fMainVolumeOn)
231     fMainVolume =                              << 253   {
232       new LXeMainVolume(nullptr, G4ThreeVector << 254     fMainVolume = new LXeMainVolume(0, G4ThreeVector(), fExperimentalHall_log,
                                                   >> 255                                     false, 0, this);
233   }                                               256   }
234                                                   257 
235   // Place the WLS slab                           258   // Place the WLS slab
236   if (fWLSslab) {                              << 259   if(fWLSslab)
237     G4VPhysicalVolume* slab =                  << 260   {
238       new LXeWLSSlab(nullptr, G4ThreeVector(0. << 261     G4VPhysicalVolume* slab = new LXeWLSSlab(
239                      fExperimentalHall_log, fa << 262       0, G4ThreeVector(0., 0., -fScint_z / 2. - fSlab_z - 1. * cm),
                                                   >> 263       fExperimentalHall_log, false, 0, this);
240                                                   264 
241     // Surface properties for the WLS slab        265     // Surface properties for the WLS slab
242     auto scintWrap = new G4OpticalSurface("Sci << 266     G4OpticalSurface* scintWrap = new G4OpticalSurface("ScintWrap");
243                                                   267 
244     new G4LogicalBorderSurface("ScintWrap", sl << 268     new G4LogicalBorderSurface("ScintWrap", slab, fExperimentalHall_phys,
                                                   >> 269                                scintWrap);
245                                                   270 
246     scintWrap->SetType(dielectric_metal);         271     scintWrap->SetType(dielectric_metal);
247     scintWrap->SetFinish(polished);               272     scintWrap->SetFinish(polished);
248     scintWrap->SetModel(glisur);                  273     scintWrap->SetModel(glisur);
249                                                   274 
250     std::vector<G4double> pp = {2.0 * eV, 3.5  << 275     std::vector<G4double> pp           = { 2.0 * eV, 3.5 * eV };
251     std::vector<G4double> reflectivity = {1.0, << 276     std::vector<G4double> reflectivity = { 1.0, 1.0 };
252     std::vector<G4double> efficiency = {0.0, 0 << 277     std::vector<G4double> efficiency   = { 0.0, 0.0 };
253                                                   278 
254     auto scintWrapProperty = new G4MaterialPro << 279     G4MaterialPropertiesTable* scintWrapProperty =
                                                   >> 280       new G4MaterialPropertiesTable();
255                                                   281 
256     scintWrapProperty->AddProperty("REFLECTIVI    282     scintWrapProperty->AddProperty("REFLECTIVITY", pp, reflectivity);
257     scintWrapProperty->AddProperty("EFFICIENCY    283     scintWrapProperty->AddProperty("EFFICIENCY", pp, efficiency);
258     scintWrap->SetMaterialPropertiesTable(scin    284     scintWrap->SetMaterialPropertiesTable(scintWrapProperty);
259   }                                               285   }
260                                                   286 
261   return fExperimentalHall_phys;                  287   return fExperimentalHall_phys;
262 }                                                 288 }
263                                                   289 
264 //....oooOO0OOooo........oooOO0OOooo........oo    290 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
265                                                   291 
266 void LXeDetectorConstruction::ConstructSDandFi    292 void LXeDetectorConstruction::ConstructSDandField()
267 {                                                 293 {
268   if (!fMainVolume) return;                    << 294   if(!fMainVolume)
                                                   >> 295     return;
269                                                   296 
270   // PMT SD                                       297   // PMT SD
271                                                   298 
272   LXePMTSD* pmt = fPmt_SD.Get();                  299   LXePMTSD* pmt = fPmt_SD.Get();
273   if (!pmt) {                                  << 300   if(!pmt)
                                                   >> 301   {
274     // Created here so it exists as pmts are b    302     // Created here so it exists as pmts are being placed
275     G4cout << "Construction /LXeDet/pmtSD" <<     303     G4cout << "Construction /LXeDet/pmtSD" << G4endl;
276     auto pmt_SD = new LXePMTSD("/LXeDet/pmtSD" << 304     LXePMTSD* pmt_SD = new LXePMTSD("/LXeDet/pmtSD");
277     fPmt_SD.Put(pmt_SD);                          305     fPmt_SD.Put(pmt_SD);
278                                                   306 
279     pmt_SD->InitPMTs();                           307     pmt_SD->InitPMTs();
280     pmt_SD->SetPmtPositions(fMainVolume->GetPm    308     pmt_SD->SetPmtPositions(fMainVolume->GetPmtPositions());
281   }                                               309   }
282   else {                                       << 310   else
                                                   >> 311   {
283     pmt->InitPMTs();                              312     pmt->InitPMTs();
284     pmt->SetPmtPositions(fMainVolume->GetPmtPo    313     pmt->SetPmtPositions(fMainVolume->GetPmtPositions());
285   }                                               314   }
286   G4SDManager::GetSDMpointer()->AddNewDetector    315   G4SDManager::GetSDMpointer()->AddNewDetector(fPmt_SD.Get());
287   // sensitive detector is not actually on the    316   // sensitive detector is not actually on the photocathode.
288   // processHits gets done manually by the ste    317   // processHits gets done manually by the stepping action.
289   // It is used to detect when photons hit and    318   // It is used to detect when photons hit and get absorbed & detected at the
290   // boundary to the photocathode (which doesn    319   // boundary to the photocathode (which doesn't get done by attaching it to a
291   // logical volume.                              320   // logical volume.
292   // It does however need to be attached to so    321   // It does however need to be attached to something or else it doesn't get
293   // reset at the begining of events              322   // reset at the begining of events
294                                                   323 
295   SetSensitiveDetector(fMainVolume->GetLogPhot    324   SetSensitiveDetector(fMainVolume->GetLogPhotoCath(), fPmt_SD.Get());
296                                                   325 
297   // Scint SD                                     326   // Scint SD
298                                                   327 
299   if (!fScint_SD.Get()) {                      << 328   if(!fScint_SD.Get())
                                                   >> 329   {
300     G4cout << "Construction /LXeDet/scintSD" <    330     G4cout << "Construction /LXeDet/scintSD" << G4endl;
301     auto scint_SD = new LXeScintSD("/LXeDet/sc << 331     LXeScintSD* scint_SD = new LXeScintSD("/LXeDet/scintSD");
302     fScint_SD.Put(scint_SD);                      332     fScint_SD.Put(scint_SD);
303   }                                               333   }
304   G4SDManager::GetSDMpointer()->AddNewDetector    334   G4SDManager::GetSDMpointer()->AddNewDetector(fScint_SD.Get());
305   SetSensitiveDetector(fMainVolume->GetLogScin    335   SetSensitiveDetector(fMainVolume->GetLogScint(), fScint_SD.Get());
306 }                                                 336 }
307                                                   337 
308 //....oooOO0OOooo........oooOO0OOooo........oo    338 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
309                                                   339 
310 void LXeDetectorConstruction::SetDimensions(G4    340 void LXeDetectorConstruction::SetDimensions(G4ThreeVector dims)
311 {                                                 341 {
312   fScint_x = dims[0];                             342   fScint_x = dims[0];
313   fScint_y = dims[1];                             343   fScint_y = dims[1];
314   fScint_z = dims[2];                             344   fScint_z = dims[2];
315   G4RunManager::GetRunManager()->ReinitializeG    345   G4RunManager::GetRunManager()->ReinitializeGeometry();
316 }                                                 346 }
317                                                   347 
318 //....oooOO0OOooo........oooOO0OOooo........oo    348 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
319                                                   349 
320 void LXeDetectorConstruction::SetHousingThickn    350 void LXeDetectorConstruction::SetHousingThickness(G4double d_mtl)
321 {                                                 351 {
322   fD_mtl = d_mtl;                                 352   fD_mtl = d_mtl;
323   G4RunManager::GetRunManager()->ReinitializeG    353   G4RunManager::GetRunManager()->ReinitializeGeometry();
324 }                                                 354 }
325                                                   355 
326 //....oooOO0OOooo........oooOO0OOooo........oo    356 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
327                                                   357 
328 void LXeDetectorConstruction::SetNX(G4int nx)     358 void LXeDetectorConstruction::SetNX(G4int nx)
329 {                                                 359 {
330   fNx = nx;                                       360   fNx = nx;
331   G4RunManager::GetRunManager()->ReinitializeG    361   G4RunManager::GetRunManager()->ReinitializeGeometry();
332 }                                                 362 }
333                                                   363 
334 //....oooOO0OOooo........oooOO0OOooo........oo    364 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
335                                                   365 
336 void LXeDetectorConstruction::SetNY(G4int ny)     366 void LXeDetectorConstruction::SetNY(G4int ny)
337 {                                                 367 {
338   fNy = ny;                                       368   fNy = ny;
339   G4RunManager::GetRunManager()->ReinitializeG    369   G4RunManager::GetRunManager()->ReinitializeGeometry();
340 }                                                 370 }
341                                                   371 
342 //....oooOO0OOooo........oooOO0OOooo........oo    372 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
343                                                   373 
344 void LXeDetectorConstruction::SetNZ(G4int nz)     374 void LXeDetectorConstruction::SetNZ(G4int nz)
345 {                                                 375 {
346   fNz = nz;                                       376   fNz = nz;
347   G4RunManager::GetRunManager()->ReinitializeG    377   G4RunManager::GetRunManager()->ReinitializeGeometry();
348 }                                                 378 }
349                                                   379 
350 //....oooOO0OOooo........oooOO0OOooo........oo    380 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
351                                                   381 
352 void LXeDetectorConstruction::SetPMTRadius(G4d    382 void LXeDetectorConstruction::SetPMTRadius(G4double outerRadius_pmt)
353 {                                                 383 {
354   fOuterRadius_pmt = outerRadius_pmt;             384   fOuterRadius_pmt = outerRadius_pmt;
355   G4RunManager::GetRunManager()->ReinitializeG    385   G4RunManager::GetRunManager()->ReinitializeGeometry();
356 }                                                 386 }
357                                                   387 
358 //....oooOO0OOooo........oooOO0OOooo........oo    388 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
359                                                   389 
360 void LXeDetectorConstruction::SetDefaults()       390 void LXeDetectorConstruction::SetDefaults()
361 {                                                 391 {
362   // Resets to default values                     392   // Resets to default values
363   fD_mtl = 0.0635 * cm;                           393   fD_mtl = 0.0635 * cm;
364                                                   394 
365   fScint_x = 17.8 * cm;                           395   fScint_x = 17.8 * cm;
366   fScint_y = 17.8 * cm;                           396   fScint_y = 17.8 * cm;
367   fScint_z = 22.6 * cm;                           397   fScint_z = 22.6 * cm;
368                                                   398 
369   fNx = 2;                                        399   fNx = 2;
370   fNy = 2;                                        400   fNy = 2;
371   fNz = 3;                                        401   fNz = 3;
372                                                   402 
373   fOuterRadius_pmt = 2.3 * cm;                    403   fOuterRadius_pmt = 2.3 * cm;
374                                                   404 
375   fSphereOn = true;                               405   fSphereOn = true;
376   fRefl = 1.0;                                 << 406   fRefl     = 1.0;
377                                                   407 
378   fNfibers = 15;                               << 408   fNfibers      = 15;
379   fWLSslab = false;                            << 409   fWLSslab      = false;
380   fMainVolumeOn = true;                           410   fMainVolumeOn = true;
381   fMainVolume = nullptr;                       << 411   fMainVolume   = nullptr;
382   fSlab_z = 2.5 * mm;                          << 412   fSlab_z       = 2.5 * mm;
383                                                   413 
384   G4UImanager::GetUIpointer()->ApplyCommand("/ << 414   G4UImanager::GetUIpointer()->ApplyCommand(
                                                   >> 415     "/LXe/detector/scintYieldFactor 1.");
385                                                   416 
386   if (fLXe_mt) fLXe_mt->AddConstProperty("SCIN << 417   if(fLXe_mt)
387   if (fMPTPStyrene) fMPTPStyrene->AddConstProp << 418     fLXe_mt->AddConstProperty("SCINTILLATIONYIELD", 12000. / MeV);
                                                   >> 419   if(fMPTPStyrene)
                                                   >> 420     fMPTPStyrene->AddConstProperty("SCINTILLATIONYIELD", 10. / keV);
388 }                                                 421 }
389                                                   422 
390 //....oooOO0OOooo........oooOO0OOooo........oo    423 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
391                                                   424 
392 void LXeDetectorConstruction::SetSphereOn(G4bo    425 void LXeDetectorConstruction::SetSphereOn(G4bool b)
393 {                                                 426 {
394   fSphereOn = b;                                  427   fSphereOn = b;
395   G4RunManager::GetRunManager()->ReinitializeG    428   G4RunManager::GetRunManager()->ReinitializeGeometry();
396 }                                                 429 }
397                                                   430 
398 //....oooOO0OOooo........oooOO0OOooo........oo    431 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
399                                                   432 
400 void LXeDetectorConstruction::SetHousingReflec    433 void LXeDetectorConstruction::SetHousingReflectivity(G4double r)
401 {                                                 434 {
402   fRefl = r;                                      435   fRefl = r;
403   G4RunManager::GetRunManager()->ReinitializeG    436   G4RunManager::GetRunManager()->ReinitializeGeometry();
404 }                                                 437 }
405                                                   438 
406 //....oooOO0OOooo........oooOO0OOooo........oo    439 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
407                                                   440 
408 void LXeDetectorConstruction::SetWLSSlabOn(G4b    441 void LXeDetectorConstruction::SetWLSSlabOn(G4bool b)
409 {                                                 442 {
410   fWLSslab = b;                                   443   fWLSslab = b;
411   G4RunManager::GetRunManager()->ReinitializeG    444   G4RunManager::GetRunManager()->ReinitializeGeometry();
412 }                                                 445 }
413                                                   446 
414 //....oooOO0OOooo........oooOO0OOooo........oo    447 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
415                                                   448 
416 void LXeDetectorConstruction::SetMainVolumeOn(    449 void LXeDetectorConstruction::SetMainVolumeOn(G4bool b)
417 {                                                 450 {
418   fMainVolumeOn = b;                              451   fMainVolumeOn = b;
419   G4RunManager::GetRunManager()->ReinitializeG    452   G4RunManager::GetRunManager()->ReinitializeGeometry();
420 }                                                 453 }
421                                                   454 
422 //....oooOO0OOooo........oooOO0OOooo........oo    455 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
423                                                   456 
424 void LXeDetectorConstruction::SetNFibers(G4int    457 void LXeDetectorConstruction::SetNFibers(G4int n)
425 {                                                 458 {
426   fNfibers = n;                                   459   fNfibers = n;
427   G4RunManager::GetRunManager()->ReinitializeG    460   G4RunManager::GetRunManager()->ReinitializeGeometry();
428 }                                                 461 }
429                                                   462 
430 //....oooOO0OOooo........oooOO0OOooo........oo    463 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
431                                                   464 
432 void LXeDetectorConstruction::SetMainScintYiel    465 void LXeDetectorConstruction::SetMainScintYield(G4double y)
433 {                                                 466 {
434   fLXe_mt->AddConstProperty("SCINTILLATIONYIEL    467   fLXe_mt->AddConstProperty("SCINTILLATIONYIELD", y / MeV);
435 }                                                 468 }
436                                                   469 
437 //....oooOO0OOooo........oooOO0OOooo........oo    470 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
438                                                   471 
439 void LXeDetectorConstruction::SetWLSScintYield    472 void LXeDetectorConstruction::SetWLSScintYield(G4double y)
440 {                                                 473 {
441   fMPTPStyrene->AddConstProperty("SCINTILLATIO    474   fMPTPStyrene->AddConstProperty("SCINTILLATIONYIELD", y / MeV);
442 }                                                 475 }
443                                                   476 
444 //....oooOO0OOooo........oooOO0OOooo........oo    477 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
445                                                   478 
446 void LXeDetectorConstruction::SetSaveThreshold    479 void LXeDetectorConstruction::SetSaveThreshold(G4int save)
447 {                                                 480 {
448   // Sets the save threshold for the random nu    481   // Sets the save threshold for the random number seed. If the number of
449   // photons generated in an event is lower th    482   // photons generated in an event is lower than this, then save the seed for
450   // this event in a file called run###evt###.    483   // this event in a file called run###evt###.rndm
451                                                   484 
452   fSaveThreshold = save;                          485   fSaveThreshold = save;
453   G4RunManager::GetRunManager()->SetRandomNumb    486   G4RunManager::GetRunManager()->SetRandomNumberStore(true);
454 }                                                 487 }
455                                                   488 
456 //....oooOO0OOooo........oooOO0OOooo........oo    489 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
457                                                   490