Esempio n. 1
0
void EvtSSD_DirectCP::init() {

    // check that there is 1 argument and 2-body decay

    checkNArg(1);
    checkNDaug(2);

    EvtSpinType::spintype d1type=EvtPDL::getSpinType(getDaug(0));
    EvtSpinType::spintype d2type=EvtPDL::getSpinType(getDaug(1));

    if ( (!(d1type == EvtSpinType::SCALAR || d2type == EvtSpinType::SCALAR))||
            (!((d2type==EvtSpinType::SCALAR)||(d2type==EvtSpinType::VECTOR)||
               (d2type==EvtSpinType::TENSOR)))||
            (!((d1type==EvtSpinType::SCALAR)||(d1type==EvtSpinType::VECTOR)||
               (d1type==EvtSpinType::TENSOR)))
       ) {
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << "EvtSSD_DirectCP generator expected "
                                            << "one of the daugters to be a scalar, "
                                            << "the other either scalar, vector, or tensor, "
                                            << "found:"
                                            << EvtPDL::name(getDaug(0)).c_str()
                                            <<" and "
                                            <<EvtPDL::name(getDaug(1)).c_str()<<std::endl;
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << "Will terminate execution!"<<std::endl;
        ::abort();
    }

    _acp = getArg( 0 ) ; // A_CP defined as A_CP = (BR(fbar)-BR(f))/(BR(fbar)+BR(f))

}
Esempio n. 2
0
void EvtHypNonLepton::init() {

    if(getNArg()<2 || getNArg()>3) { // alpha phi gamma delta
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << " ERROR: EvtHypNonLepton generator expected 2 or 3 arguments but found: " << getNArg() << std::endl;
        EvtGenReport(EVTGEN_INFO ,"EvtGen") << "  1. Decay asymmetry parameter - alpha" << std::endl;
        EvtGenReport(EVTGEN_INFO ,"EvtGen") << "  2. Parameter phi - in degrees (not radians)" << std::endl;
        EvtGenReport(EVTGEN_INFO ,"EvtGen") << "  3. Note on every x-th decay" << std::endl;
        ::abort();
    }

    if(getNDaug()!=2) { // Check that there are 2 daughters only
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << " ERROR: EvtHypNonLepton generator expected 2 daughters but found: " << getNDaug() << std::endl;
        ::abort();
    }

    // Check particles spins
    if(EvtSpinType::getSpin2(EvtPDL::getSpinType(getParentId()))!=1) {
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << " ERROR: EvtHypNonLepton generator expected dirac parent particle, but found " << EvtSpinType::getSpin2(EvtPDL::getSpinType(getParentId())) << " spin degrees of freedom" << std::endl;
        ::abort();
    }
    if(EvtSpinType::getSpin2(EvtPDL::getSpinType(getDaug(0)))!=1) {
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << " ERROR: EvtHypNonLepton generator expected the first child to be dirac particle, but found " << EvtSpinType::getSpin2(EvtPDL::getSpinType(getDaug(0))) << " spin degrees of freedom" << std::endl;
        ::abort();
    }
    if(EvtSpinType::getSpin2(EvtPDL::getSpinType(getDaug(1)))!=0) {
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << " ERROR: EvtHypNonLepton generator expected the second child to be scalar particle, but found " << EvtSpinType::getSpin2(EvtPDL::getSpinType(getDaug(1))) << " spin degrees of freedom" << std::endl;
        ::abort();
    }

    // Read all parameters
    m_alpha = getArg(0);
    m_phi   = getArg(1)*EvtConst::pi/180;
    if(getNArg()==3) m_noTries = static_cast<long>(getArg(2));
    else             m_noTries = 0;

    // calculate additional parameters
    double p,M,m1,m2;
    double p_to_s,beta,delta,gamma;

    M  = EvtPDL::getMass(getParentId());
    m1 = EvtPDL::getMass(getDaug(0));
    m2 = EvtPDL::getMass(getDaug(1));

    if(m1+m2>=M) {
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << " ERROR: EvtHypNonLepton found impossible decay: " << M << " --> " << m1 << " + " << m2 << " GeV\n" << std::endl;
        ::abort();
    }

    p = sqrt(M*M-(m1+m2)*(m1+m2))*sqrt(M*M-(m1-m2)*(m1-m2))/2./M;

    beta = sqrt(1.-m_alpha*m_alpha)*sin(m_phi);
    delta = -atan2(beta,m_alpha);
    gamma = sqrt(1.-m_alpha*m_alpha-beta*beta);
    p_to_s = sqrt((1.-gamma)/(1.+gamma));

    m_B_to_A = p_to_s*(m1+sqrt(p*p+m1*m1))/p*EvtComplex(cos(delta),sin(delta));

}
Esempio n. 3
0
int EvtSpinType::getSpinStates(spintype stype){

  switch (stype){
  case SCALAR: case STRING: case NEUTRINO:
    return 1;
  case DIRAC: case PHOTON:
    return 2;
  case VECTOR: 
    return 3;
  case RARITASCHWINGER:
    return 4;
  case TENSOR:
    return 5;
  case SPIN5HALF:
    return 6;
  case SPIN3:
    return 7;
  case SPIN7HALF:
    return 8;
  case SPIN4:
    return 9;
  default:
    EvtGenReport(EVTGEN_ERROR,"EvtGen")<<"Unknown spintype in EvtSpinType!"<<std::endl;
    return 0;
  }

}
Esempio n. 4
0
void EvtSLBKPoleFF::getraritaff(EvtId, EvtId, double, double, double*, double*, 
				double*, double*, double*, double*, double*, double*) {
  
  EvtGenReport(EVTGEN_ERROR,"EvtGen") << "Not implemented :getraritaff in EvtSLBKPoleFF.\n";
  ::abort();

}
Esempio n. 5
0
void EvtSLBKPoleFF::gettensorff(EvtId parent,EvtId /*daught*/,
                       double t, double /*mass*/, double *hf,
			     double *kf, double *bpf, double *bmf ){

  if ( numSLBKPoleargs !=16 ) {
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "Problem in EvtSLBKPoleFF::gettensorff\n";
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "wrong number of arguements!!!\n";
  }

  EvtGenReport(EVTGEN_INFO,"EvtGen")<<"Check the implementation of EvtSLBKPoleFF::gettensorff()!\n";

  double mb=EvtPDL::getMeanMass(parent);
  double mb2 = mb*mb;

  double f0,af,bf,powf;

  f0 = SLBKPoleargs[0];
  af = SLBKPoleargs[1];
  bf = SLBKPoleargs[2];
  powf = SLBKPoleargs[3];
  *hf = f0/(pow( 1.0 + (af*t/mb2) + (bf*((t/mb2)*(t/mb2))),powf));

  f0 = SLBKPoleargs[4];
  af = SLBKPoleargs[5];
  bf = SLBKPoleargs[6];
  powf = SLBKPoleargs[7];

  *kf = f0/(pow( 1.0 + (af*t/mb2) + (bf*((t/mb2)*(t/mb2))),powf));

  f0 = SLBKPoleargs[8];
  af = SLBKPoleargs[9];
  bf = SLBKPoleargs[10];
  powf = SLBKPoleargs[11];

  *bpf = f0/(pow( 1.0 + (af*t/mb2) + (bf*((t/mb2)*(t/mb2))),powf));

  f0 = SLBKPoleargs[12];
  af = SLBKPoleargs[13];
  bf = SLBKPoleargs[14];
  powf = SLBKPoleargs[15];

  *bmf = f0/(pow( 1.0 + (af*t/mb2) + (bf*((t/mb2)*(t/mb2))),powf));
  return;
 }
