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

From: Melinda Siciliano <mellybinda_at_gmail.com>
Date: Thu, 13 Mar 2008 10:17:00 +0100


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> 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>> 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>> 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>> 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 - 10:17:13 CET

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