Changeset 392 in Sophya for trunk


Ignore:
Timestamp:
Aug 13, 1999, 11:57:20 PM (26 years ago)
Author:
ercodmgr
Message:

Fitter avec init auto cmv 13/8/99

Location:
trunk/SophyaPI/PIext
Files:
2 edited

Legend:

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

    r390 r392  
    66//clic sur FIT 2sd fois -> core dump!!!
    77//
    8 //
    98#include <stdio.h>
    109#include <stdlib.h>
    1110#include <ctype.h>
    12 
    1311#include <iostream.h>
    14 
    1512#include <typeinfo>
    1613
    17 #include "piafitting.h"
    1814#include "strutil.h"
    19 
     15#include "nbtri.h"
    2016#include "generalfit.h"
    21 
    2217#include "fct1dfit.h"
    2318#include "fct2dfit.h"
    24 
    2519#include "matrix.h"
    2620#include "cvector.h"
    2721#include "ntuple.h"
    2822#include "cimage.h"
    29 
    3023#include "histos.h"
    3124#include "histos2.h"
     
    3326#include "hisprof.h"
    3427
     28#include "piafitting.h"
    3529#include "nobjmgr.h"
    3630#include "pistdimgapp.h"
     
    179173, mFit(NULL)
    180174, mV(NULL), mH(NULL), mM(NULL), mH2(NULL), mIm(NULL), mG(NULL)
    181 , mFunction(NULL), mFName(""), mFunc(NULL), mFitUserFunc(false)
     175, mFunction(NULL), mFName(""), mFunc(NULL)
    182176, mDlUFunc(NULL), mNameFitFunc(""), mFitFunc(NULL), mFitFuncDer(NULL)
    183177, mUFNVar(0), mUFNPar(0)
     
    507501   return;}
    508502if(mFunction!=NULL) {delete mFunction; mFunction=NULL;}
    509 if(mFunc!=NULL)     {delete mFunc;     mFunc=NULL;}
    510 mNPar=0;
    511 mFitUserFunc = false;
     503if(mFunc    !=NULL) {delete mFunc;     mFunc=NULL;}
     504mNPar=0; mFName = "";
    512505
    513506if(func == mNameFitFunc) { // Fonction utilisateur
    514507  mFunc = new GeneralFunc(mUFNVar,mUFNPar,mFitFunc,mFitFuncDer);
    515508  mNPar = mUFNPar;
    516   mFitUserFunc = true;
    517509  cout<<"Fonction utilisateur nvar="<<mUFNVar<<", npar="<<mNPar<<endl;
    518510} else if(func[0]=='p' && mNVar==1) { //polynome
     
    556548  cout<<"Fit de Gaussienne+Fond 2D integ="<<integ<<endl;
    557549  if(integ) {GauRhInt2D* myf = new GauRhInt2D; mFunction = myf;}
    558     else    {GauRho2D* myf = new GauRho2D; mFunction = myf;}
     550    else    {GauRho2D*   myf = new GauRho2D;  mFunction = myf;}
    559551  mNPar = mFunction->NPar(); mFName = func;
    560552
     
    563555  cout<<"Fit de DL de Gaussienne+Fond 2D integ="<<integ<<endl;
    564556  if(integ) {GdlRhInt2D* myf = new GdlRhInt2D; mFunction = myf;}
    565     else    {GdlRho2D*   myf = new GdlRho2D; mFunction = myf;}
     557    else    {GdlRho2D*   myf = new GdlRho2D;   mFunction = myf;}
    566558  mNPar = mFunction->NPar(); mFName = func;
    567559
     
    570562  cout<<"Fit de DL de Gaussienne+Fond avec coeff variable (p6) 2D integ="<<integ<<endl;
    571563  if(integ) {Gdl1RhInt2D* myf = new Gdl1RhInt2D; mFunction = myf;}
    572     else    {Gdl1Rho2D*   myf = new Gdl1Rho2D; mFunction = myf;}
     564    else    {Gdl1Rho2D*   myf = new Gdl1Rho2D;   mFunction = myf;}
    573565  mNPar = mFunction->NPar(); mFName = func;
    574566
     
    577569  cout<<"Fit de Moffat+Fond (expos=p6) 2D integ="<<integ<<endl;
    578570  if(integ) {MofRhInt2D* myf = new MofRhInt2D; mFunction = myf;}
    579     else    {MofRho2D*   myf = new MofRho2D; mFunction = myf;}
     571    else    {MofRho2D*   myf = new MofRho2D;   mFunction = myf;}
    580572   mNPar = mFunction->NPar(); mFName = func;
    581573
     
    606598// Initialisation automatique des parametres du fit
    607599{
    608 cout<<"CMV: to be done : PIAFitter::AutoIniFit"<<endl;
    609 if(mFitUserFunc) { // Fonction utilisateur
     600if(mFunc) { // Fonction utilisateur
    610601  cout<<"PIAFitter::AutoIniFit : Fonction utilisateur, pas d'init auto"<<endl;
    611 
    612602} else if(mFName[0]=='p' && mNVar==1) { //poly 1D
    613603  cout<<"PIAFitter::AutoIniFit : Auto Init type polynome 1D"<<endl;
    614 
    615 } else if(mFName[0]=='e' && mNVar==1) { //expo+pol 1D
    616   cout<<"PIAFitter::AutoIniFit : Auto Init type expo+pol 1D"<<endl;
     604  IniFitP1ou2D();
    617605
    618606} else if(mFName[0]=='g' && mNVar==1) { //gauss en haut 1D
    619607  cout<<"PIAFitter::AutoIniFit : Auto Init type gauss_haut+pol 1D"<<endl;
     608  IniFitGhP1D();
    620609
    621610} else if(mFName[0]=='G' && mNVar==1) { //gauss en vol 1D
    622611  cout<<"PIAFitter::AutoIniFit : Auto Init type gauss_vol+pol 1D"<<endl;
     612  IniFitGvP1D();
    623613
    624614} else if(mFName[0]=='p' && mNVar==2) { //poly 2D
    625615  cout<<"PIAFitter::AutoIniFit : Auto Init type polynome 2D"<<endl;
     616  IniFitP1ou2D();
    626617
    627618} else if((mFName[0]=='G'||mFName[0]=='d') && mNVar==2) { //gauss+fond en vol
    628619  cout<<"PIAFitter::AutoIniFit : Auto Init type gauss_vol+fond 2D"<<endl;
     620  IniFitGv2D();
    629621
    630622} else if(mFName[0]=='D' && mNVar==2) { //DLgauss+fond en vol 2D
    631623  cout<<"PIAFitter::AutoIniFit : Auto Init type DLgauss_vol+fond 2D"<<endl;
     624  IniFitGv2D();
    632625  Vector dum(mNPar);
    633626  dum = mPar;  mPar(6)=0.5;   mPar(7)=dum(6);
     
    639632} else if(mFName[0]=='M' && mNVar==2) { //Moffat+fond en vol 2D
    640633  cout<<"PIAFitter::AutoIniFit : Auto Init type moffat_vol+fond 2D"<<endl;
     634  IniFitGv2D();
    641635  Vector dum(mNPar);
    642636  dum = mPar;  mPar(6)=2.5;   mPar(7)=dum(6);
     
    715709// classe GeneraFit
    716710if(mFit != NULL) {delete mFit; mFit= NULL;}
    717 if(mFunction) mFit= new GeneralFit(mFunction);
    718   else        mFit= new GeneralFit(mFunc);
     711if(mFunction)    mFit = new GeneralFit(mFunction);
     712  else if(mFunc) mFit = new GeneralFit(mFunc);
     713if(!mFit) return(-1002);
     714
    719715// Options et Set de GeneralFit
    720716mFit->SetDebug(mOpt.lpg);
     
    767763    if(mOpt.okfun) {Matrix* ob = mM->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
    768764  } else if(mH2) {
    769     if(mOpt.okres) {Histo2D* ob = mH2->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
    770     if(mOpt.okfun) {Histo2D* ob = mH2->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
     765    if(mOpt.okres)
     766      {Histo2D* ob = mH2->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
     767    if(mOpt.okfun)
     768      {Histo2D* ob = mH2->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
    771769  } else if(mIm) {
    772770    if(mOpt.okres) {
     
    779777    }
    780778  } else if(mG) {
    781     if(mOpt.okres) {GeneralFitData* ob = mG->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
    782     if(mOpt.okfun) {GeneralFitData* ob = mG->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
     779    if(mOpt.okres)
     780      {GeneralFitData* ob = mG->FitResidus(*mFit);  if(ob) omg.AddObj(ob,nomres);}
     781    if(mOpt.okfun)
     782      {GeneralFitData* ob = mG->FitFunction(*mFit); if(ob) omg.AddObj(ob,nomfun);}
    783783  }
    784784}
     
    923923  return(-1);
    924924}
     925
    925926// decodage des arguments de la commande
    926927string mSp,mSs,mSm,mSM,mSf,mSo;
     
    938939    else if(c[0]=='o') {mSo += ","; mSo += c+2;}
    939940  }
     941
    940942// Execution des commandes
    941943DecodeOptions(mSo);
     
    960962}
    961963
     964/* --Methode-- */
     965void PIAFitter::IniFitP1ou2D(void)
     966{
     967if(mNPar==0) return;
     968mPar=0.; mStep=1.; mMin=1.; mMax=-1.; mFix=0.;
     969if(!mGData) return;
     970double mean,sigma;
     971int rc = mGData->GetMeanSigma(0,mean,sigma);
     972if(rc<=0) return;
     973mPar(0) = mean;
     974return;
     975}
     976
     977void PIAFitter::IniFitGhP1D(void)
     978{
     979if(mNPar==0) return;
     980mPar=0.; mStep=1.; mMin=1.; mMax=-1.; mFix=0.;
     981if(mNVar!=1 || mNPar<3) return;
     982double h,v,x0,y0,sx,sy,f;
     983int rc = IniFitGaus(*mGData,h,v,x0,y0,sx,sy,f);
     984if(rc!=0) return;
     985mPar(0)=h;  mStep(0)=h/1000.;
     986mPar(1)=x0; mStep(1)=sx/10.;
     987mPar(2)=sx; mStep(2)=sx/10.; mMin(2)=0.; mMax(2)=20.*sx;
     988if(mNPar>3) {mPar(3)=f; mStep(3)=f/1000.;} else mPar(0)=h+f;
     989}
     990
     991void PIAFitter::IniFitGvP1D(void)
     992{
     993if(mNPar==0) return;
     994mPar=0.; mStep=1.; mMin=1.; mMax=-1.; mFix=0.;
     995if(mNVar!=1 || mNPar<3) return;
     996double h,v,x0,y0,sx,sy,f;
     997int rc = IniFitGaus(*mGData,h,v,x0,y0,sx,sy,f);
     998if(rc!=0) return;
     999mPar(0)=v;  mStep(0)=v/1000.;
     1000mPar(1)=x0; mStep(1)=sx/10.;
     1001mPar(2)=sx; mStep(2)=sx/10.; mMin(2)=0.; mMax(2)=20.*sx;
     1002if(mNPar>3) {mPar(3)=f; mStep(3)=f/1000.;} else mPar(0)=v+mNData*f;
     1003}
     1004
     1005void PIAFitter::IniFitGv2D(void)
     1006{
     1007if(mNPar==0) return;
     1008mPar=0.; mStep=1.; mMin=1.; mMax=-1.; mFix=0.;
     1009if(mNVar!=2 || mNPar<6) return;
     1010double h,v,x0,y0,sx,sy,f;
     1011int rc = IniFitGaus(*mGData,h,v,x0,y0,sx,sy,f);
     1012if(rc!=0) return;
     1013mPar(0)=v;  mStep(0)=v/1000.;
     1014mPar(1)=x0; mStep(1)=sx/10.;
     1015mPar(2)=y0; mStep(2)=sy/10.;
     1016mPar(3)=sx; mStep(3)=sx/10.; mMin(3)=0.;  mMax(3)=20.*sx;
     1017mPar(4)=sy; mStep(4)=sy/10.; mMin(4)=0.;  mMax(4)=20.*sy;
     1018mPar(5)=0.; mStep(5)=0.005;  mMin(5)=-1.; mMax(5)=1.;
     1019if(mNPar>6) {mPar(6)=f; mStep(6)=f/1000.;} else mPar(0)=v+mNData*f;
     1020}
     1021
     1022int PIAFitter::IniFitGaus(GeneralFitData& g,double& h,double& v
     1023    ,double& x0,double& y0,double& sx,double& sy,double& f)
     1024// Pour initialiser une gaussienne 1D ou 2D
     1025// return code =0 si OK
     1026{
     1027h=v=x0=y0=sx=sy=f=0.;
     1028if(!&g) return(-1);
     1029int nvar = g.NVar();
     1030int ndata = g.NData();
     1031if(nvar<1 || 2<nvar || ndata<=0) return(-2);
     1032
     1033// X et Y ordonnees croissant
     1034double *X=NULL, *Y=NULL;
     1035X = new double[ndata];
     1036if(nvar==2) Y = new double[ndata];
     1037{for(int i=0;i<ndata;i++) {X[i] = g.X(i); if(Y) Y[i] = g.Y(i);}}
     1038qsort(X,(size_t) ndata,sizeof(double),qSort_Dble);
     1039if(Y) qsort(Y,(size_t) ndata,sizeof(double),qSort_Dble);
     1040
     1041// determination des zones externes=[0,1/3] et [2/3,1]
     1042//            et des zones internes=[1/3,2/3]
     1043int k1=ndata/3,k2=2*ndata/3;
     1044double xmin,xmax, ymin=-1.,ymax=1.;
     1045xmin = X[k1]; xmax = X[k2];
     1046if(Y) {ymin = Y[k1]; ymax = Y[k2];}
     1047
     1048// recherche des parametres
     1049double nb=0, nc=0;
     1050{for(int i=0;i<ndata;i++) {
     1051   double val,x,y=0.;
     1052   x = g.X(i); if(Y) y = g.Y(i); val = g.Val(i);
     1053   if(xmin<x && x<xmax && ymin<y && y<ymax) { // c'est le centre
     1054     if(nc==0 || val>h) {h=val; x0=x; y0=y;}
     1055     v += val; nc++;
     1056   } else {f += val; nb++;} // c'est le bord
     1057
     1058}}
     1059if(nb==0 || nc==0) {delete [] X; if(Y) delete [] Y; return(-3);}
     1060
     1061// Calcul des parametres
     1062f /= (double) nb; h -= f; v -= f*nc;
     1063sx = (xmax-xmin)/2.; if(Y) sy = (ymax-ymin)/2.;
     1064
     1065delete [] X; if(Y) delete [] Y;
     1066return(0);
     1067}
     1068
     1069
    9621070////////////////////////////////////////////////////////////////////
    9631071////---------- Classe de fenetre de fit interactive ------------////
     
    9951103cpx = spx; cpy = spy;
    9961104string dum = "Object: "+mFitter->mNObj+" , Fun: ";
    997 if(mFitter->mFitUserFunc) dum+=mFitter->mNameFitFunc; else dum+=mFitter->mFName;
     1105if(mFitter->mFunc) dum+=mFitter->mNameFitFunc; else dum+=mFitter->mFName;
    9981106lab[0] = new PILabel(this,dum.c_str(),4*bsx,bsy,cpx,cpy);
    9991107lab[0]->SetBinding(PIBK_elastic,PIBK_elastic, PIBK_elastic,PIBK_elastic);
     
    13511459}
    13521460else if(2011<=msg && msg<=2013) {
    1353   mFitter->mOpt.polcx = msg-2011;
     1461  mFitter->mOpt.polcy = msg-2011;
    13541462  if(lp) cout<<"Centrage Y polcy="<<mFitter->mOpt.polcy
    13551463             <<" yc="<<mFitter->mOpt.yc<<endl;
  • trunk/SophyaPI/PIext/piafitting.h

    r390 r392  
    6969void LinFit(void);
    7070
     71// pour initialiser les parametres du fit
     72void IniFitP1ou2D(void);
     73void IniFitGhP1D(void);
     74void IniFitGvP1D(void);
     75void IniFitGv2D(void);
     76static int IniFitGaus(GeneralFitData& g,double& h,double& v
     77       ,double& x0,double& y0,double& sx,double& sy,double& f);
     78
    7179// Graphique
    7280PIStdImgApp* mApp; // Do not delete
     
    8997GeneralFunction* mFunction; string mFName;
    9098// Gestion de fonction de fit definie par l'utilisateur
    91 bool mFitUserFunc;
    9299GeneralFunc* mFunc;
    93100PDynLinkMgr* mDlUFunc;
Note: See TracChangeset for help on using the changeset viewer.