00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00016
00017
00018
00019
00020
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
00068
00069
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
00079
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
00101
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
00125
00126 if(X == 0.0) return 0.0;
00127
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
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
00160
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
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