8 #include "art/Framework/Core/EDProducer.h"
9 #include "art/Framework/Core/ModuleMacros.h"
10 #include "art/Framework/Principal/Event.h"
11 #include "art/Framework/Principal/Handle.h"
13 #include "canvas/Persistency/Common/FindManyP.h"
14 #include "canvas/Utilities/InputTag.h"
15 #include "fhiclcpp/types/Atom.h"
16 #include "fhiclcpp/types/Sequence.h"
17 #include "fhiclcpp/types/Table.h"
47 Name(
"inputPFParticleLabel"),
48 Comment(
"Label of recob::PFParticle Collection to be fit")};
50 Name(
"inputTracksLabel"),
51 Comment(
"Label of recob::Track Collection to be fit")};
53 Name(
"inputShowersLabel"),
54 Comment(
"Label of recob::Shower Collection (associated to PFParticles) to be fit")};
56 Name(
"inputCaloLabel"),
57 Comment(
"Label of anab::Calorimetry Collection, matching inputTracksLabel, to be used for "
58 "initial momentum estimate. Used only if momFromCalo is set to true.")};
61 Comment(
"Label of sim::MCTrack Collection to be used for initial momentum estimate. Used "
62 "only if momFromMC is set to true.")};
64 Name(
"inputPidLabel"),
65 Comment(
"Label of anab::ParticleID Collection, matching inputTracksLabel, to be used for "
73 Comment(
"If true extract tracks from inputPFParticleLabel "
74 "collection, if false from inputTracksLabel.")};
77 Comment(
"If true extract showers from inputPFParticleLabel collection.")};
79 Name(
"momFromMSChi2"),
80 Comment(
"Flag used to get initial momentum estimate from "
81 "trkf::TrackMomentumCalculator::GetMomentumMultiScatterChi2().")};
83 Comment(
"Flag used to get initial momentum estimate from "
84 "trkf::TrackMomentumCalculator::GetTrackMomentum().")};
87 Comment(
"Flag used to get initial momentum estimate from inputCaloLabel collection.")};
90 Comment(
"Flag used to get initial momentum estimate from inputMCLabel collection.")};
92 Name(
"momentumInGeV"),
93 Comment(
"Fixed momentum estimate value, to be used when momFromCalo, momFromMSChi2, "
94 "momFromLength and momFromMC are all false, or if the estimate is not available.")};
96 Comment(
"Flag used to get particle ID estimate from corresponding "
97 "PFParticle. Needs trackFromPF=true.")};
99 Name(
"idFromCollection"),
100 Comment(
"Flag used to get particle ID estimate from inputPidLabel collection.")};
103 Comment(
"Default particle id hypothesis in case no valid id is provided either via "
104 "PFParticle or in the ParticleId collection.")};
106 Name(
"dirFromVtxPF"),
107 Comment(
"Assume track direction from Vertex in PFParticle. Needs trackFromPF=true.")};
110 Comment(
"Assume track direction from as the one giving positive "
111 "dot product with vector specified by dirVec.")};
113 Comment(
"Fhicl sequence defining the vector used when "
114 "dirFromVec=true. It must have 3 elements.")};
116 Name(
"alwaysInvertDir"),
117 Comment(
"If true, fit all tracks from end to vertex assuming inverted direction.")};
119 Name(
"produceTrackFitHitInfo"),
120 Comment(
"Option to produce (or not) the detailed TrackFitHitInfo.")};
122 Name(
"produceSpacePoints"),
123 Comment(
"Option to produce (or not) the associated SpacePoints.")};
125 Name(
"keepInputTrajectoryPoints"),
126 Comment(
"Option to keep positions and directions from input trajectory/track. The fit will "
127 "provide only covariance matrices, chi2, ndof, particle Id and absolute momentum. "
128 "It may also modify the trajectory point flags. In order to avoid inconsistencies, "
129 "it has to be used with the following fitter options all set to false: "
130 "sortHitsByPlane, sortOutputHitsMinLength, skipNegProp.")};
135 fhicl::Table<KalmanFilterFinalTrackFitter::Inputs>
inputs{
138 fhicl::Table<KalmanFilterFinalTrackFitter::Options>
options{
Name(
"options")};
140 fhicl::Table<TrackKalmanFitter::Config>
fitter{
Name(
"fitter")};
153 void produce(art::Event&
e)
override;
168 std::unique_ptr<art::FindManyP<anab::Calorimetry>>
trackCalo;
169 std::unique_ptr<art::FindManyP<anab::ParticleID>>
trackId;
175 const std::unique_ptr<art::FindManyP<anab::Calorimetry>>&
trackCalo,
177 const int pId)
const;
178 int setPId(
const unsigned int iTrack,
179 const std::unique_ptr<art::FindManyP<anab::ParticleID>>&
trackId,
180 const int pfPid = 0)
const;
183 const std::vector<art::Ptr<recob::Vertex>>* vertices = 0)
const;
196 , prop{p_().propagator}
197 , kalmanFitter{&prop, p_().fitter}
198 , inputFromPF{p_().options().trackFromPF() || p_().options().showerFromPF()}
202 pfParticleInputTag = art::InputTag(p_().inputs().inputPFParticleLabel());
203 if (p_().
options().showerFromPF())
204 showerInputTag = art::InputTag(p_().inputs().inputShowersLabel());
207 trackInputTag = art::InputTag(p_().inputs().inputTracksLabel());
208 if (p_().
options().idFromCollection())
209 pidInputTag = art::InputTag(p_().inputs().inputPidLabel());
211 if (p_().
options().pFromCalo()) caloInputTag = art::InputTag(p_().inputs().inputCaloLabel());
213 simTrackInputTag = art::InputTag(p_().inputs().inputMCLabel());
215 produces<std::vector<recob::Track>>();
216 produces<art::Assns<recob::Track, recob::Hit, recob::TrackHitMeta>>();
217 produces<art::Assns<recob::Track, recob::Hit>>();
218 if (inputFromPF) { produces<art::Assns<recob::PFParticle, recob::Track>>(); }
219 if (p_().options().produceTrackFitHitInfo()) {
220 produces<std::vector<std::vector<recob::TrackFitHitInfo>>>();
222 if (p_().options().produceSpacePoints()) {
223 produces<std::vector<recob::SpacePoint>>();
224 produces<art::Assns<recob::Hit, recob::SpacePoint>>();
228 if (p_().options().trackFromPF() == 0 && p_().options().idFromPF())
229 throw cet::exception(
"KalmanFilterFinalTrackFitter")
230 <<
"Incompatible configuration parameters: cannot use idFromPF=true with trackFromPF=false."
232 if (p_().options().trackFromPF() == 0 && p_().options().dirFromVtxPF())
233 throw cet::exception(
"KalmanFilterFinalTrackFitter")
234 <<
"Incompatible configuration parameters: cannot use dirFromVtxPF=true with "
238 unsigned int nIds = 0;
239 if (p_().options().idFromPF()) nIds++;
240 if (p_().options().idFromCollection()) nIds++;
242 throw cet::exception(
"KalmanFilterFinalTrackFitter")
243 <<
"Incompatible configuration parameters: only at most one can be set to true among "
244 "idFromPF and idFromCollection."
248 unsigned int nDirs = 0;
249 if (p_().
options().dirFromVtxPF()) nDirs++;
250 if (p_().
options().dirFromMC()) nDirs++;
251 if (p_().
options().dirFromVec()) nDirs++;
252 if (p_().
options().alwaysInvertDir()) nDirs++;
254 throw cet::exception(
"KalmanFilterFinalTrackFitter")
255 <<
"Incompatible configuration parameters: only at most one can be set to true among "
256 "dirFromVtxPF, dirFromMC, dirFromVec, and alwaysInvertDir."
260 unsigned int nPFroms = 0;
261 if (p_().
options().pFromCalo()) nPFroms++;
262 if (p_().
options().pFromMSChi2()) nPFroms++;
263 if (p_().
options().pFromLength()) nPFroms++;
264 if (p_().
options().pFromMC()) nPFroms++;
266 throw cet::exception(
"KalmanFilterFinalTrackFitter")
267 <<
"Incompatible configuration parameters: only at most one can be set to true among "
268 "pFromCalo, pFromMSChi2, pFromLength, and pFromMC."
272 if (p_().
options().keepInputTrajectoryPoints()) {
273 if (p_().fitter().sortHitsByPlane() || p_().fitter().sortOutputHitsMinLength() ||
274 p_().fitter().skipNegProp()) {
275 throw cet::exception(
"KalmanFilterTrajectoryFitter")
276 <<
"Incompatible configuration parameters: keepInputTrajectoryPoints needs the following "
277 "fitter options all set to false: sortHitsByPlane, sortOutputHitsMinLength, skipNegProp."
282 if (p_().
options().showerFromPF()) {
283 if (nPFroms > 0 || nIds > 0 || nDirs > 0) {
284 throw cet::exception(
"KalmanFilterTrajectoryFitter")
285 <<
"Incompatible configuration parameters: showerFromPF currently does not support "
286 "optional momentum values, particle hypotheses and directions."
295 auto outputTracks = std::make_unique<std::vector<recob::Track>>();
296 auto outputHitsMeta =
297 std::make_unique<art::Assns<recob::Track, recob::Hit, recob::TrackHitMeta>>();
298 auto outputHits = std::make_unique<art::Assns<recob::Track, recob::Hit>>();
299 auto outputHitInfo = std::make_unique<std::vector<std::vector<recob::TrackFitHitInfo>>>();
301 auto const tid = e.getProductID<std::vector<recob::Track>>();
302 auto const tidgetter = e.productGetter(tid);
304 auto outputSpacePoints = std::make_unique<std::vector<recob::SpacePoint>>();
305 auto outputHitSpacePointAssn = std::make_unique<art::Assns<recob::Hit, recob::SpacePoint>>();
306 auto const spid = e.getProductID<std::vector<recob::SpacePoint>>();
307 auto const spidgetter = e.productGetter(spid);
313 art::ValidHandle<std::vector<sim::MCTrack>> simTracks =
314 e.getValidHandle<std::vector<sim::MCTrack>>(simTrackInputTag);
315 for (
unsigned int iMC = 0; iMC < simTracks->size(); ++iMC) {
318 if (mctrack.
PdgCode() != 13)
continue;
319 if (mctrack.
Process() !=
"primary")
continue;
321 mcdir = TVector3(mctrack.
Start().
Momentum().X() * 0.001 / pMC,
328 auto const detProp = art::ServiceHandle<detinfo::DetectorPropertiesService const>()->DataFor(e);
332 auto outputPFAssn = std::make_unique<art::Assns<recob::PFParticle, recob::Track>>();
334 auto inputPFParticle = e.getValidHandle<std::vector<recob::PFParticle>>(pfParticleInputTag);
335 if (p_().options().trackFromPF())
337 std::make_unique<art::FindManyP<recob::Track>>(inputPFParticle, e, pfParticleInputTag);
338 if (p_().options().showerFromPF())
340 std::make_unique<art::FindManyP<recob::Shower>>(inputPFParticle, e, showerInputTag);
342 std::make_unique<art::FindManyP<recob::Vertex>>(inputPFParticle,
e, pfParticleInputTag);
344 for (
unsigned int iPF = 0; iPF < inputPFParticle->size(); ++iPF) {
346 if (p_().options().trackFromPF()) {
347 const std::vector<art::Ptr<recob::Track>>&
tracks = assocTracks->at(iPF);
348 auto const& tkHitsAssn =
349 *e.getValidHandle<art::Assns<recob::Track, recob::Hit>>(pfParticleInputTag);
350 const std::vector<art::Ptr<recob::Vertex>>& vertices = assocVertices->at(iPF);
352 if (p_().
options().pFromCalo()) {
353 trackCalo = std::make_unique<art::FindManyP<anab::Calorimetry>>(
tracks,
e, caloInputTag);
356 for (
unsigned int iTrack = 0; iTrack < tracks.size(); ++iTrack) {
359 art::Ptr<recob::Track> ptrack = tracks[iTrack];
360 const int pId = setPId(iTrack, trackId, inputPFParticle->at(iPF).PdgCode());
361 const double mom = setMomValue(ptrack, trackCalo, pMC, pId);
362 const bool flipDir = setDirFlip(track, mcdir, &vertices);
365 std::vector<art::Ptr<recob::Hit>> inHits;
366 for (
auto it = tkHitsAssn.begin(); it != tkHitsAssn.end(); ++it) {
367 if (it->first == ptrack)
368 inHits.push_back(it->second);
369 else if (inHits.size() > 0)
374 std::vector<art::Ptr<recob::Hit>> outHits;
377 bool fitok = kalmanFitter.fitTrack(
detProp,
389 if (!fitok)
continue;
391 if (p_().options().keepInputTrajectoryPoints()) {
395 outputTracks->emplace_back(std::move(outTrack));
396 art::Ptr<recob::Track> aptr(tid, outputTracks->size() - 1, tidgetter);
398 for (
auto const& trhit : outHits) {
401 outputHitsMeta->addSingle(aptr, trhit, metadata);
402 outputHits->addSingle(aptr, trhit);
405 outputPFAssn->addSingle(art::Ptr<recob::PFParticle>(inputPFParticle, iPF), aptr);
410 if (p_().options().showerFromPF()) {
411 art::Ptr<recob::PFParticle> pPF(inputPFParticle, iPF);
412 const std::vector<art::Ptr<recob::Shower>>& showers = assocShowers->at(iPF);
413 if (showers.size() == 0)
continue;
414 auto const& pfClustersAssn =
415 *e.getValidHandle<art::Assns<recob::PFParticle, recob::Cluster>>(showerInputTag);
416 auto const& clHitsAssn =
417 *e.getValidHandle<art::Assns<recob::Cluster, recob::Hit>>(showerInputTag);
418 std::vector<art::Ptr<recob::Hit>> inHits;
419 for (
auto itpf = pfClustersAssn.begin(); itpf != pfClustersAssn.end(); ++itpf) {
420 if (itpf->first == pPF) {
421 art::Ptr<recob::Cluster> clust = itpf->second;
422 for (
auto it = clHitsAssn.begin(); it != clHitsAssn.end(); ++it) {
423 if (it->first == clust) inHits.push_back(it->second);
426 else if (inHits.size() > 0)
429 for (
unsigned int iShower = 0; iShower < showers.size(); ++iShower) {
432 std::vector<art::Ptr<recob::Hit>> outHits;
438 auto pid = p_().options().pdgId();
439 auto mom = p_().options().pval();
440 bool fitok = kalmanFitter.fitTrack(
detProp,
445 std::vector<recob::TrajectoryPointFlags>(),
452 if (!fitok)
continue;
454 outputTracks->emplace_back(std::move(outTrack));
455 art::Ptr<recob::Track> aptr(tid, outputTracks->size() - 1, tidgetter);
457 for (
auto const& trhit : outHits) {
460 outputHitsMeta->addSingle(aptr, trhit, metadata);
461 outputHits->addSingle(aptr, trhit);
462 if (p_().
options().produceSpacePoints() && outputTracks->back().HasValidPoint(ip)) {
463 auto& tp = outputTracks->back().Trajectory().LocationAtPoint(ip);
464 double fXYZ[3] = {tp.X(), tp.Y(), tp.Z()};
465 double fErrXYZ[6] = {0};
467 outputSpacePoints->emplace_back(std::move(sp));
468 art::Ptr<recob::SpacePoint> apsp(spid, outputSpacePoints->size() - 1, spidgetter);
469 outputHitSpacePointAssn->addSingle(trhit, apsp);
473 outputPFAssn->addSingle(art::Ptr<recob::PFParticle>(inputPFParticle, iPF), aptr);
478 e.put(std::move(outputTracks));
479 e.put(std::move(outputHitsMeta));
480 e.put(std::move(outputHits));
481 e.put(std::move(outputPFAssn));
482 if (p_().
options().produceTrackFitHitInfo()) { e.put(std::move(outputHitInfo)); }
483 if (p_().
options().produceSpacePoints()) {
484 e.put(std::move(outputSpacePoints));
485 e.put(std::move(outputHitSpacePointAssn));
490 art::ValidHandle<std::vector<recob::Track>> inputTracks =
491 e.getValidHandle<std::vector<recob::Track>>(trackInputTag);
492 auto const& tkHitsAssn = *e.getValidHandle<art::Assns<recob::Track, recob::Hit>>(trackInputTag);
494 if (p_().options().pFromCalo()) {
495 trackCalo = std::make_unique<art::FindManyP<anab::Calorimetry>>(inputTracks,
e, caloInputTag);
498 if (p_().options().idFromCollection()) {
499 trackId = std::make_unique<art::FindManyP<anab::ParticleID>>(inputTracks,
e, pidInputTag);
502 for (
unsigned int iTrack = 0; iTrack < inputTracks->size(); ++iTrack) {
505 art::Ptr<recob::Track> ptrack(inputTracks, iTrack);
506 const int pId = setPId(iTrack, trackId);
507 const double mom = setMomValue(ptrack, trackCalo, pMC, pId);
508 const bool flipDir = setDirFlip(track, mcdir);
511 std::vector<art::Ptr<recob::Hit>> inHits;
512 for (
auto it = tkHitsAssn.begin(); it != tkHitsAssn.end(); ++it) {
513 if (it->first == ptrack)
514 inHits.push_back(it->second);
515 else if (inHits.size() > 0)
520 std::vector<art::Ptr<recob::Hit>> outHits;
523 bool fitok = kalmanFitter.fitTrack(
detProp,
535 if (!fitok)
continue;
537 if (p_().options().keepInputTrajectoryPoints()) {
541 outputTracks->emplace_back(std::move(outTrack));
542 art::Ptr<recob::Track> aptr(tid, outputTracks->size() - 1, tidgetter);
544 for (
auto const& trhit : outHits) {
547 outputHitsMeta->addSingle(aptr, trhit, metadata);
548 outputHits->addSingle(aptr, trhit);
549 if (p_().
options().produceSpacePoints() && outputTracks->back().HasValidPoint(ip)) {
550 auto& tp = outputTracks->back().Trajectory().LocationAtPoint(ip);
551 double fXYZ[3] = {tp.X(), tp.Y(), tp.Z()};
552 double fErrXYZ[6] = {0};
554 outputSpacePoints->emplace_back(std::move(sp));
555 art::Ptr<recob::SpacePoint> apsp(spid, outputSpacePoints->size() - 1, spidgetter);
556 outputHitSpacePointAssn->addSingle(trhit, apsp);
562 e.put(std::move(outputTracks));
563 e.put(std::move(outputHitsMeta));
564 e.put(std::move(outputHits));
565 if (p_().
options().produceTrackFitHitInfo()) { e.put(std::move(outputHitInfo)); }
566 if (p_().
options().produceSpacePoints()) {
567 e.put(std::move(outputSpacePoints));
568 e.put(std::move(outputHitSpacePointAssn));
581 std::vector<Point_t> positions(np);
582 std::vector<Vector_t> momenta(np);
583 std::vector<recob::TrajectoryPointFlags> outFlags(np);
585 for (
unsigned int p = 0;
p < np; ++
p) {
588 auto op =
flag.fromHit();
602 std::move(covs.first),
603 std::move(covs.second),
607 for (
auto h : inHits)
608 outHits.push_back(
h);
613 art::Ptr<recob::Track> ptrack,
614 const std::unique_ptr<art::FindManyP<anab::Calorimetry>>& trackCalo,
618 double result = p_().options().pval();
619 if (p_().
options().pFromMSChi2()) { result = tmc.GetMomentumMultiScatterChi2(ptrack); }
620 else if (p_().
options().pFromLength()) {
621 result = tmc.GetTrackMomentum(ptrack->Length(), pId);
623 else if (p_().options().pFromCalo()) {
625 const std::vector<art::Ptr<anab::Calorimetry>>&
calo = trackCalo->at(ptrack.key());
626 double sumenergy = 0.;
628 for (
auto caloit : calo) {
629 if (caloit->KineticEnergy() > 0.) {
630 sumenergy += caloit->KineticEnergy();
634 if (nviews != 0 && sumenergy != 0.) {
636 result = sumenergy / (nviews * 1000.);
639 else if (p_().options().pFromMC() && pMC > 0.) {
647 const unsigned int iTrack,
648 const std::unique_ptr<art::FindManyP<anab::ParticleID>>& trackId,
649 const int pfPid)
const
672 const std::vector<art::Ptr<recob::Vertex>>* vertices)
const
675 if (p_().
options().alwaysInvertDir()) {
return true; }
676 else if (p_().
options().dirFromMC()) {
678 if ((mcdir.X() * tdir.X() + mcdir.Y() * tdir.Y() + mcdir.Z() * tdir.Z()) < 0.) result =
true;
680 else if (p_().options().dirFromVec()) {
681 std::array<float, 3>
dir = p_().options().dirVec();
683 if ((dir[0] * tdir.X() + dir[1] * tdir.Y() + dir[2] * tdir.Z()) < 0.) result =
true;
685 else if (p_().options().trackFromPF() && p_().options().dirFromVtxPF() && vertices->size() > 0) {
688 (*vertices)[0]->XYZ(xyz);
691 if (((xyz[0] - te.X()) * (xyz[0] - te.X()) + (xyz[1] - te.Y()) * (xyz[1] - te.Y()) +
692 (xyz[2] - te.Z()) * (xyz[2] - te.Z())) >
693 ((xyz[0] - tv.X()) * (xyz[0] - tv.X()) + (xyz[1] - tv.Y()) * (xyz[1] - tv.Y()) +
694 (xyz[2] - tv.Z()) * (xyz[2] - tv.Z())))
fhicl::Sequence< float, 3u > dirVec
double VertexMomentum() const
Trajectory_t const & Trajectory() const
Returns the plain trajectory of this object.
Fit tracks using Kalman Filter fit+smooth.
void initTrackFitInfos()
initialize the output vector of TrackFitHitInfos
fhicl::Atom< bool > dirFromVtxPF
ClusterModuleLabel join with tracks
static constexpr Flag_t NoPoint
The trajectory point is not defined.
fhicl::Table< TrackStatePropagator::Config > propagator
then echo unknown compiler flag
recob::tracking::Point_t Point_t
fhicl::Atom< bool > pFromCalo
recob::tracking::Vector_t Vector_t
const recob::TrackTrajectory & Trajectory() const
Access to the stored recob::TrackTrajectory.
const TVector3 & Direction() const
art::InputTag pidInputTag
Declaration of signal hit object.
recob::tracking::SMatrixSym55 SMatrixSym55
size_t NumberTrajectoryPoints() const
Various functions related to the presence and the number of (valid) points.
TrackStatePropagator prop
Vector_t VertexDirection() const
Class for propagation of a trkf::TrackState to a recob::tracking::Plane.
art::InputTag simTrackInputTag
process_name use argoneut_mc_hitfinder track
art::InputTag pfParticleInputTag
std::pair< SMatrixSym55, SMatrixSym55 > Covariances() const
art::InputTag caloInputTag
trkf::TrackKalmanFitter kalmanFitter
std::unique_ptr< art::FindManyP< recob::Vertex > > assocVertices
Vector_t DirectionAtPoint(size_t i) const
Computes and returns the direction of the trajectory at a point.
fhicl::Table< KalmanFilterFinalTrackFitter::Options > options
fhicl::Table< KalmanFilterFinalTrackFitter::Inputs > inputs
process_name can override from command line with o or output calo
auto vector(Vector const &v)
Returns a manipulator which will print the specified array.
double setMomValue(art::Ptr< recob::Track > ptrack, const std::unique_ptr< art::FindManyP< anab::Calorimetry >> &trackCalo, const double pMC, const int pId) const
fhicl::Atom< bool > showerFromPF
constexpr mask_t< EnumType > mask(EnumType bit, OtherBits...otherBits)
Returns a mask with all specified bits set.
trkf::TrackMomentumCalculator tmc
A trajectory in space reconstructed from hits.
int setPId(const unsigned int iTrack, const std::unique_ptr< art::FindManyP< anab::ParticleID >> &trackId, const int pfPid=0) const
fhicl::Atom< bool > keepInputTrajectoryPoints
art::InputTag trackInputTag
Point_t const & LocationAtPoint(size_t i) const
Returns the position at the specified trajectory point.
fhicl::Atom< bool > idFromCollection
art::InputTag showerInputTag
art::EDProducer::Table< Config > Parameters
BEGIN_PROLOG vertical distance to the surface Name
std::unique_ptr< art::FindManyP< anab::ParticleID > > trackId
fhicl::Table< TrackKalmanFitter::Config > fitter
KalmanFilterFinalTrackFitter(Parameters const &p)
Declaration of cluster object.
Class def header for mctrack data container.
Provides recob::Track data product.
void produce(art::Event &e) override
Point_t const & Vertex() const
Returns the position of the first valid point of the trajectory [cm].
const TLorentzVector & Momentum() const
fhicl::Atom< bool > produceSpacePoints
A trajectory in space reconstructed from hits.
KalmanFilterFinalTrackFitter & operator=(KalmanFilterFinalTrackFitter const &)=delete
fhicl::Atom< bool > pFromLength
fhicl::Atom< bool > dirFromMC
fhicl::Atom< bool > idFromPF
const SMatrixSym55 & EndCovarianceLocal5D() const
std::vector< recob::TrackFitHitInfo > trackFitHitInfos()
get the output vector of TrackFitHitInfos by releasing and moving
std::unique_ptr< art::FindManyP< anab::Calorimetry > > trackCalo
std::unique_ptr< art::FindManyP< recob::Shower > > assocShowers
Point_t const & End() const
Returns the position of the last valid point of the trajectory [cm].
const std::string & Process() const
then echo echo For and will not be changed by echo further linking echo echo B echo The symbol is in the uninitialized data multiple common symbols may appear with the echo same name If the symbol is defined the common echo symbols are treated as undefined references For more echo details on common see the discussion of warn common echo in *Note Linker options
const TVector3 & ShowerStart() const
PointFlags_t const & FlagsAtPoint(size_t i) const
const MCStep & Start() const
fhicl::Atom< bool > dirFromVec
TrackCollectionProxyElement< TrackCollProxy > Track
Proxy to an element of a proxy collection of recob::Track objects.
fhicl::Atom< bool > pFromMC
fhicl::Atom< bool > produceTrackFitHitInfo
fhicl::Atom< bool > trackFromPF
const SMatrixSym55 & VertexCovarianceLocal5D() const
fhicl::Atom< double > pval
bool setDirFlip(const recob::Track &track, TVector3 &mcdir, const std::vector< art::Ptr< recob::Vertex >> *vertices=0) const
fhicl::Atom< bool > pFromMSChi2
Struct holding optional TrackMaker outputs.
Set of flags pertaining a point of the track.
Track from a non-cascading particle.A recob::Track consists of a recob::TrackTrajectory, plus additional members relevant for a "fitted" track:
std::unique_ptr< art::FindManyP< recob::Track > > assocTracks
fhicl::Atom< bool > alwaysInvertDir
void restoreInputPoints(const recob::Trajectory &track, const std::vector< art::Ptr< recob::Hit >> &inHits, recob::Track &outTrack, std::vector< art::Ptr< recob::Hit >> &outHits) const