ATLAS Offline Software
MissingMassProb.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // Class handling the probability calculation of the MissingMassCalculator
6 // author Michael Huebner <michael.huebner@no.spam.cern.ch>
7 
8 // Local include(s):
11 #include <cmath>
12 
13 using namespace DiTauMassTools;
14 
15 // The wrapper functions make use of the ignore template defined in HelperFunctions.h.
16 // This is to avoid warnings during compilation.
17 // All wrapper functions need to have the same structure such that they can be
18 // handled within the probList vectors and the "user" from the Calculator only
19 // has to call Prob->apply() to have a common handling of all probability calculations.
20 
21 double MissingMassProb::MetProbabilityWrapper( MissingMassProb* prob, MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2 ){
22  ignore(tau_type1);
23  ignore(tau_type2);
24  ignore(tauvec1);
25  ignore(tauvec2);
26  ignore(nuvec1);
27  ignore(nuvec2);
28  return prob->MetProbability(preparedInput, 1.,1.,1.,1.);
29 }
30 
31 double MissingMassProb::mEtAndTauProbabilityWrapper( MissingMassProb* prob, MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2 ){
32  ignore(tau_type1);
33  ignore(tau_type2);
34  ignore(tauvec1);
35  ignore(tauvec2);
36  ignore(nuvec1);
37  ignore(nuvec2);
38  return prob->mEtAndTauProbability(preparedInput);
39 }
40 
41 double MissingMassProb::dTheta3d_probabilityFastWrapper( MissingMassProb* prob, MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2 ){
42  double Prob = 1.;
43  if (tau_type1>=0) {
44  TLorentzVector totalTau1;
45  totalTau1+=tauvec1;
46  totalTau1+=nuvec1;
47  const double tau1_tmpp = totalTau1.P();
48  const double angle1 = Angle(nuvec1,tauvec1);
49  Prob*=prob->dTheta3d_probabilityFast(preparedInput, tau_type1, angle1, tau1_tmpp);
50  }
51  if (tau_type2>=0) {
52  TLorentzVector totalTau2;
53  totalTau2+=tauvec2;
54  totalTau2+=nuvec2;
55  const double tau2_tmpp = totalTau2.P();
56  const double angle2 = Angle(nuvec2,tauvec2);
57  Prob*=prob->dTheta3d_probabilityFast(preparedInput, tau_type2, angle2, tau2_tmpp);
58  }
59  return Prob;
60 }
61 
62 double MissingMassProb::TauProbabilityWrapper( MissingMassProb* prob, MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2 ){
63  if( prob->GetUseHT() || (preparedInput.m_tauTypes==TauTypes::hh) ) {
64  return prob->TauProbability(preparedInput, tau_type1, tauvec1, nuvec1, tau_type2, tauvec2, nuvec2, preparedInput.m_MetVec.Mod()); // customized prob for Njet25=0
65  } else {
66  return prob->TauProbability(preparedInput, tau_type1, tauvec1, nuvec1, tau_type2, tauvec2, nuvec2);
67  }
68 }
69 
70 double MissingMassProb::MnuProbabilityWrapper( MissingMassProb* prob, MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2 ){
71  ignore(tauvec1);
72  ignore(tauvec2);
73  if(prob->GetUseMnuProbability()==1){
74  if(preparedInput.m_tauTypes==TauTypes::ll) return prob->MnuProbability(preparedInput, nuvec1.M())*prob->MnuProbability(preparedInput, nuvec2.M()); // lep-lep
75  else if(tau_type1==8 && (tau_type2>=0 && tau_type2<=5)) return prob->MnuProbability(preparedInput, nuvec1.M()); // lep-had: tau1==lepton
76  else if((tau_type1>=0 && tau_type1<=5) && tau_type2==8) return prob->MnuProbability(preparedInput, nuvec2.M()); // lep-had: tau2==lepton
77  else {
78  Warning("DiTauMassTools", "something went really wrong in MNuProb...");
79  return 1.;
80  }
81  } else {
82  return 1.;
83  }
84 }
85 
86 double MissingMassProb::dTheta3d_probabilityNewWrapper( MissingMassProb* prob, MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2 ){
87  ignore(preparedInput);
88  double Prob = 1.;
89  if (tau_type1>=0) {
90  TLorentzVector totalTau1;
91  totalTau1+=tauvec1;
92  totalTau1+=nuvec1;
93  const double angle1 = Angle(nuvec1,tauvec1);
94  double prob_tmp = 1e-10;
95  if (angle1!=0.) prob_tmp=prob->GetFormulaAngle1()->Eval(angle1);
96  if (prob_tmp<=0.) prob_tmp=1e-10;
97  Prob*=prob_tmp;
98  }
99  if (tau_type2>=0) {
100  TLorentzVector totalTau2;
101  totalTau2+=tauvec2;
102  totalTau2+=nuvec2;
103  const double angle2 = Angle(nuvec2,tauvec2);
104  double prob_tmp = 1e-10;
105  if (angle2!=0.) prob_tmp=prob->GetFormulaAngle2()->Eval(angle2);
106  if (prob_tmp<=0.) prob_tmp=1e-10;
107  Prob*=prob_tmp;
108  }
109  // very rare cases where parametrisation flips
110  if (std::isnan(Prob)) Prob = 0.;
111  return Prob;
112 }
113 
114 double MissingMassProb::TauProbabilityNewWrapper( MissingMassProb* prob, MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2 ){
115  ignore(preparedInput);
116  ignore(tau_type1);
117  ignore(tau_type2);
118  double Prob = 1.;
119  double R1 = nuvec1.P()/tauvec1.P();
120  double R2 = nuvec2.P()/tauvec2.P();
121  Prob*=prob->GetFormulaRatio1()->Eval(R1);
122  Prob*=prob->GetFormulaRatio2()->Eval(R2);
123  // not observed, just a protection
124  if (std::isnan(Prob)) Prob = 0.;
125  return Prob;
126 }
127 
128 double MissingMassProb::MnuProbabilityNewWrapper( MissingMassProb* prob, MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2 ){
129  ignore(tauvec1);
130  ignore(tauvec2);
131  double Prob = 1.;
132  if(prob->GetUseMnuProbability()==1){
133  if(preparedInput.m_tauTypes==TauTypes::ll) Prob*=(prob->GetFormulaNuMass()->Eval(nuvec1.M())*prob->GetFormulaNuMass()->Eval(nuvec2.M()));
134  else if(tau_type1==8 && (tau_type2>=0 && tau_type2<=5)) Prob*=prob->GetFormulaNuMass()->Eval(nuvec1.M());
135  else if((tau_type1>=0 && tau_type1<=5) && tau_type2==8) Prob*=prob->GetFormulaNuMass()->Eval(nuvec2.M());
136  else {
137  Warning("DiTauMassTools", "something went really wrong in MNuProb...");
138  }
139  }
140  // not observed, just a protection
141  if (std::isnan(Prob)) Prob = 0.;
142  return Prob;
143 }
144 
146  if (m_paramVectorNuMass.size() > 0){
147  for(int i=0; i<m_formulaNuMass->GetNpar(); i++){
148  m_formulaNuMass->SetParameter(i, m_paramVectorNuMass[0]->GetParameter(i));
149  }
150  }
151 }
152 
153 void MissingMassProb::setParamAngle(const TLorentzVector& tauvec, int tau, int tautype) {
154  double Pt_tau = tauvec.Pt();
155  int type = tautype;
156  if (tautype > 4 && tautype < 8) type = 4;
157  if (tautype <= 5){
158  if (m_paramVectorAngle.size() > 0){
159  for(int i=0; i<=3; i++){
160  double par = m_paramVectorAngle[i+(type)*4]->Eval(Pt_tau);
161  if (tau==1){
162  m_formulaAngle1->SetParameter(i, par);
163  } else {
164  m_formulaAngle2->SetParameter(i, par);
165  }
166  }
167  }
168  } else {
169  if (m_paramVectorAngleLep.size() > 0){
170  for(int i=0; i<=3; i++){
171  double par = m_paramVectorAngleLep[i]->Eval(Pt_tau);
172  if (tau==1){
173  m_formulaAngle1->SetParameter(i, par);
174  } else {
175  m_formulaAngle2->SetParameter(i, par);
176  }
177  }
178  }
179  }
180 }
181 
182 void MissingMassProb::setParamRatio(int tau, int tautype) {
183  int type = tautype;
184  if(tautype > 4 && tautype < 8) type = 4;
185  if (tautype <= 5){
186  if(tau==1){
188  for(int i=0; i<m_formulaRatio1->GetNpar(); i++){
189  m_formulaRatio1->SetParameter(i, m_paramVectorRatio[5*(tau-1)+type]->GetParameter(i));
190  }
191  } else {
193  for(int i=0; i<m_formulaRatio2->GetNpar(); i++){
194  m_formulaRatio2->SetParameter(i, m_paramVectorRatio[5*(tau-1)+type]->GetParameter(i));
195  }
196  }
197  } else {
198  if(tau==1){
200  for(int i=0; i<m_formulaRatio1->GetNpar(); i++){
201  m_formulaRatio1->SetParameter(i, m_paramVectorRatioLep[0]->GetParameter(i));
202  }
203  } else {
205  for(int i=0; i<m_formulaRatio2->GetNpar(); i++){
206  m_formulaRatio2->SetParameter(i, m_paramVectorRatioLep[0]->GetParameter(i));
207  }
208  }
209  }
210 }
211 
212 // Default Constructor
213 MissingMassProb::MissingMassProb(MMCCalibrationSetV2::e aset, std::string m_paramFilePath) {
214  m_mmcCalibrationSet = aset;
215  m_allowUseHT = false;
216  m_UseHT = false;
217 
218  m_fParams = NULL;
219  if (!m_paramFilePath.empty()){
220  std::string total_path = "DiTauMassTools/"+m_paramFilePath;
221  m_fParams = TFile::Open( (const char*) PathResolverFindCalibFile(total_path).c_str() ,"READ");
222  }
223  if (aset == MMCCalibrationSetV2::MMC2019) {
224  m_probListConstant.push_back( std::bind(&mEtAndTauProbabilityWrapper, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7) );
225  m_probListOneTau.push_back( std::bind(&dTheta3d_probabilityNewWrapper, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7) );
226  m_probListTwoTau.push_back( std::bind(&TauProbabilityNewWrapper, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7) );
227  m_probListTwoTau.push_back( std::bind(&MnuProbabilityNewWrapper, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7) );
228  if (m_fParams){
230  }
231  }
232  else {
233  m_probListConstant.push_back( std::bind(&mEtAndTauProbabilityWrapper, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7) );
234  m_probListOneTau.push_back( std::bind(&dTheta3d_probabilityFastWrapper, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7) );
235  m_probListTwoTau.push_back( std::bind(&TauProbabilityWrapper, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7) );
236  m_probListTwoTau.push_back( std::bind(&MnuProbabilityWrapper, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6, std::placeholders::_7) );
237  }
238 
239  if (m_fParams) if (m_fParams->IsOpen()) m_fParams->Close();
240 
242  // [tau_type][parLG][par]
243  // leptonic tau
244  //-par[0]
245  s_fit_param[0][0][0][0]=-9.82013E-1;
246  s_fit_param[0][0][0][1]=9.09874E-1;
247  s_fit_param[0][0][0][2]=0.0;
248  s_fit_param[0][0][0][3]=0.0;
249  //-par[1]
250  s_fit_param[0][0][1][0]=9.96303E1;
251  s_fit_param[0][0][1][1]=1.68873E1;
252  s_fit_param[0][0][1][2]=3.23798E-2;
253  s_fit_param[0][0][1][3]=0.0;
254  //-par[2]
255  s_fit_param[0][0][2][0]=0.0;
256  s_fit_param[0][0][2][1]=0.0;
257  s_fit_param[0][0][2][2]=0.0;
258  s_fit_param[0][0][2][3]=0.3; // fit value is 2.8898E-1, I use 0.3
259  //-par[3]
260  s_fit_param[0][0][3][0]=9.70055E1;
261  s_fit_param[0][0][3][1]=6.46175E1;
262  s_fit_param[0][0][3][2]=3.20679E-2;
263  s_fit_param[0][0][3][3]=0.0;
264  //-par[4]
265  s_fit_param[0][0][4][0]=1.56865;
266  s_fit_param[0][0][4][1]=2.28336E-1;
267  s_fit_param[0][0][4][2]=1.09396E-1;
268  s_fit_param[0][0][4][3]=1.99975E-3;
269  //-par[5]
270  s_fit_param[0][0][5][0]=0.0;
271  s_fit_param[0][0][5][1]=0.0;
272  s_fit_param[0][0][5][2]=0.0;
273  s_fit_param[0][0][5][3]=0.66;
274  //-----------------------------------------------------------------
275  // 1-prong hadronic tau
276  //-par[0]
277  s_fit_param[0][1][0][0]=-2.42674;
278  s_fit_param[0][1][0][1]=7.69124E-1;
279  s_fit_param[0][1][0][2]=0.0;
280  s_fit_param[0][1][0][3]=0.0;
281  //-par[1]
282  s_fit_param[0][1][1][0]=9.52747E1;
283  s_fit_param[0][1][1][1]=1.26319E1;
284  s_fit_param[0][1][1][2]=3.09643E-2;
285  s_fit_param[0][1][1][3]=0.0;
286  //-par[2]
287  s_fit_param[0][1][2][0]=1.71302E1;
288  s_fit_param[0][1][2][1]=3.00455E1;
289  s_fit_param[0][1][2][2]=7.49445E-2;
290  s_fit_param[0][1][2][3]=0.0;
291  //-par[3]
292  s_fit_param[0][1][3][0]=1.06137E2;
293  s_fit_param[0][1][3][1]=6.01548E1;
294  s_fit_param[0][1][3][2]=3.50867E-2;
295  s_fit_param[0][1][3][3]=0.0;
296  //-par[4]
297  s_fit_param[0][1][4][0]=4.26079E-1;
298  s_fit_param[0][1][4][1]=1.76978E-1;
299  s_fit_param[0][1][4][2]=1.43419;
300  s_fit_param[0][1][4][3]=0.0;
301  //-par[5]
302  s_fit_param[0][1][5][0]=0.0;
303  s_fit_param[0][1][5][1]=0.0;
304  s_fit_param[0][1][5][2]=0.0;
305  s_fit_param[0][1][5][3]=0.4;
306  //-----------------------------------------------------------------
307  // 3-prong hadronic tau
308  //-par[0]
309  s_fit_param[0][2][0][0]=-2.43533;
310  s_fit_param[0][2][0][1]=6.12947E-1;
311  s_fit_param[0][2][0][2]=0.0;
312  s_fit_param[0][2][0][3]=0.0;
313  //-par[1]
314  s_fit_param[0][2][1][0]=9.54202;
315  s_fit_param[0][2][1][1]=2.80011E-1;
316  s_fit_param[0][2][1][2]=2.49782E-1;
317  s_fit_param[0][2][1][3]=0.0;
318  //-par[2]
319  s_fit_param[0][2][2][0]=1.61325E1;
320  s_fit_param[0][2][2][1]=1.74892E1;
321  s_fit_param[0][2][2][2]=7.05797E-2;
322  s_fit_param[0][2][2][3]=0.0;
323  //-par[3]
324  s_fit_param[0][2][3][0]=1.17093E2;
325  s_fit_param[0][2][3][1]=4.70000E1;
326  s_fit_param[0][2][3][2]=3.87085E-2;
327  s_fit_param[0][2][3][3]=0.0;
328  //-par[4]
329  s_fit_param[0][2][4][0]=4.16557E-1;
330  s_fit_param[0][2][4][1]=1.58902E-1;
331  s_fit_param[0][2][4][2]=1.53516;
332  s_fit_param[0][2][4][3]=0.0;
333  //-par[5]
334  s_fit_param[0][2][5][0]=0.0;
335  s_fit_param[0][2][5][1]=0.0;
336  s_fit_param[0][2][5][2]=0.0;
337  s_fit_param[0][2][5][3]=0.95;
338 
339 
341  // [tau_type][parLG][par]
342  // leptonic tau
343  //-par[0]
344  s_fit_param[1][0][0][0]=-9.82013E-1;
345  s_fit_param[1][0][0][1]=9.09874E-1;
346  s_fit_param[1][0][0][2]=0.0;
347  s_fit_param[1][0][0][3]=0.0;
348  s_fit_param[1][0][0][4]=0.0;
349  //-par[1]
350  s_fit_param[1][0][1][0]=9.96303E1;
351  s_fit_param[1][0][1][1]=1.68873E1;
352  s_fit_param[1][0][1][2]=3.23798E-2;
353  s_fit_param[1][0][1][3]=0.0;
354  s_fit_param[1][0][1][4]=0.0;
355  //-par[2]
356  s_fit_param[1][0][2][0]=0.0;
357  s_fit_param[1][0][2][1]=0.0;
358  s_fit_param[1][0][2][2]=0.0;
359  s_fit_param[1][0][2][3]=0.3; // fit value is 2.8898E-1, I use 0.3
360  s_fit_param[1][0][2][4]=0.0;
361  //-par[3]
362  s_fit_param[1][0][3][0]=9.70055E1;
363  s_fit_param[1][0][3][1]=6.46175E1;
364  s_fit_param[1][0][3][2]=3.20679E-2;
365  s_fit_param[1][0][3][3]=0.0;
366  s_fit_param[1][0][3][4]=0.0;
367  //-par[4]
368  s_fit_param[1][0][4][0]=1.56865;
369  s_fit_param[1][0][4][1]=2.28336E-1;
370  s_fit_param[1][0][4][2]=1.09396E-1;
371  s_fit_param[1][0][4][3]=1.99975E-3;
372  s_fit_param[1][0][4][4]=0.0;
373  //-par[5]
374  s_fit_param[1][0][5][0]=0.0;
375  s_fit_param[1][0][5][1]=0.0;
376  s_fit_param[1][0][5][2]=0.0;
377  s_fit_param[1][0][5][3]=0.66;
378  s_fit_param[1][0][5][4]=0.0;
379  //-----------------------------------------------------------------
380  //-----------------------
381  // Only hadronic tau's were re-parametrized in MC12. The parameterization now
382  // goes to P(tau)=1 TeV.
383  //-----------------------------------------------------------------
384  // 1-prong hadronic tau
385  //---par[0]
386  s_fit_param[1][1][0][0]=0.7568;
387  s_fit_param[1][1][0][1]=-0.0001469;
388  s_fit_param[1][1][0][2]=5.413E-7;
389  s_fit_param[1][1][0][3]=-6.754E-10;
390  s_fit_param[1][1][0][4]=2.269E-13;
391  //---par[1]
392  s_fit_param[1][1][1][0]=-0.0288208;
393  s_fit_param[1][1][1][1]=0.134174;
394  s_fit_param[1][1][1][2]=-142.588;
395  s_fit_param[1][1][1][3]=-0.00035606;
396  s_fit_param[1][1][1][4]=-6.94567E-20;
397  //---par[2]
398  s_fit_param[1][1][2][0]=-0.00468927;
399  s_fit_param[1][1][2][1]=0.0378737;
400  s_fit_param[1][1][2][2]=-260.284;
401  s_fit_param[1][1][2][3]=0.00241158;
402  s_fit_param[1][1][2][4]=-6.01766E-7;
403  //---par[3]
404  s_fit_param[1][1][3][0]=-0.170424;
405  s_fit_param[1][1][3][1]=0.135764;
406  s_fit_param[1][1][3][2]=-50.2361;
407  s_fit_param[1][1][3][3]=0.00735544;
408  s_fit_param[1][1][3][4]=-7.34073E-6;
409  //---par[4]
410  s_fit_param[1][1][4][0]=-0.0081364;
411  s_fit_param[1][1][4][1]=0.0391428;
412  s_fit_param[1][1][4][2]=-141.936;
413  s_fit_param[1][1][4][3]=0.0035034;
414  s_fit_param[1][1][4][4]=-1.21956E-6;
415  //-par[5]
416  s_fit_param[1][1][5][0]=0.0;
417  s_fit_param[1][1][5][1]=0.0;
418  s_fit_param[1][1][5][2]=0.0;
419  s_fit_param[1][1][5][3]=0.624*0.00125; // multiplied by a bin size
420  s_fit_param[1][1][5][4]=0.0;
421  //-----------------------------------------------------------------
422  // 3-prong hadronic tau
423  //---par[0]
424  s_fit_param[1][2][0][0]=0.7562;
425  s_fit_param[1][2][0][1]=-1.168E-5;
426  s_fit_param[1][2][0][2]=0.0;
427  s_fit_param[1][2][0][3]=0.0;
428  s_fit_param[1][2][0][4]=0.0;
429  //---par[1]
430  s_fit_param[1][2][1][0]=-0.0420458;
431  s_fit_param[1][2][1][1]=0.15917;
432  s_fit_param[1][2][1][2]=-80.3259;
433  s_fit_param[1][2][1][3]=0.000125729;
434  s_fit_param[1][2][1][4]=-2.43945E-18;
435  //---par[2]
436  s_fit_param[1][2][2][0]=-0.0216898;
437  s_fit_param[1][2][2][1]=0.0243497;
438  s_fit_param[1][2][2][2]=-63.8273;
439  s_fit_param[1][2][2][3]=0.0148339;
440  s_fit_param[1][2][2][4]=-4.45351E-6;
441  //---par[3]
442  s_fit_param[1][2][3][0]=-0.0879411;
443  s_fit_param[1][2][3][1]=0.110092;
444  s_fit_param[1][2][3][2]=-75.4901;
445  s_fit_param[1][2][3][3]=0.0116915;
446  s_fit_param[1][2][3][4]=-1E-5;
447  //---par[4]
448  s_fit_param[1][2][4][0]=-0.0118324;
449  s_fit_param[1][2][4][1]=0.0280538;
450  s_fit_param[1][2][4][2]=-85.127;
451  s_fit_param[1][2][4][3]=0.00724948;
452  s_fit_param[1][2][4][4]=-2.38792E-6;
453  //-par[5]
454  s_fit_param[1][2][5][0]=0.0;
455  s_fit_param[1][2][5][1]=0.0;
456  s_fit_param[1][2][5][2]=0.0;
457  s_fit_param[1][2][5][3]=0.6167*0.00125; // multiplied by a bin size
458  s_fit_param[1][2][5][4]=0.0;
459 
460  // TER parameterization, for now based on p1130, to be checked and updated with new tag
461  // [tau_type][eta_bin][parameter]
462  // for 1-prongs
463  s_ter_sigma_par[0][0][0]=0.311717;
464  s_ter_sigma_par[0][0][1]=0.0221615;
465  s_ter_sigma_par[0][0][2]=0.859698;
466  s_ter_sigma_par[0][1][0]=0.290019;
467  s_ter_sigma_par[0][1][1]=0.0225794;
468  s_ter_sigma_par[0][1][2]=0.883407;
469  s_ter_sigma_par[0][2][0]=0.352312;
470  s_ter_sigma_par[0][2][1]=0.0196381;
471  s_ter_sigma_par[0][2][2]=0.629708;
472  s_ter_sigma_par[0][3][0]=0.342059;
473  s_ter_sigma_par[0][3][1]=0.0275107;
474  s_ter_sigma_par[0][3][2]=0.48065;
475  s_ter_sigma_par[0][4][0]=0.481564;
476  s_ter_sigma_par[0][4][1]=0.0197219;
477  s_ter_sigma_par[0][4][2]=0.0571714;
478  s_ter_sigma_par[0][5][0]=0.41264;
479  s_ter_sigma_par[0][5][1]=0.0233964;
480  s_ter_sigma_par[0][5][2]=0.515674;
481  s_ter_sigma_par[0][6][0]=0.20112;
482  s_ter_sigma_par[0][6][1]=0.0339914;
483  s_ter_sigma_par[0][6][2]=0.944524;
484  s_ter_sigma_par[0][7][0]=0.0892094;
485  s_ter_sigma_par[0][7][1]=0.0210225;
486  s_ter_sigma_par[0][7][2]=1.34014;
487  s_ter_sigma_par[0][8][0]=0.175554;
488  s_ter_sigma_par[0][8][1]=0.0210968;
489  s_ter_sigma_par[0][8][2]=0.813925;
490  s_ter_sigma_par[0][9][0]=0.0;
491  s_ter_sigma_par[0][9][1]=0.0340279;
492  s_ter_sigma_par[0][9][2]=1.30856;
493  // for 3-prongs
494  s_ter_sigma_par[1][0][0]=0.303356;
495  s_ter_sigma_par[1][0][1]=0.0299807;
496  s_ter_sigma_par[1][0][2]=1.25388;
497  s_ter_sigma_par[1][1][0]=0.358106;
498  s_ter_sigma_par[1][1][1]=0.0229604;
499  s_ter_sigma_par[1][1][2]=1.02222;
500  s_ter_sigma_par[1][2][0]=0.328643;
501  s_ter_sigma_par[1][2][1]=0.025684;
502  s_ter_sigma_par[1][2][2]=1.02594;
503  s_ter_sigma_par[1][3][0]=0.497332;
504  s_ter_sigma_par[1][3][1]=0.0215113;
505  s_ter_sigma_par[1][3][2]=0.30055;
506  s_ter_sigma_par[1][4][0]=0.4493;
507  s_ter_sigma_par[1][4][1]=0.0280311;
508  s_ter_sigma_par[1][4][2]=0.285793;
509  s_ter_sigma_par[1][5][0]=0.427811;
510  s_ter_sigma_par[1][5][1]=0.0316536;
511  s_ter_sigma_par[1][5][2]=0.457286;
512  s_ter_sigma_par[1][6][0]=0.165288;
513  s_ter_sigma_par[1][6][1]=0.0376361;
514  s_ter_sigma_par[1][6][2]=1.3913;
515  s_ter_sigma_par[1][7][0]=0.289798;
516  s_ter_sigma_par[1][7][1]=0.0140801;
517  s_ter_sigma_par[1][7][2]=0.83603;
518  s_ter_sigma_par[1][8][0]=0.186823;
519  s_ter_sigma_par[1][8][1]=0.0213053;
520  s_ter_sigma_par[1][8][2]=0.968934;
521  s_ter_sigma_par[1][9][0]=0.301673;
522  s_ter_sigma_par[1][9][1]=0.0145606;
523  s_ter_sigma_par[1][9][2]=0.514022;
524 
525 
526 }
527 
528 // Default Destructor
530 }
531 
532 double MissingMassProb::apply(MissingMassInput& preparedInput, const int & tau_type1, const int & tau_type2, const TLorentzVector & tauvec1, const TLorentzVector & tauvec2, const TLorentzVector nuvec1, const TLorentzVector & nuvec2, bool constant, bool oneTau, bool twoTau) {
533  double prob = 1.;
534  if (constant == true) {
535  for (auto& f: m_probListConstant) {
536  prob*=f(preparedInput, tau_type1, tau_type2, tauvec1, tauvec2, nuvec1, nuvec2);
537  }
538  } else if (oneTau == true) {
539  for (auto& f: m_probListOneTau) {
540  prob*=f(preparedInput, tau_type1, tau_type2, tauvec1, tauvec2, nuvec1, nuvec2);
541  }
542  } else if (twoTau == true) {
543  for (auto& f: m_probListTwoTau) {
544  prob*=f(preparedInput, tau_type1, tau_type2, tauvec1, tauvec2, nuvec1, nuvec2);
545  }
546  }
547  return prob;
548 }
549 
550 
551 double MissingMassProb::MetProbability(MissingMassInput& preparedInput, const double & met1,const double & met2,const double & MetSigma1,const double & MetSigma2) {
552 
553 
554  double metprob;
555  if(MetSigma1>1.0 && MetSigma2>1.0) // it doesn't make sense if MET resolution sigma is <1 GeV
556  {
557  //SpeedUp
558  metprob=exp(-0.5*(met1*met1/(MetSigma1*MetSigma1)+met2*met2/(MetSigma2*MetSigma2)))/(MetSigma1*MetSigma2*2*TMath::Pi());
559  }
560  else
561  {
562  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "MissingMassCalculator::MetProbability: either MetSigma1 or MetSigma2 are <1 GeV--- too low, returning prob=1");
563  metprob=1.;
564  }
565 
566 
567  return metprob;
568 
569 
570 }
571 
573 {
574  double proba=1.;
575  double metprob;
576 
577  // deltaMEt is the difference between the neutrino sum and the MEt (or -HT if useHT),
578  //corrected possibly from tau E scanning
579 
580  double deltaMetX=preparedInput.m_metVec.X()-preparedInput.m_inputMEtX;
581  double deltaMetY=preparedInput.m_metVec.Y()-preparedInput.m_inputMEtY;
582 
583  // possibly correct for subtract tau scanning here
584  // const double met_smearL=(deltaMetVec.X()*m_metCovPhiCos+deltaMetVec.Y()*m_metCovPhiSin;
585  // const double met_smearP=-deltaMetVec.X()*m_metCovPhiSin+deltaMetVec.Y()*m_metCovPhiCos;
586 
587  // rotate into error ellipse axis
588  const double met_smearL=deltaMetX*cos(preparedInput.m_METcovphi)+deltaMetY*sin(preparedInput.m_METcovphi);
589  const double met_smearP=-deltaMetX*sin(preparedInput.m_METcovphi)+deltaMetY*cos(preparedInput.m_METcovphi);
590 
591 
592  if (m_UseHT)
593  {
594  if ( preparedInput.m_tauTypes==TauTypes::hh ) {
595 
596  metprob=MHtProbabilityHH(preparedInput, met_smearL,met_smearP,preparedInput.m_inputMEtT,preparedInput.m_MEtT,preparedInput.m_htOffset); // for had-had
597  }
598  else {
599  metprob=MHtProbability(preparedInput, met_smearL,met_smearP,preparedInput.m_inputMEtT,preparedInput.m_MEtT,preparedInput.m_htOffset); // for lep-had Winter 2012 analysis
600  }
601  }
602  else {
603  metprob=MetProbability(preparedInput, met_smearL,met_smearP,preparedInput.m_METsigmaL,preparedInput.m_METsigmaP);
604  }
605 
606  proba=metprob;
607 
608  return proba;
609 }
610 
611 //------------------- simple TauProbability for LFV
612 double MissingMassProb::TauProbabilityLFV(MissingMassInput& preparedInput, const int & type1, const TLorentzVector & vis1, const TLorentzVector & nu1)
613 {
614  double prob=1.0;
615  if(m_fUseTauProbability==0) return prob; // don't apply TauProbability
616  double prob1=1.0;
617  const double mtau=1.777;
618  const double R1=nu1.E()/vis1.E();
619  //--- dealing with 1st tau
620  double m1=nu1.M();
621  double m2=vis1.M();
622  double E1=0.5*(mtau*mtau+m1*m1-m2*m2)/mtau;
623  double E2=mtau-E1;
624  if(E1<=m1 || E1>=mtau)
625  {
626  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::TauProbability: bad E1, returning 0 ");
627  return 0.0;
628  }
629  if(E2<=m2 || E2>=mtau)
630  {
631  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::TauProbability: bad E2, returning 0 ");
632  return 0.0;
633  }
634  preparedInput.m_tlv_tmp.SetPxPyPzE(0.,0.,0.,0.);
635  preparedInput.m_tlv_tmp+=nu1;
636  preparedInput.m_tlv_tmp+=vis1;
637  // double p=(nu1+vis1).P();
638  double p=preparedInput.m_tlv_tmp.P();
639  double V=p/sqrt(p*p+mtau*mtau);
640  double p0;
641  if(type1==8) p0=sqrt(E2*E2-m2*m2); // leptonic tau
642  else p0=E1; // hadronic tau
643  prob1=0.5*mtau/(p0*V*pow(R1+1.0,2));
644  // avoid too large values
645  prob=std::min(prob1,1.);
646  return prob;
647 }
648 
649 double MissingMassProb::TauProbability(MissingMassInput& preparedInput, const int & type1, const TLorentzVector & vis1, const TLorentzVector & nu1,
650  const int & type2, const TLorentzVector & vis2, const TLorentzVector & nu2)
651 {
652  double prob=1.0;
653  if(m_fUseTauProbability==0) return prob; // don't apply TauProbability
654  double prob1=1.0;
655  double prob2=1.0;
656  const double mtau=1.777;
657  const double R1=nu1.E()/vis1.E();
658  const double R2=nu2.E()/vis2.E();
659  //--- dealing with 1st tau
660  double m1=nu1.M();
661  double m2=vis1.M();
662  double E1=0.5*(mtau*mtau+m1*m1-m2*m2)/mtau;
663  double E2=mtau-E1;
664  if(E1<=m1 || E1>=mtau)
665  {
666  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::TauProbability: bad E1, returning 0 ");
667  return 0.0;
668  }
669  if(E2<=m2 || E2>=mtau)
670  {
671  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::TauProbability: bad E2, returning 0 ");
672  return 0.0;
673  }
674  preparedInput.m_tlv_tmp.SetPxPyPzE(0.,0.,0.,0.);
675  preparedInput.m_tlv_tmp+=nu1;
676  preparedInput.m_tlv_tmp+=vis1;
677  // double p=(nu1+vis1).P();
678  double p=preparedInput.m_tlv_tmp.P();
679  double V=p/sqrt(p*p+mtau*mtau);
680  double p0;
681  if(type1==8) p0=sqrt(E2*E2-m2*m2); // leptonic tau
682  else p0=E1; // hadronic tau
683  prob1=0.5*mtau/(p0*V*pow(R1+1.0,2));
684  // avoid too large values
685  prob1=std::min(prob1,1.);
686 
687 
688  //--- dealing with 2nd tau
689  m1=nu2.M();
690  m2=vis2.M();
691  E1=0.5*(mtau*mtau+m1*m1-m2*m2)/mtau;
692  E2=mtau-E1;
693  if(E1<=m1 || E1>=mtau)
694  {
695  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::TauProbability: bad E1, returning 0 ");
696  return 0.0;
697  }
698  if(E2<=m2 || E2>=mtau)
699  {
700  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::TauProbability: bad E2, returning 0 ");
701  return 0.0;
702  }
703  preparedInput.m_tlv_tmp.SetPxPyPzE(0.,0.,0.,0.);
704  preparedInput.m_tlv_tmp+=nu2;
705  preparedInput.m_tlv_tmp+=vis2;
706  // p=(nu2+vis2).P();
707  p=preparedInput.m_tlv_tmp.P();
708 
709 
710  V=p/sqrt(p*p+mtau*mtau);
711  if(type2==8) p0=sqrt(E2*E2-m2*m2); // leptonic tau
712  else p0=E1; // hadronic tau
713  prob2=0.5*mtau/(p0*V*pow(R2+1.0,2));
714  // avoid too large values
715  prob2=std::min(prob2,1.);
716  prob=prob1*prob2;
717  return prob;
718 }
719 
720 
721 // --------- Updated version of TauProbability for lep-had events with Njet25=0, takes into account Winter-2012 analysis cuts
722 double MissingMassProb::TauProbability(MissingMassInput& preparedInput, const int & type1, const TLorentzVector & vis1, const TLorentzVector & nu1,
723  const int & type2, const TLorentzVector & vis2, const TLorentzVector & nu2, const double & detmet) {
724  double prob=1.0;
725 
726  if(m_fUseTauProbability==0) return prob; // don't apply TauProbability
727 
728  if(m_UseHT)
729  {
730  if(detmet<20.0) // low MET Njet=0 category
731  {
732  const double R1=nu1.P()/vis1.P();
733  const double R2=nu2.P()/vis2.P();
734  const double lep_p1[4]={0.417,0.64,0.52,0.678};
735  const double lep_p2[4]={0.23,0.17,0.315,0.319};
736  const double lep_p3[4]={0.18,0.33,0.41,0.299};
737  const double lep_p4[4]={0.033,0.109,0.129,0.096};
738  const double lep_p5[4]={0.145,0.107,0.259,0.304};
739  int ind=3;
740  int indT=3;
741  const double n_1pr[4]={-0.15,-0.13,-0.25,-0.114};
742  const double s_1pr[4]={0.40,0.54,0.62,0.57};
743  const double n_3pr[4]={-1.08,-1.57,-0.46,-0.39};
744  const double s_3pr[4]={0.53,0.85,0.61,0.53};
745  double Ptau=0.0;
746  double Plep=0.0;
747  if(type1>=0 && type1<=5)
748  {
749  Ptau=(nu1+vis1).P();
750  Plep=(nu2+vis2).P();
751  }
752  if(type2>=0 && type2<=5)
753  {
754  Ptau=(nu2+vis2).P();
755  Plep=(nu1+vis1).P();
756  }
757  if(Plep<50.0 && Plep>=45.0) ind=2;
758  if(Plep<45.0 && Plep>=40.0) ind=1;
759  if(Plep<40.0) ind=0;
760  if(Ptau<50.0 && Ptau>=45.0) indT=2;
761  if(Ptau<45.0 && Ptau>=40.0) indT=1;
762  if(Ptau<40.0) indT=0;
763  if(type1==8) prob=prob*(lep_p5[ind]*TMath::Gaus(R1,lep_p1[ind],lep_p2[ind])+TMath::Landau(R1,lep_p3[ind],lep_p4[ind]))/(1+lep_p5[ind]);
764  if(type2==8) prob=prob*(lep_p5[ind]*TMath::Gaus(R2,lep_p1[ind],lep_p2[ind])+TMath::Landau(R2,lep_p3[ind],lep_p4[ind]))/(1+lep_p5[ind]);
765 
766  if(type1>=0 && type1<=2) prob=prob*TMath::Gaus(R1,n_1pr[indT],s_1pr[indT]);
767  if(type2>=0 && type2<=2) prob=prob*TMath::Gaus(R2,n_1pr[indT],s_1pr[indT]);
768  if(type1>=3 && type1<=5) prob=prob*TMath::Gaus(R1,n_3pr[indT],s_3pr[indT]);
769  if(type2>=3 && type2<=5) prob=prob*TMath::Gaus(R2,n_3pr[indT],s_3pr[indT]);
770 
771  }
772  else // high MET Njet=0 category
773  {
774  const double R1=nu1.P()/vis1.P();
775  const double R2=nu2.P()/vis2.P();
776  const double lep_p1[4]={0.441,0.64,0.79,0.8692};
777  const double lep_p2[4]={0.218,0.28,0.29,0.3304};
778  const double lep_p3[4]={0.256,0.33,0.395,0.4105};
779  const double lep_p4[4]={0.048,0.072,0.148,0.1335};
780  const double lep_p5[4]={0.25,0.68,0.10,0.2872};
781  int ind=3;
782  const double p_1prong=-3.706;
783  const double p_3prong=-5.845;
784  double Ptau=0.0;
785  double Plep=0.0;
786  if(type1>=0 && type1<=5)
787  {
788  Ptau=(nu1+vis1).P();
789  Plep=(nu2+vis2).P();
790  }
791  if(type2>=0 && type2<=5)
792  {
793  Ptau=(nu2+vis2).P();
794  Plep=(nu1+vis1).P();
795  }
796  if(Plep<50.0 && Plep>=45.0) ind=2;
797  if(Plep<45.0 && Plep>=40.0) ind=1;
798  if(Plep<40.0) ind=0;
799  const double scale1prong=Ptau>45.0 ? 1.0 : -1.019/((Ptau*0.0074-0.059)*p_1prong);
800  const double scale3prong=Ptau>40.0 ? 1.0 : -1.24/((Ptau*0.0062-0.033)*p_3prong);
801  if(type1==8) prob=prob*(lep_p5[ind]*TMath::Gaus(R1,lep_p1[ind],lep_p2[ind])+TMath::Landau(R1,lep_p3[ind],lep_p4[ind]))/(1+lep_p5[ind]);
802  if(type2==8) prob=prob*(lep_p5[ind]*TMath::Gaus(R2,lep_p1[ind],lep_p2[ind])+TMath::Landau(R2,lep_p3[ind],lep_p4[ind]))/(1+lep_p5[ind]);
803 
804  if(type1>=0 && type1<=2) prob=prob*exp(p_1prong*R1*scale1prong)*std::abs(p_1prong*scale1prong)*0.02; // introduced normalization to account for sharpening of probability at low E(tau)
805  if(type2>=0 && type2<=2) prob=prob*exp(p_1prong*R2*scale1prong)*std::abs(p_1prong*scale1prong)*0.02;
806  if(type1>=3 && type1<=5) prob=prob*exp(p_3prong*R1*scale3prong)*std::abs(p_3prong*scale3prong)*0.02;
807  if(type2>=3 && type2<=5) prob=prob*exp(p_3prong*R2*scale3prong)*std::abs(p_3prong*scale3prong)*0.02;
808  }
809  }
810  //----------------- had-had channel ---------------------------------------
811  if( preparedInput.m_tauTypes==TauTypes::hh )
812  {
813 
814  if(m_UseHT) // Events with no jets
815  {
816 
817  const double R[2]={nu1.P()/vis1.P(),nu2.P()/vis2.P()};
818  const double E[2]={(nu1+vis1).E(),(nu2+vis2).E()};
819  const int tau_type[2]={type1,type2};
820  int order1= vis1.Pt()>vis2.Pt() ? 0 : 1;
821  int order2= vis1.Pt()>vis2.Pt() ? 1 : 0;
822 
823  double par_1p[2][6]; // P(tau)-scaling; lead, sub-lead
824  double par_3p[2][6]; // P(tau)-scaling; lead, sub-lead
825 
826  par_1p[0][0]=0.1273; par_1p[0][1]=-0.2479; par_1p[0][2]=1.0; par_1p[0][3]=-43.16; par_1p[0][4]=0.0; par_1p[0][5]=0.0;
827  par_1p[1][0]=0.3736; par_1p[1][1]=-1.441; par_1p[1][2]=1.0; par_1p[1][3]=-29.82; par_1p[1][4]=0.0; par_1p[1][5]=0.0;
828  par_3p[0][0]=0.1167; par_3p[0][1]=-0.1388; par_3p[0][2]=1.0; par_3p[0][3]=-44.77; par_3p[0][4]=0.0; par_3p[0][5]=0.0;
829  par_3p[1][0]=0.3056; par_3p[1][1]=-2.18; par_3p[1][2]=1.0; par_3p[1][3]=-19.09; par_3p[1][4]=0.0; par_3p[1][5]=0.0;
830  // parameters for sub-leading tau
831  const double C1p=0.062;
832  const double C3p=0.052;
833  const double G1p=1.055;
834  const double G3p=1.093;
835  // Probability for leading tau
836 
837  if( tau_type[order1]>=0 && tau_type[order1]<=2 ) // 1-prong
838  {
839  //double x=std::min(300.,std::max(E[order1],45.0));
840  // 50 to be safe. TO be finalised.
841  // double x=std::min(300.,std::max(E[order1],50.0));
842  double x=std::min(E[order1],300.0);
843  const double slope=par_1p[0][0]+par_1p[0][1]/(par_1p[0][2]*x+par_1p[0][3])+par_1p[0][4]*x > 0.01 ?
844  par_1p[0][0]+par_1p[0][1]/(par_1p[0][2]*x+par_1p[0][3])+par_1p[0][4]*x : 0.01;
845  prob=prob*exp(-R[order1]/slope)*0.04/std::abs(slope);
846  }
847  if( tau_type[order1]>=3 && tau_type[order1]<=5 ) // 3-prong
848  {
849  //double x=std::min(300.,std::max(E[order1],45.0));
850  // double x=std::min(300.,std::max(E[order1],50.0));
851  double x=std::min(E[order1],300.0);
852  const double slope=par_3p[0][0]+par_3p[0][1]/(par_3p[0][2]*x+par_3p[0][3])+par_3p[0][4]*x > 0.01 ?
853  par_3p[0][0]+par_3p[0][1]/(par_3p[0][2]*x+par_3p[0][3])+par_3p[0][4]*x : 0.01;
854  prob=prob*exp(-R[order1]/slope)*0.04/std::abs(slope);
855  }
856  // Probability for sub-leading tau
857  if( tau_type[order2]>=0 && tau_type[order2]<=2 ) // 1-prong
858  {
859  const double par[4]={0.1147,-0.09675,-35.0,3.711E-11};
860  double x=std::min(300.,std::max(E[order2],30.0));
861  // double x=std::min(300.,std::max(E[order2],50.0));
862  const double sigma=G1p*(par_1p[1][0]+par_1p[1][1]/(par_1p[1][2]*x+par_1p[1][3])+par_1p[1][4]*x+par_1p[1][5]*x*x) > 0.01 ?
863  G1p*(par_1p[1][0]+par_1p[1][1]/(par_1p[1][2]*x+par_1p[1][3])+par_1p[1][4]*x+par_1p[1][5]*x*x) : 0.01;
864  if(x<36.0) x=36.0;
865  const double mean=par[0]+par[1]/(x+par[2])+par[3]*pow(x,4);
866  prob=prob*C1p*TMath::Gaus(R[order2],mean,sigma);
867  }
868  if( tau_type[order2]>=3 && tau_type[order2]<=5 ) // 3-prong
869  {
870  double x=std::min(300.,std::max(E[order2],20.0));
871  // double x=std::min(300.,std::max(E[order2],50.0));
872  const double sigma=G3p*(par_3p[1][0]+par_3p[1][1]/(par_3p[1][2]*x+par_3p[1][3])+par_3p[1][4]*x+par_3p[1][5]*x*x) > 0.01 ?
873  G3p*(par_3p[1][0]+par_3p[1][1]/(par_3p[1][2]*x+par_3p[1][3])+par_3p[1][4]*x+par_3p[1][5]*x*x) : 0.01;
874  const double par[4]={0.2302,-2.012,-36.08,-0.000373};
875  if(x<37.0) x=37.0;
876  const double mean=par[0]+par[1]/(x+par[2])+par[3]*x;
877  prob=prob*C3p*TMath::Gaus(R[order2],mean,sigma);
878  }
879  }
880  if(!m_UseHT) // Events with jets
881  {
882  const double R1=nu1.P()/vis1.P();
883  const double R2=nu2.P()/vis2.P();
884  const double E1=(nu1+vis1).E();
885  const double E2=(nu2+vis2).E();
886  int order1= vis1.Pt()>vis2.Pt() ? 0 : 1;
887  int order2= vis1.Pt()>vis2.Pt() ? 1 : 0;
888  const double slope_1p[2]={-3.185,-2.052}; // lead, sub-lead
889  const double slope_3p[2]={-3.876,-2.853}; // lead, sub-lead
890  double par_1p[2][3]; // scaling below 100 GeV; lead, sub-lead
891  double par_3p[2][3]; // scaling below 100 GeV; lead, sub-lead
892  par_1p[0][0]=-0.3745; par_1p[0][1]=0.01417; par_1p[0][2]=-7.285E-5; // [0][i] is always adjusted to match slope at 100 GeV
893  par_1p[1][0]=-0.3683; par_1p[1][1]=0.01807; par_1p[1][2]=-9.514E-5;
894  par_3p[0][0]=-0.3055; par_3p[0][1]=0.01149; par_3p[0][2]=-5.855E-5;
895  par_3p[1][0]=-0.3410; par_3p[1][1]=0.01638; par_3p[1][2]=-9.465E-5;
896  double scale1;
897  double scale2;
898  if(type1>=0 && type1<=2) // 1-prong
899  {
900  scale1=E1>100.0 ? 1.0 : 1.0/std::abs((par_1p[order1][0]+par_1p[order1][1]*E1+par_1p[order1][2]*E1*E1)*slope_1p[order1]);
901  if(scale1<1.0) scale1=1.0;
902  if(scale1>100.0) scale1=100.0;
903  prob=prob*std::abs(slope_1p[order1])*scale1*exp(slope_1p[order1]*scale1*R1)*0.04;
904  }
905  if(type1>=3 && type1<=5) // 3-prong
906  {
907  scale1=E1>100.0 ? 1.0 : 1.0/std::abs((par_3p[order1][0]+par_3p[order1][1]*E1+par_3p[order1][2]*E1*E1)*slope_3p[order1]);
908  if(scale1<1.0) scale1=1.0;
909  if(scale1>100.0) scale1=100.0;
910  prob=prob*std::abs(slope_3p[order1])*scale1*exp(slope_3p[order1]*scale1*R1)*0.04;
911  }
912  if(type2>=0 && type2<=2) // 1-prong
913  {
914  scale2=E2>100.0 ? 1.0 : 1.0/std::abs((par_1p[order2][0]+par_1p[order2][1]*E2+par_1p[order2][2]*E2*E2)*slope_1p[order2]);
915  if(scale2<1.0) scale2=1.0;
916  if(scale2>100.0) scale2=100.0;
917  prob=prob*std::abs(slope_1p[order2])*scale2*exp(slope_1p[order2]*scale2*R2)*0.04;
918  }
919  if(type2>=3 && type2<=5) // 3-prong
920  {
921  scale2=E2>100.0 ? 1.0 : 1.0/std::abs((par_3p[order2][0]+par_3p[order2][1]*E2+par_3p[order2][2]*E2*E2)*slope_3p[order2]);
922  if(scale2<1.0) scale2=1.0;
923  if(scale2>100.0) scale2=100.0;
924  prob=prob*std::abs(slope_3p[order2])*scale2*exp(slope_3p[order2]*scale2*R2)*0.04;
925 
926  }
927  }
928 
929  }
930  // prob=std::min(prob,1.); // Sasha commented out this line, it was introduced by David. Have to ask about its purpose.
931 
932  return prob;
933 }
934 
935 
936 // returns Mnu probability according pol6 parameterization
937 double MissingMassProb::MnuProbability(MissingMassInput& preparedInput, double mnu, double binsize)
938 {
939  double prob=1.0;
940  double norm=4851900.0;
941  double p[7];
942  p[0]=-288.6/norm; p[1]=6.217E4/(2.0*norm); p[2]=2.122E4/(3.0*norm); p[3]=-9.067E4/(4.0*norm);
943  p[4]=1.433E5/(5.0*norm); p[5]=-1.229E5/(6.0*norm); p[6]=3.434E4/(7.0*norm);
944  double int1=0.0;
945  double int2=0.0;
946  double x1= mnu+0.5*binsize < 1.777-0.113 ? mnu+0.5*binsize : 1.777-0.113;
947  double x2= mnu-0.5*binsize > 0.0 ? mnu-0.5*binsize : 0.0;
948  for(int i=0; i<7; i++)
949  {
950  int1=p[i]*pow(x1,i+1)+int1;
951  int2=p[i]*pow(x2,i+1)+int2;
952  }
953  prob=int1-int2;
954  if(prob<0.0)
955  {
956  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::MnuProbability: negative probability!!! ");
957  return 0.0;
958  }
959  if(prob>1.0)
960  {
961  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::MnuProbability: probability > 1!!! ");
962  return 1.0;
963  }
964  return prob;
965 }
966 
967 // returns Mnu probability according pol6 parameterization
968 double MissingMassProb::MnuProbability(MissingMassInput& preparedInput, double mnu)
969 {
970  if(m_fUseMnuProbability==0) return 1.0;
971  double prob=1.0;
972  const double norm=4851900.0;
973  double p[7];
974  p[0]=-288.6; p[1]=6.217E4; p[2]=2.122E4; p[3]=-9.067E4;
975  p[4]=1.433E5; p[5]=-1.229E5; p[6]=3.434E4;
976  double int1=0.0;
977  for(int i=0; i<7; i++)
978  {
979  int1+=p[i]*pow(mnu,i);
980  }
981  prob=int1/norm;
982  if(prob<0.0)
983  {
984  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::MnuProbability: negative probability!!! ");
985  return 0.0;
986  }
987  if(prob>1.0)
988  {
989  if(preparedInput.m_fUseVerbose==1) Warning("DiTauMassTools", "Warning in MissingMassCalculator::MnuProbability: probability > 1!!! ");
990  return 1.0;
991  }
992  return prob;
993 }
994 
995 double MissingMassProb::MHtProbability(MissingMassInput& preparedInput, const double & d_mhtX, const double & d_mhtY, const double & mht,
996  const double & trueMetGuess, const double & mht_offset) {
997  // all param except trueMetguess unchanged in one event. So can cache agaisnt this one.
998  //disable cache if (trueMetGuess==trueMetGuesscache) return mhtprobcache;
999  double mhtprob;
1000  // if(MHtSigma1>0.0 && MHtSigma2>0.0 && MHtGaussFr>0.0)
1001 
1002  // if RANDOMNONUNIF MET already follow the double gaussian parameterisation. So weight should not include it to avoid double counting
1003  // formula to be checked IMHO the two gaussian should be correlated
1004  mhtprob=exp(-0.5*pow(d_mhtX/preparedInput.m_MHtSigma1,2))+preparedInput.m_MHtGaussFr*exp(-0.5*pow(d_mhtX/preparedInput.m_MHtSigma2,2));
1005  mhtprob*=(exp(-0.5*pow(d_mhtY/preparedInput.m_MHtSigma1,2))+preparedInput.m_MHtGaussFr*exp(-0.5*pow(d_mhtY/preparedInput.m_MHtSigma2,2)));
1006 
1007  const double n_arg=(mht-trueMetGuess-mht_offset)/preparedInput.m_MHtSigma1;
1008  mhtprob*=exp(-0.25*pow(n_arg,2)); // assuming sqrt(2)*sigma
1009  return mhtprob;
1010 }
1011 
1012 double MissingMassProb::MHtProbabilityHH(MissingMassInput& preparedInput, const double & d_mhtX, const double & d_mhtY, const double & mht,
1013  const double & trueMetGuess, const double & mht_offset) {
1014  double prob=1.0;
1015 
1016  // updated for final cuts, May 21 2012
1017  // should be merged
1018  prob=prob*(0.0256*TMath::Gaus(d_mhtX,0.0,preparedInput.m_MHtSigma1)+0.01754*TMath::Gaus(d_mhtX,0.0,preparedInput.m_MHtSigma2));
1019  prob=prob*(0.0256*TMath::Gaus(d_mhtY,0.0,preparedInput.m_MHtSigma1)+0.01754*TMath::Gaus(d_mhtY,0.0,preparedInput.m_MHtSigma2));
1020  const double n_arg=(mht-trueMetGuess-mht_offset)/5.7; // this sigma is different from MHtSigma1; actually it depends on dPhi
1021  prob=prob*exp(-0.5*pow(n_arg,2))/(5.7*sqrt(2.0*TMath::Pi())); // assuming sigma from above line
1022 
1023  return prob;
1024 }
1025 
1026 //SpeedUp static instantation
1027 // first index is the calibration set : 0: MMC2011, 1:MMC2012
1028 // second index is the decay 0 : lepton, 1 : 1 prong, 2 3 prong
1029 thread_local double MissingMassProb::s_fit_param[2][3][6][5];
1030 // first parameter: 0- for 1-prong; 1- for 3-prong
1031 thread_local double MissingMassProb::s_ter_sigma_par[2][10][3];
1032 
1033 // returns dTheta3D probability based on ATLAS parameterization
1034 double MissingMassProb::dTheta3d_probabilityFast(MissingMassInput& preparedInput, const int & tau_type,const double & dTheta3d,const double & P_tau) {
1035  double prob=1.0E-10;
1036  int tau_code; // 0: l, 1:1-prong, 2:3-prong
1037  if(tau_type==8) tau_code = 0;
1038  else if(tau_type>=0 && tau_type<=2) tau_code = 1;
1039  else if(tau_type>=3 && tau_type<=5) tau_code = 2;
1040  else
1041  {
1042  Warning("DiTauMassTools", "---- WARNING in MissingMassCalculator::dTheta3d_probabilityFast() ----");
1043  Warning("DiTauMassTools", "%s", ("..... wrong tau_type="+std::to_string(tau_type)).c_str());
1044  Warning("DiTauMassTools", "%s", ("..... returning prob="+std::to_string(prob)).c_str());
1045  Warning("DiTauMassTools", "____________________________________________________________");
1046  return prob;
1047  }
1048 
1049 
1050  double myDelThetaParam[6];
1051 
1052  for (int i=0;i<6;++i)
1053  {
1058  myDelThetaParam[i]=dTheta3Dparam(i,tau_code,P_tau,s_fit_param[1][tau_code][i]);
1059  }
1060  double dTheta3dVal=dTheta3d;
1061 
1062  if (tau_type==8) prob=myDelThetaLepFunc(&dTheta3dVal, myDelThetaParam);
1063  else prob=myDelThetaHadFunc(&dTheta3dVal, myDelThetaParam);
1064 
1065  if (false)
1066  {
1067 
1068  if( preparedInput.m_fUseVerbose==1 && (prob>1.0 || prob<0.0))
1069  {
1070  Warning("DiTauMassTools", "---- WARNING in MissingMassCalculator::dTheta3d_probabilityFast() ----");
1071  Warning("DiTauMassTools", "%s", ("..... wrong probability="+std::to_string(prob)).c_str());
1072  Warning("DiTauMassTools", "%s", ("..... debugging: tau_type="+std::to_string(tau_type)+"dTheta3d="+std::to_string(dTheta3d)+" P_tau="+std::to_string(P_tau)).c_str());
1073  Warning("DiTauMassTools", "____________________________________________________________");
1074  prob=1.0E-10;
1075  }
1076  }
1077 
1078  return prob;
1079 }
1080 
1081 // dTheta probability density function for hadronic taus
1082 double MissingMassProb::myDelThetaHadFunc(double *x, double *par)
1083 {
1084  double fitval=1.0E-10;
1085  if(x[0]>TMath::Pi() || x[0]<0.0) return fitval;
1086  const double arg=x[0];
1087  const double arg_L=arg;
1088  const double mean=par[1];
1089  const double sigmaG=par[2];
1090  const double mpv=par[3];
1091  const double sigmaL=par[4];
1092 
1097  const double norm=sqrt(2.0*TMath::Pi());
1098  const double g1=TMath::Gaus(arg,mean,sigmaG)/norm;
1099  const double g2=TMath::Landau(arg_L,mpv,sigmaL)/norm;
1100  fitval=par[0]*g1/sigmaG+par[5]*g2/sigmaL;
1101  }
1102 
1103  if(fitval<0.0) return 0.0;
1104  return fitval;
1105 }
1106 
1107 // dTheta probability density function for leptonic taus
1108 double MissingMassProb::myDelThetaLepFunc(double *x, double *par)
1109 {
1110  double fitval=1.0E-10;
1111  if(x[0]>TMath::Pi() || x[0]<0.0) return fitval;
1112  double arg=x[0]/par[1];
1113 
1114  double normL=par[5];
1115  if(normL<0.0) normL=0.0;
1116 
1117  if(arg<1) arg=sqrt(std::abs(arg));
1118  else arg=arg*arg;
1119  const double arg_L=x[0];
1120  const double mean=1.0;
1121  const double sigmaG=par[2];
1122  const double mpv=par[3];
1123  const double sigmaL=par[4];
1124  const double g1=normL*TMath::Gaus(arg,mean,sigmaG);
1125  const double g2=TMath::Landau(arg_L,mpv,sigmaL);
1126  fitval=par[0]*(g1+g2)/(1.0+normL);
1127  if(fitval<0.0) return 0.0;
1128  return fitval;
1129 }
1130 
1131 // returns parameters for dTheta3D pdf
1132 double MissingMassProb::dTheta3Dparam(const int & parInd, const int & tau_type, const double & P_tau, const double *par) {
1133  //tau_type 0: l, 1:1-prong, 3:3-prong
1134  if(P_tau<0.0) return 0.0;
1135 
1136 
1137  if(parInd==0) {
1142  return (par[0]+par[1]*P_tau+par[2]*pow(P_tau,2)+par[3]*pow(P_tau,3)+par[4]*pow(P_tau,4))*0.00125;
1143  }
1144  }
1145  else { // parInd==0
1150  if(tau_type==0) return par[0]*(exp(-par[1]*P_tau)+par[2]/P_tau)+par[3]+par[4]*P_tau;
1151  else return par[0]*(exp(-par[1]*sqrt(P_tau))+par[2]/P_tau)+par[3]+par[4]*P_tau;
1152  }
1153  }
1154  return 0.;
1155 }
1156 
1157 /*
1158 // Sasha: keep this for now, may need in the future
1159 // returns analytical P(theta)-probability for given tau-topology
1160 // decayType==1 for leptonic decays and 0 for hadronic decays
1161 // uses product of probabilities
1162 double MissingMassProb::AngularProbability(TLorentzVector nu_vec, TLorentzVector vis_vec, int decayType) {
1163  double prob=0.0;
1164  double M=1.777;
1165  double angl=0.0;
1166  double P=(vis_vec+nu_vec).P();
1167  double V=P/sqrt(P*P+M*M); // tau speed
1168  double dA=dRmax_tau/(2.0*Niter_fit1);
1169 
1170  if(decayType==1) // leptonic tau for now
1171  {
1172  // exact formular for energy probability is sqrt(1-V^2)/(2*V*p_0)*dE
1173  double m_1=nu_vec.M();
1174  double m_2=vis_vec.M();
1175  double E_nu=(M*M+m_1*m_1-m_2*m_2)/(2.0*M);
1176  if(E_nu<=m_1) return 0.0;
1177  double P_nu=sqrt(pow(E_nu,2)-pow(m_1,2));
1178  double prob1=0.5*sqrt(1-V*V)/(P_nu*V); // energy probability
1179 
1180  angl=Angle(vis_vec,vis_vec+nu_vec); // using lepton direction
1181  double det1=1.0-V*cos(angl+dA);
1182  double det2= (angl-dA)>0.0 ? 1.0-V*cos(angl-dA) : 1.0-V;
1183  double prob2=std::abs(1.0/det1-1.0/det2)*(1.0-V*V)/(2.0*V); // using massless approximation for leptons
1184  prob=prob1*prob2;
1185  }
1186  if(decayType==0) // hadronic tau
1187  {
1188  // exact formula for energy probability is sqrt(1-V^2)/(2*V*p_0)*dE
1189  // drop p_0 because it's a contstant for a given hadronic tau
1190  double prob1=0.5*sqrt(1-V*V)/V; // "energy" probability
1191 
1192  angl=Angle(nu_vec,vis_vec+nu_vec); // using neutrino direction
1193  double det1=1.0-V*cos(angl+dA);
1194  double det2= (angl-dA)>0.0 ? 1.0-V*cos(angl-dA) : 1.0-V;
1195  double prob2=std::abs(1.0/det1-1.0/det2)*(1.0-V*V)/(2.0*V);
1196  prob=prob1*prob2;
1197  }
1198  return prob;
1199 }
1200 
1201 // returns probability of angle between two tau's
1202 // assuming massless tau's for now, should be small effect for M>M_Z
1203 double MissingMassProb::ResonanceProbability(TLorentzVector vec1, TLorentzVector vec2) {
1204 
1205  double prob=1.0;
1206  double boson_P=(vec1+vec2).P();
1207  if(boson_P==0.0) return 1.0;
1208  double boson_E=(vec1+vec2).E();
1209  double boson_V=0.0;
1210  if(boson_E>0.0) boson_V=boson_P/boson_E;
1211  else return 1.0E-10;
1212 
1213  double testMass=(vec1+vec2).M();
1214  double m=1.777; // tau mass
1215  double E_tau=testMass/2.0;
1216  double P_tau=sqrt(pow(E_tau,2)-m*m);
1217  double Evis_lim[2];
1218  Evis_lim[0]=(E_tau-boson_V*P_tau)/sqrt(1.0-boson_V*boson_V);
1219  Evis_lim[1]=(E_tau+boson_V*P_tau)/sqrt(1.0-boson_V*boson_V);
1220  if(vec1.E()<Evis_lim[0] || vec1.E()>Evis_lim[1]) return 1.0E-20;
1221  if(vec2.E()<Evis_lim[0] || vec2.E()>Evis_lim[1]) return 1.0E-20;
1222 
1223  double prob1=0.5*sqrt(1-boson_V*boson_V)/(P_tau*boson_V);
1224 
1225  if(vec1.P()*vec2.P()>0)
1226  {
1227  double theta=acos((vec1.Px()*vec2.Px()+vec1.Py()*vec2.Py()+vec1.Pz()*vec2.Pz())/(vec1.P()*vec2.P()));
1228  if(boson_V>0.0 && boson_V<1.0)
1229  {
1230  if(boson_V<cos(theta/2)) return 1.0E-10;
1231  double num=(1.0-boson_V*boson_V)*cos(theta/2);
1232  double denom=4*boson_V*sin(theta/2)*sin(theta/2)*sqrt(boson_V*boson_V-cos(theta/2)*cos(theta/2));
1233  prob=num/denom;
1234  }
1235  else
1236  {
1237  if(std::abs(theta-TMath::Pi())>0.0001) return 1.0E-10;
1238  }
1239  }
1240  else return 1.0E-10;
1241  prob=prob*prob1;
1242  if(prob<1.0E-20) prob=1.0E-20;
1243  return prob;
1244 }
1245 */
1246 
1248  // compute MET resolution (eventually use HT)
1249  if(preparedInput.m_METsigmaP<0.1 || preparedInput.m_METsigmaL<0.1)
1250  {
1252  {
1253  if(preparedInput.m_fUseVerbose==1) { Info("DiTauMassTools", "Attempting to set LFV MMC settings"); }
1254  double mT1 = mT(preparedInput.m_vistau1,preparedInput.m_MetVec);
1255  double mT2 = mT(preparedInput.m_vistau2,preparedInput.m_MetVec);
1256  int sr_switch = 0;
1257  if(preparedInput.m_vistau1.M()<0.12 && preparedInput.m_vistau2.M()<0.12) // lep-lep case
1258  {
1259  if(preparedInput.m_LFVmode==0) // e+tau(->mu) case
1260  {
1261  if(preparedInput.m_vistau1.M()<0.05 && preparedInput.m_vistau2.M()>0.05)
1262  {
1263  if(mT1>mT2) sr_switch = 0; // SR1
1264  else sr_switch = 1; // SR2
1265  }
1266  else
1267  {
1268  if(mT1>mT2) sr_switch = 1; // SR2
1269  else sr_switch = 0; // SR1
1270  }
1271  }
1272  if(preparedInput.m_LFVmode==1) // mu+tau(->e) case
1273  {
1274  if(preparedInput.m_vistau1.M()>0.05 && preparedInput.m_vistau2.M()<0.05)
1275  {
1276  if(mT1>mT2) sr_switch = 0; // SR1
1277  else sr_switch = 1; // SR2
1278  }
1279  else
1280  {
1281  if(mT1>mT2) sr_switch = 1; // SR2
1282  else sr_switch = 0; // SR1
1283  }
1284  }
1285  }
1286  if((preparedInput.m_vistau1.M()<0.12 && preparedInput.m_vistau2.M()>0.12) || (preparedInput.m_vistau2.M()<0.12 && preparedInput.m_vistau1.M()>0.12)) // lep-had case
1287  {
1288  if(preparedInput.m_vistau1.M()<0.12 && preparedInput.m_vistau2.M()>0.12)
1289  {
1290  if(mT1>mT2) sr_switch = 0; // SR1
1291  else sr_switch = 1; // SR2
1292  }
1293  else
1294  {
1295  if(mT1>mT2) sr_switch = 1; // SR2
1296  else sr_switch = 0; // SR1
1297  }
1298  }
1299 
1300  m_UseHT = false;
1301  if(preparedInput.m_Njet25==0) // 0-jet
1302  {
1303  double sigmaSyst = 0.10; // 10% systematics for now (be conservative)
1304  double METresScale;
1305  double METoffset;
1306  if(sr_switch==0)
1307  {
1308  METresScale = 0.41*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1309  METoffset = 7.36*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1310  }
1311  else
1312  {
1313  METresScale = 0.34*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1314  METoffset = 6.61*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1315  }
1316  if(preparedInput.m_fUseVerbose==1) {
1317  Info("DiTauMassTools", "%s", ("SumEt = "+std::to_string(preparedInput.m_SumEt)).c_str());
1318  Info("DiTauMassTools", "%s", ("METoffset = "+std::to_string(METoffset)).c_str());
1319  Info("DiTauMassTools", "%s", ("METresScale = "+std::to_string(METresScale)).c_str());
1320  }
1321 
1322  double sigma = preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : METoffset;
1323  preparedInput.m_METsigmaP = sigma;
1324  preparedInput.m_METsigmaL = sigma;
1325  if(preparedInput.m_fUseVerbose==1) {
1326  Info("DiTauMassTools", "%s", ("=> METsigmaP = "+std::to_string(preparedInput.m_METsigmaP)).c_str());
1327  Info("DiTauMassTools", "%s", ("=> METsigmaL = "+std::to_string(preparedInput.m_METsigmaL)).c_str());
1328  }
1329  }
1330  if(preparedInput.m_Njet25>0) // Inclusive 1-jet
1331  {
1332  double sigmaSyst = 0.10; // 10% systematics for now (be conservative)
1333  double sigma = 0.;
1334  double METresScale;
1335  double METoffset;
1336  if(sr_switch==0)
1337  {
1338  METresScale = 0.38*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1339  METoffset = 7.96*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1340  }
1341  else
1342  {
1343  METresScale = 0.39*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1344  METoffset = 6.61*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1345  }
1346 
1347  // MET resolution can't be perfect in presence of other objects (i.e., electrons, jets, taus), so assume minSumEt = 5.0 for now
1348  sigma = preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : METoffset;
1349  preparedInput.m_METsigmaP = sigma;
1350  preparedInput.m_METsigmaL = sigma;
1351  } // Njet25>0
1352  }
1353  else //LFV
1354  {
1355  //DRDRMERGE end addition
1356 
1357  if(preparedInput.m_METScanScheme==1) // default for Winter 2012 and further
1358  {
1359  //LEP-HAD
1360  if ( preparedInput.m_tauTypes==TauTypes::lh ) // lephad case
1361  {
1362  //0-jet
1363  if(preparedInput.m_Njet25==0)//0-jet
1364  {
1365  // placeholder for 2019 tune
1368  if(preparedInput.m_MetVec.Mod()<20.0) // 0-jet low MET case
1369  {
1370  if(std::abs(preparedInput.m_DelPhiTT)>2.95 && m_allowUseHT) // use mHt only if dPhi(lep-tau)>2.95
1371  {
1372  m_UseHT = true;
1373  // giving priority to external settings
1374  if(preparedInput.m_MHtSigma1<0.0) preparedInput.m_MHtSigma1 = 4.822;
1375  if(preparedInput.m_MHtSigma2<0.0) preparedInput.m_MHtSigma2 = 10.31;
1376  if(preparedInput.m_MHtGaussFr<0.0) preparedInput.m_MHtGaussFr = 6.34E-5;
1377  }
1378  else
1379  {
1380  m_UseHT = false;
1381  double sigmaSyst = 0.10; // 10% systematics for now (be conservative)
1382  double METresScale = 0.32*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1383  double METoffset = 5.38*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1384  double sigma = preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : METoffset;
1385  preparedInput.m_METsigmaP = sigma;
1386  preparedInput.m_METsigmaL = sigma;
1387  }
1388  }
1389  else // 0-jet high MET case
1390  {
1391  if(std::abs(preparedInput.m_DelPhiTT)>2.8 && m_allowUseHT) // use mHt only if dPhi(lep-tau)>2.8
1392  {
1393  m_UseHT = true;
1394  // giving priority to external settings
1395  if(preparedInput.m_MHtSigma1<0.0) preparedInput.m_MHtSigma1 = 7.5;
1396  if(preparedInput.m_MHtSigma2<0.0) preparedInput.m_MHtSigma2 = 13.51;
1397  if(preparedInput.m_MHtGaussFr<0.0) preparedInput.m_MHtGaussFr = 6.81E-4;
1398  preparedInput.m_METsigmaP = preparedInput.m_MHtSigma2; // sigma of 2nd Gaussian for missing Ht resolution
1399  preparedInput.m_METsigmaL = preparedInput.m_MHtSigma2;
1400  }
1401  else
1402  {
1403  m_UseHT = false;
1404  double sigmaSyst = 0.10; // 10% systematics for now (be conservative)
1405  double METresScale = 0.87*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1406  double METoffset = 4.16*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1407  double sigma = preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : METoffset;
1408  preparedInput.m_METsigmaP = sigma;
1409  preparedInput.m_METsigmaL = sigma;
1410  }
1411  } // high MET
1412  } // MMC2016MC15C or MMC2019
1413  // 2015 high-mass tune; avergare MET resolution for Mh=600,1000 mass points
1415  {
1416  m_UseHT = false;
1417  double sigmaSyst = 0.10; // 10% systematics for now (be conservative)
1418  double METresScale = 0.65*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1419  double METoffset = 5.0*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1420  double sigma = preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : METoffset;
1421  preparedInput.m_METsigmaP = sigma;
1422  preparedInput.m_METsigmaL = sigma;
1423  } // MMC2015HIGHMASS
1424  } // 0 jet
1425  //1-jet
1426  else if(preparedInput.m_Njet25>0) // Inclusive 1-jet and VBF lep-had categories for Winter 2012
1427  {
1428  double sigmaSyst=0.10; // 10% systematics for now (be conservative)
1429  double sigma=0.;
1430  // 2015 high-mass tune; average MET resolution for Mh=400,600 mass points (they look consistent);
1432  {
1433  double METresScale=0.86*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1434  double METoffset=3.0*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1435  // MET resolution can't be perfect in presence of other objects (i.e., electrons, jets, taus), so assume minSumEt=5.0 for now
1436  sigma= preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : METoffset;
1437  }
1438  //2016 mc15c or 2019
1441  {
1442  double x = preparedInput.m_DelPhiTT;
1443  double dphi_scale = x > 0.3 ? 0.9429 - 0.059*x + 0.054*x*x : 0.728;
1444  double METoffset = 1.875*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1445  double METresScale1 = 8.914*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1446  double METresScale2 = -8.53*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1447 
1448 
1449  sigma = preparedInput.m_SumEt > 80.0 ? METoffset + METresScale1*TMath::Log(sqrt(preparedInput.m_SumEt)+METresScale2) : 5.0;
1450  sigma = sigma * dphi_scale;
1451  }
1452  //
1453 
1454  preparedInput.m_METsigmaP=sigma;
1455  preparedInput.m_METsigmaL=sigma;
1456  } // Njet25>0
1457 
1458  } // lep-had
1459 
1460  //HAD-HAD
1461  else if(preparedInput.m_tauTypes==TauTypes::hh) // had-had events
1462  {
1463  if(preparedInput.m_Njet25==0 && m_mmcCalibrationSet==MMCCalibrationSetV2::MMC2015HIGHMASS) //0-jet high mass hadhad
1464  {
1465  // 2015 high-mass tune; average of all mass points
1466  // double METresScale=-1.;
1467  // double METoffset=-1.;
1468  double sigmaSyst=0.10; // 10% systematics for now (be conservative)
1469 
1470  double METresScale=0.9*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1471  double METoffset=-1.8*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1472  double sigma= preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : std::abs(METoffset);
1473  preparedInput.m_METsigmaP=sigma;
1474  preparedInput.m_METsigmaL=sigma;
1475 
1476  }
1477  else if(preparedInput.m_Njet25==0 &&
1480  {
1481  double sigmaSyst=0.10; // 10% systematics for now (be conservative)
1482  double x = preparedInput.m_DelPhiTT;
1483  double dphi_scale = x > 2.5 ? 11.0796 - 4.61236*x + 0.423617*x*x : 2.;
1484  double METoffset = -8.51013*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1485  double METresScale1 = 8.54378*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1486  double METresScale2 = -3.97146*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1487  double sigma= preparedInput.m_SumEt>80.0 ? METoffset+METresScale1*TMath::Log(sqrt(preparedInput.m_SumEt)+METresScale2) : 5.;
1488  sigma = sigma*dphi_scale;
1489 
1490  preparedInput.m_METsigmaP=sigma;
1491  preparedInput.m_METsigmaL=sigma;
1492 
1493  }
1494  else if(preparedInput.m_Njet25==0 && m_allowUseHT) // 0-jet high MET had-had category for Winter 2012
1495  {
1496 
1497  m_UseHT=true; // uncomment this line to enable HT also for HH (crucial)
1498  // updated for final cuts, may 21 2012
1499  if(preparedInput.m_MHtSigma1<0.0) preparedInput.m_MHtSigma1=5.972;
1500  if(preparedInput.m_MHtSigma2<0.0) preparedInput.m_MHtSigma2=13.85;
1501  // if(MHtGaussFr<0.0) MHtGaussFr=0.4767; // don't directly use 2nd fraction
1502  }
1503  //1-jet
1504  else // Inclusive 1-jet and VBF categories
1505  {
1506  double METresScale=-1.;
1507  double METoffset=-1.;
1508  double sigmaSyst=0.10; // 10% systematics for now (be conservative)
1509 
1510  // previous value in trunk
1512  // 2015 high-mass tune; average of all mass points
1513  METresScale = 1.1*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1514  METoffset = -5.0*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1515  }
1516  // MET resolution can't be perfect in presence of other objects (i.e., electrons, jets, taus), so assume minSumEt=5.0 for now
1517  double sigma = preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : std::abs(METoffset);
1518 
1521  double x = preparedInput.m_DelPhiTT;
1522  double dphi_scale = x > 0.6 ? 1.42047 - 0.666644*x + 0.199986*x*x : 1.02;
1523  METoffset = 1.19769*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1524  double METresScale1 = 5.61687*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1525  double METresScale2 = -4.2076*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1526  sigma= preparedInput.m_SumEt>115.0 ? METoffset+METresScale1*TMath::Log(sqrt(preparedInput.m_SumEt)+METresScale2) : 12.1;
1527  sigma = sigma*dphi_scale;
1528  } //for hh 2016 mc15c
1529 
1530  preparedInput.m_METsigmaP = sigma;
1531  preparedInput.m_METsigmaL = sigma;
1532 
1533  }// 1 jet
1534  } // had-had
1535  //LEP-LEP
1536  else if(preparedInput.m_tauTypes==TauTypes::ll) // setup for LEP-LEP channel
1537  {
1538  if(m_mmcCalibrationSet==MMCCalibrationSetV2::MMC2015HIGHMASS) // placeholder for 2015 high-mass tune; for now it is the same as 2012
1539  {
1540  m_UseHT = false;
1541  double sigmaSyst = 0.10; // 10% systematics for now (be conservative)
1542  double METresScale = -1.0;
1543  double METoffset = -1.0;
1544  double sigma = 5.0;
1545  // tune is based on cuts for Run-1 paper analysis
1546  if(preparedInput.m_Njet25==0)
1547  {
1548  // use tune for emebedding
1549  METresScale=-0.4307*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1550  METoffset=7.06*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1551  double METresScale2=0.07693*(1.0+preparedInput.m_METresSyst*sigmaSyst); // quadratic term
1552  // this is a tune for Higgs125
1553  // METresScale=-0.5355*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1554  // METoffset=11.5*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1555  // double METresScale2=0.07196*(1.0+preparedInput.m_METresSyst*sigmaSyst); // quadratic term
1556  sigma= preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt)+METresScale2*preparedInput.m_SumEt : METoffset;
1557  }
1558  if(preparedInput.m_Njet25>0)
1559  {
1560  // use tune for embedding
1561  METresScale=0.8149*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1562  METoffset=5.343*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1563  // this is a tune for Higgs125
1564  // METresScale=0.599*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1565  // METoffset=8.223*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1566  sigma= preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt) : METoffset;
1567  }
1568  preparedInput.m_METsigmaP = sigma;
1569  preparedInput.m_METsigmaL = sigma;
1570  } // end of MMC2015HIGHMASS
1571 
1574  // 2016 MC15c + 2019 leplep
1575  {
1576  m_UseHT=false;
1577  double sigmaSyst=0.10; // 10% systematics for now (be conservative)
1578  double METresScale=-1.0;
1579  double METoffset=-1.0;
1580  double sigma=5.0;
1581  double min_sigma = 2.0;
1582  // tune is based on cuts for Run-1 paper analysis
1583  if(preparedInput.m_Njet25==0)
1584  {
1585  // Madgraph Ztautau MET param
1586  METoffset = 4.22581*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1587  METresScale = 0.03818*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1588  double METresScale2= 0.12623;
1589  sigma= preparedInput.m_SumEt>0.0 ? METoffset+METresScale*sqrt(preparedInput.m_SumEt)+METresScale2*preparedInput.m_SumEt : min_sigma;
1590  if (m_fUseDphiLL) {
1591  double p0 = 2.60131;
1592  double p1const = 1.22427;
1593  double p2quad = -1.71261;
1594  double DphiLL = std::abs(TVector2::Phi_mpi_pi(preparedInput.m_vistau1.Phi()-preparedInput.m_vistau2.Phi()));
1595  sigma *= (DphiLL < p0) ? p1const : p1const+
1596  p2quad*p0*p0 - 2*p2quad*p0*DphiLL+p2quad*DphiLL*DphiLL;
1597  }
1598  if (sigma < min_sigma) sigma = min_sigma;
1599  }
1600  if(preparedInput.m_Njet25>0)
1601  {
1602  // Madgraph Ztautau MET param
1603  METoffset = 5.42506*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1604  METresScale = 5.36760*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1605  double METoffset2 = -4.86808*(1.0+preparedInput.m_METresSyst*sigmaSyst);
1606  if (preparedInput.m_SumEt > 0.0) {
1607  double x = sqrt(preparedInput.m_SumEt);
1608  sigma = (x+METoffset2 > 1) ? METoffset+METresScale*log(x+METoffset2) : METoffset;
1609  } else {
1610  sigma = METoffset;
1611  }
1612  if (m_fUseDphiLL) {
1613  double p0 = 2.24786;
1614  double p1const = 0.908597;
1615  double p2quad = 0.544577;
1616  double DphiLL = std::abs(TVector2::Phi_mpi_pi(preparedInput.m_vistau1.Phi()-preparedInput.m_vistau2.Phi()));
1617  sigma *= (DphiLL < p0) ? p1const : p1const+
1618  p2quad*p0*p0 - 2*p2quad*p0*DphiLL+p2quad*DphiLL*DphiLL;
1619  }
1620  if (sigma < min_sigma) sigma = min_sigma;
1621  }
1622  preparedInput.m_METsigmaP=sigma;
1623  preparedInput.m_METsigmaL=sigma;
1624  }//2016 mc15c
1625 
1626  } // lep-lep
1627 
1628  } //preparedInput.METScanScheme
1629 
1630  if(preparedInput.m_METScanScheme==0) // old scheme with JER
1631  {
1632  if(preparedInput.m_dataType==0 || preparedInput.m_dataType==1) preparedInput.SetMetScanParamsUE(preparedInput.m_SumEt,preparedInput.m_METcovphi,preparedInput.m_dataType);
1633  else preparedInput.SetMetScanParamsUE(preparedInput.m_SumEt,preparedInput.m_METcovphi,0);
1634  }
1635  }
1636  } // end else LFV
1637 
1638  return;
1639 }
DiTauMassTools::MissingMassProb::m_paramVectorAngle
std::vector< TF1 * > m_paramVectorAngle
Definition: MissingMassProb.h:109
DiTauMassTools::Angle
double Angle(const TLorentzVector &vec1, const TLorentzVector &vec2)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/Root/HelperFunctions.cxx:46
MissingMassProb.h
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
PlotCalibFromCool.norm
norm
Definition: PlotCalibFromCool.py:100
DiTauMassTools::TauTypes::lh
@ lh
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:49
DiTauMassTools::MissingMassProb::MnuProbabilityNewWrapper
static double MnuProbabilityNewWrapper(MissingMassProb *prob, MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)
Definition: MissingMassProb.cxx:128
DiTauMassTools::MissingMassProb::m_allowUseHT
bool m_allowUseHT
Definition: MissingMassProb.h:119
pdg_comparison.sigma
sigma
Definition: pdg_comparison.py:324
DiTauMassTools::MissingMassProb::TauProbability
double TauProbability(MissingMassInput &preparedInput, const int &type1, const TLorentzVector &vis1, const TLorentzVector &nu1, const int &type2, const TLorentzVector &vis2, const TLorentzVector &nu2)
Definition: MissingMassProb.cxx:649
DiTauMassTools::MissingMassInput::m_metVec
TVector2 m_metVec
Definition: MissingMassInput.h:77
mean
void mean(std::vector< double > &bins, std::vector< double > &values, const std::vector< std::string > &files, const std::string &histname, const std::string &tplotname, const std::string &label="")
Definition: dependence.cxx:254
scale2
#define scale2
Definition: JetAttributeHisto.cxx:42
DiTauMassTools::MissingMassProb::dTheta3d_probabilityFastWrapper
static double dTheta3d_probabilityFastWrapper(MissingMassProb *prob, MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)
Definition: MissingMassProb.cxx:41
python.SystemOfUnits.m2
int m2
Definition: SystemOfUnits.py:92
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
max
#define max(a, b)
Definition: cfImp.cxx:41
DiTauMassTools::MissingMassProb::MnuProbabilityWrapper
static double MnuProbabilityWrapper(MissingMassProb *prob, MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)
Definition: MissingMassProb.cxx:70
DiTauMassTools::mT
double mT(const TLorentzVector &vec, const TVector2 &met_vec)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/Root/HelperFunctions.cxx:209
IDTPM::R
float R(const U &p)
Definition: TrackParametersHelper.h:101
DiTauMassTools::TauTypes::hh
@ hh
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:49
DiTauMassTools::MissingMassProb::m_fUseTauProbability
bool m_fUseTauProbability
Definition: MissingMassProb.h:121
DiTauMassTools::readInParams
void readInParams(TDirectory *dir, MMCCalibrationSetV2::e aset, std::vector< TF1 * > &lep_numass, std::vector< TF1 * > &lep_angle, std::vector< TF1 * > &lep_ratio, std::vector< TF1 * > &had_angle, std::vector< TF1 * > &had_ratio)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/Root/HelperFunctions.cxx:218
DiTauMassTools::MissingMassInput::m_METsigmaP
double m_METsigmaP
Definition: MissingMassInput.h:60
DiTauMassTools::MissingMassProb::m_formulaAngle1
TF1 * m_formulaAngle1
Definition: MissingMassProb.h:100
DiTauMassTools::MissingMassProb::TauProbabilityLFV
double TauProbabilityLFV(MissingMassInput &preparedInput, const int &type1, const TLorentzVector &vis1, const TLorentzVector &nu1)
Definition: MissingMassProb.cxx:612
DiTauMassTools::MissingMassInput::m_METScanScheme
int m_METScanScheme
Definition: MissingMassInput.h:72
DiTauMassTools::MissingMassProb::m_formulaAngle2
TF1 * m_formulaAngle2
Definition: MissingMassProb.h:101
DiTauMassTools::MissingMassInput::SetMetScanParamsUE
void SetMetScanParamsUE(double sumEt, double phi_scan=0.0, int data_code=0)
Definition: MissingMassInput.cxx:87
DiTauMassTools::MissingMassInput::m_MHtGaussFr
double m_MHtGaussFr
Definition: MissingMassInput.h:68
DiTauMassTools::MissingMassProb::m_probListTwoTau
std::list< std::function< double(MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)> > m_probListTwoTau
Definition: MissingMassProb.h:93
plotBeamSpotCompare.x2
x2
Definition: plotBeamSpotCompare.py:218
DiTauMassTools::MissingMassProb::MET
void MET(MissingMassInput &preparedInput)
Definition: MissingMassProb.cxx:1247
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
DiTauMassTools::MissingMassInput::m_inputMEtT
double m_inputMEtT
Definition: MissingMassInput.h:79
DiTauMassTools::MissingMassInput::m_MHtSigma1
double m_MHtSigma1
Definition: MissingMassInput.h:66
DiTauMassTools::MissingMassInput::m_METsigmaL
double m_METsigmaL
Definition: MissingMassInput.h:61
DiTauMassTools::MissingMassInput::m_tlv_tmp
TLorentzVector m_tlv_tmp
Definition: MissingMassInput.h:78
DiTauMassTools::MissingMassProb::m_fUseDphiLL
bool m_fUseDphiLL
Definition: MissingMassProb.h:123
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
DiTauMassTools::MissingMassProb::m_UseHT
bool m_UseHT
Definition: MissingMassProb.h:120
DiTauMassTools::MissingMassProb::m_fParams
TFile * m_fParams
Definition: MissingMassProb.h:116
DiTauMassTools::MissingMassProb::m_formulaNuMass
TF1 * m_formulaNuMass
Definition: MissingMassProb.h:108
drawFromPickle.exp
exp
Definition: drawFromPickle.py:36
covarianceTool.prob
prob
Definition: covarianceTool.py:678
Phi_mpi_pi
__HOSTDEV__ double Phi_mpi_pi(double)
Definition: GeoRegion.cxx:7
DiTauMassTools::MissingMassProb::s_fit_param
static thread_local double s_fit_param[2][3][6][5]
Definition: MissingMassProb.h:96
x
#define x
DiTauMassTools::MissingMassProb::apply
double apply(MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2, bool constant=false, bool oneTau=false, bool twoTau=false)
Definition: MissingMassProb.cxx:532
DiTauMassTools::MissingMassProb::dTheta3Dparam
double dTheta3Dparam(const int &parInd, const int &tau_type, const double &P_tau, const double *par)
Definition: MissingMassProb.cxx:1132
DiTauMassTools::MissingMassInput::m_METcovphi
double m_METcovphi
Definition: MissingMassInput.h:59
DiTauMassTools::MissingMassProb::TauProbabilityWrapper
static double TauProbabilityWrapper(MissingMassProb *prob, MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)
Definition: MissingMassProb.cxx:62
DiTauMassTools::MissingMassProb::s_ter_sigma_par
static thread_local double s_ter_sigma_par[2][10][3]
Definition: MissingMassProb.h:97
DiTauMassTools::MissingMassInput::m_tauTypes
TauTypes::e m_tauTypes
Definition: MissingMassInput.h:83
DiTauMassTools::MissingMassInput::m_Njet25
int m_Njet25
Definition: MissingMassInput.h:64
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:54
DiTauMassTools
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:22
DiTauMassTools::MissingMassProb::myDelThetaHadFunc
double myDelThetaHadFunc(double *x, double *par)
Definition: MissingMassProb.cxx:1082
python.changerun.m1
m1
Definition: changerun.py:32
DiTauMassTools::MissingMassProb::TauProbabilityNewWrapper
static double TauProbabilityNewWrapper(MissingMassProb *prob, MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)
Definition: MissingMassProb.cxx:114
DiTauMassTools::MissingMassInput::m_htOffset
double m_htOffset
Definition: MissingMassInput.h:81
DiTauMassTools::MissingMassInput::m_SumEt
double m_SumEt
Definition: MissingMassInput.h:62
fitman.g1
g1
Definition: fitman.py:619
DiTauMassTools::MissingMassProb::MnuProbability
double MnuProbability(MissingMassInput &preparedInput, double mnu, double binsize)
Definition: MissingMassProb.cxx:937
lumiFormat.i
int i
Definition: lumiFormat.py:92
DiTauMassTools::MissingMassInput::m_MHtSigma2
double m_MHtSigma2
Definition: MissingMassInput.h:67
DiTauMassTools::MMCCalibrationSetV2::MMC2015HIGHMASS
@ MMC2015HIGHMASS
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:36
DiTauMassTools::MMCCalibrationSetV2::LFVMMC2012
@ LFVMMC2012
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:36
DiTauMassTools::MissingMassProb::m_mmcCalibrationSet
MMCCalibrationSetV2::e m_mmcCalibrationSet
Definition: MissingMassProb.h:117
DiTauMassTools::MissingMassProb::setParamAngle
void setParamAngle(const TLorentzVector &tauvec, int tau, int tautype)
Definition: MissingMassProb.cxx:153
DiTauMassTools::MissingMassProb::m_formulaRatioHad1
TF1 * m_formulaRatioHad1
Definition: MissingMassProb.h:106
DiTauMassTools::MissingMassInput::m_MEtT
double m_MEtT
Definition: MissingMassInput.h:80
DiTauMassTools::MissingMassInput::m_vistau1
TLorentzVector m_vistau1
Definition: MissingMassInput.h:52
DiTauMassTools::MissingMassProb::mEtAndTauProbabilityWrapper
static double mEtAndTauProbabilityWrapper(MissingMassProb *prob, MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)
Definition: MissingMassProb.cxx:31
DiTauMassTools::MissingMassProb::dTheta3d_probabilityFast
double dTheta3d_probabilityFast(MissingMassInput &preparedInput, const int &tau_type, const double &dTheta3d, const double &P_tau)
Definition: MissingMassProb.cxx:1034
DiTauMassTools::MissingMassProb::m_formulaRatioLep2
TF1 * m_formulaRatioLep2
Definition: MissingMassProb.h:105
DiTauMassTools::MMCCalibrationSetV2::MMC2016MC15C
@ MMC2016MC15C
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:36
dumpNswErrorDb.constant
def constant
Definition: dumpNswErrorDb.py:22
DiTauMassTools::MissingMassInput::m_dataType
int m_dataType
Definition: MissingMassInput.h:58
DiTauMassTools::MMCCalibrationSetV2::UPGRADE
@ UPGRADE
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:36
DiTauMassTools::MissingMassInput::m_fUseVerbose
bool m_fUseVerbose
Definition: MissingMassInput.h:76
DiTauMassTools::MissingMassProb::setParamRatio
void setParamRatio(int tau, int tautype)
Definition: MissingMassProb.cxx:182
min
#define min(a, b)
Definition: cfImp.cxx:40
create_dcsc_inputs_sqlite.arg
list arg
Definition: create_dcsc_inputs_sqlite.py:48
DiTauMassTools::MissingMassProb::m_paramVectorRatio
std::vector< TF1 * > m_paramVectorRatio
Definition: MissingMassProb.h:111
DiTauMassTools::MissingMassProb::m_paramVectorRatioLep
std::vector< TF1 * > m_paramVectorRatioLep
Definition: MissingMassProb.h:112
fitman.g2
g2
Definition: fitman.py:624
PathResolver.h
DiTauMassTools::MissingMassProb::m_formulaRatioLep1
TF1 * m_formulaRatioLep1
Definition: MissingMassProb.h:104
DiTauMassTools::MissingMassProb::MetProbability
double MetProbability(MissingMassInput &preparedInput, const double &met1, const double &met2, const double &MetSigma1, const double &MetSigma2)
Definition: MissingMassProb.cxx:551
DiTauMassTools::MissingMassInput::m_DelPhiTT
double m_DelPhiTT
Definition: MissingMassInput.h:65
createCoolChannelIdFile.par
par
Definition: createCoolChannelIdFile.py:29
VP1PartSpect::E
@ E
Definition: VP1PartSpectFlags.h:21
DiTauMassTools::MissingMassProb::MHtProbabilityHH
double MHtProbabilityHH(MissingMassInput &preparedInput, const double &d_mhtX, const double &d_mhtY, const double &mht, const double &trueMetGuess, const double &mht_offset)
Definition: MissingMassProb.cxx:1012
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
DiTauMassTools::MissingMassInput::m_MetVec
TVector2 m_MetVec
Definition: MissingMassInput.h:51
DiTauMassTools::MissingMassProb::m_formulaRatio1
TF1 * m_formulaRatio1
Definition: MissingMassProb.h:102
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:431
DiTauMassTools::MMCCalibrationSetV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:36
DiTauMassTools::MissingMassProb::m_formulaRatioHad2
TF1 * m_formulaRatioHad2
Definition: MissingMassProb.h:107
DiTauMassTools::MissingMassProb
Definition: MissingMassProb.h:27
DiTauMassTools::MissingMassProb::MetProbabilityWrapper
static double MetProbabilityWrapper(MissingMassProb *prob, MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)
Definition: MissingMassProb.cxx:21
DiTauMassTools::MaxHistStrategyV2::e
e
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:26
DiTauMassTools::MissingMassProb::m_fUseMnuProbability
bool m_fUseMnuProbability
Definition: MissingMassProb.h:122
DiTauMassTools::MissingMassProb::setParamNuMass
void setParamNuMass()
Definition: MissingMassProb.cxx:145
DiTauMassTools::MissingMassProb::myDelThetaLepFunc
double myDelThetaLepFunc(double *x, double *par)
Definition: MissingMassProb.cxx:1108
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
DiTauMassTools::MissingMassProb::m_probListConstant
std::list< std::function< double(MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)> > m_probListConstant
Definition: MissingMassProb.h:91
DiTauMassTools::MissingMassInput::m_inputMEtX
double m_inputMEtX
Definition: MissingMassInput.h:79
DiTauMassTools::MissingMassInput::m_vistau2
TLorentzVector m_vistau2
Definition: MissingMassInput.h:53
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
DiTauMassTools::MissingMassInput
Definition: MissingMassInput.h:19
DiTauMassTools::MMCCalibrationSetV2::MMC2019
@ MMC2019
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:36
DiTauMassTools::MissingMassProb::m_paramVectorAngleLep
std::vector< TF1 * > m_paramVectorAngleLep
Definition: MissingMassProb.h:110
DiTauMassTools::MissingMassInput::m_METresSyst
int m_METresSyst
Definition: MissingMassInput.h:73
DiTauMassTools::MissingMassProb::MissingMassProb
MissingMassProb(MMCCalibrationSetV2::e aset, std::string m_paramFilePath)
Definition: MissingMassProb.cxx:213
scale1
#define scale1
Definition: JetAttributeHisto.cxx:41
DiTauMassTools::MissingMassProb::MHtProbability
double MHtProbability(MissingMassInput &preparedInput, const double &d_mhtX, const double &d_mhtY, const double &mht, const double &trueMetGuess, const double &mht_offset)
Definition: MissingMassProb.cxx:995
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
DiTauMassTools::MissingMassInput::m_inputMEtY
double m_inputMEtY
Definition: MissingMassInput.h:79
DiTauMassTools::MissingMassProb::m_formulaRatio2
TF1 * m_formulaRatio2
Definition: MissingMassProb.h:103
DiTauMassTools::MissingMassInput::m_LFVmode
int m_LFVmode
Definition: MissingMassInput.h:82
DiTauMassTools::MissingMassProb::~MissingMassProb
~MissingMassProb()
Definition: MissingMassProb.cxx:529
DiTauMassTools::MissingMassProb::dTheta3d_probabilityNewWrapper
static double dTheta3d_probabilityNewWrapper(MissingMassProb *prob, MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)
Definition: MissingMassProb.cxx:86
checkFileSG.ind
list ind
Definition: checkFileSG.py:118
DiTauMassTools::MissingMassProb::m_paramFilePath
std::string m_paramFilePath
Definition: MissingMassProb.h:115
DiTauMassTools::MissingMassProb::m_probListOneTau
std::list< std::function< double(MissingMassInput &preparedInput, const int &tau_type1, const int &tau_type2, const TLorentzVector &tauvec1, const TLorentzVector &tauvec2, const TLorentzVector nuvec1, const TLorentzVector &nuvec2)> > m_probListOneTau
Definition: MissingMassProb.h:92
DiTauMassTools::MissingMassProb::m_paramVectorNuMass
std::vector< TF1 * > m_paramVectorNuMass
Definition: MissingMassProb.h:113
DiTauMassTools::TauTypes::ll
@ ll
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:49
DiTauMassTools::MissingMassProb::mEtAndTauProbability
double mEtAndTauProbability(MissingMassInput &preparedInput)
Definition: MissingMassProb.cxx:572