56 const fhicl::ParameterSet& pset)
57 :
IShowerTool(pset.get<fhicl::ParameterSet>(
"BaseTools"))
58 , fVerbose(pset.get<int>(
"Verbose"))
59 , fUsePandoraVertex(pset.get<bool>(
"UsePandoraVertex"))
60 , fAllowDynamicSliding(pset.get<bool>(
"AllowDynamicSliding"))
61 , fUsePositionInfo(pset.get<bool>(
"UsePositionInfo"))
62 , fUseStartPos(pset.get<bool>(
"UseStartPos"))
63 , fAngleCut(pset.get<float>(
"AngleCut"))
64 , fInitialTrackInputLabel(pset.get<std::string>(
"InitialTrackInputLabel"))
65 , fShowerStartPositionInputLabel(pset.get<std::string>(
"ShowerStartPositionInputLabel"))
66 , fShowerDirectionOutputLabel(pset.get<std::string>(
"ShowerDirectionOutputLabel"))
71 const art::Ptr<recob::PFParticle>& pfparticle,
79 mf::LogError(
"ShowerTrackColinearTrajPointDirection")
80 <<
"Initial track not set" << std::endl;
83 recob::Track InitialTrack;
87 if (InitialTrack.NumberTrajectoryPoints() == 1) {
89 mf::LogError(
"ShowerTrackColinearTrajPointDirection")
90 <<
"Not Enough trajectory points." << std::endl;
96 geo::Vector_t Direction;
100 geo::Point_t StartPosition;
106 mf::LogError(
"ShowerTrackColinearTrajPointDirection")
107 <<
"Shower start position not set" << std::endl;
113 StartPosition = InitialTrack.Start();
117 for (
unsigned int traj = 0; traj < InitialTrack.NumberTrajectoryPoints() - 2; ++traj) {
121 auto trajflags = InitialTrack.FlagsAtPoint(trajpoint);
122 if (trajflags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
continue; }
127 auto flags = InitialTrack.FlagsAtPoint(traj);
128 if (flags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
continue; }
131 int nexttraj = traj + 1;
132 auto nextflags = InitialTrack.FlagsAtPoint(nexttraj);
133 while (nextflags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
134 if (nexttraj == (
int)InitialTrack.NumberTrajectoryPoints() - 2) {
139 nextflags = InitialTrack.FlagsAtPoint(nexttraj);
143 int nextnexttraj = nexttraj + 1;
144 auto nextnextflags = InitialTrack.FlagsAtPoint(nextnexttraj);
145 while (nextnextflags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
146 if (nexttraj == (
int)InitialTrack.NumberTrajectoryPoints() - 1) {
151 nextnextflags = InitialTrack.FlagsAtPoint(nextnexttraj);
156 mf::LogError(
"ShowerTrackColinearTrajPointDirection")
157 <<
"Trajectory point not set as rest of the traj points are bogus." << std::endl;
162 geo::Vector_t TrajPosition = InitialTrack.LocationAtPoint(traj) - StartPosition;
163 geo::Vector_t NextTrajPosition;
164 geo::Vector_t NextNextTrajPosition;
166 NextTrajPosition = InitialTrack.LocationAtPoint(nexttraj) - StartPosition;
167 NextNextTrajPosition = InitialTrack.LocationAtPoint(nextnexttraj) - StartPosition;
171 InitialTrack.LocationAtPoint(nexttraj) - InitialTrack.LocationAtPoint(traj);
172 NextNextTrajPosition =
173 InitialTrack.LocationAtPoint(nextnexttraj) - InitialTrack.LocationAtPoint(traj + 1);
177 if (TrajPosition.R() == 0) {
continue; }
178 if (NextTrajPosition.R() == 0) {
continue; }
179 if (NextNextTrajPosition.R() == 0) {
continue; }
182 if (Angle(TrajPosition, NextTrajPosition) <
fAngleCut &&
183 Angle(TrajPosition, NextNextTrajPosition) <
fAngleCut) {
191 geo::Point_t TrajPosition = InitialTrack.LocationAtPoint(trajpoint);
192 Direction = (TrajPosition - StartPosition).Unit();
196 for (
unsigned int traj = 0; traj < InitialTrack.NumberTrajectoryPoints() - 2; ++traj) {
200 auto trajflags = InitialTrack.FlagsAtPoint(trajpoint);
201 if (trajflags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
continue; }
204 auto flags = InitialTrack.FlagsAtPoint(traj);
205 if (flags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
continue; }
209 geo::Vector_t TrajDirection;
214 auto prevflags = InitialTrack.FlagsAtPoint(prevtraj);
215 while (prevflags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
216 if (prevtraj == (
int)InitialTrack.NumberTrajectoryPoints() - 2) {
221 prevflags = InitialTrack.FlagsAtPoint(prevtraj);
223 TrajDirection = InitialTrack.DirectionAtPoint(prevtraj);
226 int prevtraj = traj - 1;
227 auto prevflags = InitialTrack.FlagsAtPoint(prevtraj);
228 while (prevflags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
234 prevflags = InitialTrack.FlagsAtPoint(prevtraj);
236 TrajDirection = InitialTrack.DirectionAtPoint(prevtraj);
239 TrajDirection = InitialTrack.DirectionAtPoint(traj);
243 int nexttraj = traj + 1;
244 auto nextflags = InitialTrack.FlagsAtPoint(nexttraj);
245 while (nextflags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
246 if (nexttraj == (
int)InitialTrack.NumberTrajectoryPoints() - 2) {
251 nextflags = InitialTrack.FlagsAtPoint(nexttraj);
255 int nextnexttraj = nexttraj + 1;
256 auto nextnextflags = InitialTrack.FlagsAtPoint(nextnexttraj);
257 while (nextnextflags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
258 if (nexttraj == (
int)InitialTrack.NumberTrajectoryPoints() - 1) {
263 nextnextflags = InitialTrack.FlagsAtPoint(nextnexttraj);
268 mf::LogError(
"ShowerTrackColinearTrajPointDirection")
269 <<
"Trajectory point not set as rest of the traj points are bogus." << std::endl;
274 geo::Vector_t NextTrajDirection = InitialTrack.DirectionAtPoint(nexttraj);
275 geo::Vector_t NextNextTrajDirection = InitialTrack.DirectionAtPoint(nextnexttraj);
278 if (TrajDirection.R() == 0) {
continue; }
279 if (NextTrajDirection.R() == 0) {
continue; }
280 if (NextNextTrajDirection.R() == 0) {
continue; }
283 if (Angle(TrajDirection, NextTrajDirection) <
fAngleCut &&
284 Angle(TrajDirection, NextNextTrajDirection) <
fAngleCut) {
288 Direction = InitialTrack.DirectionAtPoint(trajpoint).Unit();
291 if (trajpoint == (
int)InitialTrack.NumberTrajectoryPoints() - 3) {
293 mf::LogError(
"ShowerSmartTrackTrajectoryPointDirectio")
294 <<
"Trajectory point not set." << std::endl;
299 geo::Vector_t DirectionErr = {-999, -999, -999};