LArSoft  v07_13_02
Liquid Argon Software toolkit - http://larsoft.org/
LArPandora.cxx
Go to the documentation of this file.
1 
10 #include "cetlib/cpu_timer.h"
11 
14 
16 
26 
28 
29 #include "Api/PandoraApi.h"
30 
33 
38 
39 #include <iostream>
40 #include <limits>
41 
42 namespace lar_pandora
43 {
44 
46  ILArPandora(pset),
47  m_configFile(pset.get<std::string>("ConfigFile")),
48  m_shouldRunAllHitsCosmicReco(pset.get<bool>("ShouldRunAllHitsCosmicReco")),
49  m_shouldRunStitching(pset.get<bool>("ShouldRunStitching")),
50  m_shouldRunCosmicHitRemoval(pset.get<bool>("ShouldRunCosmicHitRemoval")),
51  m_shouldRunSlicing(pset.get<bool>("ShouldRunSlicing")),
52  m_shouldRunNeutrinoRecoOption(pset.get<bool>("ShouldRunNeutrinoRecoOption")),
53  m_shouldRunCosmicRecoOption(pset.get<bool>("ShouldRunCosmicRecoOption")),
54  m_shouldPerformSliceId(pset.get<bool>("ShouldPerformSliceId")),
55  m_shouldProduceAllOutcomes(pset.get<bool>("ProduceAllOutcomes", false)),
56  m_printOverallRecoStatus(pset.get<bool>("PrintOverallRecoStatus", false)),
57  m_generatorModuleLabel(pset.get<std::string>("GeneratorModuleLabel", "")),
58  m_geantModuleLabel(pset.get<std::string>("GeantModuleLabel", "largeant")),
59  m_simChannelModuleLabel(pset.get<std::string>("SimChannelModuleLabel", m_geantModuleLabel)),
60  m_hitfinderModuleLabel(pset.get<std::string>("HitFinderModuleLabel")),
61  m_backtrackerModuleLabel(pset.get<std::string>("BackTrackerModuleLabel","")),
62  m_allOutcomesInstanceLabel(pset.get<std::string>("AllOutcomesInstanceLabel", "allOutcomes")),
63  m_enableProduction(pset.get<bool>("EnableProduction", true)),
64  m_enableDetectorGaps(pset.get<bool>("EnableLineGaps", true)),
65  m_enableMCParticles(pset.get<bool>("EnableMCParticles", false)),
66  m_lineGapsCreated(false)
67 {
68  m_inputSettings.m_useHitWidths = pset.get<bool>("UseHitWidths", true);
69  m_inputSettings.m_useBirksCorrection = pset.get<bool>("UseBirksCorrection", false);
70  m_inputSettings.m_uidOffset = pset.get<int>("UidOffset", 100000000);
71  m_inputSettings.m_dx_cm = pset.get<double>("DefaultHitWidth", 0.5);
72  m_inputSettings.m_int_cm = pset.get<double>("InteractionLength", 84.);
73  m_inputSettings.m_rad_cm = pset.get<double>("RadiationLength", 14.);
74  m_inputSettings.m_dEdX_mip = pset.get<double>("dEdXmip", 2.);
75  m_inputSettings.m_mips_max = pset.get<double>("MipsMax", 50.);
76  m_inputSettings.m_mips_if_negative = pset.get<double>("MipsIfNegative", 0.);
77  m_inputSettings.m_mips_to_gev = pset.get<double>("MipsToGeV", 3.5e-4);
78  m_inputSettings.m_recombination_factor = pset.get<double>("RecombinationFactor", 0.63);
83 
85  {
86  // Set up the instance names to produces
87  std::vector<std::string> instanceNames({""});
89  instanceNames.push_back(m_allOutcomesInstanceLabel);
90 
91  for (const std::string &instanceName : instanceNames)
92  {
93  produces< std::vector<recob::PFParticle> >(instanceName);
94  produces< std::vector<recob::SpacePoint> >(instanceName);
95  produces< std::vector<recob::Cluster> >(instanceName);
96  produces< std::vector<recob::Vertex> >(instanceName);
97  produces< std::vector<larpandoraobj::PFParticleMetadata> >(instanceName);
98  produces< std::vector<recob::Slice> >(instanceName);
99 
100  produces< art::Assns<recob::PFParticle, larpandoraobj::PFParticleMetadata> >(instanceName);
101  produces< art::Assns<recob::PFParticle, recob::SpacePoint> >(instanceName);
102  produces< art::Assns<recob::PFParticle, recob::Cluster> >(instanceName);
103  produces< art::Assns<recob::PFParticle, recob::Vertex> >(instanceName);
104  produces< art::Assns<recob::PFParticle, recob::Slice> >(instanceName);
105  produces< art::Assns<recob::SpacePoint, recob::Hit> >(instanceName);
106  produces< art::Assns<recob::Cluster, recob::Hit> >(instanceName);
107  produces< art::Assns<recob::Slice, recob::Hit> >(instanceName);
108 
110  {
111  produces< std::vector<anab::T0> >(instanceName);
112  produces< art::Assns<recob::PFParticle, anab::T0> >(instanceName);
113  }
114  }
115  }
116 }
117 
118 //------------------------------------------------------------------------------------------------------------------------------------------
119 
121 {
122  LArDriftVolumeList driftVolumeList;
124 
125  this->CreatePandoraInstances();
126 
127  if (!m_pPrimaryPandora)
128  throw cet::exception("LArPandora") << " LArPandora::beginJob - failed to create primary Pandora instance " << std::endl;
129 
132 
133  // Pass basic LArTPC information to pandora instances
135 
136  // If using global drift volume approach, pass details of gaps between daughter volumes to the pandora instance
138  {
139  LArDetectorGapList listOfGaps;
141  LArPandoraInput::CreatePandoraDetectorGaps(m_inputSettings, driftVolumeList, listOfGaps);
142  }
143 
144  // Parse Pandora settings xml files
146 }
147 
148 //------------------------------------------------------------------------------------------------------------------------------------------
149 
151 {
152  IdToHitMap idToHitMap;
153  this->CreatePandoraInput(evt, idToHitMap);
154  this->RunPandoraInstances();
155  this->ProcessPandoraOutput(evt, idToHitMap);
156  this->ResetPandoraInstances();
157 }
158 
159 //------------------------------------------------------------------------------------------------------------------------------------------
160 
162 {
163  // ATTN Should complete gap creation in begin job callback, but channel status service functionality unavailable at that point
165  {
167  m_lineGapsCreated = true;
168  }
169 
170  HitVector artHits;
171  SimChannelVector artSimChannels;
172  HitsToTrackIDEs artHitsToTrackIDEs;
173  MCParticleVector artMCParticleVector;
174  RawMCParticleVector generatorArtMCParticleVector;
175  MCTruthToMCParticles artMCTruthToMCParticles;
176  MCParticlesToMCTruth artMCParticlesToMCTruth;
177 
179 
180  if (m_enableMCParticles && !evt.isRealData())
181  {
182  LArPandoraHelper::CollectMCParticles(evt, m_geantModuleLabel, artMCParticleVector);
183 
184  if (!m_generatorModuleLabel.empty())
185  LArPandoraHelper::CollectGeneratorMCParticles(evt, m_generatorModuleLabel, generatorArtMCParticleVector);
186 
187  LArPandoraHelper::CollectMCParticles(evt, m_geantModuleLabel, artMCTruthToMCParticles, artMCParticlesToMCTruth);
188 
190  if (!artSimChannels.empty())
191  {
192  LArPandoraHelper::BuildMCParticleHitMaps(artHits, artSimChannels, artHitsToTrackIDEs);
193  }
194  else
195  {
196  if (m_backtrackerModuleLabel.empty())
197  {
198  throw cet::exception("LArPandora") << "LArPandora::CreatePandoraInput - Can't build MCParticle to Hit map." << std::endl <<
199  "No SimChannels found with label \"" << m_simChannelModuleLabel << "\", and BackTrackerModuleLabel isn't set in FHiCL." << std::endl;
200  }
201 
203  }
204  }
205 
207 
208  if (m_enableMCParticles && !evt.isRealData())
209  {
210  LArPandoraInput::CreatePandoraMCParticles(m_inputSettings, artMCTruthToMCParticles, artMCParticlesToMCTruth, generatorArtMCParticleVector);
211  LArPandoraInput::CreatePandoraMCLinks2D(m_inputSettings, idToHitMap, artHitsToTrackIDEs);
212  }
213 }
214 
215 //------------------------------------------------------------------------------------------------------------------------------------------
216 
218 {
219  if (m_enableProduction)
220  {
223 
225  {
229  }
230  }
231 }
232 
233 } // namespace lar_pandora
std::map< art::Ptr< recob::Hit >, TrackIDEVector > HitsToTrackIDEs
Header file for the pfo helper class.
std::string m_allOutcomesInstanceLabel
The instance label for all outcomes.
Definition: LArPandora.h:61
void CreatePandoraInput(art::Event &evt, IdToHitMap &idToHitMap)
Create pandora input hits, mc particles etc.
Definition: LArPandora.cxx:161
Base producer module for reconstructing recob::PFParticles from recob::Hits.
static void CreatePandoraMCParticles(const Settings &settings, const MCTruthToMCParticles &truthToParticles, const MCParticlesToMCTruth &particlesToTruth, const RawMCParticleVector &generatorMCParticleVector)
Create the Pandora MC particles from the MC particles.
static void CreatePandoraDetectorGaps(const Settings &settings, const LArDriftVolumeList &driftVolumeList, const LArDetectorGapList &listOfGaps)
Create pandora line gaps to cover dead regions between TPCs in a global drift volume approach...
const pandora::Pandora * m_pPrimaryPandora
std::vector< LArDetectorGap > LArDetectorGapList
ILArPandora class.
Definition: ILArPandora.h:25
std::map< art::Ptr< simb::MCTruth >, MCParticleVector > MCTruthToMCParticles
Declaration of signal hit object.
std::vector< LArDriftVolume > LArDriftVolumeList
const pandora::Pandora * m_pPrimaryPandora
std::string m_allOutcomesInstanceLabel
The label for the instance producing all outcomes.
STL namespace.
bool m_shouldProduceAllOutcomes
Steering: whether to produce all reconstruction outcomes.
Definition: LArPandora.h:48
std::map< int, art::Ptr< recob::Hit > > IdToHitMap
Definition: ILArPandora.h:20
bool m_isNeutrinoRecoOnlyNoSlicing
If we are running the neutrino reconstruction only with no slicing.
Helper functions for processing outputs from pandora.
std::string m_backtrackerModuleLabel
The back tracker module label.
Definition: LArPandora.h:59
bool isRealData() const
Definition: Event.h:83
Particle class.
static void CreatePandoraHits2D(const Settings &settings, const LArDriftVolumeMap &driftVolumeMap, const HitVector &hitVector, IdToHitMap &idToHitMap)
Create the Pandora 2D hits from the ART hits.
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
static void CollectGeneratorMCParticles(const art::Event &evt, const std::string &label, RawMCParticleVector &particleVector)
Collect a vector of MCParticle objects from the generator in the ART event record. ATTN: This function is needed as accessing generator (opposed to Geant4) level MCParticles requires use of MCTruth block.
std::map< art::Ptr< simb::MCParticle >, art::Ptr< simb::MCTruth > > MCParticlesToMCTruth
bool m_lineGapsCreated
Book-keeping: whether line gap creation has been called.
Definition: LArPandora.h:66
std::string m_hitfinderModuleLabel
The hit finder module label.
std::vector< art::Ptr< sim::SimChannel > > SimChannelVector
static void LoadGeometry(LArDriftVolumeList &outputVolumeList, LArDriftVolumeMap &outputVolumeMap)
Load drift volume geometry.
static void BuildMCParticleHitMaps(const HitVector &hitVector, const SimChannelVector &simChannelVector, HitsToTrackIDEs &hitsToTrackIDEs)
Collect the links from reconstructed hits to their true energy deposits.
bool m_shouldRunNeutrinoRecoOption
Steering: whether to run neutrino reconstruction for each slice.
Definition: LArPandora.h:45
const pandora::Pandora * m_pPrimaryPandora
The address of the primary pandora instance.
Definition: ILArPandora.h:82
LArDriftVolumeMap m_driftVolumeMap
The map from volume id to drift volume.
Definition: LArPandora.h:71
Provides recob::Track data product.
virtual void CreatePandoraInstances()=0
Create pandora instances.
std::string m_generatorModuleLabel
The generator module label.
Definition: LArPandora.h:55
std::string m_geantModuleLabel
The geant module label.
Definition: LArPandora.h:56
T get(std::string const &key) const
Definition: ParameterSet.h:231
static void CreatePandoraMCLinks2D(const Settings &settings, const HitMap &hitMap, const HitsToTrackIDEs &hitToParticleMap)
Create links between the 2D hits and Pandora MC particles.
void ProcessPandoraOutput(art::Event &evt, const IdToHitMap &idToHitMap)
Process pandora output particle flow objects.
Definition: LArPandora.cxx:217
static void ProduceArtOutput(const Settings &settings, const IdToHitMap &idToHitMap, art::Event &evt)
Convert the Pandora PFOs into ART clusters and write into ART event.
bool m_shouldRunCosmicRecoOption
Steering: whether to run cosmic-ray reconstruction for each slice.
Definition: LArPandora.h:46
virtual void ResetPandoraInstances()=0
Reset all associated pandora instances.
Declaration of cluster object.
LArPandora(fhicl::ParameterSet const &pset)
Constructor.
Definition: LArPandora.cxx:45
std::vector< art::Ptr< recob::Hit > > HitVector
static void CollectSimChannels(const art::Event &evt, const std::string &label, SimChannelVector &simChannelVector)
Collect a vector of SimChannel objects from the ART event record.
static void CollectHits(const art::Event &evt, const std::string &label, HitVector &hitVector)
Collect the reconstructed Hits from the ART event record.
static void CreatePandoraReadoutGaps(const Settings &settings, const LArDriftVolumeMap &driftVolumeMap)
Create pandora line gaps to cover any (continuous regions of) bad channels.
bool m_enableDetectorGaps
Whether to pass detector gap information to Pandora instances.
Definition: LArPandora.h:64
void produce(art::Event &evt)
Definition: LArPandora.cxx:150
bool m_shouldRunStitching
Steering: whether to stitch cosmic-ray muons crossing between volumes.
Definition: LArPandora.h:42
std::vector< simb::MCParticle > RawMCParticleVector
LArPandoraInput::Settings m_inputSettings
The lar pandora input settings.
Definition: LArPandora.h:68
static void CreatePandoraLArTPCs(const Settings &settings, const LArDriftVolumeList &driftVolumeList)
Create pandora LArTPCs to represent the different drift volumes in use.
LArPandoraOutput::Settings m_outputSettings
The lar pandora output settings.
Definition: LArPandora.h:69
bool m_shouldProduceAllOutcomes
If all outcomes should be produced in separate collections (choose false if you only require the cons...
Helper functions for providing inputs to pandora.
Header file detailing content for use with particle flow reconstruction at liquid argon time projecti...
bool m_shouldRunSlicing
Steering: whether to slice events into separate regions for processing.
Definition: LArPandora.h:44
virtual void RunPandoraInstances()=0
Run all associated pandora instances.
TCEvent evt
Definition: DataStructs.cxx:5
bool m_enableMCParticles
Whether to pass mc information to Pandora instances to aid development.
Definition: LArPandora.h:65
bool m_enableProduction
Whether to persist output products.
Definition: LArPandora.h:63
static void CollectMCParticles(const art::Event &evt, const std::string &label, MCParticleVector &particleVector)
Collect a vector of MCParticle objects from the ART event record.
helper function for LArPandoraInterface producer module
std::string m_simChannelModuleLabel
The SimChannel producer module label.
Definition: LArPandora.h:57
art framework interface to geometry description
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
std::string m_hitfinderModuleLabel
The hit finder module label.
Definition: LArPandora.h:58
virtual void ConfigurePandoraInstances()=0
Configure pandora instances.
static void LoadDetectorGaps(LArDetectorGapList &listOfGaps)
Load the 2D gaps that go with the chosen geometry.