LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
TrackContainmentAlg.cxx
Go to the documentation of this file.
1 #include "TrackContainmentAlg.hh"
4 
6 
7 #include "TTree.h"
8 
9 #include <iostream>
10 
12 
14 {
15  fTrackTree = tfs_tree_trk;
16  fTrackTree->SetObject(fTrackTree->GetName(), "Track Tree");
17  fTrackTree->Branch("run", &fRun);
18  fTrackTree->Branch("event", &fEvent);
19  fTrackTree->Branch("trk", &fTrackTreeObj, fTrackTreeObj.Leaflist().c_str());
20  fTrackTree->Branch("trk_col", &fCollection);
21  fTrackTree->Branch("trk_id", &fTrkID);
22  fTrackTree->Branch("trk_mindist", &fDistance);
23  fTrackTree->Branch("trk_containment", &fContainment);
24 }
25 
27 {
28  fZBuffer = p.get<double>("ZBuffer");
29  fYBuffer = p.get<double>("YBuffer");
30  fXBuffer = p.get<double>("XBuffer");
31  fIsolation = p.get<double>("Isolation");
32 
33  fDebug = p.get<bool>("Debug", false);
34  fMakeCosmicTags = p.get<bool>("MakeCosmicTags", true);
35  fFillOutputTree = p.get<bool>("FillOutputTree", true);
36 }
37 
39 {
40  auto const& tpc = geo.TPC({0, 0});
41  if (track.Vertex().Z() < (0 + fZBuffer) || track.Vertex().Z() > (tpc.Length() - fZBuffer))
42  return false;
43  if (track.End().Z() < (0 + fZBuffer) || track.End().Z() > (tpc.Length() - fZBuffer)) return false;
44  if (track.Vertex().Y() < (-1 * tpc.HalfHeight() + fYBuffer) ||
45  track.Vertex().Y() > (tpc.HalfHeight() - fYBuffer))
46  return false;
47  if (track.End().Y() < (-1 * tpc.HalfHeight() + fYBuffer) ||
48  track.End().Y() > (tpc.HalfHeight() - fYBuffer))
49  return false;
50  if (track.Vertex().X() < (0 + fXBuffer) || track.Vertex().X() > (2 * tpc.HalfWidth() - fXBuffer))
51  return false;
52  if (track.End().X() < (0 + fXBuffer) || track.End().X() > (2 * tpc.HalfWidth() - fXBuffer))
53  return false;
54 
55  return true;
56 }
57 
59  geo::GeometryCore const& geo)
60 {
61  auto const& tpc = geo.TPC({0, 0});
62 
64 
65  if (track.Vertex().Z() < (0 + fZBuffer) || track.Vertex().Z() > (tpc.Length() - fZBuffer))
67  else if (track.Vertex().Y() < (-1 * tpc.HalfHeight() + fYBuffer) ||
68  track.Vertex().Y() > (tpc.HalfHeight() - fYBuffer))
70  else if ((track.Vertex().X() > 0 && track.Vertex().X() < (0 + fXBuffer)) ||
71  (track.Vertex().X() < 2 * tpc.HalfWidth() &&
72  track.Vertex().X() > (2 * tpc.HalfWidth() - fXBuffer)))
74 
75  if (track.End().Z() < (0 + fZBuffer) || track.End().Z() > (tpc.Length() - fZBuffer)) {
78  else if (id == anab::CosmicTagID_t::kGeometry_Z)
80  else if (id == anab::CosmicTagID_t::kGeometry_Y)
82  else if (id == anab::CosmicTagID_t::kGeometry_X)
84  }
85  else if (track.End().Y() < (-1 * tpc.HalfHeight() + fYBuffer) ||
86  track.End().Y() > (tpc.HalfHeight() - fYBuffer)) {
89  else if (id == anab::CosmicTagID_t::kGeometry_Z)
91  else if (id == anab::CosmicTagID_t::kGeometry_Y)
93  else if (id == anab::CosmicTagID_t::kGeometry_X)
95  }
96  else if ((track.End().X() > 0 && track.End().X() < (0 + fXBuffer)) ||
97  (track.End().X() < 2 * tpc.HalfWidth() &&
98  track.End().X() > (2 * tpc.HalfWidth() - fXBuffer))) {
101  else if (id == anab::CosmicTagID_t::kGeometry_Z)
103  else if (id == anab::CosmicTagID_t::kGeometry_Y)
105  else if (id == anab::CosmicTagID_t::kGeometry_X)
107  }
108 
109  if (track.Vertex().X() < 0 || track.Vertex().X() > 2 * tpc.HalfWidth())
111  if (track.End().X() < 0 || track.End().X() > 2 * tpc.HalfWidth()) {
114  else
116  }
117 
118  return id;
119 }
120 
122  recob::Track const& t_ref)
123 {
124  double min_distance = 9e12;
125  for (size_t i_p = 0; i_p < t_ref.NumberTrajectoryPoints(); ++i_p) {
126  double const distance = (t_probe.Vertex() - t_ref.LocationAtPoint(i_p)).R();
127  if (distance < min_distance) min_distance = distance;
128  }
129  return std::sqrt(min_distance);
130 }
131 
133  recob::Track const& t_ref)
134 {
135  double min_distance = 9e12;
136  for (size_t i_p = 0; i_p < t_ref.NumberTrajectoryPoints(); ++i_p) {
137  double const distance = (t_probe.End() - t_ref.LocationAtPoint(i_p)).R();
138  if (distance < min_distance) min_distance = distance;
139  }
140  return std::sqrt(min_distance);
141 }
142 
143 void trk::TrackContainmentAlg::SetRunEvent(unsigned int const& run, unsigned int const& event)
144 {
145  fRun = run;
146  fEvent = event;
147 }
148 
150  std::vector<std::vector<recob::Track>> const& tracksVec,
151  geo::GeometryCore const& geo,
152  geo::WireReadoutGeom const& wireReadoutGeom)
153 {
154  auto const& tpc = geo.TPC({0, 0});
155 
156  if (fDebug) {
157  std::cout << "Geometry:" << std::endl;
158  std::cout << "\t" << tpc.HalfWidth() << " " << tpc.HalfHeight() << " " << tpc.Length()
159  << std::endl;
160  std::cout << "\t z:(" << fZBuffer << "," << tpc.Length() - fZBuffer << ")"
161  << "\t y:(" << -1. * tpc.HalfHeight() + fYBuffer << "," << tpc.HalfHeight() - fYBuffer
162  << ")"
163  << "\t x:(" << 0 + fXBuffer << "," << 2 * tpc.HalfWidth() - fXBuffer << ")"
164  << std::endl;
165  }
166 
167  int containment_level = 0;
168  bool track_linked = false;
169 
170  fTrackContainmentLevel.clear();
171  fTrackContainmentLevel.resize(tracksVec.size());
172  fMinDistances.clear();
173  fMinDistances.resize(tracksVec.size());
174 
175  fTrackContainmentIndices.clear();
176  fTrackContainmentIndices.push_back(std::vector<std::pair<int, int>>());
177 
178  fCosmicTags.clear();
179  fCosmicTags.resize(tracksVec.size());
180 
181  //first, loop through tracks and see what's not contained
182 
183  for (size_t i_tc = 0; i_tc < tracksVec.size(); ++i_tc) {
184  fTrackContainmentLevel[i_tc].resize(tracksVec[i_tc].size(), -1);
185  fMinDistances[i_tc].resize(tracksVec[i_tc].size(), 9e12);
186  fCosmicTags[i_tc].resize(tracksVec[i_tc].size(), anab::CosmicTag(-1));
187  for (size_t i_t = 0; i_t < tracksVec[i_tc].size(); ++i_t) {
188 
189  if (!IsContained(tracksVec[i_tc][i_t], geo)) {
190  if (!track_linked) track_linked = true;
191  fTrackContainmentLevel[i_tc][i_t] = 0;
192  fTrackContainmentIndices.back().emplace_back(i_tc, i_t);
193  if (fDebug) {
194  std::cout << "\tTrack (" << i_tc << "," << i_t << ")"
195  << " " << containment_level << std::endl;
196  }
197 
198  } //end if contained
199  } //end loop over tracks
200 
201  } //end loop over track collections
202 
203  //now, while we are still linking tracks, loop over all tracks and note anything
204  //close to an uncontained (or linked) track
205  while (track_linked) {
206 
207  track_linked = false;
208  ++containment_level;
209  fTrackContainmentIndices.push_back(std::vector<std::pair<int, int>>());
210 
211  for (size_t i_tc = 0; i_tc < tracksVec.size(); ++i_tc) {
212  for (size_t i_t = 0; i_t < tracksVec[i_tc].size(); ++i_t) {
213  if (fTrackContainmentLevel[i_tc][i_t] >= 0)
214  continue;
215  else {
216  for (auto const& i_tr : fTrackContainmentIndices[containment_level - 1]) {
217 
218  if (MinDistanceStartPt(tracksVec[i_tc][i_t], tracksVec[i_tr.first][i_tr.second]) <
219  fMinDistances[i_tc][i_t])
220  fMinDistances[i_tc][i_t] =
221  MinDistanceStartPt(tracksVec[i_tc][i_t], tracksVec[i_tr.first][i_tr.second]);
222  if (MinDistanceEndPt(tracksVec[i_tc][i_t], tracksVec[i_tr.first][i_tr.second]) <
223  fMinDistances[i_tc][i_t])
224  fMinDistances[i_tc][i_t] =
225  MinDistanceEndPt(tracksVec[i_tc][i_t], tracksVec[i_tr.first][i_tr.second]);
226 
227  if (MinDistanceStartPt(tracksVec[i_tc][i_t], tracksVec[i_tr.first][i_tr.second]) <
228  fIsolation ||
229  MinDistanceEndPt(tracksVec[i_tc][i_t], tracksVec[i_tr.first][i_tr.second]) <
230  fIsolation) {
231  if (!track_linked) track_linked = true;
232  fTrackContainmentLevel[i_tc][i_t] = containment_level;
233  fTrackContainmentIndices.back().emplace_back(i_tc, i_t);
234 
235  if (fDebug) {
236  std::cout << "\tTrackPair (" << i_tc << "," << i_t << ") and (" << i_tr.first << ","
237  << i_tr.second << ")"
238  << " " << containment_level << std::endl;
239  }
240 
241  } //end if track not isolated
242 
243  } //end loop over existing uncontained/linked tracks
244 
245  } //end if track not already linked
246 
247  } //end loops over tracks
248  } //end loop over track collections
249  } //end while linking tracks
250 
251  if (fDebug) std::cout << "All done! Now let's make the tree and tags!" << std::endl;
252 
253  //now we're going to will the tree and create tags if requested
254  for (size_t i_tc = 0; i_tc < tracksVec.size(); ++i_tc) {
255  for (size_t i_t = 0; i_t < tracksVec[i_tc].size(); ++i_t) {
256 
257  //fill ROOT Tree
258  if (fFillOutputTree) {
259  fTrackTreeObj = TrackTree_t(tracksVec[i_tc][i_t]);
260  fDistance = fMinDistances[i_tc][i_t];
261  fCollection = i_tc;
262  fTrkID = i_t;
264  fTrackTree->Fill();
265  }
266 
267  if (fMakeCosmicTags) {
268 
269  //default (if track looks contained and isolated)
270  float score = 0;
272 
273  //overwrite if track is not contained or not isolated
274  if (fTrackContainmentLevel[i_tc][i_t] >= 0) {
275  score = 1. / (1. + (float)fTrackContainmentLevel[i_tc][i_t]);
276  if (fTrackContainmentLevel[i_tc][i_t] == 0)
277  id = GetCosmicTagID(tracksVec[i_tc][i_t], geo);
278  else
280  }
281 
282  fCosmicTags[i_tc][i_t] =
283  anab::CosmicTag(std::vector<float>{(float)tracksVec[i_tc][i_t].Vertex().X(),
284  (float)tracksVec[i_tc][i_t].Vertex().Y(),
285  (float)tracksVec[i_tc][i_t].Vertex().Z()},
286  std::vector<float>{(float)tracksVec[i_tc][i_t].End().X(),
287  (float)tracksVec[i_tc][i_t].End().Y(),
288  (float)tracksVec[i_tc][i_t].End().Z()},
289  score,
290  id);
291  } //end cosmic tag making
292 
293  //some debug work
294  if (fTrackContainmentLevel[i_tc][i_t] < 0 && fDebug) {
295  std::cout << "Track (" << i_tc << "," << i_t << ")"
296  << " " << fTrackContainmentLevel[i_tc][i_t] << " " << fMinDistances[i_tc][i_t]
297  << std::endl;
298  auto const& vertex = tracksVec[i_tc][i_t].Vertex();
299  std::cout << "\tS_(X,Y,Z) = (" << vertex.X() << "," << vertex.Y() << "," << vertex.Z()
300  << ")\n";
301  std::cout << "\tNearest wire ..." << std::endl;
302  for (unsigned int i_p = 0; i_p < wireReadoutGeom.Nplanes(); ++i_p) {
303  auto const& plane = wireReadoutGeom.Plane({0, 0, i_p});
304  std::cout << "\t\tPlane " << i_p << " " << plane.NearestWireID(vertex).Wire << std::endl;
305  }
306 
307  auto const& end = tracksVec[i_tc][i_t].End();
308  std::cout << "\tE_(X,Y,Z) = (" << end.X() << "," << end.Y() << "," << end.Z() << ")\n";
309  std::cout << "\tNearest wire ..." << std::endl;
310  for (unsigned int i_p = 0; i_p < wireReadoutGeom.Nplanes(); ++i_p) {
311  auto const& plane = wireReadoutGeom.Plane({0, 0, i_p});
312  std::cout << "\t\tPlane " << i_p << " " << plane.NearestWireID(end).Wire << std::endl;
313  }
314  std::cout << "\tLength=" << tracksVec[i_tc][i_t].Length() << std::endl;
315  std::cout << "\tSimple_length=" << (end - vertex).R() << std::endl;
316  } //end debug statements if track contained
317 
318  } //end loops over tracks
319  } //end loop over track collections
320 
321 } //end ProcessTracks
322 
323 std::vector<std::vector<anab::CosmicTag>> const& trk::TrackContainmentAlg::GetTrackCosmicTags()
324 {
325  if (!fMakeCosmicTags)
326  throw cet::exception("TrackContainmentAlg::GetTrackCosmicTags")
327  << "Cosmic tags not created. Set MakeCosmicTags to true in fcl paramters.";
328  return fCosmicTags;
329 }
double MinDistanceStartPt(recob::Track const &, recob::Track const &)
std::vector< std::vector< std::pair< int, int > > > fTrackContainmentIndices
WireID NearestWireID(Point_t const &pos) const
Returns the ID of wire closest to the specified position.
Definition: PlaneGeo.cxx:485
enum anab::cosmic_tag_id CosmicTagID_t
Point_t const & LocationAtPoint(size_t i) const
Access to track position at different points.
Definition: Track.h:160
std::vector< std::vector< anab::CosmicTag > > fCosmicTags
size_t NumberTrajectoryPoints() const
Various functions related to the presence and the number of (valid) points.
Definition: Track.h:136
WireID_t Wire
Index of the wire within its plane.
Definition: geo_types.h:430
anab::CosmicTagID_t GetCosmicTagID(recob::Track const &, geo::GeometryCore const &)
decltype(auto) constexpr end(T &&obj)
ADL-aware version of std::end.
Definition: StdUtils.h:77
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
Definition: StdUtils.h:101
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
Definition: DumpUtils.h:289
Access the description of the physical detector geometry.
struct trk::TrackTree TrackTree_t
std::vector< std::vector< int > > fTrackContainmentLevel
Interface for a class providing readout channel mapping to geometry.
std::string Leaflist()
T get(std::string const &key) const
Definition: ParameterSet.h:314
Point_t const & Vertex() const
Access to track position at different points.
Definition: Track.h:158
void Configure(fhicl::ParameterSet const &)
void SetRunEvent(unsigned int const &, unsigned int const &)
Description of the physical geometry of one entire detector.
Definition: GeometryCore.h:91
double MinDistanceEndPt(recob::Track const &, recob::Track const &)
unsigned int Nplanes(TPCID const &tpcid=details::tpc_zero) const
Returns the total number of planes in the specified TPC.
std::vector< std::vector< double > > fMinDistances
std::vector< std::vector< anab::CosmicTag > > const & GetTrackCosmicTags()
void ProcessTracks(std::vector< std::vector< recob::Track >> const &, geo::GeometryCore const &, geo::WireReadoutGeom const &)
TrackContainmentAlg()
Default constructor.
Point_t const & End() const
Access to track position at different points.
Definition: Track.h:159
boost::graph_traits< ModuleGraph >::vertex_descriptor Vertex
Definition: ModuleGraph.h:25
PlaneGeo const & Plane(TPCID const &tpcid, View_t view) const
Returns the specified wire.
TPCGeo const & TPC(TPCID const &tpcid=details::tpc_zero) const
Returns the specified TPC.
Definition: GeometryCore.h:448
ROOT libraries.
Float_t track
Definition: plot.C:35
Interface to geometry for wire readouts .
double HalfWidth() const
Width is associated with x coordinate [cm].
Definition: TPCGeo.h:102
Track from a non-cascading particle.A recob::Track consists of a recob::TrackTrajectory, plus additional members relevant for a "fitted" track:
Definition: Track.h:49
bool IsContained(recob::Track const &, geo::GeometryCore const &)
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33
Event finding and building.
vertex reconstruction