/* Fit d'une gaussienne par une methode de chi2 */ #include #include #include #include #include #include #include "sopnamsp.h" #include "srandgen.h" #include "minuitadapt.h" // Ne pas changer NPAR #define NPAR 7 const int DIMX = 25; const int DIMY = 25; const double HAUT=10000.; const double X0=0., Y0=0.; const double SX=5., SY=5., RHO=0.05; const double FOND=100.; // vol x0 y0 sx sy rho fond const bool FIX[NPAR]={false,false,false,false,false,false,false}; const double ERR=5.; const double ERRMIN=ERR*sqrt(FOND); const double nSX=7., nSY=5.; const bool USERGRAD=false; const bool DOIMPROVE=true; const bool DOMINOS=true; const bool DOCONT=true; const bool DOSCAN=true; #define VARAND (drandpm1()) //#define VARAND 1. #define MAXCALL 99999 void fcn(int_4 *,double *,double *,double *,int_4 *,double futils(double *)); double futils(double *x) {return 0.;} double Gauss2D(double x,double y,double *param); double dGauss2D(double x,double y,double *param,double *dparam); double X[DIMX], Y[DIMY], Z[DIMX][DIMY], EZ[DIMX][DIMY]; int_4 IFLAG[10]={0,0,0,0,0,0,0,0,0,0}; /*==========================================================================*/ int main(int nargv, char *argv[]) { /* initialisation */ if(DIMX*DIMY<=NPAR) exit(-1); int nran=0; if(nargv>1) nran=atoi(argv[1]); for(int i=0;i1.) ? ERR*sqrt(fabs(f)): ERR; EZ[i][j] = (ef>ERRMIN)? ef: ERRMIN; Z[i][j] += EZ[i][j]*NorRand(); } } /*********************** minuit minimisation ***********************/ printf("\n\n"); MinuitAdapt MMM(fcn,futils); /* initialise */ MMM.SetTitle("Minuit fit Gaussienne 2D+Fond"); MMM.Clear(); MMM.SetRandom(1000000); /* set print and warning level, precision etc... (-1,0,1,2,3) */ MMM.PrintLevel(1); MMM.SetWidthPage(120); MMM.SetWarnings(true); MMM.SetErrorDef(1.); MMM.SetEpsMachine(1.e-13); MMM.SetStrategy(1); if(USERGRAD) MMM.SetGradient(1); else MMM.SetGradient(-1); /* set parameters */ MMM.DefineParameter(1,"Vol",vol,fabs(vol)/50.); MMM.DefineParameter(2,"X0",X0,SX/5.); MMM.DefineParameter(3,"Y0",Y0,SY/5.); MMM.DefineParameter(4,"Sx",SX,SX/5.,0.01*SX,10.*SX); MMM.DefineParameter(5,"Sy",SY,SY/5.,0.01*SY,10.*SY); MMM.DefineParameter(6,"Rho",RHO,0.0001,-1.,1.); double x=(FOND!=0.)? fabs(FOND)/10.: 0.01; MMM.DefineParameter(7,"Fond",FOND,x); /* set parameters */ x = (FIX[0])? vol: vol+VARAND*vol/5.; MMM.SetParameter(1,x); x = (FIX[1])? X0: X0+VARAND*SX; MMM.SetParameter(2,x); x=(FIX[2])? Y0: Y0+VARAND*SY; MMM.SetParameter(3,x); x=(FIX[3])? SX: SX+VARAND*SX/2.; MMM.SetParameter(4,x); x=(FIX[4])? SY: SY+VARAND*SY/2.; MMM.SetParameter(5,x); x=(FIX[5])? RHO: 0.; MMM.SetParameter(6,x); x=(FIX[6])? FOND: FOND+VARAND*FOND/3.; MMM.SetParameter(7,x); /* fix parameters */ for(int i=0;i parameter %d \"%s\" = %g %g (%g,%g) int var=%d\n" ,i+1,dum.c_str(),par[i],epar[i],b1,b2,ivarbl); printf(" e+=%g e-=%g eparab=%g globcc=%g\n" ,eplus,eminus,eparab,globcc); } fflush(stdout); cout<<"haut(sig)="< xcont,ycont; int_4 ncontok = MMM.GetContour(i,j,20,xcont,ycont); cout<<"Contour "<