1 | #include <iostream> |
---|
2 | #include <math.h> |
---|
3 | #include <utility> |
---|
4 | |
---|
5 | #include <TLorentzVector.h> |
---|
6 | #include <TVector3.h> |
---|
7 | |
---|
8 | using 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 | |
---|
21 | int 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}; |
---|
22 | int 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}; |
---|
23 | int 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}; |
---|
24 | int 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 | |
---|
26 | double Tab[30]; |
---|
27 | |
---|
28 | double min(double a, double b){ |
---|
29 | if (a<b) |
---|
30 | return a; |
---|
31 | else return b; |
---|
32 | } |
---|
33 | |
---|
34 | vector<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 | |
---|
69 | double 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 | |
---|
157 | void 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 | |
---|
161 | void 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 |
---|
276 | vector<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 | |
---|
308 | chi2class 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 | */ |
---|