54 if (
fVerbose) mf::LogError(
"ShowerTrackDirection") <<
"Initial track not set" << std::endl;
61 mf::LogError(
"ShowerTrackDirection") <<
"Start position not set, returning " << std::endl;
66 recob::Track InitialTrack;
67 ShowerEleHolder.
GetElement(
"InitialTrack", InitialTrack);
70 geo::Point_t StartPosition;
73 StartPosition = InitialTrack.Start();
77 float sumX = 0, sumX2 = 0;
78 float sumY = 0, sumY2 = 0;
79 float sumZ = 0, sumZ2 = 0;
80 for (
unsigned int traj = 0; traj < InitialTrack.NumberTrajectoryPoints(); ++traj) {
83 auto flags = InitialTrack.FlagsAtPoint(traj);
84 if (flags.isSet(recob::TrajectoryPointFlags::InvalidHitIndex) ||
85 flags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
90 geo::Vector_t TrajPosition = (InitialTrack.LocationAtPoint(traj) - StartPosition).Unit();
91 sumX += TrajPosition.X();
92 sumX2 += TrajPosition.X() * TrajPosition.X();
93 sumY += TrajPosition.Y();
94 sumY2 += TrajPosition.Y() * TrajPosition.Y();
95 sumZ += TrajPosition.Z();
96 sumZ2 += TrajPosition.Z() * TrajPosition.Z();
99 float NumTraj = InitialTrack.NumberTrajectoryPoints();
100 geo::Vector_t Mean = {sumX / NumTraj, sumY / NumTraj, sumZ / NumTraj};
106 if (sumX2 / NumTraj - ((sumX / NumTraj) * ((sumX / NumTraj))) > 0) {
107 RMSX = std::sqrt(sumX2 / NumTraj - ((sumX / NumTraj) * ((sumX / NumTraj))));
109 if (sumY2 / NumTraj - ((sumY / NumTraj) * ((sumY / NumTraj))) > 0) {
110 RMSY = std::sqrt(sumY2 / NumTraj - ((sumY / NumTraj) * ((sumY / NumTraj))));
112 if (sumZ2 / NumTraj - ((sumZ / NumTraj) * ((sumZ / NumTraj))) > 0) {
113 RMSZ = std::sqrt(sumZ2 / NumTraj - ((sumZ / NumTraj) * ((sumZ / NumTraj))));
116 TVector3 Direction_Mean = {0, 0, 0};
119 for (
unsigned int traj = 0; traj < InitialTrack.NumberTrajectoryPoints(); ++traj) {
122 auto flags = InitialTrack.FlagsAtPoint(traj);
123 if (flags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
continue; }
126 geo::Point_t TrajPosition = InitialTrack.LocationAtPoint(traj);
127 geo::Vector_t Direction = (TrajPosition - StartPosition).Unit();
130 if (
auto MeanSubtractedDir = Direction - Mean; (std::abs(MeanSubtractedDir.X()) < RMSX) &&
131 (std::abs(MeanSubtractedDir.Y()) < RMSY) &&
132 (std::abs(MeanSubtractedDir.Z()) < RMSZ)) {
133 if (Direction.R() == 0) {
continue; }
134 Direction_Mean += geo::vect::convertTo<TVector3>(Direction);
141 geo::Vector_t Direction = geo::vect::toVector(Direction_Mean.Unit());
142 geo::Vector_t DirectionErr = {RMSX, RMSY, RMSZ};
143 ShowerEleHolder.
SetElement(Direction, DirectionErr,
"ShowerDirection");
147 mf::LogError(
"ShowerTrackDirection")
148 <<
"None of the points are within 1 sigma" << std::endl;
156 float sumX = 0, sumX2 = 0;
157 float sumY = 0, sumY2 = 0;
158 float sumZ = 0, sumZ2 = 0;
159 for (
unsigned int traj = 0; traj < InitialTrack.NumberTrajectoryPoints(); ++traj) {
162 auto flags = InitialTrack.FlagsAtPoint(traj);
163 if (flags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
continue; }
166 geo::Vector_t Direction = InitialTrack.DirectionAtPoint(traj);
167 sumX += Direction.X();
168 sumX2 += Direction.X() * Direction.X();
169 sumY += Direction.Y();
170 sumY2 += Direction.Y() * Direction.Y();
171 sumZ += Direction.Z();
172 sumZ2 += Direction.Z() * Direction.Z();
175 float NumTraj = InitialTrack.NumberTrajectoryPoints();
176 geo::Vector_t Mean = {sumX / NumTraj, sumY / NumTraj, sumZ / NumTraj};
182 if (sumX2 / NumTraj - ((sumX / NumTraj) * ((sumX / NumTraj))) > 0) {
183 RMSX = std::sqrt(sumX2 / NumTraj - ((sumX / NumTraj) * ((sumX / NumTraj))));
185 if (sumY2 / NumTraj - ((sumY / NumTraj) * ((sumY / NumTraj))) > 0) {
186 RMSY = std::sqrt(sumY2 / NumTraj - ((sumY / NumTraj) * ((sumY / NumTraj))));
188 if (sumZ2 / NumTraj - ((sumZ / NumTraj) * ((sumZ / NumTraj))) > 0) {
189 RMSZ = std::sqrt(sumZ2 / NumTraj - ((sumZ / NumTraj) * ((sumZ / NumTraj))));
194 TVector3 Direction_Mean = {0, 0, 0};
195 for (
unsigned int traj = 0; traj < InitialTrack.NumberTrajectoryPoints(); ++traj) {
197 auto flags = InitialTrack.FlagsAtPoint(traj);
198 if (flags.isSet(recob::TrajectoryPointFlagTraits::NoPoint)) {
continue; }
200 geo::Vector_t Direction = InitialTrack.DirectionAtPoint(traj).Unit();
201 if ((std::abs((Direction - Mean).X()) < 1 * RMSX) &&
202 (std::abs((Direction - Mean).Y()) < 1 * RMSY) &&
203 (std::abs((Direction - Mean).Z()) < 1 * RMSZ)) {
204 TVector3 Direction_vec = {Direction.X(), Direction.Y(), Direction.Z()};
205 if (Direction_vec.Mag() == 0) {
continue; }
206 Direction_Mean += Direction_vec;
213 geo::Vector_t Direction = geo::vect::toVector(Direction_Mean.Unit());
214 geo::Vector_t DirectionErr = {RMSX, RMSY, RMSZ};
215 ShowerEleHolder.
SetElement(Direction, DirectionErr,
"ShowerDirection");
219 mf::LogError(
"ShowerTrackDirection")
220 <<
"None of the points are within 1 sigma" << std::endl;