#include "sopnamsp.h" #include "machdefs.h" #include #include #include #include #include #include #include "fioarr.h" #include "ntuple.h" #include "Minuit2/FunctionMinimum.h" #include "Minuit2/MnMigrad.h" #include "Minuit2/MnUserParameters.h" #include "Minuit2/MnPrint.h" #include "Minuit2/MnMinos.h" #include "Minuit2/MinosError.h" #include "Minuit2/FCNBase.h" using namespace ROOT::Minuit2; //-------------------------------------------------- namespace ROOT { namespace Minuit2 { class MyFCN : public FCNBase { public: MyFCN(double nu0,double dnu,TVector& V,TVector& EV); void InitFit(MnUserParameters& upar); double Func(int ix,const vector& par) const; double operator()(const vector& par) const; double Up(void) const {return 1.;} //protected: mutable int _ndata; double _nu0, _dnu; TVector _V; TVector _EV; }; } } // namespace ROOT + Minuit2 //-------------------------------------------------- int main(int narg,char *arg[]) { double nu0 = 820.0, dnu = 0.5; // MHz if(narg<=1) { cout<<"cmvgsmcfit cubefile.ppf"< Cube; pis>>PPFNameTag("cube")>>Cube; TVector V(Cube.SizeX()), EV(Cube.SizeX()); const int nvar = 6; const char *vname[nvar] = {"x2r","ok","ph","th","A","N"}; NTuple nt(nvar,vname); double xnt[nvar]; for(int i=0;i par = ustate.Params(); if(nfit==0) { cout<10) break; } } pos<& V,TVector& EV) : _V(V,false), _EV(EV,false) { _ndata =_V.Size(); _nu0 = nu0; _dnu = dnu; } void MyFCN::InitFit(MnUserParameters& upar) { int n = _V.Size()-1; double a = _V(0); double ni = log(_V(n)/a) / log(1.+n*_dnu/_nu0); upar.Add("A",a,a/50.); upar.Add("N",ni,fabs(ni/50.)); } double MyFCN::Func(int ix,const vector& par) const // f = A*(nu/nu0)^N avec nu = nu0 + i*dnu { double x = (_nu0 + ix*_dnu)/_nu0; double f = par[0]*pow(x,par[1]); return f; } double MyFCN::operator()(const vector& par) const { double xi2 = 0.; _ndata = 0; for(int i=0;i<_V.Size();i++) { double e2 = _EV(i)*_EV(i); if(e2<=0.) continue; double v = _V(i); double f = Func(i,par); xi2 += (v-f)*(v-f)/e2; _ndata++; } //cout<<"par: "<