Back to home page

Project CMSSW displayed by LXR

 
 

    


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     //bool areCompatible(const std::vector<Node>& graph, const unsigned int& outerNode) { return true; };
0040   };
0041 }  // namespace ticl
0042 
0043 class TICLGraph {
0044 public:
0045   // can i remove default constructor ?? edm::Wrapper problem
0046   // without default constructor i could initialize connectedComponents when building the Graph
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