Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-03 08:20:25

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