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/LXeMainVolume.cc 27 /// \file optical/LXe/src/LXeMainVolume.cc 28 /// \brief Implementation of the LXeMainVolume 28 /// \brief Implementation of the LXeMainVolume class 29 // 29 // 30 // 30 // 31 #include "LXeMainVolume.hh" 31 #include "LXeMainVolume.hh" 32 32 >> 33 #include "globals.hh" 33 #include "G4Box.hh" 34 #include "G4Box.hh" 34 #include "G4Colour.hh" 35 #include "G4Colour.hh" 35 #include "G4LogicalBorderSurface.hh" << 36 #include "G4LogicalSkinSurface.hh" 36 #include "G4LogicalSkinSurface.hh" >> 37 #include "G4LogicalBorderSurface.hh" 37 #include "G4LogicalVolume.hh" 38 #include "G4LogicalVolume.hh" 38 #include "G4Material.hh" 39 #include "G4Material.hh" 39 #include "G4MaterialPropertiesTable.hh" 40 #include "G4MaterialPropertiesTable.hh" 40 #include "G4OpticalSurface.hh" 41 #include "G4OpticalSurface.hh" 41 #include "G4Sphere.hh" 42 #include "G4Sphere.hh" 42 #include "G4SystemOfUnits.hh" 43 #include "G4SystemOfUnits.hh" 43 #include "G4Tubs.hh" 44 #include "G4Tubs.hh" 44 #include "G4VisAttributes.hh" 45 #include "G4VisAttributes.hh" 45 #include "globals.hh" << 46 46 47 //....oooOO0OOooo........oooOO0OOooo........oo 47 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 48 48 49 LXeMainVolume::LXeMainVolume(G4RotationMatrix* 49 LXeMainVolume::LXeMainVolume(G4RotationMatrix* pRot, const G4ThreeVector& tlate, 50 G4LogicalVolume* << 50 G4LogicalVolume* pMotherLogical, G4bool pMany, 51 LXeDetectorConstr << 51 G4int pCopyNo, LXeDetectorConstruction* c) 52 // Pass info to the G4PVPlacement constructo 52 // Pass info to the G4PVPlacement constructor 53 : G4PVPlacement( << 53 : G4PVPlacement(pRot, tlate, 54 pRot, tlate, << 54 // Temp logical volume must be created here 55 // Temp logical volume must be created h << 55 new G4LogicalVolume(new G4Box("temp", 1, 1, 1), 56 new G4LogicalVolume(new G4Box("temp", 1, << 56 G4Material::GetMaterial("Vacuum"), "temp", 57 "housing", pMotherLogical, pMany, pCopyN << 57 0, 0, 0), 58 fConstructor(c) << 58 "housing", pMotherLogical, pMany, pCopyNo) >> 59 , fConstructor(c) 59 { 60 { 60 CopyValues(); 61 CopyValues(); 61 62 62 G4double housing_x = fScint_x + 2. * fD_mtl; 63 G4double housing_x = fScint_x + 2. * fD_mtl; 63 G4double housing_y = fScint_y + 2. * fD_mtl; 64 G4double housing_y = fScint_y + 2. * fD_mtl; 64 G4double housing_z = fScint_z + 2. * fD_mtl; 65 G4double housing_z = fScint_z + 2. * fD_mtl; 65 66 66 //*************************** housing and sc 67 //*************************** housing and scintillator 67 fScint_box = new G4Box("scint_box", fScint_x << 68 fScint_box = 68 fHousing_box = new G4Box("housing_box", hous << 69 new G4Box("scint_box", fScint_x / 2., fScint_y / 2., fScint_z / 2.); 69 << 70 fHousing_box = 70 fScint_log = new G4LogicalVolume(fScint_box, << 71 new G4Box("housing_box", housing_x / 2., housing_y / 2., housing_z / 2.); 71 fHousing_log = new G4LogicalVolume(fHousing_ << 72 >> 73 fScint_log = new G4LogicalVolume(fScint_box, G4Material::GetMaterial("LXe"), >> 74 "scint_log", 0, 0, 0); >> 75 fHousing_log = new G4LogicalVolume( >> 76 fHousing_box, G4Material::GetMaterial("Al"), "housing_log", 0, 0, 0); 72 77 73 new G4PVPlacement(nullptr, G4ThreeVector(), << 78 new G4PVPlacement(0, G4ThreeVector(), fScint_log, "scintillator", >> 79 fHousing_log, false, 0); 74 80 75 //*************** Miscellaneous sphere to de 81 //*************** Miscellaneous sphere to demonstrate skin surfaces 76 fSphere = new G4Sphere("sphere", 0., 2. * cm << 82 fSphere = new G4Sphere("sphere", 0., 2. * cm, 0. * deg, 360. * deg, 0. * deg, 77 fSphere_log = new G4LogicalVolume(fSphere, G << 83 360. * deg); 78 if (fSphereOn) << 84 fSphere_log = 79 new G4PVPlacement(nullptr, G4ThreeVector(5 << 85 new G4LogicalVolume(fSphere, G4Material::GetMaterial("Al"), "sphere_log"); 80 fScint_log, false, 0); << 86 if(fSphereOn) >> 87 new G4PVPlacement(0, G4ThreeVector(5. * cm, 5. * cm, 5. * cm), fSphere_log, >> 88 "sphere", fScint_log, false, 0); 81 89 82 //****************** Build PMTs 90 //****************** Build PMTs 83 G4double innerRadius_pmt = 0.; << 91 G4double innerRadius_pmt = 0.; 84 G4double height_pmt = fD_mtl / 2.; << 92 G4double height_pmt = fD_mtl / 2.; 85 G4double startAngle_pmt = 0.; << 93 G4double startAngle_pmt = 0.; 86 G4double spanningAngle_pmt = 360. * deg; 94 G4double spanningAngle_pmt = 360. * deg; 87 95 88 fPmt = new G4Tubs("pmt_tube", innerRadius_pm << 96 fPmt = new G4Tubs("pmt_tube", innerRadius_pmt, fOuterRadius_pmt, height_pmt, 89 spanningAngle_pmt); << 97 startAngle_pmt, spanningAngle_pmt); 90 98 91 // the "photocathode" is a metal slab at the 99 // the "photocathode" is a metal slab at the back of the glass that 92 // is only a very rough approximation of the 100 // is only a very rough approximation of the real thing since it only 93 // absorbs or detects the photons based on t 101 // absorbs or detects the photons based on the efficiency set below 94 fPhotocath = new G4Tubs("photocath_tube", in << 102 fPhotocath = new G4Tubs("photocath_tube", innerRadius_pmt, fOuterRadius_pmt, 95 startAngle_pmt, span << 103 height_pmt / 2., startAngle_pmt, spanningAngle_pmt); 96 104 97 fPmt_log = new G4LogicalVolume(fPmt, G4Mater << 105 fPmt_log = 98 fPhotocath_log = new G4LogicalVolume(fPhotoc << 106 new G4LogicalVolume(fPmt, G4Material::GetMaterial("Glass"), "pmt_log"); >> 107 fPhotocath_log = new G4LogicalVolume( >> 108 fPhotocath, G4Material::GetMaterial("Al"), "photocath_log"); 99 109 100 new G4PVPlacement(nullptr, G4ThreeVector(0., << 110 new G4PVPlacement(0, G4ThreeVector(0., 0., -height_pmt / 2.), fPhotocath_log, 101 fPmt_log, false, 0); << 111 "photocath", fPmt_log, false, 0); 102 112 103 //***********Arrange pmts around the outside 113 //***********Arrange pmts around the outside of housing********** 104 114 105 G4double dx = fScint_x / fNx; 115 G4double dx = fScint_x / fNx; 106 G4double dy = fScint_y / fNy; 116 G4double dy = fScint_y / fNy; 107 G4double dz = fScint_z / fNz; 117 G4double dz = fScint_z / fNz; 108 118 109 G4double x, y, z; 119 G4double x, y, z; 110 G4double xmin = -fScint_x / 2. - dx / 2.; 120 G4double xmin = -fScint_x / 2. - dx / 2.; 111 G4double ymin = -fScint_y / 2. - dy / 2.; 121 G4double ymin = -fScint_y / 2. - dy / 2.; 112 G4double zmin = -fScint_z / 2. - dz / 2.; 122 G4double zmin = -fScint_z / 2. - dz / 2.; 113 G4int k = 0; << 123 G4int k = 0; 114 124 115 z = -fScint_z / 2. - height_pmt; // front 125 z = -fScint_z / 2. - height_pmt; // front 116 PlacePMTs(fPmt_log, nullptr, x, y, dx, dy, x 126 PlacePMTs(fPmt_log, nullptr, x, y, dx, dy, xmin, ymin, fNx, fNy, x, y, z, k); 117 127 118 auto rm_z = new G4RotationMatrix(); << 128 G4RotationMatrix* rm_z = new G4RotationMatrix(); 119 rm_z->rotateY(180. * deg); 129 rm_z->rotateY(180. * deg); 120 z = fScint_z / 2. + height_pmt; // back 130 z = fScint_z / 2. + height_pmt; // back 121 PlacePMTs(fPmt_log, rm_z, x, y, dx, dy, xmin 131 PlacePMTs(fPmt_log, rm_z, x, y, dx, dy, xmin, ymin, fNx, fNy, x, y, z, k); 122 132 123 auto rm_y1 = new G4RotationMatrix(); << 133 G4RotationMatrix* rm_y1 = new G4RotationMatrix(); 124 rm_y1->rotateY(-90. * deg); 134 rm_y1->rotateY(-90. * deg); 125 x = -fScint_x / 2. - height_pmt; // left 135 x = -fScint_x / 2. - height_pmt; // left 126 PlacePMTs(fPmt_log, rm_y1, y, z, dy, dz, ymi 136 PlacePMTs(fPmt_log, rm_y1, y, z, dy, dz, ymin, zmin, fNy, fNz, x, y, z, k); 127 137 128 auto rm_y2 = new G4RotationMatrix(); << 138 G4RotationMatrix* rm_y2 = new G4RotationMatrix(); 129 rm_y2->rotateY(90. * deg); 139 rm_y2->rotateY(90. * deg); 130 x = fScint_x / 2. + height_pmt; // right 140 x = fScint_x / 2. + height_pmt; // right 131 PlacePMTs(fPmt_log, rm_y2, y, z, dy, dz, ymi 141 PlacePMTs(fPmt_log, rm_y2, y, z, dy, dz, ymin, zmin, fNy, fNz, x, y, z, k); 132 142 133 auto rm_x1 = new G4RotationMatrix(); << 143 G4RotationMatrix* rm_x1 = new G4RotationMatrix(); 134 rm_x1->rotateX(90. * deg); 144 rm_x1->rotateX(90. * deg); 135 y = -fScint_y / 2. - height_pmt; // bottom 145 y = -fScint_y / 2. - height_pmt; // bottom 136 PlacePMTs(fPmt_log, rm_x1, x, z, dx, dz, xmi 146 PlacePMTs(fPmt_log, rm_x1, x, z, dx, dz, xmin, zmin, fNx, fNz, x, y, z, k); 137 147 138 auto rm_x2 = new G4RotationMatrix(); << 148 G4RotationMatrix* rm_x2 = new G4RotationMatrix(); 139 rm_x2->rotateX(-90. * deg); 149 rm_x2->rotateX(-90. * deg); 140 y = fScint_y / 2. + height_pmt; // top 150 y = fScint_y / 2. + height_pmt; // top 141 PlacePMTs(fPmt_log, rm_x2, x, z, dx, dz, xmi 151 PlacePMTs(fPmt_log, rm_x2, x, z, dx, dz, xmin, zmin, fNx, fNz, x, y, z, k); 142 152 143 VisAttributes(); 153 VisAttributes(); 144 SurfaceProperties(); 154 SurfaceProperties(); 145 155 146 SetLogicalVolume(fHousing_log); 156 SetLogicalVolume(fHousing_log); 147 } 157 } 148 158 149 //....oooOO0OOooo........oooOO0OOooo........oo 159 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 150 160 151 void LXeMainVolume::CopyValues() 161 void LXeMainVolume::CopyValues() 152 { 162 { 153 fScint_x = fConstructor->GetScintX(); << 163 fScint_x = fConstructor->GetScintX(); 154 fScint_y = fConstructor->GetScintY(); << 164 fScint_y = fConstructor->GetScintY(); 155 fScint_z = fConstructor->GetScintZ(); << 165 fScint_z = fConstructor->GetScintZ(); 156 fD_mtl = fConstructor->GetHousingThickness() << 166 fD_mtl = fConstructor->GetHousingThickness(); 157 fNx = fConstructor->GetNX(); << 167 fNx = fConstructor->GetNX(); 158 fNy = fConstructor->GetNY(); << 168 fNy = fConstructor->GetNY(); 159 fNz = fConstructor->GetNZ(); << 169 fNz = fConstructor->GetNZ(); 160 fOuterRadius_pmt = fConstructor->GetPMTRadiu 170 fOuterRadius_pmt = fConstructor->GetPMTRadius(); 161 fSphereOn = fConstructor->GetSphereOn(); << 171 fSphereOn = fConstructor->GetSphereOn(); 162 fRefl = fConstructor->GetHousingReflectivity << 172 fRefl = fConstructor->GetHousingReflectivity(); 163 } 173 } 164 174 165 //....oooOO0OOooo........oooOO0OOooo........oo 175 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 166 176 167 void LXeMainVolume::PlacePMTs(G4LogicalVolume* << 177 void LXeMainVolume::PlacePMTs(G4LogicalVolume* pmt_log, G4RotationMatrix* rot, 168 G4double& b, G4d << 178 G4double& a, G4double& b, G4double da, 169 G4int na, G4int << 179 G4double db, G4double amin, G4double bmin, >> 180 G4int na, G4int nb, G4double& x, G4double& y, >> 181 G4double& z, G4int& k) 170 { 182 { 171 /* PlacePMTs : a different way to parameter 183 /* PlacePMTs : a different way to parameterize placement that does not depend 172 * on calculating the position from the copy 184 * on calculating the position from the copy number 173 * 185 * 174 * pmt_log = logical volume for pmts to be 186 * pmt_log = logical volume for pmts to be placed 175 * rot = rotation matrix to apply 187 * rot = rotation matrix to apply 176 * a,b = coordinates to vary(ie. if varying 188 * a,b = coordinates to vary(ie. if varying in the xy plane then pass x,y) 177 * da,db = value to increment a,b by 189 * da,db = value to increment a,b by 178 * amin,bmin = start values for a,b 190 * amin,bmin = start values for a,b 179 * na,nb = number of repitions in a and b 191 * na,nb = number of repitions in a and b 180 * x,y,z = just pass x,y, and z by referenc 192 * x,y,z = just pass x,y, and z by reference (the same ones passed for a,b) 181 * k = copy number to start with 193 * k = copy number to start with 182 * sd = sensitive detector for pmts 194 * sd = sensitive detector for pmts 183 */ 195 */ 184 a = amin; 196 a = amin; 185 for (G4int j = 1; j <= na; ++j) { << 197 for(G4int j = 1; j <= na; ++j) >> 198 { 186 a += da; 199 a += da; 187 b = bmin; 200 b = bmin; 188 for (G4int i = 1; i <= nb; ++i) { << 201 for(G4int i = 1; i <= nb; ++i) >> 202 { 189 b += db; 203 b += db; 190 new G4PVPlacement(rot, G4ThreeVector(x, << 204 new G4PVPlacement(rot, G4ThreeVector(x, y, z), pmt_log, "pmt", >> 205 fHousing_log, false, k); 191 fPmtPositions.push_back(G4ThreeVector(x, 206 fPmtPositions.push_back(G4ThreeVector(x, y, z)); 192 ++k; 207 ++k; 193 } 208 } 194 } 209 } 195 } 210 } 196 211 197 //....oooOO0OOooo........oooOO0OOooo........oo 212 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 198 213 199 void LXeMainVolume::VisAttributes() 214 void LXeMainVolume::VisAttributes() 200 { 215 { 201 auto housing_va = new G4VisAttributes(G4Colo << 216 G4VisAttributes* housing_va = new G4VisAttributes(G4Colour(0.8, 0.8, 0.8)); 202 fHousing_log->SetVisAttributes(housing_va); 217 fHousing_log->SetVisAttributes(housing_va); 203 218 204 auto sphere_va = new G4VisAttributes(); << 219 G4VisAttributes* sphere_va = new G4VisAttributes(); 205 sphere_va->SetForceSolid(true); 220 sphere_va->SetForceSolid(true); 206 fSphere_log->SetVisAttributes(sphere_va); 221 fSphere_log->SetVisAttributes(sphere_va); 207 } 222 } 208 223 209 //....oooOO0OOooo........oooOO0OOooo........oo 224 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 210 225 211 void LXeMainVolume::SurfaceProperties() 226 void LXeMainVolume::SurfaceProperties() 212 { 227 { 213 std::vector<G4double> ephoton = {7.0 * eV, 7 << 228 std::vector<G4double> ephoton = { 7.0 * eV, 7.14 * eV }; 214 229 215 //**Scintillator housing properties 230 //**Scintillator housing properties 216 std::vector<G4double> reflectivity = {fRefl, << 231 std::vector<G4double> reflectivity = { fRefl, fRefl }; 217 std::vector<G4double> efficiency = {0.0, 0.0 << 232 std::vector<G4double> efficiency = { 0.0, 0.0 }; 218 auto scintHsngPT = new G4MaterialPropertiesT << 233 G4MaterialPropertiesTable* scintHsngPT = new G4MaterialPropertiesTable(); 219 scintHsngPT->AddProperty("REFLECTIVITY", eph 234 scintHsngPT->AddProperty("REFLECTIVITY", ephoton, reflectivity); 220 scintHsngPT->AddProperty("EFFICIENCY", ephot 235 scintHsngPT->AddProperty("EFFICIENCY", ephoton, efficiency); 221 auto OpScintHousingSurface = << 236 G4OpticalSurface* OpScintHousingSurface = 222 new G4OpticalSurface("HousingSurface", uni 237 new G4OpticalSurface("HousingSurface", unified, polished, dielectric_metal); 223 OpScintHousingSurface->SetMaterialProperties 238 OpScintHousingSurface->SetMaterialPropertiesTable(scintHsngPT); 224 239 225 //**Sphere surface properties 240 //**Sphere surface properties 226 std::vector<G4double> sphereReflectivity = { << 241 std::vector<G4double> sphereReflectivity = { 1.0, 1.0 }; 227 std::vector<G4double> sphereEfficiency = {0. << 242 std::vector<G4double> sphereEfficiency = { 0.0, 0.0 }; 228 auto spherePT = new G4MaterialPropertiesTabl << 243 G4MaterialPropertiesTable* spherePT = new G4MaterialPropertiesTable(); 229 spherePT->AddProperty("REFLECTIVITY", ephoto 244 spherePT->AddProperty("REFLECTIVITY", ephoton, sphereReflectivity); 230 spherePT->AddProperty("EFFICIENCY", ephoton, 245 spherePT->AddProperty("EFFICIENCY", ephoton, sphereEfficiency); 231 auto OpSphereSurface = new G4OpticalSurface( << 246 G4OpticalSurface* OpSphereSurface = >> 247 new G4OpticalSurface("SphereSurface", unified, polished, dielectric_metal); 232 OpSphereSurface->SetMaterialPropertiesTable( 248 OpSphereSurface->SetMaterialPropertiesTable(spherePT); 233 249 234 //**Photocathode surface properties 250 //**Photocathode surface properties 235 std::vector<G4double> photocath_EFF = {1., 1 << 251 std::vector<G4double> photocath_EFF = { 1., 1. }; 236 std::vector<G4double> photocath_ReR = {1.92, << 252 std::vector<G4double> photocath_ReR = { 1.92, 1.92 }; 237 std::vector<G4double> photocath_ImR = {1.69, << 253 std::vector<G4double> photocath_ImR = { 1.69, 1.69 }; 238 auto photocath_mt = new G4MaterialProperties << 254 G4MaterialPropertiesTable* photocath_mt = new G4MaterialPropertiesTable(); 239 photocath_mt->AddProperty("EFFICIENCY", epho 255 photocath_mt->AddProperty("EFFICIENCY", ephoton, photocath_EFF); 240 photocath_mt->AddProperty("REALRINDEX", epho 256 photocath_mt->AddProperty("REALRINDEX", ephoton, photocath_ReR); 241 photocath_mt->AddProperty("IMAGINARYRINDEX", 257 photocath_mt->AddProperty("IMAGINARYRINDEX", ephoton, photocath_ImR); 242 auto photocath_opsurf = << 258 G4OpticalSurface* photocath_opsurf = new G4OpticalSurface( 243 new G4OpticalSurface("photocath_opsurf", g << 259 "photocath_opsurf", glisur, polished, dielectric_metal); 244 photocath_opsurf->SetMaterialPropertiesTable 260 photocath_opsurf->SetMaterialPropertiesTable(photocath_mt); 245 261 246 //**Create logical skin surfaces 262 //**Create logical skin surfaces 247 new G4LogicalSkinSurface("photocath_surf", f << 263 new G4LogicalSkinSurface("photocath_surf", fHousing_log, >> 264 OpScintHousingSurface); 248 new G4LogicalSkinSurface("sphere_surface", f 265 new G4LogicalSkinSurface("sphere_surface", fSphere_log, OpSphereSurface); 249 new G4LogicalSkinSurface("photocath_surf", f 266 new G4LogicalSkinSurface("photocath_surf", fPhotocath_log, photocath_opsurf); 250 } 267 } 251 268