Changeset 385 in Sophya for trunk/SophyaPI
- Timestamp:
- Aug 13, 1999, 12:51:54 AM (26 years ago)
- Location:
- trunk/SophyaPI/PIext
- Files:
-
- 1 added
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaPI/PIext/exclude
r293 r385 1 1 modrecst.cc 2 userfitfunex.c -
trunk/SophyaPI/PIext/piafitting.cc
r384 r385 56 56 bool ReFillGData; 57 57 int saveI1,saveI2, saveJ1, saveJ2; 58 double ErrValue; 58 59 }; 59 60 … … 103 104 //| : M : fit Moffat+fond (expos=p6) (volume) 2D 104 105 //| : Mi : fit Moffat+fond integree (expos=p6) (volume) 2D 106 //| : Autre : fonction definie par l'utilisateur (cf commentaires ci apres) 105 107 //| 106 108 //|----- INIT PARAMETRES ET ETAT DU FIT ----- … … 139 141 //| Pour gauss+poly 1D, xc est le centre de la gaussienne. 140 142 //|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 //| 141 167 //////////////////////////////////////////////////////////////////////// 142 168 … … 144 170 PIAFitter::PIAFitter(PIACmd *piac, PIStdImgApp* app) 145 171 : mApp(app), FWindFit(NULL) 146 , mNObj(""), mObj(NULL), m Func(NULL), mFName(""), mGData(NULL)172 , mNObj(""), mObj(NULL), mGData(NULL) 147 173 , mNPar(0), mNVar(0), mNBinX(0), mNBinY(0), mNData(0) 148 174 , mPar(1), mStep(1), mMin(1), mMax(1), mFix(1) … … 150 176 , mFit(NULL) 151 177 , mV(NULL), mH(NULL), mM(NULL), mH2(NULL), mIm(NULL), mG(NULL) 178 , mFunction(NULL), mFName(""), mFunc(NULL) 152 179 , mDlUFunc(NULL), mNameFitFunc(""), mFitFunc(NULL), mFitFuncDer(NULL) 153 180 , mUFNVar(0), mUFNPar(0) … … 180 207 181 208 kw = "crfitfun"; 182 usage = "Creation de user function";209 usage = "Creation et link de function utilisateur pour le fit"; 183 210 usage += "\n Usage: crfitfun file func nvar npar"; 184 211 piac->RegisterCommand(kw,usage,this,"Fitting"); 212 213 kw = "crfitfil"; 214 usage = "Creation de fichier C pour function utilisateur du fit"; 215 usage += "\n Usage: crfitfil file func nvar npar"; 216 piac->RegisterCommand(kw,usage,this,"Fitting"); 185 217 } 186 218 … … 188 220 PIAFitter::~PIAFitter() 189 221 { 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; 222 if(mFit != NULL) {delete mFit; mFit=NULL;} 223 if(mFunction != NULL) {delete mFunction; mFunction=NULL;} 224 if(mFunc != NULL) {delete mFunc; mFunc=NULL;} 225 if(mGData != NULL) {delete mGData; mGData=NULL;} 226 if(FWindFit != NULL) {delete FWindFit; FWindFit=NULL;} 227 if (mDlUFunc != NULL) {delete mDlUFunc; mDlUFunc=NULL;} 195 228 } 196 229 … … 402 435 <<" Cent="<<mOpt.polcx<<","<<mOpt.polcy<<","<<mOpt.xc<<"+x"<<","<<mOpt.yc<<"+y" 403 436 <<" 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 405 439 <<" lp,lpg="<<mOpt.lp<<","<<mOpt.lpg<<endl; 406 440 return; … … 464 498 // ATTENTION: cette methode a besoin que les donnees soient lues 465 499 { 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 500 if(func.length()<=0) 501 {cout<<"PIAFitter::DecodeFunction Donnez un nom de fonction a fitter."<<endl; 502 return;} 503 if(mFunction!=NULL) {delete mFunction; mFunction=NULL;} 504 if(mFunc!=NULL) {delete mFunc; mFunc=NULL;} 472 505 mNPar=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",°re); 506 507 if(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",°re); 478 512 cout<<"Fit polynome 1D de degre "<<degre<<endl; 479 513 Polyn1D* myf = new Polyn1D(degre,mOpt.xc); 480 mFunc = myf; mNPar = mFunc->NPar();514 mFunction = myf; mNPar = mFunction->NPar(); mFName = func; 481 515 482 516 } else if(func[0]=='e' && mNVar==1) { //exponentielle 483 int degre =-1; 484 if(func.length()>1) sscanf(func.c_str()+1,"%d",°re); 517 int degre=-1; if(func.length()>1) sscanf(func.c_str()+1,"%d",°re); 485 518 cout<<"Fit d'exponentielle+polynome 1D de degre "<<degre<<endl; 486 519 Exp1DPol* myf; 487 520 if(degre>=0) myf = new Exp1DPol((unsigned int)degre,mOpt.xc); 488 521 else myf = new Exp1DPol(mOpt.xc); 489 mFunc = myf; mNPar = mFunc->NPar();522 mFunction = myf; mNPar = mFunction->NPar(); mFName = func; 490 523 491 524 } 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",°re); 525 int degre=-1; if(func.length()>1) sscanf(func.c_str()+1,"%d",°re); 494 526 cout<<"Fit de Gaussienne_en_hauteur+polynome 1D de degre "<<degre<<endl; 495 527 Gauss1DPol* myf; 496 528 if(degre>=0) myf = new Gauss1DPol((unsigned int)degre,((mOpt.polcx)?true:false)); 497 529 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; 499 531 500 532 } 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",°re); 533 int degre=-1; if(func.length()>1) sscanf(func.c_str()+1,"%d",°re); 503 534 cout<<"Fit de Gaussienne_en_volume+polynome 1D de degre "<<degre<<endl; 504 535 GaussN1DPol* myf; 505 536 if(degre>=0) myf = new GaussN1DPol((unsigned int)degre,((mOpt.polcx)?true:false)); 506 537 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; 508 539 509 540 } else if(func[0]=='p' && mNVar==2) { //polynome 2D 510 int degre = 0; 511 if(func.length()>1) sscanf(func.c_str()+1,"%d",°re); 541 int degre=0; if(func.length()>1) sscanf(func.c_str()+1,"%d",°re); 512 542 cout<<"Fit polynome 2D de degre "<<degre<<endl; 513 543 Polyn2D* myf = new Polyn2D(degre,mOpt.xc,mOpt.yc); 514 mFunc = myf; mNPar = mFunc->NPar();544 mFunction = myf; mNPar = mFunction->NPar(); mFName = func; 515 545 516 546 } 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; 519 548 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; 523 552 524 553 } 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; 527 555 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; 531 559 532 560 } 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; 535 562 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; 539 566 540 567 } 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; 543 569 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; 547 573 548 574 } else { 549 575 cout<<"Fonction "<<func<<" inconnue pour la dim "<<mNVar<<endl; 550 mNPar = 0;551 576 return; 552 577 } … … 621 646 { 622 647 if(mNPar==0) return -1000; 623 if(mFunc==NULL || mGData==NULL) { 624 cout<<"PIAFitter::DoFit error: mFunc="<<mFunc<<" mGData="<<mGData<<endl; 648 if((mFunction==NULL && mFunc==NULL) || mGData==NULL) { 649 cout<<"PIAFitter::DoFit error: mFunction,mFunc="<<mFunction<<","<<mFunc 650 <<" mGData="<<mGData<<endl; 625 651 return -1001; 626 652 } 627 653 // classe GeneraFit 628 654 if(mFit != NULL) {delete mFit; mFit= NULL;} 629 mFit= new GeneralFit(mFunc); 655 if(mFunction) mFit= new GeneralFit(mFunction); 656 else mFit= new GeneralFit(mFunc); 630 657 // Options et Set de GeneralFit 631 658 mFit->SetDebug(mOpt.lpg); … … 633 660 mFit->SetStopChi2(mOpt.stc2); 634 661 mFit->SetMaxStep(mOpt.nstep); 635 {for(int i=0;i<m Func->NPar();i++) {662 {for(int i=0;i<mNPar;i++) { 636 663 char str[10]; 637 664 sprintf(str,"P%d",i); … … 651 678 c2r = mFit->GetChi2Red(); 652 679 cout<<"C2r_Reduit = "<<c2r<<" nstep="<<mFit->GetNStep()<<" rc="<<rcfit<<endl; 653 for(int i=0;i<m Func->NPar();i++) mParSave(i)=mFit->GetParm(i);680 for(int i=0;i<mNPar;i++) mParSave(i)=mFit->GetParm(i); 654 681 } else { 655 682 cout<<"echec Fit, rc = "<<rcfit<<" nstep="<<mFit->GetNStep()<<endl; … … 664 691 // Mise a disposition des resultats (fonction fitee et residus) 665 692 { 666 if(mF unc&& (mOpt.okres||mOpt.okfun)) {693 if(mFit && (mOpt.okres||mOpt.okfun)) { 667 694 NamedObjMgr omg; 668 695 string nomres = mNObj + "_res"; … … 730 757 731 758 /* --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 = ""; 759 void PIAFitter::LinkFitFunc(string const& fname, string const& funcname 760 ,int nvar,int npar) 761 // Compilation et link dynamique de la fonction a fitter 762 { 763 if(nvar<1 || npar<1) return; 764 if(mDlUFunc != NULL) {delete mDlUFunc; mDlUFunc=NULL;} 765 mFitFunc = NULL; mFitFuncDer = NULL; 766 mUFNVar= mUFNPar = 0; mNameFitFunc = ""; 744 767 745 768 // On compile le fichier C, on fabrique un .so et on l'ouvre 746 769 mDlUFunc = PDynLinkMgr::BuildFromCFile(fname); 747 if (mDlUFunc == NULL) { 748 cerr << "PIAFitter::LinkFitFunc() Erreur building .so " << endl; 749 return; 750 } 770 if(mDlUFunc == NULL) 771 {cerr<<"PIAFitter::LinkFitFunc() Erreur building .so "<<endl; return;} 751 772 752 773 // On recupere la fonction de fit 753 774 mFitFunc = (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 775 if(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 762 780 string fnameder = funcname+"_der"; 763 781 mFitFuncDer = (DlUserFitFuncDer) mDlUFunc->GetFunction(fnameder); 764 if (mFitFunc == NULL) {765 cout << "PIAFitter::LinkFitFunc() No derive for " << fnameder << endl;766 } 767 782 if(mFitFuncDer == NULL) 783 {cout<<"PIAFitter::LinkFitFunc() No derive for"<<fnameder<<endl;} 784 785 // Variables et pointeurs definissant le link a la fonction utilisateur 768 786 mNameFitFunc = funcname; 769 787 mUFNVar = nvar; 770 788 mUFNPar = 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 789 cout<<"PIAFitter::LinkFitFunc() UserFitFunc="<<mNameFitFunc 790 <<" NVar="<<mUFNVar<<" NPar="<<mUFNPar<<endl; 791 792 return; 793 } 794 795 /* --Methode-- */ 796 void 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 { 800 if(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 808 FILE* fip = fopen(fname.c_str(),"w"); 809 if(fip==NULL) 810 {cerr<<"PIAFitter::PrepareFitFuncCFile: error opening file for writing\n" 811 <<fname<<endl; return;} 812 813 fprintf(fip,"#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n\n"); 814 fprintf(fip,"/* - many functions can be written in this file: */\n"); 815 fprintf(fip,"/* here is an exemple for creation of function %s */\n\n" 816 ,funcname.c_str()); 817 fprintf(fip,"double %s(double const* x,double const* p)\n",funcname.c_str()); 818 fprintf(fip,"/* Function : F(x[0-%d];p[0-%d]) */\n",nvar-1,npar-1); 819 fprintf(fip,"/* variables x1=x[0],x2=x[1],...,x%d=x[%d] */\n",nvar,nvar-1); 820 fprintf(fip,"/* parameters p1=p[0],p2=p[1],...,p%d=p[%d] */\n",nvar,nvar-1); 821 fprintf(fip,"{\n val = F(x[];p[]);\n return(val);\n}\n\n"); 822 string fder = funcname + "_der"; 823 fprintf(fip,"/* That function is optional */\n"); 824 fprintf(fip,"/*\n"); 825 fprintf(fip,"double %s(double const* x,double const* p,double* dp)\n",fder.c_str()); 826 fprintf(fip,"{\n"); 827 for(int i=0;i<npar;i++) fprintf(fip," dp[%d] = dF(x[];p[])/dp[%d]\n",i,i); 828 fprintf(fip," val = F(x[];p[]);\n return(val);\n}\n\n"); 829 fprintf(fip,"*/\n"); 830 831 fclose(fip); 780 832 } 781 833 … … 784 836 // Execution des commandes de fit : "fit" et "fitw" 785 837 { 838 ////// Les commandes pour creer les fonctions de fit utilisateur 839 if(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 786 854 if(tokens.size() < 2) { 787 855 cout … … 825 893 FWindFit = new PIAFitterWind(mApp,this); 826 894 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 } 836 896 837 897 return(0); … … 844 904 /* --Methode-- */ 845 905 PIAFitterWind::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 { 854 910 int npar = mFitter->mNPar; 855 911 856 912 // 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 = 2 0+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;}913 nlab = 14+npar; lab = new PILabel*[nlab]; {for(int i=0;i<nlab;i++) lab[i]=NULL;} 914 ntxt = 10+4*npar; txt = new PIText*[ntxt]; {for(int i=0;i<ntxt;i++) txt[i]=NULL;} 915 nbut = 5; but = new PIButton*[nbut]; {for(int i=0;i<nbut;i++) but[i]=NULL;} 916 nckb = 2+npar; ckb = new PICheckBox*[nckb]; {for(int i=0;i<nckb;i++) ckb[i]=NULL;} 917 npom = 3; pom = new PIOptMenu*[npom]; {for(int i=0;i<npom;i++) pom[i]=NULL;} 862 918 863 919 // On definit la taille a partir de la taille par defaut des composantes … … 869 925 870 926 int wszx = (5*bsx+5*spx)+spx; 871 int wszy = 9*(bsy+spy)+npar*(bsy+spy)+spy;927 int wszy = 8*(bsy+spy)+npar*(bsy+spy)+spy; 872 928 SetSize(wszx, wszy); 873 929 int cpx,cpy; 874 930 875 931 // new ligne 876 cpx=spx; cpy=spy; 932 cpx = spx; cpy = spy; 933 lab[0] = new PILabel(this,mFitter->mNObj.c_str(),4*bsx,bsy,cpx,cpy); 934 lab[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 935 936 // new ligne 937 cpx = spx; cpy += bsy+spy; 877 938 but[0] = new PIButton(this,"Fr.Last",111,bsx,bsy,cpx,cpy); 878 939 but[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); … … 880 941 but[1] = new PIButton(this,"Default",222,bsx,bsy,cpx,cpy); 881 942 but[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 882 cpx +=bsx+spx;943 cpx += bsx+spx; 883 944 ckb[0] = new PICheckBox(this,"Gen Fun",1001,bsx,bsy,cpx,cpy); 884 945 ckb[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); … … 888 949 889 950 // 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); 951 cpx = spx; cpy += bsy+spy; 952 pom[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); 903 956 pom[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 904 cpx +=bsx+spx;957 cpx += int(1.5*bsx+spx); 905 958 txt[0] = new PIText(this,"",bsx,bsy,cpx,cpy); 906 959 txt[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; 960 cpx += bsx+spx; 961 lab[1] = new PILabel(this,"Prt,dbg",bsx,bsy,cpx,cpy); 962 lab[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 963 cpx += bsx+spx; 914 964 txt[1] = new PIText(this,"",bsx,bsy,cpx,cpy); 915 965 txt[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 916 966 917 967 // new ligne 918 cpx =spx; cpy += bsy+spy;919 lab[2] = new PILabel(this," Err cste",1.25*bsx,bsy,cpx,cpy);968 cpx = spx; cpy += bsy+spy; 969 lab[2] = new PILabel(this,"Stop Xi2",1.25*bsx,bsy,cpx,cpy); 920 970 lab[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 921 cpx +=1.25*bsx+spx;971 cpx += int(1.25*bsx+spx); 922 972 txt[2] = new PIText(this,"",bsx,bsy,cpx,cpy); 923 973 txt[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);974 cpx += bsx+spx; 975 lab[3] = new PILabel(this,"Iter",bsx, bsy, cpx, cpy); 926 976 lab[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 927 cpx +=bsx+spx;977 cpx += bsx+spx; 928 978 txt[3] = new PIText(this,"",bsx,bsy,cpx,cpy); 929 979 txt[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 930 980 931 981 // new ligne 932 cpx =spx; cpy += bsy+spy;933 lab[4] = new PILabel(this," Stop Xi2",1.25*bsx,bsy,cpx,cpy);982 cpx = spx; cpy += bsy+spy; 983 lab[4] = new PILabel(this,"Range X",bsx,bsy,cpx,cpy); 934 984 lab[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);985 cpx += bsx+spx; 986 txt[4] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy); 937 987 txt[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); 988 cpx += int(0.75*bsx+spx); 989 txt[5] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy); 990 txt[5]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 991 cpx += int(0.75*bsx+spx); 992 lab[5] = new PILabel(this,"Y",bsx/2,bsy,cpx,cpy); 940 993 lab[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); 994 cpx += int(bsx/2.+spx); 995 txt[6] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy); 996 txt[6]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 997 cpx += int(0.75*bsx+spx); 998 txt[7] = new PIText(this,"",0.75*bsx,bsy,cpx,cpy); 999 txt[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 944 1000 945 1001 // new ligne 946 cpx =spx; cpy += bsy+spy;947 lab[6] = new PILabel(this," Print",bsx,bsy,cpx,cpy);1002 cpx = spx; cpy += bsy+spy; 1003 lab[6] = new PILabel(this,"Cent",bsx/2,bsy,cpx,cpy); 948 1004 lab[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); 1005 cpx += int(bsx/2.+spx); 1006 pom[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); 1010 pom[1]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1011 cpx += int(1.25*bsx+spx); 1012 txt[8] = new PIText(this,"",bsx,bsy,cpx,cpy); 1013 txt[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1014 cpx += bsx+spx; 1015 pom[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); 1019 pom[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1020 cpx += int(1.25*bsx+spx); 1021 txt[9] = new PIText(this,"",bsx,bsy,cpx,cpy); 1022 txt[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 958 1023 959 1024 // 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; 1025 cpx = spx; cpy += bsy+spy; 981 1026 but[2] = new PIButton(this, "Dismiss",777,bsx,bsy,cpx,cpy); 982 1027 but[2]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 983 1028 cpx += bsx+spx; 984 but[3] = new PIButton(this, " Refesh",666,bsx,bsy,cpx,cpy);1029 but[3] = new PIButton(this, "Check",666,bsx,bsy,cpx,cpy); 985 1030 but[3]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 986 1031 cpx += bsx+spx; 987 1032 but[4] = new PIButton(this, "Fit",333,bsx,bsy,cpx,cpy); 988 1033 but[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); 1034 cpx += bsx+spx; 1035 lab[7] = new PILabel(this,mFitter->mFName.c_str(),2*bsx,bsy,cpx,cpy); 1036 lab[7]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1037 1038 // new ligne 1039 cpx = spx; cpy += bsy+spy; 1040 lab[8] = new PILabel(this,"Par",bsx/2,bsy,cpx,cpy); 1041 lab[8]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1042 cpx += int(bsx/2.+spx); 1043 lab[9] = new PILabel(this,"Fx",bsx/3,bsy,cpx,cpy); 1044 lab[9]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1045 cpx += int(bsx/3.+spx); 1046 lab[10] = new PILabel(this,"Init",bsx,bsy,cpx,cpy); 991 1047 lab[10]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1048 cpx += bsx+spx; 1049 lab[11] = new PILabel(this,"Step",bsx,bsy,cpx,cpy); 1050 lab[11]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1051 cpx += bsx+spx; 1052 lab[12] = new PILabel(this,"Min",bsx,bsy,cpx,cpy); 1053 lab[12]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 1054 cpx += bsx+spx; 1055 lab[13] = new PILabel(this,"Max",bsx,bsy,cpx,cpy); 1056 lab[13]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic); 992 1057 993 1058 // 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);1012 1059 if(npar>0) { 1013 1060 for(int i=0;i<npar;i++) { 1014 cpx =spx; cpy+=bsy+spy;1061 cpx = spx; cpy += bsy+spy; 1015 1062 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); 1019 1066 // Attention pas de message entre 1500 et 2000 (permet 500 parametres!) 1020 ckb[2 0+i] = new PICheckBox(this,"",1500+i,bsx/3,bsy,cpx,cpy);1021 ckb[2 0+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); 1023 1070 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; 1027 1074 } 1028 1075 } … … 1067 1114 ckb[1]->SetState(mFitter->mOpt.okres); 1068 1115 if(npar>0) 1069 for(int i=0;i<npar;i++) ckb[2 0+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); 1070 1117 1071 1118 // Les champs textes 1072 1119 char 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); 1120 sprintf(str,"%f",ErrValue); dum=str; txt[0]->SetText(dum); 1121 sprintf(str,"%d,%d",mFitter->mOpt.lp,mFitter->mOpt.lpg); dum=str; txt[1]->SetText(dum); 1122 sprintf(str,"%f",mFitter->mOpt.stc2); dum=str; txt[2]->SetText(dum); 1123 sprintf(str,"%d",mFitter->mOpt.nstep); dum=str; txt[3]->SetText(dum); 1124 sprintf(str,"%d",mFitter->mOpt.i1); dum=str; txt[4]->SetText(dum); 1125 sprintf(str,"%d",mFitter->mOpt.i2); dum=str; txt[5]->SetText(dum); 1126 sprintf(str,"%d",mFitter->mOpt.j1); dum=str; txt[6]->SetText(dum); 1127 sprintf(str,"%d",mFitter->mOpt.j2); dum=str; txt[7]->SetText(dum); 1128 sprintf(str,"%f",mFitter->mOpt.xc); dum=str; txt[8]->SetText(dum); 1129 sprintf(str,"%f",mFitter->mOpt.yc); dum=str; txt[9]->SetText(dum); 1085 1130 if(npar>0) { 1086 1131 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); 1091 1136 } 1092 1137 } … … 1100 1145 int lp = (mFitter->mOpt.lp>2)?1:0;; 1101 1146 int npar = mFitter->mNPar; 1147 1148 // Decodage des messages, init et dismiss 1149 msg = UserMsg(msg); 1150 if(msg ==777) { 1151 if(lp) cout<<"Dismiss"<<endl; 1152 //mDap->SetReady(); 1153 Hide(); 1154 return; 1155 } 1102 1156 1103 1157 // L'objet existe t-il encore? … … 1111 1165 // On recupere les champs textes 1112 1166 string dum; char str[128]; 1167 // Attention gestion du type d'erreur 1113 1168 dum=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; 1172 dum=txt[1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' '); 1173 sscanf(str,"%d,%d",&(mFitter->mOpt.lp),&(mFitter->mOpt.lpg)); 1174 dum=txt[2]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' '); 1175 sscanf(str,"%lf",&(mFitter->mOpt.stc2)); 1176 dum=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 1179 dum=txt[4]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' '); 1180 sscanf(str,"%d",&(mFitter->mOpt.i1)); 1181 dum=txt[5]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' '); 1182 sscanf(str,"%d",&(mFitter->mOpt.i2)); 1183 dum=txt[6]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' '); 1184 sscanf(str,"%d",&(mFitter->mOpt.j1)); 1185 dum=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 } 1199 dum=txt[8]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' '); 1114 1200 sscanf(str,"%lf",&(mFitter->mOpt.xc)); 1115 dum=txt[ 1]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' ');1201 dum=txt[9]->GetText(); strcpy(str,dum.c_str()); strip(str,'B',' '); 1116 1202 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 changees1131 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<<","<<saveI21142 <<") -> I("<<mFitter->mOpt.i1<<","<<mFitter->mOpt.i21143 <<") ou J("<<saveJ1<<","<<saveJ21144 <<") -> J("<<mFitter->mOpt.j1<<","<<mFitter->mOpt.j21145 <<")"<<endl;1146 ReFillGData = true;1147 saveI1=mFitter->mOpt.i1; saveI2=mFitter->mOpt.i2;1148 saveJ1=mFitter->mOpt.j1; saveJ2=mFitter->mOpt.j2;1149 }1150 1203 1151 1204 if(npar>0) { 1152 1205 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',' '); 1154 1207 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',' '); 1156 1209 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',' '); 1158 1211 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',' '); 1160 1213 sscanf(str,"%lf",&(mFitter->mMax(i))); 1161 1214 } 1162 1215 } 1163 1216 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 1218 if(msg ==666) { 1219 if(lp) cout<<"Check"<<endl; 1174 1220 mFitter->CheckOptions(); 1175 1221 if(ReFillGData) mFitter->FillGData(); … … 1216 1262 } 1217 1263 } 1264 else 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 } 1218 1273 else if(2001<=msg && msg<=2003) { 1219 1274 mFitter->mOpt.polcx = msg-2001; … … 1230 1285 else if(msg>=1500 && msg<2000) { 1231 1286 int ip = msg-1500; 1232 if(ckb[2 0+ip]->GetState()) {1287 if(ckb[2+ip]->GetState()) { 1233 1288 if(lp) cout<<"Fix Param "<<ip<<endl; 1234 1289 mFitter->mFix(ip) = 1.001; 1235 } else if(!ckb[2 0+ip]->GetState()) {1290 } else if(!ckb[2+ip]->GetState()) { 1236 1291 if(lp) cout<<"Not Fix Param "<<ip<<endl; 1237 1292 mFitter->mFix(ip) = 0.; -
trunk/SophyaPI/PIext/piafitting.h
r384 r385 24 24 class PIStdImgApp; 25 25 class PIAFitterWind; 26 class GeneralFunction; 26 class GeneralFunction; class GeneralFunc; class GeneralFit; 27 27 class GeneralFitData; 28 class GeneralFit; 29 class Histo; 30 class Matrix; class Histo2D; class RzImage; 28 class Histo; class Matrix; class Histo2D; class RzImage; 31 29 32 30 class PIAFitter : public CmdExecutor { … … 35 33 virtual ~PIAFitter(); 36 34 virtual int Execute(string& keyw, vector<string>& args); 37 virtual void LinkFitFunc(string const & fname, string const & funcname, int nvar, int npar); 38 virtual void PrepareFitFuncCFile(string const & fname, string const & funcname, int nvar, int npar); 35 virtual void LinkFitFunc(string const& fname, string const& funcname 36 ,int nvar,int npar); 37 virtual void PrepareFitFuncCFile(string const& fname, string const& funcname 38 ,int nvar,int npar); 39 39 40 40 friend class PIAFitterWind; … … 68 68 void LinFit(void); 69 69 70 // Graphique 70 71 PIStdImgApp* mApp; // Do not delete 71 PIAFitterWind* FWindFit; 72 PIAFitterWind* FWindFit; // Fenetre de config interactive 73 // Objet a fitter 72 74 string mNObj; AnyDataObj* mObj; // Do not delete 73 GeneralFunction* mFunc; string mFName; 75 // Structure de data pour le fit, parametres et options 74 76 GeneralFitData* mGData; 75 77 int mNPar,mNVar,mNBinX,mNBinY,mNData; … … 79 81 DFOPTIONS mOpt; 80 82 DFOPTIONS mOptSave; 81 // Objets a fitter83 // Possibles objets a fitter 82 84 Vector* mV; Histo* mH; // Do not delete 83 85 Matrix* mM; Histo2D* mH2; RzImage* mIm; // Do not delete 84 86 GeneralFitData* mG; // Do not delete 85 86 // Gestion de fonction de fit user 87 // Gestion des fonctions de fit predefinies 88 GeneralFunction* mFunction; string mFName; 89 // Gestion de fonction de fit definie par l'utilisateur 90 GeneralFunc* mFunc; 87 91 PDynLinkMgr* mDlUFunc; 88 92 string mNameFitFunc;
Note:
See TracChangeset
for help on using the changeset viewer.