Back to home page

sPhenix code displayed by LXR

 
 

    


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

0001 /*!
0002  *  \file       TpcPrototypeGenFitTrkFitter.h
0003  *  \brief      Refit SvtxTracks with PHGenFit.
0004  *  \details    Refit SvtxTracks with PHGenFit.
0005  *  \author     Haiwang Yu <yuhw@nmsu.edu>
0006  */
0007 
0008 #ifndef TRACKRECO_TpcPrototypeGenFitTrkFitter_H
0009 #define TRACKRECO_TpcPrototypeGenFitTrkFitter_H
0010 
0011 #include <fun4all/SubsysReco.h>
0012 
0013 #include <TMatrixFfwd.h>  // for TMatrixF
0014 #include <TVector3.h>     // for TVector3
0015 
0016 #include <cstddef>  // for NULL
0017 #include <memory>   // for shared_ptr
0018 #include <string>
0019 #include <vector>
0020 
0021 class TClonesArray;
0022 
0023 namespace PHGenFit
0024 {
0025 class Track;
0026 } /* namespace PHGenFit */
0027 
0028 namespace genfit
0029 {
0030 class GFRaveVertex;
0031 class GFRaveVertexFactory;
0032 class Track;
0033 } /* namespace genfit */
0034 
0035 class SvtxTrack;
0036 namespace PHGenFit
0037 {
0038 class Fitter;
0039 } /* namespace PHGenFit */
0040 
0041 class SvtxTrackMap;
0042 class SvtxVertexMap;
0043 class TrkrCluster;
0044 class SvtxVertex;
0045 class PHCompositeNode;
0046 //class PHG4TruthInfoContainer;
0047 class TrkrClusterContainer;
0048 class TTree;
0049 class TpcPrototypeTrack;
0050 
0051 //! \brief      Refit SvtxTracks with PHGenFit.
0052 class TpcPrototypeGenFitTrkFitter : public SubsysReco
0053 {
0054  public:
0055   /*!
0056      * OverwriteOriginalNode: default mode, overwrite original node
0057      * MakeNewNode: Output extra new refit nodes
0058      * DebugMode: overwrite original node also make extra new refit nodes
0059      */
0060   enum OutPutMode
0061   {
0062     MakeNewNode,
0063     OverwriteOriginalNode,
0064     DebugMode
0065   };
0066 
0067   enum DetectorType
0068   {
0069     MIE,
0070     MAPS_TPC,
0071     MAPS_IT_TPC,
0072     LADDER_MAPS_TPC,
0073     LADDER_MAPS_IT_TPC,
0074     LADDER_MAPS_LADDER_IT_TPC,
0075     MAPS_LADDER_IT_TPC
0076   };
0077 
0078   //! Default constructor
0079   TpcPrototypeGenFitTrkFitter(const std::string& name = "TpcPrototypeGenFitTrkFitter");
0080 
0081   //! dtor
0082   ~TpcPrototypeGenFitTrkFitter();
0083 
0084   //!Initialization, called for initialization
0085   int Init(PHCompositeNode*);
0086 
0087   //!Initialization Run, called for initialization of a run
0088   int InitRun(PHCompositeNode*);
0089 
0090   //!Process Event, called for each event
0091   int process_event(PHCompositeNode*);
0092 
0093   //!End, write and close files
0094   int End(PHCompositeNode*);
0095 
0096   //Flags of different kinds of outputs
0097   enum Flag
0098   {
0099     //all disabled
0100     NONE = 0,
0101   };
0102 
0103   //Set the flag
0104   //Flags should be set like set_flag(TpcPrototypeGenFitTrkFitter::TRUTH, true) from macro
0105   void set_flag(const Flag& flag, const bool& value)
0106   {
0107     if (value)
0108       _flags |= flag;
0109     else
0110       _flags &= (~flag);
0111   }
0112 
0113   //! For evalution
0114   //! Change eval output filename
0115   void set_eval_filename(const std::string& file)
0116   {
0117     _eval_outname = file;
0118   }
0119   std::string get_eval_filename() const
0120   {
0121     return _eval_outname;
0122   }
0123 
0124   void fill_eval_tree(PHCompositeNode*);
0125   void init_eval_tree();
0126   void reset_eval_variables();
0127 
0128   bool is_do_eval() const
0129   {
0130     return _do_eval;
0131   }
0132 
0133   void set_do_eval(bool doEval)
0134   {
0135     _do_eval = doEval;
0136   }
0137 
0138   bool is_do_evt_display() const
0139   {
0140     return _do_evt_display;
0141   }
0142 
0143   void set_do_evt_display(bool doEvtDisplay)
0144   {
0145     _do_evt_display = doEvtDisplay;
0146   }
0147 
0148   const std::string& get_vertexing_method() const
0149   {
0150     return _vertexing_method;
0151   }
0152 
0153   void set_vertexing_method(const std::string& vertexingMethod)
0154   {
0155     _vertexing_method = vertexingMethod;
0156   }
0157 
0158   bool is_fit_primary_tracks() const
0159   {
0160     return _fit_primary_tracks;
0161   }
0162 
0163   void set_fit_primary_tracks(bool fitPrimaryTracks)
0164   {
0165     _fit_primary_tracks = fitPrimaryTracks;
0166   }
0167 
0168   OutPutMode get_output_mode() const
0169   {
0170     return _output_mode;
0171   }
0172 
0173   /*!
0174      * set output mode, default is OverwriteOriginalNode
0175      */
0176   void set_output_mode(OutPutMode outputMode)
0177   {
0178     _output_mode = outputMode;
0179   }
0180 
0181   const std::string& get_track_fitting_alg_name() const
0182   {
0183     return _track_fitting_alg_name;
0184   }
0185 
0186   void set_track_fitting_alg_name(const std::string& trackFittingAlgName)
0187   {
0188     _track_fitting_alg_name = trackFittingAlgName;
0189   }
0190 
0191   int get_primary_pid_guess() const
0192   {
0193     return _primary_pid_guess;
0194   }
0195 
0196   void set_primary_pid_guess(int primaryPidGuess)
0197   {
0198     _primary_pid_guess = primaryPidGuess;
0199   }
0200 
0201   double get_fit_min_pT() const
0202   {
0203     return _fit_min_pT;
0204   }
0205 
0206   void set_fit_min_pT(double cutMinPT)
0207   {
0208     _fit_min_pT = cutMinPT;
0209   }
0210 
0211   bool is_over_write_svtxtrackmap() const
0212   {
0213     return _over_write_svtxtrackmap;
0214   }
0215 
0216   void set_over_write_svtxtrackmap(bool overWriteSvtxtrackmap)
0217   {
0218     _over_write_svtxtrackmap = overWriteSvtxtrackmap;
0219   }
0220 
0221   bool is_over_write_svtxvertexmap() const
0222   {
0223     return _over_write_svtxvertexmap;
0224   }
0225 
0226   void set_over_write_svtxvertexmap(bool overWriteSvtxvertexmap)
0227   {
0228     _over_write_svtxvertexmap = overWriteSvtxvertexmap;
0229   }
0230 
0231   bool is_use_truth_vertex() const
0232   {
0233     return _use_truth_vertex;
0234   }
0235 
0236   void set_use_truth_vertex(bool useTruthVertex)
0237   {
0238     _use_truth_vertex = useTruthVertex;
0239   }
0240 
0241   double get_vertex_min_ndf() const
0242   {
0243     return _vertex_min_ndf;
0244   }
0245 
0246   void set_vertex_min_ndf(double vertexMinPT)
0247   {
0248     _vertex_min_ndf = vertexMinPT;
0249   }
0250 
0251  private:
0252   //! Event counter
0253   int _event;
0254 
0255   //! Get all the nodes
0256   int GetNodes(PHCompositeNode*);
0257 
0258   //!Create New nodes
0259   int CreateNodes(PHCompositeNode*);
0260 
0261   /*
0262      * fit track with SvtxTrack as input seed.
0263      * \param intrack Input SvtxTrack
0264      * \param invertex Input Vertex, if fit track as a primary vertex
0265      */
0266   std::shared_ptr<PHGenFit::Track> ReFitTrack(PHCompositeNode*, const SvtxTrack* intrack, const SvtxVertex* invertex = NULL);
0267 
0268   // build a track as a container displaying unused clusters
0269   std::shared_ptr<PHGenFit::Track> DisplayCluster(const TrkrCluster* cluster);
0270 
0271   //! Make SvtxTrack from PHGenFit::Track and SvtxTrack
0272   std::shared_ptr<SvtxTrack> MakeSvtxTrack(const SvtxTrack* svtxtrack, const std::shared_ptr<PHGenFit::Track>& genfit_track, const SvtxVertex* vertex = NULL);
0273 
0274   //! Make TpcPrototypeTrack from SvtxTrack, refit by "excluding" each cluster
0275   std::shared_ptr<TpcPrototypeTrack> MakeTpcPrototypeTrack(const SvtxTrack* svtxtrack);
0276 
0277   //! Fill SvtxVertexMap from GFRaveVertexes and Tracks
0278   bool FillSvtxVertexMap(
0279       const std::vector<genfit::GFRaveVertex*>& rave_vertices,
0280       const std::vector<genfit::Track*>& gf_tracks);
0281 
0282   bool pos_cov_uvn_to_rz(
0283       const TVector3& u,
0284       const TVector3& v,
0285       const TVector3& n,
0286       const TMatrixF& pos_in,
0287       const TMatrixF& cov_in,
0288       TMatrixF& pos_out,
0289       TMatrixF& cov_out) const;
0290 
0291   bool get_vertex_error_uvn(
0292       const TVector3& u,
0293       const TVector3& v,
0294       const TVector3& n,
0295       const TMatrixF& cov_in,
0296       TMatrixF& cov_out) const;
0297 
0298   bool pos_cov_XYZ_to_RZ(
0299       const TVector3& n,
0300       const TMatrixF& pos_in,
0301       const TMatrixF& cov_in,
0302       TMatrixF& pos_out,
0303       TMatrixF& cov_out) const;
0304 
0305   /*!
0306      * Get 3D Rotation Matrix that rotates frame (x,y,z) to (x',y',z')
0307      * Default rotate local to global, or rotate vector in global to local representation
0308      */
0309   TMatrixF get_rotation_matrix(
0310       const TVector3 x,
0311       const TVector3 y,
0312       const TVector3 z,
0313       const TVector3 xp = TVector3(1., 0., 0.),
0314       const TVector3 yp = TVector3(0., 1., 0.),
0315       const TVector3 zp = TVector3(0., 0., 1.)) const;
0316 
0317   //!flags
0318   unsigned int _flags;
0319 
0320   //bool _make_separate_nodes;
0321   OutPutMode _output_mode;
0322 
0323   bool _over_write_svtxtrackmap;
0324   bool _over_write_svtxvertexmap;
0325 
0326   bool _fit_primary_tracks;
0327 
0328   //!
0329   bool _use_truth_vertex;
0330 
0331   PHGenFit::Fitter* _fitter;
0332 
0333   //! KalmanFitterRefTrack, KalmanFitter, DafSimple, DafRef
0334   std::string _track_fitting_alg_name;
0335 
0336   int _primary_pid_guess;
0337   double _fit_min_pT;
0338   double _vertex_min_ndf;
0339 
0340   genfit::GFRaveVertexFactory* _vertex_finder;
0341 
0342   //! https://rave.hepforge.org/trac/wiki/RaveMethods
0343   std::string _vertexing_method;
0344 
0345   //PHRaveVertexFactory* _vertex_finder;
0346 
0347   //! Input Node pointers
0348   //  PHG4TruthInfoContainer* _truth_container;
0349   TrkrClusterContainer* _clustermap;
0350   SvtxTrackMap* _trackmap;
0351   SvtxVertexMap* _vertexmap;
0352 
0353   //! Output Node pointers
0354   SvtxTrackMap* _trackmap_refit;
0355   SvtxTrackMap* _primary_trackmap;
0356   SvtxVertexMap* _vertexmap_refit;
0357 
0358   //! Evaluation
0359   //! switch eval out
0360   bool _do_eval;
0361 
0362   //! eval output filename
0363   std::string _eval_outname;
0364 
0365   TTree* _eval_tree;
0366   int _tca_ntrack;
0367   TClonesArray* _tca_particlemap;
0368   TClonesArray* _tca_vtxmap;
0369   TClonesArray* _tca_trackmap;
0370   TClonesArray* _tca_tpctrackmap;
0371   TClonesArray* _tca_vertexmap;
0372   TClonesArray* _tca_trackmap_refit;
0373   TClonesArray* _tca_primtrackmap;
0374   TClonesArray* _tca_vertexmap_refit;
0375 
0376   TTree* _cluster_eval_tree;
0377   float _cluster_eval_tree_x;
0378   float _cluster_eval_tree_y;
0379   float _cluster_eval_tree_z;
0380   float _cluster_eval_tree_gx;
0381   float _cluster_eval_tree_gy;
0382   float _cluster_eval_tree_gz;
0383 
0384   bool _do_evt_display;
0385 };
0386 
0387 #endif