Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 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