9 void delta2_fcn(Int_t&, Double_t*, Double_t&, Double_t*, Int_t);
16 else std::cerr <<
"WARNING in NeutrinoBuilder: units different from GeV or MeV" << std::endl;
21 if (
m_debug > 0) std::cout <<
"in destructor " << std::endl;
41 Double_t alpha =
par[0];
43 Double_t dphi =
par[2];
44 Double_t l_pt =
par[3];
45 Double_t l_m =
par[4];
46 Double_t n_px =
par[5];
47 Double_t n_py =
par[6];
49 r /= sqrt(l_pt * l_pt + l_m * l_m) - l_pt *
cos(dphi + alpha);
50 TLorentzVector* neut =
new TLorentzVector(n_px, n_py, 0., 0.);
51 neut->SetE(neut->P());
53 TLorentzVector* neut_new =
54 new TLorentzVector(
r * neut->P() *
cos(neut->Phi() + alpha),
r * neut->P() *
sin(neut->Phi() + alpha), 0., 0.);
55 neut_new->SetE(neut_new->P());
57 delta2 =
pow((neut_new->Px() - neut->Px()), 2) +
pow((neut_new->Py() - neut->Py()), 2);
58 r *= sqrt(l_pt * l_pt + l_m * l_m) - l_pt *
cos(dphi + alpha);
67 double m_mWpdg = 80.4 *
m_Units;
68 Double_t pxNu =
met *
cos(metphi);
69 Double_t pyNu =
met *
sin(metphi);
72 TMinuit*
fit =
new TMinuit(7);
79 fit->mnexcm(
"SET PRIN", arglist, 1, ierr);
82 std::string par_name[7] = {
83 "alpha",
"r",
"dphi",
"l_pt",
"l_m",
"n_px",
"n_py"
85 Double_t par_ival[7] = {
86 0., (m_mWpdg * m_mWpdg - L->M() * L->M()) / (2 * ptNu), metphi - L->Phi(), L->Pt(), L->M(), pxNu, pyNu
88 Double_t par_step[7] = {
89 0.1, 0., 0., 0., 0., 0., 0.
91 Double_t par_min[7] = {
92 -3.15, 0., -3.15, 0., 0., -10000., -10000.
94 Double_t par_max[7] = {
95 3.15, 1., 3.15, 10000., 80., 10000., 10000.
97 for (Int_t
i = 0;
i < 7;
i++) {
98 fit->DefineParameter(
i, par_name[
i].c_str(), par_ival[
i], par_step[
i], par_min[
i], par_max[
i]);
100 fit->FixParameter(
i);
103 fit->SetPrintLevel(-1);
106 Int_t
ret =
fit->GetParameter(0,
a, e_a);
111 std::cout <<
"Error in fit of alpha for met correction" << std::endl;
119 const TLorentzVector*
MET) {
126 const double met_etx,
127 const double met_ety) {
128 if (
m_debug > 0) std::cout <<
"entering NeutrinoBuilder::candidatesFromWMass_Scaling()" << std::endl;
129 std::vector<TLorentzVector*>
NC;
137 const double met_ety, std::vector<TLorentzVector*>&
NC) {
138 if (
m_debug > 0) std::cout <<
"entering NeutrinoBuilder::candidatesFromWMass_Scaling()" << std::endl;
148 double m_mWpdg = 80.4 *
m_Units;
156 ptNu = sqrt(pxNu * pxNu + pyNu * pyNu);
157 alpha =
pow(m_mWpdg, 2) +
pow((pxNu + L->Px()), 2) +
pow((pyNu + L->Py()), 2) -
pow(L->E(), 2);
159 beta = 0.5 * (alpha -
pow(ptNu, 2) +
pow(L->Pz(), 2));
161 lambda = 2 *
beta * L->Pz() / (
pow(L->E(), 2) -
pow(L->Pz(), 2));
164 1) std::cout <<
"count = " <<
count <<
"\tptNu = " << ptNu <<
"\tdelta = " << delta <<
"\tm_mWpdg = " <<
171 double Ptmiss = ptNu;
173 pxNu *= ptNu / Ptmiss;
174 pyNu *= ptNu / Ptmiss;
177 }
while ((delta < 0) && (
count < 10000) && (ptNu > 20 * 1000));
179 if (
m_debug > 0) std::cout <<
"no solution delta still<0" << std::endl;
184 double pz = (lambda - delta) / 2.0;
185 double e = sqrt(pxNu * pxNu + pyNu * pyNu +
pz *
pz);
186 TLorentzVector* nu1 =
new TLorentzVector(pxNu, pyNu,
pz,
e);
187 pz = (lambda + delta) / 2.0;
188 e = sqrt(pxNu * pxNu + pyNu * pyNu +
pz *
pz);
189 TLorentzVector* nu2 =
new TLorentzVector(pxNu, pyNu,
pz,
e);
192 if (
m_debug > 0) std::cout <<
"quitting NeutrinoBuilder::candidatesFromWMass_Scaling()" << std::endl;
199 const TLorentzVector*
MET,
200 const bool useSmallestPz) {
208 const Double_t metphi,
209 const bool useSmallestPz) {
210 if (
m_debug > 0) std::cout <<
"entering candidatesFromWMassRotation()" << std::endl;
213 Double_t m_mWpdg = 80.4 *
m_Units;
214 Double_t pxNu =
met *
cos(metphi);
215 Double_t pyNu =
met *
sin(metphi);
216 Double_t pzNu = -1000000;
220 std::vector<TLorentzVector*>
NC;
222 Double_t
c1 = m_mWpdg * m_mWpdg - L->M() * L->M() + 2 * (L->Px() * pxNu + L->Py() * pyNu);
223 Double_t b1 = 2 * L->Pz();
225 Double_t
A = 4 *
pow(L->E(), 2) - b1 * b1;
226 Double_t
B = -2 *
c1 * b1;
227 Double_t
C = 4 *
pow(L->E(), 2) * ptNu * ptNu -
c1 *
c1;
228 Double_t discr =
B *
B - 4 *
A *
C;
233 sol1 = (-
B + sqrt(discr)) / (2 *
A);
234 sol2 = (-
B - sqrt(discr)) / (2 *
A);
237 Double_t dphi = metphi - L->Phi();
240 2) -
pow(L->M(), 2)) / (2 * ptNu * (sqrt(
pow(L->Pt(), 2) +
pow(L->M(), 2)) - L->Pt() *
cos(dphi + alpha)));
242 Double_t old_p = ptNu;
243 Double_t old_phi = metphi;
244 pxNu =
r * old_p *
cos(old_phi + alpha);
245 pyNu =
r * old_p *
sin(old_phi + alpha);
246 ptNu = sqrt(pxNu * pxNu + pyNu * pyNu);
248 c1 = m_mWpdg * m_mWpdg -
pow(L->M(), 2) + 2 * (L->Px() * pxNu + L->Py() * pyNu);
250 C = 4 *
pow(L->E(), 2) * ptNu * ptNu -
c1 *
c1;
251 discr =
B *
B - 4 *
A *
C;
258 pzNu = (fabs(sol1) > fabs(sol2)) ? sol2 : sol1;
260 eNu = sqrt(pxNu * pxNu + pyNu * pyNu + pzNu * pzNu);
261 TLorentzVector* nu1 =
new TLorentzVector(pxNu, pyNu, pzNu, eNu);
265 eNu = sqrt(pxNu * pxNu + pyNu * pyNu + pzNu * pzNu);
266 TLorentzVector* nu1 =
new TLorentzVector(pxNu, pyNu, pzNu, eNu);
268 eNu = sqrt(pxNu * pxNu + pyNu * pyNu + pzNu * pzNu);
269 TLorentzVector* nu2 =
new TLorentzVector(pxNu, pyNu, pzNu, eNu);
274 if (
m_debug > 0) std::cout <<
"quitting NeutrinoBuilder::candidatesFromWMassRotation() : " <<
NC.size() << std::endl;
281 const TLorentzVector*
MET,
282 const bool useSmallestPz) {
290 const bool useSmallestPz) {
291 if (
m_debug > 0) std::cout <<
"entering candidatesFromWMass_RealPart()" << std::endl;
294 Double_t m_mWpdg = 80.4 *
m_Units;
295 Double_t pxNu =
met *
cos(metphi);
296 Double_t pyNu =
met *
sin(metphi);
297 Double_t pzNu = -1000000;
301 std::vector<TLorentzVector*>
NC;
303 Double_t
c1 = m_mWpdg * m_mWpdg - L->M() * L->M() + 2 * (L->Px() * pxNu + L->Py() * pyNu);
304 Double_t b1 = 2 * L->Pz();
306 Double_t
A = 4 *
pow(L->E(), 2) - b1 * b1;
307 Double_t
B = -2 *
c1 * b1;
308 Double_t
C = 4 *
pow(L->E(), 2) * ptNu * ptNu -
c1 *
c1;
309 Double_t discr =
B *
B - 4 *
A *
C;
313 sol1 = (-
B + sqrt(discr)) / (2 *
A);
314 sol2 = (-
B - sqrt(discr)) / (2 *
A);
320 eNu = sqrt(pxNu * pxNu + pyNu * pyNu + pzNu * pzNu);
321 TLorentzVector* nu1 =
new TLorentzVector(pxNu, pyNu, pzNu, eNu);
327 pzNu = (fabs(sol1) > fabs(sol2)) ? sol2 : sol1;
329 eNu = sqrt(pxNu * pxNu + pyNu * pyNu + pzNu * pzNu);
330 TLorentzVector* nu1 =
new TLorentzVector(pxNu, pyNu, pzNu, eNu);
334 eNu = sqrt(pxNu * pxNu + pyNu * pyNu + pzNu * pzNu);
335 TLorentzVector* nu1 =
new TLorentzVector(pxNu, pyNu, pzNu, eNu);
337 eNu = sqrt(pxNu * pxNu + pyNu * pyNu + pzNu * pzNu);
338 TLorentzVector* nu2 =
new TLorentzVector(pxNu, pyNu, pzNu, eNu);
343 if (
m_debug > 0) std::cout <<
"quitting NeutrinoBuilder::candidatesFromWMass_RealPart() : " <<
NC.size() << std::endl;
350 Double_t m_mWpdg = 80.4 *
m_Units;
351 Double_t pxNu =
met *
cos(metphi);
352 Double_t pyNu =
met *
sin(metphi);
355 Double_t
c1 = m_mWpdg * m_mWpdg - L->M() * L->M() + 2 * (L->Px() * pxNu + L->Py() * pyNu);
356 Double_t b1 = 2 * L->Pz();
358 Double_t
A = 4 *
pow(L->E(), 2) - b1 * b1;
359 Double_t
B = -2 *
c1 * b1;
360 Double_t
C = 4 *
pow(L->E(), 2) * ptNu * ptNu -
c1 *
c1;
361 Double_t discr =
B *
B - 4 *
A *
C;