File indexing completed on 2025-08-06 08:16:18
0001 #include <vector>
0002
0003
0004
0005
0006 bool use_primary_vertex = false;
0007
0008 const int n_maps_layer = 3;
0009 const int n_intt_layer = 4;
0010 int n_gas_layer = 40;
0011
0012 double inner_cage_radius = 20.;
0013
0014 int Max_si_layer;
0015
0016 void SvtxInit(int n_TPC_layers = 40, int verbosity = 0)
0017 {
0018 n_gas_layer = n_TPC_layers;
0019 Max_si_layer = n_maps_layer + n_intt_layer + n_gas_layer;
0020 }
0021
0022 double Svtx(PHG4Reco* g4Reco, double radius,
0023 const int absorberactive = 0,
0024 int verbosity = 0) {
0025
0026 if(n_maps_layer > 0)
0027 {
0028 bool maps_overlapcheck = false;
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 double maps_layer_radius[3] = {23.4, 31.5, 39.3};
0045
0046
0047
0048
0049 int stave_type[3] = {0, 0, 0};
0050 int staves_in_layer[3] = {12, 16, 20};
0051 double phi_tilt[3] = {0.304, 0.304, 0.304};
0052
0053 for (int ilayer = 0; ilayer < n_maps_layer; ilayer++)
0054 {
0055 if (verbosity)
0056 cout << "Create Maps layer " << ilayer << " with radius " << maps_layer_radius[ilayer] << " mm, stave type " << stave_type[ilayer]
0057 << " pixel size 30 x 30 microns " << " active pixel thickness 0.0018 microns" << endl;
0058
0059 PHG4MapsSubsystem *lyr = new PHG4MapsSubsystem("MAPS", ilayer, stave_type[ilayer]);
0060 lyr->Verbosity(verbosity);
0061
0062 lyr->set_double_param("layer_nominal_radius",maps_layer_radius[ilayer]);
0063 lyr->set_int_param("N_staves", staves_in_layer[ilayer]);
0064
0065
0066 lyr->set_double_param("pixel_x",0.0030);
0067 lyr->set_double_param("pixel_z",0.0030);
0068 lyr->set_double_param("pixel_thickness",0.0018);
0069 lyr->set_double_param("phitilt", phi_tilt[ilayer]);
0070
0071 lyr->set_int_param("active",1);
0072 lyr->OverlapCheck(maps_overlapcheck);
0073
0074 lyr->set_string_param("stave_geometry_file",
0075 string(getenv("CALIBRATIONROOT")) + string("/Tracking/geometry/ALICE_ITS_tgeo.gdml"));
0076
0077 g4Reco->registerSubsystem( lyr );
0078
0079 radius = maps_layer_radius[ilayer];
0080 }
0081 }
0082
0083 if(n_intt_layer > 0)
0084 {
0085
0086
0087
0088
0089 bool intt_overlapcheck = false;
0090
0091
0092
0093
0094
0095
0096
0097 const double intt_radius_max = 140.;
0098
0099
0100 std::vector<std::pair<int, int>> vpair;
0101 for(int i=0;i<n_intt_layer;i++)
0102 {
0103
0104 vpair.push_back(std::make_pair(n_maps_layer+i, i));
0105 if (verbosity) cout << "Create strip tracker layer " << vpair[i].second << " as sphenix layer " << vpair[i].first << endl;
0106 }
0107 PHG4SiliconTrackerSubsystem *sitrack = new PHG4SiliconTrackerSubsystem("SILICON_TRACKER", vpair);
0108 sitrack->Verbosity(verbosity);
0109 sitrack->SetActive(1);
0110 sitrack->OverlapCheck(intt_overlapcheck);
0111 g4Reco->registerSubsystem( sitrack);
0112
0113
0114 radius = intt_radius_max*0.1;
0115 }
0116
0117
0118
0119 PHG4CylinderSubsystem *cyl;
0120
0121 radius = inner_cage_radius;
0122
0123 double cage_length = 211.0;
0124 double n_rad_length_cage = 1.13e-02;
0125 double cage_thickness = 28.6 * n_rad_length_cage;
0126
0127
0128 cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer);
0129 cyl->set_double_param("radius",radius);
0130 cyl->set_int_param("lengthviarapidity",0);
0131 cyl->set_double_param("length",cage_length);
0132 cyl->set_string_param("material","G4_KAPTON");
0133 cyl->set_double_param("thickness",cage_thickness );
0134 cyl->SuperDetector("SVTXSUPPORT");
0135 cyl->Verbosity(0);
0136 g4Reco->registerSubsystem( cyl );
0137
0138 radius += cage_thickness;
0139
0140 double inner_readout_radius = 30.;
0141 if (inner_readout_radius<radius) inner_readout_radius = radius;
0142
0143 string tpcgas = "G4_Ar";
0144
0145
0146
0147 if (inner_readout_radius - radius > 0) {
0148 cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer + 1);
0149 cyl->set_double_param("radius",radius);
0150 cyl->set_int_param("lengthviarapidity",0);
0151 cyl->set_double_param("length",cage_length);
0152 cyl->set_string_param("material",tpcgas.c_str());
0153 cyl->set_double_param("thickness", inner_readout_radius - radius);
0154 cyl->SuperDetector("SVTXSUPPORT");
0155 g4Reco->registerSubsystem( cyl );
0156 }
0157
0158 radius = inner_readout_radius;
0159
0160 double outer_radius = 78.;
0161 int npoints = Max_si_layer - n_maps_layer - n_intt_layer;
0162 double delta_radius = ( outer_radius - inner_readout_radius )/( (double)npoints );
0163
0164 for(int ilayer=n_maps_layer + n_intt_layer;ilayer<(n_maps_layer + n_intt_layer + npoints);++ilayer) {
0165
0166 if (verbosity)
0167 cout << "Create TPC gas layer " << ilayer << " with radius " << radius << " cm "
0168 << " thickness " << delta_radius - 0.01 << " length " << cage_length << endl;
0169
0170 cyl = new PHG4CylinderSubsystem("SVTX", ilayer);
0171 cyl->set_double_param("radius",radius);
0172 cyl->set_int_param("lengthviarapidity",0);
0173 cyl->set_double_param("length",cage_length);
0174 cyl->set_string_param("material",tpcgas.c_str());
0175 cyl->set_double_param("thickness", delta_radius - 0.01 );
0176 cyl->SetActive();
0177 cyl->SuperDetector("SVTX");
0178 g4Reco->registerSubsystem( cyl );
0179
0180 radius += delta_radius;
0181 }
0182
0183
0184 cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer + npoints);
0185 cyl->set_double_param("radius",radius);
0186 cyl->set_int_param("lengthviarapidity",0);
0187 cyl->set_double_param("length",cage_length);
0188 cyl->set_string_param("material","G4_KAPTON");
0189 cyl->set_double_param("thickness",cage_thickness );
0190 cyl->SuperDetector("SVTXSUPPORT");
0191 g4Reco->registerSubsystem( cyl );
0192
0193 radius += cage_thickness;
0194
0195 return radius;
0196 }
0197
0198 void Svtx_Cells(int verbosity = 0)
0199 {
0200
0201
0202
0203
0204
0205
0206
0207 gSystem->Load("libfun4all.so");
0208 gSystem->Load("libg4detectors.so");
0209
0210
0211
0212
0213
0214 Fun4AllServer *se = Fun4AllServer::instance();
0215
0216
0217
0218
0219
0220 if(n_maps_layer > 0)
0221 {
0222
0223 PHG4MapsCellReco *maps_cells = new PHG4MapsCellReco("MAPS");
0224 maps_cells->Verbosity(verbosity);
0225 for(int ilayer = 0;ilayer < n_maps_layer;ilayer++)
0226 {
0227 maps_cells->set_timing_window(ilayer,-2000,2000);
0228 }
0229 se->registerSubsystem(maps_cells);
0230 }
0231
0232 if(n_intt_layer > 0)
0233 {
0234
0235 PHG4SiliconTrackerCellReco *reco = new PHG4SiliconTrackerCellReco("SILICON_TRACKER");
0236
0237 reco->Verbosity(verbosity);
0238 se->registerSubsystem(reco);
0239 }
0240
0241
0242
0243
0244
0245 double tpc_cell_x = 0.12;
0246 double tpc_cell_y = 0.17;
0247 if(n_gas_layer == 60)
0248 {
0249 tpc_cell_x = 0.12;
0250 tpc_cell_y = 0.17;
0251 }
0252
0253
0254 const bool do_tpc_distortion = true;
0255 PHG4TPCSpaceChargeDistortion* tpc_distortion = NULL;
0256 if (do_tpc_distortion) {
0257 if (inner_cage_radius != 20. && inner_cage_radius != 30.) {
0258 cout << "Svtx_Cells - Fatal Error - TPC distortion required that "
0259 "inner_cage_radius is either 20 or 30 cm."
0260 << endl;
0261 exit(3);
0262 }
0263
0264
0265 string TPC_distortion_file =
0266 string(getenv("CALIBRATIONROOT")) +
0267 Form("/Tracking/TPC/SpaceChargeDistortion/TPCCAGE_20_78_211_2.root");
0268 PHG4TPCSpaceChargeDistortion* tpc_distortion =
0269 new PHG4TPCSpaceChargeDistortion(TPC_distortion_file);
0270
0271
0272 }
0273
0274 PHG4CylinderCellTPCReco *svtx_cells = new PHG4CylinderCellTPCReco(n_maps_layer+n_intt_layer);
0275 svtx_cells->Detector("SVTX");
0276 svtx_cells->setDistortion(tpc_distortion);
0277 if(n_gas_layer == 40)
0278 {
0279 svtx_cells->setDiffusionT(0.0130);
0280 svtx_cells->setDiffusionL(0.0130);
0281 svtx_cells->setSmearRPhi(0.10);
0282 svtx_cells->setSmearZ(0.09);
0283 }
0284 else
0285 {
0286
0287 svtx_cells->setDiffusionT(0.0120);
0288 svtx_cells->setDiffusionL(0.0120);
0289 svtx_cells->setSmearRPhi(0.09);
0290 svtx_cells->setSmearZ(0.06);
0291 }
0292 svtx_cells->set_drift_velocity(6.0/1000.0l);
0293 svtx_cells->setHalfLength( 105.5 );
0294 svtx_cells->setElectronsPerKeV(28);
0295 svtx_cells->Verbosity(0);
0296
0297
0298
0299
0300 for (int i=n_maps_layer + n_intt_layer;i<Max_si_layer;++i) {
0301 svtx_cells->cellsize(i, tpc_cell_x, tpc_cell_y);
0302 svtx_cells->set_timing_window(i, -14000.0, +14000.0);
0303 }
0304
0305 se->registerSubsystem(svtx_cells);
0306
0307 return;
0308 }
0309
0310 void Svtx_Clustering(int verbosity = 0)
0311 {
0312
0313
0314
0315
0316 gSystem->Load("libfun4all.so");
0317 gSystem->Load("libg4hough.so");
0318
0319
0320
0321
0322
0323 Fun4AllServer *se = Fun4AllServer::instance();
0324
0325
0326
0327
0328 PHG4SvtxDigitizer* digi = new PHG4SvtxDigitizer();
0329 digi->Verbosity(0);
0330 for (int i=0;i<n_maps_layer;++i) {
0331 digi->set_adc_scale(i, 255, 0.4e-6);
0332 }
0333
0334 if(n_intt_layer > 0)
0335 {
0336
0337 std::vector<double> userrange;
0338
0339 userrange.push_back(0.05);
0340 userrange.push_back(0.10);
0341 userrange.push_back(0.15);
0342 userrange.push_back(0.20);
0343 userrange.push_back(0.25);
0344 userrange.push_back(0.30);
0345 userrange.push_back(0.35);
0346 userrange.push_back(0.40);
0347
0348 PHG4SiliconTrackerDigitizer* digiintt = new PHG4SiliconTrackerDigitizer();
0349 digiintt->Verbosity(verbosity);
0350 for(int i=0;i<n_intt_layer;i++)
0351 {
0352 digiintt->set_adc_scale(n_maps_layer+i, userrange);
0353 }
0354 se->registerSubsystem( digiintt );
0355 }
0356
0357
0358 for (int i=n_maps_layer+n_intt_layer;i<Max_si_layer;++i) {
0359 digi->set_adc_scale(i, 10000, 1.0);
0360 }
0361 se->registerSubsystem( digi );
0362
0363
0364
0365
0366
0367
0368 PHG4SvtxDeadArea* deadarea = new PHG4SvtxDeadArea();
0369
0370 for(int i = 0;i<n_maps_layer;i++)
0371 {
0372 deadarea->Verbosity(verbosity);
0373
0374 deadarea->set_hit_efficiency(i,1.0);
0375 }
0376 for(int i=n_maps_layer;i<n_maps_layer + n_intt_layer;i++)
0377 {
0378
0379 deadarea->set_hit_efficiency(i,1.0);
0380 }
0381 se->registerSubsystem( deadarea );
0382
0383
0384
0385
0386
0387 PHG4SvtxThresholds* thresholds = new PHG4SvtxThresholds();
0388 thresholds->Verbosity(verbosity);
0389
0390
0391 for(int i = 0;i<n_maps_layer;i++)
0392 {
0393
0394
0395 thresholds->set_threshold(i,0.1);
0396 }
0397
0398 for(int i=n_maps_layer;i<n_maps_layer + n_intt_layer;i++)
0399 {
0400 thresholds->set_threshold(i,0.1);
0401 thresholds->set_use_thickness_mip(i, true);
0402
0403 }
0404
0405 se->registerSubsystem( thresholds );
0406
0407
0408
0409
0410
0411 PHG4SvtxClusterizer* clusterizer = new PHG4SvtxClusterizer("PHG4SvtxClusterizer",0, n_maps_layer + n_intt_layer-1);
0412 clusterizer->Verbosity(verbosity);
0413
0414
0415 clusterizer->set_threshold(0.1);
0416
0417 for(int i=n_maps_layer;i<n_maps_layer+n_intt_layer;i++)
0418 {
0419 clusterizer->set_z_clustering(i, false);
0420 }
0421
0422 se->registerSubsystem( clusterizer );
0423
0424 PHG4TPCClusterizer* tpcclusterizer = new PHG4TPCClusterizer();
0425 tpcclusterizer->Verbosity(0);
0426 tpcclusterizer->setRangeLayers(n_maps_layer+n_intt_layer,Max_si_layer);
0427 if(n_gas_layer == 40)
0428 {
0429 tpcclusterizer->setEnergyCut(12);
0430 tpcclusterizer->setFitWindowSigmas(0.0160,0.0160);
0431
0432 tpcclusterizer->setFitWindowMax(4,3);
0433
0434 tpcclusterizer->setFitEnergyThreshold( 0.05 );
0435 }
0436 else
0437 {
0438
0439 tpcclusterizer->setEnergyCut(15);
0440 tpcclusterizer->setFitWindowSigmas(0.0150,0.0160);
0441 tpcclusterizer->setFitWindowMax(4,3);
0442 tpcclusterizer->setFitEnergyThreshold( 0.05 );
0443 }
0444 se->registerSubsystem( tpcclusterizer );
0445 }
0446
0447 void Svtx_Tracking(int verbosity = 0) {
0448
0449
0450
0451
0452
0453 gSystem->Load("libfun4all.so");
0454 gSystem->Load("libg4hough.so");
0455
0456
0457
0458
0459
0460 Fun4AllServer *se = Fun4AllServer::instance();
0461
0462
0463 const bool use_kalman_pat_rec = true;
0464 if (use_kalman_pat_rec) {
0465
0466
0467
0468
0469 PHG4KalmanPatRec* kalman_pat_rec = new PHG4KalmanPatRec("PHG4KalmanPatRec", n_maps_layer, n_intt_layer, n_gas_layer);
0470 kalman_pat_rec->Verbosity(0);
0471 se->registerSubsystem(kalman_pat_rec);
0472
0473 } else {
0474
0475
0476
0477 PHG4TruthPatRec* pat_rec = new PHG4TruthPatRec();
0478 se->registerSubsystem(pat_rec);
0479
0480 }
0481
0482
0483
0484
0485
0486 PHG4TrackKalmanFitter* kalman = new PHG4TrackKalmanFitter();
0487 kalman->Verbosity(0);
0488 if(use_primary_vertex)
0489 kalman->set_fit_primary_tracks(true);
0490 se->registerSubsystem(kalman);
0491
0492
0493
0494
0495
0496 PHG4SvtxTrackProjection* projection = new PHG4SvtxTrackProjection();
0497 projection->Verbosity(verbosity);
0498 se->registerSubsystem( projection );
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509 return;
0510 }
0511
0512 void G4_Svtx_Reco()
0513 {
0514 cout << "\033[31;1m"
0515 << "Warning: G4_Svtx_Reco() was moved to G4_Svtx.C and renamed to Svtx_Reco(), please update macros"
0516 << "\033[0m" << endl;
0517 Svtx_Reco();
0518
0519 return;
0520 }
0521
0522 void Svtx_Eval(std::string outputfile, int verbosity = 0)
0523 {
0524
0525
0526
0527
0528 gSystem->Load("libfun4all.so");
0529 gSystem->Load("libg4detectors.so");
0530 gSystem->Load("libg4hough.so");
0531 gSystem->Load("libg4eval.so");
0532
0533
0534
0535
0536
0537 Fun4AllServer *se = Fun4AllServer::instance();
0538
0539
0540
0541
0542
0543 SvtxEvaluator* eval;
0544 eval = new SvtxEvaluator("SVTXEVALUATOR", outputfile.c_str());
0545 eval->do_cluster_eval(true);
0546 eval->do_g4hit_eval(true);
0547 eval->do_hit_eval(false);
0548 eval->do_gpoint_eval(false);
0549 eval->scan_for_embedded(true);
0550 eval->Verbosity(verbosity);
0551 se->registerSubsystem( eval );
0552
0553
0554 if(use_primary_vertex)
0555 {
0556
0557
0558 SvtxEvaluator* evalp;
0559 evalp = new SvtxEvaluator("SVTXEVALUATOR", string(outputfile.c_str()) + "_primary_eval.root", "PrimaryTrackMap");
0560 evalp->do_cluster_eval(true);
0561 evalp->do_g4hit_eval(true);
0562 evalp->do_hit_eval(false);
0563 evalp->do_gpoint_eval(false);
0564 evalp->scan_for_embedded(true);
0565 evalp->Verbosity(0);
0566 se->registerSubsystem( evalp );
0567 }
0568
0569
0570
0571
0572 return;
0573 }