//-------------------------------------------------------------------------- // // 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 #include "EvtGenBase/EvtConst.hh" using std::endl; EvtSSDCP::~EvtSSDCP() {} void EvtSSDCP::getName(std::string& model_name){ model_name="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)); // FS commented this check to include alias of B0 // if ( !((getParentId() == EvtPDL::getId("B0"))||(getParentId() == EvtPDL::getId("B0B"))) ) { // report(ERROR, "EvtGen") << "EvtSSDCP cannot decay " // << EvtPDL::name(getParentId()) // << ". Must be specified to decay" // << " only B0 or a B0B ." << endl; // report(ERROR,"EvtGen") << "Will terminate execution!"<=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: _gamma=1/EvtPDL::getctau(EvtPDL::getId("B0")); //gamma/c (1/mm) _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::OtherB(p,t,other_b,0.5); // t is c*Dt (mm) //if (flip) t=-t; //FS We assume DGamma=GammaLow-GammaHeavy and Dm=mHeavy-mLow EvtComplex expL=exp(-EvtComplex(-0.25*_dgamma*t,0.5*_dm*t)); EvtComplex expH=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){ //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()); 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 ; }