Re: 2 Tree Questions

Rene Brun (Rene.Brun@cern.ch)
Mon, 17 May 1999 14:52:37 +0000


Hi Olivier,
In the following, I assume that you are selecting a small subsample
of your original tree and that your tree contains many branches.
I have modified your code below to
- read only the branches required to perform your selection.
- for events passing the 4 selection criteria read the full event

You could optimize this logic further by calling branch->getEvent
only when it is really required.

from your code, I have the feeling that you are filling possibly many
times your sub_tree for a given input event !

Concerning the error;

Warning in <TBranch::GetBasket>: Estimated keylen too small=14465

It is likely that you have created the sub_tree in the same file
(may be read only) than the original_tree. I need the full listing
to understand this problem. Do you get this error when you read
the sub_tree in a separate session?

Rene Brun

b=original_tree->GetBranch("EventBranch"); //b is a TBranch
evt= new Event(); //my event class
b->SetAddress(&evt);
if(sub_tree!=0) delete sub_tree;
sub_tree=original_tree->CloneTree(0);
// Int_t kTime,kAmplitude,kPileUp,kChannel; //flags for selection
TBranch *bTime = original_tree->GetBranch("Time");
TBranch *bAmplitude = original_tree->GetBranch("Amplitude");
TBranch *bPileUp = original_tree->GetBranch("PileUp");
TBranch *bChannel = original_tree->GetBranch("Channel");
Int_t i;
for(i=0;i < o_nentries ; i++) {
bChannel->GetEvent(i);
bAmplitude->GetEvent(i);
bPileUp->GetEvent(i);
bTime->GetEvent(i);

if (event_is_rejected) continue; //your set of tests
original_tree->GetEvent(i);
sub_tree->Fill();
}

Olivier Meplan wrote:
>
> Hi rooters!
>
> I have 2 questions about trees (certainly very stupid...)
>
> 1) I have a tree with a single branch; the number of entries is of the
> order of 50 000 000. I want to make a sub tree of that tree with some
> conditions; for that I use the following code
>
> b=original_tree->GetBranch("EventBranch"); //b is a TBranch
> evt= new Event(); //my event class
> b->SetAddress(&evt);
> if(sub_tree!=0) delete sub_tree;
> sub_tree=original_tree->CloneTree(0);
> Int_t kTime,kAmplitude,kPileUp,kChannel; //flags for selection
> Int_t i;
> for(i=0;i < o_nentries ; i++) //o_entries=
> //original_tree->GetEvent()
> {
> b->GetEvent(i);
> kChannel=0; //evt_sel contains my selections
> for (Int_t k=0;k<evt_sel->GetNChannel();k++)
> {
> if(evt->GetChannel()==evt_sel->GetChannel(k)) kChannel=1;
> if(evt_sel->Tmax>evt_sel->Tmin)
> kTime=(evt->GetTime()>=evt_sel->Tmin &&
> evt->GetTime()<=evt_sel->Tmax);
> else kTime=1;
> if(evt_sel->Amax>evt_sel->Amin)
> kAmplitude=(evt->GetAmplitude()>=
> evt_sel->Amin &&
> evt->GetAmplitude()<=evt_sel->Amax);
> else kAmplitude=1;
> if(evt_sel->PileUpBit!=2)
> kPileUp=(evt->GetPileUpBit()==
> evt_sel->PileUpBit);
> else kPileUp=1;
> if(kTime && kAmplitude && kPileUp && kChannel)
> sub_tree->Fill();
> }
> }
> sub_tree->SetName("Sub_E");
>
> With that code it took a very long time to make the sub tree!
> (Up o 5 min); What can I do to increased the speed?
>
> 2) question 2.
>
> In my interface I have 3 tree pointers: one for the original_tree, one
> for the sub_tree and one named cuurent_tree wich take the value of
> original_tree or of the sub_tree depending of the user choice.
> There is no pb when I try to draw a given selection of the original_tree
> but when I do the same thing for the sub_tree I have the following error
> message:
>
> Warning in <TBranch::GetBasket>: Estimated keylen too small=14465
> Fatal in <operator new>: storage exhausted
>
> which of course I don't understand...
> Thanks for your help
> Olivier Meplan