00001 #include "TauSpinner/tau_reweight_lib.h"
00002 #include "TauSpinner/nonSM.h"
00003 using namespace Tauolapp;
00004
00005 namespace TauSpinner {
00006
00007
00008
00009
00010 double CMSENE = 7000.0;
00011
00012
00013 bool Ipp = true;
00014 int Ipol = 1;
00015 int nonSM2 = 0;
00016 int nonSMN = 0;
00017 int relWTnonSM = 1;
00018 double WTnonSM=1.0;
00019 double Polari =0.0;
00020
00021
00022 bool IfHiggs=false;
00023 double WTamplit=1;
00024 double WTamplitP=1;
00025 double WTamplitM=1;
00026
00027 int IfHsimple=0;
00028 double XMH = 125.0;
00029 double XGH = 1.0;
00030 double Xnorm = 0.15;
00031
00032
00033
00034
00035 double f(double x, int ID, double SS, double cmsene)
00036
00037
00038
00039
00040
00041 {
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 return LHAPDF::xfx(x, SS, ID)/x;
00054
00055
00056
00057 }
00058
00059 double sigborn(int ID, double SS, double costhe)
00060 {
00061
00062
00063
00064 int tauID = 15;
00065
00066
00067 if (IfHiggs) {
00068 double SIGggHiggs=0.;
00069 if(ID==0){
00070 int IPOne = 1;
00071 int IMOne = -1;
00072 SIGggHiggs=disth_(&SS, &costhe, &IPOne, &IPOne)+disth_(&SS, &costhe, &IPOne, &IMOne)+
00073 disth_(&SS, &costhe, &IMOne, &IPOne)+disth_(&SS, &costhe, &IMOne, &IMOne);
00074
00075
00076 double PI=3.14159265358979324;
00077 SIGggHiggs *= XMH * XMH * XMH *XGH /PI/ ((SS-XMH*XMH)*(SS-XMH*XMH) + XGH*XGH*XMH*XMH);
00078
00079
00080 if(IfHsimple==1) SIGggHiggs = Xnorm * XMH * XGH /PI/ ((SS-XMH*XMH)*(SS-XMH*XMH) +XGH*XGH*XMH*XMH);
00081
00082 }
00083 return SIGggHiggs;
00084 }
00085
00086
00087
00088 if (ID==0) return 0.0 ;
00089 if (ID>0) initwk_( &ID, &tauID, &SS);
00090 else
00091 {
00092 ID = -ID;
00093 initwk_( &ID, &tauID, &SS);
00094 }
00095
00096 int iZero = 0;
00097 double dOne = 1.0;
00098 double dMOne = -1.0;
00099
00100 return ( t_born_(&iZero, &SS, &costhe, &dOne , &dOne) + t_born_(&iZero, &SS, &costhe, &dOne , &dMOne)
00101 + t_born_(&iZero, &SS, &costhe, &dMOne, &dOne) + t_born_(&iZero, &SS, &costhe, &dMOne, &dMOne))/SS/123231.;
00102
00103 }
00104
00105
00106
00107
00108
00109
00110 void initialize_spinner(bool _Ipp, int _Ipol, int _nonSM2, int _nonSMN, double _CMSENE)
00111 {
00112 Ipp = _Ipp;
00113 Ipol = _Ipol;
00114 nonSM2 = _nonSM2;
00115 nonSMN = _nonSMN;
00116
00117 CMSENE = _CMSENE;
00118
00119 cout<<" ------------------------------------------------------"<<endl;
00120 cout<<" TauSpinner v1.3"<<endl;
00121 cout<<" ---------------"<<endl;
00122 cout<<" 20.Apr.2013 "<<endl;
00123 cout<<" by Z. Czyczula, T. Przedzinski and Z. Was"<<endl;
00124 cout<<" for extra coupling contribution "<<endl;
00125 cout<<" by J. Kalinowski and Wojciech Kotlarski"<<endl;
00126 cout<<" ------------------------------------------------------"<<endl;
00127 cout<<" Ipp - true for pp collision; otherwise polarization"<<endl;
00128 cout<<" of individual taus from Z/gamma* is set to 0.0"<<endl;
00129 cout<<" Ipp = "<<Ipp<<endl;
00130 cout<<" CMSENE - used in PDF calculations; only if Ipp = true"<<endl;
00131 cout<<" and only for Z/gamma*"<<endl;
00132 cout<<" CMSENE = "<<CMSENE<<endl;
00133 cout<<" Ipol - relevant for Z/gamma* decays "<<endl;
00134 cout<<" 0 - events generated without spin effects "<<endl;
00135 cout<<" 1 - events generated with all spin effects "<<endl;
00136 cout<<" 2 - events generated with spin correlations and <pol>=0 "<<endl;
00137 cout<<" Ipol = "<<Ipol<<endl;
00138 cout<<" Ipol - relevant for Z/gamma* decays "<<endl;
00139 cout<<" NOTE: For Ipol=0,1 algorithm is identical. "<<endl;
00140 cout<<" However in user program role of wt need change. "<<endl;
00141 cout<<" nonSM2 = "<<nonSM2<<endl;
00142 cout<<" 1/0 extra term in cross section, density matrix on/off "<<endl;
00143 cout<<" nonSMN = "<<nonSMN<<endl;
00144 cout<<" 1/0 extra term in cross section, for shapes only? on/off "<<endl;
00145 cout<<" ------------------------------------------------------ "<<endl;
00146 }
00147
00148
00149
00150
00151
00152
00153
00154 void setRelWTnonSM(int _relWTnonSM)
00155 {
00156 relWTnonSM = _relWTnonSM;
00157 }
00158
00159
00160
00161
00162
00163 void setHiggsParameters(int jak, double mass, double width, double normalization)
00164 {
00165 IfHsimple=jak;
00166 XMH = mass;
00167 XGH = width;
00168 Xnorm = normalization;
00169 }
00170
00171
00172
00173
00174 void getHiggsParameters(double *mass, double *width, double *normalization)
00175 {
00176 *mass = XMH;
00177 *width = XGH;
00178 *normalization = Xnorm;
00179 }
00180
00181
00182
00183
00184 void setSpinOfSample(int _Ipol)
00185 {
00186 Ipol = _Ipol;
00187 }
00188
00189
00190
00191
00192 void setNonSMkey(int _key)
00193 {
00194 nonSM2 = _key;
00195 }
00196
00197
00198
00199
00200 double getWtNonSM()
00201 {
00202 return WTnonSM;
00203 }
00204
00205
00206
00207 double getWtamplitP(){return WTamplitP;}
00208 double getWtamplitM(){return WTamplitM;}
00209
00210
00211
00212
00213
00214 double getTauSpin()
00215 {
00216 return Polari;
00217 }
00218
00219
00220
00221
00222
00223
00224
00225 double calculateWeightFromParticlesWorHpn(SimpleParticle &sp_X, SimpleParticle &sp_tau, SimpleParticle &sp_nu_tau, vector<SimpleParticle> &sp_tau_daughters)
00226 {
00227
00228
00229 Particle X ( sp_X.px(), sp_X.py(), sp_X.pz(), sp_X.e(), sp_X.pdgid() );
00230 Particle tau ( sp_tau.px(), sp_tau.py(), sp_tau.pz(), sp_tau.e(), sp_tau.pdgid() );
00231 Particle nu_tau(sp_nu_tau.px(), sp_nu_tau.py(), sp_nu_tau.pz(), sp_nu_tau.e(), sp_nu_tau.pdgid() );
00232
00233 vector<Particle> tau_daughters;
00234
00235
00236 int tau_pdgid = sp_tau.pdgid();
00237
00238
00239 for(unsigned int i=0; i<sp_tau_daughters.size(); i++)
00240 {
00241 Particle pp(sp_tau_daughters[i].px(),
00242 sp_tau_daughters[i].py(),
00243 sp_tau_daughters[i].pz(),
00244 sp_tau_daughters[i].e(),
00245 sp_tau_daughters[i].pdgid() );
00246
00247 tau_daughters.push_back(pp);
00248 }
00249
00250 double phi2 = 0.0, theta2 = 0.0;
00251
00252
00253
00254
00255 prepareKinematicForHH (tau, nu_tau, tau_daughters, &phi2, &theta2);
00256
00257
00258
00259 double *HH = calculateHH(tau_pdgid, tau_daughters, phi2, theta2);
00260
00261 double sign = 1.0;
00262 if ( abs(sp_X.pdgid()) == 24 ) { sign= 1.0; }
00263 else if( abs(sp_X.pdgid()) == 37 ) { sign=-1.0; }
00264 else
00265 {
00266 cout<<"wrong sp_W/H.pdgid()="<<sp_X.pdgid()<<endl;
00267 exit(-1);
00268 }
00269 if (sp_X.pdgid() < 0 )
00270 {WTamplitM = WTamplit;}
00271 else
00272 {WTamplitP = WTamplit;}
00273
00274 double WT = 1.0+sign*HH[2];
00275
00276
00277 DEBUG
00278 (
00279 cout<<tau_pdgid<<" -> ";
00280 for(unsigned int i=0;i<tau_daughters.size();i++) cout<<tau_daughters[i].pdgid()<<" ";
00281 cout<<" (HH: "<<HH[0]<<" "<<HH[1]<<" "<<HH[2]<<" "<<HH[3]<<") WT: "<<WT<<endl;
00282 )
00283
00284 if( WT>2.0 || WT<0.0)
00285 {
00286 cout<<"ERROR: WT not in range [0,2]."<<endl;
00287 exit(-1);
00288 }
00289
00290 delete HH;
00291
00292 return WT;
00293 }
00294
00295
00296
00297
00298
00299
00300
00301 double calculateWeightFromParticlesH(SimpleParticle &sp_X, SimpleParticle &sp_tau1, SimpleParticle &sp_tau2, vector<SimpleParticle> &sp_tau1_daughters, vector<SimpleParticle> &sp_tau2_daughters)
00302 {
00303
00304
00305 SimpleParticle sp_tau;
00306 SimpleParticle sp_nu_tau;
00307 vector<SimpleParticle> sp_tau_daughters;
00308
00309
00310 if (sp_tau1.pdgid() == -15 )
00311 {
00312 sp_tau = sp_tau1;
00313 sp_nu_tau = sp_tau2;
00314 sp_tau_daughters = sp_tau1_daughters;
00315 }
00316 else
00317 {
00318 sp_tau = sp_tau2;
00319 sp_nu_tau = sp_tau1;
00320 sp_tau_daughters = sp_tau2_daughters;
00321 }
00322
00323 double *HHp, *HHm;
00324
00325
00326 if(true)
00327 {
00328
00329 Particle X ( sp_X.px(), sp_X.py(), sp_X.pz(), sp_X.e(), sp_X.pdgid() );
00330 Particle tau ( sp_tau.px(), sp_tau.py(), sp_tau.pz(), sp_tau.e(), sp_tau.pdgid() );
00331 Particle nu_tau( sp_nu_tau.px(), sp_nu_tau.py(), sp_nu_tau.pz(), sp_nu_tau.e(), sp_nu_tau.pdgid() );
00332
00333 vector<Particle> tau_daughters;
00334
00335
00336 int tau_pdgid = sp_tau.pdgid();
00337
00338
00339 for(unsigned int i=0; i<sp_tau_daughters.size(); i++)
00340 {
00341 Particle pp(sp_tau_daughters[i].px(),
00342 sp_tau_daughters[i].py(),
00343 sp_tau_daughters[i].pz(),
00344 sp_tau_daughters[i].e(),
00345 sp_tau_daughters[i].pdgid() );
00346
00347 tau_daughters.push_back(pp);
00348 }
00349
00350 double phi2 = 0.0, theta2 = 0.0;
00351
00352
00353
00354
00355 prepareKinematicForHH (tau, nu_tau, tau_daughters, &phi2, &theta2);
00356
00357
00358
00359 HHp = calculateHH(tau_pdgid, tau_daughters, phi2, theta2);
00360
00361 DEBUG
00362 (
00363 cout<<tau_pdgid<<" -> ";
00364 for(unsigned int i=0;i<tau_daughters.size();i++) cout<<tau_daughters[i].pdgid()<<" ";
00365 cout<<" (HHp: "<<HHp[0]<<" "<<HHp[1]<<" "<<HHp[2]<<" "<<HHp[3]<<") ";
00366 cout<<endl;
00367 )
00368
00369 WTamplitP = WTamplit;
00370 }
00371
00372
00373 if(sp_tau1.pdgid() == 15 )
00374 {
00375 sp_tau = sp_tau1;
00376 sp_nu_tau = sp_tau2;
00377 sp_tau_daughters = sp_tau1_daughters;
00378 }
00379 else
00380 {
00381 sp_tau = sp_tau2;
00382 sp_nu_tau = sp_tau1;
00383 sp_tau_daughters = sp_tau2_daughters;
00384 }
00385
00386
00387 if(true)
00388 {
00389
00390 Particle X ( sp_X.px(), sp_X.py(), sp_X.pz(), sp_X.e(), sp_X.pdgid() );
00391 Particle tau ( sp_tau.px(), sp_tau.py(), sp_tau.pz(), sp_tau.e(), sp_tau.pdgid() );
00392 Particle nu_tau( sp_nu_tau.px(), sp_nu_tau.py(), sp_nu_tau.pz(), sp_nu_tau.e(), sp_nu_tau.pdgid() );
00393
00394 vector<Particle> tau_daughters;
00395
00396
00397 int tau_pdgid = sp_tau.pdgid();
00398
00399
00400 for(unsigned int i=0; i<sp_tau_daughters.size(); i++)
00401 {
00402 Particle pp(sp_tau_daughters[i].px(),
00403 sp_tau_daughters[i].py(),
00404 sp_tau_daughters[i].pz(),
00405 sp_tau_daughters[i].e(),
00406 sp_tau_daughters[i].pdgid() );
00407
00408 tau_daughters.push_back(pp);
00409 }
00410
00411 double phi2 = 0.0, theta2 = 0.0;
00412
00413
00414
00415
00416 prepareKinematicForHH (tau, nu_tau, tau_daughters, &phi2, &theta2);
00417
00418
00419
00420 HHm = calculateHH(tau_pdgid, tau_daughters, phi2, theta2);
00421
00422 DEBUG
00423 (
00424 cout<<tau_pdgid<<" -> ";
00425 for(unsigned int i=0;i<tau_daughters.size();i++) cout<<tau_daughters[i].pdgid()<<" ";
00426 cout<<" (HHm: "<<HHm[0]<<" "<<HHm[1]<<" "<<HHm[2]<<" "<<HHm[3]<<") ";
00427 cout<<endl;
00428 )
00429
00430 WTamplitM = WTamplit;
00431 }
00432
00433 double sign = 1.0;
00434 if(sp_X.pdgid() == 25) { sign=-1.0; }
00435 if(sp_X.pdgid() == 36) { sign=-1.0; }
00436
00437 double WT = 0.0;
00438 Polari = 0.0;
00439
00440 if(sign == -1.0)
00441 {
00442 double S = sp_X.e()*sp_X.e() - sp_X.px()*sp_X.px() - sp_X.py()*sp_X.py() - sp_X.pz()*sp_X.pz();
00443 IfHiggs=true;
00444 double pol = getLongitudinalPolarization(S, sp_tau, sp_nu_tau);
00445
00446 if(nonSM2==1)
00447 {
00448
00449 double corrX2;
00450 double polX2;
00451
00452
00453
00454
00455 polX2=pol;
00456 corrX2=-sign;
00457
00458 WT = 1.0+corrX2*HHp[2]*HHm[2]+polX2*HHp[2]+polX2*HHm[2];
00459
00460 double RRR = Tauola::randomDouble();
00461 Polari=1.0;
00462 if (RRR<(1.0+polX2)*(1.0+corrX2*HHp[2]*HHm[2]+HHp[2]+HHm[2])/(2.0+2.0*corrX2*HHp[2]*HHm[2]+2.0*polX2*HHp[2]+2.0*polX2*HHm[2])) Polari=-1.0; }
00463 else
00464 {
00465 WT = 1.0+sign*HHp[2]*HHm[2];
00466
00467 double RRR = Tauola::randomDouble();
00468 Polari=1.0;
00469 if (RRR<(1.0+sign*HHp[2]*HHm[2]+HHp[2]-HHm[2])/(2.0+2.0*sign*HHp[2]*HHm[2])) Polari=-1.0;
00470 }
00471 }
00472 else
00473 {
00474
00475 double S = sp_X.e()*sp_X.e() - sp_X.px()*sp_X.px() - sp_X.py()*sp_X.py() - sp_X.pz()*sp_X.pz();
00476
00477
00478
00479
00480 IfHiggs=false;
00481 double pol = getLongitudinalPolarization(S, sp_tau, sp_nu_tau);
00482
00483
00484 double RRR = Tauola::randomDouble();
00485 WT = 1.0+sign*HHp[2]*HHm[2]+pol*HHp[2]+pol*HHm[2];
00486
00487
00488
00489
00490 if(Ipol==2) WT = WT/(1.0+sign*HHp[2]*HHm[2]);
00491
00492
00493 Polari=1.0;
00494 if (RRR<(1.0+pol)*(1.0+sign*HHp[2]*HHm[2]+HHp[2]+HHm[2])/(2.0+2.0*sign*HHp[2]*HHm[2]+2.0*pol*HHp[2]+2.0*pol*HHm[2])) Polari=-1.0;
00495 }
00496
00497
00498 DEBUG( cout<<" WT: "<<WT<<endl; )
00499
00500 if (WT<0.0) {
00501 WT = 0.0;
00502 cout << "Setting WT to be 0.0" << endl;
00503 }
00504
00505 if (WT>4.0) {
00506 WT = 4.0;
00507 cout << "Setting WT to be 4.0" << endl;
00508 }
00509
00510 if( WT>4.0 || WT<0.0)
00511 {
00512 cout<<"ERROR: Z/gamma* or H, and WT not in range [0,4]."<<endl;
00513 exit(-1);
00514 }
00515
00516 if (sign==-1.0) {
00517 if (WT>2.0) {
00518 WT = 2.0;
00519 cout << "Setting WT to be 2.0" << endl;
00520 }
00521 }
00522
00523 if( sign==-1.0 && (WT>2.0 || WT<0.0) )
00524 {
00525 cout<<"ERROR: H and WT not in range [0,2]."<<endl;
00526 exit(-1);
00527 }
00528
00529 delete[] HHp;
00530 delete[] HHm;
00531
00532 return WT;
00533 }
00534
00535
00536
00537
00538
00539
00540
00541 void prepareKinematicForHH(Particle &tau, Particle &nu_tau, vector<Particle> &tau_daughters, double *phi2, double *theta2)
00542 {
00543 Particle P_QQ( tau.px()+nu_tau.px(), tau.py()+nu_tau.py(), tau.pz()+nu_tau.pz(), tau.e()+nu_tau.e(), 0 );
00544
00545
00546
00547
00548
00549
00550 tau.boostToRestFrame(P_QQ);
00551 nu_tau.boostToRestFrame(P_QQ);
00552
00553 for(unsigned int i=0; i<tau_daughters.size();i++)
00554 tau_daughters[i].boostToRestFrame(P_QQ);
00555
00556
00557
00558
00559
00560
00561
00562 double phi = tau.getAnglePhi();
00563
00564 tau.rotateXY(-phi);
00565
00566 double theta = tau.getAngleTheta();
00567
00568 tau.rotateXZ(M_PI-theta);
00569
00570 nu_tau.rotateXY(-phi );
00571 nu_tau.rotateXZ(M_PI-theta);
00572
00573 for(unsigned int i=0; i<tau_daughters.size();i++)
00574 {
00575 tau_daughters[i].rotateXY(-phi );
00576 tau_daughters[i].rotateXZ(M_PI-theta);
00577 }
00578
00579
00580
00581
00582
00583
00584 for(unsigned int i=0; i<tau_daughters.size();i++)
00585 tau_daughters[i].boostAlongZ(-tau.pz(),tau.e());
00586
00587
00588
00589
00590
00591
00592
00593 *phi2 = tau_daughters[0].getAnglePhi();
00594
00595 tau_daughters[0].rotateXY( -(*phi2) );
00596
00597 *theta2 = tau_daughters[0].getAngleTheta();
00598
00599 tau_daughters[0].rotateXZ( -(*theta2) );
00600
00601 for(unsigned int i=1; i<tau_daughters.size();i++)
00602 {
00603 tau_daughters[i].rotateXY( -(*phi2) );
00604 tau_daughters[i].rotateXZ( -(*theta2) );
00605 }
00606
00607
00608
00609 }
00610
00611
00612
00613
00614
00615
00616
00617
00618
00619
00620
00621 double* calculateHH(int tau_pdgid, vector<Particle> &tau_daughters, double phi, double theta)
00622 {
00623 int channel = 0;
00624 double *HH = new double[4];
00625
00626 HH[0]=HH[1]=HH[2]=HH[3]=0.0;
00627
00628 vector<int> pdgid;
00629
00630
00631 for(unsigned int i=0; i<tau_daughters.size(); i++)
00632 pdgid.push_back( tau_daughters[i].pdgid() );
00633
00634
00635
00636
00637
00638 if( pdgid.size()==2 &&
00639 (
00640 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16,-211) ) ||
00641 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 211) ) ||
00642 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16,-321) ) ||
00643 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 321) )
00644 )
00645 ) {
00646 channel = 3;
00647 if(abs(pdgid[1])==321) channel = 6;
00648 DEBUG( cout<<"Channel "<<channel<<" : "; )
00649
00650
00651
00652
00653
00654
00655
00656 const double AMTAU = 1.777;
00657 double AMPI = sqrt(tau_daughters[1].e() *tau_daughters[1].e()
00658 -tau_daughters[1].px()*tau_daughters[1].px()
00659 -tau_daughters[1].py()*tau_daughters[1].py()
00660 -tau_daughters[1].pz()*tau_daughters[1].pz());
00661
00662 double PXQ=AMTAU*tau_daughters[1].e();
00663 double PXN=AMTAU*tau_daughters[0].e();
00664 double QXN=tau_daughters[1].e()*tau_daughters[0].e()-tau_daughters[1].px()*tau_daughters[0].px()-tau_daughters[1].py()*tau_daughters[0].py()-tau_daughters[1].pz()*tau_daughters[0].pz();
00665 double BRAK=(2*PXQ*QXN-AMPI*AMPI*PXN);
00666
00667 WTamplit = (1.16637E-5)*(1.16637E-5)*BRAK/2.;
00668 HH[0] = AMTAU*(2*tau_daughters[1].px()*QXN-tau_daughters[0].px()*AMPI*AMPI)/BRAK;
00669 HH[1] = AMTAU*(2*tau_daughters[1].py()*QXN-tau_daughters[0].py()*AMPI*AMPI)/BRAK;
00670 HH[2] = AMTAU*(2*tau_daughters[1].pz()*QXN-tau_daughters[0].pz()*AMPI*AMPI)/BRAK;
00671 HH[3] = 1.0;
00672 }
00673
00674
00675
00676
00677
00678
00679
00680
00681
00682 else if( pdgid.size()==3 &&
00683 (
00684 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16,-211, 111) ) ||
00685 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 211, 111) ) ||
00686 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16,-211, 130) ) ||
00687 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 211, 130) ) ||
00688 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16,-211, 310) ) ||
00689 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 211, 310) ) ||
00690 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16,-321, 111) ) ||
00691 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 321, 111) )
00692 )
00693 ) {
00694
00695 channel = 4;
00696 if(abs(pdgid[1])==321 || abs(pdgid[2])==130 || abs(pdgid[2])==310) channel = 7;
00697 DEBUG( cout<<"Channel "<<channel<<" : "; )
00698
00699
00700
00701
00702
00703
00704 const double AMTAU = 1.777;
00705
00706 double QQ[4];
00707 QQ[0]=tau_daughters[1].e() -tau_daughters[2].e() ;
00708 QQ[1]=tau_daughters[1].px()-tau_daughters[2].px();
00709 QQ[2]=tau_daughters[1].py()-tau_daughters[2].py();
00710 QQ[3]=tau_daughters[1].pz()-tau_daughters[2].pz();
00711
00712 double PKS[4];
00713 PKS[0]=tau_daughters[1].e() +tau_daughters[2].e() ;
00714 PKS[1]=tau_daughters[1].px()+tau_daughters[2].px();
00715 PKS[2]=tau_daughters[1].py()+tau_daughters[2].py();
00716 PKS[3]=tau_daughters[1].pz()+tau_daughters[2].pz();
00717
00718
00719 double PKSD=PKS[0]*PKS[0]-PKS[1]*PKS[1]-PKS[2]*PKS[2]-PKS[3]*PKS[3];
00720 double QQPKS=QQ[0]*PKS[0]-QQ[1]*PKS[1]-QQ[2]*PKS[2]-QQ[3]*PKS[3];
00721
00722 QQ[0]=QQ[0]-PKS[0]*QQPKS/PKSD;
00723 QQ[1]=QQ[1]-PKS[1]*QQPKS/PKSD;
00724 QQ[2]=QQ[2]-PKS[2]*QQPKS/PKSD;
00725 QQ[3]=QQ[3]-PKS[3]*QQPKS/PKSD;
00726
00727 double PRODPQ=AMTAU*QQ[0];
00728 double PRODNQ=tau_daughters[0].e() *QQ[0]
00729 -tau_daughters[0].px()*QQ[1]
00730 -tau_daughters[0].py()*QQ[2]
00731 -tau_daughters[0].pz()*QQ[3];
00732 double PRODPN=AMTAU*tau_daughters[0].e();
00733 double QQ2 =QQ[0]*QQ[0]-QQ[1]*QQ[1]-QQ[2]*QQ[2]-QQ[3]*QQ[3];
00734
00735 double BRAK=(2*PRODPQ*PRODNQ-PRODPN*QQ2);
00736
00737 WTamplit = (1.16637E-5)*(1.16637E-5)*BRAK/2.;
00738 HH[0]=AMTAU*(2*PRODNQ*QQ[1]-QQ2*tau_daughters[0].px())/BRAK;
00739 HH[1]=AMTAU*(2*PRODNQ*QQ[2]-QQ2*tau_daughters[0].py())/BRAK;
00740 HH[2]=AMTAU*(2*PRODNQ*QQ[3]-QQ2*tau_daughters[0].pz())/BRAK;
00741 HH[3]=1.0;
00742 }
00743
00744
00745
00746 else if( pdgid.size()==3 &&
00747 (
00748 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16, 11,-12) ) ||
00749 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16,-11, 12) )
00750 )
00751 ) {
00752 DEBUG( cout<<"Channel 1 : "; )
00753 channel = 1;
00754
00755
00756
00757 int ITDKRC = 0;
00758 double XK0DEC = 0.01;
00759 double XK[4] = { 0.0 };
00760 double XA[4] = { tau_daughters[2].px(), tau_daughters[2].py(), tau_daughters[2].pz(), tau_daughters[2].e() };
00761 double QP[4] = { tau_daughters[1].px(), tau_daughters[1].py(), tau_daughters[1].pz(), tau_daughters[1].e() };
00762 double XN[4] = { tau_daughters[0].px(), tau_daughters[0].py(), tau_daughters[0].pz(), tau_daughters[0].e() };
00763 double AMPLIT = 0.0;
00764 double HV[4] = { 0.0 };
00765
00766
00767
00768 QP[3] = sqrt( QP[0]*QP[0] + QP[1]*QP[1] + QP[2]*QP[2] + 0.511e-3*0.511e-3);
00769 XA[3] = sqrt( XA[0]*XA[0] + XA[1]*XA[1] + XA[2]*XA[2] );
00770
00771 dampry_( &ITDKRC, &XK0DEC, XK, XA, QP, XN, &LIT, HV );
00772
00773 WTamplit = AMPLIT;
00774 HH[0] = -HV[0];
00775 HH[1] = -HV[1];
00776 HH[2] = -HV[2];
00777 HH[3] = HV[3];
00778 }
00779
00780
00781
00782 else if( pdgid.size()==4 &&
00783 (
00784 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16, 11,-12, 22) ) ||
00785 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16,-11, 12, 22) )
00786 )
00787 ) {
00788 DEBUG( cout<<"Channel 1b : "; )
00789 channel = 1;
00790
00791
00792
00793 int ITDKRC = 1;
00794 double XK0DEC = 0.01;
00795 double XK[4] = { tau_daughters[3].px(), tau_daughters[3].py(), tau_daughters[3].pz(), tau_daughters[3].e() };
00796 double XA[4] = { tau_daughters[2].px(), tau_daughters[2].py(), tau_daughters[2].pz(), tau_daughters[2].e() };
00797 double QP[4] = { tau_daughters[1].px(), tau_daughters[1].py(), tau_daughters[1].pz(), tau_daughters[1].e() };
00798 double XN[4] = { tau_daughters[0].px(), tau_daughters[0].py(), tau_daughters[0].pz(), tau_daughters[0].e() };
00799 double AMPLIT = 0.0;
00800 double HV[4] = { 0.0 };
00801
00802
00803
00804 QP[3] = sqrt( QP[0]*QP[0] + QP[1]*QP[1] + QP[2]*QP[2] + 0.511e-3*0.511e-3);
00805 XA[3] = sqrt( XA[0]*XA[0] + XA[1]*XA[1] + XA[2]*XA[2] );
00806 XK[3] = sqrt( XK[0]*XK[0] + XK[1]*XK[1] + XK[2]*XK[2] );
00807
00808 if(XK0DEC > XK[3]/(XK[3]+XA[3]+QP[3]+XN[3])) XK0DEC=0.5*XK[3]/(XK[3]+XA[3]+QP[3]+XN[3]);
00809
00810 dampry_( &ITDKRC, &XK0DEC, XK, XA, QP, XN, &LIT, HV );
00811
00812 WTamplit = AMPLIT;
00813 HH[0] = -HV[0];
00814 HH[1] = -HV[1];
00815 HH[2] = -HV[2];
00816 HH[3] = HV[3];
00817 }
00818
00819
00820
00821 else if( pdgid.size()==3 &&
00822 (
00823 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16, 13,-14) ) ||
00824 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16,-13, 14) )
00825 )
00826 ) {
00827
00828 DEBUG( cout<<"Channel 2 : "; )
00829 channel = 2;
00830
00831
00832
00833 int ITDKRC = 0;
00834 double XK0DEC = 0.01;
00835 double XK[4] = { 0.0 };
00836 double XA[4] = { tau_daughters[2].px(), tau_daughters[2].py(), tau_daughters[2].pz(), tau_daughters[2].e() };
00837 double QP[4] = { tau_daughters[1].px(), tau_daughters[1].py(), tau_daughters[1].pz(), tau_daughters[1].e() };
00838 double XN[4] = { tau_daughters[0].px(), tau_daughters[0].py(), tau_daughters[0].pz(), tau_daughters[0].e() };
00839 double AMPLIT = 0.0;
00840 double HV[4] = { 0.0 };
00841
00842
00843
00844 QP[3] = sqrt( QP[0]*QP[0] + QP[1]*QP[1] + QP[2]*QP[2] + 0.105659*0.105659);
00845 XA[3] = sqrt( XA[0]*XA[0] + XA[1]*XA[1] + XA[2]*XA[2] );
00846
00847 dampry_( &ITDKRC, &XK0DEC, XK, XA, QP, XN, &LIT, HV );
00848
00849 WTamplit = AMPLIT;
00850 HH[0] = -HV[0];
00851 HH[1] = -HV[1];
00852 HH[2] = -HV[2];
00853 HH[3] = HV[3];
00854 }
00855
00856
00857
00858 else if( pdgid.size()==4 &&
00859 (
00860 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16, 13,-14, 22) ) ||
00861 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16,-13, 14, 22) )
00862 )
00863 ) {
00864
00865 DEBUG( cout<<"Channel 2b : "; )
00866 channel = 2;
00867
00868
00869
00870 int ITDKRC = 1;
00871 double XK0DEC = 0.01;
00872 double XK[4] = { tau_daughters[3].px(), tau_daughters[3].py(), tau_daughters[3].pz(), tau_daughters[3].e() };
00873 double XA[4] = { tau_daughters[2].px(), tau_daughters[2].py(), tau_daughters[2].pz(), tau_daughters[2].e() };
00874 double QP[4] = { tau_daughters[1].px(), tau_daughters[1].py(), tau_daughters[1].pz(), tau_daughters[1].e() };
00875 double XN[4] = { tau_daughters[0].px(), tau_daughters[0].py(), tau_daughters[0].pz(), tau_daughters[0].e() };
00876 double AMPLIT = 0.0;
00877 double HV[4] = { 0.0 };
00878
00879
00880
00881 QP[3] = sqrt( QP[0]*QP[0] + QP[1]*QP[1] + QP[2]*QP[2] + 0.105659*0.105659);
00882 XA[3] = sqrt( XA[0]*XA[0] + XA[1]*XA[1] + XA[2]*XA[2] );
00883 XK[3] = sqrt( XK[0]*XK[0] + XK[1]*XK[1] + XK[2]*XK[2] );
00884
00885 if(XK0DEC > XK[3]/(XK[3]+XA[3]+QP[3]+XN[3])) XK0DEC=0.5*XK[3]/(XK[3]+XA[3]+QP[3]+XN[3]);
00886
00887
00888 dampry_( &ITDKRC, &XK0DEC, XK, XA, QP, XN, &LIT, HV );
00889
00890 WTamplit = AMPLIT;
00891 HH[0] = -HV[0];
00892 HH[1] = -HV[1];
00893 HH[2] = -HV[2];
00894 HH[3] = HV[3];
00895 }
00896
00897
00898
00899 else if( pdgid.size()==4 &&
00900 (
00901 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16, 111, 111,-211) ) ||
00902 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 111, 111, 211) )
00903 )
00904 ) {
00905 DEBUG( cout<<"Channel 5 : "; )
00906 channel = 5;
00907
00908
00909 jaki_.ktom = 1 ;
00910
00911 const double AMTAU = 1.777;
00912 int MNUM = 0;
00913 float PT[4] = { 0.0, 0.0, 0.0, (float)AMTAU };
00914 float PN[4] = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
00915 float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
00916 float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
00917 float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
00918 float AMPLIT = 0.0;
00919 float HV[4] = { 0.0 };
00920
00921 damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
00922
00923 WTamplit = AMPLIT;
00924 HH[0] = -HV[0];
00925 HH[1] = -HV[1];
00926 HH[2] = -HV[2];
00927 HH[3] = HV[3];
00928 }
00929
00930
00931
00932 else if( pdgid.size()==4 &&
00933 (
00934 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16,-211,-211, 211) ) ||
00935 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 211, 211,-211) )
00936 )
00937 ) {
00938 DEBUG( cout<<"Channel 5 : "; )
00939 channel = 5;
00940
00941
00942 jaki_.ktom = 1 ;
00943
00944 const double AMTAU = 1.777;
00945 int MNUM = 0;
00946 float PT[4] = { 0.0, 0.0, 0.0, (float)AMTAU };
00947 float PN[4] = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
00948 float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
00949 float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
00950 float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
00951 float AMPLIT = 0.0;
00952 float HV[4] = { 0.0 };
00953
00954 damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
00955
00956 WTamplit = AMPLIT;
00957 HH[0] = -HV[0];
00958 HH[1] = -HV[1];
00959 HH[2] = -HV[2];
00960 HH[3] = HV[3];
00961 }
00962
00963
00964 else if( pdgid.size()==5 &&
00965 (
00966 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16,-211,-211, 211, 111) ) ||
00967 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 211, 211,-211, 111) )
00968 )
00969 ) {
00970 DEBUG( cout<<"Channel 8 : "; )
00971 channel = 8;
00972
00973 jaki_.ktom = 1 ;
00974
00975 const double AMTAU = 1.777;
00976 int MNUM = 1;
00977 float PT[4] = { 0.0, 0.0, 0.0, (float)AMTAU };
00978 float PN[4] = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
00979 float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
00980 float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
00981 float PIZ [4] = { (float)tau_daughters[4].px(), (float)tau_daughters[4].py(), (float)tau_daughters[4].pz(), (float)tau_daughters[4].e() };
00982 float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
00983 float AMPLIT = 0.0;
00984 float HV[4] = { 0.0 };
00985
00986 dam4pi_( &MNUM, PT, PN, PIM1, PIM2, PIZ, PIPL, &LIT, HV );
00987
00988 WTamplit = AMPLIT;
00989 HH[0] = -HV[0];
00990 HH[1] = -HV[1];
00991 HH[2] = -HV[2];
00992 HH[3] = HV[3];
00993 }
00994
00995
00996 else if( pdgid.size()==5 &&
00997 (
00998 ( tau_pdgid== 15 && channelMatch(tau_daughters, 16, 111, 111, 111,-211) ) ||
00999 ( tau_pdgid==-15 && channelMatch(tau_daughters,-16, 111, 111, 111, 211) )
01000 )
01001 ) {
01002 DEBUG( cout<<"Channel 9 : "; )
01003 channel = 9;
01004
01005 jaki_.ktom = 1 ;
01006
01007 const double AMTAU = 1.777;
01008 int MNUM = 2;
01009 float PT[4] = { 0.0, 0.0, 0.0, (float)AMTAU };
01010 float PN[4] = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
01011 float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
01012 float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
01013 float PIZ [4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
01014 float PIPL[4] = { (float)tau_daughters[4].px(), (float)tau_daughters[4].py(), (float)tau_daughters[4].pz(), (float)tau_daughters[4].e() };
01015 float AMPLIT = 0.0;
01016 float HV[4] = { 0.0 };
01017
01018 dam4pi_( &MNUM, PT, PN, PIM1, PIM2, PIZ, PIPL, &LIT, HV );
01019
01020 WTamplit = AMPLIT;
01021 HH[0] = -HV[0];
01022 HH[1] = -HV[1];
01023 HH[2] = -HV[2];
01024 HH[3] = HV[3];
01025 }
01026 else {
01027
01028 DEBUG( cout<<tau_daughters.size()<<"-part ???: "; )
01029
01030 }
01031
01032
01033 Particle HHbuf(HH[0], HH[1], HH[2], HH[3], 0);
01034
01035 HHbuf.rotateXZ(theta);
01036 HHbuf.rotateXY(phi);
01037
01038 HH[0] = HHbuf.px();
01039 HH[1] = HHbuf.py();
01040 HH[2] = HHbuf.pz();
01041 HH[3] = HHbuf.e ();
01042
01043 return HH;
01044 }
01045
01046
01047
01048
01049
01050
01051
01052
01053 double getLongitudinalPolarization(double S, SimpleParticle &sp_tau, SimpleParticle &sp_nu_tau)
01054 {
01055
01056 Particle tau_plus ( sp_tau.px(), sp_tau.py(), sp_tau.pz(), sp_tau.e(), sp_tau.pdgid() );
01057 Particle tau_minus( sp_nu_tau.px(), sp_nu_tau.py(), sp_nu_tau.pz(), sp_nu_tau.e(), sp_nu_tau.pdgid() );
01058
01059
01060 Particle P_QQ( tau_plus.px()+tau_minus.px(), tau_plus.py()+tau_minus.py(), tau_plus.pz()+tau_minus.pz(), tau_plus.e()+tau_minus.e(), 0 );
01061
01062 Particle P_B1(0, 0, 1, 1, 0);
01063 Particle P_B2(0, 0,-1, 1, 0);
01064
01065 tau_plus. boostToRestFrame(P_QQ);
01066 tau_minus.boostToRestFrame(P_QQ);
01067 P_B1. boostToRestFrame(P_QQ);
01068 P_B2. boostToRestFrame(P_QQ);
01069
01070 double costheta1 = (tau_plus.px()*P_B1.px() +tau_plus.py()*P_B1.py() +tau_plus.pz()*P_B1.pz() ) /
01071 sqrt(tau_plus.px()*tau_plus.px()+tau_plus.py()*tau_plus.py()+tau_plus.pz()*tau_plus.pz()) /
01072 sqrt(P_B1.px() *P_B1.px() +P_B1.py() *P_B1.py() +P_B1.pz() *P_B1.pz() );
01073
01074 double costheta2 = (tau_minus.px()*P_B2.px() +tau_minus.py()*P_B2.py() +tau_minus.pz()*P_B2.pz() ) /
01075 sqrt(tau_minus.px()*tau_minus.px()+tau_minus.py()*tau_minus.py()+tau_minus.pz()*tau_minus.pz()) /
01076 sqrt(P_B2.px() *P_B2.px() +P_B2.py() *P_B2.py() +P_B2.pz() *P_B2.pz() );
01077
01078 double sintheta1 = sqrt(1-costheta1*costheta1);
01079 double sintheta2 = sqrt(1-costheta2*costheta2);
01080
01081
01082 double costhe = (costheta1*sintheta2 + costheta2*sintheta1) / (sintheta1 + sintheta2);
01083
01084
01085 double SS = S;
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096 double x1x2 = SS/CMSENE/CMSENE;
01097 double x1Mx2 = P_QQ.pz()/CMSENE*2;
01098
01099 double x1 = ( x1Mx2 + sqrt(x1Mx2*x1Mx2 + 4*x1x2) )/2;
01100 double x2 = ( -x1Mx2 + sqrt(x1Mx2*x1Mx2 + 4*x1x2) )/2;
01101
01102 double WID[11];
01103 WID[0] = f(x1, 0,SS,CMSENE)*f(x2, 0,SS,CMSENE) * sigborn(0,SS, costhe);
01104 WID[1] = f(x1, 1,SS,CMSENE)*f(x2,-1,SS,CMSENE) * sigborn(1,SS, costhe);
01105 WID[2] = f(x1,-1,SS,CMSENE)*f(x2, 1,SS,CMSENE) * sigborn(1,SS,-costhe);
01106 WID[3] = f(x1, 2,SS,CMSENE)*f(x2,-2,SS,CMSENE) * sigborn(2,SS, costhe);
01107 WID[4] = f(x1,-2,SS,CMSENE)*f(x2, 2,SS,CMSENE) * sigborn(2,SS,-costhe);
01108 WID[5] = f(x1, 3,SS,CMSENE)*f(x2,-3,SS,CMSENE) * sigborn(1,SS, costhe);
01109 WID[6] = f(x1,-3,SS,CMSENE)*f(x2, 3,SS,CMSENE) * sigborn(1,SS,-costhe);
01110 WID[7] = f(x1, 4,SS,CMSENE)*f(x2,-4,SS,CMSENE) * sigborn(2,SS, costhe);
01111 WID[8] = f(x1,-4,SS,CMSENE)*f(x2, 4,SS,CMSENE) * sigborn(2,SS,-costhe);
01112 WID[9] = f(x1, 5,SS,CMSENE)*f(x2,-5,SS,CMSENE) * sigborn(1,SS, costhe);
01113 WID[10]= f(x1,-5,SS,CMSENE)*f(x2, 5,SS,CMSENE) * sigborn(1,SS,-costhe);
01114
01115 double sum = 0.0;
01116 for(int i=0;i<=10;i++) sum+=WID[i];
01117
01118 WTnonSM=1.0;
01119 if(relWTnonSM==0) WTnonSM=sum;
01120 if(nonSM2==1)
01121 {
01122 double WID2[11];
01123 WID2[0] = f(x1, 0,SS,CMSENE)*f(x2, 0,SS,CMSENE) * sigborn(0,SS, costhe) * plweight(0,SS, costhe);
01124 WID2[1] = f(x1, 1,SS,CMSENE)*f(x2,-1,SS,CMSENE) * sigborn(1,SS, costhe) * plweight(1,SS, costhe);
01125 WID2[2] = f(x1,-1,SS,CMSENE)*f(x2, 1,SS,CMSENE) * sigborn(1,SS,-costhe) * plweight(1,SS,-costhe);
01126 WID2[3] = f(x1, 2,SS,CMSENE)*f(x2,-2,SS,CMSENE) * sigborn(2,SS, costhe) * plweight(2,SS, costhe);
01127 WID2[4] = f(x1,-2,SS,CMSENE)*f(x2, 2,SS,CMSENE) * sigborn(2,SS,-costhe) * plweight(2,SS,-costhe);
01128 WID2[5] = f(x1, 3,SS,CMSENE)*f(x2,-3,SS,CMSENE) * sigborn(1,SS, costhe) * plweight(1,SS, costhe);
01129 WID2[6] = f(x1,-3,SS,CMSENE)*f(x2, 3,SS,CMSENE) * sigborn(1,SS,-costhe) * plweight(1,SS,-costhe);
01130 WID2[7] = f(x1, 4,SS,CMSENE)*f(x2,-4,SS,CMSENE) * sigborn(2,SS, costhe) * plweight(2,SS, costhe);
01131 WID2[8] = f(x1,-4,SS,CMSENE)*f(x2, 4,SS,CMSENE) * sigborn(2,SS,-costhe) * plweight(2,SS,-costhe);
01132 WID2[9] = f(x1, 5,SS,CMSENE)*f(x2,-5,SS,CMSENE) * sigborn(1,SS, costhe) * plweight(1,SS, costhe);
01133 WID2[10]= f(x1,-5,SS,CMSENE)*f(x2, 5,SS,CMSENE) * sigborn(1,SS,-costhe) * plweight(1,SS,-costhe);
01134
01135 double sum2 = 0.0;
01136 for(int i=0;i<=10;i++) sum2+=WID2[i];
01137
01138 WTnonSM=sum2/sum ;
01139 if(relWTnonSM==0) WTnonSM=sum2;
01140 }
01141
01142 double pol = 0.0;
01143
01144 if(IfHiggs && nonSM2==1) {
01145 double polp = plzap2(0,15,S,costhe);
01146 pol += (2*(1-polp)-1);
01147 return pol;
01148 }
01149 if(IfHiggs) return NAN;
01150
01151
01152 for(int i=0;i<=10;i++) WID[i]/=sum;
01153
01154
01155
01156 int ICC = -1;
01157
01158 for(int i=1;i<=10;i++)
01159 {
01160
01161 ICC = i;
01162 double cost = costhe;
01163
01164
01165 if( ICC==2 || ICC==4 || ICC==6 || ICC==8 || ICC==10 ) cost = -cost;
01166
01167
01168 int ID = 2;
01169
01170 if( ICC==1 || ICC==2 || ICC==5 || ICC==6 || ICC==9 || ICC==10 ) ID = 1;
01171
01172 int tau_pdgid = 15;
01173
01174 double polp = plzap2(ID,tau_pdgid,S,cost);
01175 pol += (2*(1-polp)-1)*WID[i];
01176 }
01177
01178
01179
01180 if(!Ipp) pol=0.0;
01181
01182 return pol;
01183 }
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195 bool channelMatch(vector<Particle> &particles, int p1, int p2, int p3, int p4, int p5, int p6)
01196 {
01197
01198 vector<int> list;
01199
01200 for(unsigned int i=0;i<particles.size();i++) list.push_back(particles[i].pdgid());
01201
01202
01203 int p[6] = { p1, p2, p3, p4, p5, p6 };
01204
01205
01206
01207 for(int i=0;i<6;i++)
01208 {
01209
01210 if(p[i]==0) break;
01211
01212 bool found = false;
01213
01214 for(unsigned int j=0;j<list.size(); j++)
01215 {
01216
01217 if(list[j]==p[i])
01218 {
01219 found = true;
01220 list.erase(list.begin()+j);
01221 break;
01222 }
01223 }
01224
01225 if(!found) return false;
01226 }
01227
01228
01229 if(list.size()!=0) return false;
01230
01231
01232
01233
01234 vector<Particle> newList;
01235
01236 for(int i=0;i<6;i++)
01237 {
01238
01239 if(p[i]==0) break;
01240
01241 for(unsigned int j=0;j<particles.size(); j++)
01242 {
01243
01244 if(particles[j].pdgid()==p[i])
01245 {
01246 newList.push_back(particles[j]);
01247 particles.erase(particles.begin()+j);
01248 break;
01249 }
01250 }
01251 }
01252
01253 particles = newList;
01254
01255 return true;
01256 }
01257
01258
01259
01260
01261
01262
01263 void print(Particle &W, Particle &nu_tau, Particle &tau, vector<Particle> &tau_daughters) {
01264
01265 nu_tau.print();
01266 tau .print();
01267
01268 double px=nu_tau.px()+tau.px();
01269 double py=nu_tau.py()+tau.py();
01270 double pz=nu_tau.pz()+tau.pz();
01271 double e =nu_tau.e ()+tau.e ();
01272
01273
01274 cout<<"--------------------------------------------------------------------------------------------------------"<<endl;
01275 Particle sum1(px,py,pz,e,0);
01276 sum1.print();
01277 W .print();
01278
01279 cout<<endl;
01280
01281
01282 for(unsigned int i=0; i<tau_daughters.size();i++) tau_daughters[i].print();
01283
01284
01285 cout<<"--------------------------------------------------------------------------------------------------------"<<endl;
01286 Particle *sum2 = vector_sum(tau_daughters);
01287 sum2->print();
01288 tau.print();
01289 cout<<endl;
01290
01291 delete sum2;
01292 }
01293
01294
01295
01296
01297 Particle *vector_sum(vector<Particle> &x) {
01298
01299 double px=0.0,py=0.0,pz=0.0,e=0.0;
01300
01301 for(unsigned int i=0; i<x.size();i++)
01302 {
01303 px+=x[i].px();
01304 py+=x[i].py();
01305 pz+=x[i].pz();
01306 e +=x[i].e();
01307 }
01308
01309 Particle *sum = new Particle(px,py,pz,e,0);
01310 return sum;
01311 }
01312
01313 }
01314