00001 #ifndef __INCLUDE_SFIT_MINUIT_CC__
00002 #define __INCLUDE_SFIT_MINUIT_CC__
00003
00004 #include "sfit_minuit.h"
00005 CMNPars *CCF2S_Minuit::pars=NULL;
00006 double *CCF2S_Minuit::xval=NULL;
00007 double *CCF2S_Minuit::grad=NULL;
00008 C3DArray *CCF2S_Minuit::cexp3D=NULL;
00009 C3DArray *CCF2S_Minuit::cerror3D=NULL;
00010 C3DArray *CCF2S_Minuit::ctheory3D=NULL;
00011 CCHArray *CCF2S_Minuit::source=NULL;
00012 CCHArray *CCF2S_Minuit::ctheory=NULL;
00013 CCHArray *CCF2S_Minuit::cexp=NULL;
00014 CCHArray *CCF2S_Minuit::cerror=NULL;
00015 CKernel *CCF2S_Minuit::kernel=NULL;
00016 CSourceCalc *CCF2S_Minuit::sourcecalc=NULL;
00017 int CCF2S_Minuit::Ncalls=0;
00018 int CCF2S_Minuit::npars=0;
00019 int CCF2S_Minuit::dummy=0;
00020 int CCF2S_Minuit::ndim=0;
00021 int CCF2S_Minuit::lx=0;
00022 int CCF2S_Minuit::ly=0;
00023 int CCF2S_Minuit::lz=0;
00024
00025 void CMNPars::Set(string nameset,double valueset,double errorset,
00026 double minset,double maxset){
00027 strcpy(name,nameset.c_str());
00028 value=valueset;
00029 error=errorset;
00030 min=minset;
00031 max=maxset;
00032 }
00033
00034 void CCF2S_Minuit::CalcChiSquare(int npar,double* grad,double* fcnval,
00035 double* xval,int iflag,void* futil){
00036 if(ndim==3) CalcChiSquare3D(npar,grad,fcnval,xval,iflag,futil);
00037 if(ndim==1) CalcChiSquare1D(npar,grad,fcnval,xval,iflag,futil);
00038 }
00039
00040 void CCF2S_Minuit::ViewPars(){
00041 int ipar,ivarble;
00042 char name[30];
00043 double value,error,bnd1,bnd2;
00044 printf("ipar name value error bnd1 bnd2 IV(0 for fixed)\n");
00045 for(ipar=0;ipar<npars;ipar++){
00046 MNPOUT(ipar+1,name,value,error,bnd1,bnd2,ivarble);
00047 printf("%2d : %12s %11.4e %11.4e %11.4e %11.4e %d\n",
00048 ipar,name,value,error,bnd1,bnd2,ivarble);
00049 }
00050 }
00051
00052 void CCF2S_Minuit::Mnstat(){
00053 double Fmin,delFestimate,ErrDef=1.0;
00054 int npars_variable,npars_total,istat;
00055 char message[40];
00056 MNSTAT(Fmin,delFestimate,ErrDef,npars_variable,npars_total,istat);
00057 printf("Min Val. thus far=%g, Estimate of delF = %g\n",Fmin,delFestimate);
00058 printf("npars_variable=%d, npars_total=%d\n",npars_variable,npars_total);
00059 if(istat==0) sprintf(message,"Not calculated at all\n");
00060 else if(istat==1)
00061 sprintf(message,"Diagonal approximation only, not accurate\n");
00062 else if(istat==2)
00063 sprintf(message,"Full matrix, but forced positive definite\n");
00064 else if(istat==3)
00065 sprintf(message,"Full accurate covariance matrix, as good as it gets\n");
00066 printf("Convergence status = %d (%s)\n",message);
00067 }
00068
00069 void CCF2S_Minuit::SetPar(int ipar,char *name,double value,double error,double min,double max){
00070 MNPARM(ipar+1,name,value,error,min,max,dummy);
00071 }
00072
00073 void CCF2S_Minuit::FixPar(int ipar){
00074 char command[MAXLINE];
00075 int ierr=0;
00076
00077
00078 MNFIXP(ipar+1,ierr);
00079 }
00080
00081 void CCF2S_Minuit::FreePar(int ipar){
00082 char command[MAXLINE];
00083 int ierr;
00084
00085
00086 MNFREE(ipar+1);
00087 }
00088
00089 void CCF2S_Minuit::InitMinuit(){
00090 int i;
00091 MNINIT(5,6,7);
00092 for (i=0;i<npars;i++)
00093 SetPar(i,pars[i].name,pars[i].value,pars[i].error,
00094 pars[i].min,pars[i].max);
00095 printf("Minuit Initialized\n");
00096 }
00097
00098 void CCF2S_Minuit::Scan(int ipar,int npts,double start,double end){
00099 char command[MAXLINE];
00100 snprintf(command,MAXLINE,"SCA %d %d %g %g\n",ipar,npts,start,end);
00101 MNCOMD(CalcChiSquare,command,dummy,0);
00102 }
00103
00104 void CCF2S_Minuit::Migrad(){
00105 char command[MAXLINE];
00106 snprintf (command, MAXLINE, "MIGRAD\0");
00107 MNCOMD(CalcChiSquare,command,dummy,0);
00108 }
00109 void CCF2S_Minuit::Migrad(int maxcalls){
00110 char command[MAXLINE];
00111 snprintf (command, MAXLINE, "MIGRAD %d\0",maxcalls);
00112 MNCOMD(CalcChiSquare,command,dummy,0);
00113 }
00114 void CCF2S_Minuit::Migrad(int maxcalls,double tolerance){
00115 char command[MAXLINE];
00116 snprintf (command, MAXLINE, "MIGRAD %d %g\0",maxcalls,tolerance);
00117 MNCOMD(CalcChiSquare,command,dummy,0);
00118 }
00119
00120 void CCF2S_Minuit::Minimize(){
00121 char command[MAXLINE];
00122 snprintf (command, MAXLINE, "MINI\0");
00123 MNCOMD(CalcChiSquare,command,dummy,0);
00124 }
00125
00126 void CCF2S_Minuit::Minimize(int maxcalls){
00127 char command[MAXLINE];
00128 snprintf (command, MAXLINE, "MINI %d\0",maxcalls);
00129 MNCOMD(CalcChiSquare,command,dummy,0);
00130 }
00131
00132 void CCF2S_Minuit::Minimize(int maxcalls,double tolerance){
00133 char command[MAXLINE];
00134 snprintf (command, MAXLINE, "MINI %d %g\0",maxcalls,tolerance);
00135 MNCOMD(CalcChiSquare,command,dummy,0);
00136 }
00137
00138 void CCF2S_Minuit::Simplex(){
00139 char command[MAXLINE];
00140 snprintf (command, MAXLINE, "SIM\0");
00141 MNCOMD(CalcChiSquare,command,dummy,0);
00142 }
00143
00144 void CCF2S_Minuit::Simplex(int maxcalls){
00145 char command[MAXLINE];
00146 snprintf (command, MAXLINE, "SIM %d\0",maxcalls);
00147 MNCOMD(CalcChiSquare,command,dummy,0);
00148 }
00149
00150 void CCF2S_Minuit::Simplex(int maxcalls,double tolerance){
00151 char command[MAXLINE];
00152 snprintf (command, MAXLINE, "SIM %d %g\0",maxcalls,tolerance);
00153 MNCOMD(CalcChiSquare,command,dummy,0);
00154 }
00155
00156 void CCF2S_Minuit::Minos(){
00157 char command[MAXLINE];
00158 snprintf (command, MAXLINE, "MINOS\0");
00159 MNCOMD(CalcChiSquare,command,dummy,0);
00160 }
00161
00162 void CCF2S_Minuit::Minos(int ipar){
00163 char command[MAXLINE];
00164 snprintf (command, MAXLINE, "MINOS 100 %d\0",ipar+1);
00165 MNCOMD(CalcChiSquare,command,dummy,0);
00166 }
00167
00168 void CCF2S_Minuit::StratLevel(int level){
00169 char command[MAXLINE];
00170 if(level!=0 && level!=1 && level!=2){
00171 printf("Attempting to set strategy level to %d - only 0,1,2 allowed\n",
00172 level);
00173 printf("Will set level to 1\n");
00174 level=1;
00175 }
00176 snprintf (command, MAXLINE, "SET STR %d\0",level);
00177 MNCOMD(CalcChiSquare,command,dummy,0);
00178
00179 }
00180
00181 void CCF2S_Minuit::SetError(double error){
00182 char command[MAXLINE];
00183 snprintf(command,MAXLINE,"SET ERR %g\n",error);
00184 MNCOMD(CalcChiSquare,command,dummy,0);
00185 }
00186
00187 void CCF2S_Minuit::ErrorMatrix(){
00188 char command[MAXLINE];
00189 snprintf(command,MAXLINE,"SHO COV\n");
00190 MNCOMD(CalcChiSquare,command,dummy,0);
00191 }
00192
00193 void CCF2S_Minuit::Contour(int iparx,int ipary,int npts,
00194 double *xcontour,double *ycontour){
00195 int nfound_contour;
00196 MNCONT(CalcChiSquare,iparx+1,ipary+1,npts,xcontour[0],ycontour[0],
00197 nfound_contour,0);
00198 }
00199
00200 CCF2S_Minuit::CCF2S_Minuit(){
00201 }
00202
00203
00204 void fcn(int npar, double* grad, double* fcnval,
00205 double* xval,int iflag, void* futil){
00206 printf("why am I here?\n");
00207 exit(1);
00208 }
00209
00210 void CCF2S_Minuit::CalcChiSquare3D(int npar, double* grad, double* fcnval,
00211 double* xval,int iflag, void* futil){
00212 int ipar;
00213 Ncalls+=1;
00214 printf("In CalcChiSquare3D, xval[] = ");
00215 for(ipar=0;ipar<npars;ipar++) printf("%g,",xval[ipar]);
00216 printf("\n");
00217 for(ipar=0;ipar<npars;ipar++){
00218 parameter::set(sourcecalc->spars,pars[ipar].name,xval[ipar]);
00219 }
00220 sourcecalc->CalcS(source);
00221 S2CF::s2c(source,kernel,ctheory);
00222 ArrayCalc::Calc3DArrayFromAExpArray(ctheory,ctheory3D);
00223 *fcnval=CFCalc::GetChiSquared(cexp3D,cerror3D,ctheory3D);
00224 for(ipar=0;ipar<npars;ipar++) pars[ipar].value=xval[ipar];
00225 printf("fcnval=%g (Ncalls=%d)\n",*fcnval,Ncalls);
00226 }
00227
00228 void CCF2S_Minuit::CalcChiSquare1D(int npar, double* grad, double* fcnval,
00229 double* xval,int iflag, void* futil){
00230 int ipar;
00231
00232 Ncalls+=1;
00233 printf("In CalcChiSquare1D, xval[] = ");
00234 for(ipar=0;ipar<npars;ipar++) printf("%g,",xval[ipar]);
00235 printf("\n");
00236 for(ipar=0;ipar<npars;ipar++){
00237 parameter::set(sourcecalc->spars,pars[ipar].name,xval[ipar]);
00238 }
00239 sourcecalc->CalcS(lx,ly,lz,source);
00240 S2CF::s2c(source,kernel,ctheory);
00241 *fcnval=CFCalc::GetChiSquared(lx,ly,lz,cexp,cerror,ctheory);
00242 for(ipar=0;ipar<npars;ipar++) pars[ipar].value=xval[ipar];
00243 printf("fcnval=%g (Ncalls=%d)\n",*fcnval,Ncalls);
00244 }
00245
00246 #endif
00247