00001 #ifndef __INCLUDE_CFCalc_CC__ 00002 #define __INCLUDE_CFCalc_CC__ 00003 00004 #include "cfcalc.h" 00005 using namespace std; 00006 00007 double CFCalc::GetChiSquared(C3DArray *CFexp,C3DArray *Error, C3DArray *CFtheory){ 00008 if(!ArrayCalc::CompareArrayParameters(CFexp,Error)) exit(1); 00009 if(!ArrayCalc::CompareArrayParameters(CFexp,CFtheory)) exit(1); 00010 double chisquared=0.0,numer,denom; 00011 int ix,iy,iz,isx,isy,isz,nsx,nsy,nsz,nxmax,nymax,nzmax; 00012 int ndof=0; 00013 nsx=nsy=nsz=2; 00014 if(CFexp->GetXSYM()) nsx=1; 00015 if(CFexp->GetYSYM()) nsy=1; 00016 if(CFexp->GetZSYM()) nsz=1; 00017 nxmax=CFexp->GetNXMAX(); 00018 nymax=CFexp->GetNYMAX(); 00019 nzmax=CFexp->GetNZMAX(); 00020 for(isx=0;isx<nsx;isx++){ 00021 for(ix=0;ix<nxmax;ix++){ 00022 for(isy=0;isy<nsy;isy++){ 00023 for(iy=0;iy<nymax;iy++){ 00024 for(isz=0;isz<nsz;isz++){ 00025 for(iz=0;iz<nzmax;iz++){ 00026 numer=CFexp->GetElement(isx,ix,isy,iy,isz,iz) 00027 -CFtheory->GetElement(isx,ix,isy,iy,isz,iz); 00028 numer=numer*numer; 00029 denom=Error->GetElement(isx,ix,isy,iy,isz,iz); 00030 if(denom<-1.0E-8) printf("CFCalc::GetChiSquared : \nSuspiciously small or negative error = %g, isx=%d,ix=%d, isy=%d,iy=%d, isz=%d,iz=%d\n", 00031 denom,isx,ix,isy,iy,isz,iz); 00032 denom=denom*denom; 00033 chisquared+=numer/denom; 00034 ndof+=1; 00035 } 00036 } 00037 } 00038 } 00039 } 00040 } 00041 printf("chi^2/Ndof=%g\n",chisquared/double(ndof)); 00042 return chisquared; 00043 } 00044 00045 double CFCalc::GetChiSquared(int lx,int ly,int lz,CCHArray *CFexp, CCHArray *Error,CCHArray *CFtheory){ 00046 int ir,nrmax; 00047 double chisquared=0.0,numer,denom; 00048 nrmax=CFexp->GetNRADIAL(); 00049 for(ir=0;ir<nrmax;ir++){ 00050 denom=Error->GetElement(lx,ly,lz,ir); 00051 if(denom<1.0E-8) printf("CFCalc::GetChiSquared : \nSuspiciously small or negative error = %g, l=(%d,%d,%d)d\n",denom,lx,ly,lz); 00052 numer=CFexp->GetElement(lx,ly,lz,ir) 00053 -CFtheory->GetElement(lx,ly,lz,ir); 00054 chisquared+=numer*numer/(denom*denom); 00055 } 00056 printf("chi^2/Ndof=%g\n",chisquared/double(nrmax)); 00057 return chisquared; 00058 } 00059 00060 double CFCalc::GetChiSquared(CCHArray *cexp,CCHArray *error,CCHArray *ctheory){ 00061 int L,Lmax,lx,ly,lz,lxprime,lyprime,lzprime,lxprime0,lyprime0,iq,nqmax; 00062 double lfact,lprimefact; 00063 int dlx,dly,dlz; 00064 dlx=dly=dlz=1; 00065 if(cexp->GetXSYM()) dlx=2; 00066 if(cexp->GetYSYM()) dly=2; 00067 if(cexp->GetZSYM()) dlz=2; 00068 double overlap,Fvalue,Gvalue,denom,prefact,q; 00069 nqmax=error->GetNRADIAL(); 00070 Lmax=ctheory->GetLMAX(); 00071 CCHArray *F=new CCHArray(Lmax,nqmax,cexp->GetRADSTEP(),cexp->GetXSYM(),cexp->GetYSYM(),cexp->GetZSYM()); 00072 ArrayCalc::SubtractArrays(ctheory,cexp,F); 00073 overlap=0.0; 00074 for(iq=0;iq<nqmax;iq++){ 00075 denom=error->GetElement(0,0,0,iq); 00076 q=F->GetRADSTEP()*(iq+0.5); 00077 prefact=4.0*PI*q*q*F->GetRADSTEP()/denom; 00078 for(L=0;L<=Lmax;L++){ 00079 for(lx=0;lx<=L;lx+=dlx){ 00080 for(ly=0;ly<=L-lx;ly+=dly){ 00081 lz=L-lx-ly; 00082 if(lz%dlz==0){ 00083 lfact=F->chcalc->Factorial(L) 00084 /(F->chcalc->Factorial(lx)*F->chcalc->Factorial(ly)*F->chcalc->Factorial(lz)); 00085 Fvalue=F->GetElement(lx,ly,lz,iq); 00086 lxprime0=0; 00087 if(lx%2==1) lxprime0=1; 00088 lyprime0=0; 00089 if(ly%2==1) lyprime0=1; 00090 for(lxprime=lxprime0;lxprime<=L;lxprime+=2){ 00091 for(lyprime=lyprime0;lyprime<=L-lxprime;lyprime+=2){ 00092 lzprime=L-lxprime-lyprime; 00093 lprimefact=F->chcalc->Factorial(L) 00094 /(F->chcalc->Factorial(lxprime)*F->chcalc->Factorial(lyprime)*F->chcalc->Factorial(lzprime)); 00095 Gvalue=F->GetElement(lxprime,lyprime,lzprime,iq); 00096 overlap+=prefact*lfact*lprimefact*Fvalue*Gvalue*F->chcalc->GetOverlap(lx,ly,lz,lxprime,lyprime,lzprime); 00097 } 00098 } 00099 } 00100 } 00101 } 00102 } 00103 } 00104 printf("chi^2=%g\n",overlap); 00105 delete(F); 00106 return overlap; 00107 } 00108 00109 #endif