Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-05 08:13:34

0001 #include <vector>
0002 
0003 // if true, refit tracks with primary vertex included in track fit  - good for analysis of prompt tracks only
0004 // Adds second node to node tree, keeps original track node undisturbed
0005 // Adds second evaluator to process refitted tracks and outputs separate ntuples
0006 bool use_primary_vertex = false;   
0007 
0008 const int n_maps_layer = 3;  // must be 0-3, setting it to zero removes MVTX completely, n < 3 gives the first n layers
0009 const int n_intt_layer = 4;   // must be 0-4, setting this to zero will remove the INTT completely, n < 4 gives you the first n layers
0010 int n_gas_layer  = 40;
0011 
0012 double inner_cage_radius = 20.;
0013 
0014 // TPC readout shaping time and ADC clock parameters
0015 //=======================================
0016 
0017 double TPCDriftVelocity = 3.0 / 1000.0; // cm/ns
0018 double TPCShapingRMSLead = 32.0;  // ns, rising RMS equivalent of shaping amplifier for 80 ns SAMPA
0019 double TPCShapingRMSTail = 48.0;  // ns, falling RMS equivalent of shaping amplifier for 80 ns SAMPA
0020 double TPCADCClock = 53.0;  // ns, corresponds to an ADC clock rate of 18.8 MHz
0021 
0022 double tpc_cell_x = 0.15;  // bin size for pads in rphi 
0023 double tpc_cell_y = TPCADCClock * TPCDriftVelocity;  // cm
0024 
0025 int Max_si_layer;
0026 
0027 void SvtxInit(int n_TPC_layers = 40, int verbosity = 0)
0028 {
0029   n_gas_layer = n_TPC_layers;
0030   Max_si_layer = n_maps_layer + n_intt_layer + n_gas_layer;
0031 }
0032 
0033 double Svtx(PHG4Reco* g4Reco, double radius, 
0034       const int absorberactive = 0,
0035       int verbosity = 0) {
0036 
0037   if(n_maps_layer > 0)
0038     {
0039       bool maps_overlapcheck = false; // set to true if you want to check for overlaps
0040       
0041       /*
0042     The numbers used in the macro below are from the xml file dump of ITS.gdml
0043     As a sanity check, I got numbers  from Walt Sondheim's drawings, sent by email June 20, 2017:
0044     OD of Be beam pipe is 41.53 mm, ID is 40 mm
0045     Layer 0: radius 23.44 mm to sensor center, tilt from normal to radial vector:  17.37 degrees (0.303 rad), spacing btw sensor centers: 30 deg, arc spacing 12.27 mm
0046     Layer 1: radius 31.54 mm to sensor center, ttilt from normal to radial vector:  17.53 degrees (0.306 rad), spacing btw sensor centers: 22.5 deg, arc spacing 12.38 mm
0047     Layer 2: radius 39.29 to sensor center, tilt from normal to radial vector: 17.02 degrees (0.297 rad), spacing btw sensor centers: 18.0 deg, arc spacing 12.34 mm
0048     These are in reasonable agreement with the numbers I extracted from the gdml file, which are what we use below.
0049     These use a spacing in arc length of 12.37 mm and a tilt of 0.304 for all of the first three layers
0050       */
0051 
0052       // MAPS inner barrel layers 
0053       //======================================================
0054       
0055       double maps_layer_radius[3] = {23.4, 31.5, 39.3};   // mm  - precise numbers from ITS.gdml
0056       //double maps_layer_radius[3] = {24.9, 33.0, 40.8};   // mm  - precise numbers from ITS.gdml + 1.5 mm for greater clearance from beam pipe
0057 
0058       // type 1 = inner barrel stave, 2 = middle barrel stave, 3 = outer barrel stave
0059       // we use only type 0 here
0060       int stave_type[3] = {0, 0, 0};
0061       int staves_in_layer[3] = {12, 16, 20};   // Number of staves per layer in sPHENIX MVTX
0062       double phi_tilt[3] = {0.304, 0.304, 0.304};  // radians, from the gdml file, 0.304 radians is 17.4 degrees
0063 
0064       for (int ilayer = 0; ilayer < n_maps_layer; ilayer++)
0065     {
0066       if (verbosity)
0067         cout << "Create Maps layer " << ilayer  << " with radius " << maps_layer_radius[ilayer] << " mm, stave type " << stave_type[ilayer] 
0068          << " pixel size 30 x 30 microns " << " active pixel thickness 0.0018 microns" << endl;
0069       
0070       PHG4MapsSubsystem  *lyr = new PHG4MapsSubsystem("MAPS", ilayer, stave_type[ilayer]);
0071       lyr->Verbosity(verbosity);
0072       
0073       lyr->set_double_param("layer_nominal_radius",maps_layer_radius[ilayer]);// thickness in cm
0074       lyr->set_int_param("N_staves", staves_in_layer[ilayer]);    // uses fixed number of staves regardless of radius, if set. Otherwise, calculates optimum number of staves
0075 
0076       // The cell size is used only during pixilization of sensor hits, but it is convemient to set it now because the geometry object needs it
0077       lyr->set_double_param("pixel_x",0.0030);// pitch in cm
0078       lyr->set_double_param("pixel_z",0.0030);// length in cm
0079       lyr->set_double_param("pixel_thickness",0.0018);// thickness in cm
0080       lyr->set_double_param("phitilt", phi_tilt[ilayer]);  
0081       
0082       lyr->set_int_param("active",1);
0083       lyr->OverlapCheck(maps_overlapcheck);
0084       
0085       lyr->set_string_param("stave_geometry_file",
0086                 string(getenv("CALIBRATIONROOT")) + string("/Tracking/geometry/ALICE_ITS_tgeo.gdml"));
0087       
0088       g4Reco->registerSubsystem( lyr );      
0089       
0090       radius = maps_layer_radius[ilayer];
0091     }
0092     }
0093 
0094   if(n_intt_layer > 0)
0095     {
0096       //-------------------
0097       // INTT ladders
0098       //-------------------
0099       
0100       bool intt_overlapcheck = false; // set to true if you want to check for overlaps
0101       
0102       // instantiate the Silicon tracker subsystem and register it
0103       // We make one instance of PHG4TrackerSubsystem for all four layers of tracker
0104       // dimensions are in mm, angles are in radians
0105       
0106       // PHG4SiliconTrackerSubsystem creates the detetor layer using PHG4SiliconTrackerDetector
0107       // and instantiates the appropriate PHG4SteppingAction
0108       const double intt_radius_max = 140.; // including stagger radius (mm)
0109       
0110       // The length of vpair is used to determine the number of layers
0111       std::vector<std::pair<int, int>> vpair; // (sphxlayer, inttlayer)
0112       for(int i=0;i<n_intt_layer;i++)
0113     {
0114       // We want the sPHENIX layer numbers for the INTT to be from n_maps_layer to n_maps_layer+n_intt_layer - 1
0115       vpair.push_back(std::make_pair(n_maps_layer+i, i));  // sphxlayer=n_maps_layer+i corresponding to inttlayer=i
0116       if (verbosity)      cout << "Create strip tracker layer " << vpair[i].second << " as  sphenix layer  "  << vpair[i].first << endl;
0117     }
0118       PHG4SiliconTrackerSubsystem *sitrack = new PHG4SiliconTrackerSubsystem("SILICON_TRACKER", vpair);
0119       sitrack->Verbosity(verbosity);
0120       sitrack->SetActive(1);
0121       sitrack->OverlapCheck(intt_overlapcheck);
0122       g4Reco->registerSubsystem( sitrack);
0123       
0124       // outer radius marker (translation back to cm)
0125       radius = intt_radius_max*0.1;
0126     }
0127 
0128   // time projection chamber layers --------------------------------------------
0129 
0130   PHG4CylinderSubsystem *cyl;
0131 
0132   radius = inner_cage_radius;
0133   
0134   double cage_length = 211.0; // From TPC group, gives eta = 1.1 at 78 cm
0135   double n_rad_length_cage = 1.13e-02;
0136   double cage_thickness = 28.6 * n_rad_length_cage;   // Kapton X_0 = 28.6 cm  // mocks up Kapton + carbon fiber structure
0137 
0138   // inner field cage  
0139   cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer);
0140   cyl->set_double_param("radius",radius);
0141   cyl->set_int_param("lengthviarapidity",0);
0142   cyl->set_double_param("length",cage_length);
0143   cyl->set_string_param("material","G4_KAPTON");
0144   cyl->set_double_param("thickness",cage_thickness ); 
0145   cyl->SuperDetector("SVTXSUPPORT");
0146   cyl->Verbosity(0);
0147   g4Reco->registerSubsystem( cyl );
0148 
0149   radius += cage_thickness;
0150 
0151   double inner_readout_radius = 30.;
0152   if (inner_readout_radius<radius)  inner_readout_radius = radius;
0153 
0154   string tpcgas = "sPHENIX_TPC_Gas";  //  Ne(90%) CF4(10%) - defined in g4main/PHG4Reco.cc
0155 
0156   // Layer of inert TPC gas from 20-30 cm
0157   if (inner_readout_radius - radius > 0) {
0158     cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer + 1);
0159     cyl->set_double_param("radius",radius);
0160     cyl->set_int_param("lengthviarapidity",0);
0161     cyl->set_double_param("length",cage_length);
0162     cyl->set_string_param("material",tpcgas.c_str());
0163     cyl->set_double_param("thickness",  inner_readout_radius  - radius);
0164     cyl->SuperDetector("SVTXSUPPORT");
0165     g4Reco->registerSubsystem( cyl );
0166   }
0167 
0168   radius = inner_readout_radius;
0169   
0170   double outer_radius = 78.;
0171   int npoints = Max_si_layer - n_maps_layer - n_intt_layer;
0172   double delta_radius =  ( outer_radius - inner_readout_radius )/( (double)npoints );
0173   
0174   for(int ilayer=n_maps_layer + n_intt_layer;ilayer<(n_maps_layer + n_intt_layer + npoints);++ilayer) {
0175 
0176       if (verbosity)
0177         cout << "Create TPC gas layer " << ilayer  << " with radius " << radius  << " cm "
0178            << " thickness " << delta_radius - 0.01 << " length " << cage_length << endl;
0179 
0180     cyl = new PHG4CylinderSubsystem("SVTX", ilayer);
0181     cyl->set_double_param("radius",radius);
0182     cyl->set_int_param("lengthviarapidity",0);
0183     cyl->set_double_param("length",cage_length);
0184     cyl->set_string_param("material",tpcgas.c_str());
0185     cyl->set_double_param("thickness", delta_radius - 0.01 );
0186     cyl->SetActive();
0187     cyl->SuperDetector("SVTX");
0188     g4Reco->registerSubsystem( cyl );
0189     
0190     radius += delta_radius;
0191   }
0192 
0193   // outer field cage
0194   cyl = new PHG4CylinderSubsystem("SVTXSUPPORT", n_maps_layer + n_intt_layer + npoints);
0195   cyl->set_double_param("radius",radius);
0196   cyl->set_int_param("lengthviarapidity",0);
0197   cyl->set_double_param("length",cage_length);
0198   cyl->set_string_param("material","G4_KAPTON");
0199   cyl->set_double_param("thickness",cage_thickness ); // Kapton X_0 = 28.6 cm
0200   cyl->SuperDetector("SVTXSUPPORT");
0201   g4Reco->registerSubsystem( cyl );
0202 
0203   radius += cage_thickness;
0204 
0205   return radius;
0206 }
0207 
0208 void Svtx_Cells(int verbosity = 0)
0209 {
0210   // runs the cellularization of the energy deposits (g4hits) 
0211   // into detector hits (g4cells)
0212 
0213   //---------------
0214   // Load libraries
0215   //---------------
0216 
0217   gSystem->Load("libfun4all.so");
0218   gSystem->Load("libg4detectors.so");
0219 
0220   //---------------
0221   // Fun4All server
0222   //---------------
0223 
0224   Fun4AllServer *se = Fun4AllServer::instance();
0225 
0226   //-----------
0227   // SVTX cells
0228   //-----------
0229 
0230   if(n_maps_layer > 0)
0231     {
0232       // MAPS cells
0233       PHG4MapsCellReco *maps_cells = new PHG4MapsCellReco("MAPS");
0234       maps_cells->Verbosity(verbosity);
0235       for(int ilayer = 0;ilayer < n_maps_layer;ilayer++)
0236     {
0237       maps_cells->set_timing_window(ilayer,-2000,2000);
0238     }
0239       se->registerSubsystem(maps_cells);
0240     }
0241 
0242   if(n_intt_layer > 0)
0243     {
0244       // INTT cells
0245       PHG4SiliconTrackerCellReco *reco = new PHG4SiliconTrackerCellReco("SILICON_TRACKER");
0246       // The timing windows are hard-coded in the INTT ladder model
0247       reco->Verbosity(verbosity);
0248       se->registerSubsystem(reco);
0249     }
0250 
0251   // TPC cell sizes are defined at top of macro, this is for backward compatibility with old hits files
0252   if(n_gas_layer == 60)
0253     {
0254       TPCDriftVelocity = 6.0 / 1000.0; // cm/ns
0255       tpc_cell_x = 0.12;
0256       tpc_cell_y = 0.17;
0257     }
0258 
0259   // Main switch for TPC distortion
0260   const bool do_tpc_distortion = true;
0261   PHG4TPCSpaceChargeDistortion* tpc_distortion = NULL;
0262   if (do_tpc_distortion) {
0263     if (inner_cage_radius != 20. && inner_cage_radius != 30.) {
0264       cout << "Svtx_Cells - Fatal Error - TPC distortion required that "
0265               "inner_cage_radius is either 20 or 30 cm."
0266            << endl;
0267       exit(3);
0268     }
0269     
0270 
0271     string TPC_distortion_file =
0272         string(getenv("CALIBRATIONROOT")) +
0273         Form("/Tracking/TPC/SpaceChargeDistortion/TPCCAGE_20_78_211_2.root"); 
0274     PHG4TPCSpaceChargeDistortion* tpc_distortion =
0275         new PHG4TPCSpaceChargeDistortion(TPC_distortion_file);
0276     //tpc_distortion -> setAccuracy(0); // option to over write default  factors
0277     //tpc_distortion -> setPrecision(0.001); // option to over write default  factors      // default is 0.001
0278   }
0279 
0280   PHG4CylinderCellTPCReco *svtx_cells = new PHG4CylinderCellTPCReco(n_maps_layer+n_intt_layer);
0281   svtx_cells->Detector("SVTX");
0282   svtx_cells->setDistortion(tpc_distortion);
0283   if(n_gas_layer == 40)
0284     {
0285       svtx_cells->setDiffusionT(0.0130);
0286       svtx_cells->setDiffusionL(0.0130);
0287       svtx_cells->setShapingRMSLead(TPCShapingRMSLead * TPCDriftVelocity);
0288       svtx_cells->setShapingRMSTail(TPCShapingRMSTail * TPCDriftVelocity);
0289       // Expected cluster resolutions:
0290       //    r-phi: diffusion + GEM smearing = 750 microns, assume resolution is 20% of that => 150 microns
0291       //    Z:  amplifier shaping time (RMS 32 ns, 48 ns) and drift vel of 3 cm/microsec gives smearing of 3 x (32+48/2 = 1.2 mm, assume resolution is 20% of that => 240 microns   
0292       svtx_cells->setSmearRPhi(0.10);  // additional random displacement of cloud positions wrt hits to give expected cluster resolution of 150 microns for charge at membrane 
0293       svtx_cells->setSmearZ(0.15);     // additional random displacement of cloud positions wrt hits to give expected cluster rsolution of 240 microns for charge at membrane
0294     }
0295   else
0296     {
0297       // 60 layer tune
0298       svtx_cells->setDiffusionT(0.0120);
0299       svtx_cells->setDiffusionL(0.0120);
0300       svtx_cells->setSmearRPhi(0.09);  // additional smearing of cluster positions 
0301       svtx_cells->setSmearZ(0.06);       // additional smearing of cluster positions 
0302     }
0303   svtx_cells->set_drift_velocity(TPCDriftVelocity);
0304   svtx_cells->setHalfLength( 105.5 );
0305   svtx_cells->setElectronsPerKeV(28);
0306   svtx_cells->Verbosity(0);
0307 
0308   // The maps cell size is set when the detector is constructed because it is needed by the geometry object
0309   // The INTT ladder cell size is set in the detector construction code
0310   // set cylinder cell TPC cell sizes
0311   for (int i=n_maps_layer + n_intt_layer;i<Max_si_layer;++i) {
0312     svtx_cells->cellsize(i, tpc_cell_x, tpc_cell_y);
0313     svtx_cells->set_timing_window(i, -35000.0, +35000.0);
0314   }
0315   
0316   se->registerSubsystem(svtx_cells);
0317 
0318   return;
0319 }
0320 
0321 void Svtx_Reco(int verbosity = 0)
0322 {
0323   //---------------
0324   // Load libraries
0325   //---------------
0326 
0327   gSystem->Load("libfun4all.so");
0328   gSystem->Load("libg4hough.so");
0329 
0330   //---------------
0331   // Fun4All server
0332   //---------------
0333 
0334   Fun4AllServer *se = Fun4AllServer::instance();
0335 
0336   //----------------------------------
0337   // Digitize the cell energy into ADC
0338   //----------------------------------
0339   PHG4SvtxDigitizer* digi = new PHG4SvtxDigitizer();
0340   digi->Verbosity(0);
0341   for (int i=0;i<n_maps_layer;++i) {
0342       digi->set_adc_scale(i, 255, 0.4e-6);  // reduced by a factor of 2.5 when going from maps thickess of 50 microns to 18 microns
0343   }
0344 
0345   if(n_intt_layer > 0)
0346     {
0347       // INTT
0348       std::vector<double> userrange; // 3-bit ADC threshold relative to the mip_e at each layer.
0349       // these should be used for the INTT
0350       userrange.push_back(0.05);
0351       userrange.push_back(0.10);
0352       userrange.push_back(0.15);
0353       userrange.push_back(0.20);
0354       userrange.push_back(0.25);
0355       userrange.push_back(0.30);
0356       userrange.push_back(0.35);
0357       userrange.push_back(0.40);
0358       
0359       PHG4SiliconTrackerDigitizer* digiintt = new PHG4SiliconTrackerDigitizer();
0360       digiintt->Verbosity(verbosity);
0361       for(int i=0;i<n_intt_layer;i++)
0362     {
0363       digiintt->set_adc_scale(n_maps_layer+i, userrange);
0364     }
0365       se->registerSubsystem( digiintt );
0366     }
0367 
0368   // TPC layers
0369   for (int i=n_maps_layer+n_intt_layer;i<Max_si_layer;++i) {
0370     digi->set_adc_scale(i, 30000, 1.0);
0371   }
0372   se->registerSubsystem( digi );
0373   
0374   //-------------------------------------
0375   // Apply Live Area Inefficiency to Hits
0376   //-------------------------------------
0377   // defaults to 1.0 (fully active)
0378   
0379   PHG4SvtxDeadArea* deadarea = new PHG4SvtxDeadArea();
0380 
0381   for(int i = 0;i<n_maps_layer;i++)
0382     {  
0383       deadarea->Verbosity(verbosity);
0384       //deadarea->set_hit_efficiency(i,0.99);
0385       deadarea->set_hit_efficiency(i,1.0);
0386     }
0387   for(int i=n_maps_layer;i<n_maps_layer + n_intt_layer;i++)
0388     {
0389       //deadarea->set_hit_efficiency(i,0.99);
0390       deadarea->set_hit_efficiency(i,1.0);
0391     }
0392   se->registerSubsystem( deadarea );
0393 
0394   //-----------------------------
0395   // Apply MIP thresholds to Hits
0396   //-----------------------------
0397 
0398   PHG4SvtxThresholds* thresholds = new PHG4SvtxThresholds();
0399   thresholds->Verbosity(verbosity);
0400  
0401   // maps 
0402   for(int i = 0;i<n_maps_layer;i++)
0403     {  
0404       // reduced by x2.5 when going from cylinder maps with 50 microns thickness to actual maps with 18 microns thickness
0405       // Note the non-use of set_using_thickness here, this is so that the shortest dimension of the cell sets the mip energy loss
0406       thresholds->set_threshold(i,0.1); 
0407     }
0408   // INTT
0409   for(int i=n_maps_layer;i<n_maps_layer + n_intt_layer;i++)
0410     {
0411       thresholds->set_threshold(i,0.1);
0412       thresholds->set_use_thickness_mip(i, true);
0413 
0414     }
0415   
0416   se->registerSubsystem( thresholds );
0417 
0418   //-------------
0419   // Cluster Hits
0420   //-------------
0421 
0422   PHG4SvtxClusterizer* clusterizer = new PHG4SvtxClusterizer("PHG4SvtxClusterizer",0, n_maps_layer + n_intt_layer-1);
0423   clusterizer->Verbosity(verbosity);
0424   // Reduced by 2 relative to the cylinder cell maps macro. I found this necessary to get full efficiency
0425   // Many hits in the present simulation are single cell hits, so it is not clear why the cluster threshold should be higher than the cell threshold
0426   clusterizer->set_threshold(0.1);   // fraction of a mip
0427   // no Z clustering for INTT layers (only)
0428   for(int i=n_maps_layer;i<n_maps_layer+n_intt_layer;i++)
0429     {
0430       clusterizer->set_z_clustering(i, false);
0431     }
0432 
0433   se->registerSubsystem( clusterizer );
0434 
0435   PHG4TPCClusterizer* tpcclusterizer = new PHG4TPCClusterizer();
0436   tpcclusterizer->Verbosity(0);
0437   tpcclusterizer->setRangeLayers(n_maps_layer+n_intt_layer,Max_si_layer);
0438   if(n_gas_layer == 40)
0439     {
0440       tpcclusterizer->setEnergyCut(12/*15 adc*/);
0441       tpcclusterizer->setFitWindowSigmas(0.0160,0.0160);  // should be changed when TPC cluster resolution changes
0442       tpcclusterizer->setFitWindowMax(4/*rphibins*/,6/*zbins*/);  
0443       tpcclusterizer->setFitEnergyThreshold( 0.05 /*fraction*/ ); 
0444     }
0445   else
0446     {
0447       // 60 layer tune  
0448       tpcclusterizer->setEnergyCut(15/*adc*/);
0449       tpcclusterizer->setFitWindowSigmas(0.0150,0.0160);  // should be changed when TPC cluster resolution changes
0450       tpcclusterizer->setFitWindowMax(4/*rphibins*/,3/*zbins*/);
0451       tpcclusterizer->setFitEnergyThreshold( 0.05 /*fraction*/ );
0452     }
0453   se->registerSubsystem( tpcclusterizer );
0454   
0455   // This should be true for everything except testing!
0456   const bool use_kalman_pat_rec = true;
0457   if (use_kalman_pat_rec) {
0458     //---------------------
0459     // PHG4KalmanPatRec
0460     //---------------------
0461     
0462     PHG4KalmanPatRec* kalman_pat_rec = new PHG4KalmanPatRec("PHG4KalmanPatRec", n_maps_layer, n_intt_layer, n_gas_layer);
0463     kalman_pat_rec->Verbosity(0);
0464     se->registerSubsystem(kalman_pat_rec);
0465     
0466   } else {
0467     //---------------------
0468     // Truth Pattern Recognition
0469     //---------------------
0470     PHG4TruthPatRec* pat_rec = new PHG4TruthPatRec();
0471     se->registerSubsystem(pat_rec);
0472     
0473   }
0474   
0475   //---------------------
0476   // Kalman Filter
0477   //---------------------
0478   
0479   PHG4TrackKalmanFitter* kalman = new PHG4TrackKalmanFitter();
0480   kalman->Verbosity(0);  
0481   if(use_primary_vertex)
0482     kalman->set_fit_primary_tracks(true); // include primary vertex in track fit if true
0483   se->registerSubsystem(kalman);
0484   
0485     
0486   //------------------
0487   // Track Projections
0488   //------------------
0489   PHG4GenFitTrackProjection *projection = new PHG4GenFitTrackProjection();
0490   projection->Verbosity(verbosity);
0491   se->registerSubsystem( projection );
0492 
0493   /*  
0494   //----------------------
0495   // Beam Spot Calculation
0496   //----------------------
0497   PHG4SvtxBeamSpotReco* beamspot = new PHG4SvtxBeamSpotReco();
0498   beamspot->Verbosity(verbosity);
0499   se->registerSubsystem( beamspot );
0500   */
0501 
0502   return;
0503 }
0504 
0505 void G4_Svtx_Reco()
0506 {
0507   cout << "\033[31;1m"
0508        << "Warning: G4_Svtx_Reco() was moved to G4_Svtx.C and renamed to Svtx_Reco(), please update macros"
0509        << "\033[0m" << endl;
0510   Svtx_Reco();
0511 
0512   return;
0513 }
0514 
0515 void Svtx_Eval(std::string outputfile, int verbosity = 0)
0516 {
0517   //---------------
0518   // Load libraries
0519   //---------------
0520 
0521   gSystem->Load("libfun4all.so");
0522   gSystem->Load("libg4detectors.so");
0523   gSystem->Load("libg4hough.so");
0524   gSystem->Load("libg4eval.so");
0525 
0526   //---------------
0527   // Fun4All server
0528   //---------------
0529 
0530   Fun4AllServer *se = Fun4AllServer::instance();
0531 
0532   //----------------
0533   // SVTX evaluation
0534   //----------------
0535 
0536   SvtxEvaluator* eval;
0537   eval = new SvtxEvaluator("SVTXEVALUATOR",  outputfile.c_str());
0538   eval->do_cluster_eval(true);
0539   eval->do_g4hit_eval(true);
0540   eval->do_hit_eval(false);
0541   eval->do_gpoint_eval(false);
0542   eval->scan_for_embedded(false); // take all tracks if false - take only embedded tracks if true
0543   eval->Verbosity(verbosity);
0544   se->registerSubsystem( eval );
0545 
0546   
0547   if(use_primary_vertex)
0548     {
0549       // make a second evaluator that records tracks fitted with primary vertex included
0550       // good for analysis of prompt tracks, particularly if MVTX is not present
0551       SvtxEvaluator* evalp;    
0552       evalp = new SvtxEvaluator("SVTXEVALUATOR", string(outputfile.c_str()) + "_primary_eval.root", "PrimaryTrackMap");
0553       evalp->do_cluster_eval(true);
0554       evalp->do_g4hit_eval(true);
0555       evalp->do_hit_eval(false);
0556       evalp->do_gpoint_eval(false);
0557       evalp->scan_for_embedded(true); // take all tracks if false - take only embedded tracks if true
0558       evalp->Verbosity(0);
0559       se->registerSubsystem( evalp );
0560     }
0561 
0562   // MomentumEvaluator* eval = new MomentumEvaluator(outputfile.c_str(),0.2,0.4,Max_si_layer,2,Max_si_layer-4,10.,80.);
0563   // se->registerSubsystem( eval );
0564   
0565   return;
0566 }