LCOV - code coverage report
Current view: top level - TEvtGen/EvtGen/EvtGenModels - EvtBcToNPi.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 202 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 15 0.0 %

          Line data    Source code
       1             : //--------------------------------------------------------------------------
       2             : //
       3             : // Environment:
       4             : //      This software is part of the EvtGen package. If you use all or part
       5             : //      of it, please give an appropriate acknowledgement.
       6             : //
       7             : // Copyright Information: See EvtGen/COPYRIGHT
       8             : //
       9             : // Module: EvtGenModels/EvtBcToNPi.hh
      10             : //
      11             : // Description: General decay model for Bc -> V + npi and Bc -> P + npi
      12             : //
      13             : // Modification history:
      14             : //
      15             : //    A.Berezhnoy, A.Likhoded, A.Luchinsky  April 2011   Module created
      16             : //
      17             : //------------------------------------------------------------------------
      18             : 
      19             : #include "EvtGenBase/EvtPatches.hh"
      20             : 
      21             : #include "EvtGenBase/EvtPDL.hh"
      22             : #include "EvtGenBase/EvtReport.hh"
      23             : #include "EvtGenBase/EvtVector4C.hh"
      24             : #include "EvtGenBase/EvtTensor4C.hh"
      25             : #include "EvtGenBase/EvtIdSet.hh"
      26             : #include "EvtGenBase/EvtSpinType.hh"
      27             : #include "EvtGenBase/EvtScalarParticle.hh"
      28             : 
      29             : #include "EvtGenModels/EvtBcToNPi.hh"
      30             : 
      31             : #include <iostream>
      32             : using std::endl;
      33             : 
      34           0 : EvtBcToNPi::EvtBcToNPi(bool printAuthorInfo) {
      35           0 :   nCall=0; maxAmp2=0;
      36           0 :   if (printAuthorInfo == true) {this->printAuthorInfo();}
      37           0 : }
      38             : 
      39           0 : EvtBcToNPi::~EvtBcToNPi() { 
      40           0 : }
      41             : 
      42             : std::string EvtBcToNPi::getName(){
      43             : 
      44           0 :   return "EvtBcToNPi";     
      45             : 
      46             : }
      47             : 
      48             : EvtDecayBase* EvtBcToNPi::clone(){
      49             : 
      50           0 :   return new EvtBcToNPi;
      51             : 
      52           0 : }
      53             : 
      54             : 
      55             : void EvtBcToNPi::init(){
      56             : 
      57             :         // check spins
      58           0 :         checkSpinParent(EvtSpinType::SCALAR);
      59             : 
      60             : 
      61             :         // the others are scalar
      62           0 :         for (int i=1; i<=(getNDaug()-1);i++) {
      63           0 :                 checkSpinDaughter(i,EvtSpinType::SCALAR);
      64             :         };
      65             : 
      66           0 :         _beta=-0.108; _mRho=0.775; _gammaRho=0.149;
      67           0 :         _mRhopr=1.364; _gammaRhopr=0.400; _mA1=1.23; _gammaA1=0.4;
      68             : 
      69             :         // read arguments
      70           0 :         if( EvtPDL::getSpinType(getDaug(0)) == EvtSpinType::VECTOR) {
      71           0 :                 checkNArg(10);
      72             :                 int n=0;
      73           0 :                 _maxProb=getArg(n++);
      74           0 :                 FA0_N=getArg(n++);
      75           0 :                 FA0_c1=getArg(n++);
      76           0 :                 FA0_c2=getArg(n++);
      77           0 :                 FAp_N=getArg(n++);
      78           0 :                 FAp_c1=getArg(n++);
      79           0 :                 FAp_c2=getArg(n++);
      80           0 :                 FV_N=getArg(n++);
      81           0 :                 FV_c1=getArg(n++);
      82           0 :                 FV_c2=getArg(n++);
      83           0 :                 FAm_N=0;
      84           0 :                 FAm_c1=0;
      85           0 :                 FAm_c2=0;
      86           0 :         }
      87           0 :         else if( EvtPDL::getSpinType(getDaug(0)) == EvtSpinType::SCALAR) {
      88           0 :                 checkNArg(4);
      89             :                 int n=0;
      90           0 :                 _maxProb=getArg(n++);
      91           0 :                 Fp_N=getArg(n++);
      92           0 :                 Fp_c1=getArg(n++);
      93           0 :                 Fp_c2=getArg(n++);
      94           0 :                 Fm_N=0;
      95           0 :                 Fm_c1=0;
      96           0 :                 Fm_c2=0;
      97             :         }
      98             :         else {
      99           0 :                 report(Severity::Error,"EvtGen") << "Have not yet implemented this final state in BCPSINPI model" << endl;
     100           0 :                 report(Severity::Error,"EvtGen") << "Ndaug="<<getNDaug() << endl;
     101           0 :                 for ( int id=0; id<(getNDaug()-1); id++ ) 
     102           0 :                         report(Severity::Error,"EvtGen") << "Daug " << id << " "<<EvtPDL::name(getDaug(id)).c_str() << endl;
     103           0 :                 return;
     104             : 
     105             :         };
     106             : 
     107           0 :         if(getNDaug()<2 || getNDaug()>4) {
     108           0 :                 report(Severity::Error,"EvtGen") << "Have not yet implemented this final state in BCPSINPI model" << endl;
     109           0 :                 report(Severity::Error,"EvtGen") << "Ndaug="<<getNDaug() << endl;
     110           0 :                 for ( int id=0; id<(getNDaug()-1); id++ ) 
     111           0 :                         report(Severity::Error,"EvtGen") << "Daug " << id << " "<<EvtPDL::name(getDaug(id)).c_str() << endl;
     112           0 :                 return;
     113             :         }
     114             : 
     115           0 : }
     116             : 
     117             : double EvtBcToNPi::_ee(double M, double m1, double m2) {
     118           0 :         return (M*M+m1*m1-m2*m2)/(2*M);
     119             : };
     120             : 
     121             : double EvtBcToNPi::_pp(double M, double m1, double m2) {
     122           0 :         double __ee=_ee(M,m1,m2);
     123           0 :         return sqrt(__ee*__ee-m1*m1);
     124             : };
     125             : 
     126             : 
     127             : void EvtBcToNPi::initProbMax(){
     128           0 :         if(_maxProb>0.)      setProbMax(_maxProb);
     129             :         else {
     130           0 :                 EvtId id=getParentId();
     131           0 :                 EvtScalarParticle *p=new EvtScalarParticle();
     132           0 :                 p->init(id, EvtPDL::getMass(id),0., 0., 0.);
     133           0 :                 p->setDiagonalSpinDensity();
     134             :                 // add daughters
     135           0 :                 p->makeDaughters(getNDaug(), getDaugs() );
     136             : 
     137             :                 // fill the momenta
     138           0 :                 if(getNDaug()==2) {
     139           0 :                         double M=EvtPDL::getMass(id), m1=EvtPDL::getMass(getDaug(0)), m2=EvtPDL::getMass(getDaug(1));
     140           0 :                         double __pp=_pp(M,m1,m2);
     141           0 :                         p->getDaug(0)->setP4( EvtVector4R( _ee(M,m1,m2), 0., 0., __pp) );
     142           0 :                         p->getDaug(1)->setP4( EvtVector4R( _ee(M,m2,m1), 0., 0., -__pp) );
     143           0 :                 }
     144           0 :                 else if( getNDaug()==3) {
     145           0 :                         double M=EvtPDL::getMass(id), 
     146           0 :                                 m1=EvtPDL::getMass(getDaug(0)), 
     147           0 :                                 m2=EvtPDL::getMass(getDaug(1)),
     148           0 :                                 m3=EvtPDL::getMass(getDaug(2));
     149           0 :                         double __ppRho=_pp(M,m1,_mRho), __ppPi=_pp(_mRho,m2,m3);
     150           0 :                         p->getDaug(0)->setP4( EvtVector4R( _ee(M,m1,_mRho), 0., 0., __ppRho) );
     151           0 :                         EvtVector4R _pRho( _ee(M,_mRho,m1), 0., 0., -__ppRho);
     152           0 :                         EvtVector4R _p2( _ee(_mRho, m2, m3), 0., 0., __ppPi); _p2.applyBoostTo(_pRho);
     153           0 :                         EvtVector4R _p3( _ee(_mRho, m2, m3), 0., 0., -__ppPi); _p3.applyBoostTo(_pRho);
     154           0 :                         p->getDaug(1)->setP4(_p2);
     155           0 :                         p->getDaug(2)->setP4(_p3);
     156             : 
     157           0 :                 }
     158           0 :                 else if( getNDaug()==4) {
     159           0 :                         double M=EvtPDL::getMass(id), 
     160           0 :                                 m1=EvtPDL::getMass(getDaug(0)), 
     161           0 :                                 m2=EvtPDL::getMass(getDaug(1)),
     162           0 :                                 m3=EvtPDL::getMass(getDaug(2)),
     163           0 :                                 m4=EvtPDL::getMass(getDaug(3));
     164           0 :                         if(M<m1+_mA1) return;
     165           0 :                         double   __ppA1=_pp(M,m1,_mA1),
     166           0 :                                  __ppRho=_pp(_mA1,_mRho,m4),
     167           0 :                                  __ppPi=_pp(_mRho, m2, m3);
     168           0 :                         p->getDaug(0)->setP4( EvtVector4R( _ee(M,m1,_mRho), 0., 0., __ppA1) );
     169           0 :                         EvtVector4R _pA1( _ee(M,_mA1,m1), 0., 0., -__ppA1);
     170           0 :                         EvtVector4R _pRho(_ee(_mA1, _mRho, m4), 0, 0, __ppRho);
     171           0 :                         _pRho.applyBoostTo(_pA1);
     172           0 :                         EvtVector4R _p4( _ee(_mA1, m4, _mRho), 0, 0, -__ppRho); _p4.applyBoostTo(_pA1);
     173           0 :                         p->getDaug(3)->setP4(_p4);
     174           0 :                         EvtVector4R _p2( _ee(_mRho, m2, m3), 0, 0, __ppPi); _p2.applyBoostTo(_pRho);
     175           0 :                         p->getDaug(1)->setP4(_p2);
     176           0 :                         EvtVector4R _p3( _ee(_mRho, m2, m3), 0, 0, -__ppPi); _p2.applyBoostTo(_pRho);
     177           0 :                         p->getDaug(2)->setP4(_p3);
     178           0 :                 };
     179             : 
     180             : 
     181           0 :                 _amp2.init(p->getId(),getNDaug(),getDaugs());
     182             : 
     183           0 :                 decay(p);       
     184             : 
     185           0 :                 EvtSpinDensity rho=_amp2.getSpinDensity();
     186             : 
     187           0 :                 double prob=p->getSpinDensityForward().normalizedProb(rho);
     188             : 
     189           0 :                 if(prob>0) setProbMax(0.9*prob);
     190             : 
     191             : 
     192           0 :         };
     193           0 : }
     194             : 
     195             : void EvtBcToNPi::decay( EvtParticle *root_particle ){
     196           0 :         ++nCall;
     197             : 
     198           0 :         EvtIdSet thePis("pi+","pi-","pi0");
     199           0 :         EvtComplex I=EvtComplex(0.0, 1.0);
     200             : 
     201             : 
     202           0 :         root_particle->initializePhaseSpace(getNDaug(),getDaugs());
     203             : 
     204           0 :         EvtVector4R
     205           0 :                 p(root_particle->mass(), 0., 0., 0.),                  // Bc momentum
     206           0 :                 k=root_particle->getDaug(0)->getP4(),                        // J/psi momenta
     207           0 :                 Q=p-k;
     208             :         
     209           0 :         double Q2=Q.mass2();
     210             : 
     211             : 
     212             : // check pi-mesons and calculate hadronic current
     213           0 :         EvtVector4C hardCur;
     214             :         bool foundHadCurr=false;
     215             : 
     216           0 :         if ( getNDaug() == 2 ) // Bc -> psi pi+
     217             :         {
     218           0 :                 hardCur=Q;
     219             :                 foundHadCurr=true;
     220           0 :         }
     221           0 :         else if ( getNDaug() == 3 ) // Bc -> psi pi+ pi0
     222             :         {
     223           0 :                 EvtVector4R p1,p2;
     224           0 :                 p1=root_particle->getDaug(1)->getP4(),     // pi+ momenta
     225           0 :                 p2=root_particle->getDaug(2)->getP4(),    // pi0 momentum
     226           0 :                 hardCur=Fpi(p1,p2)*(p1-p2);
     227             :                 foundHadCurr=true;
     228           0 :         }
     229           0 :         else if( getNDaug()==4 ) // Bc -> psi pi+ pi pi
     230             :         {
     231             :                 int diffPi(0),samePi1(0),samePi2(0);
     232           0 :                 if ( getDaug( 1) == getDaug( 2) ) {diffPi= 3; samePi1= 1; samePi2= 2;}
     233           0 :                 if ( getDaug( 1) == getDaug( 3) ) {diffPi= 2; samePi1= 1; samePi2= 3;}
     234           0 :                 if ( getDaug( 2) == getDaug( 3) ) {diffPi= 1; samePi1= 2; samePi2= 3;}
     235             : 
     236           0 :                 EvtVector4R p1=root_particle->getDaug(samePi1)->getP4();
     237           0 :                 EvtVector4R p2=root_particle->getDaug(samePi2)->getP4();
     238           0 :                 EvtVector4R p3=root_particle->getDaug(diffPi)->getP4();
     239             :                 
     240           0 :                 EvtComplex BA1;
     241           0 :                 double GA1=_gammaA1*pi3G(Q2,samePi1)/pi3G(_mA1*_mA1,samePi1);
     242           0 :                 EvtComplex denBA1(_mA1*_mA1 - Q.mass2(),-1.*_mA1*GA1);
     243           0 :                 BA1 = _mA1*_mA1 / denBA1;
     244             : 
     245           0 :                 hardCur = BA1*( (p1-p3) - (Q*(Q*(p1-p3))/Q2)*Fpi(p2,p3) +
     246           0 :                                 (p2-p3) - (Q*(Q*(p2-p3))/Q2)*Fpi(p1,p3) ); 
     247             :                 foundHadCurr=true;
     248           0 :         }
     249             : 
     250           0 :         if ( !foundHadCurr ) {
     251           0 :                 report(Severity::Error,"EvtGen") << "Have not yet implemented this final state in BCNPI model" << endl;
     252           0 :                 report(Severity::Error,"EvtGen") << "Ndaug="<<getNDaug() << endl;
     253             :                 int id;
     254           0 :                 for ( id=0; id<(getNDaug()-1); id++ ) 
     255           0 :                 report(Severity::Error,"EvtGen") << "Daug " << id << " "<<EvtPDL::name(getDaug(id)).c_str() << endl;
     256           0 :                 ::abort();
     257             :         };
     258             : 
     259           0 :         EvtTensor4C H;
     260             :         double amp2=0.;
     261           0 :         if( root_particle->getDaug(0)->getSpinType() == EvtSpinType::VECTOR) {
     262           0 :                 double FA0=FA0_N*exp(FA0_c1*Q2 + FA0_c2*Q2*Q2);
     263           0 :                 double FAp=FAp_N*exp(FAp_c1*Q2 + FAp_c2*Q2*Q2);
     264           0 :                 double FAm=FAm_N*exp(FAm_c1*Q2 + FAm_c2*Q2*Q2);
     265           0 :                 double FV= FV_N* exp( FV_c1*Q2 + FV_c2*Q2*Q2 );
     266           0 :                 H=-FA0*EvtTensor4C::g()
     267           0 :                         -FAp*EvtGenFunctions::directProd(p,p+k)
     268           0 :                         +FAm*EvtGenFunctions::directProd(p,p-k)
     269           0 :                         +2*I*FV*dual(EvtGenFunctions::directProd(p,k));
     270           0 :                 EvtVector4C  Heps=H.cont2(hardCur);
     271             : 
     272           0 :                 for(int i=0; i<4; i++) {
     273           0 :                         EvtVector4C  eps=root_particle->getDaug(0)->epsParent(i).conj(); // psi-meson polarization vector
     274           0 :                         EvtComplex amp=eps*Heps;
     275           0 :                         vertex(i,amp);
     276           0 :                         amp2+=pow( abs(amp),2);
     277           0 :                 }
     278           0 :         }
     279           0 :         else if( root_particle->getDaug(0)->getSpinType() == EvtSpinType::SCALAR) {
     280           0 :                 double Fp=Fp_N*exp(Fp_c1*Q2 + Fp_c2*Q2*Q2);
     281           0 :                 double Fm=Fm_N*exp(Fm_c1*Q2 + Fm_c2*Q2*Q2);
     282           0 :                 EvtVector4C H=Fp*(p+k)+Fm*(p-k);
     283           0 :                 EvtComplex amp=H*hardCur;
     284           0 :                 vertex(amp);
     285           0 :                 amp2+=pow( abs(amp),2);
     286           0 :         };
     287           0 :         if(amp2>maxAmp2) maxAmp2=amp2;
     288             : 
     289             :   return ;
     290           0 : }
     291             : 
     292             : EvtComplex EvtBcToNPi::Fpi( EvtVector4R q1, EvtVector4R q2) {
     293           0 :         double m1=q1.mass();
     294           0 :         double m2=q2.mass();
     295             :         
     296           0 :         EvtVector4R Q = q1 + q2;
     297           0 :         double mQ2= Q*Q;
     298             :         
     299             :         // momenta in the rho->pipi decay
     300           0 :         double dRho= _mRho*_mRho - m1*m1 - m2*m2;
     301           0 :         double pPiRho = (1.0/_mRho)*sqrt((dRho*dRho)/4.0 - m1*m1*m2*m2);
     302             :         
     303           0 :         double dRhopr= _mRhopr*_mRhopr - m1*m1 - m2*m2;
     304           0 :         double pPiRhopr = (1.0/_mRhopr)*sqrt((dRhopr*dRhopr)/4.0 - m1*m1*m2*m2);
     305             :         
     306           0 :         double dQ= mQ2 - m1*m1 - m2*m2;
     307           0 :         double pPiQ = (1.0/sqrt(mQ2))*sqrt((dQ*dQ)/4.0 - m1*m1*m2*m2);
     308             :         
     309             :         
     310           0 :         double gammaRho = _gammaRho*_mRho/sqrt(mQ2)*pow((pPiQ/pPiRho),3);
     311           0 :         EvtComplex BRhoDem(_mRho*_mRho - mQ2,-1.0*_mRho*gammaRho);
     312           0 :         EvtComplex BRho= _mRho*_mRho / BRhoDem;
     313             :         
     314           0 :         double gammaRhopr = _gammaRhopr*_mRhopr/sqrt(mQ2)*pow((pPiQ/pPiRhopr),3);
     315           0 :         EvtComplex BRhoprDem(_mRhopr*_mRhopr - mQ2,-1.0*_mRho*gammaRhopr);
     316           0 :         EvtComplex BRhopr= _mRhopr*_mRhopr / BRhoprDem;
     317             :         
     318           0 :         return (BRho + _beta*BRhopr)/(1+_beta);
     319           0 : }
     320             : 
     321             : double EvtBcToNPi::pi3G(double m2,int dupD) {
     322           0 :         double mPi= EvtPDL::getMeanMass(getDaug(dupD));
     323           0 :         if ( m2 > (_mRho+mPi) ) {
     324           0 :         return m2*(1.623 + 10.38/m2 - 9.32/(m2*m2) + 0.65/(m2*m2*m2));
     325             :         }
     326             :         else {
     327           0 :         double t1=m2-9.0*mPi*mPi;
     328           0 :         return 4.1*pow(t1,3.0)*(1.0 - 3.3*t1+5.8*t1*t1);
     329             :         }
     330           0 : }
     331             : 
     332             : void EvtBcToNPi::printAuthorInfo() {
     333             :   
     334           0 :   report(Severity::Info,"EvtGen")<<"Defining EvtBcToNPi model: Bc -> V + npi and Bc -> P + npi decays\n"
     335           0 :                        <<"from A.V. Berezhnoy, A.K. Likhoded, A.V. Luchinsky: "
     336           0 :                        <<"Phys.Rev.D 82, 014012 (2010) and arXiV:1104.0808."<<endl;
     337             : 
     338           0 : }
     339             : 

Generated by: LCOV version 1.11