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