File indexing completed on 2026-08-31 08:21:25
0001 #pragma once
0002
0003 #include <fun4all/SubsysReco.h>
0004
0005 #include <trackbase/TrkrDefs.h>
0006
0007 #include <array>
0008 #include <map>
0009 #include <memory>
0010 #include <string>
0011
0012 class ActsGeometry;
0013 class PHG4TpcGeomContainer;
0014 class PHCompositeNode;
0015 class TpcClusterMover;
0016 class TpcCrossingDecisionContainer;
0017 class Tpc_PolyCluster;
0018 class Tpc_PolyClusterContainer;
0019 class Tpc_PolyTrack;
0020 class Tpc_PolyTrackContainer;
0021 class TrkrClusterContainer;
0022
0023 class TpcPolyClusterTrkrClusterConverter : public SubsysReco
0024 {
0025 public:
0026 explicit TpcPolyClusterTrkrClusterConverter(const std::string& name = "TpcPolyClusterTrkrClusterConverter");
0027 ~TpcPolyClusterTrkrClusterConverter() override;
0028
0029 int InitRun(PHCompositeNode*) override;
0030 int process_event(PHCompositeNode*) override;
0031
0032 void setPolyClusterNodeName(const std::string& name) { m_polyClusterNodeName = name; }
0033 void setPolyTrackNodeName(const std::string& name) { m_polyTrackNodeName = name; }
0034 void setOutputNodeName(const std::string& name) { m_outputNodeName = name; }
0035 void setCrossingDecisionNodeName(const std::string& name) { m_crossingDecisionNodeName = name; }
0036 void setCrossingPeriodNs(double value) { m_crossingPeriodNs = value; }
0037 void setMagneticFieldTesla(double value) { m_magneticFieldTesla = value; }
0038
0039 private:
0040 int getNodes(PHCompositeNode*);
0041 int createNodes(PHCompositeNode*);
0042 void clearOutputTpcClusters();
0043 void buildTrackMap();
0044 bool isAcceptedTrack(const Tpc_PolyTrack* track) const;
0045 bool initializeClusterMover(PHCompositeNode* topNode);
0046 TrkrDefs::cluskey getClusterKey(const Tpc_PolyCluster* cluster) const;
0047 bool seedOutputCluster(const Tpc_PolyCluster* cluster, TrkrDefs::cluskey& cluskey);
0048 void buildMovedClusterMap();
0049 bool localFromMovedGlobal(const Tpc_PolyCluster* cluster, TrkrDefs::cluskey cluskey, const std::array<double, 3>& moved_global,
0050 short crossing, float& local_x, float& local_y, unsigned short& subsurfkey,
0051 unsigned long long& surface_id) const;
0052 bool publishCluster(const Tpc_PolyCluster* cluster, const Tpc_PolyTrack* track) const;
0053
0054 std::string m_polyClusterNodeName {"TPC_POLYCLUSTERS"};
0055 std::string m_polyTrackNodeName {"TPC_POLYTRACKS"};
0056 std::string m_outputNodeName {"TRKR_CLUSTER"};
0057 std::string m_crossingDecisionNodeName {"TPC_CROSSING_DECISIONS"};
0058
0059 Tpc_PolyClusterContainer* m_polyClusters {nullptr};
0060 Tpc_PolyTrackContainer* m_polyTracks {nullptr};
0061 TrkrClusterContainer* m_outputClusters {nullptr};
0062 TpcCrossingDecisionContainer* m_crossingDecisions {nullptr};
0063 ActsGeometry* m_geometry {nullptr};
0064 PHG4TpcGeomContainer* m_tpcGeomContainer {nullptr};
0065 std::unique_ptr<TpcClusterMover> m_clusterMover;
0066 std::map<unsigned int, const Tpc_PolyTrack*> m_tracksBySourceId;
0067 std::map<TrkrDefs::cluskey, std::array<double, 3>> m_movedGlobals;
0068 std::map<TrkrDefs::cluskey, unsigned short> m_seedSubSurfKeys;
0069 double m_crossingPeriodNs {106.56};
0070 double m_magneticFieldTesla {1.4};
0071 };