7#include "art/Framework/Core/EDAnalyzer.h"
8#include "art/Framework/Core/ModuleMacros.h"
39 void analyze(
const art::Event& evt);
152#include "art/Framework/Principal/Event.h"
153#include "art/Framework/Principal/Handle.h"
154#include "art/Framework/Services/Registry/ServiceHandle.h"
155#include "art_root_io/TFileDirectory.h"
156#include "art_root_io/TFileService.h"
157#include "canvas/Persistency/Common/FindManyP.h"
158#include "canvas/Persistency/Common/FindOneP.h"
159#include "fhiclcpp/ParameterSet.h"
160#include "messagefacility/MessageLogger/MessageLogger.h"
162#include "larcore/Geometry/Geometry.h"
163#include "lardataobj/AnalysisBase/CosmicTag.h"
164#include "lardataobj/RecoBase/PFParticle.h"
165#include "lardataobj/RecoBase/Track.h"
166#include "nusimdata/SimulationBase/MCTruth.h"
185 m_cosmicLabel = pset.get<std::string>(
"CosmicTagModule",
"cosmictagger");
186 m_particleLabel = pset.get<std::string>(
"PFParticleModule",
"pandora");
201 mf::LogDebug(
"LArPandora") <<
" *** PFParticleCosmicAna::beginJob() *** " << std::endl;
204 art::ServiceHandle<art::TFileService const> tfs;
206 m_pRecoTree = tfs->make<TTree>(
"recoTree",
"LAr Cosmic Reco Tree");
238 m_pTrueTree = tfs->make<TTree>(
"trueTree",
"LAr Cosmic True Tree");
249 m_pTrueTree->Branch(
"nNeutrinoHitsNotReconstructed",
251 "nNeutrinoHitsNotReconstructed/I");
262 "nCosmicHitsNotReconstructed/I");
275 std::cout <<
" *** PFParticleCosmicAna::analyze(...) *** " << std::endl;
284 std::cout <<
" Run: " <<
m_run << std::endl;
285 std::cout <<
" Event: " <<
m_event << std::endl;
323 std::cout <<
" PFParticles: " << recoParticleVector.size() << std::endl;
336 evt,
m_cosmicLabel, recoCosmicTagVector, recoTracksToCosmicTags);
340 this->
FillRecoTree(recoParticlesToHits, recoParticlesToTracks, recoTracksToCosmicTags);
348 recoParticlesToTracks,
349 recoTracksToCosmicTags);
360 art::ServiceHandle<geo::Geometry const> theGeometry;
362 const double xmin(0.0);
363 const double xmax(2.0 * theGeometry->DetHalfWidth());
364 const double ymin(-theGeometry->DetHalfHeight());
365 const double ymax(+theGeometry->DetHalfHeight());
366 const double zmin(0.0);
367 const double zmax(theGeometry->DetLength());
405 for (PFParticlesToHits::const_iterator iter1 = recoParticlesToHits.begin(),
406 iterEnd1 = recoParticlesToHits.end();
409 const art::Ptr<recob::PFParticle> recoParticle = iter1->first;
411 const HitVector& hitVector = iter1->second;
412 if (hitVector.empty())
continue;
414 PFParticlesToTracks::const_iterator iter2 = recoParticlesToTracks.find(recoParticle);
415 if (recoParticlesToTracks.end() == iter2)
continue;
418 if (trackVector.empty())
continue;
423 m_self = recoParticle->Self();
428 this->
GetCosmicScore(recoParticle, recoParticlesToTracks, recoTracksToCosmicTags);
452 for (TrackVector::const_iterator iter3 = trackVector.begin(), iterEnd3 = trackVector.end();
455 const art::Ptr<recob::Track> track = *iter3;
456 const float trackLength(track->Length());
462 const auto& trackVtxPosition = track->Vertex();
463 const auto& trackVtxDirection = track->VertexDirection();
464 const auto& trackEndPosition = track->End();
465 const auto& trackEndDirection = track->EndDirection();
530 for (HitVector::const_iterator iter2 = hitVector.begin(), iterEnd2 = hitVector.end();
533 const art::Ptr<recob::Hit> hit = *iter2;
535 HitsToMCParticles::const_iterator iter3 = trueHitsToParticles.find(hit);
536 if (trueHitsToParticles.end() == iter3)
continue;
538 const art::Ptr<simb::MCParticle> trueParticle = iter3->second;
540 MCParticlesToMCTruth::const_iterator iter4 = particlesToTruth.find(trueParticle);
541 if (particlesToTruth.end() == iter4)
542 throw cet::exception(
"LArPandora") <<
" PFParticleCosmicAna::analyze --- Found a true "
543 "particle without any ancestry information ";
545 const art::Ptr<simb::MCTruth> truth = iter4->second;
547 float cosmicScore(-0.2);
549 HitsToPFParticles::const_iterator iter5 = recoHitsToParticles.find(hit);
550 if (recoHitsToParticles.end() != iter5) {
551 const art::Ptr<recob::PFParticle> particle = iter5->second;
552 cosmicScore = this->
GetCosmicScore(particle, particlesToTracks, tracksToCosmicTags);
557 if (truth->NeutrinoSet()) {
560 if (cosmicScore >= 0)
565 if (cosmicScore > 0.51)
567 else if (cosmicScore > 0.39)
575 if (cosmicScore >= 0)
580 if (cosmicScore > 0.51)
582 else if (cosmicScore > 0.39)
598 float cosmicScore(0.f);
601 PFParticlesToTracks::const_iterator iter2 = recoParticlesToTracks.find(particle);
602 if (recoParticlesToTracks.end() != iter2) {
603 for (TrackVector::const_iterator iter3 = iter2->second.begin(),
604 iterEnd3 = iter2->second.end();
607 const art::Ptr<recob::Track> track = *iter3;
609 TracksToCosmicTags::const_iterator iter4 = recoTracksToCosmicTags.find(track);
610 if (recoTracksToCosmicTags.end() != iter4) {
611 for (CosmicTagVector::const_iterator iter5 = iter4->second.begin(),
612 iterEnd5 = iter4->second.end();
615 const art::Ptr<anab::CosmicTag> cosmicTag = *iter5;
616 if (cosmicTag->CosmicScore() > cosmicScore) cosmicScore = cosmicTag->CosmicScore();
helper function for LArPandoraInterface producer module
static void CollectHits(const art::Event &evt, const std::string &label, HitVector &hitVector)
Collect the reconstructed Hits from the ART event record.
static void BuildMCParticleHitMaps(const art::Event &evt, const HitVector &hitVector, const SimChannelVector &simChannelVector, HitsToTrackIDEs &hitsToTrackIDEs)
Collect the links from reconstructed hits to their true energy deposits.
static bool IsTrack(const art::Ptr< recob::PFParticle > particle)
Determine whether a particle has been reconstructed as track-like.
static void CollectPFParticles(const art::Event &evt, const std::string &label, PFParticleVector &particleVector)
Collect the reconstructed PFParticles from the ART event record.
static void CollectCosmicTags(const art::Event &evt, const std::string &label, CosmicTagVector &cosmicTagVector, TracksToCosmicTags &tracksToCosmicTags)
Collect a vector of cosmic tags from the ART event record.
static void CollectTracks(const art::Event &evt, const std::string &label, TrackVector &trackVector, PFParticlesToTracks &particlesToTracks)
Collect the reconstructed PFParticles and associated Tracks from the ART event record.
static void BuildPFParticleHitMaps(const PFParticleVector &particleVector, const PFParticlesToSpacePoints &particlesToSpacePoints, const SpacePointsToHits &spacePointsToHits, PFParticlesToHits &particlesToHits, HitsToPFParticles &hitsToParticles, const DaughterMode daughterMode=kUseDaughters)
Build mapping between PFParticles and Hits using PFParticle/SpacePoint/Hit maps.
static void CollectMCParticles(const art::Event &evt, const std::string &label, MCParticleVector &particleVector)
Collect a vector of MCParticle objects from the ART event record.
PFParticleCosmicAna class.
int m_nNeutrinoHitsReconstructed
bool m_useDaughterPFParticles
std::string m_particleLabel
int m_nNeutrinoHitsNotTagged
float GetCosmicScore(const art::Ptr< recob::PFParticle > particle, const PFParticlesToTracks &recoParticlesToTracks, const TracksToCosmicTags &recoTracksToCosmicTags) const
Get cosmic score for a PFParticle using track-level information.
std::string m_cosmicLabel
double m_cosmicContainmentCut
int m_nNeutrinoHitsNotReconstructed
void FillRecoTree(const PFParticlesToHits &recoParticlesToHits, const PFParticlesToTracks &recoParticlesToTracks, const TracksToCosmicTags &recoTracksToCosmicTags)
Fill event-level variables using input maps between reconstructed objects.
int m_nCosmicHitsReconstructed
PFParticleCosmicAna(fhicl::ParameterSet const &pset)
Constructor.
void analyze(const art::Event &evt)
int m_nNeutrinoHitsSemiTagged
int m_nCosmicHitsNotReconstructed
std::string m_hitfinderLabel
virtual ~PFParticleCosmicAna()
Destructor.
int m_nCosmicHitsFullyTagged
int m_nCosmicHitsSemiTagged
void FillTrueTree(const HitVector &hitVector, const HitsToMCParticles &trueHitsToParticles, const HitsToPFParticles &recoHitsToParticles, const MCParticlesToMCTruth &particlesToTruth, const PFParticlesToTracks &particlesToTracks, const TracksToCosmicTags &tracksToCosmicTags)
Fill track-level variables using input maps between reconstructed objects.
int m_nCosmicHitsNotTagged
bool m_useDaughterMCParticles
int m_nNeutrinoHitsFullyTagged
std::string m_geantModuleLabel
std::string m_trackfitLabel
void reconfigure(fhicl::ParameterSet const &pset)
std::vector< art::Ptr< recob::Track > > TrackVector
std::map< art::Ptr< simb::MCParticle >, art::Ptr< simb::MCTruth > > MCParticlesToMCTruth
std::map< art::Ptr< simb::MCTruth >, MCParticleVector > MCTruthToMCParticles
std::map< art::Ptr< recob::PFParticle >, HitVector > PFParticlesToHits
std::vector< art::Ptr< recob::Hit > > HitVector
std::vector< art::Ptr< recob::PFParticle > > PFParticleVector
std::vector< art::Ptr< anab::CosmicTag > > CosmicTagVector
std::map< art::Ptr< recob::PFParticle >, TrackVector > PFParticlesToTracks
std::map< art::Ptr< simb::MCParticle >, HitVector > MCParticlesToHits
std::map< art::Ptr< recob::Hit >, art::Ptr< recob::PFParticle > > HitsToPFParticles
std::map< art::Ptr< recob::Hit >, art::Ptr< simb::MCParticle > > HitsToMCParticles
std::map< art::Ptr< recob::Track >, CosmicTagVector > TracksToCosmicTags