69 #include <analysis/ContinuumSuppression/Thrust.h>
78 TVector3 thrust_axis, trial_axis, base_axis;
79 auto end = momenta.end();
80 auto begin = momenta.begin();
83 double sum_magnitude_mom = 0.;
90 for (
auto const& momentum : momenta)
91 sum_magnitude_mom += momentum.Mag();
98 for (
auto const& mom : momenta) {
100 trial_axis = (mom.z() >= 0.) ? TVector3(mom) : TVector3(-mom);
103 if (trial_axis.Mag() != 0.) trial_axis *= 1. / trial_axis.Mag();
112 base_axis = trial_axis;
113 trial_axis = TVector3();
116 for (
auto const& momentum : momenta)
117 trial_axis += (momentum.Dot(base_axis) >= 0.) ? \
118 TVector3(momentum) : TVector3(-momentum);
124 for (itr = begin; itr != end; itr++)
125 if ((*itr).Dot(trial_axis) * (*itr).Dot(base_axis) < 0.)
break;
136 double trial_mag(trial_axis.Mag());
145 double trial_thrust(0.);
146 for (
auto const& momentum : momenta)
147 trial_thrust += std::fabs(momentum.Dot(trial_axis));
149 trial_thrust /= (sum_magnitude_mom * trial_mag);
155 if (trial_thrust > thrust) {
156 thrust = trial_thrust;
157 thrust_axis = trial_axis * (1. / trial_mag);
170 thrust_axis *= thrust;
static TVector3 calculateThrust(const std::vector< TVector3 > &momenta)
calculates the thrust axis
Abstract base class for different kinds of events.