Re: Projection of a histograms.....again...

From: Melinda Siciliano <mellybinda_at_gmail.com>
Date: Thu, 13 Mar 2008 14:47:19 +0100


Hi,

I expect 256 entries per bin of the projection because I filled each cell of the 2D histogram only once and with something that is different from 0. In fact, in the macro I sent today I don't fill the histogram if the random number I obtained is equal to 0. So, what I expect is that each cell of the 2D histogram will have only one entry with a weight different from 0 and If I will do a projection respect to one axis and the calculation in the for cycle I will obtain that the entries for each bin of the projection will be 256 .

Bests,

Melinda

Melinda,

Why would you expect 256 entries per bin, given the fact that you fill each cell with a random number between 0 and 10 ? Lorenzo, please could you follow this discussion?

Rene

Melinda Siciliano wrote:
> Dear Rene,
>
> Thanks a lot! Now the problem of the total number of the entries is
> fixed. But Now I have another problem: If I compare the number of
> entries I expect (in this case, 256 for each bin) with the number I
> obtain from the loop, I obtain less effective entries. How can I
> resolve it?
>
> #if !defined(__CINT__) || defined(__MAKECINT__)
> #include <TH2F.h>
> #include <TCanvas.h>
> #include <TStyle.h>
> #include <TFile.h>
> #include <TRandom3.>
> #endif
>
> void prova1(Int_t seed)
> {
> TH2F *histo = new TH2F("histo","histo",256,-.5,255.5,256,-0.5,255.5);
> TRandom3 *random= new TRandom3(seed);
> histo->Sumw2();
> Double_t number=0;
> for(Int_t i=1;i<=256;i++)
> {
> for(Int_t j=1;j<=256;j++)
> {
> while(number==0){
> number= 10*random->Rndm();
> cout<<number<<endl;
> }
> histo->Fill(i-1.5,j-1.5,number);
> number=0;
> }
> }
>
> Int_t countentx=0;
> //Int_t countenty=0;
> Int_t countenty=0;
> Int_t count0=0;
> for(Int_t i=1;i<=histo->GetXaxis()->GetNbins();i++){
> if(countenty!=0) countenty=0;
> for(Int_t j=1;j<=histo->GetYaxis()->GetNbins();j++)
> {
> Double_t content=histo->GetBinContent(i,j);
> if(content!=0)
> {
> countenty=countenty+1;
> //countentx=countentx+countenty;
> }
> else
> if(content==0)
> {
> countenty=countenty+0;
> count0++;
> //countentx=countentx+0;
> }
> }
> cout<<"bin = "<<i<<"\t entries = "<<countenty<<"\tzero "<<count0<<endl;
> countentx=countentx+countenty;
> count0=0;
> }
> cout<<"total ="<<countentx<<endl;
> gStyle->SetPalette(1);
> TCanvas *canvas =new TCanvas("canvas","canvas");
> canvas->cd();
> histo->Draw("colz");
> canvas->Update();
>
> TH1D *px = histo->ProjectionX();
> Double_t nentries =px->GetEntries();
>
> TCanvas *canvas2 =new TCanvas("canvas2","canvas2");
> canvas2->cd();
> px->Draw();
> canvas2->Update();
>
> //TH1D *histo2=new TH1D("histo2","histo2",256,-0.5,255.5 );
> Int_t nbins = px->GetXaxis()->GetNbins();
> for (Int_t bin=1;bin<=nbins;bin++) {
> double y = px->GetBinContent(bin);
> double e = px->GetBinError(bin);
> double effe = 0;
> if (e != 0) effe = (y*y)/(e*e);
> cout<<"bin= "<<bin<<"\ty= "<<y <<"\te= "<<e <<"\teffe= "<<effe<<endl;
>
> px->SetBinContent(bin,effe);
> px->SetBinError(bin,0);
>
> //histo2->Fill(double(bin)-1.5,effe);
> //histo2->SetBinError(bin,0);
> }
> px->SetEntries(nentries);
> /*
> TCanvas *canvas3 =new TCanvas("canvas3","canvas3");
> canvas3->cd();
> histo2->Draw();
> canvas3->Update();
> */
> TCanvas *canvas4 =new TCanvas("canvas4","canvas4");
> canvas4->cd();
> px->Draw();
> canvas4->Update();
>
> }
>
>
> Thanks,
>
> Melinda
>
> On Thu, Mar 13, 2008 at 8:34 AM, Rene Brun <Rene.Brun_at_cern.ch
> <mailto:Rene.Brun_at_cern.ch>> wrote:
>
> Melinda,
>
> The call to hist.SetBinContent increases the number of entries by
> 1. In
> your case your call this
> function 256 times, so you get 256 additional entries. See the fix
> below
>
> Rene Brun
>
> TCanvas *canvas =new TCanvas("canvas","canvas");
> canvas->cd();
> histo->Draw("colz");
> canvas->Update();
> gStyle->SetPalette(1);
> TH1D *px = histo->ProjectionX();
> Double_t nentries = px->GetEntries(); //<==================
> Int_t nbins = px->GetXaxis()->GetNbins();
> for (Int_t bin=1;bin<=nbins;bin++) {
> double y = px->GetBinContent(bin);
> double e = px->GetBinError(bin);
> double effe = 0;
> if (e != 0) effe = (y*y)/(e*e);
> px->SetBinContent(bin,effe);
> px->SetBinError(bin,0);
> }
> px->SetEntries(nentries); //<===================
>
> TCanvas *canvas2 =new TCanvas("canvas2","canvas2");
> canvas2->cd();
> px->Draw();
> canvas2->Update();
>
>
> Melinda Siciliano wrote:
> > Hi,
> >
> > I make an error copying effe=(y*y)/(e*e), but the problem of the
> > entries remain......Sorry....
> >
> > Melinda
> >
> > #if !defined(__CINT__) || defined(__MAKECINT__)
> > #include <TH2F.h>
> > #include <TCanvas.h>
> > #include <TStyle.h>
> > #include <TFile.h>
> > #include <TRandom3.>
> > #endif
> >
> > void prova1(Int_t seed)
> > {
> >
> >
> > TH2F *histo = new
> TH2F("histo","histo",256,-.5,255.5,256,-0.5,255.5);
> > TRandom3 *random= new TRandom3(seed);
> > histo->Sumw2();
> > for(Int_t i=1;i<=256;i++)
> > {
> > for(Int_t j=1;j<=256;j++)
> > {
> > histo->Fill(i-1.5,j-1.5,random->Rndm());//in order to fill the
> > first bin
> >
> > }
> >
> > }
> >
> > TCanvas *canvas =new TCanvas("canvas","canvas");
> > canvas->cd();
> > histo->Draw("colz");
> > canvas->Update();
> > gStyle->SetPalette(1);
> > TH1D *px = histo->ProjectionX();
> > Int_t nbins = px->GetXaxis()->GetNbins();
> > for (Int_t bin=1;bin<=nbins;bin++) {
> > double y = px->GetBinContent(bin);
> > double e = px->GetBinError(bin);
> > double effe = 0;
> > if (e != 0) effe = (y*y)/(e*e);
> > px->SetBinContent(bin,effe);
> > px->SetBinError(bin,0);
> > }
> >
> > TCanvas *canvas2 =new TCanvas("canvas2","canvas2");
> > canvas2->cd();
> > px->Draw();
> > canvas2->Update();
> >
> > }
> >
> >
> >
> > On Wed, Mar 12, 2008 at 11:15 AM, Melinda Siciliano
> > <mellybinda_at_gmail.com <mailto:mellybinda_at_gmail.com>
> <mailto:mellybinda_at_gmail.com <mailto:mellybinda_at_gmail.com>>> wrote:
> >
> > Hello all,
> >
> > I have problem with the effective entries. I don't think to have
> > changed nothing, but now it seems to not work and I have
> that the
> > effective entries are bigger than I expect of a quantity
> like the
> > number of bin in the x axis.
> >
> > Melinda
> >
> > #if !defined(__CINT__) || defined(__MAKECINT__)
> > #include <TH2F.h>
> > #include <TCanvas.h>
> > #include <TStyle.h>
> > #include <TFile.h>
> > #include <TRandom3.>
> > #endif
> >
> > void prova1(Int_t seed)
> > {
> >
> >
> > TH2F *histo = new
> TH2F("histo","histo",256,-.5,255.5,256,-0.5,255.5);
> > TRandom3 *random= new TRandom3(seed);
> > histo->Sumw2();
> > for(Int_t i=1;i<=256;i++)
> > {
> > for(Int_t j=1;j<=256;j++)
> > {
> > histo->Fill(i-1.5,j-1.5,random->Rndm());//in order to fill
> > the first bin
> >
> > }
> >
> > }
> >
> > TCanvas *canvas =new TCanvas("canvas","canvas");
> > canvas->cd();
> > histo->Draw("colz");
> > canvas->Update();
> > gStyle->SetPalette(1);
> > TH1D *px = histo->ProjectionX();
> > Int_t nbins = px->GetXaxis()->GetNbins();
> > for (Int_t bin=1;bin<=nbins;bin++) {
> > double y = px->GetBinContent(bin);
> > double e = px->GetBinError(bin);
> > double effe = 0;
> > if (e != 0) effe = y*y/e*e;
> > px->SetBinContent(bin,effe);
> > px->SetBinError(bin,0);
> > }
> >
> > TCanvas *canvas2 =new TCanvas("canvas2","canvas2");
> > canvas2->cd();
> > px->Draw();
> > canvas2->Update();
> >
> > }
> >
> >
> >
> >
> > On Mon, Mar 10, 2008 at 5:23 PM, Lorenzo Moneta
> > <lorenzo.moneta_at_cern.ch <mailto:lorenzo.moneta_at_cern.ch>
> <mailto:lorenzo.moneta_at_cern.ch <mailto:lorenzo.moneta_at_cern.ch>>>
> wrote:
> >
> > Hello Melinda,
> >
> > we will plan to add this new functionality as an option for
> > all the histogram projected functions, not as a new method.
> > It is expected to have this implemented for the development
> > release schedule for April. Anyway I will let you know
> when it
> > will be in the SVN trunk,
> >
> > Best Regards
> >
> > Lorenzo
> >
> > On Mar 5, 2008, at 6:25 PM, Melinda Siciliano wrote:
> >
> >> Hi Rene and Lorenzo,
> >>
> >> I tried as Rene suggested me and it works! Thanks a lot!!!!
> >>
> >> May I ask you if when you put the new function in ROOT ,
> >> could you tell me then the name of the function in the
> way to
> >> substite it in my gui?
> >>
> >> Thanks,
> >>
> >> Melinda
> >>
> >> On Tue, Mar 4, 2008 at 5:24 PM, Rene Brun
> <Rene.Brun_at_cern.ch <mailto:Rene.Brun_at_cern.ch>
> >> <mailto:Rene.Brun_at_cern.ch <mailto:Rene.Brun_at_cern.ch>>>
> wrote:
> >>
> >> Hi Melinda,
> >>
> >> The projection of the effective entries is
> currently not
> >> implemented.
> >> It is not too complex to obtain what you want if
> you have
> >> called Sumw2
> >> on your TH2 object.
> >> In this case, make the projection using
> TH2::ProjectionX
> >> (or Y) and
> >> compute the effective entries
> >> with a code looking like
> >> TH2 *h2; //your Th2 object where Sumw2 has been
> >> called before filling
> >> TH1D *px = h2->ProjectionX();
> >> Int_t nbins = px->GetXaxis()->GetNbins();
> >> for (Int_t bin=1;bin<=nbins;bin++) {
> >> double y = px->GetBinContent(bin);
> >> double e = px->GetBinError(bin);
> >> double effe = 0;
> >> if (e != 0) effe = y*y/e*e;
> >> px->SetBinContent(bin,effe);
> >> px->SetBinError(bin,0);
> >> }
> >>
> >> This could be an option when calling
> TH2::ProjectionX,Y.
> >> Lorenzo, could you implement this code in all
> Projection
> >> functions?
> >>
> >> Rene Brun
> >>
> >> Melinda Siciliano wrote:
> >> > Dear all,
> >> >
> >> > I have an 2D-histogram filled using the weight. I
> would
> >> like to ask
> >> > you if there a way to make the projection of the
> >> effective entries of
> >> > the histogram.
> >> >
> >> > Thanks,
> >> >
> >> > Melinda
> >>
> >>
> >
> >
> >
>
>
Received on Thu Mar 13 2008 - 14:47:32 CET

This archive was generated by hypermail 2.2.0 : Thu Mar 13 2008 - 17:50:02 CET