1 #include "TauSpinner/tau_reweight_lib.h" 
    2 #include "TauSpinner/nonSM.h" 
    3 #include "TauSpinner/Tauola_wrapper.h" 
    4 #include "TauSpinner/EWtables.h" 
    7 #include "Tauola/TauolaParticlePair.h" 
   13 double CMSENE = 7000.0;
 
  102 double f(
double x, 
int ID, 
double SS, 
double cmsene)
 
  119   return LHAPDF::xfx(x, sqrt(SS), ID)/x;
 
  131 double sigborn(
int ID, 
double SS, 
double costhe)
 
  140       double SIGggHiggs=0.;
 
  145         SIGggHiggs=
disth_(&SS, &costhe, &IPOne, &IPOne)+
disth_(&SS, &costhe, &IPOne, &IMOne)+
 
  146                    disth_(&SS, &costhe, &IMOne, &IPOne)+
disth_(&SS, &costhe, &IMOne, &IMOne);
 
  149         double PI=3.14159265358979324;
 
  150         SIGggHiggs *=  XMH * XMH * XMH *XGH /PI/ ((SS-XMH*XMH)*(SS-XMH*XMH) + XGH*XGH*XMH*XMH);   
 
  153         if(IfHsimple==1) SIGggHiggs =  Xnorm * XMH * XGH /PI/ ((SS-XMH*XMH)*(SS-XMH*XMH) +XGH*XGH*XMH*XMH);
 
  161   if (ID==0) 
