124 #include "DMXDetectorMaterial.icc"
160 G4double worldWidth = 470.0*
cm + 2.*wallThick;
161 G4double worldLength = 690.0*
cm + 2.*wallThick;
162 G4double worldHeight = 280.0*
cm + 2.*wallThick;
165 (
"world_box", 0.5*worldWidth, 0.5*worldLength, 0.5*worldHeight );
179 G4double labWidth = worldWidth - 2.*wallThick;
180 G4double labLength = worldLength - 2.*wallThick;
181 G4double labHeight = worldHeight - 2.*wallThick;
184 (
"lab_box", 0.5*labWidth, 0.5*labLength, 0.5*labHeight );
197 #include "DMXDetectorRoom.icc"
209 G4double LN2PosZ = 0.5*jacketHeight + 0.5*LN2jacketHeight
210 + jacketflangeHeight + PosZ;
213 0.*
cm, LN2jacketRadius, 0.5*LN2jacketHeight, 0.*
deg, 360.*
deg);
227 G4double LN2vacuumRadius = LN2jacketRadius - LN2jacketMetalThick;
228 G4double LN2vacuumHeight = LN2jacketHeight - LN2jacketMetalThick;
231 0.*
cm, LN2vacuumRadius, 0.5*LN2vacuumHeight, 0.*
deg, 360.*
deg);
233 (LN2vacuum_tube,
vacuum_mat,
"LN2vacuum_log");
242 G4double LN2Height = 590.0*
mm - 2.*LN2jacketMetalThick;
243 G4double LN2vesselRadius = LN2Radius + LN2jacketMetalThick;
244 G4double LN2vesselHeight = LN2Height;
245 G4double LN2vesselPosZ = 0.5*LN2vacuumHeight - 0.5*LN2vesselHeight;
248 0.*
cm, LN2vesselRadius, 0.5*LN2vesselHeight, 0.*
deg, 360.*
deg);
263 0.*
cm, LN2Radius, 0.5*LN2Height, 0.*
deg, 360.*
deg);
277 G4double jacketMetalThick = LN2jacketMetalThick;
280 0.*
cm, jacketRadius, 0.5*jacketHeight, 0.*
deg, 360.*
deg);
294 G4double topjacketflangePosZ = 0.5*(jacketHeight+jacketflangeHeight);
296 G4Tubs* jacketflange_tube =
new G4Tubs(
"jacketflange_tube",
297 0.*
cm, jacketflangeRadius, 0.5*jacketflangeHeight, 0.*
deg, 360.*
deg);
312 G4double vacuumRadius = jacketRadius - jacketMetalThick;
313 G4double vacuumHeight = jacketHeight - jacketMetalThick;
316 0.*
cm, vacuumRadius, 0.5*vacuumHeight, 0.*
deg, 360.*
deg);
328 G4double copperRadius = 103.5*
mm + copperMetalThick;
330 G4double copperInner = copperRadius - copperMetalThick;
332 G4double copperVPos = 0.5*(vesselHeight-copperHeight) + 13.0*
cm;
334 G4double coppertopVPos = copperVPos + 0.5*(coppertopThick+copperHeight);
337 copperInner, copperRadius, 0.5*copperHeight, 0.*
deg, 360.*
deg);
343 0.*
cm, copperRadius, 0.5*coppertopThick, 0.*
deg, 360.*
deg);
345 (coppertop_tube,
copper_mat,
"coppertop_log");
357 G4double vesselMetalThick = jacketMetalThick;
358 G4double vesselRadius = 75.0*
mm + vesselMetalThick;
361 G4double PMTvesselRadius = 31.0*
mm + vesselMetalThick;
366 G4double TotalvesselHeight = PMTvesselHeight + vesselHeight;
369 0.*
cm, vesselRadius, 0.5*vesselHeight, 0.*
deg, 360.*
deg);
371 0.*
cm, PMTvesselRadius, 0.5*PMTvesselHeight, 0.*
deg, 360.*
deg);
374 (
"vessel_sol", vessel_tube, PMTvessel_tube,
384 G4Tubs* vesseltop_flange1 =
new G4Tubs(
"vesseltop_flange1",
385 0.*
cm, vesselflangeRadius, 0.25*vesselflangeThick, 0.*
deg, 360.*
deg);
387 (vesseltop_flange1,
vessel_mat,
"vesseltop_log1");
390 G4ThreeVector(0.,0.,0.5*(vesselHeight+0.5*vesselflangeThick)+vesselVPos),
393 G4Tubs* vesseltop_flange2 =
new G4Tubs(
"vesseltop_flange2",vesselRadius,
394 vesselflangeRadius, 0.25*vesselflangeThick, 0.*
deg, 360.*
deg);
396 (vesseltop_flange2,
vessel_mat,
"vesseltop_log2");
399 G4ThreeVector(0.,0.,0.5*(vesselHeight-0.5*vesselflangeThick)+vesselVPos),
404 (
"vesselbottom_flange1",vesselRadius, vesselflangeRadius,
405 0.25*vesselflangeThick, 0.*
deg, 360.*
deg);
407 (vesselbottom_flange1,
vessel_mat,
"vesselbottom_log1");
409 G4ThreeVector(0.,0.,-0.5*(vesselHeight-0.5*vesselflangeThick)+vesselVPos),
413 (
"vesselbottom_flange2",PMTvesselRadius, vesselflangeRadius,
414 0.25*vesselflangeThick, 0.*
deg, 360.*
deg);
416 (vesselbottom_flange2,
vessel_mat,
"vesselbottom_log2");
418 G4ThreeVector(0.,0.,-0.5*(vesselHeight+0.5*vesselflangeThick)+vesselVPos),
423 (
"pmtvesselbottom_flange1", PMTvesselRadius, pmtvesselflangeRadius,
424 0.25*pmtvesselflangeThick, 0.*
deg, 360.*
deg);
426 (pmtvesselbottom_flange1,
vessel_mat,
"pmtvesselbottom_log1");
428 (-0.5*vesselHeight-PMTvesselHeight+vesselVPos+0.25*pmtvesselflangeThick)),
432 (
"pmtvesselbottom_flange2", 0.*
cm, pmtvesselflangeRadius,
433 0.25*pmtvesselflangeThick, 0.*
deg, 360.*
deg);
435 (pmtvesselbottom_flange2,
vessel_mat,
"pmtvesselbottom_log2");
437 -0.5*vesselHeight-PMTvesselHeight+vesselVPos-0.25*pmtvesselflangeThick),
470 G4double DetectorRadius = vesselRadius - vesselMetalThick;
471 G4double GXeHeight = TotalvesselHeight - mirrorVPos + gasGap;
472 G4double GXeVPos = 0.5*vesselHeight - 0.5*GXeHeight;
475 0.*
cm, DetectorRadius, 0.5*GXeHeight, 0.*
deg, 360.*
deg);
488 G4double LXeHeight = mirrorVPos - gasGap;
489 G4double PMTDetectorRadius = PMTvesselRadius - vesselMetalThick;
490 G4double PMTDetectorHeight = PMTvesselHeight;
491 G4double LXeTubeHeight = LXeHeight - PMTDetectorHeight;
492 G4double LXe_solVPos = -0.5*(LXeTubeHeight+PMTDetectorHeight);
493 G4double LXeVPos = -0.5*TotalvesselHeight + 0.5*LXeHeight;
496 0.*
cm, DetectorRadius, 0.5*LXeTubeHeight, 0.*
deg, 360.*
deg);
497 G4Tubs* PMTdetector_tube =
new G4Tubs(
"PMTdetector_tube",
498 0.*
cm, PMTDetectorRadius, 0.5*PMTDetectorHeight, 0.*
deg, 360.*
deg);
501 (
"LXe_sol", LXe_tube, PMTdetector_tube,
518 G4double laggingRadius = DetectorRadius - laggingThickness;
520 G4Tubs* gaslag_tube =
new G4Tubs(
"gaslag_tube", laggingRadius,
521 DetectorRadius, 0.5*GXeHeight, 0.*
deg, 360.*
deg);
535 G4double lagTubeRadius = DetectorRadius - laggingThickness;
536 G4double lagTubeHeight = LXeHeight - PMTDetectorHeight;
537 G4double lagPMTRadius = PMTDetectorRadius - laggingThickness;
538 G4double lagPMTHeight = PMTDetectorHeight;
540 G4Tubs* liqLag_tube =
new G4Tubs(
"liqlag_tube", lagTubeRadius,
541 DetectorRadius, 0.5*lagTubeHeight, 0.*
deg, 360.*
deg);
542 G4Tubs* lagPMT_tube =
new G4Tubs(
"lagPMT_tube", lagPMTRadius,
543 PMTDetectorRadius, 0.5*lagPMTHeight, 0.*
deg, 360.*
deg);
546 (
"liqLag_sol", liqLag_tube, lagPMT_tube,
574 G4double vessel_REFL[NUM] = { 0.2, 0.2 };
576 vessel_mt->
AddProperty(
"REFLECTIVITY", vessel_PP, vessel_REFL, NUM);
602 G4double CuShieldInnerRadius = CuShieldOuterRadius-CuShieldThickness;
603 G4double CuShieldVPosition = -0.5*LXeTubeHeight - PMTDetectorHeight
604 + 0.5*CuShieldHeight;
609 G4Tubs* CuShield_tube =
new G4Tubs(
"CuShield_tube", CuShieldInnerRadius,
610 CuShieldOuterRadius, 0.5*CuShieldHeight, 0.*
deg, 360.*
deg);
632 G4double CuShield_REFL[NUM] = { 0.3, 0.2 };
634 CuShield_mt->
AddProperty(
"REFLECTIVITY", CuShield_PP, CuShield_REFL, NUM);
642 G4double ringInnerRadius = CuShieldOuterRadius;
643 G4double ringVOffset = 0.5*ringHeight;
644 G4double ringVPosition = -0.5*GXeHeight + gasGap +ringVOffset;
646 G4Tubs* ring_tube=
new G4Tubs(
"ring_tube", ringInnerRadius,
647 ringOuterRadius, 0.5*ringHeight, 0.*
deg, 360.*
deg);
652 G4double ring_REFL[NUM] = { 0.7, 0.65 };
654 ring_mt->
AddProperty(
"REFLECTIVITY", ring_PP, ring_REFL, NUM);
677 ringVPosition = 0.5*LXeTubeHeight;
730 G4double mirrorRadius = ringInnerRadius;
731 G4double mirrorVOffset = 0.5*ringHeight;
732 G4double mirrorVPosition = -0.5*GXeHeight + gasGap +mirrorVOffset;
734 G4Tubs* mirror_tube =
new G4Tubs(
"mirror_tube", 0.*
cm, mirrorRadius,
735 0.5*mirrorHeight, 0.*
deg, 360.*
deg);
755 G4double mirror_REFL[NUM] = { 0.83, 0.78 };
757 mirror_mt->
AddProperty(
"REFLECTIVITY", mirror_PP, mirror_REFL, NUM);
764 G4double gridRadius = ringInnerRadius;
765 G4double grid1VOffset = 3.5*ringHeight+1.75*
mm;
766 G4double grid1VPosition = 0.5*LXeTubeHeight - grid1VOffset;
767 G4double grid2VOffset = 4.5*ringHeight+3.50*
mm;
768 G4double grid2VPosition = 0.5*LXeTubeHeight - grid2VOffset;
771 0.5*gridHeight, 0.*
deg, 360.*
deg);
792 G4double recessVPosition = 0.5*(alphaHeight - recessHeight);
794 G4double alphaVOffset = grid1VOffset-0.5*alphaHeight - gridHeight;
796 G4double extra_offset = (recessHeight +0.3*
mm + 0.5*americiumHeight);
797 G4double alphaVPosition = 0.5*LXeTubeHeight - alphaVOffset + extra_offset;
800 0.5*alphaHeight, 0.*
deg, 360.*
deg);
801 G4Tubs* recess_tube =
new G4Tubs(
"recess_tube", 0.*
cm, recessRadius,
802 0.5*recessHeight, 0.*
deg, 360.*
deg);
824 G4double alpha_REFL[NUM] = { 0.05, 0.05 };
826 alpha_mt->
AddProperty(
"REFLECTIVITY", alpha_PP, alpha_REFL, NUM);
834 G4double americiumVOffset = 0.5*(alphaHeight-americiumHeight)-recessHeight;
835 G4double americiumVPosition = americiumVOffset;
837 sourceZ = vesselVPos + LXeVPos + alphaVPosition + americiumVPosition + PosZ;
838 G4cout <<
G4endl <<
"Calibration source centre (X,Y,Z): 0, 0, "
842 americiumRadius, 0.5*americiumHeight, 0.*
deg, 360.*
deg);
856 G4double americium_REFL[NUM] = { 0.7, 0.65 };
858 americium_mt->
AddProperty(
"REFLECTIVITY", americium_PP, americium_REFL, NUM);
872 G4double pmtVPosition = -0.5*(LXeTubeHeight+pmtHeight)+pmtVOffset;
876 G4Tubs* pmt_tube =
new G4Tubs(
"pmt_tube", 0.*
cm, pmtRadius, 0.5*pmtHeight,
881 -2.*pmtRadius*std::cos(30.0*
deg))));
901 G4double phcathVOffset = 0.5*pmtHeight-2.*pmtRadius*std::cos(30.0*
deg);
902 G4double phcathVPosition = phcathVOffset;
905 2.*pmtRadius-1.6*
mm, 2.*pmtRadius-1.59*
mm, 0.*
deg, 360.*
deg, 0.*
deg,
926 G4double photocath_EFF[NUM]={1.,1.};
927 G4double photocath_ReR[NUM]={1.92,1.92};
928 G4double photocath_ImR[NUM]={1.69,1.69};
930 photocath_mt->
AddProperty(
"EFFICIENCY",phcath_PP,photocath_EFF,NUM);
931 photocath_mt->
AddProperty(
"REALRINDEX",phcath_PP,photocath_ReR,NUM);
932 photocath_mt->
AddProperty(
"IMAGINARYRINDEX",phcath_PP,photocath_ImR,NUM);
950 G4cout << G4endl <<
"User Limits: " << G4endl
970 #include "DMXDetectorRoomLimits.icc"
G4VPhysicalVolume * grid2_phys
G4VPhysicalVolume * copper_phys
static constexpr double micrometer
G4LogicalVolume * LN2jacket_log
G4VPhysicalVolume * ring_phys_liq[6]
CLHEP::Hep3Vector G4ThreeVector
G4VPhysicalVolume * pmtvesselbottom_phys2
G4VPhysicalVolume * grid1_phys
G4LogicalVolume * LN2vessel_log
void SetRoomEnergyCut(G4double)
G4Material * LN2jacket_mat
void SetSensitiveDetector(const G4String &logVolName, G4VSensitiveDetector *aSD, G4bool multi=false)
G4VPhysicalVolume * topjacketflange_phys
G4LogicalVolume * mirror_log
G4VPhysicalVolume * vessel_phys
static constexpr double mm
G4LogicalVolume * pmtvesselbottom_log2
void AddNewDetector(G4VSensitiveDetector *aSD)
G4double theDetectorStepSize
CLHEP::HepRotation G4RotationMatrix
G4VPhysicalVolume * phcath_phys
G4VPhysicalVolume * LN2vacuum_phys
G4VPhysicalVolume * jacket_phys
G4LogicalVolume * alpha_log
G4Material * jacketflange_mat
G4Material * americium_mat
G4VPhysicalVolume * LXe_phys
G4VPhysicalVolume * GXe_phys
void SetMaterialPropertiesTable(G4MaterialPropertiesTable *anMPT)
G4LogicalVolume * grid1_log
G4LogicalVolume * jacketflange_log
G4VPhysicalVolume * pmtvesselbottom_phys1
G4LogicalVolume * pmtvesselbottom_log1
G4LogicalVolume * LN2vacuum_log
G4LogicalVolume * americium_log
static const G4VisAttributes & GetInvisible()
DMXDetectorConstruction()
G4VPhysicalVolume * world_phys
virtual void SetUserMaxTime(G4double utimeMax)
G4LogicalVolume * CuShield_log
G4VPhysicalVolume * alpha_phys
G4LogicalVolume * coppertop_log
static constexpr double deg
G4MaterialPropertyVector * AddProperty(const char *key, G4double *PhotonEnergies, G4double *PropertyValues, G4int NumEntries)
G4VPhysicalVolume * mirror_phys
G4UserLimits * theUserLimitsForDetector
G4LogicalVolume * world_log
G4LogicalVolume * LN2_log
G4LogicalVolume * LXe_log
void ConstructSDandField()
G4Material * CuShield_mat
G4LogicalVolume * vesseltop_log1
DMXDetectorMessenger * detectorMessenger
G4LogicalVolume * gaslag_log
static constexpr double eV
G4VPhysicalVolume * LN2jacket_phys
G4LogicalVolume * copper_log
G4LogicalVolume * grid2_log
G4LogicalVolume * liqLag_log
void SetVisAttributes(const G4VisAttributes *pVA)
G4VPhysicalVolume * liqLag_phys
G4LogicalVolume * phcath_log
static constexpr double nanosecond
G4VPhysicalVolume * CuShield_phys
void Put(const value_type &val) const
G4VPhysicalVolume * bottomjacketflange_phys
void SetUserLimits(G4UserLimits *pULimits)
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
void SetForceSolid(G4bool=true)
G4LogicalVolume * vacuum_log
void SetVisibility(G4bool=true)
static G4SDManager * GetSDMpointer()
G4Cache< DMXPmtSD * > pmtSD
G4VPhysicalVolume * LN2vessel_phys
G4LogicalVolume * vesselbottom_log2
G4VPhysicalVolume * americium_phys
G4LogicalVolume * jacket_log
G4LogicalVolume * lab_log
G4UserLimits * theUserLimitsForRoom
G4VPhysicalVolume * vesseltop_phys1
G4VPhysicalVolume * LN2_phys
G4GLOB_DLL std::ostream G4cout
static constexpr double cm
G4VPhysicalVolume * vesseltop_phys2
virtual void SetUserMinEkine(G4double uekinMin)
void SetEnergyCut(G4double)
G4LogicalVolume * vesselbottom_log1
G4VPhysicalVolume * vesselbottom_phys1
G4VPhysicalVolume * vacuum_phys
G4VPhysicalVolume * vesselbottom_phys2
void SetRoomTimeCut(G4double)
G4VPhysicalVolume * pmt_phys
G4Cache< DMXScintSD * > LXeSD
G4VPhysicalVolume * ring_phys_gas[2]
G4VPhysicalVolume * coppertop_phys
~DMXDetectorConstruction()
G4LogicalVolume * vesseltop_log2
G4VPhysicalVolume * Construct()
G4LogicalVolume * GXe_log
G4VPhysicalVolume * lab_phys
G4LogicalVolume * pmt_log
void SetTimeCut(G4double)
G4LogicalVolume * vessel_log
G4LogicalVolume * ring_log
static constexpr double nanometer
G4VPhysicalVolume * gaslag_phys