//=============================================================================
// Initialisation method
//=============================================================================
void EvtBToDDalitzCPK::init ( ) 
{
  // Check that there are 3 arguments 
  checkNArg( 3 ) ;
  // Check that there are 2 daughters
  checkNDaug( 2 ) ;
  // Check that the particles of the decay are :
  // B+/-   -> D0/bar K+/-
  // B+/-   -> K+/- D0/bar
  // B0/bar -> K*0/bar D0/bar
  // and nothing else ...
  static EvtId BP  = EvtPDL::getId( "B+" ) ;
  static EvtId BM  = EvtPDL::getId( "B-" ) ;
  static EvtId B0  = EvtPDL::getId( "B0" ) ;
  static EvtId B0B = EvtPDL::getId( "anti-B0" ) ;
  static EvtId KP  = EvtPDL::getId( "K+" ) ;
  static EvtId KM  = EvtPDL::getId( "K-" ) ; 
  static EvtId KS  = EvtPDL::getId( "K*0" ) ;
  static EvtId KSB = EvtPDL::getId( "anti-K*0" ) ;
  static EvtId D0  = EvtPDL::getId( "D0" ) ;
  static EvtId D0B = EvtPDL::getId( "anti-D0" ) ;

  _flag = 0 ;
  
  EvtId parent = getParentId() ;
  EvtId d1     = getDaug( 0 )  ;
  EvtId d2     = getDaug( 1 )  ;

  if ( ( ( parent == BP ) || ( parent == BM  ) ) &&
       ( ( d1     == D0 ) || ( d1     == D0B ) ) && 
       ( ( d2     == KP ) || ( d2     == KM  ) ) ) {
    _flag = 1 ;
    // PHSP Decay 
  }
  else if ( ( ( parent == BP ) || ( parent == BM  ) ) &&
            ( ( d1     == KP ) || ( d1     == KM  ) ) && 
            ( ( d2     == D0 ) || ( d2     == D0B  ) ) ) {
    _flag = 1 ;
    // also PHSP decay
  }
  else if ( ( ( parent == B0 ) || ( parent == B0B ) ) &&
            ( ( d1     == KS ) || ( d1     == KSB ) ) && 
            ( ( d2     == D0 ) || ( d2     == D0B ) ) ) {
    _flag = 2 ;
    // SVS Decay
  }
  
  if ( _flag == 0 ) {
    EvtGenReport(EVTGEN_ERROR , "EvtGen" ) << "EvtBToDDalitzCPK : Invalid mode." 
                               << std::endl ;
    assert( 0 ) ;
  }
}
Esempio n. 7
0
void EvtHypNonLepton::initProbMax() {

    double maxProb,m1,m2,M,p;

    M=EvtPDL::getMass(getParentId());
    m1=EvtPDL::getMass(getDaug(0));
    m2=EvtPDL::getMass(getDaug(1));

    if(m1+m2>=M) {
        EvtGenReport(EVTGEN_ERROR,"EvtGen") << " ERROR: EvtHypNonLepton found impossible decay: " << M << " --> " << m1 << " + " << m2 << " GeV\n" << std::endl;
        ::abort();
    }

    p=sqrt(M*M-(m1+m2)*(m1+m2))*sqrt(M*M-(m1-m2)*(m1-m2))/2/M;
    maxProb=16*M*(sqrt(p*p+m1*m1)+m1+abs(m_B_to_A)*abs(m_B_to_A)*(sqrt(p*p+m1*m1)-m1));
    //maxProb *= G_F*M_pi*M_pi;

    setProbMax(maxProb);
    EvtGenReport(EVTGEN_INFO,"EvtGen") << " EvtHypNonLepton set up maximum probability to " << maxProb << std::endl;

}
Esempio n. 8
0
void EvtSLBKPoleFF::getscalarff(EvtId parent,EvtId daught,
                       double t, double /*mass*/, double *fpf,
			    double *f0f ) {

// Form factors have a general form, with parameters passed in
// from the arguments.

   if ( numSLBKPoleargs != 4 ) {//modified
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "Problem in EvtSLBKPoleFF::getscalarff\n";
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "wrong number of arguments!\n";
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "number args:"<<numSLBKPoleargs<<" (expected 4)\n";
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "Parent:"<<EvtPDL::name(parent)<<"\n";
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "Daughter:"<<EvtPDL::name(daught)<<"\n";

   }


  double f0,af,powf;

  //double a_0, a_1, a_2, a_3, a_4, a_5, a_6, a_7;

  f0 = SLBKPoleargs[0];//f0
  af = SLBKPoleargs[1];//alpha
  //bf = SLBKPoleargs[2];
  double mass_star2 = SLBKPoleargs[3]*SLBKPoleargs[3];
  powf = 1.0;
  *fpf = f0/(pow( 1.0 - (1.0+af)*(t/mass_star2) + (af*((t/mass_star2)*(t/mass_star2))),powf));//modified

  f0 = SLBKPoleargs[0];//f0
  af = SLBKPoleargs[2];//beta
  //bf = SLBKPoleargs[6];
  powf = 1.0;

  *f0f = f0/(pow( 1.0 - (t/mass_star2/af),powf));//modified

  return;
}
Esempio n. 9
0
// Set the maximum probability of the decay 
void EvtB2MuMuMuNu::initProbMax(){

  double mymaxprob=-10.0; // maximum of the probability

  mymaxprob = _calcamp->CalcMaxProb();

  if(mymaxprob <= 0.0){
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "The function void EvtB2MuMuMuNu::initProbMax()" 
					 << "\n Unexpected value of the probability maximum!"
					 << "\n mymaxprob = " << mymaxprob
					 <<std::endl;
     ::abort();
  }

  setProbMax(mymaxprob);

}
Esempio n. 10
0
// Set the maximum probability of the decay 
void EvtbsToLLLL::initProbMax(){

  double mymaxprob=-10.0; // maximum of the probability

//  EvtId parnum, l1num, l2num, l3num, l4num;
  
//  parnum = getParentId();
//  l1num  = getDaug(0);
//  l2num  = getDaug(1);
//  l3num  = getDaug(2);
//  l4num  = getDaug(3);

  // EvtSpinType::spintype mesontype=EvtPDL::getSpinType(getDaug(0));

//  double         mu = getArg(0);        // the scale parameter
//  int            Nf = (int) getArg(1);  // number of "effective" flavors
//  int      res_swch = (int) getArg(2);  // resonant switching parametr
//  int           ias = (int) getArg(3);  // switching parametr for \alpha_s(M_Z)
//  double      CKM_A = getArg(4); 
//  double CKM_lambda = getArg(5); 
//  double CKM_barrho = getArg(6); 
//  double CKM_bareta = getArg(7);


  mymaxprob = _calcamp->CalcMaxProb(
//                                   parnum, l1num,l2num, l3num,l4num,
//		                    _mntffmodel, _wilscoeff, 
//                                   mu, Nf, res_swch, ias, 
//                                   CKM_A,CKM_lambda,CKM_barrho,CKM_bareta
                                   );

  if(mymaxprob <= 0.0){
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "The function void EvtbsToLLLL::initProbMax()" 
       << "\n Unexpected value of the probability maximum!"
       << "\n mymaxprob = " << mymaxprob
       <<std::endl;
     ::abort();
  }

  setProbMax(mymaxprob);

}
Esempio n. 11
0
void EvtHypNonLepton::calcAmp(EvtAmp *amp,EvtParticle *parent) {

    static long noTries=0;
    int i;
    EvtComplex Matrix[2][2];

    //G_F  = 1.16637e-5;
    //M_pi = 0.13957;

    for(i=0; i<4; i++) {
        //std::cout << "--------------------------------------------------" << std::endl;
        Matrix[i/2][i%2]  = EvtLeptonSCurrent(parent->sp(i/2),parent->getDaug(0)->spParent(i%2));
        //std::cout << "Matrix = " << Matrix[i/2][i%2] << std::endl;
        Matrix[i/2][i%2] -= m_B_to_A*EvtLeptonPCurrent(parent->sp(i/2),parent->getDaug(0)->spParent(i%2));
        //std::cout << "Matrix = " << Matrix[i/2][i%2] << std::endl;
        //Matrix[i/2][i%2] *= G_F*M_pi*M_pi;
        //std::cout << "Matrix = " << Matrix[i/2][i%2] << std::endl;
        //std::cout << "--------------------------------------------------" << std::endl;
        amp->vertex(i/2,i%2,Matrix[i/2][i%2]);
    }

    if(m_noTries>0) if(!((++noTries)%m_noTries)) EvtGenReport(EVTGEN_DEBUG,"EvtGen") << " EvtHypNonLepton already finished " << noTries << " matrix element calculations" << std::endl;
}
Esempio n. 12
0
void EvtPVVCPLH::decay( EvtParticle *p){

  //added by Lange Jan4,2000
  static EvtId BS0=EvtPDL::getId("B_s0");
  static EvtId BSB=EvtPDL::getId("anti-B_s0");

  //This is only to get tag-ID
  //Mixing is not relevant
  //Lifetime is made correctly later
  //Tristan
  EvtId other_b;
  double t;

// To generate integrated CP asymmetry, EvtGen uses the "flipping".
// CP-asymmetry in this channel very small, since:
// deltaMs large ..and..
// CPV-phase small
  EvtCPUtil::getInstance()->OtherB(p,t,other_b);

  //Here we're gonna generate and set the "envelope" lifetime
  //So we take the longest living component (for positive deltaGamma: tauH)
  //The double exponent will be taken care of later, by the amplitudes
  //Tristan
  
  static double Gamma = EvtConst::c/(EvtPDL::getctau(BS0));
  static double deltaGamma = EvtCPUtil::getInstance()->getDeltaGamma(BS0);
  static double ctauLong = EvtConst::c/(Gamma-fabs(deltaGamma)/2);
  // if dG>0: tauLong=tauH(CP-odd) is then largest

  //This overrules the lifetimes made in OtherB
  t=-log(EvtRandom::Flat())*(ctauLong);//ctauLong has same dimensions as t
  if(isBsMixed(p)){
    p->getParent()->setLifetime(t);
  }else{
    p->setLifetime(t);
  }

  //These should be filled with the transversity amplitudes at t=0 //Tristan
  EvtComplex G0P,G1P,G1M;  
  G1P=EvtComplex(getArg(2)*cos(getArg(3)),getArg(2)*sin(getArg(3)));
  G0P=EvtComplex(getArg(4)*cos(getArg(5)),getArg(4)*sin(getArg(5)));
  G1M=EvtComplex(getArg(6)*cos(getArg(7)),getArg(6)*sin(getArg(7)));

  EvtComplex lambda_km=EvtComplex(cos(2*getArg(0)),sin(2*getArg(0)));//was een min in oude versie

  //deltaMs is no argument anymore
  //Tristan
  
  static double deltaMs = EvtCPUtil::getInstance()->getDeltaM(BS0);

  EvtComplex cG0P,cG1P,cG1M;

  double mt = exp(-std::max(0.,deltaGamma)*t/(2*EvtConst::c));
  double pt = exp(+std::min(0.,deltaGamma)*t/(2*EvtConst::c));

  EvtComplex gplus  = ( mt*EvtComplex(cos(deltaMs*t/(2*EvtConst::c)),sin( deltaMs*t/(2*EvtConst::c)))
		      +pt*EvtComplex(cos(deltaMs*t/(2*EvtConst::c)),sin(-deltaMs*t/(2*EvtConst::c))) )/2;
  EvtComplex gminus = ( mt*EvtComplex(cos(deltaMs*t/(2*EvtConst::c)),sin( deltaMs*t/(2*EvtConst::c)))
        	      -pt*EvtComplex(cos(deltaMs*t/(2*EvtConst::c)),sin(-deltaMs*t/(2*EvtConst::c))) )/2;;

  if (other_b==BSB){
    //These are the right equations for the transversity formalism
    //cGOP is de 0-component, CP-even, so lives shorter: mainly lifetime tauL
    //cG1P is the //-component, also CP-even, also mainly smaller exponent
    //cG1M is the transverse component, CP-odd, so has mainly longer lifetime tauH
    //Tristan
    cG0P = G0P*( gplus + lambda_km*gminus );
    cG1P = G1P*( gplus + lambda_km*gminus );
    cG1M = G1M*( gplus - lambda_km*gminus );
  } else if (other_b==BS0){
    //The equations for BsBar
    //Note the minus-sign difference
    //Tristan
    cG0P = G0P*( gplus + (1.0/lambda_km)*gminus );
    cG1P = G1P*( gplus + (1.0/lambda_km)*gminus );
    cG1M =-G1M*( gplus - (1.0/lambda_km)*gminus );

  } else{
    EvtGenReport(EVTGEN_ERROR,"EvtGen") << "other_b was not BSB or BS0!"<<std::endl;
    ::abort();
  }

  EvtComplex A0,AP,AM;
  //Converting the transversity amplitudes
  //to helicity amplitudes
  //(to plug them into SVVHelAmp)
  A0=cG0P;
  AP=(cG1P+cG1M)/sqrt(2.0);
  AM=(cG1P-cG1M)/sqrt(2.0);
  
  EvtSVVHelAmp::SVVHel(p,_amp2,getDaug(0),getDaug(1),AP,A0,AM);

  return ;
}
Esempio n. 13
0
void EvtSLBKPoleFF::getvectorff(EvtId parent,EvtId /*daught*/,
                       double t, double /*mass*/, double *a1f,
			     double *a2f, double *vf, double *a0f ){

   if ( numSLBKPoleargs !=8 ) {//modified
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "Problem in EvtSLBKPoleFF::getvectorff\n";//modified
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << "wrong number of arguements!!!\n";
     EvtGenReport(EVTGEN_ERROR,"EvtGen") << numSLBKPoleargs<<"\n";//modified
//     printf("\n*********************%d*********************",numSLBKPoleargs);
  }


   EvtGenReport(EVTGEN_INFO,"EvtGen")<<"Check the implementation of EvtSLBKPoleFF::getvectorff()!\n";


  double mb=EvtPDL::getMeanMass(parent);
  double mb2 = mb*mb;

//modified-begin
  static EvtId B0=EvtPDL::getId("B0");
  static EvtId B0B=EvtPDL::getId("anti-B0");  
  static EvtId BP=EvtPDL::getId("B+");
  static EvtId BM=EvtPDL::getId("B-");
  static EvtId BS0=EvtPDL::getId("B_s0");

  static EvtId B0S=EvtPDL::getId("B*0");
  static EvtId BPMS=EvtPDL::getId("B*+");  
  static EvtId BS0S=EvtPDL::getId("B_s*0");
  
  static EvtId D0=EvtPDL::getId("D0");
  static EvtId D0B=EvtPDL::getId("anti-D0");
  static EvtId DP=EvtPDL::getId("D+");
  static EvtId DM=EvtPDL::getId("D-");
  static EvtId DSP=EvtPDL::getId("D_s+");
  static EvtId DSM=EvtPDL::getId("D_s-");

  static EvtId D0S=EvtPDL::getId("D*0");
  static EvtId DPMS=EvtPDL::getId("D*+");
  static EvtId DSPMS=EvtPDL::getId("D_s*+");

  double mass_star=0.0;
  double mass_star2=0.0;
  if(parent==B0||parent==B0B){
     mass_star=EvtPDL::getMeanMass(B0S);
     mass_star2=mass_star*mass_star;
  }
  if(parent==BP||parent==BM){
     mass_star=EvtPDL::getMeanMass(BPMS);
     mass_star2=mass_star*mass_star;
  }
  if(parent==BS0){
     mass_star=EvtPDL::getMeanMass(BS0S);
     mass_star2=mass_star*mass_star;
  }

  if(parent==D0||parent==D0B){
     mass_star=EvtPDL::getMeanMass(D0S);
     mass_star2=mass_star*mass_star;
  }
  if(parent==DP||parent==DM){
     mass_star=EvtPDL::getMeanMass(DPMS);
     mass_star2=mass_star*mass_star;
  }
  if(parent==DSP||parent==DSM){
     mass_star=EvtPDL::getMeanMass(DSPMS);
     mass_star2=mass_star*mass_star;
  }
//modified-end

  double f0,af,bf,powf;

  f0 = SLBKPoleargs[2];//A1
  af = SLBKPoleargs[6];//b'
  bf = 0;//0
  powf = 1.0;//1.0
  *a1f = f0/(pow( 1.0 - af*t/mass_star2,powf));//modified

  f0 = SLBKPoleargs[3];//A2
  af = SLBKPoleargs[6];//b'
  bf = SLBKPoleargs[7];//b''==0
  powf = 1.0;//1.0

  *a2f = f0/(pow(1.0 - (af+bf)*(t/mass_star2) + (af*bf)*((t/mass_star2)*(t/mass_star2)),powf));//modified

  f0 = SLBKPoleargs[0];//V0
  af = SLBKPoleargs[4];//a
  bf = 0;//0
  powf = 1.0;//1.0

  *vf = f0/(pow( 1.0 - (1.0+af)*(t/mass_star2) + af*(t/mass_star2)*(t/mass_star2),powf));//modified

  f0 = SLBKPoleargs[1];//A0
  af = SLBKPoleargs[5];//a'
  bf = 0;//0
  powf = 1.0;//1.0

  *a0f = f0/(pow( 1.0 - (1.0+af)*(t/mb2) + af*((t/mb2)*(t/mb2)),powf));//modified
  return;
 }
