CMS 3D CMS Logo

LinkByRecHit.cc
Go to the documentation of this file.
4 #include "TMath.h"
5 
8 namespace {
9  const Vector2D one2D = BVector2D(1.0, 1.0).v;
10  const Vector2D fivepercent2D = BVector2D(0.05, 0.05).v;
11 } // namespace
12 
13 // to enable debugs
14 //#define PFLOW_DEBUG
15 
17  const reco::PFCluster& cluster,
18  bool isBrem,
19  bool debug) {
20 #ifdef PFLOW_DEBUG
21  if (debug)
22  std::cout << "entering test link by rechit function" << std::endl;
23 #endif
24 
25  //cluster position
26  auto clustereta = cluster.positionREP().Eta();
27  auto clusterphi = cluster.positionREP().Phi();
28  auto clusterZ = cluster.position().Z();
29 
30  bool barrel = false;
31  bool hcal = false;
32  // double distance = 999999.9;
33  double horesolscale = 1.0;
34 
35  //track extrapolation
36  const reco::PFTrajectoryPoint& atVertex = track.extrapolatedPoint(reco::PFTrajectoryPoint::ClosestApproach);
37  const reco::PFTrajectoryPoint& atECAL = track.extrapolatedPoint(reco::PFTrajectoryPoint::ECALShowerMax);
38 
39  //track at calo's
40  double tracketa = 999999.9;
41  double trackphi = 999999.9;
42  double track_X = 999999.9;
43  double track_Y = 999999.9;
44  double track_Z = 999999.9;
45  double dHEta = 0.;
46  double dHPhi = 0.;
47 
48  // Quantities at vertex
49  double trackPt = isBrem ? 999. : sqrt(atVertex.momentum().Vect().Perp2());
50  // double trackEta = isBrem ? 999. : atVertex.momentum().Vect().Eta();
51 
52  switch (cluster.layer()) {
54  barrel = true;
55  [[fallthrough]];
57 #ifdef PFLOW_DEBUG
58  if (debug)
59  std::cout << "Fetching Ecal Resolution Maps" << std::endl;
60 #endif
61  // did not reach ecal, cannot be associated with a cluster.
62  if (!atECAL.isValid())
63  return -1.;
64 
65  tracketa = atECAL.positionREP().Eta();
66  trackphi = atECAL.positionREP().Phi();
67  track_X = atECAL.position().X();
68  track_Y = atECAL.position().Y();
69  track_Z = atECAL.position().Z();
70 
71  /* distance
72  = std::sqrt( (track_X-clusterX)*(track_X-clusterX)
73  +(track_Y-clusterY)*(track_Y-clusterY)
74  +(track_Z-clusterZ)*(track_Z-clusterZ)
75  );
76 */
77  break;
78 
80  barrel = true;
81  [[fallthrough]];
83 #ifdef PFLOW_DEBUG
84  if (debug)
85  std::cout << "Fetching Hcal Resolution Maps" << std::endl;
86 #endif
87  if (isBrem) {
88  return -1.;
89  } else {
90  hcal = true;
91  const reco::PFTrajectoryPoint& atHCAL = track.extrapolatedPoint(reco::PFTrajectoryPoint::HCALEntrance);
92  const reco::PFTrajectoryPoint& atHCALExit = track.extrapolatedPoint(reco::PFTrajectoryPoint::HCALExit);
93  // did not reach hcal, cannot be associated with a cluster.
94  if (!atHCAL.isValid())
95  return -1.;
96 
97  // The link is computed between 0 and ~1 interaction length in HCAL
98  dHEta = atHCALExit.positionREP().Eta() - atHCAL.positionREP().Eta();
99  dHPhi = atHCALExit.positionREP().Phi() - atHCAL.positionREP().Phi();
100  if (dHPhi > M_PI)
101  dHPhi = dHPhi - 2. * M_PI;
102  else if (dHPhi < -M_PI)
103  dHPhi = dHPhi + 2. * M_PI;
104  tracketa = atHCAL.positionREP().Eta() + 0.1 * dHEta;
105  trackphi = atHCAL.positionREP().Phi() + 0.1 * dHPhi;
106  track_X = atHCAL.position().X();
107  track_Y = atHCAL.position().Y();
108  track_Z = atHCAL.position().Z();
109  /* distance
110  = -std::sqrt( (track_X-clusterX)*(track_X-clusterX)
111  +(track_Y-clusterY)*(track_Y-clusterY)
112  +(track_Z-clusterZ)*(track_Z-clusterZ)
113  );
114 */
115  }
116  break;
117 
119  barrel = true;
120 #ifdef PFLOW_DEBUG
121  if (debug)
122  std::cout << "Fetching HO Resolution Maps" << std::endl;
123 #endif
124  if (isBrem) {
125  return -1.;
126  } else {
127  hcal = true;
128  horesolscale = 1.15;
129  const reco::PFTrajectoryPoint& atHO = track.extrapolatedPoint(reco::PFTrajectoryPoint::HOLayer);
130  // did not reach ho, cannot be associated with a cluster.
131  if (!atHO.isValid())
132  return -1.;
133 
134  //
135  tracketa = atHO.positionREP().Eta();
136  trackphi = atHO.positionREP().Phi();
137  track_X = atHO.position().X();
138  track_Y = atHO.position().Y();
139  track_Z = atHO.position().Z();
140 
141  // Is this check really useful ?
142  if (fabs(track_Z) > 700.25)
143  return -1.;
144 
145 /* distance
146  = std::sqrt( (track_X-clusterX)*(track_X-clusterX)
147  +(track_Y-clusterY)*(track_Y-clusterY)
148  +(track_Z-clusterZ)*(track_Z-clusterZ)
149  );
150 */
151 #ifdef PFLOW_DEBUG
152 /* if( debug ) {
153  std::cout <<"dist "<<distance<<" "<<cluster.energy()<<" "<<cluster.layer()<<" "
154  <<track_X<<" "<<clusterX<<" "
155  <<track_Y<<" "<<clusterY<<" "
156  <<track_Z<<" "<<clusterZ<<std::endl;
157  }
158 */
159 #endif
160  }
161  break;
162 
163  case PFLayer::PS1:
164  [[fallthrough]];
165  case PFLayer::PS2:
166  //Note Alex: Nothing implemented for the
167  //PreShower (No resolution maps yet)
168 #ifdef PFLOW_DEBUG
169  if (debug)
170  std::cout << "No link by rechit possible for pre-shower yet!" << std::endl;
171 #endif
172  return -1.;
173  default:
174  return -1.;
175  }
176 
177  // Check that, if the cluster is in the endcap,
178  // 0) the track indeed points to the endcap at vertex (DISABLED)
179  // 1) the track extrapolation is in the endcap too !
180  // 2) the track is in the same end-cap !
181  // PJ - 10-May-09
182  if (!barrel) {
183  // if ( fabs(trackEta) < 1.0 ) return -1;
184  if (!hcal && fabs(track_Z) < 300.)
185  return -1.;
186  if (track_Z * clusterZ < 0.)
187  return -1.;
188  }
189  // Check that, if the cluster is in the barrel,
190  // 1) the track is in the barrel too !
191  if (barrel) {
192  if (!hcal && fabs(track_Z) > 300.)
193  return -1.;
194  }
195 
196  double dist = LinkByRecHit::computeDist(clustereta, clusterphi, tracketa, trackphi);
197 
198 #ifdef PFLOW_DEBUG
199  if (debug)
200  std::cout << "test link by rechit " << dist << " " << std::endl;
201  if (debug) {
202  std::cout << " clustereta " << clustereta << " clusterphi " << clusterphi << " tracketa " << tracketa
203  << " trackphi " << trackphi << std::endl;
204  }
205 #endif
206 
207  //Testing if Track can be linked by rechit to a cluster.
208  //A cluster can be linked to a track if the extrapolated position
209  //of the track to the ECAL ShowerMax/HCAL entrance falls within
210  //the boundaries of any cell that belongs to this cluster.
211 
212  const std::vector<reco::PFRecHitFraction>& fracs = cluster.recHitFractions();
213 
214  bool linkedbyrechit = false;
215  //loop rechits
216  for (unsigned int rhit = 0; rhit < fracs.size(); ++rhit) {
217  const reco::PFRecHitRef& rh = fracs[rhit].recHitRef();
218  double fraction = fracs[rhit].fraction();
219  if (fraction < 1E-4)
220  continue;
221  if (rh.isNull())
222  continue;
223 
224  //getting rechit center position
225  const auto& rechit_cluster = *rh;
226  const auto& posxyz = rechit_cluster.position();
227  const auto& posrep = rechit_cluster.positionREP();
228 
229  //getting rechit corners
230  const auto& cornersxyz = rechit_cluster.getCornersXYZ();
231  const auto& corners = rechit_cluster.getCornersREP();
232 
233  if (barrel || hcal) { // barrel case matching in eta/phi
234  // (and HCAL endcap too!)
235 
236  //rechit size determination
237  // blown up by 50% (HCAL) to 100% (ECAL) to include cracks & gaps
238  // also blown up to account for multiple scattering at low pt.
239  double rhsizeEta = std::abs(corners[3].eta() - corners[1].eta());
240  double rhsizePhi = std::abs(corners[3].phi() - corners[1].phi());
241  if (rhsizePhi > M_PI)
242  rhsizePhi = 2. * M_PI - rhsizePhi;
243  if (hcal) {
244  const double mult = horesolscale * (1.50 + 0.5 / fracs.size());
245  rhsizeEta = rhsizeEta * mult + 0.2 * std::abs(dHEta);
246  rhsizePhi = rhsizePhi * mult + 0.2 * fabs(dHPhi);
247 
248  } else {
249  const double mult = 2.00 + 1.0 / (fracs.size() * std::min(1., 0.5 * trackPt));
250  rhsizeEta *= mult;
251  rhsizePhi *= mult;
252  }
253 
254 #ifdef PFLOW_DEBUG
255  if (debug) {
256  std::cout << rhit << " Hcal RecHit=" << posrep.Eta() << " " << posrep.Phi() << " " << rechit_cluster.energy()
257  << std::endl;
258  for (unsigned jc = 0; jc < 4; ++jc)
259  std::cout << "corners " << jc << " " << corners[jc].eta() << " " << corners[jc].phi() << std::endl;
260 
261  std::cout << "RecHit SizeEta=" << rhsizeEta << " SizePhi=" << rhsizePhi << std::endl;
262  }
263 #endif
264 
265  //distance track-rechit center
266  // const math::XYZPoint& posxyz
267  // = rechit_cluster.position();
268  double deta = fabs(posrep.eta() - tracketa);
269  double dphi = fabs(posrep.phi() - trackphi);
270  if (dphi > M_PI)
271  dphi = 2. * M_PI - dphi;
272 
273 #ifdef PFLOW_DEBUG
274  if (debug) {
275  std::cout << "distance=" << deta << " " << dphi << " ";
276  if (deta < (0.5 * rhsizeEta) && dphi < (0.5 * rhsizePhi))
277  std::cout << " link here !" << std::endl;
278  else
279  std::cout << std::endl;
280  }
281 #endif
282 
283  if (deta < (0.5 * rhsizeEta) && dphi < (0.5 * rhsizePhi)) {
284  linkedbyrechit = true;
285  break;
286  }
287  } else { //ECAL & PS endcap case, matching in X,Y
288 
289 #ifdef PFLOW_DEBUG
290  if (debug) {
291  const auto& posxyz = rechit_cluster.position();
292 
293  std::cout << "RH " << posxyz.x() << " " << posxyz.y() << std::endl;
294 
295  std::cout << "TRACK " << track_X << " " << track_Y << std::endl;
296  }
297 #endif
298 
299  double x[5];
300  double y[5];
301 
302  for (unsigned jc = 0; jc < 4; ++jc) {
303  const auto& cornerposxyz = cornersxyz[jc];
304  const double mult = (1.00 + 0.50 / (fracs.size() * std::min(1., 0.5 * trackPt)));
305  x[3 - jc] = cornerposxyz.x() + (cornerposxyz.x() - posxyz.x()) * mult;
306  y[3 - jc] = cornerposxyz.y() + (cornerposxyz.y() - posxyz.y()) * mult;
307 
308 #ifdef PFLOW_DEBUG
309  if (debug) {
310  std::cout << "corners " << jc << " " << cornerposxyz.x() << " " << cornerposxyz.y() << std::endl;
311  }
312 #endif
313  } //loop corners
314 
315  //need to close the polygon in order to
316  //use the TMath::IsInside fonction from root lib
317  x[4] = x[0];
318  y[4] = y[0];
319 
320  //Check if the extrapolation point of the track falls
321  //within the rechit boundaries
322  bool isinside = TMath::IsInside(track_X, track_Y, 5, x, y);
323 
324  if (isinside) {
325  linkedbyrechit = true;
326  break;
327  }
328  } //
329 
330  } //loop rechits
331 
332  if (linkedbyrechit) {
333 #ifdef PFLOW_DEBUG
334  if (debug)
335  std::cout << "Track and Cluster LINKED BY RECHIT" << std::endl;
336 #endif
337  /*
338  //if ( distance > 40. || distance < -100. )
339  double clusterr = std::sqrt(clusterX*clusterX+clusterY*clusterY);
340  double trackr = std::sqrt(track_X*track_X+track_Y*track_Y);
341  if ( distance > 40. )
342  std::cout << "Distance = " << distance
343  << ", Barrel/Hcal/Brem ? " << barrel << " " << hcal << " " << isBrem << std::endl
344  << " Cluster " << clusterr << " " << clusterZ << " " << clusterphi << " " << clustereta << std::endl
345  << " Track " << trackr << " " << track_Z << " " << trackphi << " " << tracketa << std::endl;
346  if ( !barrel && fabs(trackEta) < 1.0 ) {
347  double clusterr = std::sqrt(clusterX*clusterX+clusterY*clusterY);
348  double trackr = std::sqrt(track_X*track_X+track_Y*track_Y);
349  std::cout << "TrackEta/Pt = " << trackEta << " " << trackPt << ", distance = " << distance << std::endl
350  << ", Barrel/Hcal/Brem ? " << barrel << " " << hcal << " " << isBrem << std::endl
351  << " Cluster " << clusterr << " " << clusterZ << " " << clusterphi << " " << clustereta << std::endl
352  << " Track " << trackr << " " << track_Z << " " << trackphi << " " << tracketa << " " << trackEta << " " << trackPt << std::endl;
353  }
354  */
355  return dist;
356  } else {
357  return -1.;
358  }
359 }
360 
362  const reco::PFCluster& clusterPS,
363  bool debug) {
364  // 0.19 <-> strip_pitch
365  // 6.1 <-> strip_length
366  static const double resPSpitch = 0.19 / sqrt(12.);
367  static const double resPSlength = 6.1 / sqrt(12.);
368 
369  // Check that clusterECAL is in ECAL endcap and that clusterPS is a preshower cluster
370  if (clusterECAL.layer() != PFLayer::ECAL_ENDCAP ||
371  (clusterPS.layer() != PFLayer::PS1 && clusterPS.layer() != PFLayer::PS2))
372  return -1.;
373 
374 #ifdef PFLOW_DEBUG
375  if (debug)
376  std::cout << "entering test link by rechit function for ECAL and PS" << std::endl;
377 #endif
378 
379  //ECAL cluster position
380  double zECAL = clusterECAL.position().Z();
381  double xECAL = clusterECAL.position().X();
382  double yECAL = clusterECAL.position().Y();
383 
384  // PS cluster position, extrapolated to ECAL
385  double zPS = clusterPS.position().Z();
386  double xPS = clusterPS.position().X(); //* zECAL/zPS;
387  double yPS = clusterPS.position().Y(); //* zECAL/zPS;
388  // MDN jan09 : check that zEcal and zPs have the same sign
389  if (zECAL * zPS < 0.)
390  return -1.;
391  double deltaX = 0.;
392  double deltaY = 0.;
393  double sqr12 = std::sqrt(12.);
394  switch (clusterPS.layer()) {
395  case PFLayer::PS1:
396  // vertical strips, measure x with pitch precision
397  deltaX = resPSpitch * sqr12;
398  deltaY = resPSlength * sqr12;
399  break;
400  case PFLayer::PS2:
401  // horizontal strips, measure y with pitch precision
402  deltaY = resPSpitch * sqr12;
403  deltaX = resPSlength * sqr12;
404  break;
405  default:
406  break;
407  }
408 
409  auto deltaXY = BVector2D(deltaX, deltaY).v * 0.5;
410  // Get the rechits
411  auto zCorr = zPS / zECAL;
412  const std::vector<reco::PFRecHitFraction>& fracs = clusterECAL.recHitFractions();
413  bool linkedbyrechit = false;
414  //loop rechits
415  for (unsigned int rhit = 0; rhit < fracs.size(); ++rhit) {
416  const auto& rh = fracs[rhit].recHitRef();
417  double fraction = fracs[rhit].fraction();
418  if (fraction < 1E-4)
419  continue;
420  if (rh.isNull())
421  continue;
422 
423  //getting rechit center position
424  const reco::PFRecHit& rechit_cluster = *rh;
425 
426  //getting rechit corners
427  auto const& corners = rechit_cluster.getCornersXYZ();
428 
429  auto posxy = BVector2D(rechit_cluster.position().xy()).v * zCorr;
430 #ifdef PFLOW_DEBUG
431  if (debug) {
432  std::cout << "Ecal rechit " << posxy.x() << " " << posxy.y() << std::endl;
433  std::cout << "PS cluster " << xPS << " " << yPS << std::endl;
434  }
435 #endif
436 
437  double x[5];
438  double y[5];
439  for (unsigned jc = 0; jc < 4; ++jc) {
440  // corner position projected onto the preshower
441  Vector2D cornerpos = BVector2D(corners[jc].basicVector().xy()).v * zCorr;
442  auto dist = (cornerpos - posxy);
443  auto adist =
444  BVector2D(std::abs(dist[0]), std::abs(dist[1])).v; // all this beacuse icc does not support vector extension
445  // Inflate the size by the size of the PS strips, and by 5% to include ECAL cracks.
446  auto xy = cornerpos + (dist * (fivepercent2D + one2D / adist) * deltaXY);
447  /*
448  Vector2D xy(
449  cornerpos.x() + (cornerpos.x()-posxy.x()) * (0.05 +1.0/std::abs((cornerpos.x()-posxy.x()))*deltaXY.x()),
450  cornerpos.y() + (cornerpos.y()-posxy.y()) * (0.05 +1.0/std::abs((cornerpos.y()-posxy.y()))*deltaXY.y())
451  );
452  */
453  x[3 - jc] = xy[0];
454  y[3 - jc] = xy[1];
455 
456 #ifdef PFLOW_DEBUG
457  if (debug) {
458  std::cout << "corners " << jc << " " << cornerpos.x() << " " << x[3 - jc] << " " << cornerpos.y() << " "
459  << y[3 - jc] << std::endl;
460  }
461 #endif
462  } //loop corners
463 
464  //need to close the polygon in order to
465  //use the TMath::IsInside fonction from root lib
466  x[4] = x[0];
467  y[4] = y[0];
468 
469  //Check if the extrapolation point of the track falls
470  //within the rechit boundaries
471  bool isinside = TMath::IsInside(xPS, yPS, 5, x, y);
472 
473  if (isinside) {
474  linkedbyrechit = true;
475  break;
476  }
477 
478  } //loop rechits
479 
480  if (linkedbyrechit) {
481 #ifdef PFLOW_DEBUG
482  if (debug)
483  std::cout << "Cluster PS and Cluster ECAL LINKED BY RECHIT" << std::endl;
484 #endif
485  constexpr double scale = 1. / 1000.;
486  double dist = computeDist(xECAL * scale, yECAL * scale, xPS * scale, yPS * scale, false);
487  return dist;
488  } else {
489  return -1.;
490  }
491 }
492 
494  const reco::PFCluster& clusterHFHAD,
495  bool debug) {
496  const auto& posxyzEM = clusterHFEM.position();
497  const auto& posxyzHAD = clusterHFHAD.position();
498 
499  double dX = posxyzEM.X() - posxyzHAD.X();
500  double dY = posxyzEM.Y() - posxyzHAD.Y();
501  double sameZ = posxyzEM.Z() * posxyzHAD.Z();
502 
503  if (sameZ < 0)
504  return -1.;
505 
506  double dist2 = dX * dX + dY * dY;
507 
508  if (dist2 < 0.1) {
509  // less than one mm
510  double dist = sqrt(dist2);
511  return dist;
512  ;
513  } else
514  return -1.;
515 }
516 
517 double LinkByRecHit::computeDist(double eta1, double phi1, double eta2, double phi2, bool etaPhi) {
518  auto phicor = etaPhi ? normalizedPhi(phi1 - phi2) : phi1 - phi2;
519  auto etadiff = eta1 - eta2;
520 
521  // double chi2 =
522  // (eta1 - eta2)*(eta1 - eta2) / ( reta1*reta1+ reta2*reta2 ) +
523  // phicor*phicor / ( rphi1*rphi1+ rphi2*rphi2 );
524 
525  return std::sqrt(etadiff * etadiff + phicor * phicor);
526 }
BVector2D
Basic2DVector< double > BVector2D
Definition: LinkByRecHit.cc:6
reco::PFRecHit::getCornersXYZ
CornersVec const & getCornersXYZ() const
rechit corners
Definition: PFRecHit.h:122
DDAxes::y
Reference_intrackfit_cff.barrel
list barrel
Definition: Reference_intrackfit_cff.py:37
reco::PFTrajectoryPoint::momentum
const math::XYZTLorentzVector & momentum() const
4-momenta quadrivector
Definition: PFTrajectoryPoint.h:109
Basic3DVector::xy
Basic2DVector< T > xy() const
Definition: extBasic3DVector.h:104
reco::PFCluster::layer
PFLayer::Layer layer() const
cluster layer, see PFLayer.h in this directory
Definition: PFCluster.cc:100
min
T min(T a, T b)
Definition: MathUtil.h:58
hcal
Definition: ConfigurationDatabase.cc:13
edm::Ref::isNull
bool isNull() const
Checks for null.
Definition: Ref.h:235
reco::PFTrajectoryPoint::HCALExit
HCAL exit.
Definition: PFTrajectoryPoint.h:50
gather_cfg.cout
cout
Definition: gather_cfg.py:144
HLT_2018_cff.eta1
eta1
Definition: HLT_2018_cff.py:8220
PFLayer::HCAL_ENDCAP
Definition: PFLayer.h:37
reco::PFCluster::recHitFractions
const std::vector< reco::PFRecHitFraction > & recHitFractions() const
vector of rechit fractions
Definition: PFCluster.h:69
Basic2DVector::v
Vec2< T > v
Definition: extBasic2DVector.h:156
reco::PFTrajectoryPoint::HOLayer
HO layer.
Definition: PFTrajectoryPoint.h:52
LinkByRecHit::testTrackAndClusterByRecHit
static double testTrackAndClusterByRecHit(const reco::PFRecTrack &track, const reco::PFCluster &cluster, bool isBrem=false, bool debug=false)
Definition: LinkByRecHit.cc:16
DDAxes::x
findQualityFiles.v
v
Definition: findQualityFiles.py:179
LinkByRecHit::testECALAndPSByRecHit
static double testECALAndPSByRecHit(const reco::PFCluster &clusterECAL, const reco::PFCluster &clusterPS, bool debug=false)
Definition: LinkByRecHit.cc:361
PFRecHit.h
edm::Ref< PFRecHitCollection >
PFLayer::ECAL_BARREL
Definition: PFLayer.h:33
reco::PFTrajectoryPoint::positionREP
const REPPoint & positionREP() const
trajectory position in (rho, eta, phi) base
Definition: PFTrajectoryPoint.h:103
debug
#define debug
Definition: HDRShower.cc:19
PFLayer::PS1
Definition: PFLayer.h:31
PFLayer::HCAL_BARREL2
Definition: PFLayer.h:36
PVValHelper::eta
Definition: PVValidationHelpers.h:69
reco::PFTrajectoryPoint::ECALShowerMax
Definition: PFTrajectoryPoint.h:46
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
PFLayer::HCAL_BARREL1
Definition: PFLayer.h:35
normalizedPhi
constexpr T normalizedPhi(T phi)
Definition: normalizedPhi.h:8
reco::PFCluster::positionREP
const REPPoint & positionREP() const
cluster position: rho, eta, phi
Definition: PFCluster.h:96
HLT_2018_cff.eta2
eta2
Definition: HLT_2018_cff.py:8221
geometryCSVtoXML.xy
xy
Definition: geometryCSVtoXML.py:19
Basic2DVector< double >
Scenarios_cff.scale
scale
Definition: Scenarios_cff.py:2186
reco::PFTrajectoryPoint::position
const math::XYZPoint & position() const
cartesian position (x, y, z)
Definition: PFTrajectoryPoint.h:100
Vector2D
Basic2DVector< double >::MathVector Vector2D
Definition: LinkByRecHit.cc:7
LinkByRecHit.h
reco::PFTrajectoryPoint::HCALEntrance
HCAL front face.
Definition: PFTrajectoryPoint.h:48
normalizedPhi.h
M_PI
#define M_PI
Definition: BXVectorInputProducer.cc:50
LinkByRecHit::testHFEMAndHFHADByRecHit
static double testHFEMAndHFHADByRecHit(const reco::PFCluster &clusterHFEM, const reco::PFCluster &clusterHFHAD, bool debug=false)
test association between HFEM and HFHAD, by rechit
Definition: LinkByRecHit.cc:493
reco::PFTrajectoryPoint::isValid
bool isValid() const
is this point valid ?
Definition: PFTrajectoryPoint.h:84
reco::CaloCluster::position
const math::XYZPoint & position() const
cluster centroid position
Definition: CaloCluster.h:154
DDAxes::phi
reco::PFRecTrack
reconstructed track used as an input to particle flow
Definition: PFRecTrack.h:22
reco::PFTrajectoryPoint
A PFTrack holds several trajectory points, which basically contain the position and momentum of a tra...
Definition: PFTrajectoryPoint.h:26
reco::PFCluster
Particle flow cluster, see clustering algorithm in PFClusterAlgo.
Definition: PFCluster.h:46
reco::PFRecHit::position
PositionType const & position() const
rechit cell centre x, y, z
Definition: PFRecHit.h:117
VarParsing.mult
mult
Definition: VarParsing.py:659
reco::PFRecHit
Particle flow rechit (rechit + geometry and topology information). See clustering algorithm in PFClus...
Definition: PFRecHit.h:31
HLT_2018_cff.track
track
Definition: HLT_2018_cff.py:10352
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
reco::PFTrajectoryPoint::ClosestApproach
Point of closest approach from beam axis (initial point in the case of PFSimParticle)
Definition: PFTrajectoryPoint.h:36
PFLayer::ECAL_ENDCAP
Definition: PFLayer.h:32
LinkByRecHit::computeDist
static double computeDist(double eta1, double phi1, double eta2, double phi2, bool etaPhi=true)
computes a chisquare
Definition: LinkByRecHit.cc:517
PFLayer::PS2
Definition: PFLayer.h:30
listHistos.trackPt
trackPt
Definition: listHistos.py:120
HLT_2018_cff.fraction
fraction
Definition: HLT_2018_cff.py:51317