Changeset 341 in Sophya


Ignore:
Timestamp:
Jul 30, 1999, 12:20:05 PM (26 years ago)
Author:
ercodmgr
Message:

petites ameliorations+corr bugs dans fit cmv (30/7/99)

File:
1 edited

Legend:

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

    r333 r341  
    788788if(expy.length()<=0) {nvar = 1; expy = "0.";}
    789789
    790 // $CHECK$ - cmv calculait le nombre d'entree ndata
    791 // en fonction de chaque objet - Je l'ai vire Reza 11/05/99
    792 
    793790// Creation NTuple Buffer
    794791char* ntn[4]= {"x","y","f","e"};
     
    830827  double err_e, err_E;
    831828  double stc2;
     829  int nstep;
    832830  int lp,lpg;
    833831  int i1,i2,j1,j2;
     
    867865O.xc = O.yc = 0.;
    868866O.stc2 = 1.e-3;
     867O.nstep = 100;
    869868O.err_e = O.err_E = -1.;
    870869O.lp = 1; O.lpg = 0;
     
    919918  if(O.stc2<=0.) O.stc2 = 1.e-3;
    920919}
     920if(strstr(opt.c_str(),",N")) { // Nombre maximum d'iterations
     921  size_t p = opt.find(",N");
     922  size_t q = opt.find_first_of(',',p+1);
     923  string dum = opt.substr(p,q-p);
     924  if(dum.length()>2) sscanf(dum.c_str(),",N%d",&O.nstep);
     925  if(O.nstep<2) O.nstep = 100;
     926}
    921927if(strstr(opt.c_str(),",l")) { // niveau de print
    922928  size_t p = opt.find(",l");
     
    926932  if(dum.length()>2) sscanf(dum.c_str(),",l%f",&ab);
    927933  if(ab<0) ab = 0.;
    928   O.lp = (int) ab; O.lpg = (int) 10.*(ab-O.lp);
     934  O.lp = (int) ab; O.lpg = int(10.*(ab-(float)O.lp+0.01));
    929935}
    930936if(strstr(opt.c_str(),",I")) { // intervalle de fit selon X
     
    950956//| nom  : nom de l'objet qui peut etre:
    951957//|        fit-1D:  Vector,Histo1D,HProf ou GeneraFitData(1D)
    952 //|        fit-2D:  Matrix,Histo2D,Imagexx ou GeneraFitData(2D)
    953 //| func : pnn = fit polynome degre nn avec classe Poly (lineaire) 1D ou 2D
    954 //|      : Pnn = fit polynome degre nn avec GeneralFit (non-lineaire) 1D ou 2D
    955 //|      : gnn = fit gaussienne (hauteur) + polynome de degre nn 1D
    956 //|      : g   = fit gaussienne (hauteur) 1D
    957 //|      : enn = fit exponentielle + polynome de degre nn 1D
    958 //|      : e   = fit exponentielle 1D
    959 //|      : Gnn = fit gaussienne (volume) + polynome de degre nn 1D
    960 //|      : G   = fit gaussienne (volume) 1D
    961 //|      :     = fit gaussienne+fond (volume) 2D
    962 //|      : Gi  = fit gaussienne+fond integree (volume) 2D
    963 //|      : d   = fit DL de gaussienne+fond (volume) 2D
    964 //|      : di  = fit DL de gaussienne+fond integree (volume) 2D
    965 //|      : D   = fit DL de gaussienne+fond avec coeff variable p6 (volume) 2D
    966 //|      : Di  = fit DL de gaussienne+fond integree avec coeff variable p6 (volume) 2D
    967 //|      : M   = fit Moffat+fond (expos=p6) (volume) 2D
    968 //|      : Mi  = fit Moffat+fond integree (expos=p6) (volume) 2D
    969 //| par  : p1,...,pn valeur d'initialisation des parametres (def=0)
    970 //| step : s1,...,sn valeur des steps de depart (def=1)
    971 //| min  : m1,...,mn valeur des minima (def=1)
    972 //| max  : M1,...,Mn valeur des maxima (def=-1) (max<=min : pas de limite)
     958//|        fit-2D:  Matrix,Histo2D,Image<T> ou GeneraFitData(2D)
     959//| func : pnn : fit polynome degre nn avec classe Poly (lineaire) 1D ou 2D
     960//|      : Pnn : fit polynome degre nn avec GeneralFit (non-lineaire) 1D ou 2D
     961//|      : gnn : fit gaussienne (hauteur) + polynome de degre nn 1D
     962//|      : g   : fit gaussienne (hauteur) 1D
     963//|      : enn : fit exponentielle + polynome de degre nn 1D
     964//|      : e   : fit exponentielle 1D
     965//|      : Gnn : fit gaussienne (volume) + polynome de degre nn 1D
     966//|      : G   : fit gaussienne (volume) 1D
     967//|      :     : fit gaussienne+fond (volume) 2D
     968//|      : Gi  : fit gaussienne+fond integree (volume) 2D
     969//|      : d   : fit DL de gaussienne+fond (volume) 2D
     970//|      : di  : fit DL de gaussienne+fond integree (volume) 2D
     971//|      : D   : fit DL de gaussienne+fond avec coeff variable p6 (volume) 2D
     972//|      : Di  : fit DL de gaussienne+fond integree avec coeff variable p6 (volume) 2D
     973//|      : M   : fit Moffat+fond (expos=p6) (volume) 2D
     974//|      : Mi  : fit Moffat+fond integree (expos=p6) (volume) 2D
     975//| par  : p1,...,pn : valeur d'initialisation des parametres (def=0)
     976//| step : s1,...,sn : valeur des steps de depart (def=1)
     977//| min  : m1,...,mn : valeur des minima (def=1)
     978//| max  : M1,...,Mn : valeur des maxima (def=-1) (max<=min : pas de limite)
    973979//| opt  : options "Eaa.b,eaa.b,f,r,caa.b,Xaa.b"
    974 //|       f = generation d'un Objet identique contenant la fonction fittee
    975 //|       r = generation d'un Objet identique contenant les residus
    976 //|       Xaa.b = aa.b valeur du DXi2 d'arret (def=1.e-3)
    977 //|       la.b = niveau "a.b" de print: a=niveau de print Fit1/2D
    978 //|                                     b=niveau de debug GeneralFit
    979 //|       Ii1/i2 numeros des bins X de l'histos utilises pour le fit [i1,i2]
    980 //|2D     Jj1/j2 numeros des bins Y de l'histos utilises pour le fit [j1,j2]
    981 //|       - L'erreur est celle associee a l'objet si existe, 1 sinon sauf si
    982 //|       E = erreur prise comme la racine de la valeur a fitter
    983 //|       Eaa.b = erreur prise aa.b*sqrt(val)
    984 //|       e = erreur prise egale a 1 pour toutes les valeurs
    985 //|       eaa.b = erreur prise egale a aa.b
    986 //|       xaa.b = demande de centrage: on fit x-aa.b au lieu de x)
    987 //|       x = demande de centrage: on fit x-xc au lieu de x
    988 //|           avec xc=abscisse du milieu de l'histogramme
    989 //|           Actif pour: exp+poly 1D, poly 1D
    990 //|                       gauss+poly 1D (mais xc est le centre de la gaussienne)
    991 //|2D     yaa.b et y = idem "xaa.b et x" mais pour y
     980//|      f : generation d'un Objet identique contenant la fonction fittee
     981//|      r : generation d'un Objet identique contenant les residus
     982//|      Xaa.b : aa.b valeur du DXi2 d'arret (def=1.e-3)
     983//|      Naa : aa nombre maximum d'iterations (def=100)
     984//|      la.b : niveau "a.b" de print: a=niveau de print Fit1/2D
     985//|                                    b=niveau de debug GeneralFit
     986//|      Ii1/i2 numeros des bins X de l'histos utilises pour le fit [i1,i2]
     987//|2D    Jj1/j2 numeros des bins Y de l'histos utilises pour le fit [j1,j2]
     988//|      - L'erreur est celle associee a l'objet (si elle existe),
     989//|        elle est mise a 1 sinon, sauf si E... ou e... est precise:
     990//|      Eaa.b : si |val|>=1 erreur = aa.b*sqrt(|val|)
     991//|              si |val|<1  erreur = aa.b
     992//|              si aa.b <=0 alors aa.b=1.0
     993//|              E seul est equivalent a E1.0
     994//|      eaa.b : erreur = aa.b
     995//|              si aa.b <=0 alors aa.b=1.0
     996//|              e seul est equivalent a e1.0
     997//|      xaa.b : demande de centrage: on fit x-aa.b au lieu de x)
     998//|      x : demande de centrage: on fit x-xc au lieu de x
     999//|          avec xc=abscisse du milieu de l'histogramme
     1000//|          Actif pour exp+poly 1D, poly 1D
     1001//|                pour gauss+poly 1D, xc est le centre de la gaussienne.
     1002//|2D    yaa.b et y : idem "xaa.b et x" mais pour y
    9921003{
    9931004AnyDataObj* obj=mOmg->GetObj(nom);
     
    10731084      <<" Cent="<<O.polcx<<","<<O.polcy<<","<<O.xc<<"+x"<<","<<O.yc<<"+y"
    10741085      <<" TypE="<<O.err_e<<","<<O.err_E
    1075       <<" StpX2="<<O.stc2
     1086      <<" StpX2="<<O.stc2<<" Nstep="<<O.nstep
    10761087      <<" lp,lpg="<<O.lp<<","<<O.lpg<<endl;
    10771088
     
    11011112  // Gestion des erreurs a utiliser
    11021113  if(O.err_e>0.) e=O.err_e;
    1103   else if(O.err_E>0.) {e=(y<-1.||y>1.)?O.err_E*sqrt(fabs(y)):O.err_E;}
     1114  else if(O.err_E>0.) {e=(f<-1.||f>1.)?O.err_E*sqrt(fabs(f)):O.err_E;}
    11041115
    11051116  // Remplissage de generalfit
     
    12361247myfit.SetData(&mydata);
    12371248myfit.SetStopChi2(O.stc2);
     1249myfit.SetMaxStep(O.nstep);
    12381250{for(int i=0;i<myfunc->NPar();i++) {
    12391251  char str[10];
     
    12421254}}
    12431255if(O.lp>1) myfit.PrintFit();
    1244 double c2r = (double) myfit.Fit();
     1256double c2r = -1.;
     1257int rcfit = (double) myfit.Fit();
    12451258if(O.lp>0) myfit.PrintFit();
    1246 if(c2r>0.) {
     1259if(rcfit>0) {
    12471260  c2r = myfit.GetChi2Red();
    1248   cout<<"C2r_Reduit = "<<c2r<<"  nstep="<<myfit.GetNStep()<<endl;
     1261  cout<<"C2r_Reduit = "<<c2r<<" nstep="<<myfit.GetNStep()<<" rc="<<rcfit<<endl;
    12491262  Vector ParFit(myfunc->NPar());
    12501263  for(int i=0;i<myfunc->NPar();i++) ParFit(i)=myfit.GetParm(i);
    12511264} else {
    1252   cout<<"echec Fit, rc = "<<c2r<<"  nstep="<<myfit.GetNStep()<<endl;
     1265  cout<<"echec Fit, rc = "<<rcfit<<"  nstep="<<myfit.GetNStep()<<endl;
     1266  myfit.PrintFitErr(rcfit);
    12531267}
    12541268
    12551269// Mise a disposition des resultats
    1256 if(c2r>=0. && myfunc && (O.okres>0||O.okfun>0)) {
     1270if(rcfit>=0 && myfunc && (O.okres>0||O.okfun>0)) {
    12571271  string nomres = nom + "res";
    12581272  string nomfun = nom + "fun";
Note: See TracChangeset for help on using the changeset viewer.