Hello Rooters, I have some problems with histograms statistics after fitting. I'm using ROOT 2.00/10 RedHat 5.0 with glibc. At first below program (a part of bigger program) fits some spectrum (sorry, a few minutes), write the results (10 parameters of fitting as a histogram to the file), but a few last errors of these parameters (ey[7],ey[8],ey[9]) are drawn uncorectly as I insert line hout[p][r]->Fill(x[i],y[i]); All is OK if I use the graph or hout[p][r]->SetBinContent(i+1,y[i]); I don't understand such behaviour. I prefer to use Fill, because SetBinContent doesn't calculate Mean and RMS. In both cases I have to calculate numbers of entries manually and set it by TH1::SetEntries. I think there whould be nice to have TH1::SetMean() and TH1::SetRMS() as well. Next the graph hasn't got such statistics box. :-( Nevertheless, I'd like to know whether is implemented for the histogram in ROOT the calculation of the right mean and the RMS in case such external errors? Is it made by weights w[i]=1/ey[i]? Is it made automaticly? I'm not sure if I insert it properly. My fitting gives big errors as I use the Minos technique, so I'm not sure how reliable my results are. Nevertheless, I'm surprised that if I insert N_mean manually ( so little diferent from the read value) the results would change so dramaticly. Is my fitting so flexible? Any comments are welcome. Tadeusz // spect.C Int_t p_min=5; Int_t p_max=5; Int_t r_min=6; Int_t r_max=6; Int_t m_min=4; Int_t m_max=32; Int_t npar=10; Int_t Nshow_max=500; const Int_t M=35; Double_t fac[M]; Double_t shift=-0.2; Double_t step=0.05; Double_t N_mean; Int_t p; Int_t r; Int_t m; Double_t Factorial(Int_t f) { Int_t b; Double_t x; if(f==0) { x=1.0; return x; } x=1; b=0; do { b=b+1; x=x*b; }while(b!=f); return x; } Double_t fitf(Double_t *x, Double_t *par) { Int_t N; Double_t dN,lN; Int_t k=x[0]; if(k>m) return 0; Double_t kk=fac[k]; Double_t mm=fac[m]; Double_t mk=fac[m-k]; Double_t Binomial=mm/kk/mk; Double_t a1,a2,a3,fun1; Double_t At,Ad,a0; At=TMath::Pi()*100*((r+1)*(r+1)-r*r); Ad=3.24; a0=Ad/At; Double_t sum=0; for(N=0;N<npar;N++) { lN=shift+N*step; dN=N_mean*TMath::Power(10,lN); a1=1-TMath::Exp(-dN*a0); a2=TMath::Power(a1,k); a3=TMath::Exp(-dN*(m-k)*a0); fun1=Binomial*a2*a3; sum=sum+par[N]*fun1; } return sum; } void spect() { TFile *fin=new TFile("dep.root"); TFile *fout = gROOT->FindObject("spect.root"); if(fout) fout->Close(); fout = new TFile("spect.root","RECREATE","ROOT file"); fin->cd(); TCanvas *page = new TCanvas("page"); page->Divide(1,2); page->cd(1); page_1->SetGrid(); page_1->SetLogy(); const Int_t P=35; const Int_t R=20; TH1S *hin[P][R]; TH1F *hout[P][R]; TF1 *fun[P][R]; for(Int_t i=0;i<M;i++) fac[i]=Factorial(i); char hname[20],hname1[20],hname2[20]; char dirname[50]; Int_t j,hit,np,sfit,Nshow,sum_Nshow,max_Nshow,mx; Float_t x[npar],ex[npar],y[npar],ey[npar]; TF1 *func=new TF1("func",fitf,0,35,npar); func->SetLineColor(2); fout->cd(); TDirectory *din=fout->mkdir("din"); TDirectory *dout=fout->mkdir("dout"); for(p=p_min;p<=p_max;p++) { for(r=r_min;r<=r_max;r++) { sprintf(hname,"h%d",0); TH2S *h0=(TH2S*)fin.Get(hname); sprintf(hname1,"h%d",1); TH1F *h1=(TH1F*)fin.Get(hname1); sprintf(hname2,"h%d",2); TH1F *h2=(TH1F*)fin.Get(hname2); N_mean=h2->GetMean(); // N_mean=57.985262; printf("N_mean=%f\n",N_mean); for(Int_t i=0;i<npar;i++) { y[i]=0; ey[i]=0; } char pname[20]; sum_Nshow=0; max_Nshow=0; for(m=m_min;m<=m_max;m++) { Nshow=h1->GetBinContent(m+1); printf("oooo m=%d Nshow=%d oooo\n",m,Nshow); if(Nshow>max_Nshow) { max_Nshow=Nshow; mx=m; } } m=mx; printf("********************************************************\n"); printf("p=%d r=%d m=%d max_Nshow=%d\n",p,r,m,max_Nshow); printf("********************************************************\n"); if(max_Nshow>Nshow_max) { din->cd(); sprintf(pname,"hin_p%d_r%d",p,r); hin[p][r]=new TH1S(pname,"hin",m+2,0,m+1); hin[p][r].SetMinimum(1e-2); np=0; for(j=0;j<=m;j++) { hit=h0->GetCellContent(j+1,m+1); hin[p][r]->Fill(j,hit); np=np+hit; } hin[p][r].SetEntries(np); for (Int_t ipar=0;ipar<npar;ipar++) { func->SetParLimits(ipar,0,1e10); func->SetParameter(ipar,1); } hin[p][r]->Fit("func","brew","",0,m); fun[p][r]=hin[p][r]->GetFunction("func"); for(Int_t i=0;i<npar;i++) { y[i]=fun[p][r]->GetParameter(i); ey[i]=fun[p][r]->GetParError(i); } sum_Nshow=sum_Nshow+Nshow; } else for(Int_t i=0;i<npar;i++) { y[i]=0; ey[i]=0; } page->cd(2); page_2->SetGrid(); page_2->SetLogy(); dout->cd(); hout[p][r]=new TH1F("hout","hout",npar,shift-step,shift+(npar+1)*step); hout[p][r].SetLineWidth(2); hout[p][r].SetLineStyle(1); hout[p][r].SetLineColor(1); hout[p][r].SetXTitle("dN"); hout[p][r].SetYTitle("N"); hout[p][r].SetMinimum(1e-5); hout[p][r].SetMaximum(1e4); Int_t nm; Float_t Nmi,dNmi; sfit=0; // hout[p][r]->Sumw2(); for(Int_t i=0;i<npar;i++) { x[i]=shift+i*step; ex[i]=0.001; hout[p][r]->Fill(x[i],y[i]); // hout[p][r]->SetBinContent(i+1,y[i]); hout[p][r]->SetBinError(i+1,ey[i]); printf("y[%d]=%f ey[%d]=%f\n",i,y[i],i,ey[i]); sfit=sfit+y[i]; } sfit=(int) sfit; hout[p][r]->SetEntries(sfit); hout[p][r]->Draw("A"); char hn[20]; sprintf(hn,"hout_p%d_r%d",p,r); hout[p][r].SetName(hn); } } fout.Write(); delete fin; delete fout; } -- Tadeusz Pytlos mailto:pytlos@fizwe5.fic.uni.lodz.pl Lodz, Poland
This archive was generated by hypermail 2b29 : Tue Jan 04 2000 - 00:34:37 MET