#include #include #include #include #include #include #include using namespace std; #include "LumiChain.h" #include "LumiTrees.h" // Autre exemple trouvé dans le root talk: // TChain* chain = new TChain("Tree", "A Tree"); // TSystemDirectory* dataDir = // new TSystemDirectory("data", Form("%s/data", gSystem->HomeDirectory())); // TList* contents = dataDir->GetListOfFiles(); // TIter next(contents); // TSystemFile* file; // while ((file = (TSystemFile*)next())) { // if (file->IsDirectory()) // continue; // // Here one can do all sorts of fancy tests, using regular // // expressions, checking access privileges, file sizes, and god // // knows what // if (TString(file->GetName()).EndsWidth(".root")) // chain->Add(Form("%s/%s", file->GetTitle(), file->GetName())); // } const char * LumiChain::FullDatePatt = "^[01][0-9][01][0-9][0-3][0-9]$"; //static TString LumiChain::RootDirName = "../LumiRuns/Root"; void LumiChain::AddDirRange(UInt_t Start, UInt_t End, bool quiet){ if( !quiet ) cout << "Adding dir range "<< Start << "-" << End << " to "<< GetName() << endl; AddDirs(FullDatePatt, Start, End, true); } void LumiChain::AddDirs(const char * Patt, UInt_t Start, UInt_t End, bool quiet) { TRegexp DatePatt(Patt, true); if( !quiet ) cout << "Adding Dirs " << Patt << " to "<< GetName() << endl; void *rootdir = gSystem->OpenDirectory(RootDirName); const char *datename; TList l; while( (datename = gSystem->GetDirEntry(rootdir)) ){ TString DateName(datename); UInt_t iDate = atoi(datename); // cout << datename << " " << iDate << " " << Start << endl; if( DateName.Length() != 6 || !DateName.Contains(DatePatt) || iDate < Start || iDate > End ) continue; // Skip l.Add(new TObjString(datename)); } gSystem->FreeDirectory(rootdir); //sort the files in alphanumeric order l.Sort(); // Loop over sorted dirs TIter next(&l); TObjString *obj; while ((obj = (TObjString*)next())) { TString dir = obj->GetName(); AddDir(dir, true); } } void LumiChain::AddAll() { AddDirs(FullDatePatt); } void LumiChain::AddDir(const char * Date, bool quiet){ if( !quiet ) cout << "Adding Dir "<< Date << " to "<< GetName() << endl; AddFiles(Date, 0, 23, true); }; void LumiChain::AddFiles(const char * Date, UInt_t hmin, UInt_t hmax, bool quiet){ if( !quiet ) cout << "Adding files of " << Date << " to "<< GetName() << endl; TString DirName = RootDirName; DirName += Date; if( fDebug>0 ) cout << " " << DirName << " added" << endl; void *dir = gSystem->OpenDirectory(DirName); const char *filename; TString FileName; TList l; while( (filename = gSystem->GetDirEntry(dir)) ){ if( filename[0]=='.' ) continue; // Skip . and .. if( !strcmp(fName,LNumTreeName) ){ // LNum trees if( strcmp(filename,LNumRootFileName) ) continue; } else if( !strcmp(fName,CalibTreeName) ){ // Calib trees if( strcmp(filename,CalibRootFileName) ) continue; } else if( !strcmp(fName,DataTreeName) || !strcmp(fName,OnlTreeName) || !strcmp(fName,LedTreeName) ){ // Data or Online or LED trees if( fDebug>2 ) cerr << "Data or Online or LED required " << endl; FileName = filename; if( !FileName.Contains(DataFileReg) ) continue; UInt_t hour = atoi(filename); if( hourhmax ) continue; } else { // Leave all other cases through // or forbid them ? // continue; } TString FileName = DirName + "/" + filename; l.Add(new TObjString(FileName)); } gSystem->FreeDirectory(dir); //sort the files in alphanumeric order l.Sort(); // Loop over sorted files TIter next(&l); TObjString *obj; while ((obj = (TObjString*)next())) { TString FileName = obj->GetName(); if( fDebug>1 ) cout << FileName << " added" << endl; Add(FileName); } } void LumiChain::RecoverFiles(){ TIter nextFile(GetListOfFiles()); TChainElement * E = 0; while ( (E = (TChainElement *) nextFile()) ) { if( fDebug>1 ) cout << E->GetTitle() << endl; TFile f(E->GetTitle(), "UPDATE"); // file.Recover(); f.Close(); } } ClassImp(LumiChain)