source: Sophya/trunk/Cosmo/SimLSS/cmvgsmcfit.cc@ 3793

Last change on this file since 3793 was 3790, checked in by cmv, 15 years ago

etude des cubes generes par le GSM, cmv 28/06/2010

File size: 4.5 KB
Line 
1#include "sopnamsp.h"
2#include "machdefs.h"
3#include <iostream>
4#include <stdlib.h>
5#include <stdio.h>
6#include <string.h>
7#include <math.h>
8#include <unistd.h>
9
10#include "fioarr.h"
11#include "ntuple.h"
12
13#include "Minuit2/FunctionMinimum.h"
14#include "Minuit2/MnMigrad.h"
15#include "Minuit2/MnUserParameters.h"
16#include "Minuit2/MnPrint.h"
17#include "Minuit2/MnMinos.h"
18#include "Minuit2/MinosError.h"
19#include "Minuit2/FCNBase.h"
20using namespace ROOT::Minuit2;
21
22//--------------------------------------------------
23namespace ROOT { namespace Minuit2 {
24class MyFCN : public FCNBase {
25public:
26 MyFCN(double nu0,double dnu,TVector<r_8>& V,TVector<r_8>& EV);
27 void InitFit(MnUserParameters& upar);
28 double Func(int ix,const vector<double>& par) const;
29 double operator()(const vector<double>& par) const;
30 double Up(void) const {return 1.;}
31 //protected:
32 mutable int _ndata;
33 double _nu0, _dnu;
34 TVector<r_8> _V;
35 TVector<r_8> _EV;
36};
37} } // namespace ROOT + Minuit2
38
39//--------------------------------------------------
40int main(int narg,char *arg[])
41{
42 double nu0 = 820.0, dnu = 0.5; // MHz
43 if(narg<=1) {
44 cout<<"cmvgsmcfit cubefile.ppf"<<endl;
45 return -1;
46 }
47
48 POutPersist pos("cmvgsmcfit.ppf");
49 PInPersist pis(arg[1]);
50 TArray<r_4> Cube;
51 pis>>PPFNameTag("cube")>>Cube;
52 TVector<r_8> V(Cube.SizeX()), EV(Cube.SizeX());
53
54 const int nvar = 6;
55 const char *vname[nvar] = {"x2r","ok","ph","th","A","N"};
56 NTuple nt(nvar,vname);
57 double xnt[nvar]; for(int i=0;i<nvar;i++) xnt[i] = 0.;
58
59 int nfit = 0;
60 for(int j=0;j<Cube.SizeY();j++) {
61 cout<<"..."<<j<<endl;
62 for(int k=0;k<Cube.SizeZ();k++) {
63 for(int i=0;i<Cube.SizeX();i++) {
64 V(i) = Cube(i,j,k);
65 EV(i) = V(i) * 0.05;
66 }
67
68 MyFCN myfcn(nu0,dnu,V,EV);
69 MnUserParameters upar;
70 myfcn.InitFit(upar);
71 if(nfit==0) cout<<upar;
72
73 unsigned int nfcall = 10000;
74 double tolerance = 0.0001;
75 MnMigrad migrad(myfcn,upar,MnStrategy(1));
76 FunctionMinimum fmini = migrad(nfcall,tolerance);
77
78 MnUserParameterState ustate = fmini.UserState();
79 bool okfit = fmini.IsValid();
80 double xi2r = ustate.Fval()/(V.Size()-ustate.VariableParameters());
81 vector<double> par = ustate.Params();
82 if(nfit==0) {
83 cout<<ustate;
84 // cout<<ustate.Parameters(); cout<<ustate.Covariance(); cout<<ustate.GlobalCC();
85 cout<<"nFCN = "<<ustate.NFcn()<<", FVal = "<<ustate.Fval()<<", Edm = "<<ustate.Edm()<<endl;
86 cout<<"xi2r = "<<xi2r<<" ndata="<<myfcn._ndata<<" nvarp="<<ustate.VariableParameters()<<endl;
87 }
88
89 xnt[0] = xi2r; xnt[1] = (okfit)? 1.: 0.;
90 xnt[2] = j; xnt[3] = k;
91 for(unsigned int i=0;i<par.size();i++) xnt[4+i] = par[i];
92 nt.Fill(xnt);
93 //vector<double> err = ustate.Errors();
94 for(int i=0;i<Cube.SizeX();i++) Cube(i,j,k) -= myfcn.Func(i,par);
95
96 if(nfit<10) {
97 TVector<r_8> F(Cube.SizeX()), R(Cube.SizeX());
98 for(int i=0;i<Cube.SizeX();i++) {
99 F(i) = myfcn.Func(i,par);
100 R(i) = V(i) - F(i);
101 }
102 char str[64];
103 sprintf(str,"v_%d_%d",j,k);
104 pos<<PPFNameTag(str)<<V;
105 sprintf(str,"f_%d_%d",j,k);
106 pos<<PPFNameTag(str)<<F;
107 sprintf(str,"r_%d_%d",j,k);
108 pos<<PPFNameTag(str)<<R;
109 }
110 nfit++;
111 if(nfit>10) break;
112 }
113 }
114
115 pos<<PPFNameTag("nt")<<nt;
116 pos<<PPFNameTag("cublis")<<Cube;
117
118}
119
120//--------------------------------------------------
121MyFCN::MyFCN(double nu0, double dnu,TVector<r_8>& V,TVector<r_8>& EV)
122 : _V(V,false), _EV(EV,false)
123{
124 _ndata =_V.Size();
125 _nu0 = nu0;
126 _dnu = dnu;
127}
128
129void MyFCN::InitFit(MnUserParameters& upar)
130{
131 int n = _V.Size()-1;
132 double a = _V(0);
133 double ni = log(_V(n)/a) / log(1.+n*_dnu/_nu0);
134
135 upar.Add("A",a,a/50.);
136 upar.Add("N",ni,fabs(ni/50.));
137}
138
139double MyFCN::Func(int ix,const vector<double>& par) const
140// f = A*(nu/nu0)^N avec nu = nu0 + i*dnu
141{
142 double x = (_nu0 + ix*_dnu)/_nu0;
143 double f = par[0]*pow(x,par[1]);
144 return f;
145}
146
147double MyFCN::operator()(const vector<double>& par) const
148{
149 double xi2 = 0.;
150 _ndata = 0;
151 for(int i=0;i<_V.Size();i++) {
152 double e2 = _EV(i)*_EV(i);
153 if(e2<=0.) continue;
154 double v = _V(i);
155 double f = Func(i,par);
156 xi2 += (v-f)*(v-f)/e2;
157 _ndata++;
158 }
159 //cout<<"par: "<<par[0]<<" "<<par[1]<<endl;
160 return xi2;
161}
162
163/*
164openppf cmvgsmcfit.ppf
165
166set j 0
167set k 0
168n/plot v_${j}_${k}.val%n ! ! "nsta cpts"
169n/plot f_${j}_${k}.val%n ! ! "nsta cpts same red"
170n/plot r_${j}_${k}.val%n ! ! "nsta cpts"
171
172n/plot nt.ok%_nl ! ! "cpts"
173n/plot nt.x2r%_nl ! ! "cpts"
174
175n/plot nt.A%_nl ! ! "cpts"
176n/plot nt.N%_nl ! ! "cpts"
177
178set n 0
179objaoper cublis slicexz $n
180disp slicexz_$n
181
182n/plot cublis.val%x fabs(y-5)<0.1&&fabs(z-5)<0.1
183*/
Note: See TracBrowser for help on using the repository browser.