CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
QGLikelihoodCalculator.cc
Go to the documentation of this file.
5 #include <math.h>
6 
8 float QGLikelihoodCalculator::computeQGLikelihood(edm::ESHandle<QGLikelihoodObject> &QGLParamsColl, float pt, float eta, float rho, std::vector<float> vars){
9  if(!isValidRange(pt, rho, eta, QGLParamsColl->qgValidRange)) return -1;
10 
11  float Q=1., G=1.;
12  for(unsigned int varIndex = 0; varIndex < vars.size(); ++varIndex){
13 
14  auto qgEntry = findEntry(QGLParamsColl->data, eta, pt, rho, 0, varIndex);
15  if(!qgEntry) return -1;
16  float Qi = qgEntry->histogram.binContent(qgEntry->histogram.findBin(vars[varIndex]));
17  float mQ = qgEntry->mean;
18 
19  qgEntry = findEntry(QGLParamsColl->data, eta, pt, rho, 1, varIndex);
20  if(!qgEntry) return -1;
21  float Gi = qgEntry->histogram.binContent(qgEntry->histogram.findBin(vars[varIndex]));
22  float mG = qgEntry->mean;
23 
24  float epsilon=0;
25  float delta=0.000001;
26  if(Qi <= epsilon && Gi <= epsilon){
27  if(mQ>mG){
28  if(vars[varIndex] > mQ){ Qi = 1-delta; Gi = delta;}
29  else if(vars[varIndex] < mG){ Qi = delta; Gi = 1-delta;}
30  }
31  else if(mQ<mG){
32  if(vars[varIndex]<mQ) { Qi = 1-delta; Gi = delta;}
33  else if(vars[varIndex]>mG){Qi = delta;Gi = 1-delta;}
34  }
35  }
36  Q*=Qi;
37  G*=Gi;
38  }
39 
40  if(Q==0) return 0;
41  return Q/(Q+G);
42 }
43 
44 
46 const QGLikelihoodObject::Entry* QGLikelihoodCalculator::findEntry(std::vector<QGLikelihoodObject::Entry> const &data, float eta, float pt, float rho, int qgIndex, int varIndex){
47  QGLikelihoodParameters myParameters;
48  myParameters.Rho = rho;
49  myParameters.Pt = pt;
50  myParameters.Eta = fabs(eta);
51  myParameters.QGIndex = qgIndex;
52  myParameters.VarIndex = varIndex;
53 
54  auto myDataObject = data.begin();
55  while(!(myParameters == myDataObject->category)){
56  ++myDataObject;
57  if(myDataObject == data.end()){
58  edm::LogWarning("QGLCategoryNotFound") << "Jet passed qgValidRange criteria, but no category found with rho=" << rho << ", pt=" << pt << ", eta=" << eta
59  << "\nPlease contact cms-qg-workinggroup@cern.ch" << std::endl;
60  return nullptr;
61  }
62  }
63  return &*myDataObject;
64 }
65 
66 
68 bool QGLikelihoodCalculator::isValidRange(float pt, float rho, float eta, const QGLikelihoodCategory &qgValidRange){
69  if(pt < qgValidRange.PtMin) return false;
70  if(pt > qgValidRange.PtMax) return false;
71  if(rho < qgValidRange.RhoMin) return false;
72  if(rho > qgValidRange.RhoMax) return false;
73  if(fabs(eta) < qgValidRange.EtaMin) return false;
74  if(fabs(eta) > qgValidRange.EtaMax) return false;
75  return true;
76 }
77 
78 
80 float QGLikelihoodCalculator::smearingFunction(float x0, float a ,float b,float min,float max){
81  float x=(x0-min)/(max-min);
82  if(x<0.) x=0.;
83  if(x>1.) x=1.;
84 
85  float x1= tanh(a*atanh(2.*x-1.)+b)/2.+.5;
86  if(x<=0.) x1=0.;
87  if(x>=1.) x1=1.;
88 
89  return x1*(max-min)+min;
90 }
91 
92 // Get systematic smearing
93 float QGLikelihoodCalculator::systematicSmearing(edm::ESHandle<QGLikelihoodSystematicsObject> &QGLSystematicsColl, float pt, float eta, float rho, float qgValue, int qgIndex){
94  if(qgValue < 0 || qgValue > 1) return -1.;
95 
96  QGLikelihoodParameters myParameters;
97  myParameters.Rho = rho;
98  myParameters.Pt = pt;
99  myParameters.Eta = fabs(eta);
100  myParameters.QGIndex = qgIndex;
101  myParameters.VarIndex = -1;
102 
103  auto myDataObject = QGLSystematicsColl->data.begin();
104  while(!(myParameters == myDataObject->systCategory)){
105  ++myDataObject;
106  if(myDataObject == QGLSystematicsColl->data.end()) return -1; //Smearing not available in the whole qgValidRange: do not throw warnings or errors
107  }
108  return smearingFunction(qgValue, myDataObject->a, myDataObject->b, myDataObject->lmin, myDataObject->lmax);
109 }
Parameters structure.
dbl * delta
Definition: mlp_gen.cc:36
Definition: DDAxes.h:10
float smearingFunction(float x0, float a, float b, float min, float max)
Return the smeared qgLikelihood value, given input x0 and parameters a, b, min and max...
T eta() const
const T & max(const T &a, const T &b)
float computeQGLikelihood(edm::ESHandle< QGLikelihoodObject > &QGLParamsColl, float pt, float eta, float rho, std::vector< float > vars)
Compute likelihood for a jet using the QGLikelihoodObject information and a set of variables...
Category structure: ranges associated with QGLikelihood histograms.
tuple G
Definition: callgraph.py:12
double b
Definition: hdecay.h:120
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
double a
Definition: hdecay.h:121
const QGLikelihoodObject::Entry * findEntry(std::vector< QGLikelihoodObject::Entry > const &data, float eta, float pt, float rho, int qgIndex, int varIndex)
Find matching entry in vector for a given eta, pt, rho, qgIndex and varIndex.
bool isValidRange(float pt, float rho, float eta, const QGLikelihoodCategory &qgValidRange)
Check the valid range of this qg tagger.
const double epsilon
Definition: DDAxes.h:10
float systematicSmearing(edm::ESHandle< QGLikelihoodSystematicsObject > &QGLParamsColl, float pt, float eta, float rho, float qgValue, int qgIndex)