File indexing completed on 2025-08-06 08:12:55
0001 #include "G4_TPC.C"
0002
0003 const int n_ib_layer = 3;
0004 const int n_intt_layer = 4;
0005 const int n_gas_layer = 40;
0006
0007 int Min_si_layer = 0;
0008 int Max_si_layer = n_ib_layer + n_intt_layer + n_gas_layer;
0009
0010 void SvtxInit(int verbosity = 0)
0011 {
0012 Min_si_layer = 0;
0013 Max_si_layer = n_ib_layer + n_intt_layer + n_gas_layer;
0014 }
0015
0016 double Svtx(PHG4Reco* g4Reco, double radius,
0017 const int absorberactive = 0,
0018 int verbosity = 0) {
0019
0020 float svtx_inner_radius = 2.3;
0021
0022 if (radius > svtx_inner_radius) {
0023 cout << "inconsistency: radius: " << radius
0024 << " larger than SVTX inner radius: " << svtx_inner_radius << endl;
0025 gSystem->Exit(-1);
0026 }
0027
0028 PHG4CylinderSubsystem *cyl;
0029
0030
0031
0032
0033
0034 double ib_si_thickness[3] = {0.0050, 0.0050, 0.0050};
0035 double ib_rad[3] = {svtx_inner_radius, 3.2, 3.9};
0036 double ib_support_thickness[3] = {0.0036, 0.0036, 0.0036};
0037 double ib_length[3] = {27.0, 27.0, 27.0};
0038
0039 for (int ilayer=0;ilayer<n_ib_layer;++ilayer) {
0040 cyl = new PHG4CylinderSubsystem("SVTX", ilayer);
0041 cyl->Verbosity(verbosity);
0042 radius = ib_rad[ilayer];
0043 cyl->set_double_param("radius",radius);
0044
0045 cyl->set_double_param("length",ib_length[ilayer]);
0046 cyl->set_string_param("material","G4_Si");
0047 cyl->set_double_param("thickness",ib_si_thickness[ilayer]);
0048 cyl->SetActive();
0049 cyl->SuperDetector("SVTX");
0050 g4Reco->registerSubsystem( cyl );
0051
0052 radius += ib_si_thickness[ilayer] + no_overlapp;
0053
0054 cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", ilayer);
0055 cyl->Verbosity(verbosity);
0056 cyl->set_double_param("radius",radius);
0057
0058 cyl->set_double_param("length",ib_length[ilayer]);
0059 cyl->set_string_param("material","G4_Cu");
0060 cyl->set_double_param("thickness",ib_support_thickness[ilayer]);
0061 cyl->SuperDetector("SVTXSUPPORT");
0062 g4Reco->registerSubsystem( cyl );
0063
0064 cout << "Added inner barrel layer with radius " << ib_rad[ilayer]
0065 << " si thickness " << ib_si_thickness[ilayer]
0066 << " support thickness " << ib_support_thickness[ilayer]
0067 << " length " << ib_length[ilayer]
0068 << endl;
0069 }
0070
0071
0072
0073 double intt_si_thickness[4] = {0.0120, 0.0120, 0.0120,0.0120};
0074 double intt_rad[4] = { 6.0, 8.0, 10.0, 12.0};
0075
0076 double multiplier = 0.87;
0077 double apercent = 0.0144;
0078 double intt_support_thickness[4] = {apercent*multiplier, apercent*multiplier, apercent*multiplier, apercent*multiplier};
0079 double intt_length[4] = {50.0, 50.0, 50.0, 50.0};
0080
0081 for (int ilayer=n_ib_layer;ilayer<n_intt_layer+n_ib_layer;++ilayer) {
0082 cyl = new PHG4CylinderSubsystem("SVTX", ilayer);
0083 cyl->Verbosity(verbosity);
0084 radius = intt_rad[ilayer-n_ib_layer];
0085 cyl->set_double_param("radius",radius);
0086 cyl->set_int_param("lengthviarapidity",1);
0087
0088 cyl->set_string_param("material","G4_Si");
0089 cyl->set_double_param("thickness",intt_si_thickness[ilayer-n_ib_layer]);
0090 cyl->SetActive();
0091 cyl->SuperDetector("SVTX");
0092 g4Reco->registerSubsystem( cyl );
0093
0094 radius += intt_si_thickness[ilayer-n_ib_layer] + no_overlapp;
0095
0096 cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", ilayer);
0097 cyl->Verbosity(verbosity);
0098 cyl->set_double_param("radius",radius);
0099 cyl->set_int_param("lengthviarapidity",1);
0100
0101 cyl->set_string_param("material","G4_Cu");
0102 cyl->set_double_param("thickness",intt_support_thickness[ilayer-n_ib_layer]);
0103 cyl->SuperDetector("SVTXSUPPORT");
0104 g4Reco->registerSubsystem( cyl );
0105
0106 cout << "Added intermediate tracker layer with radius " << intt_rad[ilayer-n_ib_layer]
0107 << " si thickness " << intt_si_thickness[ilayer-n_ib_layer]
0108 << " support thickness " << intt_support_thickness[ilayer-n_ib_layer]
0109 << " length " << intt_length[ilayer-n_ib_layer]
0110 << endl;
0111 }
0112
0113
0114 radius = AddTPC2G4Geo(g4Reco,radius,0);
0115
0116 return radius;
0117 }
0118
0119 void Svtx_Cells(int verbosity = 0)
0120 {
0121
0122
0123
0124
0125
0126
0127
0128 gSystem->Load("libfun4all.so");
0129 gSystem->Load("libg4detectors.so");
0130
0131
0132
0133
0134
0135 Fun4AllServer *se = Fun4AllServer::instance();
0136
0137
0138
0139
0140
0141
0142 double svxcellsizex[3] = {0.0020, 0.0020, 0.0020};
0143 double svxcellsizey[3] = {0.0020, 0.0020, 0.0020};
0144
0145
0146 double intt_cellsizex[4] = { 0.0080, 0.0080, 0.0080, 0.0080};
0147 double intt_cellsizey[4] = { 1.2, 1.2, 1.2, 1.2};
0148
0149 PHG4CylinderCellTPCReco *svtx_cells = new PHG4CylinderCellTPCReco(n_ib_layer+n_intt_layer);
0150 svtx_cells->Verbosity(1);
0151 svtx_cells->Detector("SVTX");
0152
0153 for (int i=0;i<n_ib_layer;++i) {
0154 svtx_cells->cellsize(i, svxcellsizex[i], svxcellsizey[i]);
0155 svtx_cells->set_timing_window(i, -2000.0, +2000.0);
0156 }
0157 for (int i=n_ib_layer;i<n_ib_layer+n_intt_layer;++i) {
0158 svtx_cells->cellsize(i, intt_cellsizex[i-n_ib_layer], intt_cellsizey[i-n_ib_layer]);
0159 svtx_cells->set_timing_window(i, -50.0, +50.0);
0160 }
0161
0162
0163 AddTPC2CellReco(svtx_cells);
0164
0165 se->registerSubsystem(svtx_cells);
0166 return;
0167 }
0168
0169 void Svtx_Reco(int verbosity = 0)
0170 {
0171
0172
0173
0174
0175 gSystem->Load("libfun4all.so");
0176 gSystem->Load("libg4hough.so");
0177
0178
0179
0180
0181
0182 Fun4AllServer *se = Fun4AllServer::instance();
0183
0184
0185
0186
0187 PHG4SvtxDigitizer* digi = new PHG4SvtxDigitizer();
0188 digi->Verbosity(0);
0189 for (int i=0;i<n_ib_layer+n_intt_layer;++i) {
0190 digi->set_adc_scale(i, 255, 1.0e-6);
0191 }
0192 se->registerSubsystem( digi );
0193
0194
0195
0196
0197
0198
0199 PHG4SvtxDeadArea* deadarea = new PHG4SvtxDeadArea();
0200 deadarea->Verbosity(verbosity);
0201 for(int i=0;i<n_ib_layer;i++)
0202 deadarea->set_hit_efficiency(i,0.99);
0203
0204 for(int i=n_ib_layer;i<n_ib_layer+n_intt_layer;i++)
0205 deadarea->set_hit_efficiency(i-n_ib_layer,0.99);
0206
0207 se->registerSubsystem( deadarea );
0208
0209
0210
0211
0212
0213 PHG4SvtxThresholds* thresholds = new PHG4SvtxThresholds();
0214 thresholds->Verbosity(verbosity);
0215 for(int i=0;i<n_ib_layer;i++)
0216 thresholds->set_threshold(i,0.25);
0217
0218 for(int i=n_ib_layer;i<n_ib_layer+n_intt_layer;i++)
0219 thresholds->set_threshold(i,0.25);
0220
0221 se->registerSubsystem( thresholds );
0222
0223
0224
0225
0226
0227 PHG4SvtxClusterizer* clusterizer = new PHG4SvtxClusterizer("PHG4SvtxClusterizer",Min_si_layer,n_ib_layer+n_intt_layer-1);
0228 clusterizer->set_threshold(0.25);
0229 se->registerSubsystem( clusterizer );
0230
0231
0232
0233
0234 PHG4HoughTransformTPC* hough = new PHG4HoughTransformTPC(Max_si_layer,Max_si_layer-30);
0235 hough->set_mag_field(1.4);
0236 hough->setPtRescaleFactor(1.00/0.993892);
0237 hough->set_use_vertex(true);
0238 hough->setRemoveHits(true);
0239 hough->setRejectGhosts(true);
0240 hough->set_min_pT(0.2);
0241 hough->set_chi2_cut_full( 2.0 );
0242 hough->set_chi2_cut_init( 2.0 );
0243
0244 hough->setBinScale(1.0);
0245 hough->setZBinScale(1.0);
0246
0247 hough->Verbosity(verbosity);
0248
0249 double mat_scale = 1.0;
0250
0251 for(int i=0;i<n_ib_layer;i++)
0252 hough->set_material(i, mat_scale*0.003);
0253
0254 for(int i=n_ib_layer;i<n_ib_layer+n_intt_layer;i++)
0255 hough->set_material(i-n_ib_layer, mat_scale*0.010);
0256
0257
0258 for (int i=0;i<n_ib_layer+n_intt_layer;++i) {
0259 hough->setVoteErrorScale(i, 1.0);
0260 }
0261 for (int i=0;i<n_ib_layer+n_intt_layer;++i) {
0262 hough->setFitErrorScale(i, 1./sqrt(12.));
0263 }
0264
0265
0266 AddTPC2Reco(digi,hough);
0267
0268 se->registerSubsystem( hough );
0269
0270
0271
0272
0273 TF1 *corr = new TF1("corr","1.0/(1+0.00908642+5.91337e-05*x+-1.87201e-05*x*x+-3.31928e-06*x*x*x+1.03004e-07*x*x*x*x+-1.05111e-09*x*x*x*x*x)",0.0,40.0);
0274 PHG4SvtxMomentumRecal* recal = new PHG4SvtxMomentumRecal("PHG4SvtxMomentumRecal",corr);
0275 se->registerSubsystem(recal);
0276
0277
0278
0279
0280 PHG4SvtxTrackProjection* projection = new PHG4SvtxTrackProjection();
0281 projection->Verbosity(verbosity);
0282 se->registerSubsystem( projection );
0283
0284
0285
0286
0287 PHG4SvtxBeamSpotReco* beamspot = new PHG4SvtxBeamSpotReco();
0288 beamspot->Verbosity(verbosity);
0289 se->registerSubsystem( beamspot );
0290
0291 return;
0292 }
0293
0294 void G4_Svtx_Reco()
0295 {
0296 cout << "\033[31;1m"
0297 << "Warning: G4_Svtx_Reco() was moved to G4_Svtx.C and renamed to Svtx_Reco(), please update macros"
0298 << "\033[0m" << endl;
0299 Svtx_Reco();
0300
0301 return;
0302 }
0303
0304 void Svtx_Eval(std::string outputfile, int verbosity = 0)
0305 {
0306
0307
0308
0309
0310 gSystem->Load("libfun4all.so");
0311 gSystem->Load("libg4detectors.so");
0312 gSystem->Load("libg4hough.so");
0313 gSystem->Load("libg4eval.so");
0314
0315
0316
0317
0318
0319 Fun4AllServer *se = Fun4AllServer::instance();
0320
0321
0322
0323
0324
0325 SvtxEvaluator* eval = new SvtxEvaluator("SVTXEVALUATOR", outputfile.c_str());
0326 eval->do_cluster_eval(true);
0327 eval->do_g4hit_eval(false);
0328 eval->do_hit_eval(false);
0329 eval->do_gpoint_eval(false);
0330
0331 eval->scan_for_embedded(false);
0332 eval->Verbosity(verbosity);
0333 se->registerSubsystem( eval );
0334
0335
0336
0337
0338 return;
0339 }