File indexing completed on 2024-11-25 02:29:56
0001 #ifndef DataFormats_HGCalReco_TICLGraph_h
0002 #define DataFormats_HGCalReco_TICLGraph_h
0003
0004 #include "DataFormats/HGCalReco/interface/Trackster.h"
0005 #include "DataFormats/TrackReco/interface/Track.h"
0006 #include <unordered_set>
0007
0008 namespace ticl {
0009
0010 class Node {
0011 public:
0012 Node() = default;
0013 Node(unsigned index, bool isTrackster = true) : index_(index), isTrackster_(isTrackster), alreadyVisited_{false} {};
0014
0015 inline void addOuterNeighbour(unsigned int trackster_id) { outerNeighboursId_.push_back(trackster_id); }
0016 inline void addInnerNeighbour(unsigned int trackster_id) { innerNeighboursId_.push_back(trackster_id); }
0017
0018 inline const unsigned int getId() const { return index_; }
0019 const std::vector<unsigned int>& getOuterNeighbours() const { return outerNeighboursId_; }
0020 const std::vector<unsigned int>& getInnerNeighbours() const { return innerNeighboursId_; }
0021 void findSubComponents(std::vector<Node>& graph, std::vector<unsigned int>& subComponent);
0022
0023 inline bool isInnerNeighbour(const unsigned int tid) {
0024 auto findInner = std::find(innerNeighboursId_.begin(), innerNeighboursId_.end(), tid);
0025 return findInner != innerNeighboursId_.end();
0026 }
0027 inline bool alreadyVisited() const { return alreadyVisited_; }
0028
0029 ~Node() = default;
0030
0031 private:
0032 unsigned int index_;
0033 bool isTrackster_;
0034
0035 std::vector<unsigned int> outerNeighboursId_;
0036 std::vector<unsigned int> innerNeighboursId_;
0037 bool alreadyVisited_;
0038
0039
0040 };
0041 }
0042
0043 class TICLGraph {
0044 public:
0045
0046
0047 TICLGraph() = default;
0048 TICLGraph(std::vector<ticl::Node>& nodes);
0049 inline const std::vector<ticl::Node>& getNodes() const { return nodes_; }
0050 inline const ticl::Node& getNode(int i) const { return nodes_[i]; }
0051 inline std::vector<ticl::Node> getRootNodes() const { return rootNodes_; }
0052 inline void findRootNodes();
0053
0054 std::vector<std::vector<unsigned int>> findSubComponents();
0055 std::vector<std::vector<unsigned int>> findSubComponents(std::vector<ticl::Node>& rootNodes);
0056
0057 ~TICLGraph() = default;
0058
0059 std::vector<std::vector<unsigned int>> getConnectedComponents() const;
0060 bool isGraphOk();
0061
0062 private:
0063 std::vector<ticl::Node> nodes_;
0064 std::vector<ticl::Node> rootNodes_;
0065 std::vector<int> isRootNode_;
0066 };
0067
0068 #endif