void EvtSemiLeptonicScalarAmp::CalcAmp( EvtParticle *parent,
					EvtAmp& amp,
					EvtSemiLeptonicFF *FormFactors ) {

  static EvtId EM=EvtPDL::getId("e-");
  static EvtId MUM=EvtPDL::getId("mu-");
  static EvtId TAUM=EvtPDL::getId("tau-");
  static EvtId EP=EvtPDL::getId("e+");
  static EvtId MUP=EvtPDL::getId("mu+");
  static EvtId TAUP=EvtPDL::getId("tau+");
  
  //Add the lepton and neutrino 4 momenta to find q2

  EvtVector4R q = parent->getDaug(1)->getP4() 
                    + parent->getDaug(2)->getP4();
  double q2 = (q.mass2());

  double fpf,f0f;
  double mesonmass = parent->getDaug(0)->mass();
  double parentmass = parent->mass();

  FormFactors->getscalarff(parent->getId(),
                           parent->getDaug(0)->getId(),
                           q2,
                           mesonmass,
                           &fpf, 
                           &f0f);


  EvtVector4R p4b;
  p4b.set(parent->mass(),0.0,0.0,0.0);
  EvtVector4R p4meson = parent->getDaug(0)->getP4();
  double mdiffoverq2;
  mdiffoverq2 = parentmass*parentmass - mesonmass*mesonmass;
  mdiffoverq2 = mdiffoverq2 / q2;

  EvtVector4C l1,l2;

  EvtId l_num = parent->getDaug(1)->getId();
  EvtVector4C tds;

  if (l_num==EM||l_num==MUM||l_num==TAUM){

    tds = EvtVector4C(fpf*(p4b+p4meson - (mdiffoverq2*(p4b-p4meson)))+
		    + f0f*mdiffoverq2*(p4b-p4meson));

    l1=EvtLeptonVACurrent(parent->getDaug(1)->spParent(0),
                          parent->getDaug(2)->spParentNeutrino());
    l2=EvtLeptonVACurrent(parent->getDaug(1)->spParent(1),
                          parent->getDaug(2)->spParentNeutrino());
  }
  else{
    if (l_num==EP||l_num==MUP||l_num==TAUP){

      tds = EvtVector4C(fpf*(p4b+p4meson - (mdiffoverq2*(p4b-p4meson)))+
		    + f0f*mdiffoverq2*(p4b-p4meson));

      l1=EvtLeptonVACurrent(parent->getDaug(2)->spParentNeutrino(),
			    parent->getDaug(1)->spParent(0));
      l2=EvtLeptonVACurrent(parent->getDaug(2)->spParentNeutrino(),
			    parent->getDaug(1)->spParent(1));
    }
    else{
      EvtGenReport(EVTGEN_ERROR,"EvtGen") << "dfnb89agngri wrong lepton number\n";
    }
  }

  amp.vertex(0,l1*tds);
  amp.vertex(1,l2*tds);

}
Esempio n. 15
0
void EvtB2MuMuMuNuAmp::CalcAmp(EvtParticle *parent, 
                               EvtAmp& amp,
			       EvtbTosllMSFF   *formFactorsms){ 
                            
    
  // Check the charge conservation in the reaction 
  int charge[4];
  charge[0] = (EvtPDL::chg3(parent->getDaug(0)->getId()))/3;
  charge[1] = (EvtPDL::chg3(parent->getDaug(1)->getId()))/3;
  charge[2] = (EvtPDL::chg3(parent->getDaug(2)->getId()))/3;
  charge[3] = (EvtPDL::chg3(parent->getDaug(3)->getId()))/3;
  if(abs(charge[0]+charge[1]+charge[2]+charge[3])!=1){
     EvtGenReport(EVTGEN_ERROR,"EvtGen") 
            << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)"
            << "\n Error in the daughters charge definition!"
            << "\n charge1 = " << charge[0] 
            << "\t KF code1 = " << EvtPDL::getLundKC(parent->getDaug(0)->getId())
            << "\n charge2 = " << charge[1]
            << "\t KF code2 = " << EvtPDL::getLundKC(parent->getDaug(1)->getId())
            << "\n charge3 = " << charge[2]
            << "\t KF code3 = " << EvtPDL::getLundKC(parent->getDaug(2)->getId())
            << "\n charge4 = " << charge[3]
            << "\t KF code4 = " << EvtPDL::getLundKC(parent->getDaug(3)->getId())
            << "\n number of daughters = " << parent->getNDaug()
            << std::endl;
     ::abort();
  }
  
  
  // Daughter's positions in the matrix element
  int il1, il2, il3, il4;  //   Mu^+(k_1), Mu^-(k_2), \bar Nu_{Mu}(k_3) and Mu^-(k_4)
                           //or Mu^-(k_1), Mu^+(k_2),      Nu_{Mu}(k_3) and Mu^+(k_4)
                           //   This is the "canonical set" for current matrix element.
                           
  il1 = -101; //initialization of the daughter's positions 
  il2 = -102;
  il3 = -103; 
  il4 = -104;                        
  
  // Daughter's positions for the decay 
  //                   B^-(p) -> Mu^+(k_1) Mu^-(k_2) \bar Nu_{Mu}(k_3) Mu^-(k_4).
  if(charge[0]+charge[1]+charge[2]+charge[3] == -1){
     int ll;
     int min_charge, min_charge_il;
     min_charge    = charge[0];
     min_charge_il = 0;
     for(ll = 1; ll < 4; ll++){
        if(min_charge > charge[ll]){ 
               min_charge = charge[ll];
               min_charge_il = ll;
        }              
     }
     il2 = min_charge_il;                        // this is Mu^-(k_2)  
     if(il2 > 2){
       EvtGenReport(EVTGEN_ERROR,"EvtGen") 
            << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)"
            << "\n Error in the particles distribution!"
            << "\n il2 = "          << il2
            << "\n min_charge = "   << min_charge
            << "\n total charge = -1 = " << (charge[0]+charge[1]+charge[2]+charge[3])
            << std::endl;
       ::abort();
     }       
     for(ll = il2 + 1; ll < 4; ll++){
        if(charge[ll] == -1) il4 = ll;           // this is  Mu^-(k_4)
        }          
     for(ll = 0; ll < 4; ll++){
        if(charge[ll] == +1) il1 = ll;           // this is  Mu^+(k_1)
        }           
     for(ll = 0; ll < 4; ll++){
        if(charge[ll] == 0) il3 = ll;            // this is  \bar Nu_{Mu}(k_3)
        }               
  }

  // Daughter's positions for the decay 
  //                   B^+(p) -> Mu^-(k_1) Mu^+(k_2) Nu_{Mu}(k_3) Mu^+(k_4).
  if(charge[0]+charge[1]+charge[2]+charge[3] == 1){
     int ll;
     int max_charge, max_charge_il;
     max_charge    = charge[0];
     max_charge_il = 0;
     for(ll = 1; ll < 4; ll++){
        if(max_charge < charge[ll]){ 
               max_charge = charge[ll];
               max_charge_il = ll;
        }              
     }
     il2 = max_charge_il;                        // this is Mu^+(k_2)  
     if(il2 > 2){
       EvtGenReport(EVTGEN_ERROR,"EvtGen") 
            << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)"
            << "\n Error in the particles distribution!"
            << "\n il2 = "          << il2
            << "\n max_charge = "   << max_charge
            << "\n total charge = +1 = " << (charge[0]+charge[1]+charge[2]+charge[3])
            << std::endl;
       ::abort();
     }       
     for(ll = il2 + 1; ll < 4; ll++){
        if(charge[ll] == 1) il4 = ll;            // this is  Mu^+(k_4)
        }          
     for(ll = 0; ll < 4; ll++){
        if(charge[ll] == -1) il1 = ll;           // this is  Mu^-(k_1)
        }           
     for(ll = 0; ll < 4; ll++){
        if(charge[ll] == 0) il3 = ll;            // this is  Nu_{Mu}(k_3)
        }               
  }

  
  if((il1 < 0)||(il2 < 0)|| (il3 < 0) || (il4 < 0)){
     EvtGenReport(EVTGEN_ERROR,"EvtGen") 
            << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)"
            << "\n ilX < 0 !!!"
            << "\n il1 = " << il1
            << "\t il2 = " << il2
            << "\t il3 = " << il3
            << "\t il4 = " << il4
            << std::endl;
     ::abort();     
  }
  
  // Output for program work check.
  // Need to comment in the final version!
