All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
TrackProxyTrackMaker_module.cc
Go to the documentation of this file.
1 /**
2  * @file TrackProxyTrackMaker_module.cc
3  * @brief Test producer creating a few dummy hits.
4  * @author Gianluca Petrillo (petrillo@fnal.gov)
5  * @date July 31, 2017
6  *
7  * This started as a copy of `lar::test::AssnsChainHitMaker` test module.
8  */
9 
10 // LArSoft libraries
11 #include "art/Persistency/Common/PtrMaker.h"
18 
19 // framework libraries
20 #include "art/Framework/Core/EDProducer.h"
21 #include "art/Framework/Core/ModuleMacros.h"
22 #include "art/Framework/Principal/Event.h"
23 #include "canvas/Persistency/Common/Assns.h"
24 #include "canvas/Utilities/InputTag.h"
25 #include "messagefacility/MessageLogger/MessageLogger.h"
26 #include "fhiclcpp/types/Atom.h"
27 #include "fhiclcpp/types/Sequence.h"
28 #include "fhiclcpp/types/Name.h"
29 #include "fhiclcpp/types/Comment.h"
30 
31 // ROOT
32 #include "Math/SMatrix.h" // ROOT::Math::SMatrixIdentity
33 
34 // C/C++ standard libraries
35 #include <utility> // std::move()
36 #include <memory> // std::make_unique()
37 
38 
39 namespace lar {
40  namespace test {
41 
42  // -------------------------------------------------------------------------
43  /**
44  * @brief Creates some dummy hits.
45  *
46  * The produced tracks have completely dummy content.
47  *
48  * Configuration parameters
49  * =========================
50  *
51  * * *hits* (input tag, mandatory): the data product to read the hits from
52  * * *hitsPerTrack* (list of unsigned integers, mandatory): number of hits
53  * for each produced track. If there are hits left after all the tracks
54  * specified here have been created, an additional track with all those
55  * hits is created. If there are not enough hits, an exception is thrown.
56  *
57  */
58  class TrackProxyTrackMaker: public art::EDProducer {
59  public:
60 
61  struct Config {
62  using Name = fhicl::Name;
63  using Comment = fhicl::Comment;
64 
65  fhicl::Atom<art::InputTag> hitsTag{
66  Name("hits"),
67  Comment("tag of the recob::Hit data products to produce tracks with.")
68  };
69 
70  fhicl::Sequence<unsigned int> hitsPerTrack{
71  Name("hitsPerTrack"),
72  Comment("number of hits per track; last takes all remaining ones.")
73  };
74 
75  }; // struct Config
76 
77  using Parameters = art::EDProducer::Table<Config>;
78 
79  explicit TrackProxyTrackMaker(Parameters const& config)
80  : EDProducer{config}
81  , hitsTag(config().hitsTag())
82  , hitsPerTrack(config().hitsPerTrack())
83  {
84  produces<std::vector<recob::TrackTrajectory>>();
85  produces<art::Assns<recob::TrackTrajectory, recob::Hit>>();
86  produces<std::vector<recob::Track>>();
87  produces<std::vector<std::vector<recob::TrackFitHitInfo>>>();
88  produces<art::Assns<recob::Track, recob::Hit, recob::TrackHitMeta>>();
89  produces<art::Assns<recob::Track, recob::TrackTrajectory>>();
90  }
91 
92  virtual void produce(art::Event& event) override;
93 
94  private:
95  art::InputTag hitsTag; ///< Input hit collection label.
96  std::vector<unsigned int> hitsPerTrack; ///< Hits per produced track.
97 
98  }; // TrackProxyTrackMaker
99 
100  // -------------------------------------------------------------------------
101 
102 
103  } // namespace test
104 } // namespace lar
105 
106 
107 // -----------------------------------------------------------------------------
109 
110  auto trajectories = std::make_unique<std::vector<recob::TrackTrajectory>>();
111  auto tracks = std::make_unique<std::vector<recob::Track>>();
112  auto trackFitInfo
113  = std::make_unique<std::vector<std::vector<recob::TrackFitHitInfo>>>();
114  auto hitTrackAssn
115  = std::make_unique<art::Assns<recob::Track, recob::Hit, recob::TrackHitMeta>>();
116  auto hitTrajectoryAssn
117  = std::make_unique<art::Assns<recob::TrackTrajectory, recob::Hit>>();
118  auto trackTrajectoryAssn
119  = std::make_unique<art::Assns<recob::Track, recob::TrackTrajectory>>();
120 
121  auto hitHandle = event.getValidHandle<std::vector<recob::Hit>>(hitsTag);
122  auto const& hits = *hitHandle;
123 
124  art::PtrMaker<recob::TrackTrajectory> trajectoryPtrMaker(event);
125  art::PtrMaker<recob::Track> trackPtrMaker(event);
126  unsigned int iTrack = 0;
127  unsigned int usedHits = 0;
128  while (usedHits < hits.size()) {
129 
130  // how many hits for this track:
131  unsigned int const nTrackHits = (iTrack < hitsPerTrack.size())
132  ? std::min(hitsPerTrack[iTrack], (unsigned int)(hits.size() - usedHits))
133  : (hits.size() - usedHits)
134  ;
135 
136  //
137  // create the track trajectory and fit information
138  //
139  std::size_t const firstHit = usedHits;
143  std::vector<recob::TrackFitHitInfo> fitInfo;
144  for (unsigned int iPoint = 0; iPoint < nTrackHits; ++iPoint) {
145  //
146  // fill base track information
147  //
149  Mask_t pointFlags {
154  };
155 
156  // one point out of seven has no valid position at all
157  if (iPoint % 7 == 2) // make sure there are at least two valid points
159  // one point out of five was made ignoring the hit
160  if (iPoint % 5)
162  // one point out of three is suspicious
163  if (iPoint % 3)
165  // every other point has issues
166  if (iPoint % 2)
168 
169  pos.emplace_back(iPoint, iPoint, iPoint);
170  mom.emplace_back(2.0, 1.0, 0.0);
171  flags.emplace_back(usedHits++, pointFlags);
172  //
173  // fill optional information
174  //
175  fitInfo.push_back({
176  double(iPoint) * 2.5, // aHitMeas
177  double(iPoint) * 1.5, // aHitMeasErr2
178  {}, // aTrackStatePar
179  { ROOT::Math::SMatrixIdentity{} }, // aTrackStateCov
180  hits[usedHits + iPoint].WireID() // aWireId
181  });
182  } // for
183 
184  // produce some "additional" trajectory (pretty much invalid)
185  trajectories->emplace_back();
186 
187  trajectories->emplace_back
188  (std::move(pos), std::move(mom), std::move(flags), true);
189 
190  //
191  // create the trajectory-hit associations
192  // (no hits for the invalid trajectory)
193  //
194  auto const trajPtr = trajectoryPtrMaker(trajectories->size() - 1U);
195  for (std::size_t iHit = firstHit; iHit < usedHits; ++iHit)
196  hitTrajectoryAssn->addSingle(trajPtr, { hitHandle, iHit });
197 
198  //
199  // create the track
200  //
202  (trajectories->back(), 2112, 1.0, nTrackHits, {}, {}, iTrack);
203  tracks->push_back(std::move(track));
204 
205  //
206  // and the additional objects
207  //
208  trackFitInfo->push_back(std::move(fitInfo));
209 
210  //
211  // create the track-hit associations
212  //
213  auto const trackPtr = trackPtrMaker(iTrack);
214  for (std::size_t iHit = firstHit; iHit < usedHits; ++iHit) {
215 
216  auto const hitIndex = iHit - firstHit;
217  recob::TrackHitMeta const hitInfo(hitIndex, 2.0 * hitIndex);
218  hitTrackAssn->addSingle(trackPtr, { hitHandle, iHit }, hitInfo);
219 
220  } // for
221 
222  //
223  // create the track-trajectory associations
224  //
225  trackTrajectoryAssn->addSingle(trackPtr, trajPtr);
226 
227  mf::LogVerbatim("TrackProxyTrackMaker")
228  << "New track #" << tracks->back().ID()
229  << " with " << nTrackHits << " hits";
230 
231  //
232  // prepare for the next track
233  //
234  ++iTrack;
235 
236  } // while
237 
238  mf::LogInfo("TrackProxyTrackMaker")
239  << "Produced " << tracks->size() << " tracks from " << usedHits << " hits.";
240 
241  event.put(std::move(trajectories));
242  event.put(std::move(hitTrajectoryAssn));
243  event.put(std::move(tracks));
244  event.put(std::move(trackFitInfo));
245  event.put(std::move(hitTrackAssn));
246  event.put(std::move(trackTrajectoryAssn));
247 
248 } // lar::test::TrackProxyTrackMaker::produce()
249 
250 // -----------------------------------------------------------------------------
251 DEFINE_ART_MODULE(lar::test::TrackProxyTrackMaker)
252 
253 // -----------------------------------------------------------------------------
std::vector< unsigned int > hitsPerTrack
Hits per produced track.
virtual void produce(art::Event &event) override
static constexpr Flag_t Suspicious
The point reconstruction is somehow questionable.
ClusterModuleLabel join with tracks
static constexpr Flag_t NoPoint
The trajectory point is not defined.
Declaration of signal hit object.
art::EDProducer::Table< Config > Parameters
tracking::Positions_t Positions_t
Type of trajectory point list.
Class to keep data related to recob::Hit associated with recob::Track.
process_name use argoneut_mc_hitfinder track
Data related to recob::Hit associated with recob::Track.The purpose is to collect several variables t...
Definition: TrackHitMeta.h:43
tracking::Momenta_t Momenta_t
Type of momentum list.
BEGIN_PROLOG vertical distance to the surface Name
Data product for reconstructed trajectory in space.
art::InputTag hitsTag
Input hit collection label.
static constexpr Flag_t HitIgnored
Hit was not included for the computation of the trajectory.
std::vector< PointFlags_t > Flags_t
Type of point flag list.
Set of flags pertaining a point of the track.
Provides recob::Track data product.
Flags_t::Mask_t Mask_t
Type of mask of bits.
TrackProxyTrackMaker(Parameters const &config)
static constexpr Flag_t DetectorIssue
The hit is associated to a problematic channel.
BEGIN_PROLOG hitmakerfive clustermakerfour pfparticlemakerthree showermakertwo END_PROLOG hitmakerfive clustermakerfour pfparticlemakerthree sequence::inline_paths sequence::inline_paths sequence::inline_paths showermakers test
Track from a non-cascading particle.A recob::Track consists of a recob::TrackTrajectory, plus additional members relevant for a &quot;fitted&quot; track: