Back to home page

sPhenix code displayed by LXR

 
 

    


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 };