File indexing completed on 2026-10-15 08:21:05
0001 #ifndef PARTICLEFLOWRECO_H
0002 #define PARTICLEFLOWRECO_H
0003
0004
0005
0006
0007
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
0123
0124
0125
0126
0127
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
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