Loading...
Searching...
No Matches
Public Member Functions | Private Member Functions | Private Attributes | List of all members
LXeMainVolume Class Reference

#include <Doxymodules_optical.h>

Inheritance diagram for LXeMainVolume:
G4PVPlacement G4VPhysicalVolume

Public Member Functions

 LXeMainVolume (G4RotationMatrix *pRot, const G4ThreeVector &tlate, G4LogicalVolume *pMotherLogical, G4bool pMany, G4int pCopyNo, LXeDetectorConstruction *c)
 
G4LogicalVolumeGetLogPhotoCath ()
 
G4LogicalVolumeGetLogScint ()
 
std::vector< G4ThreeVector > GetPmtPositions ()
 

Private Member Functions

void VisAttributes ()
 
void SurfaceProperties ()
 
void PlacePMTs (G4LogicalVolume *pmt_Log, G4RotationMatrix *rot, G4double &a, G4double &b, G4double da, G4double db, G4double amin, G4double bmin, G4int na, G4int nb, G4double &x, G4double &y, G4double &z, G4int &k)
 
void CopyValues ()
 

Private Attributes

LXeDetectorConstructionfConstructor = nullptr
 
G4double fScint_x = 0.
 
G4double fScint_y = 0.
 
G4double fScint_z = 0.
 
G4double fD_mtl = 0.
 
G4int fNx = 0
 
G4int fNy = 0
 
G4int fNz = 0
 
G4double fOuterRadius_pmt = 0.
 
G4bool fSphereOn = false
 
G4double fRefl = 0.
 
G4BoxfScint_box = nullptr
 
G4BoxfHousing_box = nullptr
 
G4TubsfPmt = nullptr
 
G4TubsfPhotocath = nullptr
 
G4SpherefSphere = nullptr
 
G4LogicalVolumefScint_log = nullptr
 
G4LogicalVolumefHousing_log = nullptr
 
G4LogicalVolumefPmt_log = nullptr
 
G4LogicalVolumefPhotocath_log = nullptr
 
G4LogicalVolumefSphere_log = nullptr
 
std::vector< G4ThreeVector > fPmtPositions
 

Detailed Description

Definition at line 54 of file Doxymodules_optical.h.

Constructor & Destructor Documentation

◆ LXeMainVolume()

LXeMainVolume::LXeMainVolume ( G4RotationMatrix *  pRot,
const G4ThreeVector &  tlate,
G4LogicalVolume pMotherLogical,
G4bool  pMany,
G4int  pCopyNo,
LXeDetectorConstruction c 
)

Definition at line 49 of file LXeMainVolume.cc.

