22 static const double depth;
23 static const double R_BARREL;
24 static const double R_BARREL2;
25 static const double Z_ENDCAP;
26 static const double R_FORWARD;
27 static const double R_FORWARD2;
28 static const double Z_FORWARD;
29 static const double Z_BIG;
34 const double CaloPoint::R_BARREL = (1. -
depth) * 143. +
depth * 407.;
35 const double CaloPoint::R_BARREL2 = R_BARREL * R_BARREL;
36 const double CaloPoint::Z_ENDCAP = (1. -
depth) * 320. +
depth * 568.;
37 const double CaloPoint::R_FORWARD = Z_ENDCAP /
std::sqrt(std::cosh(3.) * std::cosh(3.) - 1.);
38 const double CaloPoint::R_FORWARD2 = R_FORWARD * R_FORWARD;
39 const double CaloPoint::Z_FORWARD = 1100. +
depth * 165.;
40 const double CaloPoint::Z_BIG = 1.e5;
45 CaloPointZ(
double fZ,
double fEta) {
46 static const double ETA_MAX = 5.2;
53 double tanThetaAbs =
std::sqrt(std::cosh(fEta) * std::cosh(fEta) - 1.);
54 double tanTheta = fEta >= 0 ? tanThetaAbs : -tanThetaAbs;
56 double rEndcap = tanTheta == 0 ? 1.e10 : fEta > 0 ? (Z_ENDCAP - fZ) / tanTheta : (-Z_ENDCAP - fZ) / tanTheta;
57 if (rEndcap > R_BARREL) {
59 mZ = fZ + R_BARREL * tanTheta;
62 if (rEndcap > R_FORWARD)
64 else if (std::fabs(fEta) <
ETA_MAX)
67 mZ = fEta > 0 ? zRef : -zRef;
68 mR = std::fabs((mZ - fZ) / tanTheta);
71 double etaReference(
double fZ) {
76 double thetaReference(
double fZ) {
81 double z()
const {
return mZ; }
82 double r()
const {
return mR; }
92 template <
typename Po
int>
95 template <
typename Vector,
typename Po
int2>
96 CaloPoint3D(
const Point2 &vertex,
const Vector &
dir) {
100 int side = dir.z() < -1
e-9 ? -1 : dir.z() > 1
e-9 ? +1 : 0;
102 double dirR = dir.Rho();
105 double dirUnit[2] = {dir.x() / dirR, dir.y() / dirR};
110 double vtxLong = dirUnit[0] * vertex.x() + dirUnit[1] * vertex.y();
113 double tIP = dirUnit[0] * vertex.y() - dirUnit[1] * vertex.x();
119 double slope = dirR / dir.z();
122 r = vtxLong + slope * (side * Z_ENDCAP - vertex.z());
125 if (r2 < R_FORWARD2) {
127 r = vtxLong + slope * (side * Z_FORWARD - vertex.z());
128 z = side * Z_FORWARD;
129 }
else if (r2 < R_BARREL2) {
140 double slope = dir.z() / dirR;
142 z = vertex.z() + slope * (r - vtxLong);
146 point =
Point(dirUnit[0] * r - dirUnit[1] * tIP, dirUnit[1] * r + dirUnit[0] * tIP, z);
149 const Point &caloPoint()
const {
return point; }
152 template <
typename T>
154 return value *
value;
164 for (
unsigned i = 0;
i < fConstituents.size();
i++) {
175 double phiRef =
phi();
181 double sumEtaPhi = 0;
182 int i = towers.size();
184 double eta = towers[
i]->eta();
186 double weight = towers[
i]->et();
189 sumEta2 += eta * eta *
weight;
191 sumPhi2 += phi * phi *
weight;
192 sumEtaPhi += eta * phi *
weight;
194 Jet::EtaPhiMoments
result;
196 result.etaMean = sumEta / sumw;
197 result.phiMean =
deltaPhi(phiRef + sumPhi, 0.);
198 result.etaEtaMoment = (sumEta2 - sumEta * sumEta / sumw) / sumw;
199 result.phiPhiMoment = (sumPhi2 - sumPhi * sumPhi / sumw) / sumw;
200 result.etaPhiMoment = (sumEtaPhi - sumEta * sumPhi / sumw) / sumw;
204 result.etaEtaMoment = 0;
205 result.phiPhiMoment = 0;
206 result.etaPhiMoment = 0;
217 int i = towers.size();
219 double value = towers[
i]->eta();
220 double weight = towers[
i]->et();
223 sum2 += value * value *
weight;
225 return sumw > 0 ? (sum2 - sum * sum / sumw) / sumw : 0;
230 double phiRef =
phi();
235 int i = towers.size();
238 double weight = towers[
i]->et();
241 sum2 += value * value *
weight;
243 return sumw > 0 ? (sum2 - sum * sum / sumw) / sumw : 0;
248 double phiRef =
phi();
254 int i = towers.size();
256 double valueA = towers[
i]->eta();
257 double valueB =
deltaPhi(towers[i]->
phi(), phiRef);
258 double weight = towers[
i]->et();
262 sumAB += valueA * valueB *
weight;
264 return sumw > 0 ? (sumAB - sumA * sumB / sumw) / sumw : 0;
271 int i = towers.size();
273 double r =
deltaR(*
this, *(towers[i]));
274 if (r >= fRmin && r < fRmax)
275 result += towers[
i]->et();
284 return towers.size();
286 for (
unsigned i = 0; i < towers.size(); ++
i)
287 totalEt += towers[i]->
et();
288 double fractionEnergy = totalEt * fFraction;
290 for (; result < towers.size(); ++
result) {
291 fractionEnergy -= towers[
result]->et();
292 if (fractionEnergy <= 0)
302 for (
unsigned i = 0; i < towers.size(); ++
i) {
303 float dR =
deltaR(*(towers[i]), *
this);
313 CaloPointZ refPoint(0., fDetectorEta);
314 return refPoint.etaReference(fZVertex);
320 CaloPointZ refPoint(fZVertex, fPhysicsEta);
321 return refPoint.etaReference(0.);
327 CaloPoint3D<Point> caloPoint(oldVertex, inParticle.
momentum());
328 Vector physicsDir = caloPoint.caloPoint() - newVertex;
330 Vector p3 = p * physicsDir.unit();
336 CaloPoint3D<Point> caloPoint(vertex, inParticle.
momentum());
337 static const Point np(0, 0, 0);
338 Vector detectorDir = caloPoint.caloPoint() -
np;
339 double p = inParticle.
momentum().r();
340 Vector p3 = p * detectorDir.unit();
354 std::vector<const Candidate *>
result;
356 for (
int i = 0; i < nDaughters; ++
i) {
359 <<
"Bad pointer to jet constituent found. Check for possible dropped particle.";
373 for (
unsigned iConst = 0; iConst < constituents.size(); ++iConst) {
374 float pt = constituents[iConst]->p4().Pt();
382 float ptD_value = (sum_pt > 0.) ?
sqrt(sum_pt2 / (sum_pt * sum_pt)) : 0.;
392 float sum_pt2deltaR2 = 0.;
394 for (
unsigned iConst = 0; iConst < constituents.size(); ++iConst) {
397 float pt = thisConstituent.Pt();
399 double dR =
deltaR(*
this, *(constituents[iConst]));
400 float pt2deltaR2 = pt * pt * dR * dR;
403 sum_pt2deltaR2 += pt2deltaR2;
407 float rmsCand_value = (sum_pt2 > 0.) ? sum_pt2deltaR2 / sum_pt2 : 0.;
409 return rmsCand_value;
414 std::ostringstream
out;
415 out <<
"Jet p/px/py/pz/pt: " <<
p() <<
'/' <<
px() <<
'/' <<
py() <<
'/' <<
pz() <<
'/' <<
pt() << std::endl
416 <<
" eta/phi: " <<
eta() <<
'/' <<
phi() << std::endl
418 out <<
" Constituents:" << std::endl;
421 if (constituent.isNonnull()) {
422 out <<
" #" <<
index <<
" p/pt/eta/phi: " << constituent->p() <<
'/' << constituent->pt() <<
'/'
423 << constituent->eta() <<
'/' << constituent->phi() <<
" productId/index: " << constituent.id() <<
'/'
424 << constituent.key() << std::endl;
426 out <<
" #" <<
index <<
" constituent is not available in the event" << std::endl;
constexpr double deltaPhi(double phi1, double phi2)
float etInAnnulus(float fRmin, float fRmax) const
ET in annulus between rmin and rmax around jet direction.
virtual double energy() const =0
energy
static float detectorEta(float fZVertex, float fPhysicsEta)
static function to convert physics eta to detector eta
float constituentEtaPhiSpread() const
double pz() const final
z coordinate of momentum vector
virtual void scaleEnergy(double fScale)
scale energy of the jet
double pt() const final
transverse momentum
CandidatePtr sourceCandidatePtr(size_type i) const override
static const double slope[3]
std::vector< Constituent > Constituents
float etaetaMoment() const
eta-eta second moment, ET weighted
virtual Constituents getJetConstituents() const
list of constituents
const LorentzVector & p4() const final
four-momentum Lorentz vector
double px() const final
x coordinate of momentum vector
virtual Vector momentum() const =0
spatial momentum vector
double p() const final
magnitude of momentum vector
virtual std::string print() const
Print object.
bool isJet() const override
math::XYZTLorentzVector LorentzVector
double py() const final
y coordinate of momentum vector
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
edm::Ptr< Candidate > Constituent
Log< level::Info, false > LogInfo
size_t numberOfDaughters() const override
number of daughters
virtual CandidatePtr daughterPtr(size_type i) const
reference to daughter at given position
EtaPhiMoments etaPhiStatistics() const
eta-phi statistics, ET weighted
static Candidate::LorentzVector detectorP4(const Candidate::Point &vertex, const Candidate &inParticle)
float etaphiMoment() const
eta-phi second moment, ET weighted
float maxDistance() const
maximum distance from jet to constituent
int nCarrying(float fFraction) const
return # of constituent carrying fraction of energy
math::XYZTLorentzVector LorentzVector
Lorentz vector.
float constituentPtDistribution() const
double et() const final
transverse energy
float phiphiMoment() const
phi-phi second moment, ET weighted
virtual int nConstituents() const
of constituents
Structure Point Contains parameters of Gaussian fits to DMRs.
void addDaughter(const CandidatePtr &)
add a daughter via a reference
Jet()
Default constructor.
math::XYZPoint Point
point in the space
const Candidate * daughter(size_type) const override
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
static Candidate::LorentzVector physicsP4(const Candidate::Point &newVertex, const Candidate &inParticle, const Candidate::Point &oldVertex=Candidate::Point(0, 0, 0))
virtual std::vector< const reco::Candidate * > getJetConstituentsQuick() const
quick list of constituents
double phi() const final
momentum azimuthal angle
static float physicsEta(float fZVertex, float fDetectorEta)
static function to convert detector eta to physics eta
void setP4(const LorentzVector &p4) final
set 4-momentum
*vegas h *****************************************************used in the default bin number in original ***version of VEGAS is ***a higher bin number might help to derive a more precise ***grade subtle point
math::XYZPoint Point
point in the space
double eta() const final
momentum pseudorapidity