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

          Line data    Source code
       1             : //--------------------------------------------------------------------------
       2             : //
       3             : // Environment:
       4             : //      This software is part of the EvtGen package developed jointly
       5             : //      for the BaBar and CLEO collaborations.  If you use all or part
       6             : //      of it, please give an appropriate acknowledgement.
       7             : //
       8             : // Copyright Information: See EvtGen/COPYRIGHT
       9             : //      Copyright (C) 2004      Cornell
      10             : //
      11             : // Module: EvtVPHOtoVISR.cc
      12             : //
      13             : // Description: Routine to decay vpho -> vector ISR photon
      14             : //
      15             : // Modification history:
      16             : //
      17             : //    Ryd       March 20, 2004       Module created
      18             : //
      19             : //------------------------------------------------------------------------
      20             : // 
      21             : #include <stdlib.h>
      22             : #include "EvtGenBase/EvtParticle.hh"
      23             : #include "EvtGenBase/EvtGenKine.hh"
      24             : #include "EvtGenBase/EvtPDL.hh"
      25             : #include "EvtGenBase/EvtVector4C.hh"
      26             : #include "EvtGenBase/EvtVector4R.hh"
      27             : #include "EvtGenBase/EvtReport.hh"
      28             : #include "EvtGenBase/EvtRandom.hh"
      29             : #include "EvtGenModels/EvtVPHOtoVISR.hh"
      30             : #include <string>
      31             : 
      32           0 : EvtVPHOtoVISR::~EvtVPHOtoVISR() {}
      33             : 
      34             : std::string EvtVPHOtoVISR::getName(){
      35             : 
      36           0 :   return "VPHOTOVISR"; 
      37             :     
      38             : }
      39             : 
      40             : 
      41             : EvtDecayBase* EvtVPHOtoVISR::clone(){
      42             : 
      43           0 :   return new EvtVPHOtoVISR;
      44             : 
      45           0 : }
      46             : 
      47             : void EvtVPHOtoVISR::init(){
      48             : 
      49             :   // check that there are 0 or 2 arguments
      50           0 :   checkNArg(0,2);
      51             : 
      52             :   // check that there are 2 daughters
      53           0 :   checkNDaug(2);
      54             : 
      55             :   // check the parent and daughter spins
      56           0 :   checkSpinParent(EvtSpinType::VECTOR);
      57           0 :   checkSpinDaughter(0,EvtSpinType::VECTOR);
      58           0 :   checkSpinDaughter(1,EvtSpinType::PHOTON);
      59           0 : }
      60             : 
      61             : void EvtVPHOtoVISR::initProbMax() {
      62             : 
      63             :   //setProbMax(100000.0);
      64             : 
      65           0 : }      
      66             : 
      67             : void EvtVPHOtoVISR::decay( EvtParticle *p){
      68             : 
      69             :   //take photon along z-axis, either forward or backward.
      70             :   //Implement this as generating the photon momentum along 
      71             :   //the z-axis uniformly 
      72             : 
      73           0 :   double w=p->mass();
      74           0 :   double s=w*w;
      75             : 
      76           0 :   double L=2.0*log(w/0.000511);
      77             :   double alpha=1/137.0;
      78           0 :   double beta=(L-1)*2.0*alpha/EvtConst::pi;
      79             : 
      80             :   //This uses the fact that there is a daughter of the 
      81             :   //psi(3770)
      82           0 :   assert(p->getDaug(0)->getDaug(0)!=0);
      83           0 :   double md=EvtPDL::getMeanMass(p->getDaug(0)->getDaug(0)->getId());
      84             : 
      85           0 :   static double mD0=EvtPDL::getMeanMass(EvtPDL::getId("D0"));
      86           0 :   static double mDp=EvtPDL::getMeanMass(EvtPDL::getId("D+"));
      87             : 
      88           0 :   double pgmax=(s-4.0*md*md)/(2.0*w);
      89             : 
      90           0 :   assert(pgmax>0.0);
      91             : 
      92           0 :   double pgz=0.99*pgmax*exp(log(EvtRandom::Flat(1.0))/beta);
      93             : 
      94           0 :   if (EvtRandom::Flat(1.0)<0.5) pgz=-pgz;
      95             : 
      96           0 :   double k=fabs(pgz);
      97             : 
      98           0 :   EvtVector4R p4g(k,0.0,0.0,pgz);
      99             : 
     100           0 :   EvtVector4R p4res=p->getP4Restframe()-p4g;
     101             : 
     102           0 :   double mres=p4res.mass();
     103             : 
     104           0 :   double ed=mres/2.0;
     105             : 
     106           0 :   assert(ed>md);
     107             : 
     108           0 :   double pd=sqrt(ed*ed-md*md);
     109             : 
     110             : 
     111             :   //std::cout << "k, mres, w, md, ed, pd:"<<k<<" "<<mres<<" "<<w<<" "<<md<<" "<<ed<<" "<<pd<<std::endl;
     112             : 
     113           0 :   p->getDaug(0)->init(getDaug(0),p4res);
     114           0 :   p->getDaug(1)->init(getDaug(1),p4g);
     115             : 
     116             : 
     117           0 :   double sigma=beta*pow(2/w,beta)*(1+alpha*(1.5*L-2.0+EvtConst::pi*EvtConst::pi/3.0)/EvtConst::pi);
     118             : 
     119           0 :   double m=EvtPDL::getMeanMass(p->getDaug(0)->getId());
     120           0 :   double Gamma=EvtPDL::getWidth(p->getDaug(0)->getId());
     121             : 
     122             :   //mres is the energy of the psi(3770)
     123             : 
     124             :   double p0=0.0;
     125           0 :   if (ed>mD0) p0=sqrt(ed*ed-mD0*mD0);
     126             :   double pp=0.0;
     127           0 :   if (ed>mDp) pp=sqrt(ed*ed-mDp*mDp);
     128             : 
     129           0 :   double p0norm=sqrt(0.25*m*m-mD0*mD0);
     130           0 :   double ppnorm=sqrt(0.25*m*m-mDp*mDp);
     131             : 
     132             :   double r0=12.7;
     133             :   double rp=12.7;
     134             : 
     135           0 :   if (getNArg()==2){
     136           0 :     r0=getArg(0);
     137           0 :     rp=getArg(1);
     138           0 :   }
     139             : 
     140           0 :   double GammaTot=Gamma*(pp*pp*pp/(1+pp*pp*rp*rp)+p0*p0*p0/(1+p0*p0*r0*r0))/
     141           0 :     (ppnorm*ppnorm*ppnorm/(1+ppnorm*ppnorm*rp*rp)+
     142           0 :      p0norm*p0norm*p0norm/(1+p0norm*p0norm*r0*r0));
     143             :   
     144             : 
     145           0 :   sigma*=pd*pd*pd/((mres-m)*(mres-m)+0.25*GammaTot*GammaTot);
     146             : 
     147           0 :   assert(sigma>0.0);
     148             : 
     149           0 :   static double sigmax=sigma;
     150             : 
     151           0 :   if (sigma>sigmax){
     152           0 :     sigmax=sigma;
     153           0 :   }
     154             : 
     155             : 
     156             : 
     157             :   static int count=0;
     158             : 
     159           0 :   count++;
     160             : 
     161             :   //if (count%10000==0){
     162             :   //  std::cout << "sigma :"<<sigma<<std::endl;
     163             :   //  std::cout << "sigmax:"<<sigmax<<std::endl;
     164             :   //}
     165             : 
     166           0 :   double norm=sqrt(sigma);
     167             : 
     168           0 :   vertex(0,0,0,norm*p->eps(0)*p->epsParent(0).conj());
     169           0 :   vertex(1,0,0,norm*p->eps(1)*p->epsParent(0).conj());
     170           0 :   vertex(2,0,0,norm*p->eps(2)*p->epsParent(0).conj());
     171             : 
     172           0 :   vertex(0,1,0,norm*p->eps(0)*p->epsParent(1).conj());
     173           0 :   vertex(1,1,0,norm*p->eps(1)*p->epsParent(1).conj());
     174           0 :   vertex(2,1,0,norm*p->eps(2)*p->epsParent(1).conj());
     175             : 
     176           0 :   vertex(0,2,0,norm*p->eps(0)*p->epsParent(2).conj());
     177           0 :   vertex(1,2,0,norm*p->eps(1)*p->epsParent(2).conj());
     178           0 :   vertex(2,2,0,norm*p->eps(2)*p->epsParent(2).conj());
     179             : 
     180           0 :   vertex(0,0,1,norm*p->eps(0)*p->epsParent(0).conj());
     181           0 :   vertex(1,0,1,norm*p->eps(1)*p->epsParent(0).conj());
     182           0 :   vertex(2,0,1,norm*p->eps(2)*p->epsParent(0).conj());
     183             : 
     184           0 :   vertex(0,1,1,norm*p->eps(0)*p->epsParent(1).conj());
     185           0 :   vertex(1,1,1,norm*p->eps(1)*p->epsParent(1).conj());
     186           0 :   vertex(2,1,1,norm*p->eps(2)*p->epsParent(1).conj());
     187             : 
     188           0 :   vertex(0,2,1,norm*p->eps(0)*p->epsParent(2).conj());
     189           0 :   vertex(1,2,1,norm*p->eps(1)*p->epsParent(2).conj());
     190           0 :   vertex(2,2,1,norm*p->eps(2)*p->epsParent(2).conj());
     191             : 
     192             :   return;
     193           0 : }
     194             : 

Generated by: LCOV version 1.11