[ROOT] Mixed events from TChains

From: Christian Holm Christensen (cholm@hehi03.nbi.dk)
Date: Sat Jan 25 2003 - 19:11:11 MET


Hi ROOT'ers, 

I have a question on how to do mixed event analysis using TChains.  

The point of it all is, that given that you're in some event, you'd
like to read another event too, be it a previous or a later event.  So
in terms of (meta-) code, it be something like:


   DO WHILE there are more events to read 

      read next event into memory 

      read a previous or later event into memory too 

      process the two events 

  END 

or in a more ROOT like way: 

   TChain* chain = ... 
   chain->Add(... 
   chain->SetBranchAddress("Event", &event); 
   ... 

   while (chain->GetEntry(i++)) { 
     ... 
     chain->SetBranchAddress("Event", &other); 
     chain->GetEntry(j);

     mix_events->(event, other);
     
     chain->SetBranchAddress("Event", &event); 
   }	
	

I think the problem is, that TChains are a bit particular on how you
access the data in them - they want you to read the files that make up
the chain sequentially - that is, you can not cross file boundaries.  

I made an (simple) example, which is available at 

  http://cholm.home.cern.ch/cholm/root/mixevent.tar.gz 

Take a look at that code.  Try it as follows: 

   > tar -xzvf mixevent.tar.gz
   > cd mixevent
   > make check 

As it is now, it will fail, as it's reading two events ahead, hence
crossing file boundaries.  Now, try running it skipping only one event
ahead

   > ./Read 1

That should work.  Now, try running it again, reading some events
backward:

   > ./Read <any negative number>

No matter what the absolute value of <any negative number> is, as long
as it's negative, it will always fail when you're reading back over a
file boundary.

I can think of 3 ways of working around this:

1) Make the user set a flag that caches the current event, and they
   can then call it back from memory storage later on.  This obviously
   doesn't work if you want to read events ahead of the current one.

2) Always keep say 5 events in memory, and let the `current' point to
   the middle one.  Hence the user can use up to 2 events
   forward/backward - this behaviour could be dependable one a runtime
   flag of course.

3) Allow unlimited access to previous or next events, as long as they
   are within the same file as the current event.  I believe there's a
   method to get the index in the current tree rather than in the
   chain (I think it's used when you do TChain::MakeClass).

I personally prefer option 3.  

Now my question: What am I doing wrong here?  Have I missed something
in the documentation?  Is there anyway to do this kind of thing more
naturally, than the 3 work-a-rounds?  If not, could there be?

Thank you. 

Yours, 

 ___  |  Christian Holm Christensen 
  |_| |	 -------------------------------------------------------------
    | |	 Address: Sankt Hansgade 23, 1. th.  Phone:  (+45) 35 35 96 91
     _|	          DK-2200 Copenhagen N       Cell:   (+45) 24 61 85 91
    _|	          Denmark                    Office: (+45) 353  25 305
 ____|	 Email:   cholm@nbi.dk               Web:    www.nbi.dk/~cholm
 | |



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:08 MET