Re: [ROOT] Iterating through a file: bug?

From: Valeri Fine (fine@bnl.gov)
Date: Wed May 15 2002 - 17:40:36 MEST


Hello 
HAve a look at
http://root.cern.ch/root/htmldoc/TFileIter.html#TFileIter:description

Try an examploe below to see how it works:

// $Id: $
// Author: Valery Fine(fine@bnl.gov)   01/03/2001
//
//////////////////////////////////////////////////////////////////////////
// This macros tests the various methods of TFileIter class.
//////////////////////////////////////////////////////////////////////////
//
// Copyright(c) 2001 [BNL] Brookhaven National Laboratory, Valeri Fine (fine@bnl.gov). All right reserved",
//
// Permission to use, copy, modify and distribute this software and its 
// documentation for any purpose is hereby granted without fee,
// provided that the above copyright notice appear in all copies and
// that both that copyright notice and this permission notice appear
// in supporting documentation.  The author makes no
// representations about the suitability of this software for any
// purpose.  It is provided "as is" without express or implied warranty.
//////////////////////////////////////////////////////////////////////////

void TestFileIter(){
// This macros tests the various methods of TFileIter class.
  gSystem->Load("libStar");

  //First create simple ROOT file
  TDataSet *ds = new TDataSet("event");
  TObject *nextObject = 0; 
  TRandom run;
  TRandom event;
  {
    TFileIter *outSet = new TFileIter("test.root","RECREATE");
    UInt_t totalEvent = 4;
    UInt_t runNumber  = 20010301;
    Int_t i=0;
    Int_t j=0;
    for (;j < 3;j++) {
      for (i = 1;i<totalEvent;i++) {
        outSet->NextEventPut(ds,UInt_t(i),UInt_t(runNumber+j+10*run.Rndm()-5));
      }
    }
    delete outSet;
  }
  printf(" ----------------------> TFile has been created <--------------------\n");
  TFile *f = new TFile("test.root");
  TFileIter readObj(f);
  // the number of the object available directly from "MyDataSet.root"
  Int_t size = readObj.TotalKeys();
  printf(" The total number of the objects: %d\n",size);

  //-----------------------------------------------------------------------
  // Loop over all objects, read them in to memory one by one

  printf(" -- > Loop over all objects, read them in to memory one by one < -- \n");
  for( readObj = 0; int(readObj) < size; readObj.SkipObjects() ){ 
      nextObject = *readObj; 
      printf(" %d bytes of the object \"%s\" of class \"%s\" written with TKey \"%s\"  has been read from file\n"
               ,readObj.GetObjlen()
               ,nextObject->GetName()
               ,nextObject->IsA()->GetName()
               ,(const char *)readObj
            );
      delete nextObject;
 }
//-----------------------------------------------------------------------
//  Now loop over all objects in inverse order
 printf(" -- > Now loop over all objects in inverse order < -- \n");
 for( readObj = size-1; (int)readObj >= 0; readObj.SkipObjects(-1))
 { 
      nextObject = *readObj; 
      if (nextObject) {
         printf(" Object \"%s\" of class \"%s\" written with TKey \"%s\"  has been read from file\n"
                ,nextObject->GetName()
                , nextObject->IsA()->GetName()
                ,(const char *)readObj
               );
        delete nextObject;
     } else {
       printf("Error reading file by index\n");
     }
 }
//-----------------------------------------------------------------------
// Loop over the objects starting from the object with the key name "event.02.01"
  printf(" -- > Loop over the objects starting from the object with the key name \"event.02.01\" < -- \n");
  for( readObj = "event.02.01"; (const char *)readObj != 0; readObj.SkipObjects()){ 
      nextObject = *readObj; 
      printf(" Object \"%s\" of class \"%s\" written with Tkey \"%s\"  has been read from file\n"
              , nextObject->GetName()
              , nextObject->IsA()->GetName()
              , (const char *)readObj
            );
      delete nextObject;
  }
// Loop over the objects starting from the object with the key name "event.02.01"
  printf(" -- > Loop over the objects starting from the 86-th object < -- \n");
  for( readObj = (const char *)(readObj = 86); (const char *)readObj != 0; readObj.SkipObjects()){ 
      nextObject = *readObj; 
      printf(" Object \"%s\" of class \"%s\" written with Tkey \"%s\"  has been read from file\n"
              , nextObject->GetName()
              , nextObject->IsA()->GetName()
              , (const char *)readObj
            );
      delete nextObject;
  }

}

-----
Dr.Valeri Fine
STAR/US Atlas                                    E-mail: fine@bnl.gov
Brookhaven National Lab                Phone: +1 631 344 7806
Upton, NY 11973-5000                       FAX:     +1 631 344 4206
USA



----- Original Message ----- 
From: "Rene Brun" <Rene.Brun@cern.ch>
To: "Mike Kordosky" <kordosky@mail.hep.utexas.edu>
Cc: "ROOTtalk Mailing List" <roottalk@pcroot.cern.ch>
Sent: Wednesday, May 15, 2002 3:29 AM
Subject: Re: [ROOT] Iterating through a file: bug?


> Hi Mike,
> 
> TKey::ReadObj reads from the current file. In your case, you must
> activate (as you found out) the line
>   infile.cd();
> 
> Rene Brun
> 
> 
> Mike Kordosky wrote:
> > 
> > Hi,
> > 
> > Is this a bug?:
> > 
> >     const string inname(argv[1]);
> >     const string outname(argv[2]);
> > 
> >     TFile infile(inname.c_str(), "read");
> >     TFile outfile(outname.c_str(), "recreate");
> > //    infile.cd();
> >     TIter it(infile.GetListOfKeys());
> > 
> >     while(TKey* key = static_cast<TKey*>(it())){
> >         TObject* obj = key->ReadObj();
> >         .
> >         .
> >         .
> > 
> > I get errors of the form:
> > 
> > Error in <TFile::ReadBuffer>: error reading all requested bytes from file
> > junk.root, got 0 of 318
> > R__unzip: error in header
> > 
> > I suppose that this is because junk.root corresponds to "outfile" above
> > and it has just been created.  But why is it reading from the "outfile"
> > rather than the "infile"?  Is this the desired behavior and if so, why?
> > 
> > Uncommenting the line infile.cd() fixes the problem.
> > 
> > I use root 3.02/07 with gcc2.95.3 on a linux pc.
> > 
> > Mike Kordosky
> > 
> > --
> > Graduate Research Assistant  // High Energy Physics Lab
> > kordosky@hep.utexas.edu     // University of Texas at Austin
> > kordosky@fnal.gov          //
> > ph: (512) 471-8426 (RLM Lab, Office)
> >     (512) 475-8673 (ENS Lab)
> 



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