File indexing completed on 2026-07-16 08:11:21
0001 #ifndef MACRO_G4TRKRSIM_C
0002 #define MACRO_G4TRKRSIM_C
0003
0004 #include <GlobalVariables.C>
0005
0006 #include <G4_ActsGeom.C>
0007 #include <G4_TrkrVariables.C>
0008
0009 #include <g4detectors/PHG4CylinderSubsystem.h>
0010
0011 #include <g4mvtx/PHG4MvtxDefs.h>
0012 #include <g4mvtx/PHG4MvtxDigitizer.h>
0013 #include <g4mvtx/PHG4MvtxHitReco.h>
0014 #include <g4mvtx/PHG4MvtxSubsystem.h>
0015
0016 #include <g4intt/PHG4InttDefs.h>
0017 #include <g4intt/PHG4InttDigitizer.h>
0018 #include <g4intt/PHG4InttHitReco.h>
0019 #include <g4intt/PHG4InttSubsystem.h>
0020
0021 #include <g4tpc/PHG4TpcCentralMembrane.h>
0022 #include <g4tpc/PHG4TpcDigitizer.h>
0023 #include <g4tpc/PHG4TpcDirectLaser.h>
0024 #include <g4tpc/PHG4TpcDistortion.h>
0025 #include <g4tpc/PHG4TpcElectronDrift.h>
0026 #include <g4tpc/PHG4TpcEndCapSubsystem.h>
0027 #include <g4tpc/PHG4TpcPadPlane.h>
0028 #include <g4tpc/PHG4TpcPadPlaneReadout.h>
0029 #include <g4tpc/PHG4TpcSubsystem.h>
0030
0031 #pragma GCC diagnostic push
0032 #pragma GCC diagnostic ignored "-Wundefined-internal"
0033 #include <tpc/TpcClusterZCrossingCorrection.h>
0034 #pragma GCC diagnostic pop
0035
0036 #include <g4micromegas/PHG4MicromegasDigitizer.h>
0037 #include <g4micromegas/PHG4MicromegasHitReco.h>
0038 #include <g4micromegas/PHG4MicromegasSubsystem.h>
0039
0040 #include <g4main/PHG4Reco.h>
0041
0042 #include <ffamodules/CDBInterface.h>
0043
0044 #include <cdbobjects/CDBTTree.h>
0045
0046 #include <TFile.h>
0047
0048 #include <cmath>
0049 #include <vector>
0050
0051 R__LOAD_LIBRARY(libg4tpc.so)
0052 R__LOAD_LIBRARY(libg4mvtx.so)
0053 R__LOAD_LIBRARY(libg4intt.so)
0054 R__LOAD_LIBRARY(libg4micromegas.so)
0055
0056 void MvtxInit()
0057 {
0058 BlackHoleGeometry::max_radius = std::max(BlackHoleGeometry::max_radius, 12.);
0059 BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -165.);
0060 BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, 24.);
0061 }
0062
0063 double Mvtx(PHG4Reco* g4Reco, double radius,
0064 const int = 0)
0065 {
0066 bool maps_overlapcheck = Enable::OVERLAPCHECK || Enable::MVTX_OVERLAPCHECK;
0067 int verbosity = std::max(Enable::VERBOSITY, Enable::MVTX_VERBOSITY);
0068 bool SupportActive = Enable::SUPPORT || Enable::MVTX_SUPPORT;
0069
0070 PHG4MvtxSubsystem* mvtx = new PHG4MvtxSubsystem("MVTX");
0071 mvtx->Verbosity(verbosity);
0072
0073 for (int ilayer = 0; ilayer < G4MVTX::n_maps_layer; ilayer++)
0074 {
0075 double radius_lyr = PHG4MvtxDefs::mvtxdat[ilayer][PHG4MvtxDefs::kRmd];
0076
0077 if (verbosity)
0078 {
0079 std::cout << "Create Maps layer " << ilayer << " with radius " << radius_lyr << " mm." << std::endl;
0080 }
0081 radius = radius_lyr / 10.;
0082 }
0083
0084 mvtx->set_string_param(PHG4MvtxDefs::GLOBAL, "stave_geometry_file", std::string(getenv("CALIBRATIONROOT")) + std::string("/Tracking/geometry/mvtx_stave.gdml"));
0085
0086 mvtx->SetActive();
0087 if (SupportActive)
0088 {
0089 mvtx->SetSupportActive();
0090 }
0091 std::cout << "PHG4MvtxSubsystem: Apply misalignment? Enable::MVTX_APPLYMISALIGNMENT=" << Enable::MVTX_APPLYMISALIGNMENT << std::endl;
0092 mvtx->Apply_Misalignment(Enable::MVTX_APPLYMISALIGNMENT);
0093 if (Enable::MVTX_APPLYMISALIGNMENT)
0094 {
0095 std::string file = CDBInterface::instance()->getUrl("MVTX_ALIGNMENT");
0096 std::cout << "applying with file " << file << std::endl;
0097 mvtx->MisalignmentFile(file);
0098 }
0099 mvtx->OverlapCheck(maps_overlapcheck);
0100 g4Reco->registerSubsystem(mvtx);
0101 radius += G4MVTX::radius_offset;
0102 return radius;
0103 }
0104
0105 void Mvtx_Cells()
0106 {
0107 int verbosity = std::max(Enable::VERBOSITY, Enable::MVTX_VERBOSITY);
0108 Fun4AllServer* se = Fun4AllServer::instance();
0109
0110 PHG4MvtxHitReco* maps_hits = new PHG4MvtxHitReco("MVTX");
0111 maps_hits->Verbosity(verbosity);
0112
0113 double maps_readout_window = 9900.0;
0114 double extended_readout_time = 0.0;
0115 if (TRACKING::pp_mode) extended_readout_time = TRACKING::pp_extended_readout_time;
0116
0117 maps_hits->set_double_param("mvtx_tmin", -maps_readout_window);
0118 maps_hits->set_double_param("mvtx_tmax", maps_readout_window + extended_readout_time);
0119 std::cout << "PHG4MvtxHitReco: readout window is from " << -maps_readout_window << " to " << maps_readout_window + extended_readout_time << std::endl;
0120 std::cout << "PHG4MvtxHitReco: Mvtx set to streaming in simulation? (Enable::MVTX_STREAMING) " << ((Enable::MVTX_STREAMING) ? "True" : "False") << std::endl;
0121 maps_hits->set_int_param("mvtx_in_sphenix_srdo", Enable::MVTX_STREAMING);
0122 se->registerSubsystem(maps_hits);
0123
0124 PHG4MvtxDigitizer* digimvtx = new PHG4MvtxDigitizer();
0125 digimvtx->Verbosity(verbosity);
0126
0127
0128 se->registerSubsystem(digimvtx);
0129
0130 return;
0131 }
0132
0133 void InttInit()
0134 {
0135 BlackHoleGeometry::max_radius = std::max(BlackHoleGeometry::max_radius, 20.);
0136 BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, 410. / 2.);
0137 BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -410. / 2.);
0138
0139
0140 if (!Enable::MVTX)
0141 {
0142 G4MVTX::n_maps_layer = 0;
0143 }
0144 if (!Enable::INTT_USEG4SURVEYGEOM)
0145 {
0146 G4INTT::sensor_radius[0] = 7.188 - 36e-4;
0147 G4INTT::sensor_radius[1] = 7.732 - 36e-4;
0148 G4INTT::sensor_radius[2] = 9.680 - 36e-4;
0149 G4INTT::sensor_radius[3] = 10.262 - 36e-4;
0150 }
0151 }
0152
0153 double Intt(PHG4Reco* g4Reco, double radius,
0154 const int = 0)
0155 {
0156 std::cout << "G4_TrkrSimulation::Intt" << std::endl;
0157 int verbosity = std::max(Enable::VERBOSITY, Enable::INTT_VERBOSITY);
0158 bool intt_overlapcheck = Enable::OVERLAPCHECK || Enable::INTT_OVERLAPCHECK;
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168 std::vector<std::pair<int, int>> vpair;
0169 for (int i = 0; i < G4INTT::n_intt_layer; i++)
0170 {
0171
0172 vpair.emplace_back(G4MVTX::n_maps_layer + i, i);
0173 if (verbosity) std::cout << "Create strip tracker layer " << vpair[i].second << " as sphenix layer " << vpair[i].first << std::endl;
0174 }
0175
0176 PHG4InttSubsystem* sitrack = new PHG4InttSubsystem("INTT", vpair);
0177 sitrack->Verbosity(verbosity);
0178 sitrack->SetActive(1);
0179 sitrack->OverlapCheck(intt_overlapcheck);
0180 std::cout << "PHG4InttSubsystem: Use survey geometry? Enable::INTT_USEG4SURVEYGEOM=" << Enable::INTT_USEG4SURVEYGEOM << std::endl;
0181 sitrack->SetSurveyGeometry(Enable::INTT_USEG4SURVEYGEOM);
0182 if (Enable::INTT_ABSORBER || Enable::ABSORBER)
0183 {
0184 sitrack->SetAbsorberActive();
0185 }
0186 if (Enable::INTT_SUPPORT || Enable::SUPPORT)
0187 {
0188 sitrack->set_int_param(PHG4InttDefs::SUPPORTPARAMS, "supportactive", 1);
0189 }
0190 g4Reco->registerSubsystem(sitrack);
0191
0192
0193
0194 std::cout << "Intt has " << G4INTT::n_intt_layer << " layers with layer setup:" << std::endl;
0195 for (int i = 0; i < G4INTT::n_intt_layer; i++)
0196 {
0197 std::cout << " Intt layer " << i << " laddertype " << G4INTT::laddertype[i] << " nladders " << G4INTT::nladder[i]
0198 << " sensor radius " << G4INTT::sensor_radius[i] << std::endl;
0199 sitrack->set_int_param(i, "laddertype", G4INTT::laddertype[i]);
0200 sitrack->set_int_param(i, "nladder", G4INTT::nladder[i]);
0201 sitrack->set_double_param(i, "sensor_radius", G4INTT::sensor_radius[i]);
0202 }
0203
0204
0205 radius = G4INTT::intt_radius_max * 0.1;
0206 return radius;
0207 }
0208
0209
0210 void Intt_Cells()
0211 {
0212 int verbosity = std::max(Enable::VERBOSITY, Enable::INTT_VERBOSITY);
0213 Fun4AllServer* se = Fun4AllServer::instance();
0214
0215
0216 PHG4InttHitReco* reco = new PHG4InttHitReco();
0217 reco->setLocalHotStripMaskFile("/sphenix/user/rosstom/analysis/LightFlavorRatios/bachelor_pi_efficiency/sim/deadMaps/simulation_inttdeadmap79563.root");
0218
0219
0220 double extended_readout_time = 0.0;
0221 if (TRACKING::pp_mode) extended_readout_time = TRACKING::pp_extended_readout_time;
0222 reco->set_double_param("tmax", 80.0 + extended_readout_time);
0223 reco->set_double_param("tmin", -20.0);
0224 std::cout << "INTT readout window is set to -20 to " << 80.0 + extended_readout_time << std::endl;
0225 reco->Verbosity(verbosity);
0226 se->registerSubsystem(reco);
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251 std::vector<double> userrange;
0252 userrange.push_back(0.0584625322997416);
0253 userrange.push_back(0.116925064599483);
0254 userrange.push_back(0.233850129198966);
0255 userrange.push_back(0.35077519379845);
0256 userrange.push_back(0.584625322997416);
0257 userrange.push_back(0.818475452196383);
0258 userrange.push_back(1.05232558139535);
0259 userrange.push_back(1.28617571059432);
0260
0261
0262 PHG4InttDigitizer* digiintt = new PHG4InttDigitizer();
0263 digiintt->Verbosity(verbosity);
0264 digiintt->LoadBadChannelMap("INTT_Hotmap");
0265 for (int i = 0; i < G4INTT::n_intt_layer; i++)
0266 {
0267 digiintt->set_adc_scale(G4MVTX::n_maps_layer + i, userrange);
0268 }
0269 se->registerSubsystem(digiintt);
0270
0271 return;
0272 }
0273
0274 void TPCInit()
0275 {
0276 std::cout << "G4_TrkrSimulation::TpcInit" << std::endl;
0277 BlackHoleGeometry::max_radius = std::max(BlackHoleGeometry::max_radius, 82.);
0278
0279 if (Enable::TPC_ENDCAP)
0280 {
0281 BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, 130.);
0282 BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -130.);
0283 }
0284 else
0285 {
0286 BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, 211. / 2.);
0287 BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -211. / 2.);
0288 }
0289
0290
0291 if (!Enable::MVTX)
0292 {
0293 G4MVTX::n_maps_layer = 0;
0294 }
0295
0296 if (!Enable::INTT)
0297 {
0298 G4INTT::n_intt_layer = 0;
0299 }
0300
0301
0302 TpcClusterZCrossingCorrection::_vdrift = G4TPC::tpc_drift_velocity_reco;
0303 }
0304
0305
0306 void TPC_Endcaps(PHG4Reco* g4Reco)
0307 {
0308 bool OverlapCheck = Enable::OVERLAPCHECK || Enable::TPC_OVERLAPCHECK;
0309 bool AbsorberActive = Enable::ABSORBER || Enable::TPC_ABSORBER;
0310
0311 PHG4TpcEndCapSubsystem* tpc_endcap = new PHG4TpcEndCapSubsystem("TPC_ENDCAP");
0312 tpc_endcap->SuperDetector("TPC_ENDCAP");
0313
0314 if (AbsorberActive) tpc_endcap->SetActive();
0315 tpc_endcap->OverlapCheck(OverlapCheck);
0316
0317
0318
0319 g4Reco->registerSubsystem(tpc_endcap);
0320
0321 return;
0322 }
0323
0324 double TPC(PHG4Reco* g4Reco,
0325 double radius)
0326 {
0327 std::cout << "G4_TrkrSimulation::TPC" << std::endl;
0328 bool OverlapCheck = Enable::OVERLAPCHECK || Enable::TPC_OVERLAPCHECK;
0329 bool AbsorberActive = Enable::ABSORBER || Enable::TPC_ABSORBER;
0330 double drift_vel = G4TPC::tpc_drift_velocity_sim;
0331 if (G4TPC::TPC_GAS_MIXTURE == "NeCF4")
0332 {
0333 drift_vel = G4TPC::NeCF4_drift_velocity;
0334 }
0335 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4")
0336 {
0337 drift_vel = G4TPC::ArCF4_drift_velocity;
0338 }
0339 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4N2")
0340 {
0341 drift_vel = G4TPC::ArCF4N2_drift_velocity;
0342 }
0343 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4Isobutane")
0344 {
0345 drift_vel = G4TPC::ArCF4Isobutane_drift_velocity;
0346 }
0347
0348 PHG4TpcSubsystem* tpc = new PHG4TpcSubsystem("TPC");
0349 tpc->SetActive();
0350 tpc->SuperDetector("TPC");
0351 tpc->set_double_param("steplimits", 1);
0352 tpc->set_double_param("drift_velocity_sim", drift_vel);
0353 tpc->set_double_param("tpc_length", G4TPC::maxDriftLength * 2 + G4TPC::CM_halfwidth * 2);
0354 tpc->set_double_param("maxdriftlength", G4TPC::maxDriftLength);
0355 tpc->set_double_param("CM_halfwidth", G4TPC::CM_halfwidth);
0356 tpc->set_int_param("tpc_minlayer_inner", G4MVTX::n_maps_layer + G4INTT::n_intt_layer);
0357 tpc->set_int_param("ntpc_layers_inner", G4TPC::n_tpc_layer_inner);
0358 tpc->set_int_param("ntpc_phibins_inner", G4TPC::tpc_layer_rphi_count_inner);
0359
0360 if (AbsorberActive)
0361 {
0362 tpc->SetAbsorberActive();
0363 }
0364
0365 double extended_readout_time = 0.0;
0366 if (TRACKING::pp_mode)
0367 {
0368 extended_readout_time = TRACKING::pp_extended_readout_time;
0369 }
0370
0371 tpc->set_double_param("extended_readout_time", extended_readout_time);
0372
0373
0374 if (G4TPC::TPC_GAS_MIXTURE == "NeCF4")
0375 {
0376 tpc->set_double_param("Ne_frac", G4TPC::NeCF4_Ne_frac);
0377 tpc->set_double_param("Ar_frac", G4TPC::NeCF4_Ar_frac);
0378 tpc->set_double_param("CF4_frac", G4TPC::NeCF4_CF4_frac);
0379 tpc->set_double_param("N2_frac", G4TPC::NeCF4_N2_frac);
0380 tpc->set_double_param("isobutane_frac", G4TPC::NeCF4_isobutane_frac);
0381 }
0382 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4")
0383 {
0384 tpc->set_double_param("Ne_frac", G4TPC::ArCF4_Ne_frac);
0385 tpc->set_double_param("Ar_frac", G4TPC::ArCF4_Ar_frac);
0386 tpc->set_double_param("CF4_frac", G4TPC::ArCF4_CF4_frac);
0387 tpc->set_double_param("N2_frac", G4TPC::ArCF4_N2_frac);
0388 tpc->set_double_param("isobutane_frac", G4TPC::ArCF4_isobutane_frac);
0389 }
0390 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4N2")
0391 {
0392 tpc->set_double_param("Ne_frac", G4TPC::ArCF4N2_Ne_frac);
0393 tpc->set_double_param("Ar_frac", G4TPC::ArCF4N2_Ar_frac);
0394 tpc->set_double_param("CF4_frac", G4TPC::ArCF4N2_CF4_frac);
0395 tpc->set_double_param("N2_frac", G4TPC::ArCF4N2_N2_frac);
0396 tpc->set_double_param("isobutane_frac", G4TPC::ArCF4N2_isobutane_frac);
0397 }
0398 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4Isobutane")
0399 {
0400 tpc->set_double_param("Ne_frac", G4TPC::ArCF4Isobutane_Ne_frac);
0401 tpc->set_double_param("Ar_frac", G4TPC::ArCF4Isobutane_Ar_frac);
0402 tpc->set_double_param("CF4_frac", G4TPC::ArCF4Isobutane_CF4_frac);
0403 tpc->set_double_param("N2_frac", G4TPC::ArCF4Isobutane_N2_frac);
0404 tpc->set_double_param("isobutane_frac", G4TPC::ArCF4Isobutane_isobutane_frac);
0405 }
0406 else
0407 {
0408 std::cout << "Your gas mixture, " << G4TPC::TPC_GAS_MIXTURE << ", is unknown. Defaulting to ArCF4Isobutane" << std::endl;
0409 }
0410
0411 tpc->OverlapCheck(OverlapCheck);
0412
0413 std::cout << "PHG4TpcSubsystem z geometry parameters: " << std::endl;
0414 std::cout << " drift_velocity_sim " << drift_vel << std::endl;
0415 std::cout << " max_driftlength " << G4TPC::maxDriftLength << std::endl;
0416 std::cout << " CM_halfwidth " << G4TPC::CM_halfwidth << std::endl;
0417 std::cout << " pp_extended_readout_time " << TRACKING::pp_extended_readout_time << std::endl;
0418
0419 g4Reco->registerSubsystem(tpc);
0420
0421 if (Enable::TPC_ENDCAP)
0422 {
0423 TPC_Endcaps(g4Reco);
0424 }
0425
0426 radius = G4TPC::tpc_outer_radius;
0427
0428 radius += no_overlapp;
0429
0430 return radius;
0431 }
0432
0433 void TPC_Cells()
0434 {
0435 int verbosity = std::max(Enable::VERBOSITY, Enable::TPC_VERBOSITY);
0436 auto* se = Fun4AllServer::instance();
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460 if (G4TPC::ENABLE_CENTRAL_MEMBRANE_HITS)
0461 {
0462 auto* centralMembrane = new PHG4TpcCentralMembrane;
0463 centralMembrane->setCentralMembraneDelay(0);
0464 centralMembrane->setCentralMembraneEventModulo(5);
0465 se->registerSubsystem(centralMembrane);
0466 }
0467
0468
0469 if (G4TPC::ENABLE_DIRECT_LASER_HITS)
0470 {
0471 auto* directLaser = new PHG4TpcDirectLaser;
0472
0473
0474
0475 static constexpr double deg_to_rad = M_PI / 180.;
0476 directLaser->SetPhiStepping(144, 0 * deg_to_rad, 360 * deg_to_rad);
0477 directLaser->SetThetaStepping(36, 0 * deg_to_rad, 90 * deg_to_rad);
0478
0479 directLaser->SetDirectLaserAuto(true);
0480
0481
0482
0483
0484
0485
0486 se->registerSubsystem(directLaser);
0487 }
0488
0489
0490
0491
0492
0493
0494
0495 auto* padplane = new PHG4TpcPadPlaneReadout;
0496 padplane->Verbosity(verbosity);
0497
0498 padplane->set_int_param("ntpc_phibins_inner", G4TPC::tpc_layer_rphi_count_inner);
0499
0500 padplane->SetMaskChannelsFromFile();
0501 padplane->SetDeadChannelMapName("/sphenix/user/rosstom/analysis/LightFlavorRatios/bachelor_pi_efficiency/sim/deadMaps/TPCDeadMap_79563.root");
0502 padplane->SetHotChannelMapName("/sphenix/user/rosstom/analysis/LightFlavorRatios/bachelor_pi_efficiency/sim/deadMaps/TPCHotMap_79563.root");
0503
0504 auto* edrift = new PHG4TpcElectronDrift;
0505 edrift->Detector("TPC");
0506 edrift->Verbosity(verbosity);
0507
0508 if( G4TPC::ENABLE_STATIC_DISTORTIONS && G4TPC::static_distortion_filename.empty() )
0509 {
0510 G4TPC::static_distortion_filename = CDBInterface::instance()->getUrl("TPC_STATIC_DISTORTION");
0511 }
0512
0513 if( G4TPC::ENABLE_TIME_ORDERED_DISTORTIONS && G4TPC::time_ordered_distortion_filename.empty() )
0514 {
0515 G4TPC::time_ordered_distortion_filename = CDBInterface::instance()->getUrl("TPC_TIMEORDERED_DISTORTION");
0516 }
0517
0518 if (G4TPC::ENABLE_STATIC_DISTORTIONS || G4TPC::ENABLE_TIME_ORDERED_DISTORTIONS)
0519 {
0520 auto* distortionMap = new PHG4TpcDistortion;
0521
0522 distortionMap->set_read_phi_as_radians(G4TPC::DISTORTIONS_USE_PHI_AS_RADIANS);
0523
0524 distortionMap->set_do_static_distortions(G4TPC::ENABLE_STATIC_DISTORTIONS);
0525 distortionMap->set_static_distortion_filename(CDBInterface::instance()->getUrl(G4TPC::static_distortion_filename));
0526
0527 distortionMap->set_do_time_ordered_distortions(G4TPC::ENABLE_TIME_ORDERED_DISTORTIONS);
0528 distortionMap->set_time_ordered_distortion_filename(G4TPC::time_ordered_distortion_filename);
0529
0530 distortionMap->set_do_ReachesReadout(G4TPC::ENABLE_REACHES_READOUT);
0531 distortionMap->Init();
0532 edrift->setTpcDistortion(distortionMap);
0533 }
0534
0535 edrift->set_double_param("added_smear_trans", 0.085);
0536 edrift->set_double_param("added_smear_long", 0.105);
0537
0538
0539 if (G4TPC::TPC_GAS_MIXTURE == "NeCF4")
0540 {
0541 edrift->set_double_param("added_smear_trans", 0.085);
0542 edrift->set_double_param("added_smear_long", 0.105);
0543 edrift->set_double_param("diffusion_long", G4TPC::NeCF4_diffusion_long);
0544 edrift->set_double_param("diffusion_trans", G4TPC::NeCF4_diffusion_trans);
0545 edrift->set_double_param("Ne_frac", G4TPC::NeCF4_Ne_frac);
0546 edrift->set_double_param("Ar_frac", G4TPC::NeCF4_Ar_frac);
0547 edrift->set_double_param("CF4_frac", G4TPC::NeCF4_CF4_frac);
0548 edrift->set_double_param("N2_frac", G4TPC::NeCF4_N2_frac);
0549 edrift->set_double_param("isobutane_frac", G4TPC::NeCF4_isobutane_frac);
0550 }
0551 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4")
0552 {
0553 edrift->set_double_param("added_smear_trans", 0.085);
0554 edrift->set_double_param("added_smear_long", 0.105);
0555 edrift->set_double_param("diffusion_long", G4TPC::ArCF4_diffusion_long);
0556 edrift->set_double_param("diffusion_trans", G4TPC::ArCF4_diffusion_trans);
0557 edrift->set_double_param("Ne_frac", G4TPC::ArCF4_Ne_frac);
0558 edrift->set_double_param("Ar_frac", G4TPC::ArCF4_Ar_frac);
0559 edrift->set_double_param("CF4_frac", G4TPC::ArCF4_CF4_frac);
0560 edrift->set_double_param("N2_frac", G4TPC::ArCF4_N2_frac);
0561 edrift->set_double_param("isobutane_frac", G4TPC::ArCF4_isobutane_frac);
0562 }
0563 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4N2")
0564 {
0565 edrift->set_double_param("added_smear_trans", G4TPC::tpc_added_smear_trans);
0566 edrift->set_double_param("added_smear_long", G4TPC::tpc_added_smear_long);
0567 edrift->set_double_param("diffusion_long", G4TPC::ArCF4N2_diffusion_long);
0568 edrift->set_double_param("diffusion_trans", G4TPC::ArCF4N2_diffusion_trans);
0569 edrift->set_double_param("Ne_frac", G4TPC::ArCF4N2_Ne_frac);
0570 edrift->set_double_param("Ar_frac", G4TPC::ArCF4N2_Ar_frac);
0571 edrift->set_double_param("CF4_frac", G4TPC::ArCF4N2_CF4_frac);
0572 edrift->set_double_param("N2_frac", G4TPC::ArCF4N2_N2_frac);
0573 edrift->set_double_param("isobutane_frac", G4TPC::ArCF4N2_isobutane_frac);
0574 }
0575 else if (G4TPC::TPC_GAS_MIXTURE == "ArCF4Isobutane")
0576 {
0577 edrift->set_double_param("added_smear_trans", G4TPC::tpc_added_smear_trans);
0578 edrift->set_double_param("added_smear_long", G4TPC::tpc_added_smear_long);
0579 edrift->set_double_param("diffusion_long", G4TPC::ArCF4Isobutane_diffusion_long);
0580 edrift->set_double_param("diffusion_trans", G4TPC::ArCF4Isobutane_diffusion_trans);
0581 edrift->set_double_param("Ne_frac", G4TPC::ArCF4Isobutane_Ne_frac);
0582 edrift->set_double_param("Ar_frac", G4TPC::ArCF4Isobutane_Ar_frac);
0583 edrift->set_double_param("CF4_frac", G4TPC::ArCF4Isobutane_CF4_frac);
0584 edrift->set_double_param("N2_frac", G4TPC::ArCF4Isobutane_N2_frac);
0585 edrift->set_double_param("isobutane_frac", G4TPC::ArCF4Isobutane_isobutane_frac);
0586 }
0587 else
0588 {
0589 }
0590
0591
0592
0593
0594
0595 edrift->registerPadPlane(padplane);
0596 se->registerSubsystem(edrift);
0597
0598
0599
0600 PHG4TpcDigitizer* digitpc = new PHG4TpcDigitizer();
0601 digitpc->SetTpcMinLayer(G4MVTX::n_maps_layer + G4INTT::n_intt_layer);
0602 double ENC = 670.0;
0603 digitpc->SetENC(ENC);
0604 double ADC_threshold = 4.0 * ENC;
0605 digitpc->SetADCThreshold(ADC_threshold);
0606 digitpc->Verbosity(verbosity);
0607 std::cout << " Tpc digitizer: Setting ENC to " << ENC << " ADC threshold to " << ADC_threshold
0608 << " maps+Intt layers set to " << G4MVTX::n_maps_layer + G4INTT::n_intt_layer << std::endl;
0609 digitpc->set_skip_noise_flag(false);
0610 se->registerSubsystem(digitpc);
0611 }
0612
0613 void MicromegasInit()
0614 {
0615 if (!Enable::MVTX)
0616 {
0617 G4MVTX::n_maps_layer = 0;
0618 }
0619
0620 if (!Enable::INTT)
0621 {
0622 G4INTT::n_intt_layer = 0;
0623 }
0624 if (!Enable::TPC)
0625 {
0626 G4TPC::n_gas_layer = 0;
0627 }
0628 BlackHoleGeometry::max_radius = std::max(BlackHoleGeometry::max_radius, 88.);
0629 BlackHoleGeometry::max_z = std::max(BlackHoleGeometry::max_z, 220. / 2.);
0630 BlackHoleGeometry::min_z = std::min(BlackHoleGeometry::min_z, -220. / 2.);
0631 }
0632
0633 void Micromegas(PHG4Reco* g4Reco)
0634 {
0635 bool overlapcheck = Enable::OVERLAPCHECK || Enable::MICROMEGAS_OVERLAPCHECK;
0636 int verbosity = std::max(Enable::VERBOSITY, Enable::MICROMEGAS_VERBOSITY);
0637 bool SupportActive = Enable::SUPPORT || Enable::MICROMEGAS_SUPPORT;
0638 const int mm_layer = G4MVTX::n_maps_layer + G4INTT::n_intt_layer + G4TPC::n_gas_layer;
0639 auto* mm = new PHG4MicromegasSubsystem("MICROMEGAS", mm_layer);
0640 mm->Verbosity(verbosity);
0641 if (SupportActive)
0642 {
0643 mm->SetSupportActive();
0644 }
0645 mm->OverlapCheck(overlapcheck);
0646 mm->SetActive();
0647 g4Reco->registerSubsystem(mm);
0648 }
0649
0650 void Micromegas_Cells()
0651 {
0652
0653 ACTSGEOM::ActsGeomInit();
0654 auto* se = Fun4AllServer::instance();
0655 int verbosity = std::max(Enable::VERBOSITY, Enable::MICROMEGAS_VERBOSITY);
0656
0657 auto* reco = new PHG4MicromegasHitReco;
0658 reco->Verbosity(verbosity);
0659 double extended_readout_time = 0.0;
0660 if (TRACKING::pp_mode) extended_readout_time = TRACKING::pp_extended_readout_time;
0661
0662 reco->set_double_param("micromegas_tmax", 800.0 + extended_readout_time);
0663 se->registerSubsystem(reco);
0664
0665 se->registerSubsystem(new PHG4MicromegasDigitizer);
0666 }
0667
0668 #endif