CMS 3D CMS Logo

Jet.cc
Go to the documentation of this file.
1 // Jet.cc
2 // Fedor Ratnikov, UMd
3 
4 #include <sstream>
5 #include <cmath>
6 
10 
11 //Own header file
13 
14 
15 
16 using namespace reco;
17 
18 namespace {
19  // approximate simple CALO geometry
20  // abstract baseclass for geometry.
21 
22  class CaloPoint {
23  public:
24  static const double depth; // one for all relative depth of the reference point between ECAL begin and HCAL end
25  static const double R_BARREL;
26  static const double R_BARREL2;
27  static const double Z_ENDCAP; // 1/2(EEz+HEz)
28  static const double R_FORWARD; // eta=3
29  static const double R_FORWARD2;
30  static const double Z_FORWARD;
31  static const double Z_BIG;
32  };
33 
34  const double CaloPoint::depth = 0.1; // one for all relative depth of the reference point between ECAL begin and HCAL end
35  const double CaloPoint::R_BARREL = (1.-depth)*143.+depth*407.;
36  const double CaloPoint::R_BARREL2 = R_BARREL * R_BARREL;
37  const double CaloPoint::Z_ENDCAP = (1.-depth)*320.+depth*568.; // 1/2(EEz+HEz)
38  const double CaloPoint::R_FORWARD = Z_ENDCAP / std::sqrt (std::cosh(3.)*std::cosh(3.) -1.); // eta=3
39  const double CaloPoint::R_FORWARD2 = R_FORWARD * R_FORWARD;
40  const double CaloPoint::Z_FORWARD = 1100.+depth*165.;
41  const double CaloPoint::Z_BIG = 1.e5;
42 
43  //old zvertex only implementation:
44  class CaloPointZ: private CaloPoint{
45  public:
46  CaloPointZ (double fZ, double fEta){
47 
48  static const double ETA_MAX = 5.2;
49 
50  if (fZ > Z_ENDCAP) fZ = Z_ENDCAP-1.;
51  if (fZ < -Z_ENDCAP) fZ = -Z_ENDCAP+1; // sanity check
52 
53  double tanThetaAbs = std::sqrt (std::cosh(fEta)*std::cosh(fEta) - 1.);
54  double tanTheta = fEta >= 0 ? tanThetaAbs : -tanThetaAbs;
55 
56  double rEndcap = tanTheta == 0 ? 1.e10 :
57  fEta > 0 ? (Z_ENDCAP - fZ) / tanTheta : (-Z_ENDCAP - fZ) / tanTheta;
58  if (rEndcap > R_BARREL) { // barrel
59  mR = R_BARREL;
60  mZ = fZ + R_BARREL * tanTheta;
61  }
62  else {
63  double zRef = Z_BIG; // very forward;
64  if (rEndcap > R_FORWARD) zRef = Z_ENDCAP; // endcap
65  else if (std::fabs (fEta) < ETA_MAX) zRef = Z_FORWARD; // forward
66 
67  mZ = fEta > 0 ? zRef : -zRef;
68  mR = std::fabs ((mZ - fZ) / tanTheta);
69  }
70  }
71  double etaReference (double fZ) {
72  Jet::Point p (r(), 0., z() - fZ);
73  return p.eta();
74  }
75 
76  double thetaReference (double fZ) {
77  Jet::Point p (r(), 0., z() - fZ);
78  return p.theta();
79  }
80 
81  double z() const {return mZ;}
82  double r() const {return mR;}
83  private:
84  CaloPointZ(){};
85  double mZ;
86  double mR;
87  };
88 
89  //new implementation to derive CaloPoint for free 3d vertex.
90  //code provided thanks to Christophe Saout
91  template<typename Point>
92  class CaloPoint3D : private CaloPoint {
93  public:
94  template<typename Vector, typename Point2>
95  CaloPoint3D(const Point2 &vertex, const Vector &dir)
96  {
97  // note: no sanity checks here, make sure vertex is inside the detector!
98 
99  // check if positive or negative (or none) endcap should be tested
100  int side = dir.z() < -1e-9 ? -1 : dir.z() > 1e-9 ? +1 : 0;
101 
102  double dirR = dir.Rho();
103 
104  // normalized direction in x-y plane
105  double dirUnit[2] = { dir.x() / dirR, dir.y() / dirR };
106 
107  // rotate the vertex into a coordinate system where dir lies along x
108 
109  // vtxLong is the longitudinal coordinate of the vertex wrt/ dir
110  double vtxLong = dirUnit[0] * vertex.x() + dirUnit[1] * vertex.y();
111 
112  // tIP is the (signed) transverse impact parameter
113  double tIP = dirUnit[0] * vertex.y() - dirUnit[1] * vertex.x();
114 
115  // r and z coordinate
116  double r, z;
117 
118  if (side) {
119  double slope = dirR / dir.z();
120 
121  // check extrapolation to endcap
122  r = vtxLong + slope * (side * Z_ENDCAP - vertex.z());
123  double r2 = sqr(r) + sqr(tIP);
124 
125  if (r2 < R_FORWARD2) {
126  // we are in the forward calorimeter, recompute
127  r = vtxLong + slope * (side * Z_FORWARD - vertex.z());
128  z = side * Z_FORWARD;
129  } else if (r2 < R_BARREL2) {
130  // we are in the endcap
131  z = side * Z_ENDCAP;
132  } else {
133  // we are in the barrel, do the intersection below
134  side = 0;
135  }
136  }
137 
138  if (!side) {
139  // we are in the barrel
140  double slope = dir.z() / dirR;
141  r = std::sqrt(R_BARREL2 - sqr(tIP));
142  z = vertex.z() + slope * (r - vtxLong);
143  }
144 
145  // rotate (r, tIP, z) back into original x-y coordinate system
146  point = Point(dirUnit[0] * r - dirUnit[1] * tIP,
147  dirUnit[1] * r + dirUnit[0] * tIP,
148  z);
149  }
150 
151  const Point &caloPoint() const { return point; }
152 
153  private:
154  template<typename T>
155  static inline T sqr(const T &value) { return value * value; }
156 
157  Point point;
158  };
159 
160 }
161 
162 Jet::Jet (const LorentzVector& fP4,
163  const Point& fVertex,
164  const Constituents& fConstituents)
165  : CompositePtrCandidate (0, fP4, fVertex),
166  mJetArea (0),
167  mPileupEnergy (0),
168  mPassNumber (0)
169 {
170  for (unsigned i = 0; i < fConstituents.size (); i++) {
171  addDaughter (fConstituents [i]);
172  }
173 }
174 
175 Jet::Jet (const LorentzVector& fP4,
176  const Point& fVertex)
177  : CompositePtrCandidate (0, fP4, fVertex),
178  mJetArea (0),
179  mPileupEnergy (0),
180  mPassNumber (0)
181 {}
182 
184 Jet::EtaPhiMoments Jet::etaPhiStatistics () const {
185  std::vector<const Candidate*> towers = getJetConstituentsQuick ();
186  double phiRef = phi();
187  double sumw = 0;
188  double sumEta = 0;
189  double sumEta2 = 0;
190  double sumPhi = 0;
191  double sumPhi2 = 0;
192  double sumEtaPhi = 0;
193  int i = towers.size();
194  while (--i >= 0) {
195  double eta = towers[i]->eta();
196  double phi = deltaPhi (towers[i]->phi(), phiRef);
197  double weight = towers[i]->et();
198  sumw += weight;
199  sumEta += eta * weight;
200  sumEta2 += eta * eta * weight;
201  sumPhi += phi * weight;
202  sumPhi2 += phi * phi * weight;
203  sumEtaPhi += eta * phi * weight;
204  }
205  Jet::EtaPhiMoments result;
206  if (sumw > 0) {
207  result.etaMean = sumEta / sumw;
208  result.phiMean = deltaPhi (phiRef + sumPhi, 0.);
209  result.etaEtaMoment = (sumEta2 - sumEta * sumEta / sumw) / sumw;
210  result.phiPhiMoment = (sumPhi2 - sumPhi * sumPhi / sumw) / sumw;
211  result.etaPhiMoment = (sumEtaPhi - sumEta * sumPhi / sumw) / sumw;
212  }
213  else {
214  result.etaMean = 0;
215  result.phiMean = 0;
216  result.etaEtaMoment = 0;
217  result.phiPhiMoment = 0;
218  result.etaPhiMoment = 0;
219  }
220  return result;
221 }
222 
224 float Jet::etaetaMoment () const {
225  std::vector<const Candidate*> towers = getJetConstituentsQuick ();
226  double sumw = 0;
227  double sum = 0;
228  double sum2 = 0;
229  int i = towers.size();
230  while (--i >= 0) {
231  double value = towers[i]->eta();
232  double weight = towers[i]->et();
233  sumw += weight;
234  sum += value * weight;
235  sum2 += value * value * weight;
236  }
237  return sumw > 0 ? (sum2 - sum*sum/sumw ) / sumw : 0;
238 }
239 
241 float Jet::phiphiMoment () const {
242  double phiRef = phi();
243  std::vector<const Candidate*> towers = getJetConstituentsQuick ();
244  double sumw = 0;
245  double sum = 0;
246  double sum2 = 0;
247  int i = towers.size();
248  while (--i >= 0) {
249  double value = deltaPhi (towers[i]->phi(), phiRef);
250  double weight = towers[i]->et();
251  sumw += weight;
252  sum += value * weight;
253  sum2 += value * value * weight;
254  }
255  return sumw > 0 ? (sum2 - sum*sum/sumw ) / sumw : 0;
256 }
257 
259 float Jet::etaphiMoment () const {
260  double phiRef = phi();
261  std::vector<const Candidate*> towers = getJetConstituentsQuick ();
262  double sumw = 0;
263  double sumA = 0;
264  double sumB = 0;
265  double sumAB = 0;
266  int i = towers.size();
267  while (--i >= 0) {
268  double valueA = towers[i]->eta();
269  double valueB = deltaPhi (towers[i]->phi(), phiRef);
270  double weight = towers[i]->et();
271  sumw += weight;
272  sumA += valueA * weight;
273  sumB += valueB * weight;
274  sumAB += valueA * valueB * weight;
275  }
276  return sumw > 0 ? (sumAB - sumA*sumB/sumw ) / sumw : 0;
277 }
278 
280 float Jet::etInAnnulus (float fRmin, float fRmax) const {
281  float result = 0;
282  std::vector<const Candidate*> towers = getJetConstituentsQuick ();
283  int i = towers.size ();
284  while (--i >= 0) {
285  double r = deltaR (*this, *(towers[i]));
286  if (r >= fRmin && r < fRmax) result += towers[i]->et ();
287  }
288  return result;
289 }
290 
292 int Jet::nCarrying (float fFraction) const {
293  std::vector<const Candidate*> towers = getJetConstituentsQuick ();
294  if (fFraction >= 1) return towers.size();
295  double totalEt = 0;
296  for (unsigned i = 0; i < towers.size(); ++i) totalEt += towers[i]->et();
297  double fractionEnergy = totalEt * fFraction;
298  unsigned result = 0;
299  for (; result < towers.size(); ++result) {
300  fractionEnergy -= towers[result]->et();
301  if (fractionEnergy <= 0) return result+1;
302  }
303  return 0;
304 }
305 
307 float Jet::maxDistance () const {
308  float result = 0;
309  std::vector<const Candidate*> towers = getJetConstituentsQuick ();
310  for (unsigned i = 0; i < towers.size(); ++i) {
311  float dR = deltaR (*(towers[i]), *this);
312  if (dR > result) result = dR;
313  }
314  return result;
315 }
316 
318 // kept for backwards compatibility, use detector/physicsP4 instead!
319 float Jet::physicsEta (float fZVertex, float fDetectorEta) {
320  CaloPointZ refPoint (0., fDetectorEta);
321  return refPoint.etaReference (fZVertex);
322 }
323 
325 // kept for backwards compatibility, use detector/physicsP4 instead!
326 float Jet::detectorEta (float fZVertex, float fPhysicsEta) {
327  CaloPointZ refPoint (fZVertex, fPhysicsEta);
328  return refPoint.etaReference (0.);
329 }
330 
331 Candidate::LorentzVector Jet::physicsP4 (const Candidate::Point &newVertex, const Candidate &inParticle,const Candidate::Point &oldVertex) {
332  CaloPoint3D<Point> caloPoint(oldVertex,inParticle.momentum()); // Jet position in Calo.
333  Vector physicsDir = caloPoint.caloPoint() - newVertex;
334  double p = inParticle.momentum().r();
335  Vector p3 = p * physicsDir.unit();
336  LorentzVector returnVector(p3.x(), p3.y(), p3.z(), inParticle.energy());
337  return returnVector;
338 }
339 
340 Candidate::LorentzVector Jet::detectorP4 (const Candidate::Point &vertex, const Candidate &inParticle) {
341  CaloPoint3D<Point> caloPoint(vertex,inParticle.momentum()); // Jet position in Calo.
342  static const Point np(0,0,0);
343  Vector detectorDir = caloPoint.caloPoint() - np;
344  double p = inParticle.momentum().r();
345  Vector p3 = p * detectorDir.unit();
346  LorentzVector returnVector(p3.x(), p3.y(), p3.z(), inParticle.energy());
347  return returnVector;
348 }
349 
350 
353  for (unsigned i = 0; i < numberOfDaughters(); i++) {
354  result.push_back (daughterPtr (i));
355  }
356  return result;
357 }
358 
359 std::vector<const Candidate*> Jet::getJetConstituentsQuick () const {
360  std::vector<const Candidate*> result;
361  int nDaughters = numberOfDaughters();
362  for (int i = 0; i < nDaughters; ++i) {
363  if(!(this->sourceCandidatePtr(i).isNonnull() && this->sourceCandidatePtr(i).isAvailable()))
364  {
365  edm::LogInfo("JetConstituentPointer") << "Bad pointer to jet constituent found. Check for possible dropped particle.";
366  continue;
367  }
368  result.push_back (daughter (i));
369  }
370  return result;
371 }
372 
373 
374 
375 float Jet::constituentPtDistribution() const {
376 
377  Jet::Constituents constituents = this->getJetConstituents();
378 
379  float sum_pt2 = 0.;
380  float sum_pt = 0.;
381 
382  for( unsigned iConst=0; iConst<constituents.size(); ++iConst ) {
383 
384  float pt = constituents[iConst]->p4().Pt();
385  float pt2 = pt*pt;
386 
387  sum_pt += pt;
388  sum_pt2 += pt2;
389 
390  } //for constituents
391 
392  float ptD_value = (sum_pt>0.) ? sqrt( sum_pt2 / (sum_pt*sum_pt) ) : 0.;
393 
394  return ptD_value;
395 
396 } //constituentPtDistribution
397 
398 
399 
400 float Jet::constituentEtaPhiSpread() const {
401 
402  Jet::Constituents constituents = this->getJetConstituents();
403 
404 
405  float sum_pt2 = 0.;
406  float sum_pt2deltaR2 = 0.;
407 
408  for( unsigned iConst=0; iConst<constituents.size(); ++iConst ) {
409 
410  LorentzVector thisConstituent = constituents[iConst]->p4();
411 
412  float pt = thisConstituent.Pt();
413  float pt2 = pt*pt;
414  double dR = deltaR (*this, *(constituents[iConst]));
415  float pt2deltaR2 = pt*pt*dR*dR;
416 
417  sum_pt2 += pt2;
418  sum_pt2deltaR2 += pt2deltaR2;
419 
420  } //for constituents
421 
422  float rmsCand_value = (sum_pt2>0.) ? sum_pt2deltaR2/sum_pt2 : 0.;
423 
424  return rmsCand_value;
425 
426 } //constituentEtaPhiSpread
427 
428 
429 
430 std::string Jet::print () const {
431  std::ostringstream out;
432  out << "Jet p/px/py/pz/pt: " << p() << '/' << px () << '/' << py() << '/' << pz() << '/' << pt() << std::endl
433  << " eta/phi: " << eta () << '/' << phi () << std::endl
434  << " # of constituents: " << nConstituents () << std::endl;
435  out << " Constituents:" << std::endl;
436  for (unsigned index = 0; index < numberOfDaughters(); index++) {
437  Constituent constituent = daughterPtr (index); // deref
438  if (constituent.isNonnull()) {
439  out << " #" << index << " p/pt/eta/phi: "
440  << constituent->p() << '/' << constituent->pt() << '/' << constituent->eta() << '/' << constituent->phi()
441  << " productId/index: " << constituent.id() << '/' << constituent.key() << std::endl;
442  }
443  else {
444  out << " #" << index << " constituent is not available in the event" << std::endl;
445  }
446  }
447  return out.str ();
448 }
449 
450 void Jet::scaleEnergy (double fScale) {
451  setP4 (p4() * fScale);
452 }
453 
454 bool Jet::isJet() const {
455  return true;
456 }
virtual double pt() const final
transverse momentum
int mPassNumber
Definition: Jet.h:122
float etInAnnulus(float fRmin, float fRmax) const
ET in annulus between rmin and rmax around jet direction.
static float detectorEta(float fZVertex, float fPhysicsEta)
static function to convert physics eta to detector eta
float constituentEtaPhiSpread() const
virtual void scaleEnergy(double fScale)
scale energy of the jet
virtual double eta() const final
momentum pseudorapidity
CandidatePtr daughterPtr(size_type i) const
reference to daughter at given position
static const double slope[3]
math::XYZTLorentzVector LorentzVector
std::vector< Constituent > Constituents
Definition: Jet.h:23
Definition: weight.py:1
float etaetaMoment() const
eta-eta second moment, ET weighted
float mJetArea
Definition: Jet.h:120
virtual Constituents getJetConstituents() const
list of constituents
std::pair< double, double > Point
Definition: CaloEllipse.h:18
float float float z
virtual double phi() const final
momentum azimuthal angle
virtual double et() const final
transverse energy
virtual double energy() const =0
energy
virtual size_t numberOfDaughters() const
number of daughters
virtual CandidatePtr sourceCandidatePtr(size_type i) const
int np
Definition: AMPTWrapper.h:33
virtual std::string print() const
Print object.
fixed size vector
Definition: Vector.h:25
virtual double px() const final
x coordinate of momentum vector
T sqrt(T t)
Definition: SSEVec.h:18
math::XYZPoint Point
virtual double p() const final
magnitude of momentum vector
auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
Definition: value.py:1
unsigned int index
Definition: LeafCandidate.h:31
virtual double pz() const final
z coordinate of momentum vector
edm::Ptr< Candidate > Constituent
Definition: Jet.h:22
double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
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
virtual void setP4(const LorentzVector &p4) final
set 4-momentum
float maxDistance() const
maximum distance from jet to constituent
bool isJet() const
int nCarrying(float fFraction) const
return # of constituent carrying fraction of energy
math::XYZTLorentzVector LorentzVector
Lorentz vector.
Definition: Candidate.h:37
virtual Vector momentum() const =0
spatial momentum vector
float constituentPtDistribution() const
fixed size matrix
float phiphiMoment() const
phi-phi second moment, ET weighted
virtual int nConstituents() const
of constituents
Definition: Jet.h:65
Square< F >::type sqr(const F &f)
Definition: Square.h:13
void addDaughter(const CandidatePtr &)
add a daughter via a reference
Jet()
Default constructor.
Definition: Jet.h:36
math::XYZPoint Point
point in the space
Definition: Candidate.h:41
dbl *** dir
Definition: mlp_gen.cc:35
float mPileupEnergy
Definition: Jet.h:121
static Candidate::LorentzVector physicsP4(const Candidate::Point &newVertex, const Candidate &inParticle, const Candidate::Point &oldVertex=Candidate::Point(0, 0, 0))
virtual const LorentzVector & p4() const final
four-momentum Lorentz vector
Definition: LeafCandidate.h:99
virtual std::vector< const reco::Candidate * > getJetConstituentsQuick() const
quick list of constituents
long double T
static float physicsEta(float fZVertex, float fDetectorEta)
static function to convert detector eta to physics eta
virtual double py() const final
y coordinate of momentum vector
virtual const Candidate * daughter(size_type) const
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
*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
Definition: invegas.h:5
math::XYZPoint Point
point in the space
Definition: LeafCandidate.h:27
double p3[4]
Definition: TauolaWrapper.h:91