00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <Sequence/HKA.hpp>
00025 #include <cmath>
00026 #ifdef HAVE_IEEEFP_H
00027 #include <ieeefp.h>
00028 #endif
00029
00030 using std::isfinite;
00031
00032 namespace
00033 {
00034 double Cn(unsigned n)
00035 {
00036 double cn=0.;
00037 for(unsigned i=1;i<n;++i)
00038 {
00039 cn += 1./double(i);
00040 }
00041 return cn;
00042 }
00043
00044 double Cnsq(unsigned n)
00045 {
00046 double cn=0.;
00047 for(unsigned i=1;i<n;++i)
00048 {
00049 cn += 1./double(i*i);
00050 }
00051 return cn;
00052 }
00053 }
00054
00055 namespace Sequence
00056 {
00057 HKAdata::HKAdata() : SA(0),SB(0),D(0),nA(0),nB(0)
00061 {
00062 }
00063
00064 HKAdata::HKAdata(const HKAdata & d) :
00065 SA(d.SA),SB(d.SB),D(d.D),nA(d.nA),nB(d.nB)
00069 {
00070 }
00071 HKAdata::HKAdata(unsigned sa,unsigned sb,double d,
00072 unsigned na,unsigned nb) :
00073 SA(sa),SB(sb),D(d),nA(na),nB(nb)
00082 {
00083 }
00084
00085 HKAresults::HKAresults (const std::vector<double> & _thetas,
00086 const std::vector< chisq_tuple > & _chisquareds,
00087 const double & _fhat, const double & _That,
00088 const double & _xsq,
00089 const double & _xsqA,
00090 const double & _xsqB)
00091 : thetas(_thetas),chisquareds(_chisquareds),fhat(_fhat),
00092 That(_That),xsq(_xsq),xsqA(_xsqA),xsqB(_xsqB)
00102 {
00103 }
00104
00105 HKAresults calcHKA ( const std::vector< HKAdata > & data )
00114 {
00115 double sumD=0.;
00116
00117 double sumTheta = 0.;
00118 double fhat = 0.;
00119 double cna,cnb=0.;
00120 double that=0.;
00121 unsigned n=0,sumSb=0;
00122 for(unsigned i=0;i<data.size();++i)
00123 {
00124 sumD += data[i].D;
00125 cna = Cn(data[i].nA);
00126 cnb += (data[i].nB > 1) ? Cn(data[i].nB) : 0.;
00127 sumTheta += double(data[i].SA)/cna;
00128 sumSb += data[i].SB;
00129 n += (data[i].nB>1)?1:0;
00130
00131
00132
00133 }
00134 cnb /= n;
00135 fhat = ( isfinite(cnb) && cnb > 0. ) ? double(sumSb)/(sumTheta*cnb) : 1.;
00136 that = double(sumD)/sumTheta - (0.5*(1.+fhat));
00137 std::vector<double> thetas(data.size());
00138 std::vector< HKAresults::chisq_tuple > chisquareds;
00139 double xsq = 0.,xsqA = 0., xsqB = 0;
00140
00141
00142
00143 double ESA,VSA,ESB,VSB,ED,VD;
00144 for(unsigned i=0;i<data.size();++i)
00145 {
00146 cna = Cn(data[i].nA);
00147 cnb = Cn(data[i].nB);
00148 thetas[i] = double(double(data[i].SA) +
00149 double(data[i].SB)+
00150 data[i].D)/
00151 (that+0.5*(1+fhat)+cna+fhat*cnb);
00152
00153 ESA = thetas[i]*cna;
00154 VSA = ESA + thetas[i]*thetas[i]*Cnsq(data[i].nA);
00155 ESB = fhat*thetas[i]*cnb;
00156 VSB = ESB + fhat*fhat*thetas[i]*thetas[i]*Cnsq(data[i].nB);
00157 ED = thetas[i]*(that + 0.5*(1.+fhat));
00158 VD = ED + (thetas[i]*0.5*(1.+fhat))*(thetas[i]*0.5*(1.+fhat));
00159 double xsq_t=0.,xsqA_t=0.,xsqB_t=0.,xsqpoly=0.;
00160 const double spA = (double(data[i].SA)-ESA)*(double(data[i].SA)-ESA)/VSA;
00161 xsq_t += spA;
00162 xsqA_t += spA;
00163 xsqpoly = xsqA_t;
00164 const double sp2 = (double(data[i].SB)-ESB)*(double(data[i].SB)-ESB)/VSB;
00165 if (isfinite(sp2))
00166 {
00167 xsq_t += sp2;
00168 xsqpoly += sp2;
00169 }
00170 xsqB_t += sp2;
00171 const double d = (data[i].D-ED)*(data[i].D-ED)/VD;
00172 xsq_t += d;
00173 chisquareds.push_back( boost::make_tuple(xsqpoly,d,xsqA_t,xsqB_t) );
00174 xsq += xsq_t;
00175 xsqA_t += d;
00176 xsqB_t += d;
00177 xsqA += xsqA_t;
00178 xsqB += xsqB_t;
00179 }
00180 return HKAresults( thetas,chisquareds,fhat,that,xsq,xsqA,xsqB );
00181 }
00182 }