53 : G4PVPlacement(pRot, tlate,
54 // Temp logical volume must be created here
55 new G4LogicalVolume(new G4Box("temp", 1, 1, 1),
56 G4Material::GetMaterial("Vacuum"), "temp"),
57 "housing", pMotherLogical, pMany, pCopyNo)
58 , fConstructor(c)
59{
60 CopyValues();
61
62 G4double housing_x = fScint_x + 2. * fD_mtl;
63 G4double housing_y = fScint_y + 2. * fD_mtl;
64 G4double housing_z = fScint_z + 2. * fD_mtl;
65
66 //*************************** housing and scintillator
68 new G4Box("scint_box", fScint_x / 2., fScint_y / 2., fScint_z / 2.);
70 new G4Box("housing_box", housing_x / 2., housing_y / 2., housing_z / 2.);
71
72 fScint_log = new G4LogicalVolume(fScint_box, G4Material::GetMaterial("LXe"),
73 "scint_log");
75 fHousing_box, G4Material::GetMaterial("Al"), "housing_log");
76
77 new G4PVPlacement(nullptr, G4ThreeVector(), fScint_log, "scintillator",
78 fHousing_log, false, 0);
79
80 //*************** Miscellaneous sphere to demonstrate skin surfaces
81 fSphere = new G4Sphere("sphere", 0., 2. * cm, 0. * deg, 360. * deg, 0. * deg,
82 360. * deg);
84 new G4LogicalVolume(fSphere, G4Material::GetMaterial("Al"), "sphere_log");
85 if(fSphereOn)
86 new G4PVPlacement(nullptr, G4ThreeVector(5. * cm, 5. * cm, 5. * cm),
87 fSphere_log, "sphere", fScint_log, false, 0);
88
89 //****************** Build PMTs
90 G4double innerRadius_pmt = 0.;
91 G4double height_pmt = fD_mtl / 2.;
92 G4double startAngle_pmt = 0.;
93 G4double spanningAngle_pmt = 360. * deg;
94
95 fPmt = new G4Tubs("pmt_tube", innerRadius_pmt, fOuterRadius_pmt, height_pmt,
96 startAngle_pmt, spanningAngle_pmt);
97
98 // the "photocathode" is a metal slab at the back of the glass that
99 // is only a very rough approximation of the real thing since it only
100 // absorbs or detects the photons based on the efficiency set below
101 fPhotocath = new G4Tubs("photocath_tube", innerRadius_pmt, fOuterRadius_pmt,
102 height_pmt / 2., startAngle_pmt, spanningAngle_pmt);
103
104 fPmt_log =
105 new G4LogicalVolume(fPmt, G4Material::GetMaterial("Glass"), "pmt_log");
107 fPhotocath, G4Material::GetMaterial("Al"), "photocath_log");
108
109 new G4PVPlacement(nullptr, G4ThreeVector(0., 0., -height_pmt / 2.),
110 fPhotocath_log, "photocath", fPmt_log, false, 0);
111
112 //***********Arrange pmts around the outside of housing**********
113
114 G4double dx = fScint_x / fNx;
115 G4double dy = fScint_y / fNy;
116 G4double dz = fScint_z / fNz;
117
118 G4double x, y, z;
119 G4double xmin = -fScint_x / 2. - dx / 2.;
120 G4double ymin = -fScint_y / 2. - dy / 2.;
121 G4double zmin = -fScint_z / 2. - dz / 2.;
122 G4int k = 0;
123
124 z = -fScint_z / 2. - height_pmt; // front
125 PlacePMTs(fPmt_log, nullptr, x, y, dx, dy, xmin, ymin, fNx, fNy, x, y, z, k);
126
127 auto rm_z = new G4RotationMatrix();
128 rm_z->rotateY(180. * deg);
129 z = fScint_z / 2. + height_pmt; // back
130 PlacePMTs(fPmt_log, rm_z, x, y, dx, dy, xmin, ymin, fNx, fNy, x, y, z, k);
131
132 auto rm_y1 = new G4RotationMatrix();
133 rm_y1->rotateY(-90. * deg);
134 x = -fScint_x / 2. - height_pmt; // left
135 PlacePMTs(fPmt_log, rm_y1, y, z, dy, dz, ymin, zmin, fNy, fNz, x, y, z, k);
136
137 auto rm_y2 = new G4RotationMatrix();
138 rm_y2->rotateY(90. * deg);
139 x = fScint_x / 2. + height_pmt; // right
140 PlacePMTs(fPmt_log, rm_y2, y, z, dy, dz, ymin, zmin, fNy, fNz, x, y, z, k);
141
142 auto rm_x1 = new G4RotationMatrix();
143 rm_x1->rotateX(90. * deg);
144 y = -fScint_y / 2. - height_pmt; // bottom
145 PlacePMTs(fPmt_log, rm_x1, x, z, dx, dz, xmin, zmin, fNx, fNz, x, y, z, k);
146
147 auto rm_x2 = new G4RotationMatrix();
148 rm_x2->rotateX(-90. * deg);
149 y = fScint_y / 2. + height_pmt; // top
150 PlacePMTs(fPmt_log, rm_x2, x, z, dx, dz, xmin, zmin, fNx, fNz, x, y, z, k);
151
154
155 SetLogicalVolume(fHousing_log);
156}
G4double fScint_x
G4LogicalVolume * fScint_log
G4double fScint_z
G4Box * fHousing_box
G4LogicalVolume * fPhotocath_log
G4LogicalVolume * fHousing_log
G4double fScint_y
G4double fOuterRadius_pmt
G4LogicalVolume * fPmt_log
void SurfaceProperties()
G4Tubs * fPhotocath
G4LogicalVolume * fSphere_log
void PlacePMTs(G4LogicalVolume *pmt_Log, G4RotationMatrix *rot, G4double &a, G4double &b, G4double da, G4double db, G4double amin, G4double bmin, G4int na, G4int nb, G4double &x, G4double &y, G4double &z, G4int &k)
G4Sphere * fSphere
LXeDetectorConstruction * fConstructor

Member Function Documentation

◆ GetLogPhotoCath()

G4LogicalVolume * LXeMainVolume::GetLogPhotoCath ( )
inline

Definition at line 49 of file LXeMainVolume.hh.

49{ return fPhotocath_log; }

