LCOV - code coverage report
Current view: top level - TEvtGen/EvtGen/EvtGenModels - EvtVPHOtoVISRHi.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 162 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 -> (DDx) + ISR photon from 3.9 to 4.3 GeV, using CLEO-c data (Brian Lang)
      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/EvtVPHOtoVISRHi.hh"
      30             : #include <string>
      31             : 
      32             : using std::endl;
      33             : 
      34           0 : EvtVPHOtoVISRHi::~EvtVPHOtoVISRHi() {}
      35             : 
      36             : std::string EvtVPHOtoVISRHi::getName(){
      37             : 
      38           0 :   return "VPHOTOVISRHI"; 
      39             :     
      40             : }
      41             : 
      42             : 
      43             : EvtDecayBase* EvtVPHOtoVISRHi::clone(){
      44             : 
      45           0 :   return new EvtVPHOtoVISRHi;
      46             : 
      47           0 : }
      48             : 
      49             : void EvtVPHOtoVISRHi::init(){
      50             : 
      51             :   // check that there are 0 or 1 arguments
      52           0 :   checkNArg(0,1);
      53             : 
      54             :   // check that there are 2 daughters
      55           0 :   checkNDaug(2);
      56             : 
      57             :   // check the parent and daughter spins
      58           0 :   checkSpinParent(EvtSpinType::VECTOR);
      59           0 :   checkSpinDaughter(0,EvtSpinType::VECTOR);
      60           0 :   checkSpinDaughter(1,EvtSpinType::PHOTON);
      61           0 : }
      62             : 
      63             : void EvtVPHOtoVISRHi::initProbMax() {
      64             : 
      65           0 :    setProbMax(20.0);
      66             : 
      67           0 : }      
      68             : 
      69             : void EvtVPHOtoVISRHi::decay( EvtParticle *p){
      70             :   //take photon along z-axis, either forward or backward.
      71             :   //Implement this as generating the photon momentum along 
      72             :   //the z-axis uniformly 
      73             :    double power=1;
      74           0 :    if (getNArg()==1) power=getArg(0);
      75             :    // define particle names
      76           0 :   static EvtId D0=EvtPDL::getId("D0");
      77           0 :   static EvtId D0B=EvtPDL::getId("anti-D0");
      78           0 :   static EvtId DP=EvtPDL::getId("D+");
      79           0 :   static EvtId DM=EvtPDL::getId("D-");
      80           0 :   static EvtId DSM=EvtPDL::getId("D_s-");
      81           0 :   static EvtId DSP=EvtPDL::getId("D_s+");
      82           0 :   static EvtId DSMS=EvtPDL::getId("D_s*-");
      83           0 :   static EvtId DSPS=EvtPDL::getId("D_s*+");
      84           0 :   static EvtId D0S=EvtPDL::getId("D*0");
      85           0 :   static EvtId D0BS=EvtPDL::getId("anti-D*0");
      86           0 :   static EvtId DPS=EvtPDL::getId("D*+");
      87           0 :   static EvtId DMS=EvtPDL::getId("D*-");
      88             :   // setup some parameters
      89           0 :   double w=p->mass();
      90           0 :   double s=w*w;
      91           0 :   double L=2.0*log(w/0.000511);
      92             :   double alpha=1/137.0;
      93           0 :   double beta=(L-1)*2.0*alpha/EvtConst::pi;
      94             :   // make sure only 2 or 3 body are present
      95           0 :   assert (p->getDaug(0)->getNDaug() == 2 || p->getDaug(0)->getNDaug() == 3);
      96             : 
      97             :   // determine minimum rest mass of parent
      98           0 :   double md1 = EvtPDL::getMeanMass(p->getDaug(0)->getDaug(0)->getId());
      99           0 :   double md2 = EvtPDL::getMeanMass(p->getDaug(0)->getDaug(1)->getId());
     100           0 :   double minResMass = md1+md2;
     101           0 :   if (p->getDaug(0)->getNDaug() == 3) {
     102           0 :      double md3 = EvtPDL::getMeanMass(p->getDaug(0)->getDaug(2)->getId());
     103           0 :      minResMass = minResMass + md3;
     104           0 :   }
     105             :   
     106             :   // calculate the maximum energy of the ISR photon
     107           0 :   double pgmax=(s-minResMass*minResMass)/(2.0*w);
     108           0 :   double pgz=0.99*pgmax*exp(log(EvtRandom::Flat(1.0))/(beta*power));
     109           0 :   if (EvtRandom::Flat(1.0)<0.5) pgz=-pgz;
     110             :   
     111           0 :   double k=fabs(pgz);
     112             :   // print of ISR energy 
     113             :   // std::cout << "Energy ISR :"<< k <<std::endl;
     114           0 :   EvtVector4R p4g(k,0.0,0.0,pgz);
     115             : 
     116           0 :   EvtVector4R p4res=p->getP4Restframe()-p4g;
     117             : 
     118           0 :   double mres=p4res.mass();
     119             : 
     120             :   // set masses
     121           0 :   p->getDaug(0)->init(getDaug(0),p4res);
     122           0 :   p->getDaug(1)->init(getDaug(1),p4g);
     123             : 
     124             :   
     125             :   // determine XS - langbw
     126             :   // very crude way of determining XS just a simple straight line Approx.
     127             :   // this was determined by eye.
     128             :   // lots of cout statements to make plots to check that things are working as expected
     129             :   double sigma=9.0;
     130           0 :   if (mres<=3.9) sigma = 0.00001;
     131             : 
     132             :   bool sigmacomputed(false);
     133             : 
     134             :   // DETERMINE XS FOR D*D*
     135           0 :   if (p->getDaug(0)->getNDaug() == 2 
     136           0 :       &&((p->getDaug(0)->getDaug(0)->getId()==D0S 
     137           0 :           && p->getDaug(0)->getDaug(1)->getId()==D0BS)
     138           0 :          ||(p->getDaug(0)->getDaug(0)->getId()==DPS 
     139           0 :             && p->getDaug(0)->getDaug(1)->getId()==DMS))){
     140           0 :      if(mres>4.18) {
     141           0 :         sigma*=5./9.*(1.-1.*sqrt((4.18-mres)*(4.18-mres))/(4.3-4.18));
     142           0 :      }  
     143           0 :      else if(mres>4.07 && mres<=4.18) {
     144           0 :      sigma*=5./9.;
     145           0 :      }  
     146           0 :      else if (mres<=4.07&&mres>4.03)
     147             :      {
     148           0 :         sigma*=(5./9. - 1.5/9.*sqrt((4.07-mres)*(4.07-mres))/(4.07-4.03)); 
     149           0 :      }
     150           0 :      else if (mres<=4.03&& mres>=4.013)
     151             :      {
     152           0 :         sigma*=(3.5/9. - 3.5/9.*sqrt((4.03-mres)*(4.03-mres))/(4.03-4.013)); 
     153           0 :      }
     154             :      else{     
     155             :         sigma=0.00001; 
     156             :      }
     157             :      sigmacomputed = true;
     158             : //     std::cout << "DSDSXS "<<sigma<< " " <<  mres<<std::endl;
     159           0 :   }
     160             :   
     161             :   // DETERMINE XS FOR D*D
     162           0 :   if(p->getDaug(0)->getNDaug() == 2 && ((p->getDaug(0)->getDaug(0)->getId()==D0S 
     163           0 :                                          && p->getDaug(0)->getDaug(1)->getId()==D0B)
     164           0 :                                         ||(p->getDaug(0)->getDaug(0)->getId()==DPS 
     165           0 :                                            && p->getDaug(0)->getDaug(1)->getId()==DM) 
     166           0 :                                         ||(p->getDaug(0)->getDaug(0)->getId()==D0BS
     167           0 :                                            && p->getDaug(0)->getDaug(1)->getId()==D0)
     168           0 :                                         ||(p->getDaug(0)->getDaug(0)->getId()==DMS 
     169           0 :                                            && p->getDaug(0)->getDaug(1)->getId()==DP)) )
     170             :   {
     171           0 :      if(mres>=4.2){
     172           0 :         sigma*=1.5/9.;
     173           0 :      }
     174           0 :      else if( mres>4.06 && mres<4.2){
     175           0 :         sigma*=((1.5/9.+2.5/9.*sqrt((4.2-mres)*(4.2-mres))/(4.2-4.06)));
     176           0 :      }  
     177           0 :      else if(mres>=4.015 && mres<4.06){
     178           0 :         sigma*=((4./9.+3./9.*sqrt((4.06-mres)*(4.06-mres))/(4.06-4.015)));
     179           0 :      }  
     180           0 :      else if (mres<4.015 && mres>=3.9){
     181           0 :         sigma*=((7./9.-7/9.*sqrt((4.015-mres)*(4.015-mres))/(4.015-3.9))); 
     182           0 :      } 
     183             :      else { 
     184             :         sigma = 0.00001; 
     185             :      }
     186             :      sigmacomputed = true;
     187             : //     std::cout << "DSDXS "<<sigma<< " " <<  mres<<std::endl;
     188           0 :   }
     189             :      
     190             :   // DETERMINE XS FOR Ds*Ds*
     191           0 :   if (((p->getDaug(0)->getDaug(0)->getId()==DSPS && p->getDaug(0)->getDaug(1)->getId()==DSMS)))
     192             :   {
     193           0 :      if(mres>(2.112+2.112)){
     194             :       sigma=0.4; 
     195           0 :      }
     196             :      else  {
     197             : //      sigma=0.4; 
     198             : //      sigma = 0 surely below Ds*Ds* threshold? - ponyisi
     199             :         sigma=0.00001;
     200             :      }
     201             :      sigmacomputed = true;
     202             : //     std::cout << "DsSDsSXS "<<sigma<< " " <<  mres<<std::endl;
     203           0 :   }
     204             : 
     205             :   // DETERMINE XS FOR Ds*Ds
     206           0 :   if (p->getDaug(0)->getNDaug() == 2 && ((p->getDaug(0)->getDaug(0)->getId()==DSPS 
     207           0 :                                           && p->getDaug(0)->getDaug(1)->getId()==DSM)
     208           0 :                                          || (p->getDaug(0)->getDaug(0)->getId()==DSMS
     209           0 :                                              && p->getDaug(0)->getDaug(1)->getId()==DSP)))
     210             :   {
     211           0 :      if(mres>4.26){
     212             :         sigma=0.05; 
     213           0 :      } 
     214           0 :      else if (mres>4.18 && mres<=4.26){
     215           0 :         sigma*=1./9.*(0.05+0.95*sqrt((4.26-mres)*(4.26-mres))/(4.26-4.18));
     216           0 :      } 
     217           0 :      else if (mres>4.16 && mres<=4.18){
     218           0 :         sigma*=1/9.; 
     219           0 :      } 
     220           0 :      else if (mres<=4.16 && mres>4.08){
     221           0 :         sigma*=1/9.*(1-sqrt((4.16-mres)*(4.16-mres))/(4.16-4.08)); 
     222           0 :      }
     223           0 :      else if (mres<=(4.08)){
     224             :         sigma=0.00001; 
     225           0 :      }
     226             :      sigmacomputed = true;
     227             : //     std::cout << "DsSDsXS "<<sigma<< " " <<  mres<<std::endl;
     228           0 :   }
     229             : 
     230             :   // DETERMINE XS FOR DD
     231           0 :   if (p->getDaug(0)->getNDaug() == 2 && ((p->getDaug(0)->getDaug(0)->getId()==D0 
     232           0 :                                           && p->getDaug(0)->getDaug(1)->getId()==D0B)
     233           0 :                                          ||(p->getDaug(0)->getDaug(0)->getId()==DP 
     234           0 :                                             && p->getDaug(0)->getDaug(1)->getId()==DM))){ 
     235           0 :      sigma*=0.4/9.;  
     236             :      sigmacomputed = true;
     237             : //     std::cout << "DDXS "<<sigma<< " " <<  mres<<std::endl;
     238           0 :   } 
     239             :   
     240             :   // DETERMINE XS FOR DsDs
     241           0 :   if (p->getDaug(0)->getNDaug() == 2 && ((p->getDaug(0)->getDaug(0)->getId()==DSP && p->getDaug(0)->getDaug(1)->getId()==DSM))){
     242           0 :      sigma*=0.2/9.;
     243             :      sigmacomputed = true;
     244             : //     std::cout << "DsDsXS "<<sigma<< " " <<  mres<<std::endl;
     245           0 :   } 
     246             : 
     247             :   // DETERMINE XS FOR MULTIBODY
     248           0 :   if (p->getDaug(0)->getNDaug() == 3){
     249           0 :      if(mres>4.03){
     250           0 :         sigma*=0.5/9.;
     251           0 :      }
     252             :      else {
     253             :         sigma=0.00001; 
     254             :      }
     255             :      sigmacomputed = true;
     256             : //     std::cout << "DSDpiXS "<<sigma<< " " <<  mres<<std::endl;
     257           0 :   }
     258             : 
     259           0 :   if (! sigmacomputed) {
     260           0 :     report(Severity::Error,"EvtGen") << "VPHOTOVISRHI: This model requires daughters to be listed in a particular order." << endl
     261           0 :                            << "The following are acceptable:" << endl
     262           0 :                            << "D0 anti-D0" << endl
     263           0 :                            << "D+ D-" << endl
     264           0 :                            << "D*0 anti-D0" << endl
     265           0 :                            << "anti-D*0 D0" << endl
     266           0 :                            << "D*+ D-" << endl
     267           0 :                            << "D*- D+" << endl
     268           0 :                            << "D*0 anti-D*0" << endl
     269           0 :                            << "D*+ D*-" << endl
     270           0 :                            << "D_s+ D_s-" << endl
     271           0 :                            << "D_s*+ D_s-" << endl
     272           0 :                            << "D_s*- D_s+" << endl
     273           0 :                            << "D_s*+ D_s*-" << endl
     274           0 :                            << "(D* D pi can be in any order)" << endl
     275           0 :                            << "Aborting..." << endl;
     276           0 :     assert(0);
     277             :   }
     278             : 
     279           0 :   if(sigma<0) sigma = 0.0;
     280             : 
     281             : //   static double sigmax=sigma;
     282             : //   if (sigma>sigmax){
     283             : //      sigmax=sigma;
     284             : //   }
     285             :   
     286             :   static int count=0;
     287             :   
     288           0 :   count++;
     289             :   
     290             : //   if (count%10000==0){
     291             : //      std::cout << "sigma :"<<sigma<<std::endl;
     292             : //      std::cout << "sigmax:"<<sigmax<<std::endl;
     293             : //   }
     294             :   
     295           0 :   double norm=sqrt(sigma);
     296             :   
     297             : //  EvtParticle* d=p->getDaug(0);
     298             :   
     299             :   
     300           0 :   vertex(0,0,0,norm*p->eps(0)*p->epsParent(0).conj());
     301           0 :   vertex(1,0,0,norm*p->eps(1)*p->epsParent(0).conj());
     302           0 :   vertex(2,0,0,norm*p->eps(2)*p->epsParent(0).conj());
     303             :   
     304           0 :   vertex(0,1,0,norm*p->eps(0)*p->epsParent(1).conj());
     305           0 :   vertex(1,1,0,norm*p->eps(1)*p->epsParent(1).conj());
     306           0 :   vertex(2,1,0,norm*p->eps(2)*p->epsParent(1).conj());
     307             :   
     308           0 :   vertex(0,2,0,norm*p->eps(0)*p->epsParent(2).conj());
     309           0 :   vertex(1,2,0,norm*p->eps(1)*p->epsParent(2).conj());
     310           0 :   vertex(2,2,0,norm*p->eps(2)*p->epsParent(2).conj());
     311             :   
     312           0 :   vertex(0,0,1,norm*p->eps(0)*p->epsParent(0).conj());
     313           0 :   vertex(1,0,1,norm*p->eps(1)*p->epsParent(0).conj());
     314           0 :   vertex(2,0,1,norm*p->eps(2)*p->epsParent(0).conj());
     315             :   
     316           0 :   vertex(0,1,1,norm*p->eps(0)*p->epsParent(1).conj());
     317           0 :   vertex(1,1,1,norm*p->eps(1)*p->epsParent(1).conj());
     318           0 :   vertex(2,1,1,norm*p->eps(2)*p->epsParent(1).conj());
     319             :   
     320           0 :   vertex(0,2,1,norm*p->eps(0)*p->epsParent(2).conj());
     321           0 :   vertex(1,2,1,norm*p->eps(1)*p->epsParent(2).conj());
     322           0 :   vertex(2,2,1,norm*p->eps(2)*p->epsParent(2).conj());
     323             :   
     324             :   return;
     325           0 : }

Generated by: LCOV version 1.11