93 theUserLimitsForRoom = 0;
94 theUserLimitsForDetector = 0;
101 theMinEkine = 250.0*
eV;
102 theRoomMinEkine = 250.0*
eV;
113 delete theUserLimitsForRoom;
114 delete theUserLimitsForDetector;
115 delete detectorMessenger;
121 void DMXDetectorConstruction::DefineMaterials()
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 );
168 "world_phys", world_log, NULL,
false,0);
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 );
187 lab_log, world_phys,
false,0);
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);
215 (LN2jacket_tube, LN2jacket_mat,
"LN2jacket_log");
217 "LN2jacket_phys", LN2jacket_log, lab_phys,
false,0);
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");
235 "LN2vacuum_phys", LN2vacuum_log, LN2jacket_phys,
false,0);
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);
250 (LN2vessel_tube, LN2jacket_mat,
"LN2vessel_log");
252 "LN2vessel_phys", LN2vessel_log, LN2vacuum_phys,
false,0);
263 0.*
cm, LN2Radius, 0.5*LN2Height, 0.*
deg, 360.*
deg);
266 "LN2_phys", LN2_log, LN2vessel_phys,
false,0);
277 G4double jacketMetalThick = LN2jacketMetalThick;
280 0.*
cm, jacketRadius, 0.5*jacketHeight, 0.*
deg, 360.*
deg);
281 jacket_log =
new G4LogicalVolume(jacket_tube, jacket_mat,
"jacket_log");
283 "jacket_phys", jacket_log, lab_phys,
false,0);
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);
299 (jacketflange_tube, jacketflange_mat,
"jacketflange_log");
302 "topjacketflange_phys", jacketflange_log, lab_phys,
false,0);
305 "bottomjacketflange_phys", jacketflange_log, lab_phys,
false,0);
312 G4double vacuumRadius = jacketRadius - jacketMetalThick;
313 G4double vacuumHeight = jacketHeight - jacketMetalThick;
316 0.*
cm, vacuumRadius, 0.5*vacuumHeight, 0.*
deg, 360.*
deg);
317 vacuum_log =
new G4LogicalVolume(vacuum_tube, vacuum_mat,
"vacuum_log");
319 "vacuum_phys", vacuum_log, jacket_phys,
false,0);
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);
338 copper_log =
new G4LogicalVolume(copper_tube, copper_mat,
"copper_log");
340 "copper_phys", copper_log, vacuum_phys,
false,0);
343 0.*
cm, copperRadius, 0.5*coppertopThick, 0.*
deg, 360.*
deg);
345 (coppertop_tube, copper_mat,
"coppertop_log");
347 "coppertop_phys", coppertop_log, vacuum_phys,
false,0);
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,
378 vessel_log =
new G4LogicalVolume(vessel_sol, vessel_mat,
"vessel_log");
380 "vessel_phys", vessel_log, vacuum_phys,
false,0);
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),
391 "vesseltop_phys1", vesseltop_log1, vacuum_phys,
false,0);
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),
400 "vesseltop_phys2", vesseltop_log2, vacuum_phys,
false,0);
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),
410 "vesselbottom_phys1", vesselbottom_log1, vacuum_phys,
false,0);
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),
419 "vesselbottom_phys2", vesselbottom_log2, vacuum_phys,
false,0);
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)),
429 "pmtvesselbottom_phys1", pmtvesselbottom_log1, vacuum_phys,
false,0);
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),
438 "pmtvesselbottom_phys2", pmtvesselbottom_log2, vacuum_phys,
false,0);
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);
478 "GXe_phys", GXe_log, vessel_phys,
false,0);
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,
506 "LXe_phys", LXe_log, vessel_phys,
false, 0);
518 G4double laggingRadius = DetectorRadius - laggingThickness;
520 G4Tubs* gaslag_tube =
new G4Tubs(
"gaslag_tube", laggingRadius,
521 DetectorRadius, 0.5*GXeHeight, 0.*
deg, 360.*
deg);
522 gaslag_log =
new G4LogicalVolume(gaslag_tube, vessel_mat,
"gaslag_log");
524 "gaslag_phys", gaslag_log, GXe_phys,
false, 0);
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,
549 liqLag_log =
new G4LogicalVolume(liqLag_sol, vessel_mat,
"liqLag_log");
551 "liqLag_phys", liqLag_log, LXe_phys,
false, 0);
574 G4double vessel_REFL[NUM] = { 0.2, 0.2 };
576 vessel_mt->
AddProperty(
"REFLECTIVITY", vessel_PP, vessel_REFL, NUM);
581 (
"VesselTop", GXe_phys, vesseltop_phys1, OpVesselSurface);
585 (
"VesselBottom", LXe_phys, vesselbottom_phys2, OpVesselSurface);
589 (
"GasVessel", GXe_phys, gaslag_phys, OpVesselSurface);
593 (
"LiquidVessel", LXe_phys, liqLag_phys, OpVesselSurface);
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);
615 "CuShield_phys", CuShield_log, LXe_phys,
false, 0);
629 (
"Shield", LXe_phys, CuShield_phys, OpCuShieldSurface);
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);
663 (0.*
cm, 0.*
cm, ringVPosition),
"ring_phys0",ring_log,GXe_phys,
false, 0);
666 (
"Ring", GXe_phys, ring_phys_gas[0], OpRingSurface);
670 "ring_phys1",ring_log, GXe_phys,
false, 0);
673 (
"Ring", GXe_phys, ring_phys_gas[1], OpRingSurface);
677 ringVPosition = 0.5*LXeTubeHeight;
681 "ring_phys2",ring_log,LXe_phys,
false, 0);
684 (
"Ring", LXe_phys, ring_phys_liq[0], OpRingSurface);
688 "ring_phys3",ring_log, LXe_phys,
false, 0);
691 (
"Ring", LXe_phys, ring_phys_liq[1], OpRingSurface);
695 "ring_phys4",ring_log, LXe_phys,
false, 0);
698 (
"Ring", LXe_phys, ring_phys_liq[2], OpRingSurface);
702 "ring_phys5",ring_log, LXe_phys,
false, 0);
705 (
"Ring", LXe_phys, ring_phys_liq[3], OpRingSurface);
709 "ring_phys6",ring_log, LXe_phys,
false, 0);
712 (
"Ring", LXe_phys, ring_phys_liq[4], OpRingSurface);
716 "ring_phys7",ring_log, LXe_phys,
false, 0);
719 (
"Ring", LXe_phys, ring_phys_liq[5], OpRingSurface);
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);
736 mirror_log =
new G4LogicalVolume(mirror_tube, mirror_mat,
"mirror_log");
739 "mirror_phys", mirror_log, GXe_phys,
false, 0);
752 (
"Mirror", GXe_phys, mirror_phys, OpMirrorSurface);
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);
775 "grid1_phys", grid1_log, LXe_phys,
false, 0);
778 "grid2_phys", grid2_log, LXe_phys,
false, 0);
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);
810 "alpha_phys", alpha_log, LXe_phys,
false, 0);
821 (
"Alpha", LXe_phys, alpha_phys, OpAlphaSurface);
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);
846 americiumVPosition),
"americium_phys", americium_log, alpha_phys,
false,0);
853 (
"Americium", LXe_phys, americium_phys, OpAmericiumSurface);
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))));
885 "pmt_phys", pmt_log, LXe_phys,
false, 0);
891 (
"pmt_surf", LXe_phys, pmt_phys, pmt_opsurf);
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,
908 phcath_log =
new G4LogicalVolume(phcath_sol, phcath_mat,
"phcath_log");
910 "phcath_phys", phcath_log, pmt_phys,
false, 0);
916 (
"phcath_surf", pmt_phys, phcath_phys, phcath_opsurf);
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
951 <<
"\t theMaxTimeCuts: " <<
G4BestUnit(theMaxTimeCuts,
"Time")
953 <<
"\t theRoomTimeCut: " <<
G4BestUnit(theRoomTimeCut,
"Time")
955 <<
"\t theMaxStepSize: " <<
G4BestUnit(theMaxStepSize,
"Length")
957 <<
"\t theMinEKine: " <<
G4BestUnit(theMinEkine,
"Energy")
959 <<
"\t minRoomMinEKine: " <<
G4BestUnit(theRoomMinEkine,
"Energy")
962 if (theUserLimitsForRoom != 0)
delete theUserLimitsForRoom;
963 if (theUserLimitsForDetector != 0)
delete theUserLimitsForDetector;
970 #include "DMXDetectorRoomLimits.icc"
972 theUserLimitsForDetector =
new G4UserLimits(theDetectorStepSize,
1007 if (LXeSD.
Get() == 0)
1017 if (pmtSD.
Get() == 0)
1037 theRoomMinEkine = val;
1038 if (theUserLimitsForRoom != 0)
1053 if (theUserLimitsForDetector != 0)
1067 theRoomTimeCut = val;
1068 if (theUserLimitsForRoom != 0)
1082 theMaxTimeCuts = val;
1083 if (theUserLimitsForDetector != 0)
static constexpr double mm
CLHEP::Hep3Vector G4ThreeVector
CLHEP::HepRotation G4RotationMatrix
void SetUserLimits(G4UserLimits *pULimits)
virtual void SetUserMinEkine(G4double uekinMin)
static constexpr double nanometer
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
void SetTimeCut(G4double)
static constexpr double nanosecond
G4MaterialPropertyVector * AddProperty(const char *key, G4double *PhotonEnergies, G4double *PropertyValues, G4int NumEntries)
void SetForceSolid(G4bool=true)
void ConstructSDandField()
G4VPhysicalVolume * Construct()
G4GLOB_DLL std::ostream G4cout
void SetVisibility(G4bool=true)
static constexpr double cm
DMXDetectorConstruction()
static constexpr double eV
void SetRoomTimeCut(G4double)
~DMXDetectorConstruction()
void SetEnergyCut(G4double)
void SetSensitiveDetector(const G4String &logVolName, G4VSensitiveDetector *aSD, G4bool multi=false)
void AddNewDetector(G4VSensitiveDetector *aSD)
static G4SDManager * GetSDMpointer()
void SetRoomEnergyCut(G4double)
static constexpr double deg
void SetMaterialPropertiesTable(G4MaterialPropertiesTable *anMPT)
void Put(const value_type &val) const
static constexpr double micrometer
static const G4VisAttributes & GetInvisible()
virtual void SetUserMaxTime(G4double utimeMax)
void SetVisAttributes(const G4VisAttributes *pVA)