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