RooGounarisSakurai.cc

Go to the documentation of this file.
00001 /*****************************************************************************
00002 * Package: RooRarFit
00003  * File: $Id: RooGounarisSakurai.cc,v 1.2 2011/06/16 13:18:48 fwilson Exp $
00004  * Authors: A Bevan, Katherine George 
00005  *                                                                           
00006  * Gounaris-Sakurai (GS) distribution is a model of the P-wave \pi\pi         
00007  * scattering amplitude                                                      
00008  * (G.J.Gounaris and J.J.Sakurai. Phys. Rev. Lett, 21:244 (1968))             
00009  *
00010  *****************************************************************************/
00011 
00012 // -- CLASS DESCRIPTION [PDF] --
00013 // This is an implentation of the Gounaris-Sakurai pi-pi scattering
00014 // function for RooRarFit
00016 //
00017 // BEGIN_HTML
00018 // This is an implentation of the Gounaris-Sakurai pi-pi scattering
00019 // function for RooRarFit
00020 // END_HTML
00021 //
00022 
00023 #include "Riostream.h"
00024 
00025 #include "RooRarFit/RooGounarisSakurai.hh"
00026 #include "RooFitCore/RooAbsReal.hh"
00027 #include "RooFitCore/RooRealVar.hh"
00028 
00029 ClassImp(RooGounarisSakurai)
00030 
00031 //---------------------------------------------------------------------------
00032 RooGounarisSakurai::RooGounarisSakurai(const char *name, const char *title,
00033                          RooAbsReal& _x, RooAbsReal& _mean,
00034                          RooAbsReal& _width, RooAbsReal& _spin, RooAbsReal& _radius,
00035                          RooAbsReal& _mass_a, RooAbsReal& _mass_b) :
00036   RooAbsPdf(name,title),
00037   x("x","Dependent",this,_x),
00038   mean("mean","Mean",this,_mean),
00039   width("width","Width",this,_width),
00040   spin("spin","Spin",this,_spin),
00041   radius("radius","Form Factor Radius",this,_radius),
00042   mass_a("mass_a","Mass of daughter A",this,_mass_a),
00043   mass_b("mass_b","Mass of daughter B",this,_mass_b)
00044 {
00045 }
00046 
00047 //---------------------------------------------------------------------------
00048 RooGounarisSakurai::RooGounarisSakurai(const RooGounarisSakurai& other,
00049                                        const char* name) : 
00050   RooAbsPdf(other,name), 
00051   x("x",this,other.x), 
00052   mean("mean",this,other.mean),
00053   width("width",this,other.width),
00054   spin("spin", this, other.spin), 
00055   radius("radius", this, other.radius), 
00056   mass_a("mass_a", this, other.mass_a), 
00057   mass_b("mass_b", this, other.mass_b) 
00058 {
00059 }
00060 
00061 //---------------------------------------------------------------------------
00062 Double_t RooGounarisSakurai::evaluate() const
00063 {
00064   Double_t arg= x*x - mean*mean - fFunction(x);  
00065   Double_t gammaf = mean*Gamma();
00066 
00067   //  return (1 + d * width/mean)*(1 + d * width/mean) / (arg*arg + gammaf*gammaf);
00068   // the 1-dGamma_0/m_0 term is constant and can be ignored.  RF will deal with the
00069   // normalisation properly.
00070   if(x < (mass_a + mass_b)) return 0;
00071   else return x*x / (arg*arg + gammaf*gammaf);
00072 }
00073 
00074 //---------------------------------------------------------------------------
00075 Double_t RooGounarisSakurai::Gamma() const
00076 {
00077   /*
00078    * This is the mass (and momentum) dependent width 
00079    * For the GS model, there is no Blatt-Weisskopf FF ratio 
00080    */
00081   Double_t kx = KFunction((double)x);
00082   Double_t km = KFunction(mean);
00083   Double_t rk = 0.0;
00084   if(km!=0){
00085     rk = (kx/km);
00086     if(spin ==1){
00087       rk = rk*rk*rk;
00088     }
00089     if(spin ==2){
00090       rk = rk*rk*rk*rk*rk;
00091     }    
00092   }
00093   return width*(mean/x)*rk;
00094 }
00095 
00096 //---------------------------------------------------------------------------
00097 Double_t RooGounarisSakurai::FFunction(Double_t X) const
00098 {
00099   /*
00100    * These are the Blatt-Weisskopf form factors.  The argument 
00101    *  X = sqrt(s)
00102    */
00103   if(spin==0) return 1.0;
00104   if(spin==1) return 1.0/(1 + X*X);
00105   if(spin==2) return 1.0/(9 + 3*X*X + X*X*X*X); 
00106   return 1.0;
00107 }
00108 
00109 //---------------------------------------------------------------------------
00110 Double_t RooGounarisSakurai::dhds() const
00111 {
00112   if(mean == 0.0) return 0.0;
00113   Double_t k = KFunction(mean);
00114   if(k == 0.0) return 0.0;
00115   Double_t h = hFunction(mean);
00116   Double_t m0_2 = mean*mean;
00117   return h*( 1.0/(8.0*k*k) - 1.0/(2.0*m0_2)) + 1.0/(2*M_PI*m0_2);
00118 }
00119 
00120 //---------------------------------------------------------------------------
00121 Double_t RooGounarisSakurai::hFunction(Double_t X) const
00122 {
00123   /*
00124    * Argument X = sqrt(s)
00125    */
00126   if(X == 0.0) return 0.0;
00127   // assume that the pion mass is the average of the two pion masses used.
00128   Double_t mpi  = 0.5*(mass_a + mass_b); 
00129   Double_t k = KFunction(X);
00130 
00131   Double_t theLog =  log( (X + 2.0*k) / (2.0* mpi) );
00132   return (2.0*k/(M_PI*X))*theLog;
00133 }
00134 
00135 //---------------------------------------------------------------------------
00136 Double_t RooGounarisSakurai::fFunction(Double_t X) const
00137 {
00138   /*
00139    * Argument is X = sqrt(s)
00140    */
00141   Double_t grad = dhds();
00142   Double_t h_s  = hFunction(X);
00143   Double_t h_m0 = hFunction(mean);
00144   Double_t k_s  = KFunction(X);
00145   Double_t k_m0 = KFunction(mean);
00146   if(k_m0 == 0.0) return 0.0;
00147   Double_t k2_m0 = k_m0*k_m0;
00148   Double_t k3_m0 = k2_m0*k_m0;
00149   Double_t mean2 = mean*mean;
00150 
00151   Double_t func = k_s*k_s*(h_s - h_m0) + (mean2 - X*X)*k2_m0*grad;
00152   return func * width*mean2 / k3_m0;
00153 }
00154 
00155 //---------------------------------------------------------------------------
00156 Double_t RooGounarisSakurai::KFunction(Double_t X) const
00157 {
00158   /*
00159    * This is momentum calculation
00160    * Argument X = sqrt(s)
00161    */
00162   if(X==0) return 0;
00163   Double_t massone = sqrt(1 - (mass_a + mass_b)*(mass_a + mass_b)/(X*X));
00164   Double_t masstwo = sqrt(1 - (mass_a - mass_b)*(mass_a - mass_b)/(X*X));
00165   return X/2.0 * massone * masstwo;
00166 }
00167 
00168 //---------------------------------------------------------------------------
00169 Double_t RooGounarisSakurai::dFunction() const
00170 {
00171   // assume that the pion mass is the average of the two pion masses used.
00172   Double_t mpi  = 0.5*(mass_a + mass_b); 
00173   Double_t mpi2 = mpi*mpi; 
00174   Double_t kfunc = KFunction(mean); 
00175   Double_t kfunc2 = kfunc*kfunc;
00176 
00177   Double_t logCoeff = (3*mpi2)/(M_PI*kfunc2);
00178   Double_t one = (mean + 2*kfunc)/(2*mpi);
00179   Double_t two = mean/(2*M_PI*kfunc);
00180   Double_t three = (mpi2*mean)/(M_PI*kfunc2*kfunc);
00181 
00182   return (logCoeff * log(one) + two - three);
00183 }
00184 
00185 
00186 
00187 

Generated on 30 Oct 2013 for RooRarFit by  doxygen 1.4.7