22 const std::vector<unsigned int>& g4_trackid_v,
23 const std::vector<sim::SimChannel>& simch_v,
28 return BuildMap(clockData, cluster_v);
32 const std::vector<std::vector<unsigned int>>& g4_trackid_v,
33 const std::vector<sim::SimChannel>& simch_v,
39 return BuildMap(clockData, cluster_v);
46 size_t num_cluster = cluster_v.size();
66 for (
auto const& hit_v : cluster_v) {
71 std::vector<WireRange_t> wr_v;
72 wr_v.reserve(hit_v.size());
74 for (
auto const& h : hit_v) {
78 wr.
start = h->StartTick();
79 wr.
end = h->EndTick();
81 if (plane == geo->
Nplanes()) plane = h->WireID().Plane;
89 for (
size_t i = 0; i < mcq_v.size(); ++i)
102 std::vector<std::vector<double>> bmatch_mcq(num_mcobj, std::vector<double>(geo->
Nplanes(), 0));
104 for (
size_t mc_index = 0; mc_index < num_mcobj; ++mc_index) {
106 for (
size_t cluster_index = 0; cluster_index < num_cluster; ++cluster_index) {
114 if (bmatch_mcq[mc_index][plane] < q) {
116 bmatch_mcq[mc_index][plane] = q;
132 "Input cluster index (%zu) out of range (%zu)!", cluster_index,
_cluster_mcq_v.size()));
136 Form(
"Input MC object index (%zu) out of range (%zu)!", mc_index,
_bmatch_id.size()));
140 auto best_cluster_index =
_bmatch_id.at(mc_index).at(plane);
142 if (best_cluster_index < 0)
return -1;
149 const std::vector<unsigned int> cluster_indices)
const 156 Form(
"Input cluster indices length (%zu) > # of registered clusters (%zu)!",
157 cluster_indices.size(),
160 if (!cluster_indices.size())
throw MCBTException(
"Input cluster indices empty!");
163 std::vector<double> match_eff(
_bmatch_id.size(), 1);
165 for (
auto const& cluster_index : cluster_indices) {
167 for (
size_t mc_index = 0; mc_index <
_bmatch_id.size(); ++mc_index) {
171 if (correctness >= 0) match_eff.at(mc_index) *= correctness;
175 std::pair<size_t, double> result(0, -1);
178 for (
size_t mc_index = 0; mc_index < match_eff.size(); ++mc_index) {
180 if (match_eff.at(mc_index) < result.second)
continue;
182 result.second = match_eff.at(mc_index);
184 result.first = mc_index;
190 const size_t mc_index)
const 196 "Input cluster index (%zu) out of range (%zu)!", cluster_index,
_cluster_mcq_v.size()));
200 Form(
"Input MC object index (%zu) out of range (%zu)!", mc_index,
_bmatch_id.size()));
205 std::pair<double, double> result;
211 double cluster_mcq_total = 0;
213 cluster_mcq_total += q;
215 result.second =
_cluster_mcq_v[cluster_index][mc_index] / cluster_mcq_total;
226 Form(
"Input MC object index (%zu) out of range (%zu)!", mc_index,
_bmatch_id.size()));
232 const size_t plane_id)
const 237 if (c_index_v.size() <= plane_id)
239 "Plane ID %zu exceeds # of planes recorded in data (%zu)...", plane_id, c_index_v.size()));
241 std::pair<double, double> result(0, 0);
243 if (c_index_v[plane_id] < 0)
return result;
245 return ClusterEP(c_index_v[plane_id], mc_index);
Class def header for a class MCMatchAlg.
std::pair< double, double > BestClusterEP(const size_t mcshower_index, const size_t plane_id) const
void Reset(const std::vector< unsigned int > &g4_trackid_v, const std::vector< sim::SimChannel > &simch_v)
Declaration of signal hit object.
Class def header for a class MCBTAlg.
bool BuildMap(detinfo::DetectorClocksData const &clockData, const std::vector< unsigned int > &g4_trackid_v, const std::vector< sim::SimChannel > &simch_v, const std::vector< std::vector< art::Ptr< recob::Hit >>> &cluster_v)
Constructs needed information for Reco=>MC matching.
std::vector< std::vector< double > > _summed_mcq
std::vector< unsigned char > _cluster_plane_id
std::vector< std::vector< double > > _cluster_mcq_v
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
double ClusterCorrectness(const size_t cluster_index, const size_t mcshower_index) const
MCBTAlg fBTAlgo
MCBTAlg instance.
std::pair< double, double > ClusterEP(const size_t cluster_index, const size_t mcshower_index) const
For a specified cluster, compute cluster efficiency and purity in terms of specified MC object...
std::vector< double > MCQ(detinfo::DetectorClocksData const &clockData, const WireRange_t &hit) const
Definition of data types for geometry description.
const std::vector< int > & BestClusters(const size_t mcshower_index) const
std::vector< size_t > _view_to_plane
Contains all timing reference information for the detector.
MCMatchAlg()
Default constructor.
unsigned int Nplanes(TPCID const &tpcid=tpc_zero) const
Returns the total number of planes in the specified TPC.
std::pair< size_t, double > ShowerCorrectness(const std::vector< unsigned int > cluster_indices) const
std::vector< std::vector< int > > _bmatch_id
Namespace collecting geometry-related classes utilities.
art framework interface to geometry description
Class def header for exception classes in MCComp package.