//  EvtGenReport(EVTGEN_ERROR,"EvtGen") 
//            << "\n il1 = " << il1
//            << "\t il2 = " << il2
//            << "\t il3 = " << il3
//            << "\t il4 = " << il4
//            << std::endl;
   //END of the daughter's positions initialization           
            
  
  // Kinematics initialization          
  
  EvtComplex unit1(1.0,0.0); // real unit
  EvtComplex uniti(0.0,1.0); // imaginary unit  

  double M1 = parent->mass();                // B-meson mass, GeV
  double ml = parent->getDaug(il1)->mass();  // mass of muon, GeV
  
  // Id and 4-momentums of the particles
  
  EvtId idparent = parent->getId(); // B-meson Id
  
  EvtVector4R p;                    // B-meson 4-momentum
  p.set(0.0,0.0,0.0,0.0);
  
  
  EvtId id_L1, id_L2, id_L3, id_L4; // leptonic Id
  
  EvtVector4R k_1;  // 4-momentum of mu^+ in the    B^- rest frame; (il1)
  EvtVector4R k_2;  // 4-momentum of mu^- in the    B^- rest frame; (il2) 
  EvtVector4R k_3;  // 4-momentum of \bar nu in the B^- rest frame; (il3)
  EvtVector4R k_4;  // 4-momentum of mu^- in the    B^- rest frame; (il4)

  k_1.set(0.0,0.0,0.0,0.0);
  k_2.set(0.0,0.0,0.0,0.0);
  k_3.set(0.0,0.0,0.0,0.0);
  k_4.set(0.0,0.0,0.0,0.0);

  EvtVector4R q_fierst;     // q = k_1 + k_2 4-momentum in the B-rest frame
  EvtVector4R k_fierst;     // k = k_3 + k_4 4-momentum in the B-rest frame
  double q2_fierst;         // Mandelstam variable s=q^2
  double k2_fierst;         // Mandelstam variable t=k^2

  EvtVector4R q_second;     // q = k_1 + k_4 4-momentum in the B-rest frame
  EvtVector4R k_second;     // k = k_3 + k_2 4-momentum in the B-rest frame
  double q2_second;         // Mandelstam variable s=q^2
  double k2_second;         // Mandelstam variable t=k^2

  p = parent->getP4Restframe();     // B-meson 4-momentum in the B-rest frame

  k_1 = parent->getDaug(il1)->getP4();
  k_2 = parent->getDaug(il2)->getP4();
  k_3 = parent->getDaug(il3)->getP4();
  k_4 = parent->getDaug(il4)->getP4();
  
  q_fierst = k_1 + k_2;
  k_fierst = k_3 + k_4;
  q2_fierst = q_fierst.mass2();
  k2_fierst = k_fierst.mass2(); 
  
  q_second = k_1 + k_4;
  k_second = k_3 + k_2; 
  q2_second = q_second.mass2();
  k2_second = k_second.mass2(); 
  
  
  // For "B^-" - and "B^+" - mesons amplitudeы separately calculations 
  static EvtIdSet bmesons("B-","B_c-");
  static EvtIdSet bbarmesons("B+","B_c+");
  
