Back to home page

sPhenix code displayed by LXR

 
 

    


File indexing completed on 2026-10-15 08:21:05

0001 #ifndef PARTICLEFLOWRECO_H
0002 #define PARTICLEFLOWRECO_H
0003 
0004 //===========================================================
0005 /// \file ParticleFlowReco.h
0006 /// \brief Particle flow event reconstruction
0007 /// \author Dennis V. Perepelitsa
0008 //===========================================================
0009 
0010 #include <fun4all/SubsysReco.h>
0011 
0012 #include <CLHEP/Vector/ThreeVector.h>
0013 
0014 #include <gsl/gsl_rng.h>
0015 
0016 #include <string>
0017 #include <vector>
0018 
0019 class PHCompositeNode;
0020 class SvtxTrack;
0021 class SvtxTrackMap;
0022 class RawCluster;
0023 class RawClusterContainer;
0024 class GlobalVertexMap;
0025 class SvtxVertexMap;
0026 class ParticleFlowElementContainer;
0027 class RawTowerGeomContainer;
0028 
0029 class ParticleFlowReco : public SubsysReco
0030 {
0031  public:
0032   ParticleFlowReco(const std::string &name = "ParticleFlowReco");
0033 
0034   ~ParticleFlowReco() override = default;
0035 
0036   int InitRun(PHCompositeNode *topNode) override;
0037 
0038   int process_event(PHCompositeNode *topNode) override;
0039 
0040   void set_energy_match_Nsigma(float Nsigma)
0041   {
0042     _energy_match_Nsigma = Nsigma;
0043   }
0044   void set_track_map_name(std::string &name) { _track_map_name = name; }
0045 
0046   void set_only_crossing_zero(bool b) { _only_crossing_zero = b; }
0047 
0048   void dont_use_global_vertex(bool b) { _dont_use_global_vertex = b; }
0049 
0050   void set_track_min_pt(float ptmin) { _min_track_pt = ptmin; }
0051 
0052   void set_track_eta_acc(float eta_acc) { _acc_track_eta = eta_acc; }
0053 
0054   void use_overlap_match(bool b) { _use_overlap_match = b; }
0055 
0056   void set_trk_emc_overlap_phi(float f) { _trk_emc_overlap_phi = f; }
0057   void set_trk_emc_overlap_eta(float f) { _trk_emc_overlap_eta = f; }
0058   void set_trk_had_overlap_phi(float f) { _trk_had_overlap_phi = f; }
0059   void set_trk_had_overlap_eta(float f) { _trk_had_overlap_eta = f; }
0060   void set_emc_had_overlap_phi(float f) { _emc_had_overlap_phi = f; }
0061   void set_emc_had_overlap_eta(float f) { _emc_had_overlap_eta = f; }
0062 
0063   void set_isEMCalDetailedGeo(bool b) { _isEMCalDetailedGeo = b; }
0064 
0065  private:
0066   void ResetRepresentation();
0067   void PrepareTracks();
0068   void PrepareEMCalClusters();
0069   void PrepareHCalClusters();
0070   void LinkTrackToCaloClusters();
0071   void LinkEMCalToHCalClusters();
0072   void LinkTrackToHCalViaEMCal();
0073   void ProcessMatchedHCalClusters();
0074   void ProcessMatchedEMCalClusters();
0075   void ProcessClusterOnlyMatch();
0076   void ProcessUnmatchedEMCalClusters();
0077   void ProcessUnmatchedHCalClusters();
0078   void ProcessUnmatchedTracks();
0079   CLHEP::Hep3Vector GetVertexForCalorimeter();
0080 
0081   std::pair<int, int> GetCaloLimits(CLHEP::Hep3Vector &cluster, int trackID);
0082   CLHEP::Hep3Vector Minimize_PhiEta(CLHEP::Hep3Vector &cluster, int trackID, CLHEP::Hep3Vector &vertex, bool ok);
0083 
0084   bool isAcceptableTrack(SvtxTrack *track);
0085 
0086   int CreateNode(PHCompositeNode *topNode);
0087 
0088   float calculate_dR(float, float, float, float);
0089   std::pair<float, float> get_expected_signature(int);
0090 
0091   bool _only_crossing_zero = true;
0092   bool _dont_use_global_vertex = false;
0093   float _energy_match_Nsigma;
0094   int _global_pflow_index = 0;
0095   bool _use_overlap_match = true;
0096   float _trk_emc_overlap_phi = 2.5;
0097   float _trk_emc_overlap_eta = 2.5;
0098   float _trk_had_overlap_phi = 1.5;
0099   float _trk_had_overlap_eta = 1.5;
0100   float _emc_had_overlap_phi = 1.5;
0101   float _emc_had_overlap_eta = 1.5;
0102 
0103   RawTowerGeomContainer *_geomEM = nullptr;
0104   RawTowerGeomContainer *_geomIH = nullptr;
0105   RawTowerGeomContainer *_geomOH = nullptr;
0106 
0107   SvtxTrackMap *_trackmap = nullptr;
0108   RawClusterContainer *_clustersEM = nullptr;
0109   RawClusterContainer *_clustersHAD = nullptr;
0110 
0111   ParticleFlowElementContainer *_pflowContainer = nullptr;
0112 
0113   GlobalVertexMap *_global_vertexmap = nullptr;
0114   SvtxVertexMap *_svtx_vertexmap = nullptr;
0115 
0116   std::vector<float> _pflow_TRK_p;
0117   std::vector<int> _pflow_TRK_vertex;
0118   std::vector<float> _pflow_TRK_eta;
0119   std::vector<float> _pflow_TRK_phi;
0120   std::vector<std::vector<CLHEP::Hep3Vector>> _pflow_TRK_projections;
0121   /*
0122   std::vector<float> _pflow_TRK_EMproj_x;
0123   std::vector<float> _pflow_TRK_EMproj_y;
0124   std::vector<float> _pflow_TRK_EMproj_z;
0125   std::vector<float> _pflow_TRK_HADproj_x;
0126   std::vector<float> _pflow_TRK_HADproj_y;
0127   std::vector<float> _pflow_TRK_HADproj_z;
0128   */
0129   std::vector<SvtxTrack *> _pflow_TRK_trk;
0130   std::vector<std::vector<int> > _pflow_TRK_match_EM;
0131   std::vector<std::vector<int> > _pflow_TRK_match_HAD;
0132 
0133   // convention is ( EM index, dR value )
0134   std::vector<std::vector<std::pair<int, float> > > _pflow_TRK_addtl_match_EM;
0135 
0136   std::vector<float> _pflow_EM_E;
0137   std::vector<float> _pflow_EM_x;
0138   std::vector<float> _pflow_EM_y;
0139   std::vector<float> _pflow_EM_z;
0140   std::vector<RawCluster *> _pflow_EM_cluster;
0141   std::vector<std::vector<float> > _pflow_EM_tower_x;
0142   std::vector<std::vector<float> > _pflow_EM_tower_y;
0143   std::vector<std::vector<float> > _pflow_EM_tower_z;
0144   std::vector<std::vector<int> > _pflow_EM_match_HAD;
0145   std::vector<std::vector<int> > _pflow_EM_match_TRK;
0146 
0147   std::vector<float> _pflow_HAD_E;
0148   std::vector<float> _pflow_HAD_x;
0149   std::vector<float> _pflow_HAD_y;
0150   std::vector<float> _pflow_HAD_z;
0151   std::vector<RawCluster *> _pflow_HAD_cluster;
0152   std::vector<std::vector<float> > _pflow_HAD_tower_x;
0153   std::vector<std::vector<float> > _pflow_HAD_tower_y;
0154   std::vector<std::vector<float> > _pflow_HAD_tower_z;
0155   std::vector<std::vector<int> > _pflow_HAD_match_EM;
0156   std::vector<std::vector<int> > _pflow_HAD_match_TRK;
0157 
0158   std::string _track_map_name = "SvtxTrackMap";
0159   float _min_track_pt = 0.2;
0160   float _acc_track_eta = 1.1;
0161   bool _isEMCalDetailedGeo = false;
0162 
0163 };
0164 
0165 #endif  // PARTICLEFLOWRECO_H