Hi Christian,
In the ProcessFill function, you should call GetEntry for
the current Tree in the chain, not for the chain itself.
I have modified your code (attachement) to get the correct behaviour.
I have renamed your variable fTree to fChain to show what was the
confusion.
You can also make a variant with a member called fTree in your class
in addition to fChain and compute ftree in Notify.
I will clarify this point in the documentation
Rene Brun
Christian Vogel wrote:
>
> Hi,
>
> On Thu, Dec 18, 2003 at 06:39:39PM +0100, Rene Brun wrote:
> > see : http://root.cern.ch/root/roottalk/RoottalkRules.html
>
> I also tried to create a small minimal test-file, so please see
> the attachments of this email. I also found out that I only read out the
> first file of the chain:
>
> I generate 3 files with a tree "t1" in it. The Tree is just one Branch,
> a integer, starting at a base of 100 (200,300) and only 4 events are
> stored in each tree:
>
> emil:tselector_bug$ ./tselector_bug
> Writing file tree1.root, base is 100
> Writing file tree2.root, base is 200
> Writing file tree3.root, base is 300
> new BugSelector!
> Begin->Init(0xbffff8f4)
> Notify()
> Notify() <----------- 2nd Notify?
> ProcessFill(0) -> 100
> ProcessFill(1) -> 101
> ProcessFill(2) -> 102
> ProcessFill(3) -> 103
> Notify()
> Notify() <---------- 2nd Notify?
> ProcessFill(0) -> 100 <---- Still reading tree1.root
> Notify()
> Notify() <----- two notifies per Event?
> ProcessFill(1) -> 101
> Notify()
> Notify()
> ProcessFill(2) -> 102
> Notify()
> Notify()
> ProcessFill(3) -> 103
> Notify()
> Notify()
> ProcessFill(0) -> 100
> Notify()
> Notify()
> ProcessFill(1) -> 101
> Notify()
> Notify()
> ProcessFill(2) -> 102
> Notify()
> Notify()
> ProcessFill(3) -> 103
> bye BugSelector!
>
> Chris
>
> --
> Rather than a beep
> Or a rude error message,
> These words: "File not found."
> -- Len Dvorkin
>
> --------------------------------------------------------------------------------
>
> tselector_bug.ccName: tselector_bug.cc
> Type: Plain Text (text/plain)
>
> MakefileName: Makefile
> Type: Plain Text (text/plain)
#include <stdio.h>
#include <TTree.h>
#include <TChain.h>
#include <TFile.h>
#include <TSelector.h>
#include <TApplication.h>
void write_tree(char *fn,int base){
Int_t dat;
fprintf(stderr,"Writing file %s, base is %d\n",fn,base);
TFile *of=new TFile(fn,"RECREATE");
TTree *ot=new TTree("t1","Tree 1");
ot->Branch("DatBranch",&dat,"dat/I");
for(int i=0;i<4;i++){
dat=i+base;
ot->Fill();
}
ot->Write();
delete ot;
delete of;
}
class BugSelector : public TSelector {
public:
Int_t dat;
TTree *fChain;
BugSelector(){ fprintf(stderr,"new BugSelector!\n"); };
~BugSelector(){ fprintf(stderr,"bye BugSelector!\n"); };
virtual Bool_t Notify(){
fprintf(stderr,"Notify()\n");
return kTRUE;
};
virtual void Begin(TTree *t){ fprintf(stderr,"Begin->"); Init(t); };
virtual void Init(TTree *t){
fprintf(stderr,"Init(%p), Version=%d, Status=%d\n",t,Version(),GetStatus());
fChain=t;
t->SetBranchAddress("DatBranch",&dat);
};
virtual void ProcessFill(Int_t entry){
fChain->GetTree()->GetEntry(entry);
fprintf(stderr,"ProcessFill(%d) -> %d\n",entry,dat);
};
};
int main(int argc,char **argv){
TApplication app("app",0,0);
write_tree("tree1.root",100);
write_tree("tree2.root",200);
write_tree("tree3.root",300);
TChain ch("t1","My Chain");
ch.Add("tree1.root");
ch.Add("tree2.root");
ch.Add("tree3.root");
BugSelector b;
ch.Process(&b);
}
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:17 MET