//  // Information for test of 4-momentum.
//  // Need to comment in the final version!
//  EvtGenReport(EVTGEN_ERROR,"EvtGen") 
//            << "\n 4-momentum initialization  test"
//            << "\n k_1 = " << k_1
//            << "\n k_2 = " << k_2
//            << "\n k_3 = " << k_3
//            << "\n k_4 = " << k_4
//            << "\n q_fierst = " << q_fierst
//            << "\n q_second = " << q_second
//            << "\n k_fierst = " << k_fierst
//            << "\n k_second = " << k_second
//            << std::endl; 

  
  //
  // I. VMD Contribution
  //
  
  double M2[4];   //intermediate vector mesons mass for VMD contribution
  // M2[0] = EvtPDL::getMass(EvtPDL::getId(std::string("rho0")));  // Rho^0
  // M2[1] = EvtPDL::getMass(EvtPDL::getId(std::string("omega"))); // Omega^0
  // M2[2] = M2[0];  // GeV Rho^0
  // M2[3] = M2[1];  // GeV Omega^0
  M2[0] = 0.77526; // GeV Rho^0
  M2[1] = 0.78265; // GeV Omega^0
  M2[2] = M2[0];  // GeV Rho^0
  M2[3] = M2[1];  // GeV Omega^0
  
  double Width2[4]; //intermediate vector mesons width for VMD contribution
  // Width2[0] = EvtPDL::getWidth(EvtPDL::getId(std::string("rho0")));  // Rho^0
  // Width2[1] = EvtPDL::getWidth(EvtPDL::getId(std::string("omega"))); // Omega^0
  // Width2[2] = Width2[0];  // GeV Rho^0
  // Width2[3] = Width2[1];  // GeV Omega^0
  Width2[0] = 0.1491;   // GeV Rho^0
  Width2[1] = 0.00849;  // GeV Omega^0
  Width2[2] = Width2[0];  // GeV Rho^0
  Width2[3] = Width2[1];  // GeV Omega^0
  
  double fV2[4]; //intermediate vector mesons leptonic constant for VMD contribution
                 // see D.Melikhov, N.Nikitin. PRD70, 114028 (2004)
  fV2[0] = 5.04; // GeV Rho^0    
  fV2[1] = 17.1; // GeV Omega^0
  fV2[2] = 5.04; // GeV Rho^0    
  fV2[3] = 17.1; // GeV Omega^0
  
  // For taking the form factors values
  
  // B -> V intermediate vector mesons
  // transition form-factors for VMD contribution
  // 0 -- Rho^0 for k2_fierst
  // 1 -- Omega^0 for k2_fierst
  // 2 -- Rho^0 for k2_second
  // 3 -- Omega^0 for k2_second
  double a1[4],a2[4],a3[4],a0[4],v[4],t1[4],t2[4],t3[4];  
                                         
  
  EvtId B_meson_for_FF     = EvtPDL::getId(std::string("B0"));
  EvtId rho_meson_for_FF   = EvtPDL::getId(std::string("rho0"));
  EvtId omega_meson_for_FF = EvtPDL::getId(std::string("omega"));
  
  formFactorsms->getVectorFF(B_meson_for_FF, rho_meson_for_FF, k2_fierst,
                             a1[0],a2[0],a0[0],v[0],t1[0],t2[0],t3[0]);
                             
  formFactorsms->getVectorFF(B_meson_for_FF, omega_meson_for_FF, k2_fierst,
                             a1[1],a2[1],a0[1],v[1],t1[1],t2[1],t3[1]);
                             
  formFactorsms->getVectorFF(B_meson_for_FF, rho_meson_for_FF, k2_second,
                             a1[2],a2[2],a0[2],v[2],t1[2],t2[2],t3[2]);
                             
  formFactorsms->getVectorFF(B_meson_for_FF, omega_meson_for_FF, k2_second,
                             a1[3],a2[3],a0[3],v[3],t1[3],t2[3],t3[3]);
                                
   int aa;
   for(aa = 0; aa < 4; aa++){
          a3[aa] = ((M1 + M2[aa])*a1[aa] - (M1 - M2[aa])*a2[aa])/(2.0*M2[aa]);
       }                         
  
