LArSoft  v10_04_05
Liquid Argon Software toolkit - https://larsoft.org/
pma::PMAlgFitter Class Reference

#include "PMAlgTracking.h"

Inheritance diagram for pma::PMAlgFitter:
pma::PMAlgTrackingBase

Classes

struct  Config
 

Public Member Functions

 PMAlgFitter (const std::vector< art::Ptr< recob::Hit >> &allhitlist, const std::vector< recob::Cluster > &clusters, const std::vector< recob::PFParticle > &pfparticles, const art::FindManyP< recob::Hit > &hitsFromClusters, const art::FindManyP< recob::Cluster > &clusFromPfps, const art::FindManyP< recob::Vertex > &vtxFromPfps, const pma::ProjectionMatchingAlg::Config &pmalgConfig, const pma::PMAlgFitter::Config &pmalgFitterConfig, const pma::PMAlgVertexing::Config &pmvtxConfig)
 
int build (detinfo::DetectorPropertiesData const &detProp)
 
const pma::TrkCandidateCollresult ()
 
std::vector< std::pair< TVector3, std::vector< std::pair< size_t, bool > > > > getVertices (bool onlyBranching=false) const
 
std::vector< std::pair< TVector3, size_t > > getKinks () const
 

Protected Member Functions

void guideEndpoints (detinfo::DetectorPropertiesData const &detProp, pma::TrkCandidateColl &tracks)
 

Protected Attributes

pma::cryo_tpc_view_hitmap fHitMap
 
pma::ProjectionMatchingAlg fProjectionMatchingAlg
 
pma::PMAlgVertexing fPMAlgVertexing
 
pma::TrkCandidateColl fResult
 

Private Member Functions

void buildTracks (detinfo::DetectorPropertiesData const &detProp)
 
void buildShowers (detinfo::DetectorPropertiesData const &detProp)
 
bool has (const std::vector< int > &v, int i) const
 

Private Attributes

std::vector< std::vector< art::Ptr< recob::Hit > > > fCluHits
 
std::map< int, std::vector< art::Ptr< recob::Cluster > > > fPfpClusters
 
std::map< int, pma::Vector3DfPfpVtx
 
std::map< int, int > fPfpPdgCodes
 
std::vector< int > fTrackingOnlyPdg
 
std::vector< int > fTrackingSkipPdg
 
bool fRunVertexing
 

Detailed Description

Definition at line 94 of file PMAlgTracking.h.

Constructor & Destructor Documentation

pma::PMAlgFitter::PMAlgFitter ( const std::vector< art::Ptr< recob::Hit >> &  allhitlist,
const std::vector< recob::Cluster > &  clusters,
const std::vector< recob::PFParticle > &  pfparticles,
const art::FindManyP< recob::Hit > &  hitsFromClusters,
const art::FindManyP< recob::Cluster > &  clusFromPfps,
const art::FindManyP< recob::Vertex > &  vtxFromPfps,
const pma::ProjectionMatchingAlg::Config pmalgConfig,
const pma::PMAlgFitter::Config pmalgFitterConfig,
const pma::PMAlgVertexing::Config pmvtxConfig 
)

Definition at line 100 of file PMAlgTracking.cxx.

References fCluHits, fPfpClusters, fPfpPdgCodes, and fPfpVtx.

