Re: [ROOT] TChains doesn't read a second file

From: K. Hauschild (khauschild@cea.fr)
Date: Sun Feb 03 2002 - 20:40:27 MET


Dear Thomas,

Did you ever sort out the TChain problem :

>Hi rooters,
>
>I have two identical files (same trees, branches, etc. except the number
>of stored events and the data which is stored). I use a chain to read
>both files. 
>This works fine for the first file. But the TChain object doesn't read
>the last file. It returns the last event of the first file n-times
>(where n is the number of events in the second file)
>What can be wrong?
>
>Thanks,
>Thomas.

I am currently having a similar problem with the following file,
Version 3.02/07, and Solaris 5.9.

Is this related to LoadTree() ? or am I not defining addresses
correctly ?

Thanks,

Karl
**********************************************************************
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int ReadTree();



#ifndef __CINT__
#include "CintIncludes.h"

#include "ProtoExoScan.h"
#include "ProtoExoScan.cxx"

//______________________________________________________________________
int main()
{
  int n = ReadTree();
  return n;
}
#endif

#define TRIGGER  1
#include "hdrs/Define.h"

#define DATAFILE "/home/crash6/gamma/karl/ScanB.root"

static int bits[4] = {1,2,4,8};

//______________________________________________________________________
//______________________________________________________________________

int ReadTree()
{
#ifdef __CINT__
  //Load class if needed
  if (!TClassTable::GetDict("ProtoExoScan")) {
    gSystem.Load("libProtoExoScan.so");
  }
#endif
  
  //Compressed Scanning Data event class
  //ProtoExoScan::Class()->IgnoreTObjectStreamer(); //Remove fUniqueId,
fBits

  TChain *chain = new TChain("Crystal B");   //Chain the tree "Crystal
B"

  chain->Add("/home/crash6/gamma/karl/ScanB.root");
  if (chain == 0) return 0;
  Int_t nevents1 = Int_t(chain->GetEntries());
  printf("\n %d events",nevents1);
  
  chain->Add("/home/crash6/gamma/karl/ScanB2.root");
  if (chain == 0) return 0;
  Int_t nevents = Int_t(chain->GetEntries());
  printf("\n %d events",nevents);
  chain.Draw("fX");
  //return 0;

  //===============================================
  // Specify address where to read the event object
  // The event was stored in a branch called "Prototype"
  //===============================================
  
  //object must be created before setting the branch address
  ProtoExoScan *Data = new ProtoExoScan();
  
  //Super branch : CompData
  TBranch *branch = chain->GetBranch("ProtoType");
  branch->SetAddress(&Data);
  
  //Trigger Energy/Time branch
  TBranch *bTrigE = chain->GetBranch("fTrigger_E");
  
  //Scan Position branches
  TBranch *bX = chain->GetBranch("fX");
  TBranch *bY = chain->GetBranch("fY");
  
  
  //Output Root File
  TFile *hfile = new TFile("tempspec.root","RECREATE","Scanning Crystal
B");
  Int_t comp = 3;        // by default all files compressed
  hfile->SetCompressionLevel(comp);

  //Data Rates
  TStopwatch timer;
  timer.Start();
  double told  = timer.RealTime();
  double start = timer.RealTime();
  timer.Continue();
  double tnew = 0;
  int    printev = 1000;
  
  //Data Variables
  unsigned char pulse[4][250];
  unsigned char **p_pulse;
  
  int x, y, Gamma, Sid;
  int iGamma[4] = {121,344,964,1408};
  int nCrystals, nSegments;
  int segE[4], segT[4];
  int num;
  int TrigE, TrigT;          
  Int_t  seg, i, j, n;
  Int_t  ngam = 4;
  Int_t  nseg = 4;
  Int_t jentry, ientry;
  Int_t nbytes = 0;
  Int_t nb = 0;
  
  
#include "hdrs/HistDefs.h"
  
  //Loop over all chained events.....
  for (jentry=0; jentry<nevents;jentry++) {
    
    ientry = chain->LoadTree(jentry);

    //////////////////////////////////////////////////////
    //Examine ALL Data
    nb = chain->GetEntry(jentry); nbytes += nb;
    Data->GetData(&x, &y, &TrigE, &TrigT, &segE[0], &segT[0],
&pulse[0][0]);
    
    //Read just the Trigger Energy
    //nb = bTrigE->GetEntry(jentry);
    //assign trigger energy
    //TrigE = Data->GetTrigger_E();
    //hTrigger_E->Fill(TrigE);

    
    //Read just the Position
    //nb = bX->GetEntry(jentry); nbytes += nb;
    //nb = bY->GetEntry(jentry); nbytes += nb;
    
    //assign position...
    //Data->GetPosition(&x, &y);
    hPosition->Fill(x,y);
    
    
    // Timing
    //if ( (jentry%printev == 0) && (jentry != 0) ) {
    if ( (jentry%15000 == 0) && (jentry != 0) ) {
      tnew = timer.RealTime();
      printf("Entry:%d, rtime=%.2f s -> %.2f Events/s [%.2f]\n",
	     jentry,tnew-told,(printev)/(tnew-told),0.001*nbytes/(tnew-told));
      told=tnew; nbytes = 0;
      timer.Continue();
    }
  }
  
  hfile->Write();
  hfile->Close();
  //if (f) f->Close();
  
  return jentry;
}



==========================================================================

CEA Saclay, DAPNIA/SPhN                Phone  : (33) 01 69 08 7553
Bat 703 - l'Orme des Merisiers         Fax    : (33) 01 69 08 7584
F-91191 Gif-sur-Yvette                 E-mail :  khauschild@cea.fr
France                                          
karl_hauschild@yahoo.co.uk
                                       WWW:
http://www-dapnia.cea.fr/Sphn



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:40 MET