//-------------------------------------------------------------------------- // // Environment: // This software is part of the EvtGen package developed jointly // for the BaBar and CLEO collaborations. If you use all or part // of it, please give an appropriate acknowledgement. // // Copyright Information: See EvtGen/COPYRIGHT // Copyright (C) 2001 Caltech // // Module: EvtSSDCP.cc // // Description: See EvtSSDCP.hh // // Modification history: // // RYD August 12, 2001 Module created // F. Sandrelli, Fernando M-V March 1, 2002 Debugged and added z parameter (CPT violation) //------------------------------------------------------------------------ // #include "EvtGenBase/EvtPatches.hh" #include #include "EvtGenBase/EvtParticle.hh" #include "EvtGenBase/EvtRandom.hh" #include "EvtGenBase/EvtGenKine.hh" #include "EvtGenBase/EvtCPUtil.hh" #include "EvtGenBase/EvtPDL.hh" #include "EvtGenBase/EvtReport.hh" #include "EvtGenBase/EvtVector4C.hh" #include "EvtGenBase/EvtTensor4C.hh" #include "EvtGenModels/EvtSSDCP.hh" #include "EvtGenBase/EvtIncoherentMixing.hh" #include #include "EvtGenBase/EvtConst.hh" using std::endl; EvtSSDCP::~EvtSSDCP() {} std::string EvtSSDCP::getName(){ return "SSD_CP"; } EvtDecayBase* EvtSSDCP::clone(){ return new EvtSSDCP; } void EvtSSDCP::init(){ // check that there are 8 or 12 or 14 arguments checkNArg(14,12,8); checkNDaug(2); EvtSpinType::spintype d1type=EvtPDL::getSpinType(getDaug(0)); EvtSpinType::spintype d2type=EvtPDL::getSpinType(getDaug(1)); // Check it is a B0 or B0s if ( ( getParentId() != EvtPDL::getId( "B0" ) ) && ( getParentId() != EvtPDL::getId( "anti-B0" ) ) && ( getParentId() != EvtPDL::getId( "B_s0" ) ) && ( getParentId() != EvtPDL::getId( "anti-B_s0" ) ) ) { report( ERROR , "EvtGen" ) << "EvtSSDCP only decays B0 and B0s" << std::endl ; ::abort() ; } 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))) ) { report(ERROR,"EvtGen") << "EvtSSDCP 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 "<=12){ _eigenstate=false; _A_fbar=getArg(8)*EvtComplex(cos(getArg(9)),sin(getArg(9))); _Abar_fbar=getArg(10)*EvtComplex(cos(getArg(11)),sin(getArg(11))); } else{ //I'm somewhat confused about this. For a CP eigenstate set the //amplitudes to the same. For a non CP eigenstate CPT invariance //is enforced. (ryd) if ( (getDaug(0)==EvtPDL::chargeConj(getDaug(0))&& getDaug(1)==EvtPDL::chargeConj(getDaug(1)))|| (getDaug(0)==EvtPDL::chargeConj(getDaug(1))&& getDaug(1)==EvtPDL::chargeConj(getDaug(0)))){ _eigenstate=true; }else{ _eigenstate=false; _A_fbar=conj(_Abar_f); _Abar_fbar=conj(_A_f); } } //FS: new check for z if (getNArg()==14){ //FS Set _z parameter if provided else set it 0 _z=EvtComplex(getArg(12),getArg(13)); } else{ _z=EvtComplex(0.0,0.0); } // FS substituted next 2 lines... // // _gamma=EvtPDL::getctau(EvtPDL::getId("B0")); //units of 1/mm //_dgamma=_gamma*0.5*_dgog; // // ...with: if ( ( getParentId() == EvtPDL::getId("B0") ) || ( getParentId() == EvtPDL::getId("anti-B0") ) ) { _gamma=1./EvtPDL::getctau(EvtPDL::getId("B0")); //gamma/c (1/mm) } else{ _gamma=1./EvtPDL::getctau(EvtPDL::getId("B_s0")) ; } _dgamma=_gamma*_dgog; //dgamma/c (1/mm) if (verbose()){ report(INFO,"EvtGen") << "SSD_CP will generate CP/CPT violation:" << endl << endl << " " << EvtPDL::name(getParentId()).c_str() << " --> " << EvtPDL::name(getDaug(0)).c_str() << " + " << EvtPDL::name(getDaug(1)).c_str() << endl << endl << "using parameters:" << endl << endl << " delta(m) = " << _dm << " hbar/ps" << endl << "dGamma = " << _dgamma <<" ps-1" <initializePhaseSpace(2, daugs); EvtComplex amp; EvtCPUtil::getInstance()->OtherB(p,t,other_b,0.5); // t is c*Dt (mm) // EvtIncoherentMixing::OtherB( p , t , other_b , 0.5 ) ; //if (flip) t=-t; //FS We assume DGamma=GammaLow-GammaHeavy and Dm=mHeavy-mLow EvtComplex expH=exp(-EvtComplex(-0.25*_dgamma*t,0.5*_dm*t)); EvtComplex expL=exp(EvtComplex(-0.25*_dgamma*t,0.5*_dm*t)); //FS Definition of gp and gm EvtComplex gp=0.5*(expL+expH); EvtComplex gm=0.5*(expL-expH); //FS Calculation os sqrt(1-z^2) EvtComplex sqz=sqrt(abs(1-_z*_z))*exp(EvtComplex(0,arg(1-_z*_z)/2)); //EvtComplex BB=0.5*(expL+expH); // //EvtComplex barBB=_qoverp*0.5*(expL-expH); // //EvtComplex BbarB=_poverq*0.5*(expL-expH); // //EvtComplex barBbarB=BB; // // FS redefinition of these guys... (See BAD #188 eq.35 for ref.) // q/p is taken as in the BaBar Phys. Book (opposite sign wrt ref.) EvtComplex BB=gp+_z*gm; // EvtComplex barBB=sqz*_qoverp*gm; // EvtComplex BbarB=sqz*_poverq*gm; // EvtComplex barBbarB=gp-_z*gm; // if (!flip){ if (other_b==B0B||other_b==B0Bs){ //at t=0 we have a B0 //report(INFO,"EvtGen") << "B0B"<getP4Restframe(); double m_parent=p4_parent.mass(); EvtSpinType::spintype d2type=EvtPDL::getSpinType(getDaug(1)); EvtVector4R momv; EvtVector4R moms; if (d2type==EvtSpinType::SCALAR){ d2type=EvtPDL::getSpinType(getDaug(0)); d= p->getDaug(0); momv = d->getP4(); moms = p->getDaug(1)->getP4(); } else{ d= p->getDaug(1); momv = d->getP4(); moms = p->getDaug(0)->getP4(); } if (d2type==EvtSpinType::SCALAR) { vertex(amp); } if (d2type==EvtSpinType::VECTOR) { double norm=momv.mass()/(momv.d3mag()*p->mass()); //std::cout << amp << " " << norm << " " << p4_parent << d->getP4()<< std::endl; // std::cout << EvtPDL::name(d->getId()) << " " << EvtPDL::name(p->getDaug(0)->getId()) << // " 1and2 " << EvtPDL::name(p->getDaug(1)->getId()) << std::endl; //std::cout << d->eps(0) << std::endl; //std::cout << d->epsParent(0) << std::endl; vertex(0,amp*norm*p4_parent*(d->epsParent(0))); vertex(1,amp*norm*p4_parent*(d->epsParent(1))); vertex(2,amp*norm*p4_parent*(d->epsParent(2))); } if (d2type==EvtSpinType::TENSOR) { double norm=d->mass()*d->mass()/(m_parent*d->getP4().d3mag()*d->getP4().d3mag()); vertex(0,amp*norm*d->epsTensorParent(0).cont1(p4_parent)*p4_parent); vertex(1,amp*norm*d->epsTensorParent(1).cont1(p4_parent)*p4_parent); vertex(2,amp*norm*d->epsTensorParent(2).cont1(p4_parent)*p4_parent); vertex(3,amp*norm*d->epsTensorParent(3).cont1(p4_parent)*p4_parent); vertex(4,amp*norm*d->epsTensorParent(4).cont1(p4_parent)*p4_parent); } return ; } std::string EvtSSDCP::getParamName(int i) { switch(i) { case 0: return "deltaM"; case 1: return "deltaGammaOverGamma"; case 2: return "qOverP"; case 3: return "qOverPPhase"; case 4: return "Af"; case 5: return "AfPhase"; case 6: return "Abarf"; case 7: return "AbarfPhase"; case 8: return "Afbar"; case 9: return "AfbarPhase"; case 10: return "Abarfbar"; case 11: return "AbarfbarPhase"; case 12: return "Z"; case 13: return "ZPhase"; default: return ""; } } std::string EvtSSDCP::getParamDefault(int i) { switch(i) { case 3: return "0.0"; case 4: return "1.0"; case 5: return "0.0"; case 6: return "1.0"; case 7: return "0.0"; default: return ""; } }