109  : PMAlgTrackingBase(allhitlist, pmalgConfig, pmvtxConfig)
110  , fTrackingOnlyPdg(pmalgFitterConfig.TrackingOnlyPdg())
111  , fTrackingSkipPdg(pmalgFitterConfig.TrackingSkipPdg())
112  , fRunVertexing(pmalgFitterConfig.RunVertexing())
113 {
114  mf::LogVerbatim("PMAlgFitter") << "Found " << allhitlist.size() << "hits in the event.";
115  mf::LogVerbatim("PMAlgFitter") << "Sort hits by clusters assigned to PFParticles...";
116 
117  fCluHits.resize(clusters.size());
118  for (size_t i = 0; i < pfparticles.size(); ++i) {
119  fPfpPdgCodes[i] = pfparticles[i].PdgCode();
120 
121  auto cv = clusFromPfps.at(i);
122  for (const auto& c : cv) {
123  fPfpClusters[i].push_back(c);
124  if (fCluHits[c.key()].empty()) {
125  auto hv = hitsFromClusters.at(c.key());
126  fCluHits[c.key()].reserve(hv.size());
127  for (auto const& h : hv)
128  fCluHits[c.key()].push_back(h);
129  }
130  }
131 
132  if (vtxFromPfps.isValid() && vtxFromPfps.at(i).size()) {
133  double xyz[3];
134  vtxFromPfps.at(i).front()->XYZ(xyz);
135  fPfpVtx[i] = pma::Vector3D(xyz[0], xyz[1], xyz[2]);
136  }
137  }
138 
139  mf::LogVerbatim("PMAlgFitter") << "...done, " << fCluHits.size() << " clusters from "
140  << fPfpClusters.size() << " pfparticles for 3D tracking.";
141 }
MaybeLogger_< ELseverityLevel::ELsev_info, true > LogVerbatim
std::map< int, pma::Vector3D > fPfpVtx
std::map< int, std::vector< art::Ptr< recob::Cluster > > > fPfpClusters
fhicl::Sequence< int > TrackingSkipPdg
fhicl::Sequence< int > TrackingOnlyPdg
recob::tracking::Vector_t Vector3D
Definition: Utilities.h:34
std::vector< int > fTrackingOnlyPdg
std::map< int, int > fPfpPdgCodes
fhicl::Atom< bool > RunVertexing
std::vector< int > fTrackingSkipPdg
PMAlgTrackingBase(const std::vector< art::Ptr< recob::Hit >> &allhitlist, const pma::ProjectionMatchingAlg::Config &pmalgConfig, const pma::PMAlgVertexing::Config &pmvtxConfig)
std::vector< std::vector< art::Ptr< recob::Hit > > > fCluHits

Member Function Documentation

int pma::PMAlgFitter::build ( detinfo::DetectorPropertiesData const &  detProp)

Definition at line 144 of file PMAlgTracking.cxx.

References buildShowers(), buildTracks(), fCluHits, fPfpClusters, pma::PMAlgTrackingBase::fPMAlgVertexing, pma::PMAlgTrackingBase::fResult, fRunVertexing, pma::PMAlgTrackingBase::guideEndpoints(), pma::PMAlgVertexing::run(), and pma::TrkCandidateColl::size().

145 {
146  if (!fPfpClusters.empty() && !fCluHits.empty()) {
147  // build pm tracks
148  buildTracks(detProp);
149 
150  // add 3D ref.points for clean endpoints of wire-plae parallel tracks
151  guideEndpoints(detProp, fResult);
152 
153  if (fRunVertexing) fPMAlgVertexing.run(detProp, fResult);
154 
155  // build segment of shower
156  buildShowers(detProp);
157  }
158  else {
159  mf::LogWarning("PMAlgFitter") << "no clusters, no pfparticles";
160  return -1;
161  }
162 
163  return fResult.size();
164 }
void guideEndpoints(detinfo::DetectorPropertiesData const &detProp, pma::TrkCandidateColl &tracks)
size_t size() const
size_t run(const detinfo::DetectorPropertiesData &detProp, pma::TrkCandidateColl &trk_input)
void buildTracks(detinfo::DetectorPropertiesData const &detProp)
std::map< int, std::vector< art::Ptr< recob::Cluster > > > fPfpClusters
std::vector< std::vector< art::Ptr< recob::Hit > > > fCluHits
MaybeLogger_< ELseverityLevel::ELsev_warning, false > LogWarning
pma::TrkCandidateColl fResult
Definition: PMAlgTracking.h:91
pma::PMAlgVertexing fPMAlgVertexing
Definition: PMAlgTracking.h:89
void buildShowers(detinfo::DetectorPropertiesData const &detProp)
void pma::PMAlgFitter::buildShowers ( detinfo::DetectorPropertiesData const &  detProp)
private

Definition at line 222 of file PMAlgTracking.cxx.

References pma::ProjectionMatchingAlg::buildShowerSeg(), pma::TrkCandidate::Clusters(), pma::TrkCandidate::DeleteTrack(), fCluHits, fPfpClusters, fPfpPdgCodes, fPfpVtx, pma::PMAlgTrackingBase::fProjectionMatchingAlg, pma::PMAlgTrackingBase::fResult, fTrackingOnlyPdg, fTrackingSkipPdg, has(), pma::Track3D::HasTwoViews(), pma::TrkCandidate::IsValid(), pma::Track3D::Length(), pma::Track3D::Nodes(), pma::TrkCandidateColl::push_back(), pma::TrkCandidate::SetKey(), pma::TrkCandidate::SetTrack(), util::size(), and pma::TrkCandidate::Track().

Referenced by build().

