Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 09:24:03

0001 #ifndef MACRO_G4PLUGDOOR_C
0002 #define MACRO_G4PLUGDOOR_C
0003 
0004 #include <GlobalVariables.C>
0005 
0006 #include <g4detectors/PHG4CylinderSubsystem.h>
0007 
0008 #include <g4main/PHG4Reco.h>
0009 
0010 #include <TSystem.h>
0011 
0012 R__LOAD_LIBRARY(libg4detectors.so)
0013 
0014 void common_color(PHG4CylinderSubsystem *subsys);
0015 
0016 namespace Enable
0017 {
0018   bool PLUGDOOR = false;
0019   bool PLUGDOOR_ABSORBER = false;
0020   bool PLUGDOOR_OVERLAPCHECK = false;
0021   bool PLUGDOOR_BLACKHOLE = false;
0022 
0023   bool BEAMPIPE_ABSORBER = false;
0024   bool BEAMPIPE_ABSORBER_ACTIVE = false;
0025   bool BEAMPIPE_ABSORBER_OVERLAPCHECK = false;
0026   bool BEAMPIPE_ABSORBER_BLACKHOLE = false;
0027 }  // namespace Enable
0028 
0029 namespace G4PLUGDOOR
0030 {
0031   // sPHENIX forward flux return(s)
0032   // define via four corners in the engineering drawing
0033   double z_1 = 330.81;
0034   double z_2 = 360.81;
0035   double r_1 = (12. / 2.) * 2.54;  // 12 inches diameter
0036   double r_2 = 263.5;
0037 
0038   double length = z_2 - z_1;
0039   double place_z = (z_1 + z_2) / 2.;
0040   double thickness = 2.;  // 2 cm thick
0041 }  // namespace G4PLUGDOOR
0042 
0043 namespace G4ABSORBER
0044 {
0045   // sPHENIX forward flux return(s)
0046   // define via four corners in the engineering drawing
0047   double l_1 = 7.62;
0048   double l_2 = 20.64;
0049   double l_3 = 10.16;
0050   double l_4 = 25.40;
0051   double z_1 = 330.84 - l_1;
0052   double z_2 = z_1 + l_1;
0053   double z_3 = z_2 + l_2;
0054   double z_4 = z_3 + l_3;
0055   double r_in = 6.34;
0056   double r_out_1 = 55.8 / 2.;
0057   double r_out_2 = 27.93 / 2.;
0058   double r_out_3 = r_out_1;
0059   double r_out_4 = 35.55 / 2.;
0060 }  // namespace G4ABSORBER
0061 
0062 void PlugDoorInit()
0063 {
0064   BlackHoleGeometry::max_radius = std::max(BlackHoleGeometry::max_radius, G4PLUGDOOR::r_2);
0065   BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, G4PLUGDOOR::place_z + G4PLUGDOOR::length / 2.);
0066   BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -(G4PLUGDOOR::place_z + G4PLUGDOOR::length / 2.));
0067   if (Enable::PLUGDOOR_BLACKHOLE)
0068   {
0069     if (G4PLUGDOOR::thickness >= G4PLUGDOOR::z_2 - G4PLUGDOOR::z_1)
0070     {
0071       std::cout << "G4_PlugDoor::PlugDoorInit(): thickness " << G4PLUGDOOR::thickness
0072                 << " exceeds door thickness " << G4PLUGDOOR::z_2 - G4PLUGDOOR::z_1
0073                 << std::endl;
0074       gSystem->Exit(1);
0075     }
0076   }
0077 }
0078 void PlugDoor(PHG4Reco *g4Reco)
0079 {
0080   bool OverlapCheck = Enable::OVERLAPCHECK || Enable::PLUGDOOR_OVERLAPCHECK;
0081   bool flux_door_active = Enable::ABSORBER || Enable::PLUGDOOR_ABSORBER;
0082 
0083   const std::string material("Steel_1006");
0084 
0085   const std::string absorber_material("G4_STAINLESS-STEEL");
0086 
0087   if (Enable::PLUGDOOR_BLACKHOLE)
0088   {
0089     double place_z_plate = G4PLUGDOOR::z_1 + G4PLUGDOOR::thickness / 2.;
0090     double place_z_cyl = (G4PLUGDOOR::z_1 + G4PLUGDOOR::z_2 + G4PLUGDOOR::thickness) / 2.;
0091     PHG4CylinderSubsystem *flux_return_plus = new PHG4CylinderSubsystem("FLUXRET_ETA_PLUS", 0);
0092     flux_return_plus->set_double_param("length", G4PLUGDOOR::thickness);
0093     flux_return_plus->set_double_param("radius", G4PLUGDOOR::r_1);
0094     flux_return_plus->set_double_param("place_z", place_z_plate);
0095     flux_return_plus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1);
0096     flux_return_plus->set_string_param("material", material);
0097     flux_return_plus->SetActive(flux_door_active);
0098     flux_return_plus->SuperDetector("FLUXRET_ETA_PLUS");
0099     flux_return_plus->OverlapCheck(OverlapCheck);
0100     common_color(flux_return_plus);
0101     g4Reco->registerSubsystem(flux_return_plus);
0102 
0103     flux_return_plus = new PHG4CylinderSubsystem("FLUXRET_ETA_PLUS", 1);
0104     flux_return_plus->set_double_param("length", G4PLUGDOOR::length - G4PLUGDOOR::thickness);
0105     flux_return_plus->set_double_param("radius", G4PLUGDOOR::r_1);
0106     flux_return_plus->set_double_param("place_z", place_z_cyl);
0107     flux_return_plus->set_double_param("thickness", G4PLUGDOOR::thickness);
0108     flux_return_plus->set_string_param("material", material);
0109     flux_return_plus->SetActive(flux_door_active);
0110     flux_return_plus->SuperDetector("FLUXRET_ETA_PLUS");
0111     flux_return_plus->OverlapCheck(OverlapCheck);
0112     common_color(flux_return_plus);
0113     g4Reco->registerSubsystem(flux_return_plus);
0114 
0115     // Black hole behind door with thickness G4PLUGDOOR::thickness
0116     // same color as door - you will not distinguish it in the display
0117     flux_return_plus = new PHG4CylinderSubsystem("FLUXRET_ETA_PLUS", 2);
0118     flux_return_plus->set_double_param("length", G4PLUGDOOR::length - G4PLUGDOOR::thickness);
0119     flux_return_plus->set_double_param("radius", G4PLUGDOOR::r_1 + G4PLUGDOOR::thickness);
0120     flux_return_plus->set_double_param("place_z", place_z_cyl);
0121     flux_return_plus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1 - G4PLUGDOOR::thickness);
0122     flux_return_plus->set_string_param("material", material);
0123     flux_return_plus->SetActive(flux_door_active);
0124     flux_return_plus->SuperDetector("FLUXRET_ETA_PLUS");
0125     flux_return_plus->OverlapCheck(OverlapCheck);
0126     flux_return_plus->BlackHole();
0127     common_color(flux_return_plus);
0128     g4Reco->registerSubsystem(flux_return_plus);
0129 
0130     PHG4CylinderSubsystem *flux_return_minus = new PHG4CylinderSubsystem("FLUXRET_ETA_MINUS", 0);
0131     flux_return_minus->set_double_param("length", G4PLUGDOOR::thickness);
0132     flux_return_minus->set_double_param("radius", G4PLUGDOOR::r_1);
0133     flux_return_minus->set_double_param("place_z", -place_z_plate);
0134     flux_return_minus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1);
0135     flux_return_minus->set_string_param("material", material);
0136     flux_return_minus->SetActive(flux_door_active);
0137     flux_return_minus->SuperDetector("FLUXRET_ETA_MINUS");
0138     flux_return_minus->OverlapCheck(OverlapCheck);
0139     common_color(flux_return_minus);
0140     g4Reco->registerSubsystem(flux_return_minus);
0141 
0142     flux_return_minus = new PHG4CylinderSubsystem("FLUXRET_ETA_MINUS", 1);
0143     flux_return_minus->set_double_param("length", G4PLUGDOOR::length - G4PLUGDOOR::thickness);
0144     flux_return_minus->set_double_param("radius", G4PLUGDOOR::r_1);
0145     flux_return_minus->set_double_param("place_z", -place_z_cyl);
0146     flux_return_minus->set_double_param("thickness", G4PLUGDOOR::thickness);
0147     flux_return_minus->set_string_param("material", material);
0148     flux_return_minus->SetActive(flux_door_active);
0149     flux_return_minus->SuperDetector("FLUXRET_ETA_MINUS");
0150     flux_return_minus->OverlapCheck(OverlapCheck);
0151     common_color(flux_return_minus);
0152     g4Reco->registerSubsystem(flux_return_minus);
0153 
0154     // Black hole behind door with thickness G4PLUGDOOR::thickness
0155     // same color as door - you will not distinguish it in the display
0156     flux_return_minus = new PHG4CylinderSubsystem("FLUXRET_ETA_MINUS", 2);
0157     flux_return_minus->set_double_param("length", G4PLUGDOOR::length - G4PLUGDOOR::thickness);
0158     flux_return_minus->set_double_param("radius", G4PLUGDOOR::r_1 + G4PLUGDOOR::thickness);
0159     flux_return_minus->set_double_param("place_z", -place_z_cyl);
0160     flux_return_minus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1 - G4PLUGDOOR::thickness);
0161     flux_return_minus->set_string_param("material", material);
0162     flux_return_minus->SetActive(flux_door_active);
0163     flux_return_minus->SuperDetector("FLUXRET_ETA_MINUS");
0164     flux_return_minus->OverlapCheck(OverlapCheck);
0165     flux_return_minus->BlackHole();
0166     common_color(flux_return_minus);
0167     g4Reco->registerSubsystem(flux_return_minus);
0168   }
0169   else
0170   {
0171     PHG4CylinderSubsystem *flux_return_plus = new PHG4CylinderSubsystem("FLUXRET_ETA_PLUS", 3);
0172     flux_return_plus->set_double_param("length", G4PLUGDOOR::length);
0173     flux_return_plus->set_double_param("radius", G4PLUGDOOR::r_1);
0174     flux_return_plus->set_double_param("place_z", G4PLUGDOOR::place_z);
0175     flux_return_plus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1);
0176     flux_return_plus->set_string_param("material", material);
0177     flux_return_plus->SetActive(flux_door_active);
0178     flux_return_plus->SuperDetector("FLUXRET_ETA_PLUS");
0179     flux_return_plus->OverlapCheck(OverlapCheck);
0180     common_color(flux_return_plus);
0181     g4Reco->registerSubsystem(flux_return_plus);
0182 
0183     PHG4CylinderSubsystem *flux_return_minus = new PHG4CylinderSubsystem("FLUXRET_ETA_MINUS", 3);
0184     flux_return_minus->set_double_param("length", G4PLUGDOOR::length);
0185     flux_return_minus->set_double_param("radius", G4PLUGDOOR::r_1);
0186     flux_return_minus->set_double_param("place_z", -G4PLUGDOOR::place_z);
0187     flux_return_minus->set_double_param("thickness", G4PLUGDOOR::r_2 - G4PLUGDOOR::r_1);
0188     flux_return_minus->set_string_param("material", material);
0189     flux_return_minus->SetActive(flux_door_active);
0190     flux_return_minus->SuperDetector("FLUXRET_ETA_MINUS");
0191     flux_return_minus->OverlapCheck(OverlapCheck);
0192     common_color(flux_return_minus);
0193     g4Reco->registerSubsystem(flux_return_minus);
0194   }
0195 
0196   if (Enable::BEAMPIPE_ABSORBER)
0197   {
0198     double lengths[] = {G4ABSORBER::l_1, G4ABSORBER::l_2, G4ABSORBER::l_3, G4ABSORBER::l_4};
0199     double z_positions[] = {G4ABSORBER::z_1, G4ABSORBER::z_2, G4ABSORBER::z_3, G4ABSORBER::z_4};
0200     double r_out_values[] = {G4ABSORBER::r_out_1, G4ABSORBER::r_out_2, G4ABSORBER::r_out_3, G4ABSORBER::r_out_4};
0201     double radius_in = G4ABSORBER::r_in;
0202     for (int i = 0; i < 4; ++i)
0203     {
0204       PHG4CylinderSubsystem *absorber = new PHG4CylinderSubsystem("BEAMPIPE_ABSORBER_PLUS", i);
0205       absorber->set_double_param("length", lengths[i]);
0206       absorber->set_double_param("radius", radius_in);
0207       absorber->set_double_param("place_z", z_positions[i] + lengths[i] / 2.);
0208       absorber->set_double_param("thickness", r_out_values[i] - radius_in);
0209       absorber->set_string_param("material", absorber_material);
0210       absorber->SetActive(Enable::BEAMPIPE_ABSORBER_ACTIVE);
0211       absorber->SuperDetector("BEAMPIPE_ABSORBER_PLUS");
0212       absorber->OverlapCheck(Enable::ABSORBER || Enable::BEAMPIPE_ABSORBER_OVERLAPCHECK);
0213       absorber->BlackHole(Enable::BEAMPIPE_ABSORBER_BLACKHOLE);
0214       common_color(absorber);
0215       g4Reco->registerSubsystem(absorber);
0216 
0217       absorber = new PHG4CylinderSubsystem("BEAMPIPE_ABSORBER_MINUS", i);
0218       absorber->set_double_param("length", lengths[i]);
0219       absorber->set_double_param("radius", radius_in);
0220       absorber->set_double_param("place_z", -z_positions[i] - lengths[i] / 2.);
0221       absorber->set_double_param("thickness", r_out_values[i] - radius_in);
0222       absorber->set_string_param("material", absorber_material);
0223       absorber->SetActive(Enable::ABSORBER || Enable::BEAMPIPE_ABSORBER_ACTIVE);
0224       absorber->SuperDetector("BEAMPIPE_ABSORBER_MINUS");
0225       absorber->OverlapCheck(Enable::BEAMPIPE_ABSORBER_OVERLAPCHECK);
0226       absorber->BlackHole(Enable::BEAMPIPE_ABSORBER_BLACKHOLE);
0227       common_color(absorber);
0228       g4Reco->registerSubsystem(absorber);
0229     }
0230     BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, G4ABSORBER::z_4 + G4ABSORBER::l_4);
0231     BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -(G4ABSORBER::z_4 + G4ABSORBER::l_4));
0232   }
0233 
0234   return;
0235 }
0236 
0237 void common_color(PHG4CylinderSubsystem *subsys)
0238 {
0239   subsys->set_color(0.29, 0.44, 0.54);
0240 }
0241 #endif