.. _program_listing_file_larflow_Reco_KPSRecoManager.cxx: Program Listing for File KPSRecoManager.cxx =========================================== |exhale_lsh| :ref:`Return to documentation for file ` (``larflow/Reco/KPSRecoManager.cxx``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #include "KPSRecoManager.h" // larlite #include "DataFormat/opflash.h" #include "larcv/core/DataFormat/EventChStatus.h" #include "larcv/core/DataFormat/EventImage2D.h" #include "larflow/LArFlowConstants/LArFlowConstants.h" namespace larflow { namespace reco { KPSRecoManager::KPSRecoManager( std::string inputfile_name ) : larcv::larcv_base("KPSRecoManager"), _ana_output_file(inputfile_name) { make_ana_file(); _nuvertexmaker.add_nuvertex_branch( _ana_tree ); } KPSRecoManager::~KPSRecoManager() { } void KPSRecoManager::process( larcv::IOManager& iolcv, larlite::storage_manager& ioll ) { // PREP: make bad channel image larcv::EventImage2D* ev_adc = (larcv::EventImage2D*)iolcv.get_data(larcv::kProductImage2D, "wire"); auto const& adc_v = ev_adc->Image2DArray(); larcv::EventChStatus* ev_chstatus = (larcv::EventChStatus*)iolcv.get_data(larcv::kProductChStatus, "wire"); std::vector gapch_v = _badchmaker.makeGapChannelImage( adc_v, *ev_chstatus, 4, 3, 2400, 6*1008, 3456, 6, 1, 5.0, 50, -1.0 ); LARCV_INFO() << "Number of badcv images made: " << gapch_v.size() << std::endl; larcv::EventImage2D* evout_badch = (larcv::EventImage2D*)iolcv.get_data(larcv::kProductImage2D,"badch"); for ( auto& gap : gapch_v ) { evout_badch->Emplace( std::move(gap) ); } // PREP SETS OF HITS // ------------------ // PREP WC-FILTERED HITS _wcfilter.set_verbosity( larcv::msg::kINFO ); _wcfilter.set_input_larmatch_tree_name( "larmatch" ); _wcfilter.set_output_filteredhits_tree_name( "taggerfilterhit" ); _wcfilter.set_save_rejected_hits( true ); _wcfilter.process_hits( iolcv, ioll ); // PREP: SPLIT WC-FILTERED HITS INTO TRACK/SHOWER // input: // * image2d_ubspurn_planeX: ssnet (track,shower) scores // * larflow3dhit_larmatch_tree: output of KPS larmatch network // output: // * larflow3dhit_showerhit_tree // * larflow3dhit_trackhit_tree _splithits_wcfilter.set_larmatch_tree_name( "taggerfilterhit" ); _splithits_wcfilter.set_output_tree_stem_name( "ssnetsplit_wcfilter" ); _splithits_wcfilter.process( iolcv, ioll ); // PREP: ENFORCE UNIQUE PIXEL PREDICTION USING MAX SCORE FOR TRACK HITS _choosemaxhit.set_input_larflow3dhit_treename( "ssnetsplit_wcfilter_trackhit" ); _choosemaxhit.set_output_larflow3dhit_treename( "maxtrackhit_wcfilter" ); _choosemaxhit.set_verbosity( larcv::msg::kINFO ); _choosemaxhit.process( iolcv, ioll ); // CLEAN UP SHOWER HITS BY CHOOSING MAX FROM Y-plane _choosemaxhit.set_input_larflow3dhit_treename( "ssnetsplit_wcfilter_showerhit" ); _choosemaxhit.set_output_larflow3dhit_treename( "maxshowerhit" ); _choosemaxhit.set_verbosity( larcv::msg::kINFO ); _choosemaxhit.process( iolcv, ioll ); // PREP: SPLIT SHOWER/TRACK FOR COSMIC HITS _splithits_full.set_larmatch_tree_name( "taggerrejecthit" ); _splithits_full.set_output_tree_stem_name( "ssnetsplit_full" ); _splithits_full.process( iolcv, ioll ); // PREP: MAX-SCORE REDUCTION ON COSMIC HITS _choosemaxhit.set_input_larflow3dhit_treename( "ssnetsplit_full_trackhit" ); _choosemaxhit.set_output_larflow3dhit_treename( "full_maxtrackhit" ); _choosemaxhit.process( iolcv, ioll ); // Make keypoints recoKeypoints( iolcv, ioll ); if ( false ) { // for debug _ana_run = ev_adc->run(); _ana_subrun = ev_adc->subrun(); _ana_event = ev_adc->event(); _ana_tree->Fill(); return; } // FILTER KEYPOINTS: To be on clusters larger than X hits // _kpfilter.set_verbosity( larcv::msg::kDEBUG ); // _kpfilter.set_input_keypoint_tree_name( "taggerfilterkeypoint" ); // _kpfilter.set_input_larflowhits_tree_name( "taggerfilterhit" ); // _kpfilter.process( iolcv, ioll ); // PARTICLE FRAGMENT RECO recoParticles( iolcv, ioll ); // COSMIC RECO _cosmic_track_builder.clear(); //_cosmic_track_builder.set_verbosity( larcv::msg::kDEBUG ); _cosmic_track_builder.set_verbosity( larcv::msg::kINFO ); _cosmic_track_builder.do_boundary_analysis( true ); _cosmic_track_builder.process( iolcv, ioll ); // MULTI-PRONG INTERNAL RECO multiProngReco( iolcv, ioll ); // Single particle interactions // Copy larlite contents // in-time opflash larlite::event_opflash* ev_input_opflash_beam = (larlite::event_opflash*)ioll.get_data(larlite::data::kOpFlash,"simpleFlashBeam"); larlite::event_opflash* evout_opflash_beam = (larlite::event_opflash*)ioll.get_data(larlite::data::kOpFlash,"simpleFlashBeam"); for ( auto const& flash : *ev_input_opflash_beam ) evout_opflash_beam->push_back( flash ); // Fill Ana Tree _ana_run = ev_adc->run(); _ana_subrun = ev_adc->subrun(); _ana_event = ev_adc->event(); _ana_tree->Fill(); } void KPSRecoManager::recoKeypoints( larcv::IOManager& iolcv, larlite::storage_manager& ioll ) { // KEYPOINT RECO: make keypoint candidates // * larflow3dhit_larmatch_tree: output of KPS larmatch network // output: // * _kpreco.output_pt_v: container of KPCluster objects // neutrino _kpreco_nu.set_input_larmatch_tree_name( "taggerfilterhit" ); _kpreco_nu.set_sigma( 10.0 ); _kpreco_nu.set_min_cluster_size( 50.0, 0 ); _kpreco_nu.set_keypoint_threshold( 0.5, 0 ); _kpreco_nu.set_min_cluster_size( 20.0, 1 ); _kpreco_nu.set_keypoint_threshold( 0.5, 1 ); _kpreco_nu.set_larmatch_threshold( 0.5 ); _kpreco_nu.set_keypoint_type( (int)larflow::kNuVertex ); _kpreco_nu.set_lfhit_score_index( 13 ); _kpreco_nu.process( ioll ); _kpreco_track.set_input_larmatch_tree_name( "taggerfilterhit" ); _kpreco_track.set_sigma( 10.0 ); _kpreco_track.set_min_cluster_size( 50.0, 0 ); _kpreco_track.set_keypoint_threshold( 0.5, 0 ); _kpreco_track.set_min_cluster_size( 20.0, 1 ); _kpreco_track.set_keypoint_threshold( 0.5, 1 ); _kpreco_track.set_larmatch_threshold( 0.5 ); _kpreco_track.set_keypoint_type( (int)larflow::kTrackEnds ); _kpreco_track.set_lfhit_score_index( 14 ); _kpreco_track.process( ioll ); _kpreco_shower.set_input_larmatch_tree_name( "taggerfilterhit" ); _kpreco_shower.set_sigma( 10.0 ); _kpreco_shower.set_min_cluster_size( 50.0, 0 ); _kpreco_shower.set_keypoint_threshold( 0.5, 0 ); _kpreco_shower.set_min_cluster_size( 20.0, 1 ); _kpreco_shower.set_keypoint_threshold( 0.5, 1 ); _kpreco_shower.set_larmatch_threshold( 0.5 ); _kpreco_shower.set_keypoint_type( (int)larflow::kShowerStart ); _kpreco_shower.set_lfhit_score_index( 15 ); _kpreco_shower.process( ioll ); _kpreco_track_cosmic.set_input_larmatch_tree_name( "taggerrejecthit" ); _kpreco_track_cosmic.set_output_tree_name( "keypointcosmic" ); _kpreco_track_cosmic.set_sigma( 50.0 ); _kpreco_track_cosmic.set_min_cluster_size( 50.0, 0 ); _kpreco_track_cosmic.set_max_dbscan_dist( 10.0 ); _kpreco_track_cosmic.set_keypoint_threshold( 0.5, 0 ); _kpreco_track_cosmic.set_min_cluster_size( 20.0, 1 ); _kpreco_track_cosmic.set_keypoint_threshold( 0.5, 1 ); _kpreco_track_cosmic.set_larmatch_threshold( 0.5 ); _kpreco_track_cosmic.set_keypoint_type( (int)larflow::kTrackEnds ); _kpreco_track_cosmic.set_lfhit_score_index( 14 ); _kpreco_track_cosmic.process( ioll ); } void KPSRecoManager::recoParticles( larcv::IOManager& iolcv, larlite::storage_manager& ioll ) { // TRACK 2-KP RECO: make tracks using pairs of keypoints // input: // * larflow3dhit_trackhit_tree: track hits from SplitLArMatchHitsBySSNet // output: // * track_track2kp_tree: output tracks // * larflow3dhit_keypoint_tree: copy of hits passed into algorithm // _tracker2kp.set_verbosity( larcv::msg::kDEBUG ); // _tracker2kp.set_larflow3dhit_tree_name( "trackhit" ); // _tracker2kp.set_keypoint_tree_name( "keypoint_bigcluster" ); // _tracker2kp.process( iolcv, ioll ); // TRACK PCA-CLUSTER: act on remaining clusters //_pcacluster.set_input_larmatchhit_tree_name( "track2kpunused" ); //_pcacluster.set_input_larmatchhit_tree_name( "trackhit" ); //_pcacluster.process( iolcv, ioll ); // PRIMITIVE TRACK FRAGMENTS: WC-FILTER const float _maxdist = 2.0; const float _minsize = 20; const float _maxkd = 100; //_projsplitter.set_verbosity( larcv::msg::kDEBUG ); _projsplitter.set_verbosity( larcv::msg::kINFO ); _projsplitter.set_dbscan_pars( _maxdist, _minsize, _maxkd ); _projsplitter.set_input_larmatchhit_tree_name( "maxtrackhit_wcfilter" ); _projsplitter.set_output_tree_name("trackprojsplit_wcfilter"); _projsplitter.process( iolcv, ioll ); // PRIMITIVE TRACK FRAGMENTS: FULL TRACK HITS _projsplitter_cosmic.set_verbosity( larcv::msg::kINFO ); _projsplitter_cosmic.set_input_larmatchhit_tree_name( "full_maxtrackhit" ); _projsplitter_cosmic.set_output_tree_name("trackprojsplit_full"); _projsplitter_cosmic.process( iolcv, ioll ); // SHOWER 1-KP RECO: make shower using clusters and single keypoint _showerkp.set_ssnet_lfhit_tree_name( "maxshowerhit" ); //_showerkp.set_verbosity( larcv::msg::kDEBUG ); _showerkp.set_verbosity( larcv::msg::kINFO ); _showerkp.process( iolcv, ioll ); // TRACK CLUSTER-ONLY RECO: make tracks without use of keypoints // SHOWER CLUSTER-ONLY RECO: make showers without use of keypoints } void KPSRecoManager::multiProngReco( larcv::IOManager& iolcv, larlite::storage_manager& ioll ) { //_nuvertexmaker.set_verbosity( larcv::msg::kDEBUG ); _nuvertexmaker.set_verbosity( larcv::msg::kINFO ); _nuvertexmaker.clear(); _nuvertexmaker.add_keypoint_producer( "keypoint" ); _nuvertexmaker.add_cluster_producer("trackprojsplit_wcfilter", NuVertexCandidate::kTrack ); _nuvertexmaker.add_cluster_producer("showerkp", NuVertexCandidate::kShowerKP ); _nuvertexmaker.add_cluster_producer("showergoodhit", NuVertexCandidate::kShower ); _nuvertexmaker.apply_cosmic_veto( true ); _nuvertexmaker.process( iolcv, ioll ); _nu_track_builder.clear(); _nu_track_builder.process( iolcv, ioll, _nuvertexmaker.get_nu_candidates() ); } void KPSRecoManager::make_ana_file() { _ana_file = new TFile(_ana_output_file.c_str(), "recreate"); _ana_tree = new TTree("KPSRecoManagerTree","Ana Output of KPSRecoManager algorithms"); _ana_tree->Branch("run",&_ana_run,"run/I"); _ana_tree->Branch("subrun",&_ana_subrun,"subrun/I"); _ana_tree->Branch("event",&_ana_event,"event/I"); } } }