source: huonglan/ANA2011/chi2calculation.C

Last change on this file was 6, checked in by huonglan, 13 years ago

first full version of 2011 analysis

File size: 14.9 KB
Line 
1#include <iostream>
2#include <math.h>
3#include <utility>
4
5#include <TLorentzVector.h>
6#include <TVector3.h>
7
8using namespace std;
9
10#include "TFitter.h"
11#include "TMath.h"
12
13#include "chi2class.h"
14
15#define PRINT 0
16#define mjet0 false
17#define ksigma 1
18#define sigmaW 2000
19#define sigmadmt 4000
20
21int bqq[] = {1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4};
22int q1W[] = {2,2,3,1,1,3,1,1,2,1,1,2,2,2,3,1,1,3,1,1,2,1,1,2};
23int q2W[] = {3,4,4,3,4,4,2,4,4,2,3,3,3,4,4,3,4,4,2,4,4,2,3,3};
24int ben[] = {4,3,2,4,3,1,4,2,1,3,2,1,4,3,2,4,3,1,4,2,1,3,2,1};
25
26double Tab[30];
27
28double min(double a, double b){
29  if (a<b)
30    return a;
31  else return b;
32}
33
34vector<double> neutrinosolution(double E1, double E2, double E3, double E4, double E5){
35  vector<double> solution;
36
37  double EXm = Tab[9] + Tab[10]*(1-E1/Tab[0]) + Tab[11]*(1-E2/Tab[1]) + Tab[12]*(1-E3/Tab[2]) + Tab[13]*(1-E4/Tab[3]) + Tab[20]*(1-E5/Tab[23]);
38  double EYm = Tab[14] + Tab[15]*(1-E1/Tab[0]) + Tab[16]*(1-E2/Tab[1]) + Tab[17]*(1-E3/Tab[2]) + Tab[18]*(1-E4/Tab[3]) + Tab[21]*(1-E5/Tab[23]);
39
40  double ETm_corr = sqrt(EXm*EXm + EYm*EYm);
41
42  double k  = 80.4e3*80.4e3 + 2.*(Tab[20]*EXm+Tab[21]*EYm);
43  double a  = 4.*Tab[19]*Tab[19];
44  double b  = -4.*k*Tab[22];
45  double c  = 4.*Tab[23]*Tab[23]*ETm_corr*ETm_corr-k*k;
46
47  TVector3 pben(Tab[13],Tab[18],Tab[24]);
48
49  double delta = b*b - 4.*a*c;
50  double Eneu, costhetabenn;
51
52  if (delta < 0)
53    delta = 0;
54     
55  double pZmis = (-b + Tab[25]*sqrt(delta))/2./a;
56  TVector3 pmis3(EXm, EYm, pZmis);
57
58  Eneu = pmis3.Mag();
59  costhetabenn = pmis3*pben/Eneu/pben.Mag();
60
61  solution.push_back(Eneu);
62  solution.push_back(costhetabenn);
63  solution.push_back(EXm);
64  solution.push_back(EYm);
65  solution.push_back(pZmis);
66  return solution;
67}
68
69double chisq(double Ebqq, double Eq1W, double Eq2W, double Eben, double Ee)
70{
71  vector<double> neutrino = neutrinosolution(Ebqq,Eq1W,Eq2W,Eben,Ee);
72  double En = neutrino.at(0);
73  double cosbenn = neutrino.at(1); 
74
75  TVector3 v3e_old(Tab[20],Tab[21],Tab[22]);
76  TVector3 v3n(neutrino.at(2),neutrino.at(3),neutrino.at(4));
77
78  double tbqq = (Tab[0] - Ebqq)/(ksigma*0.5)/sqrt(Ebqq*1000);
79  double tq1W = (Tab[1] - Eq1W)/(ksigma*0.5)/sqrt(Eq1W*1000);
80  double tq2W = (Tab[2] - Eq2W)/(ksigma*0.5)/sqrt(Eq2W*1000);
81  double tben = (Tab[3] - Eben)/(ksigma*0.5)/sqrt(Eben*1000);
82  double te   = (Tab[23] - Ee)/(ksigma*0.1)/sqrt(Ee*1000);
83 
84  double mass0 = 0, mass1 = 0, mass2 = 0, mass3 = 0, tmW = 0, tmen = 0, tmt = 0;
85  double tmt1 = 0, tmt2 = 0, mintmt = 0;
86 
87  if (mjet0){
88    double costhetane = v3e_old*v3n/v3e_old.Mag()/v3n.Mag();
89    mass0 = sqrt(2*En*Ee*(1-costhetane));
90    mass1 = sqrt(2*Eq1W*Eq2W*(1-Tab[4]));
91    mass2 = sqrt(2*(Eq1W*Eq2W*(1-Tab[4]) + Eq1W*Ebqq*(1-Tab[5]) + Eq2W*Ebqq*(1-Tab[6])));
92    mass3 = sqrt(80400*80400 + 2*(Eben*Tab[7]*(1-Tab[8]) + En*Eben*(1-cosbenn)));
93 
94    tmW = (mass1 - 80400)/sigmaW;
95    tmen= (mass0 - 80400)/sigmaW; // Is 0 if Delta > 0, != 0 otherwise ==> good penalty ?
96    tmt = (mass2 - mass3)/sigmadmt;
97  }
98  //double tmt1 = (mass2 - 172e3)/4000.;
99  //double tmt2 = (mass3 - 172e3)/4000.;
100
101  else{
102    //Recalculate the masses with 4-vectors
103    TVector3 v3bqq_old(Tab[10],Tab[15],Tab[28]);
104   
105    TVector3 v3q1W_old(Tab[11],Tab[16],Tab[27]);
106    TVector3 v3q2W_old(Tab[12],Tab[17],Tab[26]);
107    TVector3 v3ben_old(Tab[13],Tab[18],Tab[24]);
108
109    double kbqq = Ebqq/Tab[0];
110    double kq1W = Eq1W/Tab[1];
111    double kq2W = Eq2W/Tab[2];
112    double kben = Eben/Tab[3];
113    double ke   = Ee/Tab[23];
114 
115    TVector3 v3bqq_new = kbqq*v3bqq_old;
116    TVector3 v3q1W_new = kq1W*v3q1W_old;
117    TVector3 v3q2W_new = kq2W*v3q2W_old;
118    TVector3 v3ben_new = kben*v3ben_old;
119    TVector3 v3e_new   = ke*v3e_old;
120
121    TLorentzVector vbqqnew(v3bqq_new,Ebqq);
122    TLorentzVector vq1Wnew(v3q1W_new,Eq1W);
123    TLorentzVector vq2Wnew(v3q2W_new,Eq2W);
124    TLorentzVector vbennew(v3ben_new,Eben);
125    TLorentzVector venew(v3e_new,Ee);
126    TLorentzVector vn(v3n,neutrino.at(0));
127
128    TLorentzVector vWlep = venew + vn;
129    mass0 = vWlep.M();
130
131    TLorentzVector vWhad = vq1Wnew + vq2Wnew;
132    mass1 = vWhad.M();
133 
134    TLorentzVector vth = vWhad + vbqqnew;
135    mass2 = vth.M();
136 
137    TLorentzVector vtl = vWlep + vbennew;
138    mass3 = vtl.M();
139 
140    tmW  = (mass1 - 80400)/sigmaW;
141    tmen = (mass0 - 80400)/sigmaW; // Is 0 if Delta > 0, != 0 otherwise ==> good penalty ?
142    tmt  = (mass2 - mass3)/sigmadmt; 
143    tmt1 = (mass2 - 172e3)/sigmaW;
144    tmt2 = (mass3 - 172e3)/sigmaW;
145
146    mintmt = min(fabs(tmt1),fabs(tmt2));
147  }
148 
149  if (Tab[29] == -1) //freefit = false
150    return tbqq*tbqq + tq1W*tq1W + tq2W*tq2W + tben*tben + te*te + tmW*tmW + tmen*tmen + mintmt*mintmt;//this is used for the case of fit1top
151  else
152    return tbqq*tbqq + tq1W*tq1W + tq2W*tq2W + tben*tben + te*te + tmW*tmW + tmen*tmen + tmt*tmt;//this is used for the case of freefit
153
154  //return tbqq*tbqq + tq1W*tq1W + tq2W*tq2W + tben*tben + te*te + tmW*tmW + tmen*tmen + tmt1*tmt1 + tmt2*tmt2;//this is used for the case of fit2top
155}
156
157void fcn(int& nDim, double* gout, double& result, double par[], int flg) {
158  result = chisq(par[0], par[1], par[2], par[3], par[4]);
159}
160
161void configfunction(vector<TLorentzVector> par, double METetx, double METety, int config, bool freefit){
162
163  //jet1
164  TLorentzVector vbqq  = par.at(bqq[config] - 1); 
165  //jet2
166  TLorentzVector vq1W  = par.at(q1W[config] - 1);
167  //jet3
168  TLorentzVector vq2W  = par.at(q2W[config] - 1);
169  //jet4
170  TLorentzVector vben  = par.at(ben[config] - 1);
171
172  //Change a bit to win time here! But in fact not :-D
173  //We check if the inv mass of the sum of vq1W and vq2W
174  //can give the mW in a safe region
175  //TLorentzVector vW = vq1W + vq2W;
176  //double mW = vW.M();
177  //if (fabs(mW-80.4e3)>3e4) return false;
178
179  //jet1
180  TVector3 vbqq3 = vbqq.Vect();
181  double ptXbqq   = vbqq.Vect().X();
182  double ptYbqq   = vbqq.Vect().Y();
183  double ptZbqq   = vbqq.Vect().Z();
184  double Ebqq     = vbqq.T();
185
186  //jet2
187  TVector3 vq1W3 = vq1W.Vect();
188  double ptXq1W   = vq1W.Vect().X();
189  double ptYq1W   = vq1W.Vect().Y();
190  double ptZq1W   = vq1W.Vect().Z();
191  double Eq1W     = vq1W.T();
192
193  //jet3
194  TVector3 vq2W3 = vq2W.Vect();
195  double ptXq2W   = vq2W.Vect().X();
196  double ptYq2W   = vq2W.Vect().Y();
197  double ptZq2W   = vq2W.Vect().Z();
198  double Eq2W     = vq2W.T();
199
200  //jet4
201  TVector3 vben3 = vben.Vect();
202  double ptXben   = vben.Vect().X();
203  double ptYben   = vben.Vect().Y();
204  double ptZben   = vben.Vect().Z();
205  double Eben     = vben.T();
206
207  //electron
208  TLorentzVector veW   = par.at(4);
209  TVector3 veW3  = veW.Vect();
210 
211  double costhetaq1q2 = vq1W3*vq2W3/vq1W3.Mag()/vq2W3.Mag();
212  double costhetaq1b  = vq1W3*vbqq3/vq1W3.Mag()/vbqq3.Mag();
213  double costhetaq2b  = vq2W3*vbqq3/vq2W3.Mag()/vbqq3.Mag();
214  double costhetabene = vben3*veW3/vben3.Mag()/veW3.Mag();
215 
216  double pTe = veW.Pt();
217  double pXe = veW3.X();
218  double pYe = veW3.Y();
219  double pZe = veW3.Z();
220  double Ee  = veW.E();
221
222  Tab[0] = Ebqq;
223  Tab[1] = Eq1W;
224  Tab[2] = Eq2W;
225  Tab[3] = Eben;
226  Tab[4] = costhetaq1q2; 
227  Tab[5] = costhetaq1b;
228  Tab[6] = costhetaq2b;
229  Tab[7] = veW.T();
230  Tab[8] = costhetabene;
231
232  Tab[9]  = METetx;
233  Tab[10] = ptXbqq;
234  Tab[11] = ptXq1W;
235  Tab[12] = ptXq2W;
236  Tab[13] = ptXben;
237
238  Tab[14] = METety;
239  Tab[15] = ptYbqq;
240  Tab[16] = ptYq1W;
241  Tab[17] = ptYq2W;
242  Tab[18] = ptYben;
243
244  Tab[19] = pTe;
245  Tab[20] = pXe;
246  Tab[21] = pYe;
247  Tab[22] = pZe;
248  Tab[23] = Ee;
249
250  Tab[24] = ptZben;
251  Tab[26] = ptZq2W;
252  Tab[27] = ptZq1W;
253  Tab[28] = ptZbqq;
254 
255  if (config >= 0 && config < 12)
256    Tab[25] = 1;
257  else 
258    Tab[25] = -1;
259
260  if (PRINT) {
261    cout << "Config " << config << " initialised" << endl;
262    for (int i = 0; i < 26; i++)
263      cout << "Tab[" << i << "] : " << Tab[i] << endl;
264  }
265 
266  if (freefit)
267    Tab[29] = 1;
268  else 
269    Tab[29] = -1;
270
271  //return true;
272 
273}
274
275//Choose 4 jets for chi2
276vector<vector<int> > choose4jets(vector<TLorentzVector> jets) {
277  unsigned int nJets = jets.size();
278  vector<vector<int> > ind;
279
280  if (nJets==4){
281    vector<int> ind1;
282    for (unsigned int i1 = 0; i1 < nJets; i1++){     
283      ind1.push_back(i1);
284    }
285    ind.push_back(ind1);
286  }
287  else {
288    for (unsigned int i1 = 0; i1 < nJets; i1++){
289      for (unsigned int i2=i1+1; i2 < nJets; i2++){
290        for (unsigned int i3=i2+1; i3 < nJets; i3++){
291          for (unsigned int i4=i3+1; i4 < nJets; i4++){
292            vector<int> ind1;
293            ind1.push_back(i1);
294            ind1.push_back(i2);
295            ind1.push_back(i3);
296            ind1.push_back(i4);
297            ind.push_back(ind1);
298          }//end of loop i4
299        }//end of loop i3
300      }//end of loop i2
301    }//end of loop i1
302  }//end of else loop
303 
304  return ind;
305 
306}
307
308chi2class chi2calculation(int iconfig)
309{
310  //Initialize TFitter
311  TFitter* minimizer = new TFitter(5);
312  double p1 = -1;
313   
314  minimizer->ExecuteCommand("SET PRINTOUT",&p1,1);
315  minimizer->ExecuteCommand("SET NOWarnings",0,0);
316
317  minimizer->SetFCN(fcn);
318  // Define the parameters
319  // arg1 parameter number
320  // arg2 parameter name
321  // arg3 first guess at parameter value
322  // arg4 estimated distance to minimum
323  // arg5, arg6 ignore for now
324  //     minimizer->SetParameter(0,"Ebqq",Tab[0],0.5*sqrt(Tab[0]*1000),0,0);
325  //     minimizer->SetParameter(1,"Eq1W",Tab[1],0.5*sqrt(Tab[1]*1000),0,0);
326  //     minimizer->SetParameter(2,"Eq2W",Tab[2],0.5*sqrt(Tab[2]*1000),0,0);
327  //     minimizer->SetParameter(3,"Eben",Tab[3],0.5*sqrt(Tab[3]*1000),0,0);
328  //     minimizer->SetParameter(4,"Ee",Tab[23],0.1*sqrt(Tab[23]*1000),0,0);
329  minimizer->SetParameter(0,"Ebqq",Tab[0],0.5*sqrt(Tab[0]*1000),max(0.,Tab[0]-3*sqrt(Tab[0]*1000)),Tab[0]+3*sqrt(Tab[0]*1000));
330  minimizer->SetParameter(1,"Eq1W",Tab[1],0.5*sqrt(Tab[1]*1000),max(0.,Tab[1]-3*sqrt(Tab[1]*1000)),Tab[1]+3*sqrt(Tab[1]*1000));
331  minimizer->SetParameter(2,"Eq2W",Tab[2],0.5*sqrt(Tab[2]*1000),max(0.,Tab[2]-3*sqrt(Tab[2]*1000)),Tab[2]+3*sqrt(Tab[2]*1000));
332  minimizer->SetParameter(3,"Eben",Tab[3],0.5*sqrt(Tab[3]*1000),max(0.,Tab[3]-3*sqrt(Tab[3]*1000)),Tab[3]+3*sqrt(Tab[3]*1000));
333  minimizer->SetParameter(4,"Ee",Tab[23],0.1*sqrt(Tab[23]*1000),max(0.,Tab[23]-0.3*sqrt(Tab[23]*1000)),Tab[23]+0.3*sqrt(Tab[23]*1000));
334
335  //Just fit 4 energies => fix the 5th one
336  minimizer->FixParameter(4);
337     
338  // Run the simplex minimizer to get close to the minimum
339  minimizer->ExecuteCommand("SIMPLEX",0,0);
340  // Run the migrad minimizer (an extended Powell's method) to improve the
341  // fit.
342  minimizer->ExecuteCommand("MIGRAD",0,0);
343  // Get the best fit values
344  double BestE1 = minimizer->GetParameter(0);
345  double BestE2 = minimizer->GetParameter(1);
346  double BestE3 = minimizer->GetParameter(2);
347  double BestE4 = minimizer->GetParameter(3);
348  double BestE5 = minimizer->GetParameter(4);
349  double Minimum = chisq(BestE1,BestE2,BestE3,BestE4,BestE5);
350
351  chi2class Result(iconfig,Minimum,BestE1,BestE2,BestE3,BestE4,BestE5);
352
353  delete minimizer;
354  minimizer = 0;
355
356  return Result;
357}
358
359
360
361/*std::set<double> chi2calculation (vector<TLorentzVector> vecparticles, double etx, double ety, int iconfig)
362{
363  //Initialize TFitter
364  TFitter* minimizer = new TFitter(5);
365  double p1 = -1;
366 
367  minimizer->ExecuteCommand("SET PRINTOUT",&p1,1);
368  minimizer->ExecuteCommand("SET NOWarnings",0,0);
369 
370  //if (!configfunction(vecpars2,MET_RefFinal_etx,MET_RefFinal_ety,i)) continue;
371 
372  configfunction(vecparticles,etx,ety,iconfig); 
373     
374  minimizer->SetFCN(fcn);
375  // Define the parameters
376  // arg1 parameter number
377  // arg2 parameter name
378  // arg3 first guess at parameter value
379  // arg4 estimated distance to minimum
380  // arg5, arg6 ignore for now
381  //     minimizer->SetParameter(0,"Ebqq",Tab[0],0.5*sqrt(Tab[0]*1000),0,0);
382  //     minimizer->SetParameter(1,"Eq1W",Tab[1],0.5*sqrt(Tab[1]*1000),0,0);
383  //     minimizer->SetParameter(2,"Eq2W",Tab[2],0.5*sqrt(Tab[2]*1000),0,0);
384  //     minimizer->SetParameter(3,"Eben",Tab[3],0.5*sqrt(Tab[3]*1000),0,0);
385  //     minimizer->SetParameter(4,"Ee",Tab[23],0.1*sqrt(Tab[23]*1000),0,0);
386  minimizer->SetParameter(0,"Ebqq",Tab[0],0.5*sqrt(Tab[0]*1000),max(0.,Tab[0]-3*sqrt(Tab[0]*1000)),Tab[0]+3*sqrt(Tab[0]*1000));
387  minimizer->SetParameter(1,"Eq1W",Tab[1],0.5*sqrt(Tab[1]*1000),max(0.,Tab[1]-3*sqrt(Tab[1]*1000)),Tab[1]+3*sqrt(Tab[1]*1000));
388  minimizer->SetParameter(2,"Eq2W",Tab[2],0.5*sqrt(Tab[2]*1000),max(0.,Tab[2]-3*sqrt(Tab[2]*1000)),Tab[2]+3*sqrt(Tab[2]*1000));
389  minimizer->SetParameter(3,"Eben",Tab[3],0.5*sqrt(Tab[3]*1000),max(0.,Tab[3]-3*sqrt(Tab[3]*1000)),Tab[3]+3*sqrt(Tab[3]*1000));
390  minimizer->SetParameter(4,"Ee",Tab[23],0.1*sqrt(Tab[23]*1000),max(0.,Tab[23]-0.3*sqrt(Tab[23]*1000)),Tab[23]+0.3*sqrt(Tab[23]*1000));
391 
392  //minimizer->FixParameter(4);
393 
394  // Run the simplex minimizer to get close to the minimum
395  minimizer->ExecuteCommand("SIMPLEX",0,0);
396  // Run the migrad minimizer (an extended Powell's method) to improve the
397  // fit.
398  minimizer->ExecuteCommand("MIGRAD",0,0);
399  // Get the best fit values
400  double bestE1 = minimizer->GetParameter(0);
401  double bestE2 = minimizer->GetParameter(1);
402  double bestE3 = minimizer->GetParameter(2);
403  double bestE4 = minimizer->GetParameter(3);
404  double bestE5 = minimizer->GetParameter(4);
405  double minimum = chisq(bestE1,bestE2,bestE3,bestE4,bestE5);
406  vector<double> neutrino = neutrinosolution(bestE1,bestE2,bestE3,bestE4,bestE5);
407 
408  double Eneu = neutrino.at(0);
409  double costhetabenn = neutrino.at(1);
410  double METx = neutrino.at(2);
411  double METy = neutrino.at(3);
412  double METz = neutrino.at(4);
413  TVector3 vneu3fit(METx,METy,METz);
414  TLorentzVector vneufit(vneu3fit,Eneu);
415  TVector3 v3eold(Tab[20],Tab[21],Tab[22]);
416  double ke   = bestE5/Tab[23];
417  TVector3 v3e_fit   = ke*v3eold;
418  TLorentzVector vefit(v3e_fit,bestE5);
419 
420  double costhetane = v3e_fit*vneu3fit/v3e_fit.Mag()/vneu3fit.Mag();
421   
422  double mWlepfit = 0, mWhadfit = 0, m2 = 0, m3 = 0;
423  TLorentzVector vth, vtl;
424  TLorentzVector vWhad, vWlep;
425 
426  if (mjet0) {
427    mWlepfit = sqrt(2*Eneu*bestE5*(1-costhetane));
428    mWhadfit = sqrt(2*bestE2*bestE3*(1-Tab[4]));
429    m2 = sqrt(2*(bestE2*bestE3*(1-Tab[4]) + bestE2*bestE1*(1-Tab[5]) + bestE3*bestE1*(1-Tab[6])));
430    m3 = sqrt(80400*80400 + 2*(bestE4*bestE5*(1-Tab[8]) + Eneu*bestE4*(1-costhetabenn)));
431  }
432  else {//m_jet is not 0
433        //Recalculate the masses with 4-vectors
434    TVector3 v3bqqold(Tab[10],Tab[15],Tab[28]);
435    TVector3 v3q1Wold(Tab[11],Tab[16],Tab[27]);
436    TVector3 v3q2Wold(Tab[12],Tab[17],Tab[26]);
437    TVector3 v3benold(Tab[13],Tab[18],Tab[24]);
438   
439    double kbqq = bestE1/Tab[0];
440    double kq1W = bestE2/Tab[1];
441    double kq2W = bestE3/Tab[2];
442    double kben = bestE4/Tab[3];
443   
444    TVector3 v3bqq_fit = kbqq*v3bqqold;
445    TVector3 v3q1W_fit = kq1W*v3q1Wold;
446    TVector3 v3q2W_fit = kq2W*v3q2Wold;
447    TVector3 v3ben_fit = kben*v3benold;
448
449    TLorentzVector vbqqfit(v3bqq_fit,bestE1);
450    TLorentzVector vq1Wfit(v3q1W_fit,bestE2);
451    TLorentzVector vq2Wfit(v3q2W_fit,bestE3);
452    TLorentzVector vbenfit(v3ben_fit,bestE4);
453       
454    vWlep = vefit + vneufit;
455    vWhad = vq1Wfit + vq2Wfit;
456    vth = vWhad + vbqqfit;
457    vtl = vWlep + vbenfit;
458   
459    //mWlepfit = vWlep.M();
460    //mWhadfit = vWhad.M();
461    //m2 = vth.M();//masse top hadronique
462    //m3 = vtl.M();//masse top leptonique
463  }
464
465  delete minimizer;
466  minimizer = 0;
467}
468*/
Note: See TracBrowser for help on using the repository browser.