CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
FFTGenericScaleCalculator.cc
Go to the documentation of this file.
1 #include <cassert>
2 #include <cfloat>
3 
7 
8 #define int_param(varname) m_ ## varname (ps.getParameter< int >( #varname ))
9 
10 #define check_param(varname) if ((m_ ## varname) >= 0) {\
11  if ((m_ ## varname) >= nFactors)\
12  throw cms::Exception("FFTJetBadConfig")\
13  << "In FFTGenericScaleCalculator constructor: "\
14  << "out of range mapping for variable \""\
15  << #varname << "\"" << std::endl;\
16  mask[(m_ ## varname)] = 1;\
17  ++dim;\
18  }
19 
20 
21 static inline double delPhi(const double phi1, const double phi2)
22 {
23  double dphi = phi1 - phi2;
24  if (dphi > M_PI)
25  dphi -= 2.0*M_PI;
26  else if (dphi < -M_PI)
27  dphi += 2.0*M_PI;
28  return dphi;
29 }
30 
31 
33  : m_factors(ps.getParameter<std::vector<double> >("factors")),
34  m_minLog(ps.getUntrackedParameter<double>("minLog", -800.0)),
35  int_param(eta),
36  int_param(phi),
37  int_param(pt),
38  int_param(logPt),
39  int_param(mass),
40  int_param(logMass),
42  int_param(logEnergy),
43  int_param(gamma),
44  int_param(logGamma),
46  int_param(ncells),
47  int_param(etSum),
48  int_param(etaWidth),
49  int_param(phiWidth),
50  int_param(averageWidth),
51  int_param(widthRatio),
52  int_param(etaPhiCorr),
53  int_param(fuzziness),
54  int_param(convergenceDistance),
55  int_param(recoScale),
56  int_param(recoScaleRatio),
57  int_param(membershipFactor),
58  int_param(magnitude),
59  int_param(logMagnitude),
60  int_param(magS1),
61  int_param(LogMagS1),
62  int_param(magS2),
63  int_param(LogMagS2),
64  int_param(driftSpeed),
65  int_param(magSpeed),
66  int_param(lifetime),
68  int_param(logScale),
69  int_param(nearestNeighborDistance),
70  int_param(clusterRadius),
71  int_param(clusterSeparation),
72  int_param(dRFromJet),
73  int_param(LaplacianS1),
74  int_param(LaplacianS2),
75  int_param(LaplacianS3),
76  int_param(HessianS2),
77  int_param(HessianS4),
78  int_param(HessianS6),
79  int_param(nConstituents),
80  int_param(aveConstituentPt),
81  int_param(logAveConstituentPt),
82  int_param(constituentPtDistribution),
83  int_param(constituentEtaPhiSpread),
84  int_param(chargedHadronEnergyFraction),
85  int_param(neutralHadronEnergyFraction),
86  int_param(photonEnergyFraction),
87  int_param(electronEnergyFraction),
88  int_param(muonEnergyFraction),
89  int_param(HFHadronEnergyFraction),
90  int_param(HFEMEnergyFraction),
91  int_param(chargedHadronMultiplicity),
92  int_param(neutralHadronMultiplicity),
93  int_param(photonMultiplicity),
94  int_param(electronMultiplicity),
95  int_param(muonMultiplicity),
96  int_param(HFHadronMultiplicity),
97  int_param(HFEMMultiplicity),
98  int_param(chargedEmEnergyFraction),
99  int_param(chargedMuEnergyFraction),
100  int_param(neutralEmEnergyFraction),
101  int_param(EmEnergyFraction),
102  int_param(chargedMultiplicity),
103  int_param(neutralMultiplicity)
104 {
105  const int nFactors = m_factors.size();
106  std::vector<int> mask(nFactors, 0);
107  int dim = 0;
108 
109  check_param(eta);
110  check_param(phi);
111  check_param(pt);
112  check_param(logPt);
113  check_param(mass);
114  check_param(logMass);
116  check_param(logEnergy);
117  check_param(gamma);
118  check_param(logGamma);
120  check_param(ncells);
121  check_param(etSum);
122  check_param(etaWidth);
123  check_param(phiWidth);
124  check_param(averageWidth);
125  check_param(widthRatio);
126  check_param(etaPhiCorr);
127  check_param(fuzziness);
128  check_param(convergenceDistance);
129  check_param(recoScale);
130  check_param(recoScaleRatio);
131  check_param(membershipFactor);
132  check_param(magnitude);
133  check_param(logMagnitude);
134  check_param(magS1);
135  check_param(LogMagS1);
136  check_param(magS2);
137  check_param(LogMagS2);
138  check_param(driftSpeed);
139  check_param(magSpeed);
140  check_param(lifetime);
142  check_param(logScale);
143  check_param(nearestNeighborDistance);
144  check_param(clusterRadius);
145  check_param(clusterSeparation);
146  check_param(dRFromJet);
147  check_param(LaplacianS1);
148  check_param(LaplacianS2);
149  check_param(LaplacianS3);
150  check_param(HessianS2);
151  check_param(HessianS4);
152  check_param(HessianS6);
153  check_param(nConstituents);
154  check_param(aveConstituentPt);
155  check_param(logAveConstituentPt);
156  check_param(constituentPtDistribution);
157  check_param(constituentEtaPhiSpread);
158  check_param(chargedHadronEnergyFraction);
159  check_param(neutralHadronEnergyFraction);
160  check_param(photonEnergyFraction);
161  check_param(electronEnergyFraction);
162  check_param(muonEnergyFraction);
163  check_param(HFHadronEnergyFraction);
164  check_param(HFEMEnergyFraction);
165  check_param(chargedHadronMultiplicity);
166  check_param(neutralHadronMultiplicity);
167  check_param(photonMultiplicity);
168  check_param(electronMultiplicity);
169  check_param(muonMultiplicity);
170  check_param(HFHadronMultiplicity);
171  check_param(HFEMMultiplicity);
172  check_param(chargedEmEnergyFraction);
173  check_param(chargedMuEnergyFraction);
174  check_param(neutralEmEnergyFraction);
175  check_param(EmEnergyFraction);
176  check_param(chargedMultiplicity);
177  check_param(neutralMultiplicity);
178 
179  if (dim != nFactors)
180  throw cms::Exception("FFTJetBadConfig")
181  << "In FFTGenericScaleCalculator constructor: "
182  << "incompatible number of scaling factors: expected "
183  << dim << ", got " << nFactors << std::endl;
184  for (int i=0; i<nFactors; ++i)
185  if (mask[i] == 0)
186  throw cms::Exception("FFTJetBadConfig")
187  << "In FFTGenericScaleCalculator constructor: "
188  << "variable number " << i << " is not mapped" << std::endl;
189 }
190 
192  const reco::Jet& jet, const reco::FFTJet<float>& fftJet,
194  double* buf, const unsigned dim) const
195 {
196  // Verify that the input is reasonable
197  if (dim != m_factors.size())
198  throw cms::Exception("FFTJetBadConfig")
199  << "In FFTGenericScaleCalculator::mapFFTJet: "
200  << "incompatible table dimensionality: expected "
201  << m_factors.size() << ", got " << dim << std::endl;
202  if (dim)
203  assert(buf);
204  else
205  return;
206 
207  // Go over all variables and map them as configured.
208  // Variables from the "current" Lorentz vector.
209  if (m_eta >= 0)
210  buf[m_eta] = current.eta();
211 
212  if (m_phi >= 0)
213  buf[m_phi] = current.phi();
214 
215  if (m_pt >= 0)
216  buf[m_pt] = current.pt();
217 
218  if (m_logPt >= 0)
219  buf[m_logPt] = f_safeLog(current.pt());
220 
221  if (m_mass >= 0)
222  buf[m_mass] = current.M();
223 
224  if (m_logMass >= 0)
225  buf[m_mass] = f_safeLog(current.M());
226 
227  if (m_energy >= 0)
228  buf[m_energy] = current.e();
229 
230  if (m_logEnergy >= 0)
231  buf[m_energy] = f_safeLog(current.e());
232 
233  if (m_gamma >= 0)
234  {
235  const double m = current.M();
236  if (m > 0.0)
237  buf[m_gamma] = current.e()/m;
238  else
239  buf[m_gamma] = DBL_MAX;
240  }
241 
242  if (m_logGamma >= 0)
243  {
244  const double m = current.M();
245  if (m > 0.0)
246  buf[m_gamma] = current.e()/m;
247  else
248  buf[m_gamma] = DBL_MAX;
249  buf[m_gamma] = log(buf[m_gamma]);
250  }
251 
252  // Variables from fftJet
253  if (m_pileup >= 0)
254  buf[m_pileup] = fftJet.f_pileup().pt();
255 
256  if (m_ncells >= 0)
257  buf[m_ncells] = fftJet.f_ncells();
258 
259  if (m_etSum >= 0)
260  buf[m_etSum] = fftJet.f_etSum();
261 
262  if (m_etaWidth >= 0)
263  buf[m_etaWidth] = fftJet.f_etaWidth();
264 
265  if (m_phiWidth >= 0)
266  buf[m_phiWidth] = fftJet.f_phiWidth();
267 
268  if (m_averageWidth >= 0)
269  {
270  const double etaw = fftJet.f_etaWidth();
271  const double phiw = fftJet.f_phiWidth();
272  buf[m_averageWidth] = sqrt(etaw*etaw + phiw*phiw);
273  }
274 
275  if (m_widthRatio >= 0)
276  {
277  const double etaw = fftJet.f_etaWidth();
278  const double phiw = fftJet.f_phiWidth();
279  if (phiw > 0.0)
280  buf[m_widthRatio] = etaw/phiw;
281  else
282  buf[m_widthRatio] = DBL_MAX;
283  }
284 
285  if (m_etaPhiCorr >= 0)
286  buf[m_etaPhiCorr] = fftJet.f_etaPhiCorr();
287 
288  if (m_fuzziness >= 0)
289  buf[m_fuzziness] = fftJet.f_fuzziness();
290 
291  if (m_convergenceDistance >= 0)
293 
294  if (m_recoScale >= 0)
295  buf[m_recoScale] = fftJet.f_recoScale();
296 
297  if (m_recoScaleRatio >= 0)
298  buf[m_recoScaleRatio] = fftJet.f_recoScaleRatio();
299 
300  if (m_membershipFactor >= 0)
301  buf[m_membershipFactor] = fftJet.f_membershipFactor();
302 
303  // Get most often used precluster quantities
304  const reco::PattRecoPeak<float>& preclus = fftJet.f_precluster();
305  const double scale = preclus.scale();
306 
307  if (m_magnitude >= 0)
308  buf[m_magnitude] = preclus.magnitude();
309 
310  if (m_logMagnitude >= 0)
311  buf[m_logMagnitude] = f_safeLog(preclus.magnitude());
312 
313  if (m_magS1 >= 0)
314  buf[m_magS1] = preclus.magnitude()*scale;
315 
316  if (m_LogMagS1 >= 0)
317  buf[m_LogMagS1] = f_safeLog(preclus.magnitude()*scale);
318 
319  if (m_magS2 >= 0)
320  buf[m_magS2] = preclus.magnitude()*scale*scale;
321 
322  if (m_LogMagS2 >= 0)
323  buf[m_LogMagS2] = f_safeLog(preclus.magnitude()*scale*scale);
324 
325  if (m_driftSpeed >= 0)
326  buf[m_driftSpeed] = preclus.driftSpeed();
327 
328  if (m_magSpeed >= 0)
329  buf[m_magSpeed] = preclus.magSpeed();
330 
331  if (m_lifetime >= 0)
332  buf[m_lifetime] = preclus.lifetime();
333 
334  if (m_scale >= 0)
335  buf[m_scale] = scale;
336 
337  if (m_logScale >= 0)
338  buf[m_logScale] = f_safeLog(scale);
339 
340  if (m_nearestNeighborDistance >= 0)
342 
343  if (m_clusterRadius >= 0)
344  buf[m_clusterRadius] = preclus.clusterRadius();
345 
346  if (m_clusterSeparation >= 0)
347  buf[m_clusterSeparation] = preclus.clusterSeparation();
348 
349  if (m_dRFromJet >= 0)
350  {
351  const double deta = preclus.eta() - current.eta();
352  const double dphi = delPhi(preclus.phi(), current.phi());
353  buf[m_dRFromJet] = sqrt(deta*deta + dphi*dphi);
354  }
355 
356  if (m_LaplacianS1 >= 0)
357  {
358  double h[3];
359  preclus.hessian(h);
360  buf[m_LaplacianS1] = fabs(h[0] + h[2])*scale;
361  }
362 
363  if (m_LaplacianS2 >= 0)
364  {
365  double h[3];
366  preclus.hessian(h);
367  buf[m_LaplacianS2] = fabs(h[0] + h[2])*scale*scale;
368  }
369 
370  if (m_LaplacianS3 >= 0)
371  {
372  double h[3];
373  preclus.hessian(h);
374  buf[m_LaplacianS3] = fabs(h[0] + h[2])*scale*scale*scale;
375  }
376 
377  if (m_HessianS2 >= 0)
378  {
379  double h[3];
380  preclus.hessian(h);
381  buf[m_HessianS2] = fabs(h[0]*h[2] - h[1]*h[1])*scale*scale;
382  }
383 
384  if (m_HessianS4 >= 0)
385  {
386  double h[3];
387  preclus.hessian(h);
388  buf[m_HessianS4] = fabs(h[0]*h[2] - h[1]*h[1])*pow(scale, 4);
389  }
390 
391  if (m_HessianS6 >= 0)
392  {
393  double h[3];
394  preclus.hessian(h);
395  buf[m_HessianS6] = fabs(h[0]*h[2] - h[1]*h[1])*pow(scale, 6);
396  }
397 
398  // Variables from reco::Jet
399  if (m_nConstituents >= 0)
400  buf[m_nConstituents] = jet.nConstituents();
401 
402  if (m_aveConstituentPt >= 0)
403  buf[m_aveConstituentPt] = current.pt()/jet.nConstituents();
404 
405  if (m_logAveConstituentPt >= 0)
406  buf[m_logAveConstituentPt] = f_safeLog(current.pt()/jet.nConstituents());
407 
410 
411  if (m_constituentEtaPhiSpread >= 0)
413 
414  // Variables from reco::PFJet
415  const reco::PFJet* pfjet = dynamic_cast<const reco::PFJet*>(&jet);
416  if (pfjet)
417  {
418  // Particle flow jet
421 
424 
425  if (m_photonEnergyFraction >= 0)
427 
428  if (m_electronEnergyFraction >= 0)
430 
431  if (m_muonEnergyFraction >= 0)
433 
434  if (m_HFHadronEnergyFraction >= 0)
436 
437  if (m_HFEMEnergyFraction >= 0)
439 
442 
445 
446  if (m_photonMultiplicity >= 0)
448 
449  if (m_electronMultiplicity >= 0)
451 
452  if (m_muonMultiplicity >= 0)
453  buf[m_muonMultiplicity] = pfjet->muonMultiplicity();
454 
455  if (m_HFHadronMultiplicity >= 0)
457 
458  if (m_HFEMMultiplicity >= 0)
459  buf[m_HFEMMultiplicity] = pfjet->HFEMMultiplicity();
460 
461  if (m_chargedEmEnergyFraction >= 0)
463 
464  if (m_chargedMuEnergyFraction >= 0)
466 
467  if (m_neutralEmEnergyFraction >= 0)
469 
470  if (m_EmEnergyFraction >= 0)
472  pfjet->chargedEmEnergyFraction();
473 
474  if (m_chargedMultiplicity >= 0)
476 
477  if (m_neutralMultiplicity >= 0)
479  }
480  else
481  {
482  // Not a particle flow jet
485  m_photonEnergyFraction >= 0 ||
487  m_muonEnergyFraction >= 0 ||
489  m_HFEMEnergyFraction >= 0 ||
492  m_photonMultiplicity >= 0 ||
493  m_electronMultiplicity >= 0 ||
494  m_muonMultiplicity >= 0 ||
495  m_HFHadronMultiplicity >= 0 ||
496  m_HFEMMultiplicity >= 0 ||
500  m_EmEnergyFraction >= 0 ||
501  m_chargedMultiplicity >= 0 ||
503  throw cms::Exception("FFTJetBadConfig")
504  << "In FFTGenericScaleCalculator::mapFFTJet: "
505  << "this configuration is valid for particle flow jets only"
506  << std::endl;
507  }
508 
509  // Apply the scaling factors
510  for (unsigned i=0; i<dim; ++i)
511  buf[i] *= m_factors[i];
512 }
Real scale() const
Definition: PattRecoPeak.h:63
int i
Definition: DBlmapReader.cc:9
int photonMultiplicity() const
photonMultiplicity
Definition: PFJet.h:127
Real eta() const
Definition: PattRecoPeak.h:57
Real phi() const
Definition: PattRecoPeak.h:58
Real f_convergenceDistance() const
Definition: FFTJet.h:72
float chargedHadronEnergyFraction() const
chargedHadronEnergyFraction
Definition: PFJet.h:96
Base class for all types of Jets.
Definition: Jet.h:20
Real driftSpeed() const
Definition: PattRecoPeak.h:60
float HFEMEnergyFraction() const
HFEMEnergyFraction.
Definition: PFJet.h:120
T eta() const
int chargedMultiplicity() const
chargedMultiplicity
Definition: PFJet.h:151
float photonEnergyFraction() const
photonEnergyFraction
Definition: PFJet.h:104
Jets made from PFObjects.
Definition: PFJet.h:21
Real f_membershipFactor() const
Definition: FFTJet.h:75
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
static double delPhi(const double phi1, const double phi2)
float neutralEmEnergyFraction() const
neutralEmEnergyFraction
Definition: PFJet.h:148
FFTGenericScaleCalculator(const edm::ParameterSet &ps)
Real f_etSum() const
Definition: FFTJet.h:65
Real f_phiWidth() const
Definition: FFTJet.h:69
Real nearestNeighborDistance() const
Definition: PattRecoPeak.h:64
Real f_recoScale() const
Definition: FFTJet.h:73
Real lifetime() const
Definition: PattRecoPeak.h:62
T sqrt(T t)
Definition: SSEVec.h:48
Real f_ncells() const
Definition: FFTJet.h:64
int neutralHadronMultiplicity() const
neutralHadronMultiplicity
Definition: PFJet.h:125
Real clusterSeparation() const
Definition: PattRecoPeak.h:66
float neutralHadronEnergyFraction() const
neutralHadronEnergyFraction
Definition: PFJet.h:100
float constituentEtaPhiSpread() const
Definition: Jet.cc:394
int neutralMultiplicity() const
neutralMultiplicity
Definition: PFJet.h:153
Real magSpeed() const
Definition: PattRecoPeak.h:61
const PattRecoPeak< Real > & f_precluster() const
Definition: FFTJet.h:61
Real f_etaWidth() const
Definition: FFTJet.h:68
float constituentPtDistribution() const
Definition: Jet.cc:369
float chargedEmEnergyFraction() const
chargedEmEnergyFraction
Definition: PFJet.h:140
#define M_PI
Definition: BFit3D.cc:3
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
float HFHadronEnergyFraction() const
HFHadronEnergyFraction.
Definition: PFJet.h:116
float electronEnergyFraction() const
electronEnergyFraction
Definition: PFJet.h:108
#define int_param(varname)
int chargedHadronMultiplicity() const
chargedHadronMultiplicity
Definition: PFJet.h:123
#define check_param(varname)
int muonMultiplicity() const
muonMultiplicity
Definition: PFJet.h:131
int HFEMMultiplicity() const
HFEMMultiplicity.
Definition: PFJet.h:135
virtual int nConstituents() const
of constituents
Definition: Jet.h:65
Real clusterRadius() const
Definition: PattRecoPeak.h:65
Real f_etaPhiCorr() const
Definition: FFTJet.h:70
float chargedMuEnergyFraction() const
chargedMuEnergyFraction
Definition: PFJet.h:144
const math::XYZTLorentzVector & f_pileup() const
Definition: FFTJet.h:63
double f_safeLog(const double x) const
float muonEnergyFraction() const
muonEnergyFraction
Definition: PFJet.h:112
virtual void mapFFTJet(const reco::Jet &jet, const reco::FFTJet< float > &fftJet, const math::XYZTLorentzVector &current, double *buf, unsigned dim) const
Real magnitude() const
Definition: PattRecoPeak.h:59
Real f_recoScaleRatio() const
Definition: FFTJet.h:74
int HFHadronMultiplicity() const
HFHadronMultiplicity.
Definition: PFJet.h:133
void hessian(double hessianArray[3]) const
Definition: PattRecoPeak.h:67
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
int electronMultiplicity() const
electronMultiplicity
Definition: PFJet.h:129
Real f_fuzziness() const
Definition: FFTJet.h:71
Definition: DDAxes.h:10