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 "ntuple.h"
|
---|
11 | #include "histerr.h"
|
---|
12 |
|
---|
13 | #include "constcosmo.h"
|
---|
14 | #include "pkspectrum.h"
|
---|
15 |
|
---|
16 | #include "Minuit2/FunctionMinimum.h"
|
---|
17 | #include "Minuit2/MnMigrad.h"
|
---|
18 | #include "Minuit2/MnUserParameters.h"
|
---|
19 | #include "Minuit2/MnPrint.h"
|
---|
20 | #include "Minuit2/MnMinos.h"
|
---|
21 | #include "Minuit2/MinosError.h"
|
---|
22 | #include "Minuit2/FCNBase.h"
|
---|
23 | using namespace ROOT::Minuit2;
|
---|
24 |
|
---|
25 | namespace ROOT { namespace Minuit2 {
|
---|
26 | class MyFCN : public FCNBase {
|
---|
27 | public:
|
---|
28 | MyFCN(HistoErr& herr,PkSpectrumZ& pk);
|
---|
29 | void Init(const vector<double>& par) const;
|
---|
30 | double Func(double x,const vector<double>& par) const;
|
---|
31 | double operator()(const vector<double>& par) const;
|
---|
32 | double Up(void) const {return 1.;}
|
---|
33 | private:
|
---|
34 | HistoErr& herr_;
|
---|
35 | PkSpectrumZ& pk_;
|
---|
36 | };
|
---|
37 | } } // namespace ROOT + Minuit2
|
---|
38 |
|
---|
39 | void usage(void);
|
---|
40 | void usage(void)
|
---|
41 | {
|
---|
42 | cout<<"usage: cmvfitpk [-k kmin,kmax] -e conchpkrec.ppf observ3d_1.ppf observ3d_2.ppf ..."<<endl;
|
---|
43 | }
|
---|
44 |
|
---|
45 | int main(int narg,char *arg[])
|
---|
46 | {
|
---|
47 | // --- Cosmography definition (WMAP)
|
---|
48 | double zref = 0.175;
|
---|
49 | double ob0 = 0.0444356;
|
---|
50 | double h100=0.71, om0=0.267804, ol0=0.73;
|
---|
51 |
|
---|
52 | // --- Spectrum and variance definition
|
---|
53 | double ns = 1., as = 1.;
|
---|
54 | double R=8./h100, sigmaR = 1.;
|
---|
55 | double kmin=1e-5,kmax=1000.;
|
---|
56 | int npt = 10000;
|
---|
57 | double eps=1.e-3;
|
---|
58 |
|
---|
59 | // --- les fichiers
|
---|
60 | double klim[2]={0.,-1.};
|
---|
61 | string fconc = "";
|
---|
62 |
|
---|
63 | // --- les options de print/plot
|
---|
64 | int nprint = 3, nplot = -1; // -1 = all
|
---|
65 |
|
---|
66 | // --- Reading arguments
|
---|
67 | char c;
|
---|
68 | while((c = getopt(narg,arg,"hk:e:")) != -1) {
|
---|
69 | switch (c) {
|
---|
70 | case 'k' :
|
---|
71 | sscanf(optarg,"%lf,%lf",&klim[0],&klim[1]);
|
---|
72 | break;
|
---|
73 | case 'e' :
|
---|
74 | fconc = optarg;
|
---|
75 | break;
|
---|
76 | case 'h' :
|
---|
77 | default :
|
---|
78 | usage(); return -1;
|
---|
79 | }
|
---|
80 | }
|
---|
81 |
|
---|
82 | if(optind>=narg) return -2;
|
---|
83 |
|
---|
84 | // --- Create spectrum
|
---|
85 | cout<<endl<<"\n--- Create Spectrum"<<endl;
|
---|
86 | InitialSpectrum pkini(ns,as);
|
---|
87 | bool nobaryon = false;
|
---|
88 | double ocdm0 = om0-ob0;
|
---|
89 | TransfertEisenstein tf(h100,ocdm0,ob0,T_CMB_Par,nobaryon);
|
---|
90 | GrowthFactor growth(om0,ol0); cout<<"...Growth="<<growth(zref)<<endl;
|
---|
91 | PkSpectrum0 pk0(pkini,tf);
|
---|
92 | PkSpectrumZ pkz(pk0,growth,zref);
|
---|
93 |
|
---|
94 | // --- Compute variance and normalize spectrum
|
---|
95 | pkz.SetZ(0.);
|
---|
96 | cout<<endl<<"\n--- Compute variance for top-hat R="<<R
|
---|
97 | <<" at z="<<pkz.GetZ()<<endl;
|
---|
98 | VarianceSpectrum varpk_th(pkz,R,VarianceSpectrum::TOPHAT);
|
---|
99 | double kfind_th = varpk_th.FindMaximum(kmin,kmax,eps);
|
---|
100 | double pkmax_th = varpk_th(kfind_th);
|
---|
101 | cout<<"kfind_th = "<<kfind_th<<" ("<<log10(kfind_th)<<"), integrand="<<pkmax_th<<endl;
|
---|
102 | double k1=kmin, k2=kmax;
|
---|
103 | int rc = varpk_th.FindLimits(pkmax_th/1.e4,k1,k2,eps);
|
---|
104 | cout<<"limit_th: rc="<<rc<<" : "<<k1<<" ("<<log10(k1)<<") , "
|
---|
105 | <<k2<<" ("<<log10(k2)<<")"<<endl;
|
---|
106 |
|
---|
107 | double ldlk = (log10(k2)-log10(k1))/npt;
|
---|
108 | varpk_th.SetInteg(0.01,ldlk,-1.,4);
|
---|
109 | double sr2 = varpk_th.Variance(k1,k2);
|
---|
110 | cout<<"varpk_th="<<sr2<<" -> sigma="<<sqrt(sr2)<<endl;
|
---|
111 |
|
---|
112 | double normpkz = sigmaR*sigmaR/sr2;
|
---|
113 | pkz.SetScale(normpkz);
|
---|
114 | cout<<"Spectrum normalisation = "<<pkz.GetScale()<<endl;
|
---|
115 | pkz.SetZ(zref);
|
---|
116 |
|
---|
117 | // --- Reading reference mean spectrum
|
---|
118 | cout<<endl<<"\n--- Reading spectrum form file "<<fconc<<endl;
|
---|
119 | HistoErr herrconc;
|
---|
120 | {
|
---|
121 | PInPersist pis(fconc.c_str());
|
---|
122 | pis >> PPFNameTag("herrconc") >> herrconc;
|
---|
123 | }
|
---|
124 | cout<<herrconc;
|
---|
125 | if(herrconc.NBins()<1) return -3;
|
---|
126 | double b_ini = herrconc(2*herrconc.NBins()/3);
|
---|
127 | cout<<"b_ini = "<<b_ini<<endl;
|
---|
128 | if(klim[1]<=klim[0]) klim[1] = herrconc.XMax();
|
---|
129 |
|
---|
130 | // --- NTuple et ppf
|
---|
131 | const int npar = 7; // Number of parameters in the fit
|
---|
132 | TMatrix<r_8> Cov(npar,npar); Cov = 0.;
|
---|
133 | POutPersist pos("cmvfitpk.ppf");
|
---|
134 | const int nvar = 2*npar+1;
|
---|
135 | const char *vname[nvar] = {
|
---|
136 | "xi2"
|
---|
137 | ,"b","a","oc","ob","ol","h","n"
|
---|
138 | ,"eb","ea","eoc","eob","eol","eh","en"
|
---|
139 | };
|
---|
140 | NTuple nt(nvar,vname);
|
---|
141 | double xnt[nvar];
|
---|
142 |
|
---|
143 | // ***
|
---|
144 | // --- Boucle sur les fichiers a fitter
|
---|
145 | // ***
|
---|
146 | int nfile=0, ncov=0;
|
---|
147 | for(int ifile=optind;ifile<narg;ifile++) {
|
---|
148 |
|
---|
149 | // --- lecture du fichier
|
---|
150 | cout<<">>> Reading["<<nfile<<","<<ifile<<"]: "<<arg[ifile]<<endl;
|
---|
151 | HistoErr herr;
|
---|
152 | PInPersist pis(arg[ifile]);
|
---|
153 | pis >> PPFNameTag("hpkrec") >> herr;
|
---|
154 | if(herr.NBins()!=herrconc.NBins()) {
|
---|
155 | cout<<"... bad number of bins: "<<herr.NBins()<<endl;
|
---|
156 | continue;
|
---|
157 | }
|
---|
158 |
|
---|
159 | // --- Mise en forme
|
---|
160 | unsigned int nbinok = 0;
|
---|
161 | for(int i=0;i<herr.NBins();i++) {
|
---|
162 | double k = herr.BinCenter(i);
|
---|
163 | if(i==0 || k<klim[0] || k>klim[1]) {herr.SetErr2(i,-1.); continue;}
|
---|
164 | herr.SetErr2(i,herrconc.Error2(i));
|
---|
165 | nbinok++;
|
---|
166 | }
|
---|
167 |
|
---|
168 | // --- Initialisation de minuit
|
---|
169 | MnUserParameters upar;
|
---|
170 | upar.Add("B",b_ini,b_ini/100.);
|
---|
171 | upar.Add("A",1.,0.01);
|
---|
172 | upar.Add("Ocdm",ocdm0,0.001,ocdm0/2.,2.*ocdm0);
|
---|
173 | //upar.Fix("Ocdm");
|
---|
174 | upar.Add("Ob",ob0,0.001,ob0/10.,10.*ob0);
|
---|
175 | //upar.Fix("Ob");
|
---|
176 | upar.Add("Ol",ol0,0.001,0.1,2.);
|
---|
177 | upar.Fix("Ol");
|
---|
178 | upar.Add("h100",h100,0.01,10.,150.);
|
---|
179 | upar.Fix("h100");
|
---|
180 | upar.Add("ns",ns,0.001,0.7,1.5);
|
---|
181 | upar.Fix("ns");
|
---|
182 | MyFCN fcn(herr,pkz);
|
---|
183 | if(nbinok<upar.VariableParameters()) {
|
---|
184 | cout<<"... nombre de degres de liberte <0: nbinok="<<nbinok<<endl;
|
---|
185 | continue;
|
---|
186 | }
|
---|
187 |
|
---|
188 | // --- Fit minuit
|
---|
189 | unsigned int nfcall = 1000; double tolerance = 0.05;
|
---|
190 | MnMigrad migrad(fcn,upar,MnStrategy(1));
|
---|
191 | FunctionMinimum min = migrad(nfcall,tolerance);
|
---|
192 | if(!min.IsValid()) {
|
---|
193 | cout<<"!!!!!!!!! Echec Minuit"<<endl;
|
---|
194 | //cout<<"minimum: "<<min<<endl;
|
---|
195 | continue;
|
---|
196 | }
|
---|
197 |
|
---|
198 | MnUserParameterState ustate = min.UserState();
|
---|
199 | double xi2r = ustate.Fval()/(nbinok-ustate.VariableParameters());
|
---|
200 | vector<double> parfit = ustate.Parameters().Params();
|
---|
201 | vector<double> eparfit = ustate.Parameters().Errors();
|
---|
202 | if(ustate.HasCovariance()) {
|
---|
203 | MnUserCovariance ucov = ustate.Covariance();
|
---|
204 | for(unsigned int i=0;i<upar.VariableParameters();i++)
|
---|
205 | for(unsigned int j=0;j<upar.VariableParameters();j++)
|
---|
206 | Cov(ustate.ExtOfInt(i),ustate.ExtOfInt(j)) += ucov(i,j);
|
---|
207 | ncov++;
|
---|
208 | }
|
---|
209 |
|
---|
210 | // --- Recuperation des informations et remplissage NTuple
|
---|
211 | for(int i=0;i<nvar;i++) xnt[i] = 0.;
|
---|
212 | xnt[0] = xi2r;
|
---|
213 | for(int i=0;i<npar;i++) xnt[1+i] = parfit[i];
|
---|
214 | for(int i=0;i<npar;i++) xnt[npar+1+i] = eparfit[i];
|
---|
215 | nt.Fill(xnt);
|
---|
216 |
|
---|
217 | // --- stoquage des histos de plots
|
---|
218 | if(nfile<nplot || nplot<0) {
|
---|
219 | HistoErr herrf(herr); herrf.Zero();
|
---|
220 | HistoErr herrd(herr); herrd.Zero();
|
---|
221 | fcn.Init(parfit);
|
---|
222 | for(int i=1;i<herr.NBins();i++) {
|
---|
223 | double f = fcn.Func(herr.BinCenter(i),parfit);
|
---|
224 | herrf.SetBin(i,f,herr.Error(i),1.);
|
---|
225 | herrd.SetBin(i,herr(i)-f,herr.Error(i),1.);
|
---|
226 | }
|
---|
227 | char str[64];
|
---|
228 | sprintf(str,"h%d",nfile); pos.PutObject(herr,str);
|
---|
229 | sprintf(str,"hf%d",nfile); pos.PutObject(herrf,str);
|
---|
230 | sprintf(str,"hd%d",nfile); pos.PutObject(herrd,str);
|
---|
231 | }
|
---|
232 |
|
---|
233 | // --- Print de debug
|
---|
234 | if(nfile<nprint) {
|
---|
235 | cout<<"minimum: "<<min<<endl;
|
---|
236 | for(int i=0;i<nvar;i++) cout<<"["<<i<<"] = "<<xnt[i]<<endl;
|
---|
237 |
|
---|
238 | MnMinos Minos(fcn,min);
|
---|
239 | pair<double,double> eminos[npar];
|
---|
240 | for(int ip=0;ip<npar;ip++) {
|
---|
241 | eminos[ip].first = eminos[ip].second = 0.;
|
---|
242 | if(!ustate.Parameter(ip).IsFixed()) eminos[ip] = Minos(ip);
|
---|
243 | cout<<"Minos: "<<ip<<" err=["<<eminos[ip].first<<","<<eminos[ip].second<<"]"<<endl;
|
---|
244 | }
|
---|
245 | }
|
---|
246 |
|
---|
247 | nfile++;
|
---|
248 | }
|
---|
249 |
|
---|
250 | // --- Fin du job
|
---|
251 | if(nfile>0) pos.PutObject(nt,"nt");
|
---|
252 | if(ncov>0) {Cov /= (double)ncov; pos.PutObject(Cov,"cov");}
|
---|
253 |
|
---|
254 | return 0;
|
---|
255 | }
|
---|
256 |
|
---|
257 | //--------------------------------------------------
|
---|
258 | MyFCN::MyFCN(HistoErr& herr,PkSpectrumZ& pk)
|
---|
259 | : herr_(herr) , pk_(pk)
|
---|
260 | {
|
---|
261 | }
|
---|
262 |
|
---|
263 | void MyFCN::Init(const vector<double>& par) const
|
---|
264 | {
|
---|
265 | double A=par[1], Ocdm0=par[2], Ob0=par[3], Ol0=par[4], h100=par[5], ns=par[6];
|
---|
266 | pk_.GetPk0().GetPkIni().SetSlope(ns);
|
---|
267 | pk_.GetPk0().GetPkIni().SetNorm(A);
|
---|
268 | pk_.GetPk0().GetTransfert().SetParTo(h100,Ocdm0,Ob0);
|
---|
269 | pk_.GetGrowthFactor().SetParTo(Ocdm0+Ob0,Ol0);
|
---|
270 | }
|
---|
271 |
|
---|
272 | double MyFCN::Func(double x,const vector<double>& par) const
|
---|
273 | // par: [0]=B, [1]=A, [2]=Ocdm0, [3]=Ob0, [4]=Ol0, [5]=h100, [6]=npow
|
---|
274 | {
|
---|
275 | Init(par);
|
---|
276 | return pk_(x) + par[0];
|
---|
277 | }
|
---|
278 |
|
---|
279 | double MyFCN::operator()(const vector<double>& par) const
|
---|
280 | {
|
---|
281 | Init(par);
|
---|
282 | double xi2 = 0.;
|
---|
283 | for(int i=0;i<herr_.NBins();i++) {
|
---|
284 | double e2 = herr_.Error2(i);
|
---|
285 | if(e2<=0.) continue;
|
---|
286 | double x = herr_.BinCenter(i);
|
---|
287 | double v = herr_(i);
|
---|
288 | double f = Func(x,par);
|
---|
289 | xi2 += (v-f)*(v-f)/e2;
|
---|
290 | }
|
---|
291 | return xi2;
|
---|
292 | }
|
---|
293 |
|
---|
294 | /*
|
---|
295 | openppf cmvfitpk.ppf
|
---|
296 |
|
---|
297 | print nt
|
---|
298 |
|
---|
299 | set i 0
|
---|
300 | zone
|
---|
301 | disp h$i "nsta hbincont err"
|
---|
302 | disp hf$i "nsta same red"
|
---|
303 |
|
---|
304 | zone
|
---|
305 | disp hd$i "nsta hbincont err red"
|
---|
306 | disp hd$i "nsta same"
|
---|
307 |
|
---|
308 | zone
|
---|
309 | n/plot nt.xi2
|
---|
310 |
|
---|
311 | zone
|
---|
312 | n/plot nt.a
|
---|
313 | n/plot nt.b
|
---|
314 | n/plot nt.b%a ! ! "crossmarker5"
|
---|
315 |
|
---|
316 | n/plot nt.oc
|
---|
317 | n/plot nt.ob
|
---|
318 | n/plot nt.oc+ob
|
---|
319 | n/plot nt.ob%oc ! ! "crossmarker5"
|
---|
320 |
|
---|
321 | n/plot nt.ea
|
---|
322 | n/plot nt.eb
|
---|
323 | n/plot nt.ea%eb ! ! "crossmarker5"
|
---|
324 |
|
---|
325 | disp cov "zoomx30"
|
---|
326 | del cor
|
---|
327 | c++exec \
|
---|
328 | TMatrix<r_8> cor(cov,false); cor = 0.; \
|
---|
329 | for(int i=0;i<cor.NRows();i++) { \
|
---|
330 | for(int j=0;j<cor.NCols();j++) { \
|
---|
331 | double v = cov(i,i)*cov(j,j); \
|
---|
332 | if(v<=0.) continue; \
|
---|
333 | cor(i,j) = cov(i,j)/sqrt(v); \
|
---|
334 | } } \
|
---|
335 | KeepObj(cor); \
|
---|
336 | cout<<"Matrice cor cree "<<endl;
|
---|
337 |
|
---|
338 | disp cor "zoomx30"
|
---|
339 |
|
---|
340 | */
|
---|