321 auto const clockData(art::ServiceHandle<detinfo::DetectorClocksService const>()->DataFor(
e));
323 auto const pfpHandle(
e.getValidHandle<std::vector<recob::PFParticle>>(
fPFPLabel));
324 auto const clusterHandle(
e.getValidHandle<std::vector<recob::Cluster>>(
fPFPLabel));
325 auto const simChannelHandle(
e.getValidHandle<std::vector<sim::SimChannel>>(
fSimChannelLabel));
326 auto const trackHandle(
e.getValidHandle<std::vector<recob::Track>>(
fTrackLabel));
328 std::vector<art::Ptr<recob::PFParticle>> pfps;
329 art::fill_ptr_vector(pfps, pfpHandle);
331 std::vector<art::Ptr<sim::SimChannel>> simChannels;
332 art::fill_ptr_vector(simChannels, simChannelHandle);
334 art::FindManyP<recob::Cluster> fmPFPCluster(pfpHandle,
e,
fPFPLabel);
335 art::FindManyP<larpandoraobj::PFParticleMetadata> fmPFPMeta(pfpHandle,
e,
fPFPLabel);
336 art::FindManyP<recob::Hit> fmClusterHit(clusterHandle,
e,
fPFPLabel);
338 art::FindManyP<recob::Track> fmPFPTrack(pfpHandle,
e,
fTrackLabel);
339 art::FindManyP<recob::Hit> fmTrackHit(trackHandle,
e,
fTrackLabel);
340 art::FindManyP<anab::Calorimetry> fmTrackCalo(trackHandle,
e,
fCaloLabel);
341 art::FindManyP<recob::MCSFitResult> fmTrackMCS(trackHandle,
e,
fMCSLabel);
342 art::FindManyP<anab::ParticleID> fmTrackChi2(trackHandle,
e,
fChi2Label);
345 art::FindManyP<RangeP> fmTrackRange(trackHandle,
e,
fRangeLabel);
349 auto mvaPIDVec = std::make_unique<std::vector<MVAPID>>();
350 auto trackAssns = std::make_unique<art::Assns<recob::Track, MVAPID>>();
352 const std::map<size_t, art::Ptr<recob::PFParticle>> pfpMap(this->
GetPFPMap(pfps));
354 for (
auto const& pfp : pfps) {
358 std::vector<art::Ptr<recob::Track>> pfpTrackVec(fmPFPTrack.at(pfp.key()));
361 if (pfpTrackVec.empty())
365 if (pfpTrackVec.size() > 1)
366 throw cet::exception(
"Dazzle") <<
"Too many tracks: " << pfpTrackVec.size();
368 art::Ptr<recob::Track>& pfpTrack(pfpTrackVec.front());
380 auto const caloVec(fmTrackCalo.at(pfpTrack.key()));
381 if (caloVec.size() != 3)
386 const unsigned int maxHits(std::max({ caloVec[0]->dEdx().size(), caloVec[1]->dEdx().size(), caloVec[2]->dEdx().size() }));
387 bestPlane = (caloVec[2]->dEdx().size() == maxHits) ? 2 : (caloVec[0]->
dEdx().size() == maxHits) ? 0 : (caloVec[1]->
dEdx().size() == maxHits) ? 1 : -1;
390 if (bestPlane < 0 || bestPlane > 3)
391 throw cet::exception(
"Dazzle") <<
"Best plane: " <<
bestPlane;
393 this->
FillPFPMetrics(pfp, pfpMap, fmPFPCluster, fmClusterHit, fmPFPMeta);
397 auto const mcsVec(fmTrackMCS.at(pfpTrack.key()));
398 if (mcsVec.size() == 1)
403 auto const rangeVec(fmTrackRange.at(pfpTrack.key()));
404 if (rangeVec.size() == 1)
408 auto const chi2Vec(fmTrackChi2.at(pfpTrack.key()));
409 if (chi2Vec.size() == 3)
416 auto const closestApproachVec(fmTrackClosestApproach.at(pfpTrack.key()));
417 if (closestApproachVec.size() == 1)
420 auto const stoppingChi2Vec(fmTrackStoppingChi2.at(pfpTrack.key()));
421 if (stoppingChi2Vec.size() == 1)
425 MVAPID mvaPID(this->
RunMVA());
426 mvaPIDVec->push_back(mvaPID);
432 std::vector<art::Ptr<recob::Hit>> trackHitVec(fmTrackHit.at(pfpTrack.key()));
438 e.put(std::move(mvaPIDVec));
439 e.put(std::move(trackAssns));
void FillPFPMetrics(const art::Ptr< recob::PFParticle > &pfp, const std::map< size_t, art::Ptr< recob::PFParticle >> &pfpMap, const art::FindManyP< recob::Cluster > &fmCluster, const art::FindManyP< recob::Hit > &fmHit, const art::FindManyP< larpandoraobj::PFParticleMetadata > &fmMeta)
void FillStoppingChi2Metrics(const StoppingChi2Fit &stoppingChi2)
art::InputTag fRangeLabel
void FillTrueParticleMetrics(const detinfo::DetectorClocksData &clockData, const recob::Track &track, const std::vector< art::Ptr< recob::Hit >> &hits, std::vector< art::Ptr< sim::SimChannel >> &simChannels)
void FillChi2PIDMetrics(const anab::ParticleID &pid)
void FillTrackMetrics(const recob::Track &track)
void FillMCSMetrics(const recob::MCSFitResult &mcs)
art::InputTag fClosestApproachLabel
float dEdx(detinfo::DetectorClocksData const &clockData, detinfo::DetectorPropertiesData const &detProp, const TCSlice &slc, TP3D &tp3d)
void FillRangePMetrics(const RangeP &range)
bool CreateAssn(art::Event &evt, std::vector< T > const &a, art::Ptr< U > const &b, art::Assns< U, T > &assn, std::string a_instance, size_t index=UINT_MAX)
Creates a single one-to-one association.
std::map< size_t, art::Ptr< recob::PFParticle > > GetPFPMap(std::vector< art::Ptr< recob::PFParticle >> &pfps) const
art::InputTag fSimChannelLabel
const float fMinTrackLength
art::InputTag fStoppingChi2Label
art::InputTag fTrackLabel
void FillClosestApproachMetrics(const ScatterClosestApproach &closestApproach)