11 #ifndef CHAINBUILDER_C
12 #define CHAINBUILDER_C
17 # include <TChainElement.h>
18 # include <TSystemDirectory.h>
21 # include <TFileInfo.h>
25 # include <TGridCollection.h>
26 # include <TFileCollection.h>
27 # include <THashList.h>
34 class TSystemDirectory;
36 class TFileCollection;
45 save = gErrorIgnoreLevel;
46 gErrorIgnoreLevel = lvl;
50 gErrorIgnoreLevel =
save;
87 if (tmp ==
".") tmp =
"";
88 if (!tmp.BeginsWith(
"/")) tmp.Prepend(
"../");
89 if (
gSystem->ExpandPathName(tmp)) {
90 Error(
"ChainBuilder::CheckSource",
91 "Failed to expand source %s", src.Data());
101 if (R_ISDIR(stat.fMode)) {
103 Info(
"ChainBuilder::CheckSource",
"%s is a directory", tmp.Data());
108 TString type(
gSystem->GetFromPipe(Form(
"file -b -L %s", src.Data())));
110 Info(
"ChainBuilder::CheckSource",
"file -b %s -> %s",
111 tmp.Data(), type.Data());
113 if (type.Contains(
"ROOT")) ret =
kROOT;
114 else if (type.Contains(
"XML")) ret =
kXML;
115 else if (type.Contains(
"ASCII")) ret =
kAscii;
116 else if (type.Contains(
"Zip")) ret =
kZip;
119 Error(
"ChainBuilder::CheckSource",
120 "Do not now how to process %s of type %s",
121 src.Data(), type.Data());
157 TString source = url.GetFile();
158 TString treeName = url.GetAnchor();
161 TString options = url.GetOptions();
162 TObjArray* tokens = options.Tokenize(
"&");
163 TObjString* token = 0;
165 while ((token = static_cast<TObjString*>(next()))) {
167 TString lstr(str); lstr.ToLower();
168 if (lstr.EqualTo(
"mc")) flags |=
kMC;
169 else if (lstr.EqualTo(
"recursive"))flags |=
kRecursive;
170 else if (lstr.EqualTo(
"verbose")) flags |=
kVerbose;
171 else if (lstr.EqualTo(
"check")) flags |=
kCheck;
172 else if (lstr.EqualTo(
"trackref")) flags |=
kTrRef;
173 else if (lstr.EqualTo(
"clean")) flags |=
kClean;
174 else if (lstr.EqualTo(
"scan")) flags |=
kScan;
175 else if (lstr.EqualTo(
"remote")) flags |=
kRemote;
176 else if (lstr.BeginsWith(
"pattern=")) {
177 Int_t eq = str.Index(
"=");
178 pattern =
str(eq+1, str.Length()-eq-1);
179 pattern.ReplaceAll(
"@",
"#");
180 pattern.ReplaceAll(
":",
"#");
183 Warning(
"",
"Option %s unknown", str.Data());
190 return Create(type, tmp, treeName, pattern, flags);
223 if (mc) flags |=
kMC;
224 if (checkFiles) flags |=
kCheck;
225 if (removeFiles) flags |=
kClean;
226 if (trackRefs) flags |=
kTrRef;
232 return Create(type, tmp, treeName, pattern, flags);
272 if (mc) flags |=
kMC;
273 if (checkFiles) flags |=
kCheck;
274 if (removeFiles) flags |=
kClean;
275 if (trackRefs) flags |=
kTrRef;
279 return Create(type, src, treeName, pattern, flags);
301 Error(
"ChainBuilder::Create",
"Source %s isn't a file or directory",
308 Warning(
"ChainBuilder::Create",
"No tree name specified, assuming T");
312 if (tN.EqualTo(
"esdTree")) pat =
"AliESD*";
313 else if (tN.EqualTo(
"aodTree")) pat =
"AliAOD*";
314 else if (tN.EqualTo(
"TE")) pat =
"galice*";
315 if ((flags &
kVerbose)) Info(
"",
"Pattern set to %s", pat.Data());
318 Info(
"ChainBuilder::Create",
"Type=%s, tree=%s, pattern=%s",
320 type ==
kXML ?
"XML" :
321 type ==
kAscii ?
"ASCII" :
322 type ==
kROOT ?
"ROOT" :
"unknown"),
323 tN.Data(), pat.Data());
332 if ((flags & kVerbose))
333 Info(
"",
"Full pattern: '%s' filename pattern: '%s' anchor: '%s'",
334 tmp.Data(), pat.Data(), anchor.Data());
345 default: ret =
false;
349 if (chain->GetListOfFiles()->GetEntries() <= 0) ret =
false;
366 const char* remote=0)
383 const char* remote=0)
386 TDirectory* savDir = gDirectory;
387 TFile* out = TFile::Open(output,
"RECREATE");
389 Error(
"",
"Failed to open %s for output", output.Data());
392 TFileCollection* collection =
new TFileCollection(chain->GetName());
393 TObjArray* files = chain->GetListOfFiles();
394 TChainElement* element = 0;
398 collection->SetDefaultTreeName(chain->GetName());
400 while ((element = static_cast<TChainElement*>(next()))) {
401 Info(
"",
"Element: '%s' - '%s' %lld",
402 element->GetName(), element->GetTitle(),
403 element->GetEntries());
404 TFileInfo* info =
new TFileInfo(element->GetTitle());
405 TFileInfoMeta* meta =
new TFileInfoMeta(Form(
"/%s",element->GetName()),
406 "TTree", element->GetEntries());
407 info->AddMetaData(meta);
408 info->SetBit(TFileInfo::kStaged);
410 collection->Add(info);
413 if (n >= 0) nEntries += n;
417 collection->Update();
418 TFileInfoMeta* cMeta =
new TFileInfoMeta(chain->GetName(),
420 collection->AddMetaData(cMeta);
423 Printf(
"A total of %lld entries", nEntries);
438 Int_t idxHash = src.Index(
"#");
440 if (idxHash == kNPOS)
return;
443 anchor = src(idxHash+1, src.Length()-idxHash-1);
465 if (!
CheckFile(src, anchor, chain, flags))
return false;
477 Long_t ret = gROOT->ProcessLine(Form(
"TAlienCollection(\"%s\")",
480 Error(
"ChainBuilder::CreateFromXML",
481 "Cannot create AliEn collection from XML file %s", src.Data());
485 TGridCollection* collection =
reinterpret_cast<TGridCollection*
>(ret);
488 Error(
"ChainBuilder::CreateFromXML",
489 "Cannot create AliEn collection from XML file %s", src.Data());
495 while (collection->Next()) chain->Add(collection->GetTURL(
""));
510 std::ifstream in(src.Data());
512 Error(
"ChainBuilder::CreateFromList",
513 "Failed to open list %s", src.Data());
519 line.ReadToDelim(in);
521 if (l.IsWhitespace() || l.BeginsWith(
"#"))
continue;
526 Warning(
"ChainBuilder::CreateFromList",
527 "Failed to add %s to chain", l.Data());
548 TSystemDirectory d(
gSystem->BaseName(src.Data()), src.Data());
549 if (flags &
kVerbose) Info(
"",
"Will scan %s", d.GetTitle());
553 gSystem->ChangeDirectory(savdir);
559 Info(
"",
"Removing bad file %s", path.Data());
562 gSystem->Rename(path, Form(
"%s.bad", path.Data()));
565 static TFileCollection*
Remotify(TFileCollection* fc,
const char* remote=0)
567 if (!remote)
return fc;
569 TList* files = fc->GetList();
570 TFileInfo* element = 0;
572 while ((element = static_cast<TFileInfo*>(next()))) {
576 while ((url = element->NextUrl())) {
577 if (
TString(url->GetProtocol()).BeginsWith(
"root")) {
581 if (
TString(url->GetProtocol()).BeginsWith(
"file") && furl == 0)
585 TUrl* nurl =
static_cast<TUrl*
>(furl->Clone());
586 nurl->SetProtocol(
"rootd");
587 nurl->SetHost(remote);
588 element->AddUrl(nurl->GetUrl(),
true);
610 if (flags &
kVerbose) Info(
"",
"Checking %s", path.Data());
612 if (!anchor.IsNull()) fn.Append(TString::Format(
"#%s", anchor.Data()));
617 test = TFile::Open(fn,
"READ");
620 Warning(
"ChainBuilder::CheckFile",
"Failed to open %s", fn.Data());
626 TObject* o = test->Get(chain->GetName());
628 TFileCollection*
c =
dynamic_cast<TFileCollection*
>(o);
633 const char* auxs[] = {
"galice",
"Kinematics",
634 (flags &
kTrRef ?
"TrackRefs" : 0),
636 const char** aux = auxs;
641 Form(
"%s.root", *aux));
643 t1 = TString::Format(
"%s#%s.root", path.Data(), *aux);
647 t2 = TFile::Open(t1,
"READ");
650 Error(
"",
"Needed MC file %s not found", t1.Data());
660 if (ok) chain->Add(fn,
kScan ? -1 : TChain::kBigNumber);
663 chain->AddFileInfoList(c->GetList());
667 TList* l = test->GetListOfKeys();
670 while ((k = static_cast<TKey*>(next()))) {
672 if (!cl.EqualTo(
"TFileCollection"))
continue;
673 c =
dynamic_cast<TFileCollection*
>(k->ReadObj());
675 Warning(
"",
"Returned collection invalid");
680 chain->AddFileInfoList(c->GetList());
687 Warning(
"ChainBuilder::CheckFile",
688 "The file %s does not contain the tree %s or a file collection",
689 path.Data(), chain->GetName());
708 TSystemDirectory* dir,
715 TRegexp wild(pattern,
true);
719 TList* files = dir->GetListOfFiles();
720 if (!
gSystem->ChangeDirectory(oldDir)) {
721 Error(
"ChainBuilder::ScanDirectory",
"Failed to go back to %s",
726 Warning(
"ChainBuilder::ScanDirectory",
"No files");
736 TSystemFile*
file = 0;
737 while ((file = static_cast<TSystemFile*>(next()))) {
740 TString full(
gSystem->ConcatFileName(file->GetTitle(), name.Data()));
741 if (file->IsA()->InheritsFrom(TSystemDirectory::Class())) full =
title;
743 if (name ==
"." || name ==
"..") {
747 if ((flags & kVerbose)) Info(
"",
"Got file %s", full.Data());
750 if (
gSystem->GetPathInfo(full.Data(), fs)) {
751 Warning(
"ChainBuilder::ScanDirectory",
"Cannot stat %s (%s)",
752 full.Data(),
gSystem->WorkingDirectory());
756 if (file->IsDirectory(full)) {
757 if ((flags & kVerbose)) Info(
"",
"Recursive scan of %s", full.Data());
760 TSystemDirectory* d =
new TSystemDirectory(file->GetName(),
770 if (!name.EndsWith(
".root") && !name.EndsWith(
".zip")) {
771 if ((flags & kVerbose))
772 Info(
"ScanDirectory",
"File %s does not end in .root/.zip",
778 if (!name.Contains(wild)) {
779 if ((flags & kVerbose))
780 Info(
"ChainBuilder::ScanDirectory",
781 "%s does not match pattern %s",
782 name.Data(), pattern.Data());
788 toAdd.Add(
new TObjString(full));
791 TIter nextAdd(&toAdd);
794 while ((s = static_cast<TObjString*>(nextAdd()))) {
798 if (!
CheckFile(fn, anchor, chain, flags))
continue;
802 if (added > 0) ret =
true;
804 gSystem->ChangeDirectory(oldDir);
static Bool_t CheckFile(const TString &path, const TString &anchor, TChain *chain, UShort_t flags=0)
return jsonbuilder str().c_str()
static TFileCollection * Remotify(TFileCollection *fc, const char *remote=0)
static UShort_t CheckSource(TString &src, UShort_t flags)
static TChain * Create(const TString &src, const TString &treeName, const TString &pattern, Bool_t mc, Bool_t recursive, Bool_t verbose=false, Bool_t checkFiles=false, Bool_t removeFiles=false, Bool_t trackRefs=false, Bool_t remote=false)
static Bool_t CreateFromFile(TChain *chain, const TString &src, const TString &anchor, UShort_t flags=0)
static TChain * Create(const TUrl &url)
static void RemoveFile(const TString &path)
static Bool_t CreateFromXML(TChain *chain, const TString &src)
static void CreateCollection(const TString &output, const TChain *chain, const char *remote=0)
static TChain * Create(UShort_t type, const TString &src, const TString &treeName, const TString &pattern, Bool_t mc, Bool_t recursive, Bool_t verbose=false, Bool_t checkFiles=false, Bool_t removeFiles=false, Bool_t trackRefs=false, Bool_t remote=false)
static Bool_t CreateFromDirectory(TChain *chain, const TString &src, const TString &pattern, const TString &anchor, UShort_t flags)
static void ExtractAnchor(TString &src, TString &anchor)
static void CreateCollection(const TString &output, const TUrl &url, const char *remote=0)
static Bool_t CreateFromList(TChain *chain, const TString &src, UShort_t flags=0)
SuppressGuard(Int_t lvl=2000)
static TChain * Create(UShort_t type, const TString &src, const TString &treeName, const TString &pattern, UShort_t flags)
static Bool_t ScanDirectory(TChain *chain, TSystemDirectory *dir, const TString &pattern, const TString &anchor, UShort_t flags)