LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
BackTracker.h
Go to the documentation of this file.
1 //
3 // \file BackTracker.h
4 // \brief Functions needed by the BackTracker service in order to connect truth information with reconstruction.
5 //
6 // \author jason.stock@mines.sdsmt.edu
7 //
8 // Based on the original BackTracker by brebel@fnal.gov
9 //
11 #ifndef CHEAT_BACKTRACKER_H
12 #define CHEAT_BACKTRACKER_H
13 
14 #include <vector>
15 
16 #include "fhiclcpp/fwd.h"
17 #include "fhiclcpp/types/Atom.h"
18 
25 
26 namespace detinfo {
27  class DetectorClocksData;
28 }
29 namespace recob {
30  class SpacePoint;
31 }
32 
33 namespace cheat {
34 
35  class BackTracker {
36  public:
37  // Structure for configuration parameters. (fhicl validation)
38  struct fhiclConfig {
40  fhicl::Name("G4ModuleLabel"),
41  fhicl::Comment("The label of the LArG4 module used to produce the "
42  "art file we will be using."),
43  "largeant"};
44  fhicl::Atom<art::InputTag> SimChannelModuleLabel{
45  fhicl::Name("SimChannelModuleLabel"),
46  fhicl::Comment("The label of the module containing the sim::SimChannel product."),
47  G4ModuleLabel()}; // -- D.R. label not required, if not provided
48  // defaults to the value of G4ModuleLabel
49  fhicl::Atom<art::InputTag> DefaultHitModuleLabel{
50  fhicl::Name("DefaultHitModuleLabel"),
51  fhicl::Comment("The label of the module used to produce the hits in the art file "
52  "we will default to when no hitlist is provided."),
53  "hitfd"};
54  fhicl::Atom<double> MinHitEnergyFraction{
55  fhicl::Name("MinHitEnergyFraction"),
56  fhicl::Comment("The minimum contribution an energy deposit must "
57  "make to a Hit to be considered part of that hit."),
58  0.010};
59  fhicl::Atom<bool> OverrideRealData{
60  fhicl::Name("OverrideRealData"),
61  fhicl::Comment("Option when overlaying simulation on real data, to tell the "
62  "backtracker to continue even if event looks like data."),
63  false};
64  fhicl::Atom<double> HitTimeRMS{fhicl::Name("HitTimeRMS"),
65  fhicl::Comment("The number of RMS units to move away"
66  "From a Hit peak time for searching IDE."),
67  1.0};
68  };
69 
70  BackTracker(const fhiclConfig& config,
71  const cheat::ParticleInventory* partInv,
72  geo::GeometryCore const* geom,
73  geo::WireReadoutGeom const* wireReadoutGeom);
74  BackTracker(const fhicl::ParameterSet& pSet,
75  const cheat::ParticleInventory* partInv,
76  geo::GeometryCore const* geom,
77  geo::WireReadoutGeom const* wireReadoutGeom);
78 
79  // I may need to include this to delete copy of service providers.
80  BackTracker(BackTracker const&) = delete;
81 
82  template <typename Evt>
83  void PrepEvent(const Evt& evt);
84 
85  template <typename Evt>
86  void PrepSimChannels(const Evt& evt);
87 
88  //-----------------------------------------------------
89  template <typename Evt>
90  bool CanRun(const Evt& evt)
91  {
92  return !evt.isRealData() || fOverrideRealData;
93  }
94 
95  //-----------------------------------------------------
96  template <typename Evt>
97  std::vector<art::Ptr<recob::Hit>> SpacePointToHits_Ps(art::Ptr<recob::SpacePoint> const& spt,
98  const Evt& evt) const;
99 
100  //-----------------------------------------------------
101  template <typename Evt>
102  std::vector<double> SpacePointToXYZ(detinfo::DetectorClocksData const& clockData,
103  art::Ptr<recob::SpacePoint> const& spt,
104  const Evt& evt) const;
105 
106  //-----------------------------------------------------
107  void ClearEvent();
108 
109  bool SimChannelsReady() const { return !fSimChannels.empty(); }
110 
111  const std::vector<art::Ptr<sim::SimChannel>>& SimChannels() const { return fSimChannels; }
112  // All Hit List would go here. We explicitly choose not to include it, as the user
113  // should not be using backtracker to access Hits. This could change in a concievable
114  // future use case where we also allow the user to define what the "AllHitList" should
115  // be, though this would have ramifications on other functions.
116 
117  std::vector<const sim::IDE*> TrackIdToSimIDEs_Ps(int const& id) const;
118  std::vector<const sim::IDE*> TrackIdToSimIDEs_Ps(int const& id, const geo::View_t view) const;
119 
126  art::Ptr<sim::SimChannel> FindSimChannelPtr(raw::ChannelID_t channel) const;
127 
136  art::Ptr<sim::SimChannel> FindSimChannel(raw::ChannelID_t channel) const;
137 
138  std::vector<sim::TrackIDE> ChannelToTrackIDEs(detinfo::DetectorClocksData const& clockData,
139  raw::ChannelID_t channel,
140  const double hit_start_time,
141  const double hit_end_time) const;
142 
143  // Track IDEs cannot be returned as pointers, as they dont exist in the data product,
144  // and we will not be storing them.
145  std::vector<sim::TrackIDE> HitToTrackIDEs(detinfo::DetectorClocksData const& clockData,
146  recob::Hit const& hit) const;
147  std::vector<sim::TrackIDE> HitToTrackIDEs(detinfo::DetectorClocksData const& clockData,
148  art::Ptr<recob::Hit> const& hit) const
149  {
150  return HitToTrackIDEs(clockData, *hit);
151  }
152 
153  std::vector<int> HitToTrackIds(detinfo::DetectorClocksData const& clockData,
154  recob::Hit const& hit) const;
155 
156  std::vector<sim::TrackIDE> HitToEveTrackIDEs(detinfo::DetectorClocksData const& clockData,
157  recob::Hit const& hit) const;
158  std::vector<sim::TrackIDE> HitToEveTrackIDEs(detinfo::DetectorClocksData const& clockData,
159  art::Ptr<recob::Hit> const& hit) const
160  {
161  return HitToEveTrackIDEs(clockData, *hit);
162  }
163 
164  // I will not return these by copy, as that could get very large very quickly.
165  std::vector<art::Ptr<recob::Hit>> TrackIdToHits_Ps(
166  detinfo::DetectorClocksData const& clockData,
167  int tkId,
168  std::vector<art::Ptr<recob::Hit>> const& hitsIn) const;
169 
170  std::vector<std::vector<art::Ptr<recob::Hit>>> TrackIdsToHits_Ps(
171  detinfo::DetectorClocksData const& clockData,
172  std::vector<int> const& tkIds,
173  std::vector<art::Ptr<recob::Hit>> const& hitsIn) const;
174 
175  std::vector<sim::IDE> HitToAvgSimIDEs(detinfo::DetectorClocksData const& clockData,
176  recob::Hit const& hit) const;
177  std::vector<sim::IDE> HitToAvgSimIDEs(detinfo::DetectorClocksData const& clockData,
178  art::Ptr<recob::Hit> const& hit) const
179  {
180  return HitToAvgSimIDEs(clockData, *hit);
181  }
182 
183  std::vector<const sim::IDE*> HitToSimIDEs_Ps(detinfo::DetectorClocksData const& clockData,
184  recob::Hit const& hit) const;
185  std::vector<const sim::IDE*> HitToSimIDEs_Ps(detinfo::DetectorClocksData const& clockData,
186  art::Ptr<recob::Hit> const& hit) const
187  {
188  return HitToSimIDEs_Ps(clockData, *hit);
189  }
190 
191  std::vector<double> SimIDEsToXYZ(std::vector<sim::IDE> const& ides) const;
192  std::vector<double> SimIDEsToXYZ(std::vector<const sim::IDE*> const& ide_Ps) const;
193 
194  std::vector<double> HitToXYZ(detinfo::DetectorClocksData const& clockData,
195  const recob::Hit& hit) const;
196  std::vector<double> HitToXYZ(detinfo::DetectorClocksData const& clockData,
197  art::Ptr<recob::Hit> const& hit) const
198  {
199  return HitToXYZ(clockData, *hit);
200  }
201 
202  double HitCollectionPurity(detinfo::DetectorClocksData const& clockData,
203  std::set<int> const& trackIds,
204  std::vector<art::Ptr<recob::Hit>> const& hits) const;
205  double HitChargeCollectionPurity(detinfo::DetectorClocksData const& clockData,
206  std::set<int> const& trackIds,
207  std::vector<art::Ptr<recob::Hit>> const& hits) const;
208 
209  double HitCollectionEfficiency(detinfo::DetectorClocksData const& clockData,
210  std::set<int> const& trackIds,
212  std::vector<art::Ptr<recob::Hit>> const& allhits,
213  geo::View_t const& view) const;
214 
215  double HitChargeCollectionEfficiency(detinfo::DetectorClocksData const& clockData,
216  std::set<int> const& trackIds,
218  std::vector<art::Ptr<recob::Hit>> const& allhits,
219  geo::View_t const& view) const;
220 
221  std::set<int> GetSetOfTrackIds() const { return fPartInv->GetSetOfTrackIds(); }
222  std::set<int> GetSetOfEveIds() const { return fPartInv->GetSetOfEveIds(); }
223 
224  std::set<int> GetSetOfTrackIds(detinfo::DetectorClocksData const& clockData,
225  std::vector<art::Ptr<recob::Hit>> const& hits) const;
226  std::set<int> GetSetOfEveIds(detinfo::DetectorClocksData const& clockData,
227  std::vector<art::Ptr<recob::Hit>> const& hits) const;
228 
229  std::vector<double> SpacePointHitsToWeightedXYZ(
230  detinfo::DetectorClocksData const& clockData,
231  std::vector<art::Ptr<recob::Hit>> const& hits) const;
232 
233  private:
234  const cheat::ParticleInventory* fPartInv; // The constructor needs to put something in here
240  const double fMinHitEnergyFraction;
241  const bool fOverrideRealData;
242  const double fHitTimeRMS;
243 
244  mutable std::vector<art::Ptr<sim::SimChannel>> fSimChannels;
245 
246  }; // end class BackTracker
247 
248 } // end namespace cheat
249 
250 #include "BackTracker.tcc"
251 
252 #endif // CHEAT_BACKTRACKER_H
const art::InputTag fHitLabel
Definition: BackTracker.h:239
const geo::GeometryCore * fGeom
Definition: BackTracker.h:235
Reconstruction base classes.
std::vector< art::Ptr< sim::SimChannel > > fSimChannels
Definition: BackTracker.h:244
enum geo::_plane_proj View_t
Enumerate the possible plane projections.
Declaration of signal hit object.
const art::InputTag fSimChannelModuleLabel
Definition: BackTracker.h:238
const double fMinHitEnergyFraction
Definition: BackTracker.h:240
std::vector< double > HitToXYZ(detinfo::DetectorClocksData const &clockData, art::Ptr< recob::Hit > const &hit) const
Definition: BackTracker.h:196
std::vector< sim::TrackIDE > HitToTrackIDEs(detinfo::DetectorClocksData const &clockData, art::Ptr< recob::Hit > const &hit) const
Definition: BackTracker.h:147
bool CanRun(const Evt &evt)
Definition: BackTracker.h:90
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:289
const geo::WireReadoutGeom * fWireReadoutGeom
Definition: BackTracker.h:236
void hits()
Definition: readHits.C:15
bool SimChannelsReady() const
Definition: BackTracker.h:109
Interface for a class providing readout channel mapping to geometry.
std::set< int > GetSetOfTrackIds() const
Definition: BackTracker.h:221
const cheat::ParticleInventory * fPartInv
Definition: BackTracker.h:234
const double fHitTimeRMS
Definition: BackTracker.h:242
General LArSoft Utilities.
Description of the physical geometry of one entire detector.
Definition: GeometryCore.h:91
std::vector< sim::TrackIDE > HitToEveTrackIDEs(detinfo::DetectorClocksData const &clockData, art::Ptr< recob::Hit > const &hit) const
Definition: BackTracker.h:158
Definition of data types for geometry description.
Detector simulation of raw signals on wires.
const std::vector< art::Ptr< sim::SimChannel > > & SimChannels() const
Definition: BackTracker.h:111
std::set< int > GetSetOfEveIds() const
Definition: BackTracker.h:222
std::vector< const sim::IDE * > HitToSimIDEs_Ps(detinfo::DetectorClocksData const &clockData, art::Ptr< recob::Hit > const &hit) const
Definition: BackTracker.h:185
code to link reconstructed objects back to the MC truth information
Definition: BackTracker.cc:24
const bool fOverrideRealData
Definition: BackTracker.h:241
Contains all timing reference information for the detector.
object containing MC truth information necessary for making RawDigits and doing back tracking ...
Header for the ParticleInvenotry Service Provider.
const art::InputTag fG4ModuleLabel
Definition: BackTracker.h:237
2D representation of charge deposited in the TDC/wire plane
Definition: Hit.h:46
TCEvent evt
Definition: DataStructs.cxx:8
unsigned int ChannelID_t
Type representing the ID of a readout channel.
Definition: RawTypes.h:28
std::vector< sim::IDE > HitToAvgSimIDEs(detinfo::DetectorClocksData const &clockData, art::Ptr< recob::Hit > const &hit) const
Definition: BackTracker.h:177