223 {
224  bool skipPdg = true;
225  if (!fTrackingSkipPdg.empty() && (fTrackingSkipPdg.front() == 0)) skipPdg = false;
226 
227  bool selectPdg = true;
228  if (!fTrackingOnlyPdg.empty() && (fTrackingOnlyPdg.front() == 0)) selectPdg = false;
229 
230  for (const auto& pfpCluEntry : fPfpClusters) {
231  int pfPartIdx = pfpCluEntry.first;
232  int pdg = fPfpPdgCodes[pfPartIdx];
233 
234  if (pdg != 11) continue;
235  if (skipPdg && has(fTrackingSkipPdg, pdg)) continue;
236  if (selectPdg && !has(fTrackingOnlyPdg, pdg)) continue;
237 
238  mf::LogVerbatim("PMAlgFitter") << "Process clusters from PFP:" << pfPartIdx << ", pdg:" << pdg;
239 
240  std::vector<art::Ptr<recob::Hit>> allHits;
241 
242  pma::TrkCandidate candidate;
243  std::unordered_map<geo::View_t, size_t> clu_count;
244  for (const auto& c : pfpCluEntry.second) {
245  if (c->NHits() == 0) { continue; }
246 
247  candidate.Clusters().push_back(c.key());
248  clu_count[c->View()]++;
249 
250  allHits.reserve(allHits.size() + fCluHits.at(c.key()).size());
251  for (const auto& h : fCluHits.at(c.key()))
252  allHits.push_back(h);
253  }
254  if (clu_count.size() > 1) // try building only if there are clusters from multiple views
255  {
256  candidate.SetKey(pfpCluEntry.first);
257 
258  mf::LogVerbatim("PMAlgFitter") << "building..."
259  << ", pdg:" << pdg;
260 
261  auto search = fPfpVtx.find(pfPartIdx);
262  if (search != fPfpVtx.end()) {
263  candidate.SetTrack(fProjectionMatchingAlg.buildShowerSeg(detProp, allHits, search->second));
264 
265  if (candidate.IsValid() && candidate.Track()->HasTwoViews() &&
266  (candidate.Track()->Nodes().size() > 1) && !std::isnan(candidate.Track()->Length())) {
267  fResult.push_back(candidate);
268  }
269  else {
270  candidate.DeleteTrack();
271  }
272  }
273  }
274  }
275 }
MaybeLogger_< ELseverityLevel::ELsev_info, true > LogVerbatim
std::map< int, pma::Vector3D > fPfpVtx
bool IsValid() const
void SetKey(int key)
Set key of an external object associated to this track candidate.
void SetTrack(pma::Track3D *trk)
std::map< int, std::vector< art::Ptr< recob::Cluster > > > fPfpClusters
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
Definition: StdUtils.h:101
std::vector< int > fTrackingOnlyPdg
std::map< int, int > fPfpPdgCodes
std::vector< int > fTrackingSkipPdg
pma::ProjectionMatchingAlg fProjectionMatchingAlg
Definition: PMAlgTracking.h:88
bool has(const std::vector< int > &v, int i) const
std::vector< std::vector< art::Ptr< recob::Hit > > > fCluHits
bool HasTwoViews(size_t nmin=1) const
Definition: PmaTrack3D.cxx:439
double Length(size_t step=1) const
Definition: PmaTrack3D.h:94
pma::Track3D * buildShowerSeg(const detinfo::DetectorPropertiesData &detProp, const std::vector< art::Ptr< recob::Hit >> &hits, const pma::Vector3D &vtx) const
const std::vector< size_t > & Clusters() const
std::vector< pma::Node3D * > const & Nodes() const noexcept
Definition: PmaTrack3D.h:274
pma::TrkCandidateColl fResult
Definition: PMAlgTracking.h:91
pma::Track3D * Track() const
void push_back(const TrkCandidate &trk)
void pma::PMAlgFitter::buildTracks ( detinfo::DetectorPropertiesData const &  detProp)
private

Definition at line 167 of file PMAlgTracking.cxx.

References pma::ProjectionMatchingAlg::buildMultiTPCTrack(), pma::TrkCandidate::Clusters(), pma::TrkCandidate::DeleteTrack(), fCluHits, fPfpClusters, fPfpPdgCodes, pma::PMAlgTrackingBase::fProjectionMatchingAlg, pma::PMAlgTrackingBase::fResult, fTrackingOnlyPdg, fTrackingSkipPdg, has(), pma::Track3D::HasTwoViews(), pma::TrkCandidate::IsValid(), pma::Track3D::Length(), pma::Track3D::Nodes(), pma::TrkCandidateColl::push_back(), pma::TrkCandidate::SetKey(), pma::TrkCandidate::SetTrack(), util::size(), and pma::TrkCandidate::Track().

Referenced by build().

