Program Listing for File TrackClusterBuilder.h

Return to documentation for file (larflow/Reco/TrackClusterBuilder.h)

#ifndef __LARFLOW_RECO_TRACK_CLUSTER_BUILDER_H__
#define __LARFLOW_RECO_TRACK_CLUSTER_BUILDER_H__

#include <map>

#include "larcv/core/Base/larcv_base.h"
#include "larcv/core/DataFormat/IOManager.h"

#include "DataFormat/storage_manager.h"
#include "DataFormat/pcaxis.h"
#include "DataFormat/larflowcluster.h"
#include "DataFormat/track.h"

namespace larflow {
namespace reco {

  class TrackClusterBuilder : public larcv::larcv_base {

  public:

    TrackClusterBuilder()
      : larcv::larcv_base("TrackClusterBuilder"),
      _one_track_per_startpoint(true)
        {};
    virtual ~TrackClusterBuilder() {};

    void process( larcv::IOManager& iolcv, larlite::storage_manager& ioll );


    struct Segment_t;

    struct Connection_t {
      Segment_t* node;
      int     from_seg_idx;
      int     to_seg_idx;
      int     endidx;
      float   dist;
      float   cosine;
      float   cosine_seg;
      std::vector<float> dir;
    };

    struct NodePos_t {
      int nodeidx;
      int segidx;
      bool inpath;
      bool veto;
      std::vector<float> pos;
      NodePos_t()
      : nodeidx(-1),
        segidx(-1),
        inpath(false),
        veto(false),
        pos( {0,0,0} )
      {};
    };

    // This represents a line segment
    struct Segment_t {
      const larlite::larflowcluster* cluster;
      const larlite::pcaxis*         pca;
      std::vector<float> start;
      std::vector<float> end;
      std::vector<float> dir;
      std::vector< Connection_t* > con_start;
      std::vector< Connection_t* > con_end;
      float len;
      int idx;
      bool inpath;
      bool visited;

      Segment_t()
      : len(0),
        idx(-1),
        inpath(false),
        visited(false)
      {};

      Segment_t( std::vector<float>& s, std::vector<float>& e ) {
        start = s;
        end = e;
        len = 0.;
        dir.resize(3,0);
        for (int i=0; i<3; i++ ) {
          dir[i] = end[i]-start[i];
          len += dir[i]*dir[i];
        }
        len = sqrt(len);
        if ( len>0 ) {
          for (int i=0; i<3; i++)
            dir[i] /= len;
        }
        cluster = nullptr;
        pca = nullptr;
        idx = -1;
        inpath = false;
      };
    };

  protected:

    // DATA CONTAINERS
    // ----------------

    // library of all segments created
    std::vector< Segment_t > _segment_v;
    std::vector< NodePos_t > _nodepos_v;

    // connection libraries
    // two types:
    //  (1) connection between ends of the same segment
    //  (2) connection between ends of different segments
    std::map< std::pair<int,int>, Connection_t > _connect_m;
    std::map< std::pair<int,int>, Connection_t > _segedge_m;

    // track proposals
    std::vector< std::vector<NodePos_t*> > _track_proposal_v;

    // PARAMETERS
    // -----------
    bool _one_track_per_startpoint;

  public:

    void loadClusterLibrary( const larlite::event_larflowcluster& cluster_v,
                             const larlite::event_pcaxis& pcaxis_v );

    void buildNodeConnections();

    void buildTracksFromPoint( const std::vector<float>& startpoint );

    void clear();

    void clearProposals() { _track_proposal_v.clear(); };

    void fillLarliteTrackContainer( larlite::event_track& ev_track );

    void set_output_one_track_per_startpoint( bool output_only_one ) { _one_track_per_startpoint=output_only_one; };

    std::string str( const Segment_t& seg );

  protected:

    void _recursiveFollowPath( NodePos_t& node,
                               std::vector<float>& path_dir,
                               std::vector<NodePos_t*>& path,
                               std::vector< const std::vector<float>* > path_dir_v,
                               std::vector< std::vector<NodePos_t*> >& complete );


    void _choose_best_paths( std::vector< std::vector<NodePos_t*> >& complete_v,
                             std::vector< std::vector<NodePos_t*> >& filtered_v );

    void _buildTracksFromSegments();

  };

}
}


#endif