LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
ShowerPandoraSlidingFitTrackFinder_tool.cc
Go to the documentation of this file.
1 //#############################################################################
2 //### Name: ShowerPandoraSlidingFitTrackFinder ###
3 //### Author: Dominic Barker (dominic.barker@sheffield.ac.uk ###
4 //### Date: 30.07.19 ###
5 //### Description: Tool for finding the initial shower track using the ###
6 //### pandora sliding fit calculation. This method is derived ###
7 //### from the PandoraTrackCreationModule.cc ###
8 //#############################################################################
9 
10 //Framework Includes
12 
13 //LArSoft Includes
25 
26 namespace ShowerRecoTools {
27 
29  public:
31 
32  //Generic Track Finder
33  int CalculateElement(const art::Ptr<recob::PFParticle>& pfparticle,
34  art::Event& Event,
35  reco::shower::ShowerElementHolder& ShowerEleHolder) override;
36 
37  private:
38  void InitialiseProducers() override;
39 
40  //Function to add the assoctions
42  art::Event& Event,
43  reco::shower::ShowerElementHolder& ShowerEleHolder) override;
44 
45  // Define standard art tool interface.
47 
48  //fcl paramaters
49  int fVerbose;
50  float fSlidingFitHalfWindow; //To Describe
51  float fMinTrajectoryPoints; //Minimum number of trajectory point to say the track is good.
58  };
59 
61  const fhicl::ParameterSet& pset)
62  : IShowerTool(pset.get<fhicl::ParameterSet>("BaseTools"))
63  , fVerbose(pset.get<int>("Verbose"))
64  , fSlidingFitHalfWindow(pset.get<float>("SlidingFitHalfWindow"))
65  , fMinTrajectoryPoints(pset.get<float>("MinTrajectoryPoints"))
66  , fInitialTrackOutputLabel(pset.get<std::string>("InitialTrackOutputLabel"))
67  , fInitialTrackLengthOutputLabel(pset.get<std::string>("InitialTrackLengthOutputLabel"))
68  , fShowerStartPositionInputLabel(pset.get<std::string>("ShowerStartPositionInputLabel"))
69  , fShowerDirectionInputLabel(pset.get<std::string>("ShowerDirectionInputLabel"))
70  , fInitialTrackSpacePointsInputLabel(pset.get<std::string>("InitialTrackSpacePointsInputLabel"))
71  , fInitialTrackHitsInputLabel(pset.get<std::string>("InitialTrackHitsInputLabel"))
72  {}
73 
75  {
76 
77  InitialiseProduct<std::vector<recob::Track>>(fInitialTrackOutputLabel);
78  InitialiseProduct<art::Assns<recob::Shower, recob::Track>>("ShowerTrackAssn");
79  InitialiseProduct<art::Assns<recob::Track, recob::Hit>>("ShowerTrackHitAssn");
80  }
81 
82  //This whole idea is stolen from PandoraTrackCreationModule so credit goes to the Pandora guys.
84  const art::Ptr<recob::PFParticle>& pfparticle,
85  art::Event& Event,
86  reco::shower::ShowerElementHolder& ShowerEleHolder)
87  {
88  //This is all based on the shower vertex being known. If it is not lets not do the track
89  if (!ShowerEleHolder.CheckElement(fShowerStartPositionInputLabel)) {
90  if (fVerbose)
91  mf::LogError("ShowerPandoraSlidingFitTrackFinder")
92  << "Start position not set, returning " << std::endl;
93  return 1;
94  }
95  if (!ShowerEleHolder.CheckElement(fShowerDirectionInputLabel)) {
96  if (fVerbose)
97  mf::LogError("ShowerPandoraSlidingFitTrackFinder")
98  << "Direction not set, returning " << std::endl;
99  return 1;
100  }
101  if (!ShowerEleHolder.CheckElement(fInitialTrackSpacePointsInputLabel)) {
102  if (fVerbose)
103  mf::LogError("ShowerPandoraSlidingFitTrackFinder")
104  << "Initial Spacepoints not set, returning " << std::endl;
105  return 1;
106  }
107 
108  geo::Point_t ShowerStartPosition = {-999, -999, -999};
109  ShowerEleHolder.GetElement(fShowerStartPositionInputLabel, ShowerStartPosition);
110 
111  geo::Vector_t ShowerDirection = {-999, -999, -999};
112  ShowerEleHolder.GetElement(fShowerDirectionInputLabel, ShowerDirection);
113 
114  std::vector<art::Ptr<recob::SpacePoint>> spacepoints;
115  ShowerEleHolder.GetElement(fInitialTrackSpacePointsInputLabel, spacepoints);
116 
117  // The track fitter tries to create a traj point from each spacepoint so if we don't have enough
118  // spacepoints we will not get enough traj points, so let's not even try
119  if (spacepoints.size() < fMinTrajectoryPoints) {
120  if (fVerbose)
121  mf::LogWarning("ShowerPandoraSlidingFitTrackFinder")
122  << "Insufficient space points points to build track: " << spacepoints.size();
123  return 1;
124  }
127  // 'wirePitchW` is here used only to provide length scale for binning hits and performing sliding/local linear fits.
128  const float wirePitchW(detType->WirePitchW());
129 
130  const pandora::CartesianVector vertexPosition(
131  ShowerStartPosition.X(), ShowerStartPosition.Y(), ShowerStartPosition.Z());
132 
133  pandora::CartesianPointVector cartesianPointVector;
134  for (const art::Ptr<recob::SpacePoint> spacePoint : spacepoints)
135  cartesianPointVector.emplace_back(
136  pandora::CartesianVector(spacePoint->XYZ()[0], spacePoint->XYZ()[1], spacePoint->XYZ()[2]));
137 
138  lar_content::LArTrackStateVector trackStateVector;
139  pandora::IntVector indexVector;
140  try {
142  vertexPosition,
144  wirePitchW,
145  trackStateVector,
146  &indexVector);
147  }
148  catch (const pandora::StatusCodeException&) {
149  if (fVerbose)
150  mf::LogWarning("ShowerPandoraSlidingFitTrackFinder")
151  << "Unable to extract sliding fit trajectory" << std::endl;
152  return 1;
153  }
154  if (trackStateVector.size() < fMinTrajectoryPoints) {
155  if (fVerbose)
156  mf::LogWarning("ShowerPandoraSlidingFitTrackFinder")
157  << "Insufficient input trajectory points to build track: " << trackStateVector.size();
158  return 1;
159  }
160 
161  if (trackStateVector.empty())
162  throw cet::exception("ShowerPandoraSlidingFitTrackFinder")
163  << "BuildTrack - No input trajectory points provided " << std::endl;
164 
168 
169  for (const lar_content::LArTrackState& trackState : trackStateVector) {
170  xyz.emplace_back(recob::tracking::Point_t(trackState.GetPosition().GetX(),
171  trackState.GetPosition().GetY(),
172  trackState.GetPosition().GetZ()));
173  pxpypz.emplace_back(recob::tracking::Vector_t(trackState.GetDirection().GetX(),
174  trackState.GetDirection().GetY(),
175  trackState.GetDirection().GetZ()));
176 
177  // Set flag NoPoint if point has bogus coordinates, otherwise use clean flag set
178  if (std::fabs(trackState.GetPosition().GetX() - util::kBogusF) <
179  std::numeric_limits<float>::epsilon() &&
180  std::fabs(trackState.GetPosition().GetY() - util::kBogusF) <
181  std::numeric_limits<float>::epsilon() &&
182  std::fabs(trackState.GetPosition().GetZ() - util::kBogusF) <
183  std::numeric_limits<float>::epsilon()) {
186  }
187  else {
188  flags.emplace_back(recob::TrajectoryPointFlags());
189  }
190  }
191 
192  // note from gc: eventually we should produce a TrackTrajectory, not a Track with empty covariance matrix and bogus chi2, etc.
193  recob::Track InitialTrack = recob::Track(
194  recob::TrackTrajectory(std::move(xyz), std::move(pxpypz), std::move(flags), false),
200  pfparticle.key());
201 
202  ShowerEleHolder.SetElement(InitialTrack, fInitialTrackOutputLabel);
203 
204  float tracklength = (InitialTrack.Start() - InitialTrack.End()).R();
205 
206  ShowerEleHolder.SetElement(tracklength, fInitialTrackLengthOutputLabel);
207 
208  return 0;
209  }
210 
212  const art::Ptr<recob::PFParticle>& pfpPtr,
213  art::Event& Event,
214  reco::shower::ShowerElementHolder& ShowerEleHolder)
215  {
216 
217  //Check the track has been set
218  if (!ShowerEleHolder.CheckElement(fInitialTrackOutputLabel)) {
219  if (fVerbose)
220  mf::LogError("ShowerPandoraSlidingFitTrackFinderAddAssn")
221  << "Track not set so the assocation can not be made " << std::endl;
222  return 1;
223  }
224 
225  //Get the size of the ptr as it is.
226  int trackptrsize = GetVectorPtrSize(fInitialTrackOutputLabel);
227 
228  const art::Ptr<recob::Track> trackptr = GetProducedElementPtr<recob::Track>(
229  fInitialTrackOutputLabel, ShowerEleHolder, trackptrsize - 1);
230  const art::Ptr<recob::Shower> showerptr =
231  GetProducedElementPtr<recob::Shower>("shower", ShowerEleHolder);
232 
233  AddSingle<art::Assns<recob::Shower, recob::Track>>(showerptr, trackptr, "ShowerTrackAssn");
234 
235  std::vector<art::Ptr<recob::Hit>> TrackHits;
236  ShowerEleHolder.GetElement(fInitialTrackHitsInputLabel, TrackHits);
237 
238  for (auto const& TrackHit : TrackHits) {
239  AddSingle<art::Assns<recob::Track, recob::Hit>>(trackptr, TrackHit, "ShowerTrackHitAssn");
240  }
241 
242  return 0;
243  }
244 
245 }
246 
Header file for the pfo helper class.
#define DEFINE_ART_CLASS_TOOL(tool)
Definition: ToolMacros.h:42
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Vector_t
Type for representation of momenta in 3D space.
Definition: geo_vectors.h:160
static constexpr Flag_t NoPoint
The trajectory point is not defined.
Declaration of signal hit object.
int GetVectorPtrSize(std::string Name)
Definition: IShowerTool.h:156
LArTrackState class.
Definition: LArPfoObjects.h:29
Empty interface to map pandora to specifics in the LArSoft geometry.
void SetElement(T &dataproduct, const std::string &Name, bool checktag=false)
static void GetSlidingFitTrajectory(const pandora::CartesianPointVector &pointVector, const pandora::CartesianVector &vertexPosition, const unsigned int layerWindow, const float layerPitch, LArTrackStateVector &trackStateVector, pandora::IntVector *const pIndexVector=nullptr)
Apply 3D sliding fit to a set of 3D points and return track trajectory.
STL namespace.
constexpr int kBogusI
obviously bogus integer value
ROOT::Math::SMatrix< Double32_t, 5, 5, ROOT::Math::MatRepSym< Double32_t, 5 >> SMatrixSym55
std::vector< int > IntVector
MaybeLogger_< ELseverityLevel::ELsev_error, false > LogError
int CalculateElement(const art::Ptr< recob::PFParticle > &pfparticle, art::Event &Event, reco::shower::ShowerElementHolder &ShowerEleHolder) override
Point_t const & Start() const
Access to track position at different points.
Definition: Track.h:157
A trajectory in space reconstructed from hits.
parameter set interface
key_type key() const noexcept
Definition: Ptr.h:166
ROOT::Math::DisplacementVector3D< ROOT::Math::Cartesian3D< Coord_t >, ROOT::Math::GlobalCoordinateSystemTag > Vector_t
Type for representation of momenta in 3D space. See recob::tracking::Coord_t for more details on the ...
Definition: TrackingTypes.h:31
bool CheckElement(const std::string &Name) const
std::vector< Vector_t > Momenta_t
Type of momentum list.
Definition: TrackingTypes.h:37
std::vector< PointFlags_t > Flags_t
Type of point flag list.
int GetElement(const std::string &Name, T &Element) const
static constexpr HitIndex_t InvalidHitIndex
Value marking an invalid hit index.
virtual float WirePitchW() const =0
The wire pitch of the mapped W view.
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< double >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space.
Definition: geo_vectors.h:180
decltype(auto) get(T &&obj)
ADL-aware version of std::to_string.
Definition: StdUtils.h:120
std::vector< Point_t > Positions_t
Type of trajectory point list.
Definition: TrackingTypes.h:34
LArPandoraDetectorType * GetDetectorType()
Factory class that returns the correct detector type interface.
constexpr float kBogusF
obviously bogus float value
Provides recob::Track data product.
int AddAssociations(const art::Ptr< recob::PFParticle > &pfpPtr, art::Event &Event, reco::shower::ShowerElementHolder &ShowerEleHolder) override
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
Point_t const & End() const
Access to track position at different points.
Definition: Track.h:159
TrackCollectionProxyElement< TrackCollProxy > Track
Proxy to an element of a proxy collection of recob::Track objects.
Definition: Track.h:992
std::vector< LArTrackState > LArTrackStateVector
Definition: LArPfoObjects.h:67
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< Coord_t >, ROOT::Math::GlobalCoordinateSystemTag > Point_t
Type for representation of position in physical 3D space. See recob::tracking::Coord_t for more detai...
Definition: TrackingTypes.h:27
Helper functions for extracting detector geometry for use in reconsruction.
Set of flags pertaining a point of the track.
art framework interface to geometry description
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
cet::coded_exception< error, detail::translate > exception
Definition: exception.h:33