Back to home page

sPhenix code displayed by LXR

 
 

    


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

0001 #ifndef ACTSEVALUATOR_H
0002 #define ACTSEVALUATOR_H
0003 
0004 #include <fun4all/SubsysReco.h>
0005 
0006 #include <trackbase/ActsGeometry.h>
0007 #include <trackbase/ActsSourceLink.h>
0008 #include <trackbase/ActsTrackFittingAlgorithm.h>
0009 #include <trackbase/TrkrDefs.h>
0010 
0011 #include <Acts/Utilities/Helpers.hpp>
0012 
0013 #include <ActsExamples/EventData/Trajectories.hpp>
0014 
0015 class TTree;
0016 class TFile;
0017 class PHG4Particle;
0018 class SvtxTrack;
0019 class SvtxVertexMap;
0020 class SvtxEvalStack;
0021 class SvtxTrackMap;
0022 class PHG4TruthInfoContainer;
0023 class TrkrClusterContainer;
0024 class SvtxEvaluator;
0025 class TrackSeed;
0026 class TrackSeedContainer;
0027 
0028 #include <map>
0029 #include <string>
0030 #include <vector>
0031 
0032 using SourceLink = ActsSourceLink;
0033 using Trajectory = ActsExamples::Trajectories;
0034 using Measurement = Acts::Measurement<Acts::BoundIndices, 2>;
0035 using Acts::VectorHelpers::eta;
0036 using Acts::VectorHelpers::perp;
0037 using Acts::VectorHelpers::phi;
0038 using Acts::VectorHelpers::theta;
0039 
0040 /**
0041  * This class is an analyzing class for the Acts track fitting, and produces
0042  * a tree with many branches useful for debugging what Acts is doing.
0043  * The truth G4Particle, reconstructed Acts track fit result from
0044  * PHActsTrkFitter, and the comparison between truth and reconstructed states
0045  * throughout the track fit are written out to the tree.
0046  * Note that this module works and outputs in Acts units of mm and GeV,
0047  */
0048 class ActsEvaluator
0049 {
0050  public:
0051   ActsEvaluator(const std::string& name = "ActsEvaluator.root");
0052 
0053   void Init(PHCompositeNode* topNode);
0054   void process_track(const ActsTrackFittingAlgorithm::TrackContainer& tracks,
0055              std::vector<Acts::MultiTrajectoryTraits::IndexType>& trackTips,
0056              Trajectory::IndexedParameters& paramsMap,
0057                      SvtxTrack* track,
0058                      const TrackSeed* seed,
0059                      const ActsTrackFittingAlgorithm::MeasurementContainer& measurements);
0060   void End();
0061   void isData() { m_isData = true; }
0062   void setEvalCKF(bool evalCKF) { m_evalCKF = evalCKF; }
0063   void verbosity(int verb) { m_verbosity = verb; }
0064   void next_event(PHCompositeNode* topNode);
0065 
0066   /// Function to evaluate Trajectories fit results from the KF
0067   void evaluateTrackFit(const ActsTrackFittingAlgorithm::TrackContainer& trackContainer,
0068             std::vector<Acts::MultiTrajectoryTraits::IndexType>& trackTips,
0069             Trajectory::IndexedParameters& paramsMap,
0070                         SvtxTrack* track,
0071                         const TrackSeed* seed,
0072                         const ActsTrackFittingAlgorithm::MeasurementContainer& measurements);
0073 
0074  private:
0075   int getNodes(PHCompositeNode* topNode);
0076 
0077   void initializeTree();
0078 
0079   void fillG4Particle(PHG4Particle* part);
0080 
0081   void fillProtoTrack(const TrackSeed* seed);
0082 
0083   void fillFittedTrackParams(const Trajectory::IndexedParameters& paramsMap,
0084                              const size_t& trackTip);
0085 
0086   void visitTrackStates(const Acts::ConstVectorMultiTrajectory& traj,
0087                         const size_t& trackTip,
0088                         const ActsTrackFittingAlgorithm::MeasurementContainer& measurements);
0089 
0090   void clearTrackVariables();
0091 
0092   Surface getSurface(TrkrDefs::cluskey cluskey, TrkrCluster* cluster);
0093 
0094   Acts::Vector3 getGlobalTruthHit(TrkrDefs::cluskey cluskey,
0095                                   float& _gt);
0096 
0097 //  SvtxEvaluator* m_svtxEvaluator{nullptr};
0098   PHG4TruthInfoContainer* m_truthInfo{nullptr};
0099   SvtxTrackMap* m_trackMap{nullptr};
0100   SvtxEvalStack* m_svtxEvalStack{nullptr};
0101 
0102   ActsGeometry* m_tGeometry{nullptr};
0103   TrkrClusterContainer* m_clusterContainer{nullptr};
0104   TrackSeedContainer *m_tpcSeeds{nullptr}, *m_siliconSeeds{nullptr};
0105 
0106   /// boolean indicating whether or not to evaluate the CKF or
0107   /// the KF. Must correspond with what was run to do fitting
0108   /// i.e. PHActsTrkFitter or PHActsTrkProp
0109   bool m_isData = false;
0110   bool m_evalCKF = false;
0111   int m_verbosity = 0;
0112   std::string m_filename;
0113   TFile* m_trackFile{nullptr};
0114   TTree* m_trackTree{nullptr};
0115 
0116   /// Acts tree values
0117   int m_eventNr{0};
0118   int m_trajNr{0};
0119   int m_trackNr{0};
0120 
0121   unsigned long m_t_barcode{0};  /// Truth particle barcode
0122   int m_t_charge{0};             /// Truth particle charge
0123   float m_t_time{0};             /// Truth particle time
0124   float m_t_vx{NAN};             /// Truth particle vertex x
0125   float m_t_vy{NAN};             /// Truth particle vertex y
0126   float m_t_vz{NAN};             /// Truth particle vertex z
0127   float m_t_px{NAN};             /// Truth particle initial momentum px
0128   float m_t_py{NAN};             /// Truth particle initial momentum py
0129   float m_t_pz{NAN};             /// Truth particle initial momentum pz
0130   float m_t_theta{NAN};          /// Truth particle initial momentum theta
0131   float m_t_phi{NAN};            /// Truth particle initial momentum phi
0132   float m_t_pT{NAN};             /// Truth particle initial momentum pT
0133   float m_t_eta{NAN};            /// Truth particle initial momentum eta
0134 
0135   std::vector<float> m_t_x;  /// Global truth hit position x
0136   std::vector<float> m_t_y;  /// Global truth hit position y
0137   std::vector<float> m_t_z;  /// Global truth hit position z
0138   std::vector<float> m_t_r;  /// Global truth hit position r
0139   std::vector<float>
0140       m_t_dx;  /// Truth particle direction x at global hit position
0141   std::vector<float>
0142       m_t_dy;  /// Truth particle direction y at global hit position
0143   std::vector<float>
0144       m_t_dz;  /// Truth particle direction z at global hit position
0145 
0146   std::vector<float> m_t_eLOC0;   /// truth parameter eLOC_0
0147   std::vector<float> m_t_eLOC1;   /// truth parameter eLOC_1
0148   std::vector<float> m_t_ePHI;    /// truth parameter ePHI
0149   std::vector<float> m_t_eTHETA;  /// truth parameter eTHETA
0150   std::vector<float> m_t_eQOP;    /// truth parameter eQOP
0151   std::vector<float> m_t_eT;      /// truth parameter eT
0152 
0153   int m_nSharedHits{0};             /// number of shared hits in the track fit
0154   int m_nHoles{0};                  /// number of holes in the track fit
0155   int m_nOutliers{0};               /// number of outliers in the track fit
0156   int m_nStates{0};                 /// number of all states
0157   int m_nMeasurements{0};           /// number of states with measurements
0158   std::vector<int> m_volumeID;      /// volume identifier
0159   std::vector<int> m_layerID;       /// layer identifier
0160   std::vector<int> m_moduleID;      /// surface identifier
0161   std::vector<int> m_sphenixlayer;  /// sPHENIX layer identifier
0162   std::vector<float> m_lx_hit;      /// uncalibrated measurement local x
0163   std::vector<float> m_ly_hit;      /// uncalibrated measurement local y
0164   std::vector<float> m_x_hit;       /// uncalibrated measurement global x
0165   std::vector<float> m_y_hit;       /// uncalibrated measurement global y
0166   std::vector<float> m_z_hit;       /// uncalibrated measurement global z
0167   std::vector<float> m_res_x_hit;   /// hit residual x
0168   std::vector<float> m_res_y_hit;   /// hit residual y
0169   std::vector<float> m_err_x_hit;   /// hit err x
0170   std::vector<float> m_err_y_hit;   /// hit err y
0171   std::vector<float> m_pull_x_hit;  /// hit pull x
0172   std::vector<float> m_pull_y_hit;  /// hit pull y
0173   std::vector<int> m_dim_hit;       /// dimension of measurement
0174 
0175   bool m_hasFittedParams{false};  /// if the track has fitted parameter
0176   float m_eLOC0_fit{NAN};         /// fitted parameter eLOC_0
0177   float m_eLOC1_fit{NAN};         /// fitted parameter eLOC_1
0178   float m_ePHI_fit{NAN};          /// fitted parameter ePHI
0179   float m_eTHETA_fit{NAN};        /// fitted parameter eTHETA
0180   float m_eQOP_fit{NAN};          /// fitted parameter eQOP
0181   float m_eT_fit{NAN};            /// fitted parameter eT
0182   float m_err_eLOC0_fit{NAN};     /// fitted parameter eLOC_NANerr
0183   float m_err_eLOC1_fit{NAN};     /// fitted parameter eLOC_1 err
0184   float m_err_ePHI_fit{NAN};      /// fitted parameter ePHI err
0185   float m_err_eTHETA_fit{NAN};    /// fitted parameter eTHETA err
0186   float m_err_eQOP_fit{NAN};      /// fitted parameter eQOP err
0187   float m_err_eT_fit{NAN};        /// fitted parameter eT err
0188   float m_px_fit{NAN};            /// fitted parameter global px
0189   float m_py_fit{NAN};            /// fitted parameter global py
0190   float m_pz_fit{NAN};            /// fitted parameter global pz
0191   float m_x_fit{NAN};             /// fitted parameter global PCA x
0192   float m_y_fit{NAN};             /// fitted parameter global PCA y
0193   float m_z_fit{NAN};             /// fitted parameter global PCA z
0194   float m_chi2_fit{NAN};          /// fitted parameter chi2
0195   float m_quality{NAN};           /// SvtxTrack quality parameter
0196   float m_ndf_fit{NAN};           /// fitted parameter ndf
0197   float m_dca3Dxy{NAN};           /// fitted parameter 3D DCA in xy plane
0198   float m_dca3Dz{NAN};            /// fitted parameter 3D DCA in z plane
0199   float m_dca3DxyCov{NAN};        /// fitted parameter 3D DCA covariance in xy
0200   float m_dca3DzCov{NAN};         /// fitted parameter 3D DCA covariance in z
0201   int m_charge_fit{-9999999};     /// fitted parameter charge
0202 
0203   int m_nPredicted{0};                   /// number of states with predicted parameter
0204   std::vector<bool> m_prt;               /// predicted status
0205   std::vector<float> m_eLOC0_prt;        /// predicted parameter eLOC0
0206   std::vector<float> m_eLOC1_prt;        /// predicted parameter eLOC1
0207   std::vector<float> m_ePHI_prt;         /// predicted parameter ePHI
0208   std::vector<float> m_eTHETA_prt;       /// predicted parameter eTHETA
0209   std::vector<float> m_eQOP_prt;         /// predicted parameter eQOP
0210   std::vector<float> m_eT_prt;           /// predicted parameter eT
0211   std::vector<float> m_res_eLOC0_prt;    /// predicted parameter eLOC0 residual
0212   std::vector<float> m_res_eLOC1_prt;    /// predicted parameter eLOC1 residual
0213   std::vector<float> m_res_ePHI_prt;     /// predicted parameter ePHI residual
0214   std::vector<float> m_res_eTHETA_prt;   /// predicted parameter eTHETA residual
0215   std::vector<float> m_res_eQOP_prt;     /// predicted parameter eQOP residual
0216   std::vector<float> m_res_eT_prt;       /// predicted parameter eT residual
0217   std::vector<float> m_err_eLOC0_prt;    /// predicted parameter eLOC0 error
0218   std::vector<float> m_err_eLOC1_prt;    /// predicted parameter eLOC1 error
0219   std::vector<float> m_err_ePHI_prt;     /// predicted parameter ePHI error
0220   std::vector<float> m_err_eTHETA_prt;   /// predicted parameter eTHETA error
0221   std::vector<float> m_err_eQOP_prt;     /// predicted parameter eQOP error
0222   std::vector<float> m_err_eT_prt;       /// predicted parameter eT error
0223   std::vector<float> m_pull_eLOC0_prt;   /// predicted parameter eLOC0 pull
0224   std::vector<float> m_pull_eLOC1_prt;   /// predicted parameter eLOC1 pull
0225   std::vector<float> m_pull_ePHI_prt;    /// predicted parameter ePHI pull
0226   std::vector<float> m_pull_eTHETA_prt;  /// predicted parameter eTHETA pull
0227   std::vector<float> m_pull_eQOP_prt;    /// predicted parameter eQOP pull
0228   std::vector<float> m_pull_eT_prt;      /// predicted parameter eT pull
0229   std::vector<float> m_x_prt;            /// predicted global x
0230   std::vector<float> m_y_prt;            /// predicted global y
0231   std::vector<float> m_z_prt;            /// predicted global z
0232   std::vector<float> m_px_prt;           /// predicted momentum px
0233   std::vector<float> m_py_prt;           /// predicted momentum py
0234   std::vector<float> m_pz_prt;           /// predicted momentum pz
0235   std::vector<float> m_eta_prt;          /// predicted momentum eta
0236   std::vector<float> m_pT_prt;           /// predicted momentum pT
0237 
0238   int m_nFiltered{0};                    /// number of states with filtered parameter
0239   std::vector<bool> m_flt;               /// filtered status
0240   std::vector<float> m_eLOC0_flt;        /// filtered parameter eLOC0
0241   std::vector<float> m_eLOC1_flt;        /// filtered parameter eLOC1
0242   std::vector<float> m_ePHI_flt;         /// filtered parameter ePHI
0243   std::vector<float> m_eTHETA_flt;       /// filtered parameter eTHETA
0244   std::vector<float> m_eQOP_flt;         /// filtered parameter eQOP
0245   std::vector<float> m_eT_flt;           /// filtered parameter eT
0246   std::vector<float> m_res_eLOC0_flt;    /// filtered parameter eLOC0 residual
0247   std::vector<float> m_res_eLOC1_flt;    /// filtered parameter eLOC1 residual
0248   std::vector<float> m_res_ePHI_flt;     /// filtered parameter ePHI residual
0249   std::vector<float> m_res_eTHETA_flt;   /// filtered parameter eTHETA residual
0250   std::vector<float> m_res_eQOP_flt;     /// filtered parameter eQOP residual
0251   std::vector<float> m_res_eT_flt;       /// filtered parameter eT residual
0252   std::vector<float> m_err_eLOC0_flt;    /// filtered parameter eLOC0 error
0253   std::vector<float> m_err_eLOC1_flt;    /// filtered parameter eLOC1 error
0254   std::vector<float> m_err_ePHI_flt;     /// filtered parameter ePHI error
0255   std::vector<float> m_err_eTHETA_flt;   /// filtered parameter eTHETA error
0256   std::vector<float> m_err_eQOP_flt;     /// filtered parameter eQOP error
0257   std::vector<float> m_err_eT_flt;       /// filtered parameter eT error
0258   std::vector<float> m_pull_eLOC0_flt;   /// filtered parameter eLOC0 pull
0259   std::vector<float> m_pull_eLOC1_flt;   /// filtered parameter eLOC1 pull
0260   std::vector<float> m_pull_ePHI_flt;    /// filtered parameter ePHI pull
0261   std::vector<float> m_pull_eTHETA_flt;  /// filtered parameter eTHETA pull
0262   std::vector<float> m_pull_eQOP_flt;    /// filtered parameter eQOP pull
0263   std::vector<float> m_pull_eT_flt;      /// filtered parameter eT pull
0264   std::vector<float> m_x_flt;            /// filtered global x
0265   std::vector<float> m_y_flt;            /// filtered global y
0266   std::vector<float> m_z_flt;            /// filtered global z
0267   std::vector<float> m_px_flt;           /// filtered momentum px
0268   std::vector<float> m_py_flt;           /// filtered momentum py
0269   std::vector<float> m_pz_flt;           /// filtered momentum pz
0270   std::vector<float> m_eta_flt;          /// filtered momentum eta
0271   std::vector<float> m_pT_flt;           /// filtered momentum pT
0272   std::vector<float> m_chi2;             /// chisq from filtering
0273 
0274   int m_nSmoothed{0};                    /// number of states with smoothed parameter
0275   std::vector<bool> m_smt;               /// smoothed status
0276   std::vector<float> m_eLOC0_smt;        /// smoothed parameter eLOC0
0277   std::vector<float> m_eLOC1_smt;        /// smoothed parameter eLOC1
0278   std::vector<float> m_ePHI_smt;         /// smoothed parameter ePHI
0279   std::vector<float> m_eTHETA_smt;       /// smoothed parameter eTHETA
0280   std::vector<float> m_eQOP_smt;         /// smoothed parameter eQOP
0281   std::vector<float> m_eT_smt;           /// smoothed parameter eT
0282   std::vector<float> m_res_eLOC0_smt;    /// smoothed parameter eLOC0 residual
0283   std::vector<float> m_res_eLOC1_smt;    /// smoothed parameter eLOC1 residual
0284   std::vector<float> m_res_ePHI_smt;     /// smoothed parameter ePHI residual
0285   std::vector<float> m_res_eTHETA_smt;   /// smoothed parameter eTHETA residual
0286   std::vector<float> m_res_eQOP_smt;     /// smoothed parameter eQOP residual
0287   std::vector<float> m_res_eT_smt;       /// smoothed parameter eT residual
0288   std::vector<float> m_err_eLOC0_smt;    /// smoothed parameter eLOC0 error
0289   std::vector<float> m_err_eLOC1_smt;    /// smoothed parameter eLOC1 error
0290   std::vector<float> m_err_ePHI_smt;     /// smoothed parameter ePHI error
0291   std::vector<float> m_err_eTHETA_smt;   /// smoothed parameter eTHETA error
0292   std::vector<float> m_err_eQOP_smt;     /// smoothed parameter eQOP error
0293   std::vector<float> m_err_eT_smt;       /// smoothed parameter eT error
0294   std::vector<float> m_pull_eLOC0_smt;   /// smoothed parameter eLOC0 pull
0295   std::vector<float> m_pull_eLOC1_smt;   /// smoothed parameter eLOC1 pull
0296   std::vector<float> m_pull_ePHI_smt;    /// smoothed parameter ePHI pull
0297   std::vector<float> m_pull_eTHETA_smt;  /// smoothed parameter eTHETA pull
0298   std::vector<float> m_pull_eQOP_smt;    /// smoothed parameter eQOP pull
0299   std::vector<float> m_pull_eT_smt;      /// smoothed parameter eT pull
0300   std::vector<float> m_x_smt;            /// smoothed global x
0301   std::vector<float> m_y_smt;            /// smoothed global y
0302   std::vector<float> m_z_smt;            /// smoothed global z
0303   std::vector<float> m_px_smt;           /// smoothed momentum px
0304   std::vector<float> m_py_smt;           /// smoothed momentum py
0305   std::vector<float> m_pz_smt;           /// smoothed momentum pz
0306   std::vector<float> m_eta_smt;          /// smoothed momentum eta
0307   std::vector<float> m_pT_smt;           /// smoothed momentum pT
0308 
0309   float m_protoTrackPx{NAN};   /// Proto track px
0310   float m_protoTrackPy{NAN};   /// Proto track py
0311   float m_protoTrackPz{NAN};   /// Proto track pz
0312   float m_protoTrackX{NAN};    /// Proto track PCA x
0313   float m_protoTrackY{NAN};    /// Proto track PCA y
0314   float m_protoTrackZ{NAN};    /// Proto track PCA z
0315   float m_protoD0Cov{NAN};     /// Proto track loc0 covariance
0316   float m_protoZ0Cov{NAN};     /// Proto track loc1 covariance
0317   float m_protoPhiCov{NAN};    /// Proto track phi covariance
0318   float m_protoThetaCov{NAN};  /// Proto track theta covariance
0319   float m_protoQopCov{NAN};    /// Proto track q/p covariance
0320 
0321   std::vector<float> m_SL_lx;    /// Proto track source link local x pos
0322   std::vector<float> m_SL_ly;    /// Proto track source link local y pos
0323   std::vector<float> m_SLx;      /// Proto track source link global x pos
0324   std::vector<float> m_SLy;      /// Proto track source link global y pos
0325   std::vector<float> m_SLz;      /// Proto track source link global z pos
0326   std::vector<float> m_t_SL_lx;  /// Proto track truth hit local x
0327   std::vector<float> m_t_SL_ly;  /// Proto track truth hit local y
0328   std::vector<float> m_t_SL_gx;  /// Proto track truth hit global x
0329   std::vector<float> m_t_SL_gy;  /// Proto track truth hit global y
0330   std::vector<float> m_t_SL_gz;  /// Proto track truth hit global z
0331 };
0332 
0333 #endif