Re: [ROOT] Reading Multiple Files Bug?

From: Rene Brun (Rene.Brun@cern.ch)
Date: Thu Nov 02 2000 - 08:58:36 MET


Hi Jeff,
I have seen a few occurences of this problem on Linux. It seems
to happen when the directory you are looping on is modified during
the loop execution. When calling TChain::Add in the loop, the function
opens the corresponding Root file to read the number of entries in the tree.
It seems that the opening of the file generates sometimes an update
of the system directory internal Inodes generating garbage later on
in gSystem->GetDirEntry.
May be some Linux guru could clarify this!

Are your files NFS or AFS or non-local files?

Rene Brun

 Jeffrey Reid wrote:
> 
> Hi all
> 
>   I have been using a little code bit I adapted from some roottalk posts
> and I have found a weird bug.  I want to specify a directory, and have
> ROOT find all of the relevant files (.ebe.root in my case) in that
> directory and add them to my analysis chain.
> 
>   The problem I am encountering is that in directories with many files
> (around 700) the code below is finding some files multiple times (it ends
> up double counting most of the files).  The bizzare thing is that if I
> comment out the myChain->Add() command and just find the files without
> adding them to the chain it only finds each file once and behaves as
> expected.  I fixed this by adding an intermediate step that puts the files
> in an array once found and then adds the files from the array to the chain
> and it works without problems, but I thought I should point this out since
> it look to be a bug to me.
> 
> Jeff
> 
> code fragment below...
> 
> ROOT_LEVEL : 2.25.01  running on RedHat Linux 6.1
> ------------------------------------------------------------------
> 
>   TChain *myChain = new TChain("myTree");
> 
>   Int_t nfiles = 0;
>   Char_t *file;
>   Char_t path_file[100];
>   Char_t dirname[]="~/mydir/";
> 
>   void *dirhandle = gSystem->OpenDirectory(gSystem->ExpandPathName(dirname));
>   while (file = gSystem->GetDirEntry(dirhandle)) {
>     if (strstr(file,".ebe.root") != 0) {
>       strcpy(path_file,dirname);
>       strcat(path_file,file);
>       myChain->Add(path_file);  // comment this line out and it works!!
>       printf("file %d: %s\n",nfiles,path_file);
>       nfiles++;
>     }
>   }
> 
>   if (nfiles == 0) {
>     printf("No *.ebe.root files found in specified directory\n");
>     break;
>   }



This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:36 MET