60 const fhicl::ParameterSet& pset)
61 :
IShowerTool(pset.get<fhicl::ParameterSet>(
"BaseTools"))
62 , fVerbose(pset.get<int>(
"Verbose"))
63 , fSlidingFitHalfWindow(pset.get<float>(
"SlidingFitHalfWindow"))
64 , fMinTrajectoryPoints(pset.get<float>(
"MinTrajectoryPoints"))
65 , fInitialTrackOutputLabel(pset.get<std::string>(
"InitialTrackOutputLabel"))
66 , fInitialTrackLengthOutputLabel(pset.get<std::string>(
"InitialTrackLengthOutputLabel"))
67 , fShowerStartPositionInputLabel(pset.get<std::string>(
"ShowerStartPositionInputLabel"))
68 , fShowerDirectionInputLabel(pset.get<std::string>(
"ShowerDirectionInputLabel"))
69 , fInitialTrackSpacePointsInputLabel(pset.get<std::string>(
"InitialTrackSpacePointsInputLabel"))
70 , fInitialTrackHitsInputLabel(pset.get<std::string>(
"InitialTrackHitsInputLabel"))
83 const art::Ptr<recob::PFParticle>& pfparticle,
90 mf::LogError(
"ShowerPandoraSlidingFitTrackFinder")
91 <<
"Start position not set, returning " << std::endl;
96 mf::LogError(
"ShowerPandoraSlidingFitTrackFinder")
97 <<
"Direction not set, returning " << std::endl;
102 mf::LogError(
"ShowerPandoraSlidingFitTrackFinder")
103 <<
"Initial Spacepoints not set, returning " << std::endl;
107 geo::Point_t ShowerStartPosition = {-999, -999, -999};
110 geo::Vector_t ShowerDirection = {-999, -999, -999};
113 std::vector<art::Ptr<recob::SpacePoint>> spacepoints;
120 mf::LogWarning(
"ShowerPandoraSlidingFitTrackFinder")
121 <<
"Insufficient space points points to build track: " << spacepoints.size();
127 const float wirePitchW(detType->
WirePitchW());
130 ShowerStartPosition.X(), ShowerStartPosition.Y(), ShowerStartPosition.Z());
133 for (
const art::Ptr<recob::SpacePoint> spacePoint : spacepoints)
134 cartesianPointVector.emplace_back(
149 mf::LogWarning(
"ShowerPandoraSlidingFitTrackFinder")
150 <<
"Unable to extract sliding fit trajectory" << std::endl;
155 mf::LogWarning(
"ShowerPandoraSlidingFitTrackFinder")
156 <<
"Insufficient input trajectory points to build track: " << trackStateVector.size();
160 if (trackStateVector.empty())
161 throw cet::exception(
"ShowerPandoraSlidingFitTrackFinder")
162 <<
"BuildTrack - No input trajectory points provided " << std::endl;
164 recob::tracking::Positions_t xyz;
165 recob::tracking::Momenta_t pxpypz;
166 recob::TrackTrajectory::Flags_t flags;
169 xyz.emplace_back(recob::tracking::Point_t(trackState.GetPosition().GetX(),
170 trackState.GetPosition().GetY(),
171 trackState.GetPosition().GetZ()));
172 pxpypz.emplace_back(recob::tracking::Vector_t(trackState.GetDirection().GetX(),
173 trackState.GetDirection().GetY(),
174 trackState.GetDirection().GetZ()));
177 if (std::fabs(trackState.GetPosition().GetX() - util::kBogusF) <
178 std::numeric_limits<float>::epsilon() &&
179 std::fabs(trackState.GetPosition().GetY() - util::kBogusF) <
180 std::numeric_limits<float>::epsilon() &&
181 std::fabs(trackState.GetPosition().GetZ() - util::kBogusF) <
182 std::numeric_limits<float>::epsilon()) {
183 flags.emplace_back(recob::TrajectoryPointFlags(recob::TrajectoryPointFlags::InvalidHitIndex,
184 recob::TrajectoryPointFlagTraits::NoPoint));
187 flags.emplace_back(recob::TrajectoryPointFlags());
192 recob::Track InitialTrack = recob::Track(
193 recob::TrackTrajectory(std::move(xyz), std::move(pxpypz), std::move(flags),
false),
197 recob::tracking::SMatrixSym55(),
198 recob::tracking::SMatrixSym55(),
203 float tracklength = (InitialTrack.Start() - InitialTrack.End()).R();
211 const art::Ptr<recob::PFParticle>& pfpPtr,
219 mf::LogError(
"ShowerPandoraSlidingFitTrackFinderAddAssn")
220 <<
"Track not set so the assocation can not be made " << std::endl;
227 const art::Ptr<recob::Track> trackptr = GetProducedElementPtr<recob::Track>(
229 const art::Ptr<recob::Shower> showerptr =
230 GetProducedElementPtr<recob::Shower>(
"shower", ShowerEleHolder);
232 AddSingle<art::Assns<recob::Shower, recob::Track>>(showerptr, trackptr,
"ShowerTrackAssn");
234 std::vector<art::Ptr<recob::Hit>> TrackHits;
237 for (
auto const& TrackHit : TrackHits) {
238 AddSingle<art::Assns<recob::Track, recob::Hit>>(trackptr, TrackHit,
"ShowerTrackHitAssn");
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.
std::vector< LArTrackState > LArTrackStateVector