//  // Information for test of VMD contribution.
//  // Need to comment in the final version!
//  EvtGenReport(EVTGEN_ERROR,"EvtGen") 
//            << "\n VMD Contribution test"
//            << "\n M(Bu) = " << M1 << " GeV;"
//            << "\n M(Rho) = " << M2[0] << " GeV;"
//            << "\t M(Omega) = " << M2[1] << " GeV;"
//            << "\t Gamma(Rho) = " << Width2[0] << " Gev;"
//            << "\t Gamma(Omega) = " << Width2[1] << " Gev."
//            << "\n\n a1[0] = " << a1[0]
//            << "\t  a2[0] = " << a2[0]
//            << "\t  a0[0] = " << a0[0]
//            << "\t  a3[0] = " << a3[0]
//            << "\t   v[0] = " <<  v[0]
//            << "\n\n a1[1] = " << a1[1]
//            << "\t  a2[1] = " << a2[1]
//            << "\t  a0[1] = " << a0[1]
//            << "\t  a3[1] = " << a3[1]
//            << "\t   v[1] = " <<  v[1]
//            << "\n\n a1[2] = " << a1[2]
//            << "\t  a2[2] = " << a2[2]
//            << "\t  a0[2] = " << a0[2]
//            << "\t  a3[2] = " << a3[2]
//            << "\t   v[2] = " <<  v[2]
//            << "\n\n a1[3] = " << a1[3]
//            << "\t  a2[3] = " << a2[3]
//            << "\t  a0[3] = " << a0[3]
//            << "\t  a3[3] = " << a3[3]
//            << "\t   v[3] = " <<  v[3]
//            << std::endl; 
  
  
  
  // Tensor structures for VMD contribution
  EvtTensor4C Tvmd_fierst, Tvmd_second; 
  
  
  //
  // II. Electromagnetic foton emission from B-meson contribution 
  //                     (EM contribution)  
  //
  
  // EM form factors
  // 0 -- u-quark emission for q2_fierst
  // 1 -- b-quark emission for q2_fierst
  // 2 -- u-quark emission for q2_second
  // 3 -- b-quark emission for q2_second
  double v_em[4];
  double MBstar = 5.325; // GeV
  
  v_em[0] = 4.0*MBstar*FF_B2BstarGamma_fromU(q2_fierst)/(3.0*(M1 + MBstar));
  v_em[1] = 2.0*MBstar*FF_B2BstarGamma_fromB(q2_fierst)/(3.0*(M1 + MBstar));
  v_em[2] = 4.0*MBstar*FF_B2BstarGamma_fromU(q2_second)/(3.0*(M1 + MBstar));
  v_em[3] = 2.0*MBstar*FF_B2BstarGamma_fromB(q2_second)/(3.0*(M1 + MBstar));
  
  // Tensor structures for EM contribution
  EvtTensor4C Tem_fierst, Tem_second; 
  
  
  //
  // ***
  //
  
  
  
  // Leptonic currents 
  //   L1 = (\bar mu \gamma^{\mu} (1 - \gamma^5) nu) 
  //                             or (\bar nu \gamma^{\mu} (1 - \gamma^5) mu)
  //   L2 = (\bar mu \gamma^{\nu} mu)
  EvtVector4C L1_fierst, L2_fierst;
  EvtVector4C L1_second, L2_second;

  
  int i1, i2, i3, i4;  // leptonic spin structures counters
  int leptonicspin[4]; // array for the saving of the leptonic spin configuration



  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  // +                Contribution for B- decay               +
  // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  if (bmesons.contains(idparent)){
  
  Tvmd_fierst = 0.0*EvtTensor4C::g();  
  for(aa = 0; aa < 2; aa++){
      EvtComplex coeff_vmd;
      
      double Re_vmd, Im_vmd, znam_vmd;
      Re_vmd = q2_fierst - M2[aa]*M2[aa];
      Im_vmd = Width2[aa]*M2[aa];
      znam_vmd = fV2[aa]*(Re_vmd*Re_vmd + Im_vmd*Im_vmd);
      coeff_vmd = unit1*Re_vmd/znam_vmd - uniti*Im_vmd/znam_vmd;
      
      double vaa, a2aa, a3aa;
      vaa  = 2.0*v[aa]/(M1 + M2[aa]);
      a2aa = a2[aa]/(M1 + M2[aa]);
      a3aa = 2.0*M2[aa]*(a3[aa] - a0[aa])/k2_fierst;
           
      Tvmd_fierst = Tvmd_fierst 
        +coeff_vmd*(0.0*EvtTensor4C::g()
        -(unit1*vaa*dual(EvtGenFunctions::directProd(p,q_fierst)))
        -uniti*a1[aa]*(M1 + M2[aa])*EvtTensor4C::g()
        +uniti*a2aa*EvtGenFunctions::directProd((p + q_fierst),p)
        +uniti*a3aa*EvtGenFunctions::directProd((p - q_fierst),p));
      }
 
  Tvmd_second = 0.0*EvtTensor4C::g();
  for(aa = 2; aa < 4; aa++){
      EvtComplex coeff_vmd;
      
      double Re_vmd, Im_vmd, znam_vmd;
      Re_vmd = q2_second - M2[aa]*M2[aa];
      Im_vmd = Width2[aa]*M2[aa];
      znam_vmd = fV2[aa]*(Re_vmd*Re_vmd + Im_vmd*Im_vmd);
      coeff_vmd = unit1*Re_vmd/znam_vmd - uniti*Im_vmd/znam_vmd;
      
      double vaa, a2aa, a3aa;
      vaa  = 2.0*v[aa]/(M1 + M2[aa]);
      a2aa = a2[aa]/(M1 + M2[aa]);
      a3aa = 2.0*M2[aa]*(a3[aa] - a0[aa])/k2_second;
      
      Tvmd_second = Tvmd_second  
        +coeff_vmd*(0.0*EvtTensor4C::g()
        -unit1*vaa*dual(EvtGenFunctions::directProd(p,q_second))
        -uniti*a1[aa]*(M1 + M2[aa])*EvtTensor4C::g()
        +uniti*a2aa*EvtGenFunctions::directProd((p + q_second),p)
        +uniti*a3aa*EvtGenFunctions::directProd((p - q_second),p));
      }
      
  Tem_fierst = 0.0*EvtTensor4C::g(); 
  for(aa = 0; aa < 2; aa++){
      double fBstar = 0.2; // GeV
      double coeff;
      coeff = fBstar/(q2_fierst*(k2_fierst - MBstar*MBstar));
      Tem_fierst = Tem_fierst - coeff*v_em[aa]*dual(EvtGenFunctions::directProd(p,k_fierst)); 
     }  
     
  Tem_second = 0.0*EvtTensor4C::g(); 
  for(aa = 2; aa < 4; aa++){
      double fBstar = 0.2; // GeV
      double coeff;
      coeff = fBstar/(q2_fierst*(k2_fierst - MBstar*MBstar));
      Tem_second = Tem_second - coeff*v_em[aa]*dual(EvtGenFunctions::directProd(p,k_second)); 
     }     
      
  // Amplitude calculation
  for(i2=0;i2<2;i2++){
    leptonicspin[0] = i2;
    for(i1=0;i1<2;i1++){
      leptonicspin[1] = i1;
      for(i4=0;i4<2;i4++){
        leptonicspin[2] = i4;
        i3 = 0;                  // neutrino spin structure!
        leptonicspin[3] = i3;
        
        //(\bar mu(k_4) \gamma^{\mu} (1 - \gamma^5) nu(- k_3))
        L1_fierst = EvtLeptonVACurrent(parent->getDaug(il4)->spParent(i4),
                                       parent->getDaug(il3)->spParentNeutrino());
        
        
        //(\bar mu(k_2) \gamma^{\mu} mu(- k_1))
        L2_fierst = EvtLeptonVCurrent(parent->getDaug(il2)->spParent(i2),
                                       parent->getDaug(il1)->spParent(i1));
        
        
        //(\bar mu(k_2) \gamma^{\mu} (1 - \gamma^5) nu(- k_3))
        L1_second = EvtLeptonVACurrent(parent->getDaug(il2)->spParent(i2),
                                       parent->getDaug(il3)->spParentNeutrino());
        
        
        //(\bar mu(k_4) \gamma^{\mu} mu(- k_1))
        L2_second = EvtLeptonVCurrent(parent->getDaug(il4)->spParent(i4),
                                       parent->getDaug(il1)->spParent(i1));
         
        // VMD                               
        EvtVector4C Evmd_fierst, Evmd_second;
        Evmd_fierst=Tvmd_fierst.cont2(L2_fierst);
        Evmd_second=Tvmd_second.cont2(L2_second);
        
        // EM
        EvtVector4C Eem_fierst, Eem_second;
        Eem_fierst=Tem_fierst.cont2(L1_fierst);
        Eem_second=Tem_second.cont2(L1_second);
           
        // Bremsstrahlung   
        EvtComplex Ebrst_fierst, Ebrst_second;
        double fB = 0.20; // GeV leptonic constant of B^{\pm} mesons
        Ebrst_fierst = uniti*fB*L2_fierst*L1_fierst/q2_fierst;
        Ebrst_second = uniti*fB*L2_second*L1_second/q2_second;
        
        amp.vertex(leptonicspin, L1_fierst*Evmd_fierst + L2_fierst*Eem_fierst + Ebrst_fierst 
                               - L1_second*Evmd_second - L2_second*Eem_second - Ebrst_second);
                               
         if(q2_fierst < 4.0*ml*ml)
            {
               amp.vertex(leptonicspin, unit1*0.0);
            }                      
          if(q2_second < 4.0*ml*ml)
            {
               amp.vertex(leptonicspin, unit1*0.0);
            }  
           if(k2_fierst < ml*ml)
            {
               amp.vertex(leptonicspin, unit1*0.0);
            }                      
          if(k2_second < ml*ml)
            {
               amp.vertex(leptonicspin, unit1*0.0);
            }                                                                    
          
        }  // End of the operator "for(i4=0;i4<2;i4++)"
      }    // End of the operator "for(i1=0;i1<2;i1++)"
    }      // End of the operator "for(i2=0;i2<2;i2++)"
      
   }  // End of the operator: "if (bmesons.contains(idparent))"

   
   else { // Start of the operator "else N1" 
  // ++++++++++++++++++++++++++++++++++++++++++++++++++
  // +           Contribution for B+ decay            +
  // ++++++++++++++++++++++++++++++++++++++++++++++++++
  if (bbarmesons.contains(idparent)){
  
  Tvmd_fierst = 0.0*EvtTensor4C::g();  
  for(aa = 0; aa < 2; aa++){
      EvtComplex coeff_vmd;
      
      double Re_vmd, Im_vmd, znam_vmd;
      Re_vmd = q2_fierst - M2[aa]*M2[aa];
      Im_vmd = Width2[aa]*M2[aa];
      znam_vmd = fV2[aa]*(Re_vmd*Re_vmd + Im_vmd*Im_vmd);
      coeff_vmd = unit1*Re_vmd/znam_vmd - uniti*Im_vmd/znam_vmd;
      
      double vaa, a2aa, a3aa;
      vaa  = 2.0*v[aa]/(M1 + M2[aa]);
      a2aa = a2[aa]/(M1 + M2[aa]);
      a3aa = 2.0*M2[aa]*(a3[aa] - a0[aa])/k2_fierst;
            
      Tvmd_fierst = Tvmd_fierst 
        +coeff_vmd*(0.0*EvtTensor4C::g()
        +unit1*vaa*dual(EvtGenFunctions::directProd(p,q_fierst))
        -uniti*a1[aa]*(M1 + M2[aa])*EvtTensor4C::g()
        +uniti*a2aa*EvtGenFunctions::directProd((p + q_fierst),p)
        +uniti*a3aa*EvtGenFunctions::directProd((p - q_fierst),p));
      }
 
  Tvmd_second = 0.0*EvtTensor4C::g();
  for(aa = 2; aa < 4; aa++){
      EvtComplex coeff_vmd;
      
      double Re_vmd, Im_vmd, znam_vmd;
      Re_vmd = q2_second - M2[aa]*M2[aa];
      Im_vmd = Width2[aa]*M2[aa];
      znam_vmd = fV2[aa]*(Re_vmd*Re_vmd + Im_vmd*Im_vmd);
      coeff_vmd = unit1*Re_vmd/znam_vmd - uniti*Im_vmd/znam_vmd;
      
      double vaa, a2aa, a3aa;
      vaa  = 2.0*v[aa]/(M1 + M2[aa]);
      a2aa = a2[aa]/(M1 + M2[aa]);
      a3aa = 2.0*M2[aa]*(a3[aa] - a0[aa])/k2_second;
   
      Tvmd_second = Tvmd_second  
        +coeff_vmd*(0.0*EvtTensor4C::g()
        +unit1*vaa*dual(EvtGenFunctions::directProd(p,q_second))
        -uniti*a1[aa]*(M1 + M2[aa])*EvtTensor4C::g()
        +uniti*a2aa*EvtGenFunctions::directProd((p + q_second),p)
        +uniti*a3aa*EvtGenFunctions::directProd((p - q_second),p));
      }
      
  Tem_fierst = 0.0*EvtTensor4C::g(); 
  for(aa = 0; aa < 2; aa++){
      double fBstar = 0.0 - 0.2; // GeV
      double coeff;
      coeff = fBstar/(q2_fierst*(k2_fierst - MBstar*MBstar));
      Tem_fierst = Tem_fierst + coeff*v_em[aa]*dual(EvtGenFunctions::directProd(p,k_fierst)); 
     }  
     
  Tem_second = 0.0*EvtTensor4C::g(); 
  for(aa = 2; aa < 4; aa++){
      double fBstar = 0.0 - 0.2; // GeV
      double coeff;
      coeff = fBstar/(q2_fierst*(k2_fierst - MBstar*MBstar));
      Tem_second = Tem_second + coeff*v_em[aa]*dual(EvtGenFunctions::directProd(p,k_second)); 
     }        
      
  // Amplitude calculation
  for(i2=0;i2<2;i2++){
    leptonicspin[0] = i2;
    for(i1=0;i1<2;i1++){
      leptonicspin[1] = i1;
      for(i4=0;i4<2;i4++){
        leptonicspin[2] = i4;
        i3 = 0;                  // neutrino spin structure!
        leptonicspin[3] = i3;
        
        //(\bar nu(k_3) \gamma^{\mu} (1 - \gamma^5) mu(- k_4))
        L1_fierst = EvtLeptonVACurrent(parent->getDaug(il3)->spParentNeutrino(),
                                       parent->getDaug(il4)->spParent(i4));
        
        
        //(\bar mu(k_1) \gamma^{\mu} mu(- k_2))
        L2_fierst = EvtLeptonVCurrent(parent->getDaug(il1)->spParent(i1),
                                       parent->getDaug(il2)->spParent(i2));
        
        
        //(\bar nu(k_3) \gamma^{\mu} (1 - \gamma^5) mu(- k_2))
        L1_second = EvtLeptonVACurrent(parent->getDaug(il3)->spParentNeutrino(),
                                       parent->getDaug(il2)->spParent(i2));
        
        
        //(\bar mu(k_1) \gamma^{\mu} mu(- k_4))
        L2_second = EvtLeptonVCurrent(parent->getDaug(il1)->spParent(i1),
                                       parent->getDaug(il4)->spParent(i4));
         
        // VMD        
        EvtVector4C Evmd_fierst, Evmd_second;
        Evmd_fierst=Tvmd_fierst.cont2(L2_fierst);
        Evmd_second=Tvmd_second.cont2(L2_second);
        
        // EM
        EvtVector4C Eem_fierst, Eem_second;
        Eem_fierst=Tem_fierst.cont2(L1_fierst);
        Eem_second=Tem_second.cont2(L1_second);
           
        // Bremsstrahlung                                                               
        EvtComplex Ebrst_fierst, Ebrst_second;
        double fB = 0.20; // GeV leptonic constant of B^{\pm} mesons
        Ebrst_fierst = uniti*fB*L2_fierst*L1_fierst/q2_fierst;
        Ebrst_second = uniti*fB*L2_second*L1_second/q2_second;
        
        
        amp.vertex(leptonicspin, L1_fierst*Evmd_fierst + L2_fierst*Eem_fierst + Ebrst_fierst 
                               - L1_second*Evmd_second - L2_second*Eem_second - Ebrst_second);
                               
         if(q2_fierst < 4.0*ml*ml)
            {
               amp.vertex(leptonicspin, unit1*0.0);
            }                      
          if(q2_second < 4.0*ml*ml)
            {
               amp.vertex(leptonicspin, unit1*0.0);
            }  
           if(k2_fierst < ml*ml)
            {
               amp.vertex(leptonicspin, unit1*0.0);
            }                      
          if(k2_second < ml*ml)
            {
               amp.vertex(leptonicspin, unit1*0.0);
            }                          
          
        }  // End of the operator "for(i4=0;i4<2;i4++)"
      }    // End of the operator "for(i1=0;i1<2;i1++)"
    }      // End of the operator "for(i2=0;i2<2;i2++)"
      
   }  // End of the operator: "if (bbarmesons.contains(idparent))"
   
   else{ // Start of the operator "else N2"
         EvtGenReport(EVTGEN_ERROR,"EvtGen") 
             << "\n\n The function EvtB2MuMuMuNuAmp::CalcAmp(...)"
             << "\n Wrong B-meson number"
             << "\n B-meson KF code = " << EvtPDL::getLundKC(parent->getId())
             << std::endl;
         ::abort();    
   }  // End of the operator "else N2" 

   }  // End of the operator "else N1" 
}
Esempio n. 16
0
EvtComplex EvtResonance2::resAmpl() {
 
  double pi180inv = 1.0/EvtConst::radToDegrees;

  EvtComplex ampl;
  EvtVector4R  p4_d3 = _p4_p-_p4_d1-_p4_d2;

  //get cos of the angle between the daughters from their 4-momenta
  //and the 4-momentum of the parent

  //in general, EvtDecayAngle(parent, part1+part2, part1) gives the angle
  //the missing particle (not listed in the arguments) makes
  //with part2 in the rest frame of both
  //listed particles (12)
 
  //angle 3 makes with 2 in rest frame of 12 (CS3)  
  //double cos_phi_0 = EvtDecayAngle(_p4_p, _p4_d1+_p4_d2, _p4_d1);
  //angle 3 makes with 1 in 12 is, of course, -cos_phi_0

  //first compute several quantities...follow CLEO preprint 00-23

  double mAB=(_p4_d1+_p4_d2).mass();
  double mBC=(_p4_d2+p4_d3).mass();
  double mAC=(_p4_d1+p4_d3).mass();
  double mA=_p4_d1.mass(); 
  double mB=_p4_d2.mass(); 
  double mD=_p4_p.mass();
  double mC=p4_d3.mass();
  
  double mR=_bwm;
  double gammaR=_gamma;
  double mdenom = _invmass_angdenom ? mAB : mR;
  double pAB=sqrt( (((mAB*mAB-mA*mA-mB*mB)*(mAB*mAB-mA*mA-mB*mB)/4.0) -
		    mA*mA*mB*mB)/(mAB*mAB));
  double pR=sqrt( (((mR*mR-mA*mA-mB*mB)*(mR*mR-mA*mA-mB*mB)/4.0) -
		   mA*mA*mB*mB)/(mR*mR));

  double pD= (((mD*mD-mR*mR-mC*mC)*(mD*mD-mR*mR-mC*mC)/4.0) -
		   mR*mR*mC*mC)/(mD*mD);
  if ( pD>0 ) { pD=sqrt(pD); } else {pD=0;}
  double pDAB=sqrt( (((mD*mD-mAB*mAB-mC*mC)*(mD*mD-mAB*mAB-mC*mC)/4.0) -
		   mAB*mAB*mC*mC)/(mD*mD));



  double fR=1;
  double fD=1;
  int power=0;
  switch (_spin) {
  case 0:
    fR=1.0;
    fD=1.0;
    power=1;
    break;
  case 1:
    fR=sqrt(1.0+1.5*1.5*pR*pR)/sqrt(1.0+1.5*1.5*pAB*pAB);
    fD=sqrt(1.0+5.0*5.0*pD*pD)/sqrt(1.0+5.0*5.0*pDAB*pDAB);
    power=3;
    break;
  case 2:
    fR = sqrt( (9+3*pow((1.5*pR),2)+pow((1.5*pR),4))/(9+3*pow((1.5*pAB),2)+pow((1.5*pAB),4)) );
    fD = sqrt( (9+3*pow((5.0*pD),2)+pow((5.0*pD),4))/(9+3*pow((5.0*pDAB),2)+pow((5.0*pDAB),4)) );
    power=5;
    break;
  default:
    EvtGenReport(EVTGEN_INFO,"EvtGen") << "Incorrect spin in EvtResonance22.cc\n";
  }
  
  double gammaAB= gammaR*pow(pAB/pR,power)*(mR/mAB)*fR*fR;
  switch (_spin) {
  case 0:
    ampl=_ampl*EvtComplex(cos(_theta*pi180inv),sin(_theta*pi180inv))*
          fR*fD/(mR*mR-mAB*mAB-EvtComplex(0.0,mR*gammaAB));
    break;
  case 1:
    ampl=_ampl*EvtComplex(cos(_theta*pi180inv),sin(_theta*pi180inv))*
      (fR*fD*(mAC*mAC-mBC*mBC+((mD*mD-mC*mC)*(mB*mB-mA*mA)/(mdenom*mdenom)))/
       (mR*mR-mAB*mAB-EvtComplex(0.0,mR*gammaAB)));
    break;
  case 2:
    ampl=_ampl*EvtComplex(cos(_theta*pi180inv),sin(_theta*pi180inv))*
      fR*fD/(mR*mR-mAB*mAB-EvtComplex(0.0,mR*gammaAB))*
      (pow((mBC*mBC-mAC*mAC+(mD*mD-mC*mC)*(mA*mA-mB*mB)/(mdenom*mdenom)),2)-
       (1.0/3.0)*(mAB*mAB-2*mD*mD-2*mC*mC+pow((mD*mD- mC*mC)/mdenom, 2))*
       (mAB*mAB-2*mA*mA-2*mB*mB+pow((mA*mA-mB*mB)/mdenom,2))); 
  break;

  default:
    EvtGenReport(EVTGEN_INFO,"EvtGen") << "Incorrect spin in EvtResonance22.cc\n";
  }

  return ampl;
}