Re:  Event/TTree reading

From: <naumov_at_nusun.jinr.ru>
Date: Fri, 15 Dec 2006 20:08:41 -0000 (UTC)


Hi Rene,

thank you for this suggestion - it might be an option. Dmitry

> Dmitry,
>
> If your events are so large that one single event does not fit in
> memory, you should make
> one tree per event and call TTree::Fill for each Track.
> That's what we do in the case of Alice where a simulated event can be
> Gigabytes.
>
> Rene Brun
>
> Dmitry Naumov wrote:
>> Hi Rene,
>>
>> let me be more precise. My Event has a structure like this:
>> class Event {
>> <>
>> private:
>> Header *fHeader;
>> Hits *fHits;
>> <>
>> }
>>
>>
>> in the simulation chain (VMC ) we do something like this:
>>
>> // generate events: propagate tracks. fEvent is Event* object
>> if ( fEvent->GetTracksNumber() > kMaxTracksNumber) {
>> // reached limit: save the event, clear it, save to the TTree and
>> continue simulation saving the information into the new entry of TTree
>> tree->Fill();
>> fEvent->Clear();
>> }
>>
>> The output Tree is saved with Event as branch. As the result we have
>> something like this in the output TTree:
>>
>> entry 0 Event 0
>> entry 1 Event 1
>> entry 2 Event 2 (event is splitted and continued in the next entries)
>> entry 3 Event 2 (continued from entry 2)
>> entry 4 Event 2 (continued from entry 2)
>> entry 5 Event 3
>> entry 6 Event 4
>>
>> and so on.
>>
>>
>> Now if I want to read these events in the analysis code I have to
>> handle somehow that entries 0,1,5,6 return me fully contained
>> Event(s), while entries 2,3,4 belong to the same Event 2
>> Therefore if I want say to fill two histos (one with energy of initial
>> particle, another with energy released in the detector) I encounter a
>> problem:
>> for (int i(0); i<tree->GetEntries(); i++) {
>> tree->GetEntry(i);
>> h1->Fill(ev->GetHeader()->Energy());// this will fill the
>> histogram three times with the same Event 2 (entries 2,3,4)
>> h2->Fill(ev->GetHits()->GetTotalEnergyReleased()); // this will
>> fill the histogram with smaller energy released because Event 2 is
>> stored as three entries 2,3,4
>>
>> }
>>
>> Therefore I have to take care somehow about a correct handling of
>> these events when I read them.
>>
>>
>> Thank you for your considerations, Dmitry
>>
>>
>> Rene Brun wrote:
>>> Hi Dmitry,
>>>
>>> I am afraid that you will have to provide more information if you
>>> want to get a meaningful answer.
>>> Did you look at the friend trees. See TTree::AddFriend.
>>>
>>> Rene Brun
>>>
>>> Dmitry Naumov wrote:
>>>> Dear Rooters,
>>>>
>>>> may I ask your advice on the following problem. We save simulated
>>>> events into a TTree object. However sometimes the events are too
>>>> large and we split them into pieces and save each piece as an entry
>>>> of the TTree. This works OK. What would be a clever way to read
>>>> these events from the TTree?
>>>> A simple code which we had before (before splitting) is not useful
>>>> anymore:
>>>>
>>>> // open the tree
>>>> Event *ev=0;
>>>> tree->SetBranchAddress("fEvent",&ev);
>>>> do (int i(0); i<tree->GetEntries()l i++) {
>>>> tree->GetEntry(i);
>>>> // do something with ev: fill its global information (energy,
>>>> position, etc), fill its hits
>>>> }
>>>>
>>>>
>>>> Following this way the concept of entry as an event is no more
>>>> working, and we have to organize something like "SubEvent" and do
>>>> cycle over ev->GetSubEvents() entries or so. This is the way I have
>>>> in mind. However before trying to realize it it would be great if
>>>> ROOT/C++ gurus could give an advice on that. [Building the whole
>>>> event from different entries of TTree is not OK because the event
>>>> might not fit into the memory].
>>>>
>>>> Thank you in advance, Dmitry
>
Received on Fri Dec 15 2006 - 17:07:52 MET

This archive was generated by hypermail 2.2.0 : Mon Jan 01 2007 - 16:32:02 MET