168 {
169  bool skipPdg = true;
170  if (!fTrackingSkipPdg.empty() && (fTrackingSkipPdg.front() == 0)) skipPdg = false;
171 
172  bool selectPdg = true;
173  if (!fTrackingOnlyPdg.empty() && (fTrackingOnlyPdg.front() == 0)) selectPdg = false;
174 
175  for (const auto& pfpCluEntry : fPfpClusters) {
176  int pfPartIdx = pfpCluEntry.first;
177  int pdg = fPfpPdgCodes[pfPartIdx];
178 
179  //if (pdg == 11) continue;
180  if (skipPdg && has(fTrackingSkipPdg, pdg)) continue;
181  if (selectPdg && !has(fTrackingOnlyPdg, pdg)) continue;
182 
183  mf::LogVerbatim("PMAlgFitter") << "Process clusters from PFP:" << pfPartIdx << ", pdg:" << pdg;
184 
185  std::vector<art::Ptr<recob::Hit>> allHits;
186 
187  pma::TrkCandidate candidate;
188  std::unordered_map<geo::View_t, size_t> clu_count;
189  for (const auto& c : pfpCluEntry.second) {
190  if (c->NHits() == 0) { continue; }
191 
192  candidate.Clusters().push_back(c.key());
193  clu_count[c->View()]++;
194 
195  allHits.reserve(allHits.size() + fCluHits.at(c.key()).size());
196  for (const auto& h : fCluHits.at(c.key())) {
197  allHits.push_back(h);
198  }
199  }
200  if (clu_count.size() > 1) // try building only if there are clusters from multiple views
201  {
202  candidate.SetKey(pfpCluEntry.first);
203 
204  candidate.SetTrack(fProjectionMatchingAlg.buildMultiTPCTrack(detProp, allHits));
205 
206  if (candidate.IsValid() && candidate.Track()->HasTwoViews() &&
207  (candidate.Track()->Nodes().size() > 1)) {
208  if (!std::isnan(candidate.Track()->Length())) { fResult.push_back(candidate); }
209  else {
210  mf::LogError("PMAlgFitter") << "Trajectory fit lenght is nan.";
211  candidate.DeleteTrack();
212  }
213  }
214  else {
215  candidate.DeleteTrack();
216  }
217  }
218  }
219 }
MaybeLogger_< ELseverityLevel::ELsev_info, true > LogVerbatim
bool IsValid() const
void SetKey(int key)
Set key of an external object associated to this track candidate.
void SetTrack(pma::Track3D *trk)
std::map< int, std::vector< art::Ptr< recob::Cluster > > > fPfpClusters
MaybeLogger_< ELseverityLevel::ELsev_error, false > LogError
decltype(auto) constexpr size(T &&obj)
ADL-aware version of std::size.
Definition: StdUtils.h:101
std::vector< int > fTrackingOnlyPdg
std::map< int, int > fPfpPdgCodes
std::vector< int > fTrackingSkipPdg
pma::ProjectionMatchingAlg fProjectionMatchingAlg
Definition: PMAlgTracking.h:88
bool has(const std::vector< int > &v, int i) const
std::vector< std::vector< art::Ptr< recob::Hit > > > fCluHits
bool HasTwoViews(size_t nmin=1) const
Definition: PmaTrack3D.cxx:439
double Length(size_t step=1) const
Definition: PmaTrack3D.h:94
const std::vector< size_t > & Clusters() const
std::vector< pma::Node3D * > const & Nodes() const noexcept
Definition: PmaTrack3D.h:274
pma::TrkCandidateColl fResult
Definition: PMAlgTracking.h:91
pma::Track3D * Track() const
void push_back(const TrkCandidate &trk)
pma::Track3D * buildMultiTPCTrack(const detinfo::DetectorPropertiesData &clockData, const std::vector< art::Ptr< recob::Hit >> &hits) const
std::vector<std::pair<TVector3, size_t> > pma::PMAlgTrackingBase::getKinks ( ) const
inlineinherited

Definition at line 72 of file PMAlgTracking.h.

References lar::dump::vector().

73  {
75  }
std::vector< std::pair< TVector3, size_t > > getKinks(const pma::TrkCandidateColl &tracks) const
pma::TrkCandidateColl fResult
Definition: PMAlgTracking.h:91
pma::PMAlgVertexing fPMAlgVertexing
Definition: PMAlgTracking.h:89
std::vector<std::pair<TVector3, std::vector<std::pair<size_t, bool> > > > pma::PMAlgTrackingBase::getVertices ( bool  onlyBranching = false) const
inlineinherited

