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


Ignore:
Timestamp:
Sep 29, 2000, 4:26:15 PM (25 years ago)
Author:
ercodmgr
Message:
  • refonte de piaffiting avec les fits adapteurs
  • addapteur de fit pour les objets existants
  • entree des Image<T> dans les fits (retour !!!)

cmv 29/9/00

File:
1 edited

Legend:

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

    r1200 r1207  
    3535#include "piafitting.h"
    3636#include "nobjmgr.h"
     37#include "anydataobj.h"
    3738#include "pistdimgapp.h"
     39
     40#include "nomhistadapter.h"
     41#include "nomgfdadapter.h"
     42#include "nomimagadapter.h"
     43#ifdef SANS_EVOLPLANCK
     44#include "nommatvecadapter.h"
     45#else
     46#include "nomtmatvecadapter.h"
     47#endif
    3848
    3949////////////////////////////////////////////////////////////////////
     
    5666  PICheckBox** ckb; int nckb;
    5767  PIOptMenu**  pom; int npom;
    58   bool ReFillGData;
    59   bool ReDecodeFunc;
    60   double ErrValue;
     68  bool ReFillGData,ReDecodeFunc;
    6169  int saveI1,saveI2, saveJ1, saveJ2;
    62   double saveErrValue,saveXC,saveYC;
     70  double saveErrScale,saveErrMin,saveXC,saveYC;
    6371};
    6472
     
    7280//| --------------- Fit Lineaire a 1 et 2 dimensions ---------------
    7381//| Syntaxe:
    74 //| fitlin nom pnn [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]
     82//| fitlin nom pnn [o:.aa,bb,cc, o:dd,ee,ff o:gg,hh,jj,kk etc...]
    7583//| avec:
    7684//| nom  : cf commentaire ordre ''fit''
     
    8492//| fitw nom func
    8593//|     [p:p1,p2,...,pn s:s1,s2,...,sn m:m1,m2,...,mn M:M1,mM2,...,Mn f:f1,...,fn]
    86 //|     [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]
     94//|     [o:.aa,bb,cc, o:dd,ee,ff o:gg,hh,jj,kk etc...]
    8795//| cf commentaire ordre ''fit''
    8896//|
     
    92100//| fit nom func
    93101//|     [p:p1,p2,...,pn s:s1,s2,...,sn m:m1,m2,...,mn M:M1,mM2,...,Mn f:f1,...,fn]
    94 //|     [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]
     102//|     [o:.aa,bb,cc, o:dd,ee,ff o:gg,hh,jj,kk etc...]
    95103//|----- OBJET -----
    96104//| nom  : nom de l'objet qui peut etre:
     
    139147//|      Ii1/i2 : numeros des bins X de l'histos utilises pour le fit [i1,i2]
    140148//|2D    Jj1/j2 : numeros des bins Y de l'histos utilises pour le fit [j1,j2]
    141 //|    - L'erreur est celle associee a l'objet (si elle existe),
    142 //|      elle est mise a 1 sinon, sauf si E... ou e... est precise:
    143 //|      Eaa.b : si |val|>=1 erreur = aa.b*sqrt(|val|)
    144 //|              si |val|<1  erreur = aa.b
    145 //|              si aa.b <=0 alors aa.b=1.0
    146 //|              E seul est equivalent a E1.0
    147 //|      eaa.b : erreur = aa.b
    148 //|              si aa.b <=0 alors aa.b=1.0
    149 //|              e seul est equivalent a e1.0
     149//|    - Traitement des erreurs :
     150//|      Par defaut, l'erreur est celle associee a l'objet (si elle existe),
     151//|        elle est mise a 1 sinon.
     152//|      haa.b/cc.d : erreur = aa.bb*(erreur associee a l'objet cf ci-dessus)
     153//|      Haa.b/cc.d : erreur = aa.b*|val|
     154//|      eaa.b/cc.d : erreur = aa.b
     155//|      Eaa.b/cc.d : erreur = aa.b*sqrt(|val|)
     156//|           aa.b<0 (ou non precise) est equivalent aa.b=1.0
     157//|           cc.d non precise est equivalent a cc.d=0
     158//|           si cc.d>=0  si erreur>0 erreur = max(erreur,cc.d)
     159//|                       si erreur<=0 alors erreur
     160//|           si cc.d<0   si erreur>0 erreur = max(erreur,|cc.d|)
     161//|                       si erreur<=0 alors erreur=|cc.d|
    150162//|      xaa.b : demande de centrage: on fit x-aa.b au lieu de x)
    151163//|      x : demande de centrage: on fit x-xc au lieu de x
    152 //|          avec xc=abscisse du milieu de l'histogramme
     164//|          avec xc=abscisse du ''milieu logique'' de l'objet.
    153165//|          Actif pour  exp+poly 1D, poly 1D
    154166//|          Pour gauss+poly 1D, xc est le centre de la gaussienne.
     
    183195PIAFitter::PIAFitter(PIACmd *piac, PIStdImgApp* app)
    184196: mApp(app), FWindFit(NULL)
    185 , mNObj(""), mObj(NULL), mGData(NULL)
    186 , mNPar(0), mNVar(0),  mNBinX(0), mNBinY(0), mNData(0)
     197, mNObj(""), mAdObj(NULL), mGData(NULL), delmGData(false)
     198, mNPar(0), mNVar(0), mNData(0)
    187199, mPar(1), mStep(1), mMin(1), mMax(1), mFix(1)
    188200, mParSave(1), mStepSave(1), mMinSave(1), mMaxSave(1), mFixSave(1)
    189 , mFit(NULL),ApplyXYcentering(false)
    190 , mV(NULL), mH(NULL), mM(NULL), mH2(NULL), mIm(NULL), mG(NULL)
     201, mFit(NULL)
    191202, mFunction(NULL), mFName(""), mFunc(NULL)
    192203, mDlUFunc(NULL), mNameFitFunc(""), mFitFunc(NULL), mFitFuncDer(NULL)
     
    207218usage+="\n| --------------- Fit Lineaire a 1 et 2 dimensions ---------------    ";
    208219usage+="\n| Syntaxe:    ";
    209 usage+="\n| fitlin nom pnn [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]    ";
     220usage+="\n| fitlin nom pnn [o:.aa,bb,cc, o:dd,ee,ff o:gg,hh,jj,kk etc...]    ";
    210221usage+="\n| avec:    ";
    211222usage+="\n| nom  : cf commentaire ordre ''fit''    ";
     
    219230usage+="\n| fitw nom func    ";
    220231usage+="\n|     [p:p1,p2,...,pn s:s1,s2,...,sn m:m1,m2,...,mn M:M1,mM2,...,Mn f:f1,...,fn]    ";
    221 usage+="\n|     [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]    ";
     232usage+="\n|     [o:.aa,bb,cc, o:dd,ee,ff o:gg,hh,jj,kk etc...]    ";
    222233usage+="\n| cf commentaire ordre ''fit''    ";
    223234usage+="\n|    ";
     
    227238usage+="\n| fit nom func    ";
    228239usage+="\n|     [p:p1,p2,...,pn s:s1,s2,...,sn m:m1,m2,...,mn M:M1,mM2,...,Mn f:f1,...,fn]    ";
    229 usage+="\n|     [o:.aa,bb,cc, o;dd,ee,ff o:gg,hh,jj,kk etc...]    ";
     240usage+="\n|     [o:.aa,bb,cc, o:dd,ee,ff o:gg,hh,jj,kk etc...]    ";
    230241usage+="\n|----- OBJET -----    ";
    231242usage+="\n| nom  : nom de l'objet qui peut etre:    ";
     
    274285usage+="\n|      Ii1/i2 : numeros des bins X de l'histos utilises pour le fit [i1,i2]    ";
    275286usage+="\n|2D    Jj1/j2 : numeros des bins Y de l'histos utilises pour le fit [j1,j2]    ";
    276 usage+="\n|    - L'erreur est celle associee a l'objet (si elle existe),    ";
    277 usage+="\n|      elle est mise a 1 sinon, sauf si E... ou e... est precise:    ";
    278 usage+="\n|      Eaa.b : si |val|>=1 erreur = aa.b*sqrt(|val|)    ";
    279 usage+="\n|              si |val|<1  erreur = aa.b    ";
    280 usage+="\n|              si aa.b <=0 alors aa.b=1.0    ";
    281 usage+="\n|              E seul est equivalent a E1.0    ";
    282 usage+="\n|      eaa.b : erreur = aa.b    ";
    283 usage+="\n|              si aa.b <=0 alors aa.b=1.0    ";
    284 usage+="\n|              e seul est equivalent a e1.0    ";
     287usage+="\n|    - Traitement des erreurs :    ";
     288usage+="\n|      Par defaut, l'erreur est celle associee a l'objet (si elle existe),    ";
     289usage+="\n|        elle est mise a 1 sinon.    ";
     290usage+="\n|      haa.b/cc.d : erreur = aa.bb*(erreur associee a l'objet cf ci-dessus)    ";
     291usage+="\n|      Haa.b/cc.d : erreur = aa.b*|val|    ";
     292usage+="\n|      eaa.b/cc.d : erreur = aa.b    ";
     293usage+="\n|      Eaa.b/cc.d : erreur = aa.b*sqrt(|val|)    ";
     294usage+="\n|           aa.b<0 (ou non precise) est equivalent aa.b=1.0    ";
     295usage+="\n|           cc.d non precise est equivalent a cc.d=0    ";
     296usage+="\n|           si cc.d>=0  si erreur>0 erreur = max(erreur,cc.d)    ";
     297usage+="\n|                       si erreur<=0 alors erreur    ";
     298usage+="\n|           si cc.d<0   si erreur>0 erreur = max(erreur,|cc.d|)    ";
     299usage+="\n|                       si erreur<=0 alors erreur=|cc.d|    ";
    285300usage+="\n|      xaa.b : demande de centrage: on fit x-aa.b au lieu de x)    ";
    286301usage+="\n|      x : demande de centrage: on fit x-xc au lieu de x    ";
    287 usage+="\n|          avec xc=abscisse du milieu de l'histogramme    ";
     302usage+="\n|          avec xc=abscisse du ''milieu logique'' de l'objet.    ";
    288303usage+="\n|          Actif pour  exp+poly 1D, poly 1D    ";
    289304usage+="\n|          Pour gauss+poly 1D, xc est le centre de la gaussienne.    ";
     
    352367PIAFitter::~PIAFitter()
    353368{
    354 if(mFit != NULL)      {delete mFit;      mFit=NULL;}
    355 if(mFunction != NULL) {delete mFunction; mFunction=NULL;}
    356 if(mFunc != NULL)     {delete mFunc;     mFunc=NULL;}
    357 if(mGData != NULL)    {delete mGData;    mGData=NULL;}
    358 if(FWindFit != NULL)  {delete FWindFit;  FWindFit=NULL;}
    359 if (mDlUFunc != NULL) {delete mDlUFunc;  mDlUFunc=NULL;}
    360 }
    361 
    362 /* --Methode-- */
    363 void PIAFitter::ResetDPointer(void)
    364 // Reset des pointeurs sur les donnees
    365 {
    366 mNObj = ""; mObj=NULL;
    367 mV=NULL; mH=NULL; mM=NULL; mH2=NULL; mIm=NULL; mG=NULL;
     369if(delmGData && mGData != NULL) {delete mGData;    mGData=NULL; delmGData=false;}
     370if(mFit != NULL)                {delete mFit;      mFit=NULL;}
     371if(mFunction != NULL)           {delete mFunction; mFunction=NULL;}
     372if(mFunc != NULL)               {delete mFunc;     mFunc=NULL;}
     373if(FWindFit != NULL)            {delete FWindFit;  FWindFit=NULL;}
     374if(mDlUFunc != NULL)            {delete mDlUFunc;  mDlUFunc=NULL;}
    368375}
    369376
     
    373380{
    374381mOpt.okres = mOpt.okfun = false;
     382
    375383mOpt.polcx = mOpt.polcy = 0;
    376384mOpt.xc = mOpt.yc = 0.;
     385
    377386mOpt.stc2 = 1.e-3;
    378387mOpt.nstep = 100;
    379 mOpt.err_e = mOpt.err_E = -1.;
     388
     389mOpt.err_type = GeneralFitData::DefaultError;
     390mOpt.err_scale = 1.; mOpt.err_min = 0.;
     391
    380392mOpt.lp = 1; mOpt.lpg = 0;
    381 mOpt.i1 = mOpt.j1 = mOpt.i2 = mOpt.j2 = -1;
     393
     394mOpt.i1 = mOpt.j1 = 0;
     395mOpt.i2 = mOpt.j2 = -1;
     396
    382397mOpt.fromlastfit = false;
    383398mOpt.autoinifit = false;
     
    417432  }
    418433}
    419 if(strstr(opt.c_str(),",E")) { // Erreurs imposees a "sqrt(val)" ou "aa.b*sqrt(val)"
     434if(strstr(opt.c_str(),",h")) {
     435  mOpt.err_type = GeneralFitData::DefaultError;
     436  p = opt.find(",h"); q = opt.find_first_of(',',p+1);
     437  dum = opt.substr(p,q-p);
     438  if(dum.length()>2) sscanf(dum.c_str(),",h%lf/%lf",&mOpt.err_scale,&mOpt.err_min);
     439}
     440if(strstr(opt.c_str(),",H")) {
     441  mOpt.err_type = GeneralFitData::ProporError;
     442  p = opt.find(",H"); q = opt.find_first_of(',',p+1);
     443  dum = opt.substr(p,q-p);
     444  if(dum.length()>2) sscanf(dum.c_str(),",H%lf/%lf",&mOpt.err_scale,&mOpt.err_min);
     445}
     446if(strstr(opt.c_str(),",e")) {
     447  mOpt.err_type = GeneralFitData::ConstantError;
     448  p = opt.find(",e"); q = opt.find_first_of(',',p+1);
     449  dum = opt.substr(p,q-p);
     450  if(dum.length()>2) sscanf(dum.c_str(),",e%lf/%lf",&mOpt.err_scale,&mOpt.err_min);
     451}
     452if(strstr(opt.c_str(),",E")) {
     453  mOpt.err_type = GeneralFitData::SqrtError;
    420454  p = opt.find(",E"); q = opt.find_first_of(',',p+1);
    421455  dum = opt.substr(p,q-p);
    422   if(dum.length()>2) sscanf(dum.c_str(),",E%lf",&mOpt.err_E);
    423   if(mOpt.err_E<=0.) mOpt.err_E = 1.;  //mOpt.err_e=-1.;
    424 }
    425 if(strstr(opt.c_str(),",e")) { // Erreurs imposees a "1" ou "aa.b"
    426   p = opt.find(",e"); q = opt.find_first_of(',',p+1);
    427   dum = opt.substr(p,q-p);
    428   if(dum.length()>2) sscanf(dum.c_str(),",e%lf",&mOpt.err_e);
    429   if(mOpt.err_e<=0.) mOpt.err_e = 1.;  //mOpt.err_E=-1.;
     456  if(dum.length()>2) sscanf(dum.c_str(),",E%lf/%lf",&mOpt.err_scale,&mOpt.err_min);
    430457}
    431458if(strstr(opt.c_str(),",X")) { // Valeur du StopChi2
     
    467494// Decodage de l'objet a fitter
    468495{
     496mNObj = "";
    469497NamedObjMgr omg;
    470498AnyDataObj* mobj = omg.GetObj(obj);
     
    473501   return;}
    474502
    475 // Reset
    476 ResetDPointer();
    477 mNVar = mNBinX = mNBinY = mNData = 0;
    478 
    479 mObj = mobj; mNObj = obj;
    480 string ctyp = typeid(*mObj).name();
    481 
    482 // 1D
    483 if (typeid(*mObj) == typeid(Vector)) {
    484   mNVar = 1;
    485   mV = (Vector*) mObj; mNBinX = mV->NElts(); mNBinY = 1;
    486   }
    487 else if ( (typeid(*mObj) == typeid(HProf)) || (typeid(*mObj) == typeid(Histo)) ) {
    488   mNVar = 1;
    489   mH = (Histo*)  mObj; mNBinX = mH->NBins(); mNBinY = 1;
    490   }
    491 // 2D
    492 else if (typeid(*mObj) == typeid(Matrix)) {
    493   mNVar = 2;
    494   mM = (Matrix*) mObj; mNBinX = mM->NCol(); mNBinY =mM->NRows();
    495   }
    496 else if (typeid(*mObj) == typeid(Histo2D)) {
    497   mNVar = 2;
    498   mH2 = (Histo2D*) mObj; mNBinX = mH2->NBinX(); mNBinY = mH2->NBinY();
    499   }
    500 else if (typeid(*mObj) == typeid(GeneralFitData)) {
    501   mG = (GeneralFitData*) mObj; mNBinX = mG->NData(); mNBinY = 1;
    502   if(     mG->NVar()==1) mNVar = 1;
    503   else if(mG->NVar()==2) mNVar = 2;
    504   else
    505      {cout<<"PIAFitter::DecodeObject Error: \n"
    506          <<" GeneralFitData ne peut avoir que 1 ou 2 variables d'abscisse: "
    507          <<((GeneralFitData*) mObj)->NVar()<<endl;
    508      return;}
    509   }
    510 #ifdef SANS_EVOLPLANCK
    511 else if (dynamic_cast<RzImage*>(mObj)) {
    512   mNVar = 2;
    513   mIm = (RzImage*) mObj; mNBinX = mIm->XSize(); mNBinY = mIm->YSize();
    514   }
    515 #else
    516 //CMV_A_FAIRE else if (dynamic_cast<RzImage*>(mObj)) {
    517 //CMV_A_FAIRE   mNVar = 2;
    518 //CMV_A_FAIRE   mIm = (RzImage*) mObj; mNBinX = mIm->XSize(); mNBinY = mIm->YSize();
    519 //CMV_A_FAIRE   }
    520 #endif
    521 else {
    522   cout<<"PIAFitter::DecodeObject Error , Objet n'est pas un "
    523       <<"Histo1D/HProf/Vector/Histo2D/Image/Matrix/GeneralFitData "<<ctyp<<endl;
    524   return;
    525   }
    526 
    527 mNData = mNBinX*mNBinY;
    528 if(mNData<=0) {
    529   cout<<"L'objet a "<<mNBinX<<","<<mNBinY<<" bins ("<<mNData<<")"<<endl;
    530   return;
    531 }
     503mNObj = obj;
    532504
    533505return;
     
    541513if(mOpt.lp<0) mOpt.lp = 0;
    542514if(mOpt.lpg<0) mOpt.lpg = 0;
    543 mOpt.i1 = (mOpt.i1<0||mOpt.i1>=mNBinX)? 0: mOpt.i1;
    544 mOpt.i2 = (mOpt.i2<0||mOpt.i2>=mNBinX||mOpt.i2<=mOpt.i1)? mNBinX-1: mOpt.i2;
    545 if(mNVar>=2) {
    546   mOpt.j1 = (mOpt.j1<0||mOpt.j1>=mNBinY)? 0: mOpt.j1;
    547   mOpt.j2 = (mOpt.j2<0||mOpt.j2>=mNBinY||mOpt.j2<=mOpt.j1)? mNBinY-1: mOpt.j2;
    548 } else mOpt.j2 = mOpt.j1 = 0;
    549 if(mOpt.polcx==2) {
    550   if(mV||mM)   mOpt.xc = (mOpt.i2-mOpt.i1+1)/2.;
    551   else if(mH)  mOpt.xc = (mH->XMin()+mH->XMax())/2.;
    552   else if(mH2) mOpt.xc = (mH2->XMin()+mH2->XMax())/2.;
    553   else if(mG)  {double mini,maxi; mG->GetMnMx(2,mini,maxi); mOpt.xc=(mini+maxi)/2.;}
    554   else if(mIm) {mOpt.xc = mIm->XOrg() + mIm->XPixSize()*(mOpt.i2-mOpt.i1+1)/2.;}
    555 }
    556 if(mOpt.polcy==2 && mNVar>=2) {
    557   if(mM)  mOpt.yc = (mOpt.j2-mOpt.j1+1)/2.;
    558   if(mH2) mOpt.yc = (mH2->YMin()+mH2->YMax())/2.;
    559   if(mG)  {double mini,maxi; mG->GetMnMx(12,mini,maxi); mOpt.yc=(mini+maxi)/2.;}
    560   if(mIm) {mOpt.yc = mIm->YOrg() + mIm->YPixSize()*(mOpt.j2-mOpt.j1+1)/2.;}
    561 }
    562 if(mOpt.err_e>0.) mOpt.err_E=-1.;
    563 if(mOpt.err_E>0.) mOpt.err_e =-1.;
    564515if(mOpt.stc2<=0.) mOpt.stc2 = 1.e-3;
    565516if(mOpt.nstep<2) mOpt.nstep = 100;
    566 
    567517return;
    568518}
     
    572522// Print des options
    573523{
    574 cout<<"Fit["<<mNBinX<<","<<mNBinY<<"] ("<<mNData<<") dim="<<mNVar<<":"
     524cout<<"Fit("<<mNData<<") dim="<<mNVar<<":"
    575525    <<" Int=["<<mOpt.i1<<","<<mOpt.i2<<"],["<<mOpt.j1<<","<<mOpt.j2<<"]"<<endl
    576526    <<" Cent="<<mOpt.polcx<<","<<mOpt.polcy<<","<<mOpt.xc<<"+x"<<","<<mOpt.yc<<"+y"
    577     <<" TypE="<<mOpt.err_e<<","<<mOpt.err_E
     527    <<" TypE="<<mOpt.err_type<<","<<mOpt.err_scale<<","<<mOpt.err_min
    578528    <<" StpX2="<<mOpt.stc2<<" Nstep="<<mOpt.nstep<<endl
    579529    <<" Init.LFit="<<mOpt.fromlastfit<<" AutoIni.Fit="<<mOpt.autoinifit
     
    587537// ATTENTION: cette methode a besoin que les options soient decodees et checkees
    588538{
    589 if(mNData<=0) return;
    590 if(mGData!=NULL) {delete mGData; mGData=NULL;}
    591 mGData = new GeneralFitData(mNVar,mNData,0);
    592 
    593 for(int i=mOpt.i1;i<=mOpt.i2;i++) for(int j=mOpt.j1;j<=mOpt.j2;j++) {
    594   double x,y=0.,f,e;
    595 
    596   if(mV)
    597     {x= (double) i; f=(*mV)(i); e=1.;}
    598   else if(mH)
    599     {x=mH->BinCenter(i); f=(*mH)(i); e=(mH->HasErrors())?mH->Error(i):1.;}
    600   else if(mM)
    601     {x=(double) i; y=(double) j; f=(*mM)(j,i); e=1.;}
    602   else if(mH2)
    603     {r_8 xf,yf; mH2->BinCenter(i,j,xf,yf); x=xf; y=yf;
    604      f=(*mH2)(i,j); e=(mH2->HasErrors())?mH2->Error(i,j):1.;}
    605   else if(mIm)
    606     {x=mIm->XOrg()+(i+0.5)*mIm->XPixSize(); y=mIm->YOrg()+(j+0.5)*mIm->YPixSize();
    607      f=mIm->DValue(i,j); e=1.;}
    608   else if(mG&&mNVar==1) {x= mG->X(i); f=mG->Val(i); e=mG->EVal(i);}
    609   else if(mG&&mNVar==2) {x= mG->X(i); y=mG->Y(i); f=mG->Val(i); e=mG->EVal(i);}
    610   else x=y=f=e=0.;
    611 
    612   // Gestion des erreurs a utiliser
    613   if(mOpt.err_e>0.) e=mOpt.err_e;
    614   else if(mOpt.err_E>0.) {e=(f<-1.||f>1.)?mOpt.err_E*sqrt(fabs(f)):mOpt.err_E;}
    615 
    616   // Remplissage de generalfitdata
    617   if(ApplyXYcentering) { // pour fitlin
    618     if(mOpt.polcx>0) x-=mOpt.xc;
    619     if(mNVar>=2 && mOpt.polcy>0) y-=mOpt.yc;
    620   }
    621   if(mNVar==1)      mGData->AddData1(x,f,e);
    622   else if(mNVar==2) mGData->AddData2(x,y,f,e);
    623 }
    624 
    625 if(mGData->NData()<=0) {
    626   cout<<"Pas de donnees dans GeneralFitData: "<<mGData->NData()<<endl;
     539if(delmGData && mGData!=NULL) {delete mGData; mGData=NULL; delmGData=false;}
     540mNVar = mNData = 0;
     541
     542NamedObjMgr omg;
     543mAdObj = omg.GetObjAdapter(mNObj); // Ne pas deleter
     544if(mAdObj == NULL) {
     545  cout<<"PIAFitter::DecodeObject Error , ObjAdapter==NULL for "<<mNObj<<endl;
    627546  return;
    628547}
    629 
     548mGData = mAdObj->GetGeneralFitData(delmGData
     549                 ,mOpt.err_type,mOpt.err_scale,mOpt.err_min
     550                 ,mOpt.i1,mOpt.i2,mOpt.j1,mOpt.j2);
     551if(mGData == NULL) {
     552  cout<<"PIAFitter::DecodeObject Error , No adaptor for "<<mNObj<<endl;
     553  return;
     554}
     555mNData = mGData->NData();
     556if(mNData<=0) {
     557  cout<<"No data in GeneralFitData: "<<mNData<<endl;
     558  return;
     559}
     560mNVar = mGData->NVar();
     561if(mNVar<=0 || mNVar>2) {
     562  cout<<"Fit only support 1 and 2D :  NVar = "<<mNVar<<endl;
     563  return;
     564}
     565
     566// Gestion du centrage automatique si demande
     567GetCentering();
     568
     569// Prints
    630570if(mOpt.lp>2) {
    631571  mGData->PrintStatus();
    632572  mGData->PrintData(0);
    633   mGData->PrintData(mGData->NData()-1);
     573  mGData->PrintData(mNData-1);
    634574  double mini,maxi;
    635575  mGData->GetMnMx(2,mini,maxi);
     
    648588
    649589/* --Methode-- */
     590void PIAFitter::GetCentering(void)
     591// Calcul le centrage automatique
     592{
     593if(!mGData) return;
     594if(mOpt.polcx==2) {
     595  double mini,maxi;
     596  mGData->GetMnMx(2,mini,maxi);
     597  mOpt.xc=(mini+maxi)/2.;
     598}
     599if(mOpt.polcy==2 && mNVar>=2) {
     600  double mini,maxi;
     601  mGData->GetMnMx(12,mini,maxi);
     602  mOpt.yc=(mini+maxi)/2.;
     603}
     604}
     605
     606/* --Methode-- */
    650607void PIAFitter::DecodeFunction(string func)
    651608// Fonction a fitter
    652609// ATTENTION: cette methode a besoin que les donnees soient lues
    653 //                                    (pour mopt.xc,yc et mNVar)
     610//                                    (pour mOpt.xc,yc et mNVar)
    654611{
    655612if(func.length()<=0)
     
    911868// Mise a disposition des resultats (fonction fitee et residus)
    912869{
    913 if(mFit && (mOpt.okres||mOpt.okfun)) {
    914   NamedObjMgr omg;
    915   string nomres = mNObj + "_res";
    916   string nomfun = mNObj + "_fun";
    917 //####################
    918 #ifdef SANS_EVOLPLANCK
    919 //####################
    920   if(mV) {
    921     if(mOpt.okres) {Vector* ob = mV->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
    922     if(mOpt.okfun) {Vector* ob = mV->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
    923   } else if(mH) {
    924     if(mOpt.okres) {Histo* ob = mH->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
    925     if(mOpt.okfun) {Histo* ob = mH->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
    926   } else if(mM) {
    927     if(mOpt.okres) {Matrix* ob = mM->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
    928     if(mOpt.okfun) {Matrix* ob = mM->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
    929   } else if(mH2) {
    930     if(mOpt.okres)
    931       {Histo2D* ob = mH2->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
    932     if(mOpt.okfun)
    933       {Histo2D* ob = mH2->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
    934   } else if(mIm) {
    935     if(mOpt.okres) {
    936       RzImage* ob = mIm->FitResidus(*mFit); 
    937       if(ob) {ImageR4* rob = new ImageR4(*ob); omg.AddObj(rob,nomres); delete ob;}
    938     }
    939     if(mOpt.okfun) {
    940       RzImage* ob = mIm->FitFunction(*mFit);
    941       if(ob) {ImageR4* rob = new ImageR4(*ob); omg.AddObj(rob,nomfun); delete ob;}
    942     }
    943   } else if(mG) {
    944     if(mOpt.okres)
    945       {GeneralFitData* ob = mG->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
    946     if(mOpt.okfun)
    947       {GeneralFitData* ob = mG->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
    948   }
    949 //####################
    950 #else
    951 //####################
    952   if(mV) {
    953     if(mOpt.okres) {
    954       Vector* ob = new Vector(ObjectFitter::FitResidus(*mV, *mFit),true); 
    955       if(ob) omg.AddObj(ob,nomres);
    956     }
    957     if(mOpt.okfun) {
    958       Vector* ob = new Vector(ObjectFitter::FitFunction(*mV, *mFit),true);
    959       if(ob) omg.AddObj(ob,nomfun);
    960     }
    961   } else if(mH) {
    962     if(mOpt.okres) {
    963       Histo* ob = new Histo(ObjectFitter::FitResidus(*mH, *mFit));
    964       if(ob) omg.AddObj(ob,nomres);
    965     }
    966     if(mOpt.okfun) {
    967       Histo* ob = new Histo(ObjectFitter::FitFunction(*mH, *mFit));
    968       if(ob) omg.AddObj(ob,nomfun);
    969     }
    970   } else if(mM) {
    971     if(mOpt.okres) {
    972       Matrix* ob = new Matrix(ObjectFitter::FitResidus(*mM, *mFit), true); 
    973       if(ob) omg.AddObj(ob,nomres);
    974     }
    975     if(mOpt.okfun) {
    976       Matrix* ob = new Matrix(ObjectFitter::FitFunction(*mM, *mFit), true);
    977       if(ob) omg.AddObj(ob,nomfun);
    978     }
    979   } else if(mH2) {
    980     if(mOpt.okres) {
    981       Histo2D* ob = new Histo2D(ObjectFitter::FitResidus(*mH2, *mFit));
    982       if(ob) omg.AddObj(ob,nomres);
    983     }
    984     if(mOpt.okfun) {
    985       Histo2D* ob = new Histo2D(ObjectFitter::FitFunction(*mH2, *mFit));
    986       if(ob) omg.AddObj(ob,nomfun);
    987     }
    988 //CMV_A_FAIRE  } else if(mIm) {
    989 //CMV_A_FAIRE    if(mOpt.okres) {
    990 //CMV_A_FAIRE      RzImage* ob = mIm->FitResidus(*mFit); 
    991 //CMV_A_FAIRE      if(ob) {ImageR4* rob = new ImageR4(*ob); omg.AddObj(rob,nomres); delete ob;}
    992 //CMV _A_FAIRE    }
    993 //CMV_A_FAIRE    if(mOpt.okfun) {
    994 //CMV_A_FAIRE      RzImage* ob = mIm->FitFunction(*mFit);
    995 //CMV_A_FAIRE      if(ob) {ImageR4* rob = new ImageR4(*ob); omg.AddObj(rob,nomfun); delete ob;}
    996 //CMV_A_FAIRE    }
    997   } else if(mG) {
    998     if(mOpt.okres) {
    999       //GeneralFitData* ob = new GeneralFitData(mG->FitResidus(*mFit));
    1000       GeneralFitData* ob = new GeneralFitData(ObjectFitter::FitResidus(*mG, *mFit));
    1001       if(ob) omg.AddObj(ob,nomres);
    1002     }
    1003     if(mOpt.okfun) {
    1004       //GeneralFitData* ob = new GeneralFitData(mG->FitFunction(*mFit));
    1005       GeneralFitData* ob = new GeneralFitData(ObjectFitter::FitFunction(*mG, *mFit));
    1006       if(ob) omg.AddObj(ob,nomfun);
    1007     }
    1008   }
    1009 //####################
    1010 #endif
    1011 //####################
    1012 }
     870if(!mFit) return;
     871
     872NamedObjMgr omg;
     873string nomresfun = "__dummy__";
     874
     875if(mOpt.okres) {
     876  nomresfun = mNObj + "_res";
     877  AnyDataObj* ob = mAdObj->FitResidusObj(*mFit);
     878  if(ob) omg.AddObj(ob,nomresfun);
     879}
     880
     881if(mOpt.okfun) {
     882  nomresfun = mNObj + "_fun";
     883  AnyDataObj* ob = mAdObj->FitFunctionObj(*mFit);
     884  if(ob) omg.AddObj(ob,nomresfun);
     885}
     886
    1013887return;
    1014888}
     
    1029903if(mFName.length()>1) sscanf(mFName.c_str()+1,"%d",&degre);
    1030904
     905double xc = (mOpt.polcx>0) ? mOpt.xc : 0.;
     906double yc = (mOpt.polcy>0) ? mOpt.yc : 0.;
     907
    1031908if(mNVar==1) {  // Fit lineaire de polynome 1D
    1032   cout<<"Fit (lineaire) 1D polynome de degre "<<degre<<endl;
     909  cout<<"Fit (lineaire) 1D polynome de degre "<<degre
     910      <<" (xc="<<xc<<")"<<endl;
    1033911  Poly p1(0);
    1034   double c2rl = mGData->PolFit(0,p1,degre);
     912  double c2rl = mGData->PolFit(0,p1,degre,xc);
    1035913  cout<<"C2r_lineaire = "<<c2rl<<endl;
    1036914  if(mOpt.lp>0) cout<<p1<<endl;
    1037915} else if(mNVar==2) {  // Fit lineaire de polynome 2D
    1038   cout<<"Fit (lineaire) polynome 2D de degre "<<degre<<endl;
     916  cout<<"Fit (lineaire) polynome 2D de degre "<<degre
     917      <<" (xc,yc="<<xc<<","<<yc<<")"<<endl;
    1039918  Poly2 p2(0);
    1040   double c2rl = mGData->PolFit(0,1,p2,degre);
     919  double c2rl = mGData->PolFit(0,1,p2,degre,xc,yc);
    1041920  cout<<"C2r_lineaire = "<<c2rl<<endl;
    1042921  if(mOpt.lp>0) cout<<p2<<endl;
     
    11481027  <<" avec Options: [p:p1,...,pn s:s1,...,sn m:m1,...,mn \n"
    11491028  <<"                M:M1,...,Mn f:f1,...,fn o:.,.,. o:.,.,.]\n"
    1150   <<" ou   fitlin nomobj func [o:.,.,. o:.,.,.]\n";
     1029  <<" ou   fitlin nomobj pnn [o:.,.,. o:.,.,.]\n";
    11511030  return(-1);
    11521031}
     
    11721051DecodeObject(tokens[0]);
    11731052CheckOptions();
     1053FillGData();
    11741054if(mOpt.lp>0) PrintOptions();
    1175 if(kw == "fitlin") ApplyXYcentering=true; else ApplyXYcentering=false;
    1176 FillGData();
    11771055DecodeFunction(tokens[1]);
    11781056DecodeParam(mSp,mSs,mSm,mSM,mSf);
     
    13061184, mDap(par), mFitter(fiter), mFunc(func)
    13071185, ReFillGData(false), ReDecodeFunc(false)
    1308 , ErrValue(1.)
    13091186, saveI1(0), saveI2(0), saveJ1(0), saveJ2(0)
    1310 , saveErrValue(1.), saveXC(0.), saveYC(0.)
     1187, saveErrScale(1.),saveErrMin(0.), saveXC(0.), saveYC(0.)
    13111188{
    13121189#ifdef SANS_EVOLPLANCK
     
    13191196
    13201197// Alloc de la taille
    1321 nlab = 13+npar;   lab = new PILabel*[nlab];    {for(int i=0;i<nlab;i++) lab[i]=NULL;}
    1322 ntxt = 10+4*npar; txt = new PIText*[ntxt];     {for(int i=0;i<ntxt;i++) txt[i]=NULL;}
     1198nlab = 15+npar;   lab = new PILabel*[nlab];    {for(int i=0;i<nlab;i++) lab[i]=NULL;}
     1199ntxt = 15+4*npar; txt = new PIText*[ntxt];     {for(int i=0;i<ntxt;i++) txt[i]=NULL;}
    13231200nbut = 6;         but = new PIButton*[nbut];   {for(int i=0;i<nbut;i++) but[i]=NULL;}
    13241201nckb = 2+npar;    ckb = new PICheckBox*[nckb]; {for(int i=0;i<nckb;i++) ckb[i]=NULL;}
     
    13601237// new ligne
    13611238cpx = spx; cpy += bsy+spy;
    1362 pom[0] = new PIOptMenu(this,"Err def",1.5*bsx,bsy,cpx,cpy);
     1239pom[0] = new PIOptMenu(this,"Err def",1.25*bsx,bsy,cpx,cpy);
    13631240  pom[0]->AppendItem("Err def",2101);
    13641241  pom[0]->AppendItem("Err cste",2102);
    13651242  pom[0]->AppendItem("Err sqrt",2103);
     1243  pom[0]->AppendItem("Err prop",2104);
    13661244  pom[0]->SetValue(2101);
    13671245pom[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1368 cpx += int(1.5*bsx+spx);
     1246cpx += int(1.25*bsx+spx);
     1247lab[1] = new PILabel(this,"E_Scale",bsx, bsy, cpx, cpy);
     1248lab[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1249cpx += bsx+spx;
    13691250txt[0] = new PIText(this,"",bsx,bsy,cpx,cpy);
    13701251txt[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    13711252cpx += bsx+spx;
    1372 lab[1] = new PILabel(this,"Prt,dbg",bsx,bsy,cpx,cpy);
    1373 lab[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1374 cpx += bsx+spx;
    1375 txt[1] = new PIText(this,"",bsx,bsy,cpx,cpy);
     1253lab[2] = new PILabel(this,"E_Min",0.75*bsx,bsy,cpx,cpy);
     1254lab[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1255cpx += int(0.75*bsx+spx);
     1256txt[1] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    13761257txt[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    13771258
    13781259// new ligne
    13791260cpx = spx; cpy += bsy+spy;
    1380 lab[2] = new PILabel(this,"Stop Xi2",1.25*bsx,bsy,cpx,cpy);
    1381 lab[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1382 cpx += int(1.25*bsx+spx);
    1383 txt[2] = new PIText(this,"",bsx,bsy,cpx,cpy);
     1261lab[3] = new PILabel(this,"Prt,dbg",bsx,bsy,cpx,cpy);
     1262lab[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1263cpx += bsx+spx;
     1264txt[2] = new PIText(this,"",0.5*bsx,bsy,cpx,cpy);
    13841265txt[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1385 cpx += bsx+spx;
    1386 lab[3] = new PILabel(this,"Iter",bsx, bsy, cpx, cpy);
    1387 lab[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1266cpx += int(0.5*bsx+spx);
     1267lab[4] = new PILabel(this,"Stop X2",bsx,bsy,cpx,cpy);
     1268lab[4]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    13881269cpx += bsx+spx;
    13891270txt[3] = new PIText(this,"",bsx,bsy,cpx,cpy);
    13901271txt[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1272cpx += bsx+spx;
     1273lab[5] = new PILabel(this,"Iter",0.5*bsx, bsy, cpx, cpy);
     1274lab[5]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1275cpx += int(0.5*bsx+spx);
     1276txt[4] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
     1277txt[4]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    13911278
    13921279// new ligne
    13931280cpx = spx; cpy += bsy+spy;
    1394 lab[4] = new PILabel(this,"Range X",bsx,bsy,cpx,cpy);
    1395 lab[4]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1281lab[6] = new PILabel(this,"Range X",bsx,bsy,cpx,cpy);
     1282lab[6]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    13961283cpx += bsx+spx;
    1397 txt[4] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    1398 txt[4]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1399 cpx += int(0.75*bsx+spx);
    14001284txt[5] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    14011285txt[5]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14021286cpx += int(0.75*bsx+spx);
    1403 lab[5] = new PILabel(this,"Y",bsx/2,bsy,cpx,cpy);
    1404 lab[5]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1405 cpx += int(bsx/2.+spx);
    14061287txt[6] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    14071288txt[6]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14081289cpx += int(0.75*bsx+spx);
     1290lab[7] = new PILabel(this,"Y",bsx/2,bsy,cpx,cpy);
     1291lab[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1292cpx += int(bsx/2.+spx);
    14091293txt[7] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
    14101294txt[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1295cpx += int(0.75*bsx+spx);
     1296txt[8] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy);
     1297txt[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14111298
    14121299// new ligne
    14131300cpx = spx; cpy += bsy+spy;
    1414 lab[6] = new PILabel(this,"Cent",bsx/2,bsy,cpx,cpy);
    1415 lab[6]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1301lab[8] = new PILabel(this,"Cent",bsx/2,bsy,cpx,cpy);
     1302lab[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14161303cpx += int(bsx/2.+spx);
    14171304pom[1] = new PIOptMenu(this,"X.No",1.25*bsx,bsy,cpx,cpy);
     
    14221309pom[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14231310cpx += int(1.25*bsx+spx);
    1424 txt[8] = new PIText(this,"",bsx,bsy,cpx,cpy);
    1425 txt[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1311txt[9] = new PIText(this,"",bsx,bsy,cpx,cpy);
     1312txt[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14261313cpx += bsx+spx;
    14271314pom[2] = new PIOptMenu(this,"Y.No",1.25*bsx,bsy,cpx,cpy);
     
    14321319pom[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14331320cpx += int(1.25*bsx+spx);
    1434 txt[9] = new PIText(this,"",bsx,bsy,cpx,cpy);
    1435 txt[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1321txt[10] = new PIText(this,"",bsx,bsy,cpx,cpy);
     1322txt[10]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14361323
    14371324// new ligne
     
    14511338// new ligne
    14521339cpx = spx; cpy += bsy+spy;
    1453 lab[7] = new PILabel(this,"Par",bsx/2,bsy,cpx,cpy);
    1454 lab[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1340lab[9] = new PILabel(this,"Par",bsx/2,bsy,cpx,cpy);
     1341lab[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14551342cpx += int(bsx/2.+spx);
    1456 lab[8] = new PILabel(this,"Fx",bsx/3,bsy,cpx,cpy);
    1457 lab[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1343lab[10] = new PILabel(this,"Fx",bsx/3,bsy,cpx,cpy);
     1344lab[10]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14581345cpx += int(bsx/3.+spx);
    1459 lab[9] = new PILabel(this,"Init",bsx,bsy,cpx,cpy);
    1460 lab[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1461 cpx += bsx+spx;
    1462 lab[10] = new PILabel(this,"Step",bsx,bsy,cpx,cpy);
    1463 lab[10]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    1464 cpx += bsx+spx;
    1465 lab[11] = new PILabel(this,"Min",bsx,bsy,cpx,cpy);
     1346lab[11] = new PILabel(this,"Init",bsx,bsy,cpx,cpy);
    14661347lab[11]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14671348cpx += bsx+spx;
    1468 lab[12] = new PILabel(this,"Max",bsx,bsy,cpx,cpy);
     1349lab[12] = new PILabel(this,"Step",bsx,bsy,cpx,cpy);
    14691350lab[12]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1351cpx += bsx+spx;
     1352lab[13] = new PILabel(this,"Min",bsx,bsy,cpx,cpy);
     1353lab[13]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1354cpx += bsx+spx;
     1355lab[14] = new PILabel(this,"Max",bsx,bsy,cpx,cpy);
     1356lab[14]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14701357
    14711358// new lines: Parametres (npar lignes)
     
    14741361    cpx = spx; cpy += bsy+spy;
    14751362    char str[8]; sprintf(str,"P%d",i);
    1476     lab[13+i] = new PILabel(this,str,bsx/2,bsy,cpx,cpy);
    1477     lab[13+i]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1363    lab[15+i] = new PILabel(this,str,bsx/2,bsy,cpx,cpy);
     1364    lab[15+i]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14781365    cpx += int(bsx/2.+spx);
    14791366    // Attention pas de message entre 1500 et 2000 (permet 500 parametres!)
     
    14821369    cpx+=int(bsx/3.+spx);
    14831370    for(int j=0;j<4;j++) {
    1484       txt[10+4*i+j] = new PIText(this,"",bsx,bsy,cpx,cpy);
    1485       txt[10+4*i+j]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     1371      txt[15+4*i+j] = new PIText(this,"",bsx,bsy,cpx,cpy);
     1372      txt[15+4*i+j]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
    14861373      cpx += bsx+spx;
    14871374    }
     
    15231410int npar = mFitter->mNPar;
    15241411
     1412// Les menus d'options
     1413if(mFitter->mOpt.err_type==GeneralFitData::DefaultError)  pom[0]->SetValue(2101);
     1414if(mFitter->mOpt.err_type==GeneralFitData::ConstantError) pom[0]->SetValue(2102);
     1415if(mFitter->mOpt.err_type==GeneralFitData::SqrtError)     pom[0]->SetValue(2103);
     1416if(mFitter->mOpt.err_type==GeneralFitData::ProporError)   pom[0]->SetValue(2104);
     1417
    15251418// Les check-boxes
    15261419ckb[0]->SetState(mFitter->mOpt.okfun);
     
    15311424// Les champs textes
    15321425char str[128]; string dum;
    1533 sprintf(str,"%f",ErrValue); dum=str; txt[0]->SetText(dum);
    1534 sprintf(str,"%d,%d",mFitter->mOpt.lp,mFitter->mOpt.lpg); dum=str; txt[1]->SetText(dum);
    1535 sprintf(str,"%f",mFitter->mOpt.stc2);  dum=str; txt[2]->SetText(dum);
    1536 sprintf(str,"%d",mFitter->mOpt.nstep); dum=str; txt[3]->SetText(dum);
    1537 sprintf(str,"%d",mFitter->mOpt.i1);    dum=str; txt[4]->SetText(dum);
    1538 sprintf(str,"%d",mFitter->mOpt.i2);    dum=str; txt[5]->SetText(dum);
    1539 sprintf(str,"%d",mFitter->mOpt.j1);    dum=str; txt[6]->SetText(dum);
    1540 sprintf(str,"%d",mFitter->mOpt.j2);    dum=str; txt[7]->SetText(dum);
    1541 sprintf(str,"%f",mFitter->mOpt.xc);    dum=str; txt[8]->SetText(dum);
    1542 sprintf(str,"%f",mFitter->mOpt.yc);    dum=str; txt[9]->SetText(dum);
     1426sprintf(str,"%f",mFitter->mOpt.err_scale); dum=str; txt[0]->SetText(dum);
     1427sprintf(str,"%f",mFitter->mOpt.err_min);   dum=str; txt[1]->SetText(dum);
     1428sprintf(str,"%d,%d",mFitter->mOpt.lp,mFitter->mOpt.lpg); dum=str; txt[2]->SetText(dum);
     1429sprintf(str,"%f",mFitter->mOpt.stc2);  dum=str; txt[3]->SetText(dum);
     1430sprintf(str,"%d",mFitter->mOpt.nstep); dum=str; txt[4]->SetText(dum);
     1431sprintf(str,"%d",mFitter->mOpt.i1);    dum=str; txt[5]->SetText(dum);
     1432sprintf(str,"%d",mFitter->mOpt.i2);    dum=str; txt[6]->SetText(dum);
     1433sprintf(str,"%d",mFitter->mOpt.j1);    dum=str; txt[7]->SetText(dum);
     1434sprintf(str,"%d",mFitter->mOpt.j2);    dum=str; txt[8]->SetText(dum);
     1435sprintf(str,"%f",mFitter->mOpt.xc);    dum=str; txt[9]->SetText(dum);
     1436sprintf(str,"%f",mFitter->mOpt.yc);    dum=str; txt[10]->SetText(dum);
    15431437if(npar>0) {
    15441438  for(int i=0;i<npar;i++) {
    1545     sprintf(str,"%f",mFitter->mPar(i));  dum=str; txt[10+4*i+0]->SetText(dum);
    1546     sprintf(str,"%f",mFitter->mStep(i)); dum=str; txt[10+4*i+1]->SetText(dum);
    1547     sprintf(str,"%f",mFitter->mMin(i));  dum=str; txt[10+4*i+2]->SetText(dum);
    1548     sprintf(str,"%f",mFitter->mMax(i));  dum=str; txt[10+4*i+3]->SetText(dum);
     1439    sprintf(str,"%f",mFitter->mPar(i));  dum=str; txt[15+4*i+0]->SetText(dum);
     1440    sprintf(str,"%f",mFitter->mStep(i)); dum=str; txt[15+4*i+1]->SetText(dum);
     1441    sprintf(str,"%f",mFitter->mMin(i));  dum=str; txt[15+4*i+2]->SetText(dum);
     1442    sprintf(str,"%f",mFitter->mMax(i));  dum=str; txt[15+4*i+3]->SetText(dum);
    15491443  }
    15501444}
     
    15731467  cout<<"PIAFitterWind::Process Error , Pas d'objet de nom "
    15741468      <<mFitter->mNObj<<endl;
    1575   mFitter->ResetDPointer(); return;
     1469  return;
    15761470}
    15771471
    15781472// On recupere les champs textes
    15791473string dum; char str[128];
    1580 // Attention gestion du type d'erreur
     1474// Attention gestion du type d'erreur (scale et min)
    15811475dum=txt[0]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    1582   sscanf(str,"%lf",&ErrValue); if(ErrValue<=0.) ErrValue=1.;
    1583   if(mFitter->mOpt.err_e>0. ) mFitter->mOpt.err_e = ErrValue;
    1584   if(mFitter->mOpt.err_E>0. ) mFitter->mOpt.err_E = ErrValue;
    1585   if(saveErrValue!=ErrValue) {
    1586     if(lp) cout<<"ErrValue changed: "<<ErrValue<<endl;
     1476  sscanf(str,"%lf",&(mFitter->mOpt.err_scale));
     1477  if(saveErrScale!=mFitter->mOpt.err_scale) {
     1478    if(lp) cout<<"ErrScale changed: "<<mFitter->mOpt.err_scale<<endl;
    15871479    ReFillGData = true;
    1588     saveErrValue = ErrValue;
     1480    saveErrScale = mFitter->mOpt.err_scale;
    15891481  }
    15901482dum=txt[1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1483  sscanf(str,"%lf",&(mFitter->mOpt.err_min));
     1484  if(saveErrMin!=mFitter->mOpt.err_min) {
     1485    if(lp) cout<<"ErrMin changed: "<<mFitter->mOpt.err_min<<endl;
     1486    ReFillGData = true;
     1487    saveErrMin = mFitter->mOpt.err_min;
     1488  }
     1489dum=txt[2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    15911490  sscanf(str,"%d,%d",&(mFitter->mOpt.lp),&(mFitter->mOpt.lpg));
    1592 dum=txt[2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1491dum=txt[3]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    15931492  sscanf(str,"%lf",&(mFitter->mOpt.stc2));
    1594 dum=txt[3]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1493dum=txt[4]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    15951494  sscanf(str,"%d",&(mFitter->mOpt.nstep));
    15961495// Attention si les valeurs de mOpt.i1/.i2/.j1/.j2 ont ete changees
    1597 dum=txt[4]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1496dum=txt[5]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    15981497  sscanf(str,"%d",&(mFitter->mOpt.i1));
    1599 dum=txt[5]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1498dum=txt[6]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16001499  sscanf(str,"%d",&(mFitter->mOpt.i2));
    1601 dum=txt[6]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1500dum=txt[7]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16021501  sscanf(str,"%d",&(mFitter->mOpt.j1));
    1603 dum=txt[7]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1502dum=txt[8]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16041503  sscanf(str,"%d",&(mFitter->mOpt.j2));
    16051504  if(saveI1!=mFitter->mOpt.i1 || saveI2!=mFitter->mOpt.i2 ||
     
    16151514    saveJ1=mFitter->mOpt.j1; saveJ2=mFitter->mOpt.j2;
    16161515  }
    1617 dum=txt[8]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1516dum=txt[9]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16181517  sscanf(str,"%lf",&(mFitter->mOpt.xc));
    1619 dum=txt[9]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1518dum=txt[10]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16201519  sscanf(str,"%lf",&(mFitter->mOpt.yc));
    16211520  if(saveXC!=mFitter->mOpt.xc || saveYC!=mFitter->mOpt.yc) {
    16221521    if(lp) cout<<"mOpt.xc,yc changed: "<<mFitter->mOpt.xc
    16231522               <<" , "<<mFitter->mOpt.xc<<endl;
    1624     ReFillGData = true; ReDecodeFunc = true;
     1523    ReDecodeFunc = true;
    16251524    saveXC = mFitter->mOpt.xc; saveYC = mFitter->mOpt.yc;
    16261525  }
     
    16281527if(npar>0) {
    16291528  for(int i=0;i<npar;i++) {
    1630     dum=txt[10+4*i+0]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1529    dum=txt[15+4*i+0]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16311530      sscanf(str,"%lf",&(mFitter->mPar(i)));
    1632     dum=txt[10+4*i+1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1531    dum=txt[15+4*i+1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16331532      sscanf(str,"%lf",&(mFitter->mStep(i)));
    1634     dum=txt[10+4*i+2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1533    dum=txt[15+4*i+2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16351534      sscanf(str,"%lf",&(mFitter->mMin(i)));
    1636     dum=txt[10+4*i+3]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
     1535    dum=txt[15+4*i+3]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');
    16371536      sscanf(str,"%lf",&(mFitter->mMax(i)));
    16381537  }
     
    16451544  if(ReFillGData) mFitter->FillGData();
    16461545  ReFillGData = false;
     1546  if(ReDecodeFunc) mFitter->DecodeFunction(mFunc);
     1547  ReDecodeFunc = false;
    16471548}
    16481549else if(msg ==111) {
    16491550  if(lp) cout<<"Update from last"<<endl;
    1650   mFitter->ResetOptions();
    16511551  mFitter->mOpt = mFitter->mOptSave;
    16521552  mFitter->ReSetParam();
    16531553  mFitter->InitParFromLastFit();
    1654   ReFillGData = true;
     1554  ReFillGData = ReDecodeFunc = true;
    16551555}
    16561556else if(msg ==222) {
     
    16581558  mFitter->ResetOptions();
    16591559  mFitter->ReSetParam();
    1660   ReFillGData = true;
     1560  ReFillGData = ReDecodeFunc = true;
    16611561}
    16621562else if(msg ==333) {
    16631563  if(lp) cout<<"Do the fit"<<endl;
    16641564  mFitter->CheckOptions();
    1665   if(ReFillGData) {
    1666     if(lp) cout<<"ReFill Data"<<endl;
    1667     mFitter->FillGData();
    1668   }
     1565  if(ReFillGData) mFitter->FillGData();
    16691566  ReFillGData = false;
    16701567  if(ReDecodeFunc) mFitter->DecodeFunction(mFunc);
     
    16951592  }
    16961593}
    1697 else if(2101<=msg && msg<=2103) {
    1698   mFitter->mOpt.err_e = mFitter->mOpt.err_E = -1.;
    1699   if(msg==2102)      mFitter->mOpt.err_e = ErrValue;
    1700   else if(msg==2103) mFitter->mOpt.err_E = ErrValue;
    1701   if(lp) cout<<"Err_cste="<<mFitter->mOpt.err_e
    1702              <<" Err_sqrt="<<mFitter->mOpt.err_E
    1703              <<" ErrValue="<<ErrValue<<endl;
     1594else if(2101<=msg && msg<=2104) {
     1595  if(msg==2101)
     1596    {mFitter->mOpt.err_type = GeneralFitData::DefaultError; dum="DefaultError";}
     1597  if(msg==2102)
     1598    {mFitter->mOpt.err_type = GeneralFitData::ConstantError; dum="ConstantError";}
     1599  if(msg==2103)
     1600    {mFitter->mOpt.err_type = GeneralFitData::SqrtError; dum="SqrtError";}
     1601  if(msg==2104)
     1602    {mFitter->mOpt.err_type = GeneralFitData::ProporError; dum="ProporError";}
     1603  if(lp) cout<<"Err_type="<<dum
     1604             <<" Err_scale="<<mFitter->mOpt.err_scale
     1605             <<" Err_min="<<mFitter->mOpt.err_min<<endl;
    17041606  ReFillGData = true;
    17051607}
     
    17081610  if(lp) cout<<"Centrage X polcx="<<mFitter->mOpt.polcx
    17091611             <<" xc="<<mFitter->mOpt.xc<<endl;
    1710   ReFillGData = true; ReDecodeFunc = true;
     1612  mFitter->GetCentering();
     1613  ReDecodeFunc = true;
    17111614}
    17121615else if(2011<=msg && msg<=2013) {
     
    17141617  if(lp) cout<<"Centrage Y polcy="<<mFitter->mOpt.polcy
    17151618             <<" yc="<<mFitter->mOpt.yc<<endl;
    1716   ReFillGData = true; ReDecodeFunc = true;
     1619  mFitter->GetCentering();
     1620  ReDecodeFunc = true;
    17171621}
    17181622else if(msg>=1500 && msg<2000) {
Note: See TracChangeset for help on using the changeset viewer.