12 #include <analysis/dataobjects/ParticleList.h>
14 #include <mdst/dataobjects/ECLCluster.h>
15 #include <tracking/dataobjects/RecoTrack.h>
17 #include <analysis/utility/PCmsLabTransform.h>
18 #include <analysis/ClusterUtility/ClusterUtils.h>
19 #include <TLorentzVector.h>
26 namespace SoftwareTrigger {
29 inline TLorentzVector getFourVector(
const T& item);
33 inline TLorentzVector getFourVector(
const std::reference_wrapper<const ECLCluster>& cluster)
37 return TLorentzVector(v.Px(), v.Py(), v.Pz(), v.E());
42 inline TLorentzVector getFourVector(
const RecoTrack& track)
44 const TVector3& positionSeed = track.getPositionSeed();
45 return TLorentzVector(positionSeed.X(), positionSeed.Y(), positionSeed.Z(),
50 template<
class AnEntityType>
51 inline const AnEntityType* getElementFromParticle(
const Particle& particle);
55 inline const Particle* getElementFromParticle(
const Particle& particle)
62 inline const ECLCluster* getElementFromParticle(
const Particle& particle)
64 return particle.getECLCluster();
68 inline double BeamEnergyCMS()
71 return T.getCMSEnergy() / 2.0;
75 template<
class AnEntity>
76 inline double getRho(
const AnEntity* entity)
82 const TLorentzVector& fourVector = entity->get4Vector();
88 inline double getRho(
const ECLCluster* entity)
102 template<
class AReturnType>
103 static const AReturnType* getElementWithMaximumRhoBelow(
const StoreObjPtr<ParticleList>& particles,
104 const double belowLimit)
106 const AReturnType* elementMaximumRho =
nullptr;
107 double maximumRho = -1.;
108 for (
const Particle& currentParticle : *particles) {
109 const auto currentElement = getElementFromParticle<AReturnType>(currentParticle);
110 const double& currentRho = getRho(currentElement);
111 if (currentRho >= belowLimit) {
114 if (currentRho > maximumRho) {
115 maximumRho = currentRho;
116 elementMaximumRho = currentElement;
119 return elementMaximumRho;
123 template<
class AReturnType>
124 inline const AReturnType* getElementWithMaximumRho(
const StoreObjPtr<ParticleList>& particles)
126 return getElementWithMaximumRhoBelow<AReturnType>(particles, std::nan(
""));
129 extern double getRhoOfECLClusterWithMaximumRhoBelow(
const StoreObjPtr<ParticleList>& pions,
130 const StoreObjPtr<ParticleList>& gammas,
131 const double belowLimit);
134 inline double getRhoOfECLClusterWithMaximumRho(
const StoreObjPtr<ParticleList>& pionshlt,
135 const StoreObjPtr<ParticleList>& gammahlt)
137 return getRhoOfECLClusterWithMaximumRhoBelow(pionshlt, gammahlt, std::nan(
""));