Definition at line 66 of file PMAlgTracking.h.

68  {
69  return fPMAlgVertexing.getVertices(fResult, onlyBranching);
70  }
std::vector< std::pair< TVector3, std::vector< std::pair< size_t, bool > > > > getVertices(const pma::TrkCandidateColl &tracks, bool onlyBranching=false) const
pma::TrkCandidateColl fResult
Definition: PMAlgTracking.h:91
pma::PMAlgVertexing fPMAlgVertexing
Definition: PMAlgTracking.h:89
void pma::PMAlgTrackingBase::guideEndpoints ( detinfo::DetectorPropertiesData const &  detProp,
pma::TrkCandidateColl tracks 
)
protectedinherited

Definition at line 80 of file PMAlgTracking.cxx.

References pma::PMAlgTrackingBase::fHitMap, pma::PMAlgTrackingBase::fProjectionMatchingAlg, pma::ProjectionMatchingAlg::guideEndpoints(), pma::Track3D::kBegin, pma::Track3D::kEnd, and pma::TrkCandidateColl::tracks().

Referenced by build(), and pma::PMAlgTracker::build().

82 {
83  for (auto const& t : tracks.tracks()) {
84  auto& trk = *(t.Track());
85 
86  unsigned int tpc = trk.FrontTPC(), cryo = trk.FrontCryo();
87  if ((tpc == trk.BackTPC()) && (cryo == trk.BackCryo())) {
88  fProjectionMatchingAlg.guideEndpoints(detProp, trk, fHitMap[cryo][tpc]);
89  }
90  else {
92  detProp, trk, pma::Track3D::kBegin, fHitMap[trk.FrontCryo()][trk.FrontTPC()]);
94  detProp, trk, pma::Track3D::kEnd, fHitMap[trk.BackCryo()][trk.BackTPC()]);
95  }
96  }
97 }
pma::ProjectionMatchingAlg fProjectionMatchingAlg
Definition: PMAlgTracking.h:88
void guideEndpoints(const detinfo::DetectorPropertiesData &clockData, pma::Track3D &trk, const std::map< unsigned int, std::vector< art::Ptr< recob::Hit >>> &hits) const
std::vector< TrkCandidate > const & tracks() const
pma::cryo_tpc_view_hitmap fHitMap
Definition: PMAlgTracking.h:86
bool pma::PMAlgFitter::has ( const std::vector< int > &  v,
int  i 
) const
inlineprivate

Definition at line 132 of file PMAlgTracking.h.

Referenced by buildShowers(), and buildTracks().

133  {
134  for (auto c : v) {
135  if (c == i) return true;
136  }
137  return false;
138  }
const pma::TrkCandidateColl& pma::PMAlgTrackingBase::result ( )
inlineinherited

Member Data Documentation

std::vector<std::vector<art::Ptr<recob::Hit> > > pma::PMAlgFitter::fCluHits
private

Definition at line 140 of file PMAlgTracking.h.

Referenced by build(), buildShowers(), buildTracks(), and PMAlgFitter().

pma::cryo_tpc_view_hitmap pma::PMAlgTrackingBase::fHitMap
protectedinherited
std::map<int, std::vector<art::Ptr<recob::Cluster> > > pma::PMAlgFitter::fPfpClusters
private

Definition at line 141 of file PMAlgTracking.h.

Referenced by build(), buildShowers(), buildTracks(), and PMAlgFitter().

std::map<int, int> pma::PMAlgFitter::fPfpPdgCodes
private

Definition at line 143 of file PMAlgTracking.h.

Referenced by buildShowers(), buildTracks(), and PMAlgFitter().

std::map<int, pma::Vector3D> pma::PMAlgFitter::fPfpVtx
private

Definition at line 142 of file PMAlgTracking.h.

Referenced by buildShowers(), and PMAlgFitter().

pma::PMAlgVertexing pma::PMAlgTrackingBase::fPMAlgVertexing
protectedinherited

Definition at line 89 of file PMAlgTracking.h.

Referenced by build(), and pma::PMAlgTracker::build().

bool pma::PMAlgFitter::fRunVertexing
private

Definition at line 150 of file PMAlgTracking.h.

Referenced by build().

std::vector<int> pma::PMAlgFitter::fTrackingOnlyPdg
private

Definition at line 146 of file PMAlgTracking.h.

Referenced by buildShowers(), and buildTracks().

std::vector<int> pma::PMAlgFitter::fTrackingSkipPdg
private

Definition at line 148 of file PMAlgTracking.h.

Referenced by buildShowers(), and buildTracks().


The documentation for this class was generated from the following files: