Changeset 385 in Sophya for trunk/SophyaPI/PIext/piafitting.cc


Ignore:
Timestamp:
Aug 13, 1999, 12:51:54 AM (26 years ago)
Author:
ercodmgr
Message:

user function for fit cmv 13/8/99

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaPI/PIext/piafitting.cc

    r384 r385  
    5656  bool ReFillGData;
    5757  int saveI1,saveI2, saveJ1, saveJ2;
     58  double ErrValue;
    5859};
    5960
     
    103104//|      : M   : fit Moffat+fond (expos=p6) (volume) 2D
    104105//|      : Mi  : fit Moffat+fond integree (expos=p6) (volume) 2D
     106//|      : Autre : fonction definie par l'utilisateur (cf commentaires ci apres)
    105107//|
    106108//|----- INIT PARAMETRES ET ETAT DU FIT -----
     
    139141//|          Pour gauss+poly 1D, xc est le centre de la gaussienne.
    140142//|2D    yaa.b et y : idem "xaa.b et x" mais pour y
     143//|
     144////////////////////////////////////////////////////////////////////////
     145//| --------------- Def des fcts de fit par l'utilisateur ---------------
     146//| Pour definir une fonction parametree utilisateur:
     147//| Un exemple de fichier contenant des fonctions a fitter: PIext/userfitfunex.c
     148//| > crfitfil nom_fichier nom_fonction nvar npar
     149//|     pour creer un squelette de fichier C contenant la fonction a fitter
     150//|            nom_fichier : nom du fichier ou est le code de la fonction
     151//|                          c'est un fichier C de nom blabla.c
     152//|            nom_fonction : nom de la fonction ex: gauss2
     153//|            nvar : nombre de variables x[] (1D=1, 2D=2, etc...)
     154//|            npar : nombre de parametre p[]
     155//|   - La fonction est donc F(x[];p[]), soit par ex:
     156//|            double gauss2(double const* x,double const* p)
     157//|   - L'utilisateur a la possibilite de donner egalement la fonction
     158//|     retournant les derivees de la fonction par rapport aux parametres
     159//|            double gauss2_der(double const* x,double const* p,double* dp)
     160//|     ou dp[i] = dF(x[];p[])/dp[i]
     161//|     Par convention, cette fonction a le meme nom suivi de "_der"
     162//| > crfitfun nom_fichier nom_fonction nvar npar
     163//|     Permet de compiler le fichier "nom_fichier" et de linker
     164//|     la fonction "nom_fonction"
     165//|   - Un meme fichier peut contenir plusieurs fonctions a fitter
     166//|
    141167////////////////////////////////////////////////////////////////////////
    142168
     
    144170PIAFitter::PIAFitter(PIACmd *piac, PIStdImgApp* app)
    145171: mApp(app), FWindFit(NULL)
    146 , mNObj(""), mObj(NULL), mFunc(NULL), mFName(""), mGData(NULL)
     172, mNObj(""), mObj(NULL), mGData(NULL)
    147173, mNPar(0), mNVar(0),  mNBinX(0), mNBinY(0), mNData(0)
    148174, mPar(1), mStep(1), mMin(1), mMax(1), mFix(1)
     
    150176, mFit(NULL)
    151177, mV(NULL), mH(NULL), mM(NULL), mH2(NULL), mIm(NULL), mG(NULL)
     178, mFunction(NULL), mFName(""), mFunc(NULL)
    152179, mDlUFunc(NULL), mNameFitFunc(""), mFitFunc(NULL), mFitFuncDer(NULL)
    153180, mUFNVar(0), mUFNPar(0)
     
    180207
    181208kw = "crfitfun";
    182 usage = "Creation de user function ";
     209usage = "Creation et link de function utilisateur pour le fit";
    183210usage += "\n Usage: crfitfun file func nvar npar";
    184211piac->RegisterCommand(kw,usage,this,"Fitting");
     212
     213kw = "crfitfil";
     214usage = "Creation de fichier C pour function utilisateur du fit";
     215usage += "\n Usage: crfitfil file func nvar npar";
     216piac->RegisterCommand(kw,usage,this,"Fitting");
    185217}
    186218
     
    188220PIAFitter::~PIAFitter()
    189221{
    190 if(mFit != NULL) {delete mFit; mFit=NULL;}
    191 if(mFunc != NULL) {delete mFunc; mFunc=NULL;}
    192 if(mGData != NULL) {delete mGData; mGData=NULL;}
    193 if(FWindFit != NULL) {delete FWindFit; FWindFit=NULL;}
    194 if (mDlUFunc != NULL) delete mDlUFunc;
     222if(mFit != NULL)      {delete mFit;      mFit=NULL;}
     223if(mFunction != NULL) {delete mFunction; mFunction=NULL;}
     224if(mFunc != NULL)     {delete mFunc;     mFunc=NULL;}
     225if(mGData != NULL)    {delete mGData;    mGData=NULL;}
     226if(FWindFit != NULL)  {delete FWindFit;  FWindFit=NULL;}
     227if (mDlUFunc != NULL) {delete mDlUFunc;  mDlUFunc=NULL;}
    195228}
    196229
     
    402435    <<" Cent="<<mOpt.polcx<<","<<mOpt.polcy<<","<<mOpt.xc<<"+x"<<","<<mOpt.yc<<"+y"
    403436    <<" TypE="<<mOpt.err_e<<","<<mOpt.err_E
    404     <<" StpX2="<<mOpt.stc2<<" Nstep="<<mOpt.nstep<<" Init.LFit="<<mOpt.fromlastfit
     437    <<" StpX2="<<mOpt.stc2<<" Nstep="<<mOpt.nstep<<endl
     438    <<" Init.LFit="<<mOpt.fromlastfit
    405439    <<" lp,lpg="<<mOpt.lp<<","<<mOpt.lpg<<endl;
    406440return;
     
    464498// ATTENTION: cette methode a besoin que les donnees soient lues
    465499{
    466 if(func.length()<=0) {
    467   cout<<"PIAFitter::DecodeFunction Donnez un nom de fonction a fitter."<<endl;
    468   return;
    469 }
    470 if(mFunc!=NULL) {delete mFunc; mFunc=NULL;}
    471 
     500if(func.length()<=0)
     501  {cout<<"PIAFitter::DecodeFunction Donnez un nom de fonction a fitter."<<endl;
     502   return;}
     503if(mFunction!=NULL) {delete mFunction; mFunction=NULL;}
     504if(mFunc!=NULL)     {delete mFunc;     mFunc=NULL;}
    472505mNPar=0;
    473 mFName = func;
    474 
    475 if(func[0]=='p' && mNVar==1) { //polynome
    476   int degre = 0;
    477   if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
     506
     507if(func == mNameFitFunc) { // Fonction utilisateur
     508  mFunc = new GeneralFunc(mUFNVar,mUFNPar,mFitFunc,mFitFuncDer);
     509  mNPar = mUFNPar;
     510} else if(func[0]=='p' && mNVar==1) { //polynome
     511  int degre=0; if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
    478512  cout<<"Fit polynome 1D de degre "<<degre<<endl;
    479513  Polyn1D* myf = new Polyn1D(degre,mOpt.xc);
    480   mFunc = myf; mNPar = mFunc->NPar();
     514  mFunction = myf; mNPar = mFunction->NPar(); mFName = func;
    481515
    482516} else if(func[0]=='e' && mNVar==1) { //exponentielle
    483   int degre =-1;
    484   if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
     517  int degre=-1; if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
    485518  cout<<"Fit d'exponentielle+polynome 1D de degre "<<degre<<endl;
    486519  Exp1DPol* myf;
    487520  if(degre>=0) myf = new Exp1DPol((unsigned int)degre,mOpt.xc);
    488521       else    myf = new Exp1DPol(mOpt.xc);
    489   mFunc = myf; mNPar = mFunc->NPar();
     522  mFunction = myf; mNPar = mFunction->NPar(); mFName = func;
    490523
    491524} else if(func[0]=='g' && mNVar==1) { //gaussienne en hauteur
    492   int degre =-1;
    493   if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
     525  int degre=-1; if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
    494526  cout<<"Fit de Gaussienne_en_hauteur+polynome 1D de degre "<<degre<<endl;
    495527  Gauss1DPol* myf;
    496528  if(degre>=0) myf = new Gauss1DPol((unsigned int)degre,((mOpt.polcx)?true:false));
    497529  else { bool bfg = (mOpt.polcx)?true:false;   myf = new Gauss1DPol(bfg); }
    498   mFunc = myf; mNPar = mFunc->NPar();
     530  mFunction = myf; mNPar = mFunction->NPar(); mFName = func;
    499531
    500532} else if(func[0]=='G' && mNVar==1) { //gaussienne en volume
    501   int degre =-1;
    502   if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
     533  int degre=-1; if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
    503534  cout<<"Fit de Gaussienne_en_volume+polynome 1D de degre "<<degre<<endl;
    504535  GaussN1DPol* myf;
    505536  if(degre>=0) myf = new GaussN1DPol((unsigned int)degre,((mOpt.polcx)?true:false));
    506537  else  { bool bfg = (mOpt.polcx)?true:false;   myf = new GaussN1DPol(bfg); }
    507   mFunc = myf; mNPar = mFunc->NPar();
     538  mFunction = myf; mNPar = mFunction->NPar(); mFName = func;
    508539
    509540} else if(func[0]=='p' && mNVar==2) { //polynome 2D
    510   int degre = 0;
    511   if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
     541  int degre=0; if(func.length()>1) sscanf(func.c_str()+1,"%d",&degre);
    512542  cout<<"Fit polynome 2D de degre "<<degre<<endl;
    513543  Polyn2D* myf = new Polyn2D(degre,mOpt.xc,mOpt.yc);
    514   mFunc = myf; mNPar = mFunc->NPar();
     544  mFunction = myf; mNPar = mFunction->NPar(); mFName = func;
    515545
    516546} else if(func[0]=='G' && mNVar==2) { //gaussienne+fond en volume
    517   int integ = 0;
    518   if(func.length()>1) if(func[1]=='i') integ=1;
     547  int integ=0; if(func.length()>1) if(func[1]=='i') integ=1;
    519548  cout<<"Fit de Gaussienne+Fond 2D integ="<<integ<<endl;
    520   if(integ) {GauRhInt2D* myf = new GauRhInt2D; mFunc = myf;}
    521     else    {GauRho2D* myf = new GauRho2D; mFunc = myf;}
    522   mNPar = mFunc->NPar();
     549  if(integ) {GauRhInt2D* myf = new GauRhInt2D; mFunction = myf;}
     550    else    {GauRho2D* myf = new GauRho2D; mFunction = myf;}
     551  mNPar = mFunction->NPar(); mFName = func;
    523552
    524553} else if(func[0]=='d' && mNVar==2) { //DL gaussienne+fond en volume
    525   int integ = 0;
    526   if(func.length()>1) if(func[1]=='i') integ=1;
     554  int integ=0; if(func.length()>1) if(func[1]=='i') integ=1;
    527555  cout<<"Fit de DL de Gaussienne+Fond 2D integ="<<integ<<endl;
    528   if(integ) {GdlRhInt2D* myf = new GdlRhInt2D; mFunc = myf;}
    529     else    {GdlRho2D* myf = new GdlRho2D; mFunc = myf;}
    530   mNPar = mFunc->NPar();
     556  if(integ) {GdlRhInt2D* myf = new GdlRhInt2D; mFunction = myf;}
     557    else    {GdlRho2D*   myf = new GdlRho2D; mFunction = myf;}
     558  mNPar = mFunction->NPar(); mFName = func;
    531559
    532560} else if(func[0]=='D' && mNVar==2) { //DL gaussienne+fond avec coeff variable p6 en volume
    533   int integ = 0;
    534   if(func.length()>1) if(func[1]=='i') integ=1;
     561  int integ=0; if(func.length()>1) if(func[1]=='i') integ=1;
    535562  cout<<"Fit de DL de Gaussienne+Fond avec coeff variable (p6) 2D integ="<<integ<<endl;
    536   if(integ) {Gdl1RhInt2D* myf = new Gdl1RhInt2D; mFunc = myf;}
    537     else    {Gdl1Rho2D* myf = new Gdl1Rho2D; mFunc = myf;}
    538   mNPar = mFunc->NPar();
     563  if(integ) {Gdl1RhInt2D* myf = new Gdl1RhInt2D; mFunction = myf;}
     564    else    {Gdl1Rho2D*   myf = new Gdl1Rho2D; mFunction = myf;}
     565  mNPar = mFunction->NPar(); mFName = func;
    539566
    540567} else if(func[0]=='M' && mNVar==2) { //Moffat+fond (volume)
    541   int integ = 0;
    542   if(func.length()>1) if(func[1]=='i') integ=1;
     568  int integ=0; if(func.length()>1) if(func[1]=='i') integ=1;
    543569  cout<<"Fit de Moffat+Fond (expos=p6) 2D integ="<<integ<<endl;
    544   if(integ) {MofRhInt2D* myf = new MofRhInt2D; mFunc = myf;}
    545     else    {MofRho2D* myf = new MofRho2D; mFunc = myf;}
    546   mNPar = mFunc->NPar();
     570  if(integ) {MofRhInt2D* myf = new MofRhInt2D; mFunction = myf;}
     571    else    {MofRho2D*   myf = new MofRho2D; mFunction = myf;}
     572   mNPar = mFunction->NPar(); mFName = func;
    547573
    548574} else {
    549575  cout<<"Fonction "<<func<<" inconnue pour la dim "<<mNVar<<endl;
    550   mNPar = 0;
    551576  return;
    552577}
     
    621646{
    622647if(mNPar==0) return -1000;
    623 if(mFunc==NULL || mGData==NULL) {
    624   cout<<"PIAFitter::DoFit error: mFunc="<<mFunc<<" mGData="<<mGData<<endl;
     648if((mFunction==NULL && mFunc==NULL) || mGData==NULL) {
     649  cout<<"PIAFitter::DoFit error: mFunction,mFunc="<<mFunction<<","<<mFunc
     650      <<" mGData="<<mGData<<endl;
    625651  return -1001;
    626652}
    627653// classe GeneraFit
    628654if(mFit != NULL) {delete mFit; mFit= NULL;}
    629 mFit= new GeneralFit(mFunc);
     655if(mFunction) mFit= new GeneralFit(mFunction);
     656  else        mFit= new GeneralFit(mFunc);
    630657// Options et Set de GeneralFit
    631658mFit->SetDebug(mOpt.lpg);
     
    633660mFit->SetStopChi2(mOpt.stc2);
    634661mFit->SetMaxStep(mOpt.nstep);
    635 {for(int i=0;i<mFunc->NPar();i++) {
     662{for(int i=0;i<mNPar;i++) {
    636663  char str[10];
    637664  sprintf(str,"P%d",i);
     
    651678  c2r = mFit->GetChi2Red();
    652679  cout<<"C2r_Reduit = "<<c2r<<" nstep="<<mFit->GetNStep()<<" rc="<<rcfit<<endl;
    653   for(int i=0;i<mFunc->NPar();i++) mParSave(i)=mFit->GetParm(i);
     680  for(int i=0;i<mNPar;i++) mParSave(i)=mFit->GetParm(i);
    654681} else {
    655682  cout<<"echec Fit, rc = "<<rcfit<<"  nstep="<<mFit->GetNStep()<<endl;
     
    664691// Mise a disposition des resultats (fonction fitee et residus)
    665692{
    666 if(mFunc && (mOpt.okres||mOpt.okfun)) {
     693if(mFit && (mOpt.okres||mOpt.okfun)) {
    667694  NamedObjMgr omg;
    668695  string nomres = mNObj + "_res";
     
    730757
    731758/* --Methode-- */
    732 void PIAFitter::LinkFitFunc(string const & fname, string const & funcname, int nvar, int npar)
    733 {
    734 
    735 if ((nvar < 1) || (npar < 1)) return;
    736 
    737 if (mDlUFunc != NULL) delete mDlUFunc;  // Nous en avons deja un, on nettoie
    738 
    739 mDlUFunc = NULL;
    740 mFitFunc = NULL;
    741 mFitFuncDer = NULL;
    742 mUFNVar= mUFNPar = 0;
    743 mNameFitFunc = "";
     759void PIAFitter::LinkFitFunc(string const& fname, string const& funcname
     760                           ,int nvar,int npar)
     761// Compilation et link dynamique de la fonction a fitter
     762{
     763if(nvar<1 || npar<1) return;
     764if(mDlUFunc != NULL) {delete mDlUFunc;  mDlUFunc=NULL;}
     765mFitFunc = NULL; mFitFuncDer = NULL;
     766mUFNVar= mUFNPar = 0; mNameFitFunc = "";
    744767
    745768// On compile le fichier C, on fabrique un .so et on l'ouvre
    746769mDlUFunc = PDynLinkMgr::BuildFromCFile(fname);
    747 if (mDlUFunc == NULL) {
    748   cerr << "PIAFitter::LinkFitFunc() Erreur building .so " << endl;
    749   return;
    750   }
     770if(mDlUFunc == NULL)
     771  {cerr<<"PIAFitter::LinkFitFunc() Erreur building .so "<<endl; return;}
    751772
    752773// On recupere la fonction de fit
    753774mFitFunc = (DlUserFitFunc) mDlUFunc->GetFunction(funcname);
    754 if (mFitFunc == NULL) { // Probleme, on n'a pas trouve etc ...
    755   cerr << "PIAFitter::LinkFitFunc() Erreur linking function " << funcname << endl;
    756   delete mDlUFunc;
    757   mDlUFunc = NULL;
    758   return;
    759   }
    760 
    761 // On recupere la fonction de derives
     775if(mFitFunc == NULL)  // Probleme, on n'a pas trouve etc ...
     776  {cerr<<"PIAFitter::LinkFitFunc() Erreur linking function"<<funcname<<endl;
     777   delete mDlUFunc; mDlUFunc = NULL; return;}
     778
     779// On recupere la fonction des derivees
    762780string fnameder = funcname+"_der";
    763781mFitFuncDer = (DlUserFitFuncDer) mDlUFunc->GetFunction(fnameder);
    764 if (mFitFunc == NULL) {
    765   cout << "PIAFitter::LinkFitFunc() No derive for " << fnameder << endl;
    766   }
    767 
     782if(mFitFuncDer == NULL)
     783  {cout<<"PIAFitter::LinkFitFunc() No derive for"<<fnameder<<endl;}
     784
     785// Variables et pointeurs definissant le link a la fonction utilisateur
    768786mNameFitFunc = funcname;
    769787mUFNVar = nvar;
    770788mUFNPar = npar;
    771 
    772 cout << "PIAFitter::LinkFitFunc() UserFitFunc" << funcname
    773      << " NVar=" << nvar << " NPar=" << npar << endl;
    774 
    775 }
    776 /* --Methode-- */
    777 void PIAFitter::PrepareFitFuncCFile(string const & fname, string const & funcname, int nvar, int npar)
    778 {
    779 // A Faire
     789cout<<"PIAFitter::LinkFitFunc() UserFitFunc="<<mNameFitFunc
     790    <<" NVar="<<mUFNVar<<" NPar="<<mUFNPar<<endl;
     791
     792return;
     793}
     794
     795/* --Methode-- */
     796void PIAFitter::PrepareFitFuncCFile(string const& fname, string const& funcname
     797                                   , int nvar, int npar)
     798// Pour ecrire un squelette des fichier C avec pour une fonction a fitter
     799{
     800if(fname.length()<=0 || funcname.length()<=0 || nvar<=0 || npar <=0) {
     801  cerr<<"PIAFitter::PrepareFitFuncCFile: error "
     802      <<" nvar="<<nvar<<" npar="<<npar<<endl
     803      <<" file_name="<<fname<<" func_name="<<funcname<<endl
     804      <<" ---- No File Created ! ----"<<endl;
     805  return;
     806}
     807
     808FILE* fip = fopen(fname.c_str(),"w");
     809if(fip==NULL)
     810  {cerr<<"PIAFitter::PrepareFitFuncCFile: error opening file for writing\n"
     811       <<fname<<endl; return;}
     812
     813fprintf(fip,"#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\n");
     814fprintf(fip,"/* - many functions can be written in this file: */\n");
     815fprintf(fip,"/*   here is an exemple for creation of function %s */\n\n"
     816       ,funcname.c_str());
     817fprintf(fip,"double %s(double const* x,double const* p)\n",funcname.c_str());
     818fprintf(fip,"/* Function : F(x[0-%d];p[0-%d]) */\n",nvar-1,npar-1);
     819fprintf(fip,"/* variables  x1=x[0],x2=x[1],...,x%d=x[%d] */\n",nvar,nvar-1);
     820fprintf(fip,"/* parameters p1=p[0],p2=p[1],...,p%d=p[%d] */\n",nvar,nvar-1);
     821fprintf(fip,"{\n  val = F(x[];p[]);\n  return(val);\n}\n\n");
     822string fder = funcname + "_der";
     823fprintf(fip,"/* That function is optional */\n");
     824fprintf(fip,"/*\n");
     825fprintf(fip,"double %s(double const* x,double const* p,double* dp)\n",fder.c_str());
     826fprintf(fip,"{\n");
     827for(int i=0;i<npar;i++) fprintf(fip,"  dp[%d] = dF(x[];p[])/dp[%d]\n",i,i);
     828fprintf(fip,"  val = F(x[];p[]);\n  return(val);\n}\n\n");
     829fprintf(fip,"*/\n");
     830
     831fclose(fip);
    780832}
    781833
     
    784836// Execution des commandes de fit : "fit" et "fitw"
    785837{
     838////// Les commandes pour creer les fonctions de fit utilisateur
     839if(kw == "crfitfil") {
     840  if (tokens.size() < 4)
     841    {cout<<"Usage:crfitfil filename funcname nvar npar"<<endl;return(-1);}
     842  int nvar = atoi(tokens[2].c_str()), npar = atoi(tokens[3].c_str());
     843  PrepareFitFuncCFile(tokens[0],tokens[1],nvar,npar);
     844  return(0);
     845} else if (kw == "crfitfun") {
     846  if (tokens.size() < 4)
     847    {cout<<"Usage:crfitfun filename funcname nvar npar"<<endl;return(-1);}
     848  int nvar = atoi(tokens[2].c_str()), npar = atoi(tokens[3].c_str());
     849  LinkFitFunc(tokens[0],tokens[1],nvar,npar);
     850  return(0);
     851}
     852
     853////// Les commandes pour fitter
    786854if(tokens.size() < 2) {
    787855  cout
     
    825893  FWindFit = new PIAFitterWind(mApp,this);
    826894  FWindFit->Show();
    827 } else if (kw == "crfitfun") {
    828   if (tokens.size() < 4) {
    829     cout <<"Usage:crfitfun ... " << endl; return(0); }
    830     LinkFitFunc(tokens[0], tokens[1], 1, 7);
    831     double par[7]={1000,0.,0.,1.,1.,0.1,100.};
    832     double x[2]={1.,1.};
    833     cout<<"Salut:"<<mFitFunc(x,par)<<endl;
    834 }
    835 
     895}
    836896
    837897return(0);
     
    844904/* --Methode-- */
    845905PIAFitterWind::PIAFitterWind(PIStdImgApp* par, PIAFitter* fiter)
    846  : PIWindow((PIMsgHandler*)par, "PIAFitter", PIWK_normal, 240, 240, 150, 150)
    847 {
    848 ReFillGData = false;
    849 saveI1 = saveI2 = saveJ1 = saveJ2 = 0;
    850 mDap = par;
    851 mFitter = fiter;
    852 string obj = mFitter->mNObj;
    853 string fun = mFitter->mFName;
     906: PIWindow((PIMsgHandler*)par, "PIAFitter", PIWK_normal, 240, 240, 150, 150)
     907, mDap(par), mFitter(fiter), ReFillGData(false)
     908, saveI1(0), saveI2(0), saveJ1(0), saveJ2(0), ErrValue(1.)
     909{
    854910int npar = mFitter->mNPar;
    855911
    856912// Alloc de la taille
    857 nlab = 20+npar;   lab = new PILabel*[nlab];    {for(int i=0;i<nlab;i++) lab[i]=NULL;}
    858 ntxt = 20+4*npar; txt = new PIText*[ntxt];     {for(int i=0;i<ntxt;i++) txt[i]=NULL;}
    859 nbut = 20;        but = new PIButton*[nbut];   {for(int i=0;i<nbut;i++) but[i]=NULL;}
    860 nckb = 20+npar;   ckb = new PICheckBox*[nckb]; {for(int i=0;i<nckb;i++) ckb[i]=NULL;}
    861 npom = 10;        pom = new PIOptMenu*[npom];  {for(int i=0;i<npom;i++) pom[i]=NULL;}
     913nlab = 14+npar;   lab = new PILabel*[nlab];    {for(int i=0;i<nlab;i++) lab[i]=NULL;}
     914ntxt = 10+4*npar; txt = new PIText*[ntxt];     {for(int i=0;i<ntxt;i++) txt[i]=NULL;}
     915nbut = 5;         but = new PIButton*[nbut];   {for(int i=0;i<nbut;i++) but[i]=NULL;}
     916nckb = 2+npar;    ckb = new PICheckBox*[nckb]; {for(int i=0;i<nckb;i++) ckb[i]=NULL;}
     917npom = 3;         pom = new PIOptMenu*[npom];  {for(int i=0;i<npom;i++) pom[i]=NULL;}
    862918
    863919// On definit la taille a partir de la taille par defaut des composantes
     
    869925
    870926int wszx = (5*bsx+5*spx)+spx;
    871 int wszy = 9*(bsy+spy)+npar*(bsy+spy)+spy;
     927int wszy = 8*(bsy+spy)+npar*(bsy+spy)+spy;
    872928SetSize(wszx, wszy);
    873929int cpx,cpy;
    874930
    875931// new ligne
    876 cpx=spx; cpy=spy;
     932cpx = spx; cpy = spy;
     933lab[0] = new PILabel(this,mFitter->mNObj.c_str(),4*bsx,bsy,cpx,cpy);
     934lab[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     935
     936// new ligne
     937cpx = spx; cpy += bsy+spy;
    877938but[0] = new PIButton(this,"Fr.Last",111,bsx,bsy,cpx,cpy);
    878939but[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     
    880941but[1] = new PIButton(this,"Default",222,bsx,bsy,cpx,cpy);
    881942but[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    882 cpx+=bsx+spx;
     943cpx += bsx+spx;
    883944ckb[0] = new PICheckBox(this,"Gen Fun",1001,bsx,bsy,cpx,cpy);
    884945ckb[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     
    888949
    889950// new ligne
    890 cpx=spx; cpy += bsy+spy -spy;
    891 lab[0] = new PILabel(this,"- Center X -",2*bsx,bsy,cpx,cpy);
    892 lab[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    893 cpx += 2*bsx+spx;
    894 lab[1] = new PILabel(this,"- Center Y -",2*bsx,bsy,cpx,cpy);
    895 lab[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    896 
    897 // new ligne
    898 cpx=spx; cpy += bsy+spy -spy;
    899 pom[0] = new PIOptMenu(this,"No",bsx,bsy,cpx,cpy);
    900   pom[0]->AppendItem("No",2001);
    901   pom[0]->AppendItem("Value",2002);
    902   pom[0]->AppendItem("Auto",2003);
     951cpx = spx; cpy += bsy+spy;
     952pom[0] = new PIOptMenu(this,"Err def",1.5*bsx,bsy,cpx,cpy);
     953  pom[0]->AppendItem("Err def",2101);
     954  pom[0]->AppendItem("Err cste",2102);
     955  pom[0]->AppendItem("Err sqrt",2103);
    903956pom[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    904 cpx+=bsx+spx;
     957cpx += int(1.5*bsx+spx);
    905958txt[0] = new PIText(this,"",bsx,bsy,cpx,cpy);
    906959txt[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    907 cpx+=bsx+2*spx;
    908 pom[1] = new PIOptMenu(this,"No",bsx,bsy,cpx,cpy);
    909   pom[1]->AppendItem("No",2011);
    910   pom[1]->AppendItem("Value",2012);
    911   pom[1]->AppendItem("Auto",2013);
    912 pom[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    913 cpx+=bsx+spx;
     960cpx += bsx+spx;
     961lab[1] = new PILabel(this,"Prt,dbg",bsx,bsy,cpx,cpy);
     962lab[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     963cpx += bsx+spx;
    914964txt[1] = new PIText(this,"",bsx,bsy,cpx,cpy);
    915965txt[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    916966
    917967// new ligne
    918 cpx=spx; cpy += bsy+spy;
    919 lab[2] = new PILabel(this,"Err cste",1.25*bsx,bsy,cpx,cpy);
     968cpx = spx; cpy += bsy+spy;
     969lab[2] = new PILabel(this,"Stop Xi2",1.25*bsx,bsy,cpx,cpy);
    920970lab[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    921 cpx+=1.25*bsx+spx;
     971cpx += int(1.25*bsx+spx);
    922972txt[2] = new PIText(this,"",bsx,bsy,cpx,cpy);
    923973txt[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    924 cpx+=bsx+2*spx;
    925 lab[3] = new PILabel(this,"sqrt",bsx,bsy,cpx,cpy);
     974cpx += bsx+spx;
     975lab[3] = new PILabel(this,"Iter",bsx, bsy, cpx, cpy);
    926976lab[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    927 cpx+=bsx+spx;
     977cpx += bsx+spx;
    928978txt[3] = new PIText(this,"",bsx,bsy,cpx,cpy);
    929979txt[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    930980
    931981// new ligne
    932 cpx=spx; cpy += bsy+spy;
    933 lab[4] = new PILabel(this,"Stop Xi2",1.25*bsx,bsy,cpx,cpy);
     982cpx = spx; cpy += bsy+spy;
     983lab[4] = new PILabel(this,"Range X",bsx,bsy,cpx,cpy);
    934984lab[4]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    935 cpx+=1.25*bsx+spx;
    936 txt[4] = new PIText(this,"",bsx,bsy,cpx,cpy);
     985cpx += bsx+spx;
     986txt[4] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    937987txt[4]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    938 cpx+=bsx+spx;
    939 lab[5] = new PILabel(this,"Iter",bsx, bsy, cpx, cpy);
     988cpx += int(0.75*bsx+spx);
     989txt[5] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
     990txt[5]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     991cpx += int(0.75*bsx+spx);
     992lab[5] = new PILabel(this,"Y",bsx/2,bsy,cpx,cpy);
    940993lab[5]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    941 cpx+=bsx+spx;
    942 txt[5] = new PIText(this,"",bsx,bsy,cpx,cpy);
    943 txt[5]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     994cpx += int(bsx/2.+spx);
     995txt[6] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
     996txt[6]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     997cpx += int(0.75*bsx+spx);
     998txt[7] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
     999txt[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    9441000
    9451001// new ligne
    946 cpx=spx; cpy += bsy+spy;
    947 lab[6] = new PILabel(this,"Print",bsx,bsy,cpx,cpy);
     1002cpx = spx; cpy += bsy+spy;
     1003lab[6] = new PILabel(this,"Cent",bsx/2,bsy,cpx,cpy);
    9481004lab[6]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    949 cpx+=bsx+spx;
    950 txt[6] = new PIText(this,"",bsx/2,bsy,cpx,cpy);
    951 txt[6]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    952 cpx+=bsx/2+spx;
    953 lab[7] = new PILabel(this,"Debug",bsx,bsy,cpx,cpy);
    954 lab[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    955 cpx+=bsx+spx;
    956 txt[7] = new PIText(this,"",bsx/2,bsy,cpx,cpy);
    957 txt[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1005cpx += int(bsx/2.+spx);
     1006pom[1] = new PIOptMenu(this,"X.No",1.25*bsx,bsy,cpx,cpy);
     1007  pom[1]->AppendItem("X.No",2001);
     1008  pom[1]->AppendItem("X.Value",2002);
     1009  pom[1]->AppendItem("X.Auto",2003);
     1010pom[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1011cpx += int(1.25*bsx+spx);
     1012txt[8] = new PIText(this,"",bsx,bsy,cpx,cpy);
     1013txt[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1014cpx += bsx+spx;
     1015pom[2] = new PIOptMenu(this,"Y.No",1.25*bsx,bsy,cpx,cpy);
     1016  pom[2]->AppendItem("Y.No",2011);
     1017  pom[2]->AppendItem("Y.Value",2012);
     1018  pom[2]->AppendItem("Y.Auto",2013);
     1019pom[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1020cpx += int(1.25*bsx+spx);
     1021txt[9] = new PIText(this,"",bsx,bsy,cpx,cpy);
     1022txt[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    9581023
    9591024// new ligne
    960 cpx=spx; cpy += bsy+spy;
    961 lab[8] = new PILabel(this,"Range X",bsx,bsy,cpx,cpy);
    962 lab[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    963 cpx+=bsx+spx;
    964 txt[8] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    965 txt[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    966 cpx+=0.75*bsx+spx;
    967 txt[9] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    968 txt[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    969 cpx+=0.75*bsx+spx;
    970 lab[9] = new PILabel(this,"Y",bsx/2,bsy,cpx,cpy);
    971 lab[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    972 cpx+=bsx/2+spx;
    973 txt[10] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    974 txt[10]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    975 cpx+=0.75*bsx+spx;
    976 txt[11] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    977 txt[11]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    978 
    979 // new ligne
    980 cpx=spx; cpy+=bsy+spy;
     1025cpx = spx; cpy += bsy+spy;
    9811026but[2] = new PIButton(this, "Dismiss",777,bsx,bsy,cpx,cpy);
    9821027but[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    9831028cpx += bsx+spx;
    984 but[3] = new PIButton(this, "Refesh",666,bsx,bsy,cpx,cpy);
     1029but[3] = new PIButton(this, "Check",666,bsx,bsy,cpx,cpy);
    9851030but[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    9861031cpx += bsx+spx;
    9871032but[4] = new PIButton(this, "Fit",333,bsx,bsy,cpx,cpy);
    9881033but[4]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    989 cpx+=bsx+spx;
    990 lab[10] = new PILabel(this,fun.c_str(),bsx/2,bsy,cpx,cpy);
     1034cpx += bsx+spx;
     1035lab[7] = new PILabel(this,mFitter->mFName.c_str(),2*bsx,bsy,cpx,cpy);
     1036lab[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1037
     1038// new ligne
     1039cpx = spx; cpy += bsy+spy;
     1040lab[8] = new PILabel(this,"Par",bsx/2,bsy,cpx,cpy);
     1041lab[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1042cpx += int(bsx/2.+spx);
     1043lab[9] = new PILabel(this,"Fx",bsx/3,bsy,cpx,cpy);
     1044lab[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1045cpx += int(bsx/3.+spx);
     1046lab[10] = new PILabel(this,"Init",bsx,bsy,cpx,cpy);
    9911047lab[10]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1048cpx += bsx+spx;
     1049lab[11] = new PILabel(this,"Step",bsx,bsy,cpx,cpy);
     1050lab[11]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1051cpx += bsx+spx;
     1052lab[12] = new PILabel(this,"Min",bsx,bsy,cpx,cpy);
     1053lab[12]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1054cpx += bsx+spx;
     1055lab[13] = new PILabel(this,"Max",bsx,bsy,cpx,cpy);
     1056lab[13]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    9921057
    9931058// new lines: Parametres (npar lignes)
    994 cpx=spx; cpy+=bsy+spy;
    995 lab[11] = new PILabel(this,"Par",bsx/2,bsy,cpx,cpy);
    996 lab[11]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    997 cpx+=bsx/2+spx;
    998 lab[12] = new PILabel(this,"F",bsx/3,bsy,cpx,cpy);
    999 lab[12]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1000 cpx+=bsx/3+spx;
    1001 lab[13] = new PILabel(this,"Init",bsx,bsy,cpx,cpy);
    1002 lab[13]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1003 cpx+=bsx+spx;
    1004 lab[14] = new PILabel(this,"Step",bsx,bsy,cpx,cpy);
    1005 lab[14]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1006 cpx+=bsx+spx;
    1007 lab[15] = new PILabel(this,"Min",bsx,bsy,cpx,cpy);
    1008 lab[15]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1009 cpx+=bsx+spx;
    1010 lab[16] = new PILabel(this,"Max",bsx,bsy,cpx,cpy);
    1011 lab[16]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    10121059if(npar>0) {
    10131060  for(int i=0;i<npar;i++) {
    1014     cpx=spx; cpy+=bsy+spy;
     1061    cpx = spx; cpy += bsy+spy;
    10151062    char str[8]; sprintf(str,"P%d",i);
    1016     lab[20+i] = new PILabel(this,str,bsx/2,bsy,cpx,cpy);
    1017     lab[20+i]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1018     cpx+=bsx/2+spx;
     1063    lab[14+i] = new PILabel(this,str,bsx/2,bsy,cpx,cpy);
     1064    lab[14+i]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1065    cpx += int(bsx/2.+spx);
    10191066    // Attention pas de message entre 1500 et 2000 (permet 500 parametres!)
    1020     ckb[20+i] = new PICheckBox(this,"",1500+i,bsx/3,bsy,cpx,cpy);
    1021     ckb[20+i]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1022     cpx+=bsx/3+spx;
     1067    ckb[2+i] = new PICheckBox(this,"",1500+i,bsx/3,bsy,cpx,cpy+bsy/2);
     1068    ckb[2+i]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1069    cpx+=int(bsx/3.+spx);
    10231070    for(int j=0;j<4;j++) {
    1024       txt[20+4*i+j] = new PIText(this,"",bsx,bsy,cpx,cpy);
    1025       txt[20+4*i+j]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1026       cpx+=bsx+spx;
     1071      txt[10+4*i+j] = new PIText(this,"",bsx,bsy,cpx,cpy);
     1072      txt[10+4*i+j]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1073      cpx += bsx+spx;
    10271074    }
    10281075  }
     
    10671114ckb[1]->SetState(mFitter->mOpt.okres);
    10681115if(npar>0)
    1069   for(int i=0;i<npar;i++) ckb[20+i]->SetState((mFitter->mFix(i)>=1.)?true:false);
     1116  for(int i=0;i<npar;i++) ckb[2+i]->SetState((mFitter->mFix(i)>=1.)?true:false);
    10701117
    10711118// Les champs textes
    10721119char str[128]; string dum;
    1073 sprintf(str,"%f",mFitter->mOpt.xc);    dum=str; txt[0]->SetText(dum);
    1074 sprintf(str,"%f",mFitter->mOpt.yc);    dum=str; txt[1]->SetText(dum);
    1075 sprintf(str,"%f",mFitter->mOpt.err_e); dum=str; txt[2]->SetText(dum);
    1076 sprintf(str,"%f",mFitter->mOpt.err_E); dum=str; txt[3]->SetText(dum);
    1077 sprintf(str,"%f",mFitter->mOpt.stc2);  dum=str; txt[4]->SetText(dum);
    1078 sprintf(str,"%d",mFitter->mOpt.nstep); dum=str; txt[5]->SetText(dum);
    1079 sprintf(str,"%d",mFitter->mOpt.lp);    dum=str; txt[6]->SetText(dum);
    1080 sprintf(str,"%d",mFitter->mOpt.lpg);   dum=str; txt[7]->SetText(dum);
    1081 sprintf(str,"%d",mFitter->mOpt.i1);    dum=str; txt[8]->SetText(dum);
    1082 sprintf(str,"%d",mFitter->mOpt.i2);    dum=str; txt[9]->SetText(dum);
    1083 sprintf(str,"%d",mFitter->mOpt.j1);    dum=str; txt[10]->SetText(dum);
    1084 sprintf(str,"%d",mFitter->mOpt.j2);    dum=str; txt[11]->SetText(dum);
     1120sprintf(str,"%f",ErrValue); dum=str; txt[0]->SetText(dum);
     1121sprintf(str,"%d,%d",mFitter->mOpt.lp,mFitter->mOpt.lpg); dum=str; txt[1]->SetText(dum);
     1122sprintf(str,"%f",mFitter->mOpt.stc2);  dum=str; txt[2]->SetText(dum);
     1123sprintf(str,"%d",mFitter->mOpt.nstep); dum=str; txt[3]->SetText(dum);
     1124sprintf(str,"%d",mFitter->mOpt.i1);    dum=str; txt[4]->SetText(dum);
     1125sprintf(str,"%d",mFitter->mOpt.i2);    dum=str; txt[5]->SetText(dum);
     1126sprintf(str,"%d",mFitter->mOpt.j1);    dum=str; txt[6]->SetText(dum);
     1127sprintf(str,"%d",mFitter->mOpt.j2);    dum=str; txt[7]->SetText(dum);
     1128sprintf(str,"%f",mFitter->mOpt.xc);    dum=str; txt[8]->SetText(dum);
     1129sprintf(str,"%f",mFitter->mOpt.yc);    dum=str; txt[9]->SetText(dum);
    10851130if(npar>0) {
    10861131  for(int i=0;i<npar;i++) {
    1087     sprintf(str,"%f",mFitter->mPar(i));  dum=str; txt[20+4*i+0]->SetText(dum);
    1088     sprintf(str,"%f",mFitter->mStep(i)); dum=str; txt[20+4*i+1]->SetText(dum);
    1089     sprintf(str,"%f",mFitter->mMin(i));  dum=str; txt[20+4*i+2]->SetText(dum);
    1090     sprintf(str,"%f",mFitter->mMax(i));  dum=str; txt[20+4*i+3]->SetText(dum);
     1132    sprintf(str,"%f",mFitter->mPar(i));  dum=str; txt[10+4*i+0]->SetText(dum);
     1133    sprintf(str,"%f",mFitter->mStep(i)); dum=str; txt[10+4*i+1]->SetText(dum);
     1134    sprintf(str,"%f",mFitter->mMin(i));  dum=str; txt[10+4*i+2]->SetText(dum);
     1135    sprintf(str,"%f",mFitter->mMax(i));  dum=str; txt[10+4*i+3]->SetText(dum);
    10911136  }
    10921137}
     
    11001145int lp = (mFitter->mOpt.lp>2)?1:0;;
    11011146int npar = mFitter->mNPar;
     1147
     1148// Decodage des messages, init et dismiss
     1149msg = UserMsg(msg);
     1150if(msg ==777) {
     1151  if(lp) cout<<"Dismiss"<<endl;
     1152  //mDap->SetReady();
     1153  Hide();
     1154  return;
     1155}
    11021156
    11031157// L'objet existe t-il encore?
     
    11111165// On recupere les champs textes
    11121166string dum; char str[128];
     1167// Attention gestion du type d'erreur
    11131168dum=txt[0]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1169  sscanf(str,"%lf",&ErrValue); if(ErrValue<=0.) ErrValue=1.;
     1170  if(mFitter->mOpt.err_e>0. ) mFitter->mOpt.err_e = ErrValue;
     1171  if(mFitter->mOpt.err_E>0. ) mFitter->mOpt.err_E = ErrValue;
     1172dum=txt[1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1173  sscanf(str,"%d,%d",&(mFitter->mOpt.lp),&(mFitter->mOpt.lpg));
     1174dum=txt[2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1175  sscanf(str,"%lf",&(mFitter->mOpt.stc2));
     1176dum=txt[3]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1177  sscanf(str,"%d",&(mFitter->mOpt.nstep));
     1178// Attention si les valeurs de mOpt.i1/.i2/.j1/.j2 ont ete changees
     1179dum=txt[4]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1180  sscanf(str,"%d",&(mFitter->mOpt.i1));
     1181dum=txt[5]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1182  sscanf(str,"%d",&(mFitter->mOpt.i2));
     1183dum=txt[6]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1184  sscanf(str,"%d",&(mFitter->mOpt.j1));
     1185dum=txt[7]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1186  sscanf(str,"%d",&(mFitter->mOpt.j2));
     1187  if(saveI1!=mFitter->mOpt.i1 || saveI2!=mFitter->mOpt.i2 ||
     1188     saveJ1!=mFitter->mOpt.j1 || saveJ2!=mFitter->mOpt.j2 ) {
     1189    if(lp)
     1190      cout<<"Range changed: I("<<saveI1<<","<<saveI2
     1191          <<") -> I("<<mFitter->mOpt.i1<<","<<mFitter->mOpt.i2
     1192          <<")  ou   J("<<saveJ1<<","<<saveJ2
     1193          <<") -> J("<<mFitter->mOpt.j1<<","<<mFitter->mOpt.j2
     1194          <<")"<<endl;
     1195    ReFillGData = true;
     1196    saveI1=mFitter->mOpt.i1; saveI2=mFitter->mOpt.i2;
     1197    saveJ1=mFitter->mOpt.j1; saveJ2=mFitter->mOpt.j2;
     1198  }
     1199dum=txt[8]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    11141200  sscanf(str,"%lf",&(mFitter->mOpt.xc));
    1115 dum=txt[1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1201dum=txt[9]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    11161202  sscanf(str,"%lf",&(mFitter->mOpt.yc));
    1117 dum=txt[2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1118   sscanf(str,"%lf",&(mFitter->mOpt.err_e));
    1119 dum=txt[3]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1120   sscanf(str,"%lf",&(mFitter->mOpt.err_E));
    1121 dum=txt[4]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1122   sscanf(str,"%lf",&(mFitter->mOpt.stc2));
    1123 dum=txt[5]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1124   sscanf(str,"%d",&(mFitter->mOpt.nstep));
    1125 dum=txt[6]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1126   sscanf(str,"%d",&(mFitter->mOpt.lp));
    1127 dum=txt[7]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1128   sscanf(str,"%d",&(mFitter->mOpt.lpg));
    1129 dum=txt[8]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1130 // Attention si les valeurs de mOpt.i1/.i2/.j1/.j2 ont ete changees
    1131   sscanf(str,"%d",&(mFitter->mOpt.i1));
    1132 dum=txt[9]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1133   sscanf(str,"%d",&(mFitter->mOpt.i2));
    1134 dum=txt[10]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1135   sscanf(str,"%d",&(mFitter->mOpt.j1));
    1136 dum=txt[11]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1137   sscanf(str,"%d",&(mFitter->mOpt.j2));
    1138 if(saveI1!=mFitter->mOpt.i1 || saveI2!=mFitter->mOpt.i2 ||
    1139    saveJ1!=mFitter->mOpt.j1 || saveJ2!=mFitter->mOpt.j2 ) {
    1140   if(lp)
    1141     cout<<"Range changed: I("<<saveI1<<","<<saveI2
    1142         <<") -> I("<<mFitter->mOpt.i1<<","<<mFitter->mOpt.i2
    1143         <<")  ou   J("<<saveJ1<<","<<saveJ2
    1144         <<") -> J("<<mFitter->mOpt.j1<<","<<mFitter->mOpt.j2
    1145         <<")"<<endl;
    1146   ReFillGData = true;
    1147   saveI1=mFitter->mOpt.i1; saveI2=mFitter->mOpt.i2;
    1148   saveJ1=mFitter->mOpt.j1; saveJ2=mFitter->mOpt.j2;
    1149 }
    11501203
    11511204if(npar>0) {
    11521205  for(int i=0;i<npar;i++) {
    1153     dum=txt[20+4*i+0]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1206    dum=txt[10+4*i+0]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    11541207      sscanf(str,"%lf",&(mFitter->mPar(i)));
    1155     dum=txt[20+4*i+1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1208    dum=txt[10+4*i+1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    11561209      sscanf(str,"%lf",&(mFitter->mStep(i)));
    1157     dum=txt[20+4*i+2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1210    dum=txt[10+4*i+2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    11581211      sscanf(str,"%lf",&(mFitter->mMin(i)));
    1159     dum=txt[20+4*i+3]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1212    dum=txt[10+4*i+3]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    11601213      sscanf(str,"%lf",&(mFitter->mMax(i)));
    11611214  }
    11621215}
    11631216
    1164 // Decodage des messages
    1165 msg = UserMsg(msg);
    1166 if(msg ==777) {
    1167   if(lp) cout<<"Dismiss"<<endl;
    1168   //mDap->SetReady();
    1169   Hide();
    1170   return;
    1171 }
    1172 else if(msg ==666) {
    1173   if(lp) cout<<"Refresh"<<endl;
     1217// Decodage des messages, suite
     1218if(msg ==666) {
     1219  if(lp) cout<<"Check"<<endl;
    11741220  mFitter->CheckOptions();
    11751221  if(ReFillGData) mFitter->FillGData();
     
    12161262  }
    12171263}
     1264else if(2101<=msg && msg<=2103) {
     1265  mFitter->mOpt.err_e = mFitter->mOpt.err_E = -1.;
     1266  if(msg==2102)      mFitter->mOpt.err_e = ErrValue;
     1267  else if(msg==2103) mFitter->mOpt.err_E = ErrValue;
     1268  if(lp) cout<<"Err_cste="<<mFitter->mOpt.err_e
     1269             <<" Err_sqrt="<<mFitter->mOpt.err_E
     1270             <<" ErrValue="<<ErrValue<<endl;
     1271  ReFillGData = true;
     1272}
    12181273else if(2001<=msg && msg<=2003) {
    12191274  mFitter->mOpt.polcx = msg-2001;
     
    12301285else if(msg>=1500 && msg<2000) {
    12311286  int ip = msg-1500;
    1232   if(ckb[20+ip]->GetState()) {
     1287  if(ckb[2+ip]->GetState()) {
    12331288    if(lp) cout<<"Fix Param "<<ip<<endl;
    12341289    mFitter->mFix(ip) = 1.001;
    1235   } else if(!ckb[20+ip]->GetState()) {
     1290  } else if(!ckb[2+ip]->GetState()) {
    12361291    if(lp) cout<<"Not Fix Param "<<ip<<endl;
    12371292    mFitter->mFix(ip) = 0.;
Note: See TracChangeset for help on using the changeset viewer.