◆ GetLogScint()

G4LogicalVolume * LXeMainVolume::GetLogScint ( )
inline

Definition at line 50 of file LXeMainVolume.hh.

50{ return fScint_log; }

◆ GetPmtPositions()

std::vector< G4ThreeVector > LXeMainVolume::GetPmtPositions ( )
inline

Definition at line 52 of file LXeMainVolume.hh.

52{ return fPmtPositions; }
std::vector< G4ThreeVector > fPmtPositions

◆ VisAttributes()

void LXeMainVolume::VisAttributes ( )
private

Definition at line 213 of file LXeMainVolume.cc.

214{
215 auto housing_va = new G4VisAttributes(G4Colour(0.8, 0.8, 0.8));
216 fHousing_log->SetVisAttributes(housing_va);
217
218 auto sphere_va = new G4VisAttributes();
219 sphere_va->SetForceSolid(true);
220 fSphere_log->SetVisAttributes(sphere_va);
221}

◆ SurfaceProperties()

void LXeMainVolume::SurfaceProperties ( )
private

Definition at line 225 of file LXeMainVolume.cc.

226{
227 std::vector<G4double> ephoton = { 7.0 * eV, 7.14 * eV };
228
229 //**Scintillator housing properties
230 std::vector<G4double> reflectivity = { fRefl, fRefl };
231 std::vector<G4double> efficiency = { 0.0, 0.0 };
232 auto scintHsngPT = new G4MaterialPropertiesTable();
233 scintHsngPT->AddProperty("REFLECTIVITY", ephoton, reflectivity);
234 scintHsngPT->AddProperty("EFFICIENCY", ephoton, efficiency);
235 auto OpScintHousingSurface =
236 new G4OpticalSurface("HousingSurface", unified, polished, dielectric_metal);
237 OpScintHousingSurface->SetMaterialPropertiesTable(scintHsngPT);
238
239 //**Sphere surface properties
240 std::vector<G4double> sphereReflectivity = { 1.0, 1.0 };
241 std::vector<G4double> sphereEfficiency = { 0.0, 0.0 };
242 auto spherePT = new G4MaterialPropertiesTable();
243 spherePT->AddProperty("REFLECTIVITY", ephoton, sphereReflectivity);
244 spherePT->AddProperty("EFFICIENCY", ephoton, sphereEfficiency);
245 auto OpSphereSurface =
246 new G4OpticalSurface("SphereSurface", unified, polished, dielectric_metal);
247 OpSphereSurface->SetMaterialPropertiesTable(spherePT);
248
249 //**Photocathode surface properties
250 std::vector<G4double> photocath_EFF = { 1., 1. };
251 std::vector<G4double> photocath_ReR = { 1.92, 1.92 };
252 std::vector<G4double> photocath_ImR = { 1.69, 1.69 };
253 auto photocath_mt = new G4MaterialPropertiesTable();
254 photocath_mt->AddProperty("EFFICIENCY", ephoton, photocath_EFF);
255 photocath_mt->AddProperty("REALRINDEX", ephoton, photocath_ReR);
256 photocath_mt->AddProperty("IMAGINARYRINDEX", ephoton, photocath_ImR);
257 auto photocath_opsurf = new G4OpticalSurface(
258 "photocath_opsurf", glisur, polished, dielectric_metal);
259 photocath_opsurf->SetMaterialPropertiesTable(photocath_mt);
260
261 //**Create logical skin surfaces
262 new G4LogicalSkinSurface("photocath_surf", fHousing_log,
263 OpScintHousingSurface);
264 new G4LogicalSkinSurface("sphere_surface", fSphere_log, OpSphereSurface);
265 new G4LogicalSkinSurface("photocath_surf", fPhotocath_log, photocath_opsurf);
266}

◆ PlacePMTs()

void LXeMainVolume::PlacePMTs ( G4LogicalVolume pmt_Log,
G4RotationMatrix *  rot,
G4double &  a,
G4double &  b,
G4double  da,
G4double  db,
G4double  amin,
G4double  bmin,
G4int  na,
G4int  nb,
G4double &  x,
G4double &  y,
G4double &  z,
G4int &  k 
)
private

Definition at line 176 of file LXeMainVolume.cc.