return 0.0 ;   
 
  172   if (ID>0) initwk_( &ID, &tauID, &SS);
 
  176     initwk_( &ID, &tauID, &SS);
 
  183   return ( t_born_(&iZero, &SS, &costhe, &dOne , &dOne) + t_born_(&iZero, &SS, &costhe, &dOne , &dMOne)
 
  184            + t_born_(&iZero, &SS, &costhe, &dMOne, &dOne) + t_born_(&iZero, &SS, &costhe, &dMOne, &dMOne))/SS/128.86674175/128.86674175/3.141559265358979324;   
 
  196 void initialize_GSW( 
int _ifGSW, 
int _ifkorch, 
int _iqed,
 
  225   void initialize_gamagama( 
double _GAMfraci,
 
  233     GAMfrac2i=_GAMfrac2i;
 
  278   void GSWadapt(
int ID,
double S, 
double cost, 
double GSWr[7],
double GSWi[7]){
 
  285     double AMZi= 
Amz(ID);
 
  286     costhe=0.0;SSS=AMZi*AMZi;
 
  310     GSWr[5]= real(
EWFACT(ID,6,SSS,costhe)); 
 
  316     GSWi[5]= imag(
EWFACT(ID,6,SSS,costhe)); 
 
  320     GSWr[0] = real(
EWFACT(ID,0,SSS,costhe)); 
 
  324     GSWr[5] = real(
EWFACT(ID,6,SSS,costhe)); 
 
  326     GSWi[0] = imag(
EWFACT(ID,0,SSS,costhe)); 
 
  330     GSWi[5] = imag(
EWFACT(ID,6,SSS,costhe)); 
 
  334     GSWr[0]= real(
EWFACT(ID,0,SSS,costhe)); 
 
  335     GSWr[1]= real(
EWFACT(ID,1,SSS,costhe)); 
 
  336     GSWr[2]= real(
EWFACT(ID,2,SSS,costhe)); 
 
  337     GSWr[3]= real(
EWFACT(ID,3,SSS,costhe)); 
 
  338     GSWr[5]= real(
EWFACT(ID,6,SSS,costhe)); 
 
  340     GSWi[0]= imag(
EWFACT(ID,0,SSS,costhe)); 
 
  341     GSWi[1]= imag(
EWFACT(ID,1,SSS,costhe)); 
 
  342     GSWi[2]= imag(
EWFACT(ID,2,SSS,costhe)); 
 
  343     GSWi[3]= imag(
EWFACT(ID,3,SSS,costhe)); 
 
  344     GSWi[5]= imag(
EWFACT(ID,6,SSS,costhe)); 
 
  380     GSWr[0]= real(
EWFACT(0,0,SSS,costhe)); 
 
  383     GSWr[0]=real(
EWFACT(ID,0,SSS,costhe)); 
 
  384     GSWr[1]=real(
EWFACT(ID,1,SSS,costhe))/real(
EWFACT(0,1,SSS,costhe)); 
 
  385     GSWr[2]=real(
EWFACT(ID,2,SSS,costhe))/real(
EWFACT(0,2,SSS,costhe)); 
 
  389         GSWr[0] = GSWr[0]*GSWN1r-   GSWi[0]*GSWN1i;   
 
  390         GSWi[0] = GSWr[0]*GSWN1i+   GSWi[0]*GSWN1r;   
 
  391         GSWr[1] = GSWr[1]*GSWN2r-   GSWi[1]*GSWN2i;   
 
  392         GSWi[1] = GSWr[1]*GSWN2i+   GSWi[1]*GSWN2r;   
 
  393         GSWr[2] = GSWr[2]*GSWN3r-   GSWi[2]*GSWN3i;   
 
  394         GSWi[2] = GSWr[2]*GSWN3i+   GSWi[2]*GSWN3r;   
 
  395         GSWr[3] = GSWr[3]*GSWN4r-   GSWi[3]*GSWN4i;   
 
  396         GSWi[3] = GSWr[3]*GSWN4i+   GSWi[3]*GSWN4r;   
 
  397         GSWr[4] = GSWr[4]*GSWN5r-   GSWi[4]*GSWN5i;   
 
  398         GSWi[4] = GSWr[4]*GSWN5i+   GSWi[4]*GSWN5r;   
 
  399         GSWr[5] = GSWr[5]*GSWN6r-   GSWi[5]*GSWN6i;    
 
  400         GSWi[5] = GSWr[5]*GSWN6i+   GSWi[5]*GSWN6r;
 
  404   complex<double> Frezu(
int NO){
 
  407       {  F=complex<double>(GSWN1r,GSWN1i);}
 
  409       {  F=complex<double>(GSWN2r,GSWN2i);}
 
  411       {  F=complex<double>(GSWN3r,GSWN3i);}
 
  413       {  F=complex<double>(GSWN4r,GSWN4i);}
 
  415       {  F=complex<double>(GSWN5r,GSWN5i);}
 
  417       {  F=complex<double>(GSWN6r,GSWN6i);}
 
  419       {  F=complex<double>(GSWN6r,GSWN6i);}
 
  421       {cout<<
"wrong NO="<<NO<<endl; exit(-1);}
 
  439   cout<<
" ------------------------------------------------------"<<endl;
 
  440   cout<<
" TauSpinner v2.1.2a"<<endl;
 
  441   cout<<
" -----------------"<<endl;
 
  442   cout<<
"   25.Apr.2025    "<<endl;
 
  443   cout<<
" by Z. Czyczula (until 2015), T. Przedzinski, E. Richter-Was, Z. Was,"<<endl;
 
  444   cout<<
"  matrix elements implementations "<<endl;
 
  445   cout<<
"  also J. Kalinowski, W. Kotlarski and  M. Bachmani"<<endl;
 
  446   cout<<
" ------------------------------------------------------"<<endl;
 
  447   cout<<
" Ipp - true for pp collision; otherwise polarization"<<endl;
 
  448   cout<<
"       of individual taus from Z/gamma* is set to 0.0"<<endl;
 
  449   cout<<
" Ipp    = "<<Ipp<<endl;
 
  450   cout<<
" CMSENE - used in PDF calculations; only if Ipp = true"<<endl;
 
  451   cout<<
"          and only for Z/gamma*"<<endl;
 
  452   cout<<
" CMSENE = "<<CMSENE<<endl;
 
  453   cout<<
" Ipol - relevant for Z/gamma* decays "<<endl;
 
  454   cout<<
" 0 - events generated without spin effects                "<<endl;
 
  455   cout<<
" 1 - events generated with all spin effects               "<<endl;
 
  456   cout<<
" 2 - events generated with spin correlations and <pol>=0  "<<endl;
 
  457   cout<<
" 3 - events generated with spin correlations and"<<endl;
 
  458   cout<<
"     polarization but missing angular dependence of <pol>"<<endl;
 
  459   cout<<
" Ipol    = "<<Ipol<<endl;
 
  460   cout<<
" Ipol - relevant for Z/gamma* decays "<<endl;
 
  461   cout<<
" NOTE: For Ipol=0,1 algorithm is identical.               "<<endl;
 
  462   cout<<
"       However in user program role of wt need change.    "<<endl;
 
  463   cout<<
" nonSM2  = "<<nonSM2<<endl;
 
  464   cout<<
" 1/0 extra term in cross section, density matrix on/off   "<<endl;
 
  465   cout<<
" nonSMN  = "<<nonSMN<<endl;
 
  466   cout<<
" 1/0 extra term in cross section, for shapes only? on/off "<<endl;
 
  467   cout<<
" note KEY - for options of matrix elements calculations   "<<endl;
 
  468   cout<<
"            in cases of final states  with two jets       "<<endl;
 
  469   cout<<
" ------------------------------------------------------   "<<endl;
 
  478   FrameType = _FrameType;
 
  489   relWTnonSM = _relWTnonSM;
 
  501   Xnorm = normalization;
 
  520 void getZgamParametersL(
double &Rzx, 
double &Rzy, 
double &Rzz, 
double &Rtx, 
double &Rty, 
double &Rtz)
 
  571   *normalization = Xnorm;
 
  583 void setSpinOfSample(
int _Ipol)
 
  637   Particle X     (     sp_X.px(),      sp_X.py(),      sp_X.pz(),      sp_X.e(),      sp_X.pdgid() );
 
  638   Particle tau   (   sp_tau.px(),    sp_tau.py(),    sp_tau.pz(),    sp_tau.e(),    sp_tau.pdgid() );
 
  639   Particle nu_tau(sp_nu_tau.px(), sp_nu_tau.py(), sp_nu_tau.pz(), sp_nu_tau.e(), sp_nu_tau.pdgid() );
 
  641   vector<Particle> tau_daughters;
 
  644   int tau_pdgid = sp_tau.pdgid();
 
  647   for(
unsigned int i=0; i<sp_tau_daughters.size(); i++)
 
  649     Particle pp(sp_tau_daughters[i].px(),
 
  650                 sp_tau_daughters[i].py(),
 
  651                 sp_tau_daughters[i].pz(),
 
  652                 sp_tau_daughters[i].e(),
 
  653                 sp_tau_daughters[i].pdgid() );
 
  655     tau_daughters.push_back(pp);
 
  658   double phi2 = 0.0, theta2 = 0.0;
 
  668   double *HH = 
calculateHH(tau_pdgid, tau_daughters, phi2, theta2);
 
  671   if     ( abs(sp_X.pdgid()) == 24 ) { sign= 1.0; } 
 
  672   else if( abs(sp_X.pdgid()) == 37 ) { sign=-1.0; } 
 
  675     cout<<
"wrong sp_W/H.pdgid()="<<sp_X.pdgid()<<endl;
 
  678   if     (sp_X.pdgid() > 0 )   
 
  679     {WTamplitM = WTamplit;}   
 
  681     {WTamplitP = WTamplit;}   
 
  684   double WT   = 1.0+sign*HH[2];     
 
  689     cout<<tau_pdgid<<
" -> ";
 
  690     for(
unsigned int i=0;i<tau_daughters.size();i++) cout<<tau_daughters[i].pdgid()<<
" ";
 
  691     cout<<
" (HH: "<<HH[0]<<
" "<<HH[1]<<
" "<<HH[2]<<
" "<<HH[3]<<
") WT: "<<WT<<endl;
 
  696     printf(
"TauSpinner::calculateWeightFromParticlesWorHpn WT is: %13.10f. Setting WT = 0.0\n",WT);
 
  701     printf(
"Tauspinner::calculateWeightFromParticlesWorHpn WT is: %13.10f. Setting WT = 2.0\n",WT);
 
  733   vector<SimpleParticle> sp_tau_daughters;
 
  737   if (sp_tau1.pdgid() == -15 )
 
  741     sp_tau_daughters = sp_tau1_daughters;
 
  747     sp_tau_daughters = sp_tau2_daughters;
 
  756     Particle X     (      sp_X.px(),      sp_X.py(),      sp_X.pz(),      sp_X.e(),      sp_X.pdgid() );
 
  757     Particle tau   (    sp_tau.px(),    sp_tau.py(),    sp_tau.pz(),    sp_tau.e(),    sp_tau.pdgid() );
 
  758     Particle nu_tau( sp_nu_tau.px(), sp_nu_tau.py(), sp_nu_tau.pz(), sp_nu_tau.e(), sp_nu_tau.pdgid() );
 
  760     vector<Particle> tau_daughters;
 
  763     int tau_pdgid = sp_tau.pdgid();
 
  766     for(
unsigned int i=0; i<sp_tau_daughters.size(); i++)
 
  768       Particle pp(sp_tau_daughters[i].px(),
 
  769                   sp_tau_daughters[i].py(),
 
  770                   sp_tau_daughters[i].pz(),
 
  771                   sp_tau_daughters[i].e(),
 
  772                   sp_tau_daughters[i].pdgid() );
 
  774       tau_daughters.push_back(pp);
 
  777     double phi2 = 0.0, theta2 = 0.0;
 
  789     HHp = 
calculateHH(tau_pdgid, tau_daughters, phi2, theta2);
 
  793       cout<<tau_pdgid<<
" -> ";
 
  794       for(
unsigned int i=0;i<tau_daughters.size();i++) cout<<tau_daughters[i].pdgid()<<
" ";
 
  795       cout<<
" (HHp: "<<HHp[0]<<
" "<<HHp[1]<<
" "<<HHp[2]<<
" "<<HHp[3]<<
") ";
 
  799     WTamplitP = WTamplit;
 
  806   if(sp_tau1.pdgid() == 15 )
 
  810     sp_tau_daughters = sp_tau1_daughters;
 
  816     sp_tau_daughters = sp_tau2_daughters;
 
  823     Particle X     (      sp_X.px(),      sp_X.py(),      sp_X.pz(),      sp_X.e(),      sp_X.pdgid() );
 
  824     Particle tau   (    sp_tau.px(),    sp_tau.py(),    sp_tau.pz(),    sp_tau.e(),    sp_tau.pdgid() );
 
  825     Particle nu_tau( sp_nu_tau.px(), sp_nu_tau.py(), sp_nu_tau.pz(), sp_nu_tau.e(), sp_nu_tau.pdgid() );
 
  827     vector<Particle> tau_daughters;
 
  830     int tau_pdgid = sp_tau.pdgid();
 
  833     for(
unsigned int i=0; i<sp_tau_daughters.size(); i++)
 
  835       Particle pp(sp_tau_daughters[i].px(),
 
  836                   sp_tau_daughters[i].py(),
 
  837                   sp_tau_daughters[i].pz(),
 
  838                   sp_tau_daughters[i].e(),
 
  839                   sp_tau_daughters[i].pdgid() );
 
  841       tau_daughters.push_back(pp);
 
  844     double phi2 = 0.0, theta2 = 0.0;
 
  855     HHm = 
calculateHH(tau_pdgid, tau_daughters, phi2, theta2);
 
  859       cout<<tau_pdgid<<
" -> ";
 
  860       for(
unsigned int i=0;i<tau_daughters.size();i++) cout<<tau_daughters[i].pdgid()<<
" ";
 
  861       cout<<
" (HHm: "<<HHm[0]<<
" "<<HHm[1]<<
" "<<HHm[2]<<
" "<<HHm[3]<<
") ";
 
  865     WTamplitM = WTamplit; 
 
  874   if(sp_X.pdgid() == 25) { sign=-1.0; } 
 
  875   if(sp_X.pdgid() == 36) { sign=-1.0; }
 
  876   if(sp_X.pdgid() ==553) { sign=-1.0; }  
 
  883     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();
 
  901       WT = 1.0+corrX2*HHp[2]*HHm[2]+polX2*HHp[2]+polX2*HHm[2] + RzXX*HHp[0]*HHm[0] - RzYY*HHp[1]*HHm[1] + RzXY*HHp[0]*HHm[1] - RzYX*HHp[1]*HHm[0];
 
  904       double RRR = Tauola::randomDouble();  
 
  906       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;    
 
  910       WT = 1.0 + sign*HHp[2]*HHm[2] + RXX*HHp[0]*HHm[0] + RYY*HHp[1]*HHm[1] + RXY*HHp[0]*HHm[1] + RYX*HHp[1]*HHm[0];
 
  913       double RRR = Tauola::randomDouble();  
 
  915       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;
 
  921     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();
 
  931     WT = 1.0+sign*HHp[2]*HHm[2]+pol*HHp[2]+pol*HHm[2] + RzXX*R11*HHp[0]*HHm[0] - RzYY*R22*HHp[1]*HHm[1] + RzXY*R12*HHp[0]*HHm[1] - RzYX*R21*HHp[1]*HHm[0];
 
  963     if(Ipol==2) WT = WT/(1.0+sign*HHp[2]*HHm[2]); 
 
  970       double polp1 = 
plzap2(11,sp_tau.pdgid(),S,0.0);
 
  971       double pol1 =(2*(1-polp1)-1) ;
 
  972       WT = WT/(1.0+sign*HHp[2]*HHm[2]+pol1*HHp[2]+pol1*HHm[2]); 
 
  980      for (
int k0=0;k0<4;k0++){
 
  981        for (
int k1=0;k1<4;k1++){
 
  984          if(k0==0&&k1==0) F=RzXX;
 
  985          if(k0==1&&k1==1) F=RzYY;
 
  986          if(k0==0&&k1==1) F=RzXY;
 
  987          if(k0==1&&k1==0) F=RzYX;
 
  988          WTtest=WTtest+RcorExt[k0][k1]*HHp[k0]*HHm[k1]*F;
 
 1009      R11 = RcorExt[0][0];
 
 1010      R12 = RcorExt[0][1];
 
 1011      R21 = RcorExt[1][0];
 
 1012      R22 = RcorExt[1][1];
 
 1013      R31 = RcorExt[2][0];
 
 1014      R32 = RcorExt[2][1];
 
 1015      R33 = RcorExt[2][2];
 
 1016      R41 = RcorExt[3][0];
 
 1017      R42 = RcorExt[3][1];
 
 1018      R43 = RcorExt[3][2];
 
 1023      if(nonSM2==1) WT=WTtest;   
 
 1024     if(nonSM2==0&& Ipol==0) WT=WTtest;   
 
 1028     double RRR = Tauola::randomDouble();  
 
 1032     if( ifkorch==1) pol = RcorExt[3][2];
 
 1033     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;
 
 1037   DEBUG( cout<<
" WT: "<<WT<<endl; )
 
 1040     printf(
"Tauspinner::calculateWeightFromParticlesH WT is: %13.10f. Setting WT = 0.0\n",WT);
 
 1045     printf(
"Tauspinner::calculateWeightFromParticlesH WT is: %13.10f. Setting WT = 4.0\n",WT);
 
 1049   if( WT>4.0 || WT<0.0)
 
 1051     cout<<
"Tauspinner::calculateWeightFromParticlesH ERROR: Z/gamma* or H, and WT not in range [0,4]."<<endl;
 
 1055   if (sign==-1.0 && nonSM2!=1) {
 
 1058       cout << 
"Tauspinner::calculateWeightFromParticlesH Setting WT to be 2.0" << endl;
 
 1062   if( sign==-1.0 && (WT>2.0 || WT<0.0) && nonSM2!=1)
 
 1064     cout<<
"Tauspinner::calculateWeightFromParticlesH ERROR: H and WT not in range [0,2]."<<endl;
 
 1082   Particle P_QQ( tau.px()+nu_tau.px(), tau.py()+nu_tau.py(), tau.pz()+nu_tau.pz(), tau.e()+nu_tau.e(), 0 );
 
 1089   tau.boostToRestFrame(P_QQ);
 
 1090   nu_tau.boostToRestFrame(P_QQ);
 
 1092   for(
unsigned int i=0; i<tau_daughters.size();i++)
 
 1093     tau_daughters[i].boostToRestFrame(P_QQ);
 
 1101   double phi = tau.getAnglePhi();
 
 1105   double theta   = tau.getAngleTheta();
 
 1107   tau.rotateXZ(M_PI-theta);
 
 1109   nu_tau.rotateXY(-phi  );
 
 1110   nu_tau.rotateXZ(M_PI-theta);
 
 1112   for(
unsigned int i=0; i<tau_daughters.size();i++)
 
 1114     tau_daughters[i].rotateXY(-phi  );
 
 1115     tau_daughters[i].rotateXZ(M_PI-theta);
 
 1123   for(
unsigned int i=0; i<tau_daughters.size();i++)
 
 1124     tau_daughters[i].boostAlongZ(-tau.pz(),tau.e());
 
 1134   unsigned int i_stored = 0;
 
 1139   for(
unsigned int i=0; i<tau_daughters.size();i++)
 
 1141     if(abs(tau_daughters[i].pdgid())==16){
 
 1142      *phi2     = tau_daughters[i].getAnglePhi();
 
 1144      tau_daughters[i].rotateXY( -(*phi2)   );
 
 1146      *theta2   = tau_daughters[i].getAngleTheta();
 
 1148      tau_daughters[i].rotateXZ( -(*theta2) );
 
 1155   for(
unsigned int i=0; i<tau_daughters.size();i++)
 
 1158       tau_daughters[i].rotateXY( -(*phi2)   );
 
 1159       tau_daughters[i].rotateXZ( -(*theta2) );
 
 1177 double* 
calculateHH(
int tau_pdgid, vector<Particle> &tau_daughters, 
double phi, 
double theta)
 
 1180   double *HH     = 
new double[4];
 
 1182   HH[0]=HH[1]=HH[2]=HH[3]=0.0;  
 
 1187   for(
unsigned int i=0; i<tau_daughters.size(); i++)
 
 1188     pdgid.push_back( tau_daughters[i].pdgid() );
 
 1202   if( pdgid.size()==2 &&
 
 1204         ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211) ) ||
 
 1205         ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211) ) ||
 
 1206         ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-321) ) ||
 
 1207         ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 321) )
 
 1211     if(abs(pdgid[1])==321) channel = 6;
 
 1212     DEBUG( cout<<
"Channel "<<channel<<
"  : "; )
 
 1220     const double AMTAU = 1.777;
 
 1222     double AMPI  = sqrt(tau_daughters[1].e() *tau_daughters[1].e()
 
 1223                        -tau_daughters[1].px()*tau_daughters[1].px()
 
 1224                        -tau_daughters[1].py()*tau_daughters[1].py()
 
 1225                        -tau_daughters[1].pz()*tau_daughters[1].pz());
 
 1228     double PXQ=AMTAU*tau_daughters[1].e();
 
 1229     double PXN=AMTAU*tau_daughters[0].e();
 
 1230     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();
 
 1231     double BRAK=(2*PXQ*QXN-AMPI*AMPI*PXN);
 
 1233     WTamplit = (1.16637E-5)*(1.16637E-5)*BRAK/2.;
 
 1234     HH[0] = AMTAU*(2*tau_daughters[1].px()*QXN-tau_daughters[0].px()*AMPI*AMPI)/BRAK;
 
 1235     HH[1] = AMTAU*(2*tau_daughters[1].py()*QXN-tau_daughters[0].py()*AMPI*AMPI)/BRAK;
 
 1236     HH[2] = AMTAU*(2*tau_daughters[1].pz()*QXN-tau_daughters[0].pz()*AMPI*AMPI)/BRAK;
 
 1244   else if( pdgid.size()==3 &&
 
 1246              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211, 111) ) ||
 
 1247              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 111) ) ||
 
 1248              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-321, 311) ) ||
 
 1249              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 321, 311) ) ||
 
 1250              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-321, 310) ) ||
 
 1251              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 321, 310) ) ||
 
 1252              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-321, 130) ) ||
 
 1253              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 321, 130) )
 
 1259     DEBUG( cout<<
"Channel "<<channel<<
"  : "; )
 
 1266     const double AMTAU = 1.777;
 
 1269     if(tau_daughters[2].pdgid() != 111) { MNUM=3; channel = 22;} 
 
 1270     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1271     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1272     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1273     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1275     float HV[4]  = { 0.0 };
 
 1277     dam2pi_( &MNUM, PT, PN, PIM1, PIM2, &LIT, HV );
 
 1292   else if( pdgid.size()==3 &&
 
 1294              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211, 130) ) ||
 
 1295              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 130) ) ||
 
 1296              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211, 310) ) ||
 
 1297              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 310) ) ||
 
 1298              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211, 311) ) ||
 
 1299              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 311) ) ||
 
 1300              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-321, 111) ) ||
 
 1301              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 321, 111) )
 
 1306     DEBUG( cout<<
"Channel "<<channel<<
"  : "; )
 
 1313     const double AMTAU = 1.777;
 
 1316     QQ[0]=tau_daughters[1].e() -tau_daughters[2].e() ;
 
 1317     QQ[1]=tau_daughters[1].px()-tau_daughters[2].px();
 
 1318     QQ[2]=tau_daughters[1].py()-tau_daughters[2].py();
 
 1319     QQ[3]=tau_daughters[1].pz()-tau_daughters[2].pz();
 
 1322     PKS[0]=tau_daughters[1].e() +tau_daughters[2].e() ;
 
 1323     PKS[1]=tau_daughters[1].px()+tau_daughters[2].px();
 
 1324     PKS[2]=tau_daughters[1].py()+tau_daughters[2].py();
 
 1325     PKS[3]=tau_daughters[1].pz()+tau_daughters[2].pz();
 
 1328     double PKSD=PKS[0]*PKS[0]-PKS[1]*PKS[1]-PKS[2]*PKS[2]-PKS[3]*PKS[3];
 
 1329     double QQPKS=QQ[0]*PKS[0]-QQ[1]*PKS[1]-QQ[2]*PKS[2]-QQ[3]*PKS[3];
 
 1331     QQ[0]=QQ[0]-PKS[0]*QQPKS/PKSD;
 
 1332     QQ[1]=QQ[1]-PKS[1]*QQPKS/PKSD;
 
 1333     QQ[2]=QQ[2]-PKS[2]*QQPKS/PKSD;
 
 1334     QQ[3]=QQ[3]-PKS[3]*QQPKS/PKSD;
 
 1336     double PRODPQ=AMTAU*QQ[0];
 
 1337     double PRODNQ=tau_daughters[0].e() *QQ[0]
 
 1338                  -tau_daughters[0].px()*QQ[1]
 
 1339                  -tau_daughters[0].py()*QQ[2]
 
 1340                  -tau_daughters[0].pz()*QQ[3];
 
 1341     double PRODPN=AMTAU*tau_daughters[0].e();
 
 1342     double QQ2   =QQ[0]*QQ[0]-QQ[1]*QQ[1]-QQ[2]*QQ[2]-QQ[3]*QQ[3];
 
 1345     double BRAK=(2*PRODPQ*PRODNQ-PRODPN*QQ2);
 
 1347     WTamplit = (1.16637E-5)*(1.16637E-5)*BRAK/2.;
 
 1348     HH[0]=AMTAU*(2*PRODNQ*QQ[1]-QQ2*tau_daughters[0].px())/BRAK;
 
 1349     HH[1]=AMTAU*(2*PRODNQ*QQ[2]-QQ2*tau_daughters[0].py())/BRAK;
 
 1350     HH[2]=AMTAU*(2*PRODNQ*QQ[3]-QQ2*tau_daughters[0].pz())/BRAK;
 
 1356   else if( pdgid.size()==3 &&
 
 1358              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, 11,-12) ) ||
 
 1359              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,-11, 12) )
 
 1362     DEBUG( cout<<
"Channel 1  : "; )
 
 1368     double XK0DEC = 0.01;
 
 1369     double XK[4] = { 0.0 };
 
 1370     double XA[4] = { tau_daughters[2].px(), tau_daughters[2].py(), tau_daughters[2].pz(), tau_daughters[2].e() };
 
 1371     double QP[4] = { tau_daughters[1].px(), tau_daughters[1].py(), tau_daughters[1].pz(), tau_daughters[1].e() };
 
 1372     double XN[4] = { tau_daughters[0].px(), tau_daughters[0].py(), tau_daughters[0].pz(), tau_daughters[0].e() };
 
 1373     double AMPLIT = 0.0;
 
 1374     double HV[4] = { 0.0 };
 
 1378     QP[3] = sqrt( QP[0]*QP[0] + QP[1]*QP[1] + QP[2]*QP[2] + 0.511e-3*0.511e-3);
 
 1379     XA[3] = sqrt( XA[0]*XA[0] + XA[1]*XA[1] + XA[2]*XA[2] );
 
 1381     dampry_( &ITDKRC, &XK0DEC, XK, XA, QP, XN, &LIT, HV );
 
 1392   else if( pdgid.size()==4 &&
 
 1394              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, 11,-12, 22) ) ||
 
 1395              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,-11, 12, 22) )
 
 1398     DEBUG( cout<<
"Channel 1b : "; )
 
 1404     double XK0DEC = 0.01;
 
 1405     double XK[4] = { tau_daughters[3].px(), tau_daughters[3].py(), tau_daughters[3].pz(), tau_daughters[3].e() };
 
 1406     double XA[4] = { tau_daughters[2].px(), tau_daughters[2].py(), tau_daughters[2].pz(), tau_daughters[2].e() };
 
 1407     double QP[4] = { tau_daughters[1].px(), tau_daughters[1].py(), tau_daughters[1].pz(), tau_daughters[1].e() };
 
 1408     double XN[4] = { tau_daughters[0].px(), tau_daughters[0].py(), tau_daughters[0].pz(), tau_daughters[0].e() };
 
 1409     double AMPLIT = 0.0;
 
 1410     double HV[4] = { 0.0 };
 
 1414     QP[3] = sqrt( QP[0]*QP[0] + QP[1]*QP[1] + QP[2]*QP[2] + 0.511e-3*0.511e-3);
 
 1415     XA[3] = sqrt( XA[0]*XA[0] + XA[1]*XA[1] + XA[2]*XA[2] );
 
 1416     XK[3] = sqrt( XK[0]*XK[0] + XK[1]*XK[1] + XK[2]*XK[2] );
 
 1418     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]);
 
 1420     dampry_( &ITDKRC, &XK0DEC, XK, XA, QP, XN, &LIT, HV );
 
 1431   else if( pdgid.size()==3 &&
 
 1433              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, 13,-14) ) ||
 
 1434              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,-13, 14) )
 
 1438     DEBUG( cout<<
"Channel 2  : "; )
 
 1444     double XK0DEC = 0.01;
 
 1445     double XK[4] = { 0.0 };
 
 1446     double XA[4] = { tau_daughters[2].px(), tau_daughters[2].py(), tau_daughters[2].pz(), tau_daughters[2].e() };
 
 1447     double QP[4] = { tau_daughters[1].px(), tau_daughters[1].py(), tau_daughters[1].pz(), tau_daughters[1].e() };
 
 1448     double XN[4] = { tau_daughters[0].px(), tau_daughters[0].py(), tau_daughters[0].pz(), tau_daughters[0].e() };
 
 1449     double AMPLIT = 0.0;
 
 1450     double HV[4] = { 0.0 };
 
 1454     QP[3] = sqrt( QP[0]*QP[0] + QP[1]*QP[1] + QP[2]*QP[2] + 0.105659*0.105659);
 
 1455     XA[3] = sqrt( XA[0]*XA[0] + XA[1]*XA[1] + XA[2]*XA[2] );
 
 1457     dampry_( &ITDKRC, &XK0DEC, XK, XA, QP, XN, &LIT, HV );
 
 1468   else if( pdgid.size()==4 &&
 
 1470              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, 13,-14, 22) ) ||
 
 1471              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,-13, 14, 22) )
 
 1475     DEBUG( cout<<
"Channel 2b : "; )
 
 1481     double XK0DEC = 0.01;
 
 1482     double XK[4] = { tau_daughters[3].px(), tau_daughters[3].py(), tau_daughters[3].pz(), tau_daughters[3].e() };
 
 1483     double XA[4] = { tau_daughters[2].px(), tau_daughters[2].py(), tau_daughters[2].pz(), tau_daughters[2].e() };
 
 1484     double QP[4] = { tau_daughters[1].px(), tau_daughters[1].py(), tau_daughters[1].pz(), tau_daughters[1].e() };
 
 1485     double XN[4] = { tau_daughters[0].px(), tau_daughters[0].py(), tau_daughters[0].pz(), tau_daughters[0].e() };
 
 1486     double AMPLIT = 0.0;
 
 1487     double HV[4] = { 0.0 };
 
 1491     QP[3] = sqrt( QP[0]*QP[0] + QP[1]*QP[1] + QP[2]*QP[2] + 0.105659*0.105659);
 
 1492     XA[3] = sqrt( XA[0]*XA[0] + XA[1]*XA[1] + XA[2]*XA[2] );
 
 1493     XK[3] = sqrt( XK[0]*XK[0] + XK[1]*XK[1] + XK[2]*XK[2] );
 
 1495     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]);
 
 1498     dampry_( &ITDKRC, &XK0DEC, XK, XA, QP, XN, &LIT, HV );
 
 1509   else if( pdgid.size()==4 &&
 
 1511              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, 111, 111,-211) ) ||
 
 1512              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 111, 111, 211) )
 
 1515     DEBUG( cout<<
"Channel 5  : "; )
 
 1520     const double AMTAU = 1.777;
 
 1522     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1523     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1524     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1525     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1526     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1528     float HV[4]  = { 0.0 };
 
 1533     damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
 
 1544   else if( pdgid.size()==4 &&
 
 1546              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211,-211, 211) ) ||
 
 1547              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 211,-211) )
 
 1550     DEBUG( cout<<
"Channel 5  : "; )
 
 1555     const double AMTAU = 1.777;
 
 1557     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1558     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1559     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1560     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1561     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1563     float HV[4] = { 0.0 };
 
 1568     damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
 
 1603   else if( pdgid.size()==4 &&
 
 1605             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, -321, -211, 321) ) ||
 
 1606             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  321,  211,-321) )
 
 1609     DEBUG( cout<<
"Channel 5  : "; )
 
 1614     const double AMTAU = 1.777;
 
 1618     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1619     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1620     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1621     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1622     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1624     float HV[4] = { 0.0 };
 
 1629     damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
 
 1640   else if( pdgid.size()==4 &&
 
 1642             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  311, -211, 311  ) ) ||
 
 1643             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  311,  211, 311  ) ) ||
 
 1644             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  311, -211, 310  ) ) ||
 
 1645             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  311,  211, 310  ) ) ||
 
 1646             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  311, -211, 130  ) ) ||
 
 1647             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  311,  211, 130  ) ) ||
 
 1648             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  310, -211, 311  ) ) ||
 
 1649             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  310,  211, 311  ) ) ||
 
 1650             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  310, -211, 310  ) ) ||
 
 1651             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  310,  211, 310  ) ) ||
 
 1652             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  310, -211, 130  ) ) ||
 
 1653             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  310,  211, 130  ) ) ||
 
 1654             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  130, -211, 311  ) ) ||
 
 1655             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  130,  211, 311  ) ) ||
 
 1656             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  130, -211, 310  ) ) ||
 
 1657             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  130,  211, 310  ) ) ||
 
 1658             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  130, -211, 130  ) ) ||
 
 1659             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  130,  211, 130  ) )
 
 1662     DEBUG( cout<<
"Channel 5  : "; )
 
 1667     const double AMTAU = 1.777;
 
 1670     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1671     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1672     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1673     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1674     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1676     float HV[4] = { 0.0 };
 
 1681     damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
 
 1692   else if( pdgid.size()==4 &&
 
 1694             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, -321, 311,  111) ) ||
 
 1695             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  321, 311,  111) ) ||
 
 1696             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, -321, 310,  111) ) ||
 
 1697             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  321, 310,  111) ) ||
 
 1698             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, -321, 130,  111) ) ||
 
 1699             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  321, 130,  111) )
 
 1702     DEBUG( cout<<
"Channel 5  : "; )
 
 1707     const double AMTAU = 1.777;
 
 1710     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1711     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1712     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1713     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1714     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1716     float HV[4] = { 0.0 };
 
 1721     damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
 
 1732   else if( pdgid.size()==4 &&
 
 1734             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,  111,  111,-321) ) ||
 
 1735             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16,  111,  111, 321) )
 
 1738     DEBUG( cout<<
"Channel 5  : "; )
 
 1743     const double AMTAU = 1.777;
 
 1746     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1747     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1748     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1749     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1750     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1752     float HV[4] = { 0.0 };
 
 1757     damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
 
 1767   else if( pdgid.size()==4 &&
 
 1769             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-321,-211, 211) ) ||
 
 1770             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 321, 211,-211) )
 
 1773     DEBUG( cout<<
"Channel 5  : "; )
 
 1778     const double AMTAU = 1.777;
 
 1781     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1782     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1783     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1784     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1785     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1787     float HV[4] = { 0.0 };
 
 1792     damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
 
 1801   else if( pdgid.size()==4 &&
 
 1803             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211, 311, 111) ) ||
 
 1804             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 311, 111) ) ||
 
 1805             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211, 310, 111) ) ||
 
 1806             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 310, 111) ) ||
 
 1807             ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211, 130, 111) ) ||
 
 1808             ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 130, 111) )
 
 1811     DEBUG( cout<<
"Channel 5  : "; )
 
 1816     const double AMTAU = 1.777;
 
 1819     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1820     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1821     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1822     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1823     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1825     float HV[4] = { 0.0 };
 
 1830     damppk_( &MNUM, PT, PN, PIM1, PIM2, PIPL, &LIT, HV );
 
 1840   else if( pdgid.size()==5 &&
 
 1842              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16,-211,-211, 211, 111) ) ||
 
 1843              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 211, 211,-211, 111) )
 
 1846     DEBUG( cout<<
"Channel 8  : "; )
 
 1849     const double AMTAU = 1.777;
 
 1851     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1852     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1853     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1854     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1855     float PIZ [4] = { (float)tau_daughters[4].px(), (float)tau_daughters[4].py(), (float)tau_daughters[4].pz(), (float)tau_daughters[4].e() };
 
 1856     float PIPL[4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1858     float HV[4] = { 0.0 };
 
 1860     dam4pi_( &MNUM, PT, PN, PIM1, PIM2, PIZ, PIPL, &LIT, HV );
 
 1870   else if( pdgid.size()==5 &&
 
 1872              ( tau_pdgid== 15 && 
channelMatch(tau_daughters, 16, 111, 111, 111,-211) ) ||
 
 1873              ( tau_pdgid==-15 && 
channelMatch(tau_daughters,-16, 111, 111, 111, 211) )
 
 1876     DEBUG( cout<<
"Channel 9  : "; )
 
 1879     const double AMTAU = 1.777;
 
 1881     float PT[4]   = { 0.0, 0.0, 0.0, (float)AMTAU };
 
 1882     float PN[4]   = { (float)tau_daughters[0].px(), (float)tau_daughters[0].py(), (float)tau_daughters[0].pz(), (float)tau_daughters[0].e() };
 
 1883     float PIM1[4] = { (float)tau_daughters[1].px(), (float)tau_daughters[1].py(), (float)tau_daughters[1].pz(), (float)tau_daughters[1].e() };
 
 1884     float PIM2[4] = { (float)tau_daughters[2].px(), (float)tau_daughters[2].py(), (float)tau_daughters[2].pz(), (float)tau_daughters[2].e() };
 
 1885     float PIZ [4] = { (float)tau_daughters[3].px(), (float)tau_daughters[3].py(), (float)tau_daughters[3].pz(), (float)tau_daughters[3].e() };
 
 1886     float PIPL[4] = { (float)tau_daughters[4].px(), (float)tau_daughters[4].py(), (float)tau_daughters[4].pz(), (float)tau_daughters[4].e() };
 
 1888     float HV[4] = { 0.0 };
 
 1890     dam4pi_( &MNUM, PT, PN, PIM1, PIM2, PIZ, PIPL, &LIT, HV );
 
 1900     DEBUG( cout<<tau_daughters.size()<<
"-part  ???: "; )
 
 1905   Particle HHbuf(HH[0], HH[1], HH[2], HH[3], 0);
 
 1907   HHbuf.rotateXZ(theta);
 
 1908   HHbuf.rotateXY(phi);
 
 1949     double      GSWr[7],GSWi[7];
 
 1950     double      GSWr0[7],GSWi0[7];
 
 1956     double xsec,xsec0,xsecsum;
 
 1958     double GAMfrac2=0.0; 
 
 1970       alphaQED= 1.0/128.86674175;
 
 1972       for (
int k=0;k<7;k++){
 
 1973         GSWr[k]=1.0; GSWr0[k]=1.0;
 
 1974         GSWi[k]=0.0; GSWi0[k]=0.0;
 
 1979   if(ifkorch==1 && nonSM2==0) {
 
 1999   if(ifkorch==1 && nonSM2==1) {
 
 2019   Particle tau_plus (    sp_tau.px(),    sp_tau.py(),    sp_tau.pz(),    sp_tau.e(),    sp_tau.pdgid() );
 
 2020   Particle tau_minus( sp_nu_tau.px(), sp_nu_tau.py(), sp_nu_tau.pz(), sp_nu_tau.e(), sp_nu_tau.pdgid() );
 
 2022   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 );
 
 2027   tau_plus. boostToRestFrame(P_QQ);
 
 2028   tau_minus.boostToRestFrame(P_QQ);
 
 2029   P_B1.     boostToRestFrame(P_QQ);
 
 2030   P_B2.     boostToRestFrame(P_QQ);
 
 2032   double costheta1 = (tau_plus.px()*P_B1.px()    +tau_plus.py()*P_B1.py()    +tau_plus.pz()*P_B1.pz()    ) /
 
 2033                  sqrt(tau_plus.px()*tau_plus.px()+tau_plus.py()*tau_plus.py()+tau_plus.pz()*tau_plus.pz()) /
 
 2034                  sqrt(P_B1.px()    *P_B1.px()    +P_B1.py()    *P_B1.py()    +P_B1.pz()    *P_B1.pz()    );
 
 2036   double costheta2 = (tau_minus.px()*P_B2.px()    +tau_minus.py()*P_B2.py()    +tau_minus.pz()*P_B2.pz()    ) /
 
 2037                  sqrt(tau_minus.px()*tau_minus.px()+tau_minus.py()*tau_minus.py()+tau_minus.pz()*tau_minus.pz()) /
 
 2038                  sqrt(P_B2.px()    *P_B2.px()    +P_B2.py()    *P_B2.py()    +P_B2.pz()    *P_B2.pz()    );
 
 2040   double sintheta1 = sqrt(1-costheta1*costheta1);
 
 2041   double sintheta2 = sqrt(1-costheta2*costheta2);
 
 2044   double costhe = (costheta1*sintheta2 + costheta2*sintheta1) / (sintheta1 + sintheta2);
 
 2045   double costhem= (costheta1*sintheta2 + costheta2*sintheta1) / (sintheta1 + sintheta2);
 
 2049   double RRR = Tauola::randomDouble();
 
 2051   wtMustraal= P_B1.e()*P_B1.e()*(1+costheta1*costheta1)/(P_B1.e()*P_B1.e()*(1+costheta1*costheta1)+P_B2.e()*P_B2.e()*(1+costheta2*costheta2));
 
 2052   if( RRR< wtMustraal) {costhe=costheta1; costhem=costheta2;}   
 
 2053   else                 {costhe=costheta2; costhem=costheta1;}
 
 2070   double x1x2  = SS/CMSENE/CMSENE;
 
 2071   double x1Mx2 = P_QQ.pz()/CMSENE*2;
 
 2073   double x1 = (  x1Mx2 + sqrt(x1Mx2*x1Mx2 + 4*x1x2) )/2;
 
 2074   double x2 = ( -x1Mx2 + sqrt(x1Mx2*x1Mx2 + 4*x1x2) )/2;
 
 2077   WID[0] = f(x1, 0,SS,CMSENE)*f(x2, 0,SS,CMSENE) * sigborn(0,SS, costhe);
 
 2078   WID[1] = f(x1, 1,SS,CMSENE)*f(x2,-1,SS,CMSENE) * sigborn(1,SS, costhe);
 
 2079   WID[2] = f(x1,-1,SS,CMSENE)*f(x2, 1,SS,CMSENE) * sigborn(1,SS,-costhem);
 
 2080   WID[3] = f(x1, 2,SS,CMSENE)*f(x2,-2,SS,CMSENE) * sigborn(2,SS, costhe);
 
 2081   WID[4] = f(x1,-2,SS,CMSENE)*f(x2, 2,SS,CMSENE) * sigborn(2,SS,-costhem);
 
 2082   WID[5] = f(x1, 3,SS,CMSENE)*f(x2,-3,SS,CMSENE) * sigborn(3,SS, costhe);
 
 2083   WID[6] = f(x1,-3,SS,CMSENE)*f(x2, 3,SS,CMSENE) * sigborn(3,SS,-costhem);
 
 2084   WID[7] = f(x1, 4,SS,CMSENE)*f(x2,-4,SS,CMSENE) * sigborn(4,SS, costhe);
 
 2085   WID[8] = f(x1,-4,SS,CMSENE)*f(x2, 4,SS,CMSENE) * sigborn(4,SS,-costhem);
 
 2086   WID[9] = f(x1, 5,SS,CMSENE)*f(x2,-5,SS,CMSENE) * sigborn(5,SS, costhe);
 
 2087   WID[10]= f(x1,-5,SS,CMSENE)*f(x2, 5,SS,CMSENE) * sigborn(5,SS,-costhem);
 
 2088   WID[11]= GAMfrac*(WID[0]+WID[1]+WID[2]+WID[3]+WID[4]+WID[5]+WID[6]+WID[7]+WID[8]+WID[9]+WID[10]);
 
 2103   for(
int i=0;i<=12;i++) sum+=WID[i];
 
 2114     cout << 
"Tauspinner::calculateWeightFromParticlesH WARNING: sum of WID[0]-WID[10] is 0. Check LHAPDF configuration" << endl;
 
 2118   if(relWTnonSM==0)  WTnonSM=sum;
 
 2122     WID2[0] = f(x1, 0,SS,CMSENE)*f(x2, 0,SS,CMSENE) * sigborn(0,SS, costhe) * 
plweight(0,SS, costhe); 
 
 2123     WID2[1] = f(x1, 1,SS,CMSENE)*f(x2,-1,SS,CMSENE) * sigborn(1,SS, costhe) * 
plweight(1,SS, costhe);
 
 2124     WID2[2] = f(x1,-1,SS,CMSENE)*f(x2, 1,SS,CMSENE) * sigborn(1,SS,-costhem) * 
plweight(1,SS,-costhem);
 
 2125     WID2[3] = f(x1, 2,SS,CMSENE)*f(x2,-2,SS,CMSENE) * sigborn(2,SS, costhe) * 
plweight(2,SS, costhe);
 
 2126     WID2[4] = f(x1,-2,SS,CMSENE)*f(x2, 2,SS,CMSENE) * sigborn(2,SS,-costhem) * 
plweight(2,SS,-costhem);
 
 2127     WID2[5] = f(x1, 3,SS,CMSENE)*f(x2,-3,SS,CMSENE) * sigborn(3,SS, costhe) * 
plweight(3,SS, costhe);
 
 2128     WID2[6] = f(x1,-3,SS,CMSENE)*f(x2, 3,SS,CMSENE) * sigborn(3,SS,-costhem) * 
plweight(3,SS,-costhem);
 
 2129     WID2[7] = f(x1, 4,SS,CMSENE)*f(x2,-4,SS,CMSENE) * sigborn(4,SS, costhe) * 
plweight(4,SS, costhe);
 
 2130     WID2[8] = f(x1,-4,SS,CMSENE)*f(x2, 4,SS,CMSENE) * sigborn(4,SS,-costhem) * 
plweight(4,SS,-costhem);
 
 2131     WID2[9] = f(x1, 5,SS,CMSENE)*f(x2,-5,SS,CMSENE) * sigborn(5,SS, costhe) * 
plweight(5,SS, costhe);
 
 2132     WID2[10]= f(x1,-5,SS,CMSENE)*f(x2, 5,SS,CMSENE) * sigborn(5,SS,-costhem) * 
plweight(5,SS,-costhem);
 
 2135     WID2[11]= GAMfrac2*(WID2[0]+WID2[1]+WID2[2]+WID2[3]+WID2[4]+WID2[5]+WID2[6]+WID2[7]+WID2[8]+WID2[9]+WID2[10]);
 
 2145     for(
int i=0;i<=12;i++) sum2+=WID2[i];
 
 2149     if(relWTnonSM==0)  WTnonSM=sum2;
 
 2157   if(IfHiggs && nonSM2==1) {   
 
 2158     double polp = 
plzap2(0,15,S,costhe);  
 
 2159     pol += (2*(1-polp)-1);
 
 2162   if(IfHiggs) 
return NAN;
 
 2165   for(
int i=0;i<=12;i++) WID[i]/=sum;
 
 2178   for(
int i=0;i<=3;i++){
 
 2179     for(
int j=0;j<=3;j++){
 
 2185   for(
int i=1;i<=12;i++)
 
 2189     double cost = costhe;
 
 2192     if( ICC==2 || ICC==4 || ICC==6 || ICC==8 || ICC==10|| ICC==12 ) { cost = -costhem; IROT=1;}
 
 2196     if( ICC==7 || ICC==8  ) ID = 4;
 
 2197     if( ICC==1 || ICC==2  ) ID = 1;
 
 2198     if( ICC==5 || ICC==6  ) ID = 3;
 
 2199     if( ICC==9 || ICC==10 ) ID = 5;
 
 2200     if( ICC==11 || ICC==12 ) ID = 22;
 
 2204     double polp = 
plzap2(ID,tau_pdgid,S,cost);
 
 2206     pol += (2*(1-polp)-1)*WID[i];
 
 2213     pp.
m_R[1][1] = pp.
m_R[2][2] = 0.0;
 
 2214     pp.
m_R[1][2] = pp.
m_R[2][1] = 0.0;
 
 2215     pp.
m_R[0][1] = pp.
m_R[3][2] = 0.0;
 
 2216     pp.
m_R[0][2] = pp.
m_R[3][1] = 0.0;
 
 2217     pp.
m_R[1][0] = pp.
m_R[2][3] = 0.0;
 
 2218     pp.
m_R[2][0] = pp.
m_R[1][3] = 0.0;
 
 2245     if (ID==2||ID==4)       {channel=2 ; IFLAV=2;}
 
 2246     if (ID==1||ID==3||ID==5){channel=3 ; IFLAV=1;}
 
 2258      sin2W0=
sin2W(IFLAV);
 
 2259      alphaQED=7.2973525693e-3;   
 
 2260      for (
int k=0;k<7;k++){
 
 2261       complex<double> rezu = 
EWFACT(IFLAV, k, S, cost);
 
 2264       GSWr[k]=real(rezu);GSWr0[k]=1.0;
 
 2265       GSWi[k]=imag(rezu);GSWi0[k]=0.0;
 
 2270     dipolqq_(&iqed,&Energy,&theta,&channel,&Amz0,&Gamz0,&sin2W0,&alphaQED,&ReA00,&ImA00, &ReB0,&ImB0, &ReX0,&ImX0,&ReY0,&ImY0, GSWr0,GSWi0,Rcor);
 
 2273     dipolqq_(&iqed,&Energy,&theta,&channel,&Amz0,&Gamz0,&sin2W0,&alphaQED,&ReA0,&ImA0, &ReB,&ImB, &ReX,&ImX,&ReY,&ImY, GSWr,GSWi,Rcor);
 
 2292       Rcor[1][3]=-Rcor[1][3];
 
 2293       Rcor[3][1]=-Rcor[3][1];
 
 2294       Rcor[0][1]=-Rcor[0][1];
 
 2295       Rcor[1][0]=-Rcor[1][0];
 
 2296       Rcor[2][3]=-Rcor[2][3];
 
 2297       Rcor[3][2]=-Rcor[3][2];
 
 2298       Rcor[2][0]=-Rcor[2][0];
 
 2299       Rcor[0][2]=-Rcor[0][2];
 
 2327     R11 += WID[i]*pp.
m_R[1][1];
 
 2328     R22 += WID[i]*pp.
m_R[2][2];  
 
 2329     R12 += WID[i]*pp.
m_R[1][2];  
 
 2330     R21 += WID[i]*pp.
m_R[2][1];  
 
 2333        for(
int i3=0;i3<=3;i3++){
 
 2334         for(
int j=0;j<=3;j++){
 
 2339           RcorExt[i4][j4]+=WID[i]*Rcor[i3][j];   
 
 2343         xsecsum+=xsec/xsec0*WID[i];
 
 2352       pol += (2*(1-polp)-1)*WID[i];
 
 2359       dipolgamma_(&iqed, &E, &theta, &A0, &B0, Rcor);
 
 2375       dipolgamma_(&iqed, &E, &theta, &A, &B, Rcor);
 
 2408       R11 += WID[i]*Rcor[1][1]/Rcor[0][0]; 
 
 2409       R22 += WID[i]*Rcor[2][2]/Rcor[0][0]; 
 
 2410       R12 += WID[i]*Rcor[1][2]/Rcor[0][0]; 
 
 2411       R21 += WID[i]*Rcor[2][1]/Rcor[0][0]; 
 
 2414        for(
int i3=0;i3<=3;i3++){
 
 2415         for(
int j=0;j<=3;j++){
 
 2420            RcorExt[i4][j4]+=WID[i]*Rcor[i3][j];   
 
 2423        xsecsum+=xsec/xsec0*WID[i];
 
 2455      for (
int k0=0;k0<4;k0++){
 
 2456        for (
int k1=0;k1<4;k1++){
 
 2466          RcorExt[k0][k1]=RcorExt[k0][k1]*F;
 
 2477        if(relWTnonSM!=0) WTnonSM=xsecsum;
 
 2478        if(relWTnonSM==0) {WTnonSM=xsecsum;
 
 2479          std::cout << 
"input not supported: relWTnonSM=" <<relWTnonSM<< 
" ifkorch= "<<ifkorch << std::endl;
 
 2480          std::cout << 
"X-sects nonSM2="<<nonSM2<<
" sum= " << sum << 
" WTnonSM-korch= "<< xsecsum <<std::endl;
 
 2502 bool channelMatch(vector<Particle> &particles, 
int p1, 
int p2, 
int p3, 
int p4, 
int p5, 
int p6)
 
 2507   for(
unsigned int i=0;i<particles.size();i++) list.push_back(particles[i].pdgid());
 
 2510   int p[6] = { p1, p2, p3, p4, p5, p6 };
 
 2514   for(
int i=0;i<6;i++)
 
 2521     for(
unsigned int j=0;j<list.size(); j++)
 
 2527         list.erase(list.begin()+j);
 
 2532     if(!found) 
return false;
 
 2536   if(list.size()!=0) 
return false;
 
 2541   vector<Particle> newList;
 
 2543   for(
int i=0;i<6;i++)
 
 2548     for(
unsigned int j=0;j<particles.size(); j++)
 
 2551       if(particles[j].pdgid()==p[i])
 
 2553         newList.push_back(particles[j]);
 
 2554         particles.erase(particles.begin()+j);
 
 2560   particles = newList;
 
 2575   double px=nu_tau.px()+tau.px();
 
 2576   double py=nu_tau.py()+tau.py();
 
 2577   double pz=nu_tau.pz()+tau.pz();
 
 2578   double e =nu_tau.e ()+tau.e ();
 
 2581   cout<<
"--------------------------------------------------------------------------------------------------------"<<endl;
 
 2589   for(
unsigned int i=0; i<tau_daughters.size();i++) tau_daughters[i].
print();
 
 2592   cout<<
"--------------------------------------------------------------------------------------------------------"<<endl;
 
 2606   double px=0.0,py=0.0,pz=0.0,e=0.0;
 
 2608   for(
unsigned int i=0; i<x.size();i++)
 
void recalculateRij(int incoming_pdg_id, int outgoing_pdg_id, double invariant_mass_squared, double cosTheta)
double plweight(int ide, double svar, double costhe)
double plzap2(int ide, int idf, double svar, double costhe)
void initialize_GSW_norm(int _keyGSW, double _ReGSW1, double _ImGSW1, double _ReGSW2, double _ImGSW2, double _ReGSW3, double _ImGSW3, double _ReGSW4, double _ImGSW4, double _ReGSW5, double _ImGSW5, double _ReGSW6, double _ImGSW6)
double calculateWeightFromParticlesH(SimpleParticle &sp_X, SimpleParticle &sp_tau1, SimpleParticle &sp_tau2, vector< SimpleParticle > &sp_tau1_daughters, vector< SimpleParticle > &sp_tau2_daughters)
bool channelMatch(vector< Particle > &particles, int p1, int p2=0, int p3=0, int p4=0, int p5=0, int p6=0)
double disth_(double *SVAR, double *COSTHE, int *TA, int *TB)
double calculateWeightFromParticlesWorHpn(SimpleParticle &W, SimpleParticle &tau, SimpleParticle &nu_tau, vector< SimpleParticle > &tau_daughters)
void getZgamMultipliersTR(double &Rxx, double &Ryy, double &Rxy, double &Ryx)
void getZgamParametersTR(double &Rxx, double &Ryy, double &Rxy, double &Ryx)
double getLongitudinalPolarization(double, SimpleParticle &, SimpleParticle &)
void getHiggsParameters(double *mass, double *width, double *normalization)
void setZgamMultipliersTR(double Rxx, double Ryy, double Rxy, double Ryx)
void setFrameType(int _FrameType)
complex< double > EWFACT(int FLAV, int NO, double s, double costhe)
void getZgamParametersL(double &Rzx, double &Rzy, double &Rzz, double &Rtx, double &Rty, double &Rtz)
Particle * vector_sum(vector< Particle > &x)
void setNonSMkey(int key)
double * calculateHH(int tau_pdgid, vector< Particle > &tau_daughters, double phi, double theta)
void setHiggsParametersTR(double Rxx, double Ryy, double Rxy, double Ryx)
void GSWadapt(int ID, double S, double cost, double GSWr[7], double GSWi[7])
void setRelWTnonSM(int _relWTnonSM)
void print(Particle &W, Particle &nu_tau, Particle &tau, vector< Particle > &tau_daughters)
void initialize_spinner(bool _Ipp, int _Ipol, int _nonSM2, int _nonSMN, double _CMSENE)
void prepareKinematicForHH(Particle &tau, Particle &nu_tau, vector< Particle > &tau_daughters, double *phi2, double *theta2)
void setHiggsParameters(int jak, double mass, double width, double normalization)