All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
LArPandora.cxx
Go to the documentation of this file.
1 /**
2  * @file larpandora/LArPandoraInterface/LArPandora.cxx
3  *
4  * @brief Base producer module for reconstructing recob::PFParticles from recob::Hits
5  *
6  */
7 
9 
10 #include "art/Framework/Principal/Event.h"
11 #include "art_root_io/TFileService.h"
12 #include "cetlib/cpu_timer.h"
13 
16 
18 
28 
29 #include "nusimdata/SimulationBase/MCParticle.h"
30 
31 #include "Api/PandoraApi.h"
32 
35 
36 #include <iostream>
37 #include <limits>
38 
39 namespace lar_pandora {
40 
41  LArPandora::LArPandora(fhicl::ParameterSet const& pset)
42  : ILArPandora(pset)
43  , m_configFile(pset.get<std::string>("ConfigFile"))
44  , m_shouldRunAllHitsCosmicReco(pset.get<bool>("ShouldRunAllHitsCosmicReco"))
45  , m_shouldRunStitching(pset.get<bool>("ShouldRunStitching"))
46  , m_shouldRunCosmicHitRemoval(pset.get<bool>("ShouldRunCosmicHitRemoval"))
47  , m_shouldRunSlicing(pset.get<bool>("ShouldRunSlicing"))
48  , m_shouldRunNeutrinoRecoOption(pset.get<bool>("ShouldRunNeutrinoRecoOption"))
49  , m_shouldRunCosmicRecoOption(pset.get<bool>("ShouldRunCosmicRecoOption"))
50  , m_shouldPerformSliceId(pset.get<bool>("ShouldPerformSliceId"))
51  , m_shouldProduceAllOutcomes(pset.get<bool>("ProduceAllOutcomes", false))
52  , m_printOverallRecoStatus(pset.get<bool>("PrintOverallRecoStatus", false))
53  , m_generatorModuleLabel(pset.get<std::string>("GeneratorModuleLabel", ""))
54  , m_geantModuleLabel(pset.get<std::string>("GeantModuleLabel", "largeant"))
55  , m_simChannelModuleLabel(pset.get<std::string>("SimChannelModuleLabel", m_geantModuleLabel))
56  , m_hitfinderModuleLabel(pset.get<std::string>("HitFinderModuleLabel"))
57  , m_backtrackerModuleLabel(pset.get<std::string>("BackTrackerModuleLabel", ""))
58  , m_allOutcomesInstanceLabel(pset.get<std::string>("AllOutcomesInstanceLabel", "allOutcomes"))
59  , m_enableProduction(pset.get<bool>("EnableProduction", true))
60  , m_enableDetectorGaps(pset.get<bool>("EnableLineGaps", true))
61  , m_enableMCParticles(pset.get<bool>("EnableMCParticles", false))
62  , m_disableRealDataCheck(pset.get<bool>("DisableRealDataCheck", false))
63  , m_lineGapsCreated(false)
64  {
65  m_inputSettings.m_useHitWidths = pset.get<bool>("UseHitWidths", true);
66  m_inputSettings.m_useBirksCorrection = pset.get<bool>("UseBirksCorrection", false);
67  m_inputSettings.m_useActiveBoundingBox = pset.get<bool>("UseActiveBoundingBox", false);
68  m_inputSettings.m_uidOffset = pset.get<int>("UidOffset", 100000000);
69  m_inputSettings.m_dx_cm = pset.get<double>("DefaultHitWidth", 0.5);
70  m_inputSettings.m_int_cm = pset.get<double>("InteractionLength", 84.);
71  m_inputSettings.m_rad_cm = pset.get<double>("RadiationLength", 14.);
72  m_inputSettings.m_dEdX_mip = pset.get<double>("dEdXmip", 2.);
73  m_inputSettings.m_mips_max = pset.get<double>("MipsMax", 50.);
74  m_inputSettings.m_mips_if_negative = pset.get<double>("MipsIfNegative", 0.);
75  m_inputSettings.m_mips_to_gev = pset.get<double>("MipsToGeV", 3.5e-4);
76  m_inputSettings.m_recombination_factor = pset.get<double>("RecombinationFactor", 0.63);
78  m_outputSettings.m_shouldProduceSlices = pset.get<bool>("ShouldProduceSlices", true);
80  pset.get<bool>("ShouldProduceTestBeamInteractionVertices", false);
82  "TestBeamInteractionVerticesInstanceLabel", "testBeamInteractionVertices");
86 
87  if (m_enableProduction) {
88  // Set up the instance names to produces
89  std::vector<std::string> instanceNames({""});
90  if (m_shouldProduceAllOutcomes) instanceNames.push_back(m_allOutcomesInstanceLabel);
91 
92  for (const std::string& instanceName : instanceNames) {
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 
99  produces<art::Assns<recob::PFParticle, larpandoraobj::PFParticleMetadata>>(instanceName);
100  produces<art::Assns<recob::PFParticle, recob::SpacePoint>>(instanceName);
101  produces<art::Assns<recob::PFParticle, recob::Cluster>>(instanceName);
102  produces<art::Assns<recob::PFParticle, recob::Vertex>>(instanceName);
103  produces<art::Assns<recob::SpacePoint, recob::Hit>>(instanceName);
104  produces<art::Assns<recob::Cluster, recob::Hit>>(instanceName);
105 
107  // ATTN: Test beam interaction vertex instance label appended to current instance name to preserve unique label in multiple instance case
108  produces<std::vector<recob::Vertex>>(
110  produces<art::Assns<recob::PFParticle, recob::Vertex>>(
112  }
113 
115  produces<std::vector<anab::T0>>(instanceName);
116  produces<art::Assns<recob::PFParticle, anab::T0>>(instanceName);
117  }
118 
120  produces<std::vector<recob::Slice>>(instanceName);
121  produces<art::Assns<recob::Slice, recob::Hit>>(instanceName);
122  produces<art::Assns<recob::PFParticle, recob::Slice>>(instanceName);
123  }
124  }
125  }
126  }
127 
128  //------------------------------------------------------------------------------------------------------------------------------------------
129 
130  void
132  {
133  LArDriftVolumeList driftVolumeList;
136 
137  this->CreatePandoraInstances();
138 
139  if (!m_pPrimaryPandora)
140  throw cet::exception("LArPandora")
141  << " LArPandora::beginJob - failed to create primary Pandora instance " << std::endl;
142 
145 
146  // Pass basic LArTPC information to pandora instances
148 
149  // If using global drift volume approach, pass details of gaps between daughter volumes to the pandora instance
150  if (m_enableDetectorGaps) {
151  LArDetectorGapList listOfGaps;
153  LArPandoraInput::CreatePandoraDetectorGaps(m_inputSettings, driftVolumeList, listOfGaps);
154  }
155 
156  // Parse Pandora settings xml files
158  }
159 
160  //------------------------------------------------------------------------------------------------------------------------------------------
161 
162  void
164  {
165  IdToHitMap idToHitMap;
166  this->CreatePandoraInput(evt, idToHitMap);
167  this->RunPandoraInstances();
168  this->ProcessPandoraOutput(evt, idToHitMap);
169  this->ResetPandoraInstances();
170  }
171 
172  //------------------------------------------------------------------------------------------------------------------------------------------
173 
174  void
176  {
177  // ATTN Should complete gap creation in begin job callback, but channel status service functionality unavailable at that point
180  m_lineGapsCreated = true;
181  }
182 
183  HitVector artHits;
184  SimChannelVector artSimChannels;
185  HitsToTrackIDEs artHitsToTrackIDEs;
186  MCParticleVector artMCParticleVector;
187  RawMCParticleVector generatorArtMCParticleVector;
188  MCTruthToMCParticles artMCTruthToMCParticles;
189  MCParticlesToMCTruth artMCParticlesToMCTruth;
190 
191  bool areSimChannelsValid(false);
192 
194 
195  if (m_enableMCParticles && (m_disableRealDataCheck || !evt.isRealData())) {
196  LArPandoraHelper::CollectMCParticles(evt, m_geantModuleLabel, artMCParticleVector);
197 
198  if (!m_generatorModuleLabel.empty())
200  evt, m_generatorModuleLabel, generatorArtMCParticleVector);
201 
203  evt, m_geantModuleLabel, artMCTruthToMCParticles, artMCParticlesToMCTruth);
204 
206  evt, m_simChannelModuleLabel, artSimChannels, areSimChannelsValid);
207  if (!artSimChannels.empty()) {
208  LArPandoraHelper::BuildMCParticleHitMaps(evt, artHits, artSimChannels, artHitsToTrackIDEs);
209  }
210  else if (!areSimChannelsValid) {
211  if (m_backtrackerModuleLabel.empty())
212  throw cet::exception("LArPandora")
213  << "LArPandora::CreatePandoraInput - Can't build MCParticle to Hit map." << std::endl
214  << "No SimChannels found with label \"" << m_simChannelModuleLabel
215  << "\", and BackTrackerModuleLabel isn't set in FHiCL." << std::endl;
216 
218  evt, m_hitfinderModuleLabel, m_backtrackerModuleLabel, artHitsToTrackIDEs);
219  }
220  else {
221  mf::LogDebug("LArPandora")
222  << " *** LArPandora::CreatePandoraInput - empty list of sim channels found " << std::endl;
223  }
224  }
225 
227  evt, m_inputSettings, m_driftVolumeMap, artHits, idToHitMap);
228 
229  if (m_enableMCParticles && (m_disableRealDataCheck || !evt.isRealData())) {
231  artMCTruthToMCParticles,
232  artMCParticlesToMCTruth,
233  generatorArtMCParticleVector);
234  LArPandoraInput::CreatePandoraMCLinks2D(m_inputSettings, idToHitMap, artHitsToTrackIDEs);
235  }
236  }
237 
238  //------------------------------------------------------------------------------------------------------------------------------------------
239 
240  void
241  LArPandora::ProcessPandoraOutput(art::Event& evt, const IdToHitMap& idToHitMap)
242  {
243  if (m_enableProduction) {
246 
251  }
252  }
253  }
254 
255 } // namespace lar_pandora
double std(const std::vector< short > &wf, const double ped_mean, size_t start, size_t nsample)
Definition: UtilFunc.cxx:42
Header file for the pfo helper class.
std::string m_allOutcomesInstanceLabel
The instance label for all outcomes.
Definition: LArPandora.h:62
void CreatePandoraInput(art::Event &evt, IdToHitMap &idToHitMap)
Create pandora input hits, mc particles etc.
Definition: LArPandora.cxx:175
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
static void LoadGeometry(LArDriftVolumeList &outputVolumeList, LArDriftVolumeMap &outputVolumeMap, const bool useActiveBoundingBox)
Load drift volume geometry.
ILArPandora class.
Definition: ILArPandora.h:26
Declaration of signal hit object.
std::map< art::Ptr< simb::MCParticle >, art::Ptr< simb::MCTruth > > MCParticlesToMCTruth
std::string m_testBeamInteractionVerticesInstanceLabel
The label for the test beam interaction vertices.
std::vector< LArDriftVolume > LArDriftVolumeList
const pandora::Pandora * m_pPrimaryPandora
std::string m_allOutcomesInstanceLabel
The label for the instance producing all outcomes.
static constexpr bool
bool m_disableRealDataCheck
Whether to check if the input file contains real data before accessing MC information.
Definition: LArPandora.h:69
bool m_shouldProduceAllOutcomes
Steering: whether to produce all reconstruction outcomes.
Definition: LArPandora.h:53
std::map< int, art::Ptr< recob::Hit > > IdToHitMap
Definition: ILArPandora.h:21
bool m_isNeutrinoRecoOnlyNoSlicing
If we are running the neutrino reconstruction only with no slicing.
std::string m_backtrackerModuleLabel
The back tracker module label.
Definition: LArPandora.h:60
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.
bool m_lineGapsCreated
Book-keeping: whether line gap creation has been called.
Definition: LArPandora.h:70
std::string m_hitfinderModuleLabel
The hit finder module label.
std::map< art::Ptr< recob::Hit >, TrackIDEVector > HitsToTrackIDEs
bool m_shouldRunNeutrinoRecoOption
Steering: whether to run neutrino reconstruction for each slice.
Definition: LArPandora.h:48
const pandora::Pandora * m_pPrimaryPandora
The address of the primary pandora instance.
Definition: ILArPandora.h:83
std::vector< simb::MCParticle > RawMCParticleVector
LArDriftVolumeMap m_driftVolumeMap
The map from volume id to drift volume.
Definition: LArPandora.h:75
virtual void CreatePandoraInstances()=0
Create pandora instances.
std::map< art::Ptr< simb::MCTruth >, MCParticleVector > MCTruthToMCParticles
std::string m_generatorModuleLabel
The generator module label.
Definition: LArPandora.h:56
std::string m_geantModuleLabel
The geant module label.
Definition: LArPandora.h:57
static void CreatePandoraMCLinks2D(const Settings &settings, const HitMap &hitMap, const HitsToTrackIDEs &hitToParticleMap)
Create links between the 2D hits and Pandora MC particles.
std::vector< art::Ptr< simb::MCParticle > > MCParticleVector
void ProcessPandoraOutput(art::Event &evt, const IdToHitMap &idToHitMap)
Process pandora output particle flow objects.
Definition: LArPandora.cxx:241
static void CollectSimChannels(const art::Event &evt, const std::string &label, SimChannelVector &simChannelVector, bool &areSimChannelsValid)
Collect a vector of SimChannel objects from the ART event record.
static void ProduceArtOutput(const Settings &settings, const IdToHitMap &idToHitMap, art::Event &evt)
Convert the Pandora PFOs into ART clusters and write into ART event.
static void LoadDetectorGaps(LArDetectorGapList &listOfGaps, const bool useActiveBoundingBox)
Load the 2D gaps that go with the chosen geometry.
bool m_shouldRunCosmicRecoOption
Steering: whether to run cosmic-ray reconstruction for each slice.
Definition: LArPandora.h:50
virtual void ResetPandoraInstances()=0
Reset all associated pandora instances.
Declaration of cluster object.
LArPandora(fhicl::ParameterSet const &pset)
Constructor.
Definition: LArPandora.cxx:41
bool m_shouldProduceTestBeamInteractionVertices
Whether to write the test beam interaction vertices in a separate collection.
Provides recob::Track data product.
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:65
void produce(art::Event &evt)
Definition: LArPandora.cxx:163
bool m_shouldRunStitching
Steering: whether to stitch cosmic-ray muons crossing between volumes.
Definition: LArPandora.h:43
LArPandoraInput::Settings m_inputSettings
The lar pandora input settings.
Definition: LArPandora.h:72
std::vector< art::Ptr< recob::Hit > > HitVector
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:73
std::vector< art::Ptr< sim::SimChannel > > SimChannelVector
bool m_shouldProduceAllOutcomes
If all outcomes should be produced in separate collections (choose false if you only require the cons...
std::vector< LArDetectorGap > LArDetectorGapList
bool m_shouldProduceSlices
Whether to produce output slices e.g. may not want to do this if only (re)processing single slices...
Header file detailing content for use with particle flow reconstruction at liquid argon time projecti...
static void CreatePandoraHits2D(const art::Event &evt, const Settings &settings, const LArDriftVolumeMap &driftVolumeMap, const HitVector &hitVector, IdToHitMap &idToHitMap)
Create the Pandora 2D hits from the ART hits.
bool m_shouldRunSlicing
Steering: whether to slice events into separate regions for processing.
Definition: LArPandora.h:46
virtual void RunPandoraInstances()=0
Run all associated pandora instances.
TCEvent evt
Definition: DataStructs.cxx:8
bool m_enableMCParticles
Whether to pass mc information to Pandora instances to aid development.
Definition: LArPandora.h:67
bool m_enableProduction
Whether to persist output products.
Definition: LArPandora.h:64
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 void CollectMCParticles(const art::Event &evt, const std::string &label, MCParticleVector &particleVector)
Collect a vector of MCParticle objects from the ART event record.
std::string m_simChannelModuleLabel
The SimChannel producer module label.
Definition: LArPandora.h:58
BEGIN_PROLOG don t mess with this pandoraTrackGausCryoW true
art framework interface to geometry description
std::string m_hitfinderModuleLabel
The hit finder module label.
Definition: LArPandora.h:59
virtual void ConfigurePandoraInstances()=0
Configure pandora instances.