Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2025-08-06 08:16:18

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 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; // set to true if you want to check for overlaps
0029 
0030       /*
0031     The numbers used in the macro below are from the xml file dump of ITS.gdml
0032     As a sanity check, I got numbers  from Walt Sondheim's drawings, sent by email June 20, 2017:
0033     OD of Be beam pipe is 41.53 mm, ID is 40 mm
0034     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
0035     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
0036     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
0037     These are in reasonable agreement with the numbers I extracted from the gdml file, which are what we use below.
0038     These use a spacing in arc length of 12.37 mm and a tilt of 0.304 for all of the first three layers
0039       */
0040 
0041       // MAPS inner barrel layers
0042       //======================================================
0043 
0044       double maps_layer_radius[3] = {23.4, 31.5, 39.3};   // mm  - precise numbers from ITS.gdml
0045       //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
0046 
0047       // type 1 = inner barrel stave, 2 = middle barrel stave, 3 = outer barrel stave
0048       // we use only type 0 here
0049       int stave_type[3] = {0, 0, 0};
0050       int staves_in_layer[3] = {12, 16, 20};   // Number of staves per layer in sPHENIX MVTX
0051       double phi_tilt[3] = {0.304, 0.304, 0.304};  // radians, from the gdml file, 0.304 radians is 17.4 degrees
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]);// thickness in cm
0063       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
0064 
0065       // 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
0066       lyr->set_double_param("pixel_x",0.0030);// pitch in cm
0067       lyr->set_double_param("pixel_z",0.0030);// length in cm
0068       lyr->set_double_param("pixel_thickness",0.0018);// thickness in cm
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       // INTT ladders
0087       //-------------------
0088       
0089       bool intt_overlapcheck = false; // set to true if you want to check for overlaps
0090       
0091       // instantiate the Silicon tracker subsystem and register it
0092       // We make one instance of PHG4TrackerSubsystem for all four layers of tracker
0093       // dimensions are in mm, angles are in radians
0094       
0095       // PHG4SiliconTrackerSubsystem creates the detetor layer using PHG4SiliconTrackerDetector
0096       // and instantiates the appropriate PHG4SteppingAction
0097       const double intt_radius_max = 140.; // including stagger radius (mm)
0098       
0099       // The length of vpair is used to determine the number of layers
0100       std::vector<std::pair<int, int>> vpair; // (sphxlayer, inttlayer)
0101       for(int i=0;i<n_intt_layer;i++)
0102     {
0103       // We want the sPHENIX layer numbers for the INTT to be from n_maps_layer to n_maps_layer+n_intt_layer - 1
0104       vpair.push_back(std::make_pair(n_maps_layer+i, i));  // sphxlayer=n_maps_layer+i corresponding to inttlayer=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       // outer radius marker (translation back to cm)
0114       radius = intt_radius_max*0.1;
0115     }
0116 
0117   // time projection chamber layers --------------------------------------------
0118 
0119   PHG4CylinderSubsystem *cyl;
0120 
0121   radius = inner_cage_radius;
0122   
0123   double cage_length = 211.0; // From TPC group, gives eta = 1.1 at 78 cm
0124   double n_rad_length_cage = 1.13e-02;
0125   double cage_thickness = 28.6 * n_rad_length_cage;   // Kapton X_0 = 28.6 cm  // mocks up Kapton + carbon fiber structure
0126 
0127   // inner field cage  
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   //string tpcgas = "sPHENIX_TPC_Gas";  // leave this change until later - will require some parameter retuning
0145 
0146   // Layer of inert TPC gas from 20-30 cm
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   // outer field cage
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 ); // Kapton X_0 = 28.6 cm
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   // runs the cellularization of the energy deposits (g4hits) 
0201   // into detector hits (g4cells)
0202 
0203   //---------------
0204   // Load libraries
0205   //---------------
0206 
0207   gSystem->Load("libfun4all.so");
0208   gSystem->Load("libg4detectors.so");
0209 
0210   //---------------
0211   // Fun4All server
0212   //---------------
0213 
0214   Fun4AllServer *se = Fun4AllServer::instance();
0215 
0216   //-----------
0217   // SVTX cells
0218   //-----------
0219 
0220   if(n_maps_layer > 0)
0221     {
0222       // MAPS cells
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       // INTT cells
0235       PHG4SiliconTrackerCellReco *reco = new PHG4SiliconTrackerCellReco("SILICON_TRACKER");
0236       // The timing windows are hard-coded in the INTT ladder model
0237       reco->Verbosity(verbosity);
0238       se->registerSubsystem(reco);
0239     }
0240 
0241   // TPC cells
0242   //double tpc_cell_x = 0.12*0.5;
0243   //double tpc_cell_y = 0.17*0.5;
0244   // use same cell size for 40 layers to limit memory size
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   // Main switch for TPC distortion
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     //tpc_distortion -> setAccuracy(0); // option to over write default  factors
0271     //tpc_distortion -> setPrecision(0.001); // option to over write default  factors      // default is 0.001
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);  // additional smearing of cloud positions wrt hits
0282       svtx_cells->setSmearZ(0.09);     // additional smearing of cloud positions wrt hits
0283     }
0284   else
0285     {
0286       // 60 layer tune
0287       svtx_cells->setDiffusionT(0.0120);
0288       svtx_cells->setDiffusionL(0.0120);
0289       svtx_cells->setSmearRPhi(0.09);  // additional smearing of cluster positions
0290       svtx_cells->setSmearZ(0.06);       // additional smearing of cluster positions
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   // The maps cell size is set when the detector is constructed because it is needed by the geometry object
0298   // The INTT ladder cell size is set in the detector construction code
0299   // set cylinder cell TPC cell sizes
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   // Load libraries
0314   //---------------
0315 
0316   gSystem->Load("libfun4all.so");
0317   gSystem->Load("libg4hough.so");
0318 
0319   //---------------
0320   // Fun4All server
0321   //---------------
0322 
0323   Fun4AllServer *se = Fun4AllServer::instance();
0324 
0325   //----------------------------------
0326   // Digitize the cell energy into ADC
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);  // reduced by a factor of 2.5 when going from maps thickess of 50 microns to 18 microns
0332   }
0333 
0334   if(n_intt_layer > 0)
0335     {
0336       // INTT
0337       std::vector<double> userrange; // 3-bit ADC threshold relative to the mip_e at each layer.
0338       // these should be used for the INTT
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   // TPC layers
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   // Apply Live Area Inefficiency to Hits
0365   //-------------------------------------
0366   // defaults to 1.0 (fully active)
0367   
0368   PHG4SvtxDeadArea* deadarea = new PHG4SvtxDeadArea();
0369 
0370   for(int i = 0;i<n_maps_layer;i++)
0371     {  
0372       deadarea->Verbosity(verbosity);
0373       //deadarea->set_hit_efficiency(i,0.99);
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       //deadarea->set_hit_efficiency(i,0.99);
0379       deadarea->set_hit_efficiency(i,1.0);
0380     }
0381   se->registerSubsystem( deadarea );
0382 
0383   //-----------------------------
0384   // Apply MIP thresholds to Hits
0385   //-----------------------------
0386 
0387   PHG4SvtxThresholds* thresholds = new PHG4SvtxThresholds();
0388   thresholds->Verbosity(verbosity);
0389  
0390   // maps 
0391   for(int i = 0;i<n_maps_layer;i++)
0392     {  
0393       // reduced by x2.5 when going from cylinder maps with 50 microns thickness to actual maps with 18 microns thickness
0394       // Note the non-use of set_using_thickness here, this is so that the shortest dimension of the cell sets the mip energy loss
0395       thresholds->set_threshold(i,0.1); 
0396     }
0397   // INTT
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   // Cluster Hits
0409   //-------------
0410 
0411   PHG4SvtxClusterizer* clusterizer = new PHG4SvtxClusterizer("PHG4SvtxClusterizer",0, n_maps_layer + n_intt_layer-1);
0412   clusterizer->Verbosity(verbosity);
0413   // Reduced by 2 relative to the cylinder cell maps macro. I found this necessary to get full efficiency
0414   // 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
0415   clusterizer->set_threshold(0.1);   // fraction of a mip
0416   // no Z clustering for INTT layers (only)
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/*15 adc*/);
0430       tpcclusterizer->setFitWindowSigmas(0.0160,0.0160);  // should be changed when TPC cluster resolution changes
0431       //tpcclusterizer->setFitWindowMax(9/*rphibins*/,7/*zbins*/);
0432       tpcclusterizer->setFitWindowMax(4/*rphibins*/,3/*zbins*/);  // for double cell size
0433       //tpcclusterizer->setFitEnergyThreshold( 0.1 /*fraction*/ );
0434       tpcclusterizer->setFitEnergyThreshold( 0.05 /*fraction*/ ); // for double cell size
0435     }
0436   else
0437     {
0438       // 60 layer tune
0439       tpcclusterizer->setEnergyCut(15/*adc*/);
0440       tpcclusterizer->setFitWindowSigmas(0.0150,0.0160);  // should be changed when TPC cluster resolution changes
0441       tpcclusterizer->setFitWindowMax(4/*rphibins*/,3/*zbins*/);
0442       tpcclusterizer->setFitEnergyThreshold( 0.05 /*fraction*/ );
0443     }
0444   se->registerSubsystem( tpcclusterizer );
0445 }
0446 
0447 void Svtx_Tracking(int verbosity = 0) {
0448 
0449       //---------------
0450       // Load libraries
0451       //---------------
0452 
0453       gSystem->Load("libfun4all.so");
0454       gSystem->Load("libg4hough.so");
0455 
0456       //---------------
0457       // Fun4All server
0458       //---------------
0459 
0460       Fun4AllServer *se = Fun4AllServer::instance();
0461 
0462   // This should be true for everything except testing!
0463   const bool use_kalman_pat_rec = true;
0464   if (use_kalman_pat_rec) {
0465     //---------------------
0466     // PHG4KalmanPatRec
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     // Truth Pattern Recognition
0476     //---------------------
0477     PHG4TruthPatRec* pat_rec = new PHG4TruthPatRec();
0478     se->registerSubsystem(pat_rec);
0479 
0480   }
0481 
0482   //---------------------
0483   // Kalman Filter
0484   //---------------------
0485 
0486   PHG4TrackKalmanFitter* kalman = new PHG4TrackKalmanFitter();
0487   kalman->Verbosity(0);
0488   if(use_primary_vertex)
0489     kalman->set_fit_primary_tracks(true); // include primary vertex in track fit if true
0490   se->registerSubsystem(kalman);
0491 
0492 
0493   //------------------
0494   // Track Projections
0495   //------------------
0496     PHG4SvtxTrackProjection* projection = new PHG4SvtxTrackProjection();
0497     projection->Verbosity(verbosity);
0498     se->registerSubsystem( projection );
0499 
0500   /*
0501   //----------------------
0502   // Beam Spot Calculation
0503   //----------------------
0504   PHG4SvtxBeamSpotReco* beamspot = new PHG4SvtxBeamSpotReco();
0505   beamspot->Verbosity(verbosity);
0506   se->registerSubsystem( beamspot );
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   // Load libraries
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   // Fun4All server
0535   //---------------
0536 
0537   Fun4AllServer *se = Fun4AllServer::instance();
0538 
0539   //----------------
0540   // SVTX evaluation
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); // take all tracks if false - take only embedded tracks if true
0550   eval->Verbosity(verbosity);
0551   se->registerSubsystem( eval );
0552 
0553 
0554   if(use_primary_vertex)
0555     {
0556       // make a second evaluator that records tracks fitted with primary vertex included
0557       // good for analysis of prompt tracks, particularly if MVTX is not present
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); // take all tracks if false - take only embedded tracks if true
0565       evalp->Verbosity(0);
0566       se->registerSubsystem( evalp );
0567     }
0568 
0569   // MomentumEvaluator* eval = new MomentumEvaluator(outputfile.c_str(),0.2,0.4,Max_si_layer,2,Max_si_layer-4,10.,80.);
0570   // se->registerSubsystem( eval );
0571   
0572   return;
0573 }