Re: [ROOT] problems with TChain::Add and wildcards

From: Rene Brun (Rene.Brun@cern.ch)
Date: Fri Aug 03 2001 - 13:50:29 MEST


Hi Andre,

When wildcarding was used, the option to specify the tree name
was not recognized. Your proposed changes are OK. Now in CVS.

Rene Brun


On Fri, 3 Aug 2001, Andre Holzner wrote:

> Hello,
> 
> I have a set of ntuple files (converted using h2root)
> which all have the same ntuple id (h1001) and I'd like
> to chain them using 
> 
> TChain::Add("~/qqgg-run/presel-ntp-189/qq-*.root/h1001")
> 
> (otherwise, root seems to assume the filename is the tree name).
> 
> However, it looks like that the part after .root is ignored:
> 
> x = new TChain;
> root [9] x->Add("~/qqgg-run/presel-ntp-189/qq-*.root/h1001")
> Error in <TChain::AddFile>: cannot find tree with name  in file
> ~/qqgg-run/presel-ntp-189/qq-189-000-aa.root
> Error in <TChain::AddFile>: cannot find tree with name  in file
> ~/qqgg-run/presel-ntp-189/qq-189-001-aa.root
> Error in <TChain::AddFile>: cannot find tree with name  in file
> ~/qqgg-run/presel-ntp-189/qq-189-002-aa.root
> 
> If I'm not doing something wrong, here's a proposal for a
> modified TChain::Add :
> 
> Int_t TChain::Add(const char *name, Int_t nentries)
> {
>   //       Add a new file to this chain.
>   //    name may have the following format:
>   //       //machine/file_name.root/subdir/tree_name
>   //      machine, subdir and tree_name are optional. If tree_name is
> missing,
>   //      the chain name will be assumed.
>   //    name may use the wildcarding notation, eg "xxx*.root" means all
> files
>   //    starting with xxx in the current file system directory.
>   // 
>   //    if nentries < 0, the file is connected and the tree header read
> in memory
>   //    to get the number of entries.
>   //    if (nentries >= 0, the file is not connected, nentries is
> assumed to be
>   //    the number of entries in the file. In this case, no check is
> made that
>   //    the file exists and the Tree existing in the file. This second
> mode
>   //    is interesting in case the number of entries in the file is
> already stored
>   //    in a run data base for example.
>   //  NB. To add all the files of a TChain to a chain, use Add(TChain
> *chain).
>     
>     // case with one single file
>   if (strchr(name,'*') == 0) {
>     return AddFile(name,nentries);
>   }
> 
>   // wildcarding used in name
>   Int_t nf = 0;
>   Int_t nch = strlen(name);
>   char *aname = new char[nch+1];
>   strcpy(aname,name);
>   char *dot = (char*)strstr(aname,".root");
> 
>   const char *behind_dot_root = NULL;
>    
>   if (dot)
>     {
>       if (dot[5] == '/')
>         behind_dot_root = dot + 6;
>       *dot = 0;
>     }
> 
>   char *slash = strrchr(aname,'/');
>   if (slash) {
>     *slash = 0;
>     slash++;
>     strcat(slash,".root");
>   } else {
>     strcpy(aname,gSystem->WorkingDirectory());
>     slash = (char*)name;
>   }
>    
>   const char *file;
>   void *dir = gSystem->OpenDirectory(gSystem->ExpandPathName(aname));
> 
>   if (dir) {
>     TRegexp re(slash,kTRUE);
>     while ((file = gSystem->GetDirEntry(dir))) {
> 
>         
>       if (!strcmp(file,".") || !strcmp(file,"..")) continue;
>       //if (IsDirectory(file)) continue;
>       TString s = file;
> 
>       if (strcmp(slash,file) && s.Index(re) == kNPOS) continue;
>          
>       if (behind_dot_root != NULL && *behind_dot_root != 0)       
>         nf += AddFile(Form("%s/%s/%s",aname,file,behind_dot_root),-1);
>       else
>         nf += AddFile(Form("%s/%s",aname,file),-1);
>     }
>     gSystem->FreeDirectory(dir);
>   }   
>   return nf;
> }
> 
> 
> best regards,
> 
> André
> 
> 
> -- 
> ------------------+----------------------------------
> Andre Holzner     | +41 22 76 76750 
> Bureau 32 2-C13   | Building 32     
> CERN              | Office 2-C13    
> CH-1211 Geneve 23 | http://wwweth.cern.ch/~holzner/
> 



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:55 MET