4 #include "art/Framework/Services/Registry/ServiceHandle.h"
5 #include "canvas/Persistency/Common/Ptr.h"
20 const std::vector<unsigned int>& g4_trackid_v,
21 const std::vector<sim::SimChannel>& simch_v,
26 return BuildMap(clockData, cluster_v);
31 const std::vector<std::vector<unsigned int>>& g4_trackid_v,
32 const std::vector<sim::SimChannel>& simch_v,
38 return BuildMap(clockData, cluster_v);
46 size_t num_cluster = cluster_v.size();
48 art::ServiceHandle<geo::Geometry const> geo;
62 _summed_mcq.resize(num_mcobj + 1, std::vector<double>(geo->Nplanes(), 0));
66 for (
auto const& hit_v : cluster_v) {
68 size_t plane = geo->Nplanes();
71 std::vector<WireRange_t> wr_v;
72 wr_v.reserve(hit_v.size());
74 for (
auto const&
h : hit_v) {
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)
100 _bmatch_id.resize(num_mcobj, std::vector<int>(geo->Nplanes(), -1));
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;
133 "Input cluster index (%zu) out of range (%zu)!", cluster_index,
_cluster_mcq_v.size()));
137 Form(
"Input MC object index (%zu) out of range (%zu)!", mc_index,
_bmatch_id.size()));
141 auto best_cluster_index =
_bmatch_id.at(mc_index).at(plane);
143 if (best_cluster_index < 0)
return -1;
149 std::pair<size_t, double>
157 Form(
"Input cluster indices length (%zu) > # of registered clusters (%zu)!",
158 cluster_indices.size(),
161 if (!cluster_indices.size())
throw MCBTException(
"Input cluster indices empty!");
164 std::vector<double> match_eff(
_bmatch_id.size(), 1);
166 for (
auto const& cluster_index : cluster_indices) {
168 for (
size_t mc_index = 0; mc_index <
_bmatch_id.size(); ++mc_index) {
172 if (correctness >= 0) match_eff.at(mc_index) *= correctness;
176 std::pair<size_t, double> result(0, -1);
179 for (
size_t mc_index = 0; mc_index < match_eff.size(); ++mc_index) {
181 if (match_eff.at(mc_index) < result.second)
continue;
183 result.second = match_eff.at(mc_index);
185 result.first = mc_index;
190 std::pair<double, double>
197 "Input cluster index (%zu) out of range (%zu)!", cluster_index,
_cluster_mcq_v.size()));
201 Form(
"Input MC object index (%zu) out of range (%zu)!", mc_index,
_bmatch_id.size()));
206 std::pair<double, double> result;
212 double cluster_mcq_total = 0;
214 cluster_mcq_total +=
q;
216 result.second =
_cluster_mcq_v[cluster_index][mc_index] / cluster_mcq_total;
221 const std::vector<int>&
228 Form(
"Input MC object index (%zu) out of range (%zu)!", mc_index,
_bmatch_id.size()));
233 std::pair<double, double>
239 if (c_index_v.size() <= plane_id)
241 "Plane ID %zu exceeds # of planes recorded in data (%zu)...", plane_id, c_index_v.size()));
243 std::pair<double, double> result(0, 0);
245 if (c_index_v[plane_id] < 0)
return result;
247 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.
std::pair< size_t, double > ShowerCorrectness(const std::vector< unsigned int > cluster_indices) const
std::vector< std::vector< int > > _bmatch_id
art framework interface to geometry description
Class def header for exception classes in MCComp package.