Re: How to get an Histogram ?

From: Jordi Nadal <jnadal_at_ifae.es>
Date: Fri, 9 Sep 2011 00:08:20 +0200


Hello Eduard,

You made the point. Now the macro works perfectly fine! :) I just did :

> TH1D *h;
> if (h) delete h;

in each step.

Thanks to all of you!

Jordi

On Sep 8, 2011, at 8:12 PM, Eduard Avetisyan wrote:

>
> Hello Jordi,
>
>
> On Thu, 8 Sep 2011, Jordi Nadal wrote:
>

>> Hello Eduard,
>> 
>> I think you are complete right. 
>> 
>> A delete histo; directly fails… so I am trying to set a different histo each iteration.

>
> Well you don't have a variable called "histo" in your script. To delete
> the object you should use the modified script like here:
>
>>>>  // this is not correct C++ but might be forgivable in CINT, not sure

> /* here goes the new histogram object */
> TH1D *h;
> if (h) delete h;
>>>> h = (TH1D*) gROOT->FindObject("histo");

>
> or, as another alternative, you may force recreating the histogram by
> specifying it's boundaries at the TTree::Draw() phase:
>
>>>>>  HangingTree->Draw(raw+">>histo(100,0.,10.)");

> this will effectively reset the histogram AND it's axis, but indeed this
> time you will have the same boundaries for both variables.
>
> Have fun
> Eduard
>
>
>> 
>> Thanks all again.
>> 
>> Cheers,
>> JOrdi
>> 
>> 
>> On Sep 8, 2011, at 4:43 PM, Eduard Avetisyan wrote:
>> 
>>> 
>>> 
>>> Hi Jordi,
>>> 
>>> Your problem is that the histogram actually doesn't get overwritten in the 
>>> subsequent calls. In your script, you first draw QCDnorm_corr_mu in 
>>> histogram named "histo", and then you put the QCDnorm_corr_mu_btag into 
>>> the SAME histogram. It's true, the contents is overwritten, but the 
>>> histogram limits are not adjusted to the new variable. It doesn't happen 
>>> if you wouldn't indicate the histogram name and use the default "htemp" 
>>> which has the corresponding flag of resetting also the axis with the new 
>>> data being filled. 
>>> 
>>> In short - if you would try in your interactive test the following 
>>> sequence:
>>> 
>>> root [1] HangingTree->Draw("QCDnorm_corr_mu>>histo")
>>> root [2] histo->GetMean()
>>> root [1] HangingTree->Draw("QCDnorm_corr_mu_btag>>histo")
>>> root [2] histo->GetMean()
>>> 
>>> you would see the same results as your script produces.
>>> If you want CORRECT values for the mean, either use different names for 
>>> the histograms, or take care to actually delete "histo" between fills.
>>> 
>>> Hope this helps,
>>> 
>>> 	Eduard
>>> 
>>> 
>>> On Thu, 8 Sep 2011, Jordi Nadal wrote:
>>> 
>>>> Hi Suvayu,
>>>> 
>>>> Thanks again for your time.
>>>> 
>>>> I just ran your macro.
>>>> 
>>>> [jnadal_at_at305 JetFitter]$ root test.C 
>>>> 
>>>> Welcome to the ATLAS rootlogon.C
>>>> root [0] 
>>>> Processing test.C...
>>>> Info in <TCanvas::MakeDefCanvas>:  created default TCanvas with name c1
>>>> QCDnorm_corr_mu -0.157223
>>>> QCDnorm_corr_mu_btag 0.106851
>>>> root [1] .q
>>>> [jnadal_at_at305 JetFitter]$ root PSE/JO_muon_PSE_RbFree/sumRootFile.root
>>>> 
>>>> Welcome to the ATLAS rootlogon.C
>>>> root [0] 
>>>> Attaching file PSE/JO_muon_PSE_RbFree/sumRootFile.root as _file0...
>>>> root [1] HangingTree->Draw("QCDnorm_corr_mu_btag>>histo")
>>>> Info in <TCanvas::MakeDefCanvas>:  created default TCanvas with name c1
>>>> root [2] histo->GetMean()
>>>> (const Double_t)1.69030729412928876e-01
>>>> root [3] 
>>>> 
>>>> My  problem is that I don't get the same number using the macro for variable (QCDnorm_corr_mu_btag) than looking at it in the root file.
>>>> 
>>>> Thanks,
>>>> Jordi
>>>> 
>>>> 
>>>> On Sep 8, 2011, at 2:46 PM, suvayu ali wrote:
>>>> 
>>>>> Hi Jordi,
>>>>> 
>>>>> I am not sure about your issue as I don't know what exactly you are
>>>>> trying to achieve. However after simplifying your example macro I
>>>>> found two errors:
>>>>> 
>>>>> {
>>>>> int N = 2;
>>>>> TString parnames[N] = { "QCDnorm_corr_mu", "QCDnorm_corr_mu_btag"};
>>>>> 
>>>>> 
>>>>> TFile *file = TFile::Open("PSE/JO_muon_PSE_RbFree/sumRootFile.root");
>>>>> TTree* HangingTree = (TTree*) file->Get("HangingTree");
>>>>> 
>>>>> for(int i=0; i<N;i++){
>>>>>  TString raw = parnames[i];
>>>>>  // here the histograms get overwritten by subsequent calls to Draw()
>>>>>  HangingTree->Draw(raw+">>histo");
>>>>>  // this line does multiple declaration of h as the loop proceeds
>>>>>  // this is not correct C++ but might be forgivable in CINT, not sure
>>>>>  TH1D *h = (TH1D*) gROOT->FindObject("histo");
>>>>>  std::cout << raw << " " << h->GetMean() << std::endl;
>>>>> }
>>>>> }
>>>>> 
>>>>> I hope this helps.
>>>>> 
>>>>> -- 
>>>>> Suvayu
>>>>> 
>>>>> Open source is the future. It sets us free.
>>>> 
>>>> 
>> 
Received on Fri Sep 09 2011 - 00:08:31 CEST

This archive was generated by hypermail 2.2.0 : Fri Sep 09 2011 - 05:50:01 CEST