Program Listing for File CRTMatch.cxx

Return to documentation for file (larflow/CRTMatch/CRTMatch.cxx)

#include "CRTMatch.h"

#include "larcv/core/DataFormat/EventImage2D.h"
#include "larlite/core/DataFormat/larflowcluster.h"

namespace larflow {
namespace crtmatch {

  void CRTMatch::process( larcv::IOManager& iocv, larlite::storage_manager& ioll ) {

    _hit_matcher.set_verbosity(larcv::msg::kINFO);

    _hit_matcher.process( iocv, ioll );
    _track_matcher.process( iocv, ioll );

    larlite::event_larflowcluster* ev_lfcluster
      = (larlite::event_larflowcluster*) ioll.get_data( larlite::data::kLArFlowCluster, "pcacluster" );

    // we now tag image, and match lfcluster to crttrack cluster, finally labeling untagged
    larcv::EventImage2D* ev_adc = (larcv::EventImage2D*)iocv.get_data( larcv::kProductImage2D, "wire" );
    const std::vector<larcv::Image2D>& adc_v = ev_adc->Image2DArray();

    untagged_v.clear(); // image where matched pixels are removed
    track_index_v.clear(); // image where crt track index labels image, so we can match larflow clusters to it.
    for ( auto const& img : adc_v ) {

      // make a copy to mask
      untagged_v.push_back( img );

      // make a blank to tag with index
      larcv::Image2D hempty( img.meta() );
      hempty.paint(-1.0);
      track_index_v.emplace_back( std::move(hempty) );

    }

    // mark used clusters
    std::vector<int> used_clusters_v( ev_lfcluster->size(), 0 );
    for ( size_t i=0; i<ev_lfcluster->size(); i++ ) {
      if ( !_hit_matcher.was_cluster_used( i ) ) continue;

      used_clusters_v[i] = 1;

      for ( auto const& lfhit : ev_lfcluster->at(i) ) {
        int row = adc_v[0].meta().row( lfhit.tick );
        for ( size_t p=0; p<3; p++ ) {
          untagged_v[p].set_pixel( row, lfhit.targetwire[p], 0.0 );
        }
      }
    }

    // loop over constructed CRT tracks
    float cidx = 0;
    for ( auto const& cluster : _track_matcher.getClusters() ) {
      for ( auto const& lfhit : cluster ) {
        int row = adc_v[0].meta().row( lfhit.tick );
        for ( size_t p=0; p<3; p++ ) {
          track_index_v[p].set_pixel( row, lfhit.targetwire[p], cidx );
          untagged_v[p].set_pixel( row, lfhit.targetwire[p], 0 );
        }
      }
      cidx += 1.0;
    }


    // now match to clusters
    for ( size_t idx=0; idx<ev_lfcluster->size(); idx++ ) {
      if ( used_clusters_v[idx] ) continue;

      std::vector<int> index_counter( _track_matcher.getClusters().size(), 0 );
      for ( auto const& lfhit : ev_lfcluster->at(idx) ) {
        int row = track_index_v[0].meta().row( lfhit.tick );
        for ( size_t p=0; p<3; p++ ) {
          int index = (int)track_index_v[p].pixel( row, lfhit.targetwire[p] );
          if ( index>=0 && index<(int)index_counter.size() )
            index_counter[index]++;
        }
      }

      // if we match 50% we absorb the cluster
      int nmatched = 0;
      for (size_t i=0; i<index_counter.size(); i++ ) {
        nmatched += index_counter[i];
      }

      float frac_matched = float(nmatched)/float(ev_lfcluster->at(idx).size());

      if ( frac_matched>0.3 ) {
        used_clusters_v[idx] = 1;

        // more complete mask
        for ( auto const& lfhit : ev_lfcluster->at(idx) ) {
          int row = adc_v[0].meta().row( lfhit.tick );
          for ( size_t p=0; p<3; p++ )
            untagged_v[p].set_pixel( row, lfhit.targetwire[p], 0 );
        }

      }
    }

    _unmatched_clusters_v.clear();
    for ( size_t idx=0; idx<ev_lfcluster->size(); idx++ ) {
      if ( used_clusters_v[idx] ) continue;

      _unmatched_clusters_v.push_back( ev_lfcluster->at(idx) );
    }

  }

  void CRTMatch::store_output( larcv::IOManager& outlcv,
                               larlite::storage_manager& outll,
                               bool remove_if_no_flash ) {


    _track_matcher.save_to_file( outll, remove_if_no_flash );
    _hit_matcher.save_to_file( outll, remove_if_no_flash );

    larlite::event_larflowcluster* ev_unused =
      (larlite::event_larflowcluster*)outll.get_data( larlite::data::kLArFlowCluster, "crtunmatched" );

    for ( auto const& cluster : _unmatched_clusters_v )
      ev_unused->push_back( cluster );

    larcv::EventImage2D* ev_untagged = (larcv::EventImage2D*)outlcv.get_data(larcv::kProductImage2D, "crtmasked" );
    for ( auto const& img : untagged_v ) {
      ev_untagged->Append(img);
    }

  }

}
}