File indexing completed on 2025-08-06 08:12:54
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
0011 int n_tpc_layer_inner = 8;
0012 double tpc_layer_thick_inner = 1.25;
0013 int tpc_layer_rphi_count_inner = 1920;
0014
0015
0016
0017
0018
0019
0020
0021
0022 int n_tpc_layer_mid = 16;
0023 double tpc_layer_thick_mid = 1.25;
0024 int tpc_layer_rphi_count_mid = 1536;
0025
0026 int n_tpc_layer_outer = 16;
0027 double tpc_layer_thick_outer = 1.125;
0028 int tpc_layer_rphi_count_outer = 2304;
0029
0030 int n_gas_layer = n_tpc_layer_inner + n_tpc_layer_mid + n_tpc_layer_outer;
0031
0032 double inner_cage_radius = 20.;
0033 double inner_readout_radius = 30.;
0034
0035
0036
0037
0038 enum TPC_Gas
0039 {
0040 Ne2K_100,
0041 Ne2K_400,
0042 NeCF4_100,
0043 NeCF4_300,
0044 NeCF4_400,
0045 ByHand
0046 };
0047 TPC_Gas ether = TPC_Gas::NeCF4_400;
0048
0049
0050
0051
0052 double Ne_dEdx = 1.56;
0053 double CF4_dEdx = 7.00;
0054 double iBut_dEdx = 5.93;
0055
0056 double Ne_NPrimary = 12;
0057 double CF4_NPrimary = 51;
0058 double iBut_NPrimary = 84;
0059
0060 double Ne_NTotal = 43;
0061 double CF4_NTotal = 100;
0062 double iBut_NTotal = 195;
0063
0064
0065 double TPC_SigmaT = 0.03;
0066
0067
0068 double TPCDriftVelocity;
0069 double TPC_Trans_Diffusion;
0070 double TPC_Long_Diffusion;
0071 double TPC_dEdx;
0072 double TPC_NPri;
0073 double TPC_NTot;
0074 double TPC_ElectronsPerKeV;
0075
0076
0077
0078
0079
0080 double TPCADCClock;
0081 double TPCShapingRMSLead;
0082 double TPCShapingRMSTail;
0083 double tpc_cell_z;
0084 double TPC_SmearRPhi;
0085 double TPC_SmearZ;
0086
0087 int Max_si_layer;
0088
0089 void SvtxInit(int n_TPC_layers = 40, int verbosity = 0)
0090 {
0091 Max_si_layer = n_maps_layer + n_intt_layer + n_gas_layer;
0092
0093 switch (ether)
0094 {
0095
0096 case TPC_Gas::Ne2K_100:
0097 {
0098 if (verbosity)
0099 cout << "Gas Choice: TPC_Gas::Ne2K_100" << endl;
0100 TPCDriftVelocity = 3.2 / 1000.0;
0101 TPC_Trans_Diffusion = 0.0065;
0102 TPC_Long_Diffusion = 0.0300;
0103 TPC_dEdx = 0.95 * Ne_dEdx + 0.03 * CF4_dEdx + 0.02 * iBut_dEdx;
0104 TPC_NPri = 0.95 * Ne_NPrimary + 0.03 * CF4_NPrimary + 0.02 * iBut_NPrimary;
0105 TPC_NTot = 0.95 * Ne_NTotal + 0.03 * CF4_NTotal + 0.02 * iBut_NTotal;
0106 break;
0107 }
0108 case TPC_Gas::Ne2K_400:
0109 {
0110 if (verbosity)
0111 cout << "Gas Choice: TPC_Gas::Ne2K_400" << endl;
0112 TPCDriftVelocity = 5.5 / 1000.0;
0113 TPC_Trans_Diffusion = 0.0120;
0114 TPC_Long_Diffusion = 0.0175;
0115 TPC_dEdx = 0.95 * Ne_dEdx + 0.03 * CF4_dEdx + 0.02 * iBut_dEdx;
0116 TPC_NPri = 0.95 * Ne_NPrimary + 0.03 * CF4_NPrimary + 0.02 * iBut_NPrimary;
0117 TPC_NTot = 0.95 * Ne_NTotal + 0.03 * CF4_NTotal + 0.02 * iBut_NTotal;
0118 break;
0119 }
0120
0121 case TPC_Gas::NeCF4_100:
0122 {
0123 if (verbosity)
0124 cout << "Gas Choice: TPC_Gas::NeCF4_100" << endl;
0125 TPCDriftVelocity = 4.0 / 1000.0;
0126 TPC_Trans_Diffusion = 0.0045;
0127 TPC_Long_Diffusion = 0.0270;
0128 TPC_dEdx = 0.90 * Ne_dEdx + 0.10 * CF4_dEdx;
0129 TPC_NPri = 0.90 * Ne_NPrimary + 0.10 * CF4_NPrimary;
0130 TPC_NTot = 0.90 * Ne_NTotal + 0.10 * CF4_NTotal;
0131 break;
0132 }
0133 case TPC_Gas::NeCF4_300:
0134 {
0135 if (verbosity)
0136 cout << "Gas Choice: TPC_Gas::NeCF4_300" << endl;
0137 TPCDriftVelocity = 7.0 / 1000.0;
0138 TPC_Trans_Diffusion = 0.0052;
0139 TPC_Long_Diffusion = 0.0170;
0140 TPC_dEdx = 0.90 * Ne_dEdx + 0.10 * CF4_dEdx;
0141 TPC_NPri = 0.90 * Ne_NPrimary + 0.10 * CF4_NPrimary;
0142 TPC_NTot = 0.90 * Ne_NTotal + 0.10 * CF4_NTotal;
0143 break;
0144 }
0145 case TPC_Gas::NeCF4_400:
0146 {
0147 if (verbosity)
0148 cout << "Gas Choice: TPC_Gas::NeCF4_400" << endl;
0149 TPCDriftVelocity = 8.0 / 1000.0;
0150 TPC_Trans_Diffusion = 0.0060;
0151 TPC_Long_Diffusion = 0.0150;
0152 TPC_dEdx = 0.90 * Ne_dEdx + 0.10 * CF4_dEdx;
0153 TPC_NPri = 0.90 * Ne_NPrimary + 0.10 * CF4_NPrimary;
0154 TPC_NTot = 0.90 * Ne_NTotal + 0.10 * CF4_NTotal;
0155 break;
0156 }
0157 case TPC_Gas::ByHand:
0158 {
0159 if (verbosity)
0160 cout << "Gas Choice: TPC_Gas::ByHand" << endl;
0161 TPCDriftVelocity = 6.0 / 1000.0;
0162 TPC_Trans_Diffusion = 0.0130;
0163 TPC_Long_Diffusion = 0.0130;
0164 TPC_ElectronsPerKeV = 28.0;
0165 TPC_dEdx = 0.90 * Ne_dEdx + 0.10 * CF4_dEdx;
0166 TPC_NPri = 0.90 * Ne_NPrimary + 0.10 * CF4_NPrimary;
0167 TPC_NTot = TPC_ElectronsPerKeV * TPC_dEdx;
0168 break;
0169 }
0170 default:
0171 {
0172 if (verbosity)
0173 cout << "Gas Choice Undefined...using TPC_Gas::NeCF4_400" << endl;
0174 TPCDriftVelocity = 8.0 / 1000.0;
0175 TPC_Trans_Diffusion = 0.0060;
0176 TPC_Long_Diffusion = 0.0150;
0177 TPC_dEdx = 0.90 * Ne_dEdx + 0.10 * CF4_dEdx;
0178 TPC_NPri = 0.90 * Ne_NPrimary + 0.10 * CF4_NPrimary;
0179 TPC_NTot = 0.90 * Ne_NTotal + 0.10 * CF4_NTotal;
0180 break;
0181 }
0182 }
0183
0184 TPC_ElectronsPerKeV = TPC_NTot / TPC_dEdx;
0185
0186
0187
0188
0189
0190
0191 TPCADCClock = 53.0;
0192 TPCShapingRMSLead = 16.0;
0193 TPCShapingRMSTail = 24.0;
0194
0195 tpc_cell_z = TPCADCClock * TPCDriftVelocity;
0196
0197
0198
0199 TPC_SmearRPhi = 0.10;
0200 TPC_SmearZ = 0.15;
0201 }
0202
0203 double Svtx(PHG4Reco* g4Reco, double radius,
0204 const int absorberactive = 0,
0205 int verbosity = 0)
0206 {
0207 if (n_maps_layer > 0)
0208 {
0209 bool maps_overlapcheck = false;
0210
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224
0225 double maps_layer_radius[3] = {23.4, 31.5, 39.3};
0226
0227
0228
0229
0230 int stave_type[3] = {0, 0, 0};
0231 int staves_in_layer[3] = {12, 16, 20};
0232 double phi_tilt[3] = {0.304, 0.304, 0.304};
0233
0234 for (int ilayer = 0; ilayer < n_maps_layer; ilayer++)
0235 {
0236 if (verbosity)
0237 cout << "Create Maps layer " << ilayer << " with radius " << maps_layer_radius[ilayer] << " mm, stave type " << stave_type[ilayer]
0238 << " pixel size 30 x 30 microns "
0239 << " active pixel thickness 0.0018 microns" << endl;
0240
0241 PHG4MapsSubsystem* lyr = new PHG4MapsSubsystem("MAPS", ilayer, stave_type[ilayer]);
0242 lyr->Verbosity(verbosity);
0243
0244 lyr->set_double_param("layer_nominal_radius", maps_layer_radius[ilayer]);
0245 lyr->set_int_param("N_staves", staves_in_layer[ilayer]);
0246
0247
0248 lyr->set_double_param("pixel_x", 0.0030);
0249 lyr->set_double_param("pixel_z", 0.0030);
0250 lyr->set_double_param("pixel_thickness", 0.0018);
0251 lyr->set_double_param("phitilt", phi_tilt[ilayer]);
0252
0253 lyr->set_int_param("active", 1);
0254 lyr->OverlapCheck(maps_overlapcheck);
0255
0256 lyr->set_string_param("stave_geometry_file",
0257 string(getenv("CALIBRATIONROOT")) + string("/Tracking/geometry/ALICE_ITS_tgeo.gdml"));
0258
0259 g4Reco->registerSubsystem(lyr);
0260
0261 radius = maps_layer_radius[ilayer];
0262 }
0263 }
0264
0265 if (n_intt_layer > 0)
0266 {
0267
0268
0269
0270
0271 bool intt_overlapcheck = false;
0272
0273
0274
0275
0276
0277
0278
0279 const double intt_radius_max = 140.;
0280
0281
0282 std::vector<std::pair<int, int>> vpair;
0283 for (int i = 0; i < n_intt_layer; i++)
0284 {
0285
0286 vpair.push_back(std::make_pair(n_maps_layer + i, i));
0287 if (verbosity) cout << "Create strip tracker layer " << vpair[i].second << " as sphenix layer " << vpair[i].first << endl;
0288 }
0289 PHG4SiliconTrackerSubsystem* sitrack = new PHG4SiliconTrackerSubsystem("SILICON_TRACKER", vpair);
0290 sitrack->Verbosity(verbosity);
0291 sitrack->SetActive(1);
0292 sitrack->OverlapCheck(intt_overlapcheck);
0293 g4Reco->registerSubsystem(sitrack);
0294
0295
0296 radius = intt_radius_max * 0.1;
0297 }
0298
0299
0300
0301 PHG4CylinderSubsystem* cyl;
0302
0303 radius = inner_cage_radius;
0304
0305 double cage_length = 211.0;
0306 double n_rad_length_cage = 1.13e-02;
0307 double cage_thickness = 28.6 * n_rad_length_cage;
0308
0309
0310 cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer);
0311 cyl->set_double_param("radius", radius);
0312 cyl->set_int_param("lengthviarapidity", 0);
0313 cyl->set_double_param("length", cage_length);
0314 cyl->set_string_param("material", "G4_KAPTON");
0315 cyl->set_double_param("thickness", cage_thickness);
0316 cyl->SuperDetector("SVTXSUPPORT");
0317 cyl->Verbosity(0);
0318 g4Reco->registerSubsystem(cyl);
0319
0320 radius += cage_thickness;
0321
0322 double inner_readout_radius = 30.;
0323 if (inner_readout_radius < radius) inner_readout_radius = radius;
0324
0325 string tpcgas = "sPHENIX_TPC_Gas";
0326
0327
0328 if (inner_readout_radius - radius > 0)
0329 {
0330 cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer + 1);
0331 cyl->set_double_param("radius", radius);
0332 cyl->set_int_param("lengthviarapidity", 0);
0333 cyl->set_double_param("length", cage_length);
0334 cyl->set_string_param("material", tpcgas.c_str());
0335 cyl->set_double_param("thickness", inner_readout_radius - radius);
0336 cyl->SuperDetector("SVTXSUPPORT");
0337 g4Reco->registerSubsystem(cyl);
0338 }
0339
0340 radius = inner_readout_radius;
0341
0342 double outer_radius = 78.;
0343
0344
0345
0346
0347
0348 for (int ilayer = n_maps_layer + n_intt_layer; ilayer < (n_maps_layer + n_intt_layer + n_tpc_layer_inner); ++ilayer)
0349 {
0350 if (verbosity)
0351 cout << "Create TPC gas layer " << ilayer << " with inner radius " << radius << " cm "
0352 << " thickness " << tpc_layer_thick_inner - 0.01 << " length " << cage_length << endl;
0353
0354 cyl = new PHG4CylinderSubsystem("SVTX", ilayer);
0355 cyl->set_double_param("radius", radius);
0356 cyl->set_int_param("lengthviarapidity", 0);
0357 cyl->set_double_param("length", cage_length);
0358 cyl->set_string_param("material", tpcgas.c_str());
0359 cyl->set_double_param("thickness", tpc_layer_thick_inner - 0.01);
0360 cyl->SetActive();
0361 cyl->SuperDetector("SVTX");
0362 g4Reco->registerSubsystem(cyl);
0363
0364 radius += tpc_layer_thick_inner;
0365 }
0366
0367
0368
0369 for (int ilayer = n_maps_layer + n_intt_layer + n_tpc_layer_inner; ilayer < (n_maps_layer + n_intt_layer + n_tpc_layer_inner + n_tpc_layer_mid); ++ilayer)
0370 {
0371 if (verbosity)
0372 cout << "Create TPC gas layer " << ilayer << " with inner radius " << radius << " cm "
0373 << " thickness " << tpc_layer_thick_mid - 0.01 << " length " << cage_length << endl;
0374
0375 cyl = new PHG4CylinderSubsystem("SVTX", ilayer);
0376 cyl->set_double_param("radius", radius);
0377 cyl->set_int_param("lengthviarapidity", 0);
0378 cyl->set_double_param("length", cage_length);
0379 cyl->set_string_param("material", tpcgas.c_str());
0380 cyl->set_double_param("thickness", tpc_layer_thick_mid - 0.01);
0381 cyl->SetActive();
0382 cyl->SuperDetector("SVTX");
0383 g4Reco->registerSubsystem(cyl);
0384
0385 radius += tpc_layer_thick_mid;
0386 }
0387
0388
0389
0390 for (int ilayer = n_maps_layer + n_intt_layer + n_tpc_layer_inner + n_tpc_layer_mid; ilayer < (n_maps_layer + n_intt_layer + n_tpc_layer_inner + n_tpc_layer_mid + n_tpc_layer_outer); ++ilayer)
0391 {
0392 if (verbosity)
0393 cout << "Create TPC gas layer " << ilayer << " with inner radius " << radius << " cm "
0394 << " thickness " << tpc_layer_thick_outer - 0.01 << " length " << cage_length << endl;
0395
0396 cyl = new PHG4CylinderSubsystem("SVTX", ilayer);
0397 cyl->set_double_param("radius", radius);
0398 cyl->set_int_param("lengthviarapidity", 0);
0399 cyl->set_double_param("length", cage_length);
0400 cyl->set_string_param("material", tpcgas.c_str());
0401 cyl->set_double_param("thickness", tpc_layer_thick_outer - 0.01);
0402 cyl->SetActive();
0403 cyl->SuperDetector("SVTX");
0404 g4Reco->registerSubsystem(cyl);
0405
0406 radius += tpc_layer_thick_outer;
0407 }
0408
0409
0410 cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer + n_gas_layer);
0411 cyl->set_double_param("radius", radius);
0412 cyl->set_int_param("lengthviarapidity", 0);
0413 cyl->set_double_param("length", cage_length);
0414 cyl->set_string_param("material", "G4_KAPTON");
0415 cyl->set_double_param("thickness", cage_thickness);
0416 cyl->SuperDetector("SVTXSUPPORT");
0417 g4Reco->registerSubsystem(cyl);
0418
0419 radius += cage_thickness;
0420
0421 return radius;
0422 }
0423
0424 void Svtx_Cells(int verbosity = 0)
0425 {
0426
0427
0428
0429
0430
0431
0432
0433 gSystem->Load("libfun4all.so");
0434 gSystem->Load("libg4detectors.so");
0435
0436
0437
0438
0439
0440 Fun4AllServer* se = Fun4AllServer::instance();
0441
0442
0443
0444
0445
0446 if (verbosity)
0447 {
0448 cout << " TPC Drift Velocity: " << TPCDriftVelocity << " cm/nsec" << endl;
0449 cout << " TPC Transverse Diffusion: " << TPC_Trans_Diffusion << " cm/SQRT(cm)" << endl;
0450 cout << " TPC Longitudinal Diffusion: " << TPC_Long_Diffusion << " cm/SQRT(cm)" << endl;
0451 cout << " TPC dE/dx: " << TPC_dEdx << " keV/cm" << endl;
0452 cout << " TPC N Primary: " << TPC_NPri << " electrons/cm" << endl;
0453 cout << " TPC N Total: " << TPC_NTot << " electrons/cm" << endl;
0454 cout << " TPC Electrons Per keV: " << TPC_ElectronsPerKeV << " electrons/keV" << endl;
0455 cout << " TPC ADC Clock: " << TPCADCClock << " nsec" << endl;
0456 cout << " TPC ADC Rate: " << 1000.0 / TPCADCClock << " MHZ" << endl;
0457 cout << " TPC Shaping Lead: " << TPCShapingRMSLead << " nsec" << endl;
0458 cout << " TPC Shaping Tail: " << TPCShapingRMSTail << " nsec" << endl;
0459 cout << " TPC z cell " << tpc_cell_z << " cm" << endl;
0460 cout << " TPC Smear R-Phi " << TPC_SmearRPhi << " cm" << endl;
0461 cout << " TPC Smear Z " << TPC_SmearZ << " cm" << endl;
0462 }
0463
0464 if (n_maps_layer > 0)
0465 {
0466
0467 PHG4MapsCellReco* maps_cells = new PHG4MapsCellReco("MAPS");
0468 maps_cells->Verbosity(verbosity);
0469 for (int ilayer = 0; ilayer < n_maps_layer; ilayer++)
0470 {
0471 maps_cells->set_timing_window(ilayer, -2000, 2000);
0472 }
0473 se->registerSubsystem(maps_cells);
0474 }
0475
0476 if (n_intt_layer > 0)
0477 {
0478
0479 PHG4SiliconTrackerCellReco* reco = new PHG4SiliconTrackerCellReco("SILICON_TRACKER");
0480
0481 reco->Verbosity(verbosity);
0482 se->registerSubsystem(reco);
0483 }
0484
0485
0486 if (n_gas_layer == 60)
0487 {
0488 TPCDriftVelocity = 6.0 / 1000.0;
0489 tpc_cell_x = 0.12;
0490 tpc_cell_y = 0.17;
0491 }
0492
0493
0494 const bool do_tpc_distortion = true;
0495 PHG4TPCSpaceChargeDistortion* tpc_distortion = NULL;
0496 if (do_tpc_distortion)
0497 {
0498 if (inner_cage_radius != 20. && inner_cage_radius != 30.)
0499 {
0500 cout << "Svtx_Cells - Fatal Error - TPC distortion required that "
0501 "inner_cage_radius is either 20 or 30 cm."
0502 << endl;
0503 exit(3);
0504 }
0505
0506 string TPC_distortion_file =
0507 string(getenv("CALIBRATIONROOT")) +
0508 Form("/Tracking/TPC/SpaceChargeDistortion/TPCCAGE_20_78_211_2.root");
0509 PHG4TPCSpaceChargeDistortion* tpc_distortion =
0510 new PHG4TPCSpaceChargeDistortion(TPC_distortion_file);
0511
0512
0513 }
0514
0515 PHG4CylinderCellTPCReco* svtx_cells = new PHG4CylinderCellTPCReco(n_maps_layer + n_intt_layer);
0516 svtx_cells->Detector("SVTX");
0517 svtx_cells->setDistortion(tpc_distortion);
0518 if (n_gas_layer != 60)
0519 {
0520 svtx_cells->setDiffusionT(TPC_Trans_Diffusion);
0521 svtx_cells->setDiffusionL(TPC_Long_Diffusion);
0522 svtx_cells->setSigmaT(TPC_SigmaT);
0523
0524 svtx_cells->setShapingRMSLead(TPCShapingRMSLead * TPCDriftVelocity);
0525 svtx_cells->setShapingRMSTail(TPCShapingRMSTail * TPCDriftVelocity);
0526
0527
0528
0529 svtx_cells->setSmearRPhi(TPC_SmearRPhi);
0530 svtx_cells->setSmearZ(TPC_SmearZ);
0531 }
0532 else
0533 {
0534
0535 svtx_cells->setDiffusionT(0.0120);
0536 svtx_cells->setDiffusionL(0.0120);
0537 svtx_cells->setSmearRPhi(0.09);
0538 svtx_cells->setSmearZ(0.06);
0539 }
0540 svtx_cells->set_drift_velocity(TPCDriftVelocity);
0541 svtx_cells->setHalfLength(105.5);
0542 svtx_cells->setElectronsPerKeV(TPC_ElectronsPerKeV);
0543 svtx_cells->Verbosity(0);
0544
0545
0546
0547
0548
0549
0550
0551 double tpc_timing_window = 105.5 / TPCDriftVelocity;
0552
0553
0554 double radius_layer = inner_readout_radius + tpc_layer_thick_inner / 2.0;
0555 int counter_layer = 0;
0556 for (int i = n_maps_layer + n_intt_layer; i < n_maps_layer + n_intt_layer + n_tpc_layer_inner; i++)
0557 {
0558
0559 if (counter_layer > 0)
0560 radius_layer += tpc_layer_thick_inner;
0561 double tpc_cell_rphi = 2 * TMath::Pi() * radius_layer / (double) tpc_layer_rphi_count_inner;
0562 svtx_cells->cellsize(i, tpc_cell_rphi, tpc_cell_z);
0563 svtx_cells->set_timing_window(i, -tpc_timing_window, +tpc_timing_window);
0564 if (verbosity)
0565 cout << "TPC cells inner: layer " << i << " center radius " << radius_layer << " tpc_cell_rphi " << tpc_cell_rphi << " tpc_cell_z " << tpc_cell_z << endl;
0566 counter_layer++;
0567 }
0568 radius_layer += tpc_layer_thick_inner / 2.0;
0569
0570
0571 radius_layer += tpc_layer_thick_mid / 2.0;
0572 counter_layer = 0;
0573 for (int i = n_maps_layer + n_intt_layer + n_tpc_layer_inner; i < n_maps_layer + n_intt_layer + n_tpc_layer_inner + n_tpc_layer_mid; i++)
0574 {
0575 if (counter_layer > 0)
0576 radius_layer += tpc_layer_thick_mid;
0577 double tpc_cell_rphi = 2 * TMath::Pi() * radius_layer / (double) tpc_layer_rphi_count_mid;
0578 svtx_cells->cellsize(i, tpc_cell_rphi, tpc_cell_z);
0579 svtx_cells->set_timing_window(i, -tpc_timing_window, +tpc_timing_window);
0580 if (verbosity)
0581 cout << "TPC cells mid: layer " << i << " center radius " << radius_layer << " tpc_cell_rphi " << tpc_cell_rphi << " tpc_cell_z " << tpc_cell_z << endl;
0582 counter_layer++;
0583 }
0584 radius_layer += tpc_layer_thick_mid / 2.0;
0585
0586
0587 radius_layer += tpc_layer_thick_outer / 2.0;
0588 counter_layer = 0;
0589 for (int i = n_maps_layer + n_intt_layer + n_tpc_layer_inner + n_tpc_layer_mid; i < n_maps_layer + n_intt_layer + n_tpc_layer_inner + n_tpc_layer_mid + n_tpc_layer_outer; i++)
0590 {
0591 if (counter_layer > 0)
0592 radius_layer += tpc_layer_thick_outer;
0593 double tpc_cell_rphi = 2 * TMath::Pi() * radius_layer / (double) tpc_layer_rphi_count_outer;
0594 svtx_cells->cellsize(i, tpc_cell_rphi, tpc_cell_z);
0595 svtx_cells->set_timing_window(i, -tpc_timing_window, +tpc_timing_window);
0596 if (verbosity)
0597 cout << "TPC cells outer: layer " << i << " center radius " << radius_layer << " tpc_cell_rphi " << tpc_cell_rphi << " tpc_cell_z " << tpc_cell_z << endl;
0598 counter_layer++;
0599 }
0600
0601 se->registerSubsystem(svtx_cells);
0602
0603 return;
0604 }
0605
0606 void Svtx_Reco(int verbosity = 0)
0607 {
0608
0609
0610
0611
0612 gSystem->Load("libfun4all.so");
0613 gSystem->Load("libg4hough.so");
0614
0615
0616
0617
0618
0619 Fun4AllServer* se = Fun4AllServer::instance();
0620
0621
0622
0623
0624 PHG4SvtxDigitizer* digi = new PHG4SvtxDigitizer();
0625 digi->Verbosity(0);
0626 for (int i = 0; i < n_maps_layer; ++i)
0627 {
0628 digi->set_adc_scale(i, 255, 0.4e-6);
0629 }
0630
0631 if (n_intt_layer > 0)
0632 {
0633
0634 std::vector<double> userrange;
0635
0636 userrange.push_back(0.05);
0637 userrange.push_back(0.10);
0638 userrange.push_back(0.15);
0639 userrange.push_back(0.20);
0640 userrange.push_back(0.25);
0641 userrange.push_back(0.30);
0642 userrange.push_back(0.35);
0643 userrange.push_back(0.40);
0644
0645 PHG4SiliconTrackerDigitizer* digiintt = new PHG4SiliconTrackerDigitizer();
0646 digiintt->Verbosity(verbosity);
0647 for (int i = 0; i < n_intt_layer; i++)
0648 {
0649 digiintt->set_adc_scale(n_maps_layer + i, userrange);
0650 }
0651 se->registerSubsystem(digiintt);
0652 }
0653
0654
0655 for (int i = n_maps_layer + n_intt_layer; i < Max_si_layer; ++i)
0656 {
0657 digi->set_adc_scale(i, 30000, 1.0);
0658 }
0659 se->registerSubsystem(digi);
0660
0661
0662
0663
0664
0665
0666 PHG4SvtxDeadArea* deadarea = new PHG4SvtxDeadArea();
0667
0668 for (int i = 0; i < n_maps_layer; i++)
0669 {
0670 deadarea->Verbosity(verbosity);
0671
0672 deadarea->set_hit_efficiency(i, 1.0);
0673 }
0674 for (int i = n_maps_layer; i < n_maps_layer + n_intt_layer; i++)
0675 {
0676
0677 deadarea->set_hit_efficiency(i, 1.0);
0678 }
0679 se->registerSubsystem(deadarea);
0680
0681
0682
0683
0684
0685 PHG4SvtxThresholds* thresholds = new PHG4SvtxThresholds();
0686 thresholds->Verbosity(verbosity);
0687
0688
0689 for (int i = 0; i < n_maps_layer; i++)
0690 {
0691
0692
0693 thresholds->set_threshold(i, 0.1);
0694 }
0695
0696 for (int i = n_maps_layer; i < n_maps_layer + n_intt_layer; i++)
0697 {
0698 thresholds->set_threshold(i, 0.1);
0699 thresholds->set_use_thickness_mip(i, true);
0700 }
0701
0702 se->registerSubsystem(thresholds);
0703
0704
0705
0706
0707
0708 PHG4SvtxClusterizer* clusterizer = new PHG4SvtxClusterizer("PHG4SvtxClusterizer", 0, n_maps_layer + n_intt_layer - 1);
0709 clusterizer->Verbosity(verbosity);
0710
0711
0712 clusterizer->set_threshold(0.1);
0713
0714 for (int i = n_maps_layer; i < n_maps_layer + n_intt_layer; i++)
0715 {
0716 clusterizer->set_z_clustering(i, false);
0717 }
0718
0719 se->registerSubsystem(clusterizer);
0720
0721 PHG4TPCClusterizer* tpcclusterizer = new PHG4TPCClusterizer();
0722 tpcclusterizer->Verbosity(0);
0723 tpcclusterizer->setRangeLayers(n_maps_layer + n_intt_layer, Max_si_layer);
0724 if (n_gas_layer == 40)
0725 {
0726 tpcclusterizer->setEnergyCut(12 );
0727 tpcclusterizer->setFitWindowSigmas(0.0160, 0.0160);
0728 tpcclusterizer->setFitWindowMax(4 , 6 );
0729 tpcclusterizer->setFitEnergyThreshold(0.05 );
0730 }
0731 else
0732 {
0733
0734 tpcclusterizer->setEnergyCut(15 );
0735 tpcclusterizer->setFitWindowSigmas(0.0150, 0.0160);
0736 tpcclusterizer->setFitWindowMax(4 , 3 );
0737 tpcclusterizer->setFitEnergyThreshold(0.05 );
0738 }
0739 se->registerSubsystem(tpcclusterizer);
0740
0741
0742 const bool use_kalman_pat_rec = true;
0743 if (use_kalman_pat_rec)
0744 {
0745
0746
0747
0748
0749 PHG4KalmanPatRec* kalman_pat_rec = new PHG4KalmanPatRec("PHG4KalmanPatRec", n_maps_layer, n_intt_layer, n_gas_layer);
0750 kalman_pat_rec->Verbosity(0);
0751 se->registerSubsystem(kalman_pat_rec);
0752 }
0753 else
0754 {
0755
0756
0757
0758 PHG4TruthPatRec* pat_rec = new PHG4TruthPatRec();
0759 se->registerSubsystem(pat_rec);
0760 }
0761
0762
0763
0764
0765
0766 PHG4TrackKalmanFitter* kalman = new PHG4TrackKalmanFitter();
0767 kalman->Verbosity(0);
0768 if (use_primary_vertex)
0769 kalman->set_fit_primary_tracks(true);
0770 se->registerSubsystem(kalman);
0771
0772
0773
0774
0775 PHG4GenFitTrackProjection* projection = new PHG4GenFitTrackProjection();
0776 projection->Verbosity(verbosity);
0777 se->registerSubsystem(projection);
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788 return;
0789 }
0790
0791 void G4_Svtx_Reco()
0792 {
0793 cout << "\033[31;1m"
0794 << "Warning: G4_Svtx_Reco() was moved to G4_Svtx.C and renamed to Svtx_Reco(), please update macros"
0795 << "\033[0m" << endl;
0796 Svtx_Reco();
0797
0798 return;
0799 }
0800
0801 void Svtx_Eval(std::string outputfile, int verbosity = 0)
0802 {
0803
0804
0805
0806
0807 gSystem->Load("libfun4all.so");
0808 gSystem->Load("libg4detectors.so");
0809 gSystem->Load("libg4hough.so");
0810 gSystem->Load("libg4eval.so");
0811
0812
0813
0814
0815
0816 Fun4AllServer* se = Fun4AllServer::instance();
0817
0818
0819
0820
0821
0822 SvtxEvaluator* eval;
0823 eval = new SvtxEvaluator("SVTXEVALUATOR", outputfile.c_str());
0824 eval->do_cluster_eval(true);
0825 eval->do_g4hit_eval(true);
0826 eval->do_hit_eval(false);
0827 eval->do_gpoint_eval(false);
0828 eval->scan_for_embedded(false);
0829 eval->Verbosity(verbosity);
0830 se->registerSubsystem(eval);
0831
0832 if (use_primary_vertex)
0833 {
0834
0835
0836 SvtxEvaluator* evalp;
0837 evalp = new SvtxEvaluator("SVTXEVALUATOR", string(outputfile.c_str()) + "_primary_eval.root", "PrimaryTrackMap");
0838 evalp->do_cluster_eval(true);
0839 evalp->do_g4hit_eval(true);
0840 evalp->do_hit_eval(false);
0841 evalp->do_gpoint_eval(false);
0842 evalp->scan_for_embedded(true);
0843 evalp->Verbosity(0);
0844 se->registerSubsystem(evalp);
0845 }
0846
0847
0848
0849
0850 return;
0851 }