181{
182 /* PlacePMTs : a different way to parameterize placement that does not depend
183 * on calculating the position from the copy number
184 *
185 * pmt_log = logical volume for pmts to be placed
186 * rot = rotation matrix to apply
187 * a,b = coordinates to vary(ie. if varying in the xy plane then pass x,y)
188 * da,db = value to increment a,b by
189 * amin,bmin = start values for a,b
190 * na,nb = number of repitions in a and b
191 * x,y,z = just pass x,y, and z by reference (the same ones passed for a,b)
192 * k = copy number to start with
193 * sd = sensitive detector for pmts
194 */
195 a = amin;
196 for(G4int j = 1; j <= na; ++j)
197 {
198 a += da;
199 b = bmin;
200 for(G4int i = 1; i <= nb; ++i)
201 {
202 b += db;
203 new G4PVPlacement(rot, G4ThreeVector(x, y, z), pmt_log, "pmt",
204 fHousing_log, false, k);
205 fPmtPositions.push_back(G4ThreeVector(x, y, z));
206 ++k;
207 }
208 }
209}
std::vector< ExP01TrackerHit * > a

◆ CopyValues()

void LXeMainVolume::CopyValues ( )
private

Definition at line 160 of file LXeMainVolume.cc.

Member Data Documentation

◆ fConstructor

LXeDetectorConstruction* LXeMainVolume::fConstructor = nullptr
private

Definition at line 65 of file LXeMainVolume.hh.

◆ fScint_x

G4double LXeMainVolume::fScint_x = 0.
private

Definition at line 67 of file LXeMainVolume.hh.

◆ fScint_y

G4double LXeMainVolume::fScint_y = 0.
private

Definition at line 68 of file LXeMainVolume.hh.

◆ fScint_z

G4double LXeMainVolume::fScint_z = 0.
private

Definition at line 69 of file LXeMainVolume.hh.

◆ fD_mtl

G4double LXeMainVolume::fD_mtl = 0.
private

Definition at line 70 of file LXeMainVolume.hh.

◆ fNx

G4int LXeMainVolume::fNx = 0
private

Definition at line 71 of file LXeMainVolume.hh.

◆ fNy

G4int LXeMainVolume::fNy = 0
private

Definition at line 72 of file LXeMainVolume.hh.

◆ fNz

G4int LXeMainVolume::fNz = 0
private

Definition at line 73 of file LXeMainVolume.hh.

◆ fOuterRadius_pmt

G4double LXeMainVolume::fOuterRadius_pmt = 0.
private

Definition at line 74 of file LXeMainVolume.hh.

◆ fSphereOn

G4bool LXeMainVolume::fSphereOn = false
private

Definition at line 75 of file LXeMainVolume.hh.

◆ fRefl

G4double LXeMainVolume::fRefl = 0.
private

Definition at line 76 of file LXeMainVolume.hh.

◆ fScint_box

G4Box* LXeMainVolume::fScint_box = nullptr
private

Definition at line 80 of file LXeMainVolume.hh.

◆ fHousing_box

G4Box* LXeMainVolume::fHousing_box = nullptr
private

Definition at line 81 of file LXeMainVolume.hh.

◆ fPmt

G4Tubs* LXeMainVolume::fPmt = nullptr
private

Definition at line 82 of file LXeMainVolume.hh.

◆ fPhotocath

G4Tubs* LXeMainVolume::fPhotocath = nullptr
private

Definition at line 83 of file LXeMainVolume.hh.

◆ fSphere

G4Sphere* LXeMainVolume::fSphere = nullptr
private

Definition at line 84 of file LXeMainVolume.hh.

◆ fScint_log

G4LogicalVolume* LXeMainVolume::fScint_log = nullptr
private

Definition at line 88 of file LXeMainVolume.hh.

◆ fHousing_log

G4LogicalVolume* LXeMainVolume::fHousing_log = nullptr
private

Definition at line 89 of file LXeMainVolume.hh.

◆ fPmt_log

G4LogicalVolume* LXeMainVolume::fPmt_log = nullptr
private

Definition at line 90 of file LXeMainVolume.hh.

◆ fPhotocath_log

G4LogicalVolume* LXeMainVolume::fPhotocath_log = nullptr
private

Definition at line 91 of file LXeMainVolume.hh.

◆ fSphere_log

G4LogicalVolume* LXeMainVolume::fSphere_log = nullptr
private

Definition at line 92 of file LXeMainVolume.hh.

◆ fPmtPositions

std::vector<G4ThreeVector> LXeMainVolume::fPmtPositions
private

Definition at line 95 of file LXeMainVolume.hh.


The documentation for this class was generated from the following files:

Applications | User Support | Publications | Collaboration