X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PWG0%2FCreateESDChain.C;h=e356e95cabb04c230b014fd54be66ab24b57bd7c;hb=25348aafd4804184b67fffcab4125806b5357ffa;hp=bb9bf3bc3faf693f6d4c678e38d8d5d2516d8002;hpb=0ab29cfa0f8f8dd7122a10235807d04892e8a6f7;p=u%2Fmrichter%2FAliRoot.git diff --git a/PWG0/CreateESDChain.C b/PWG0/CreateESDChain.C index bb9bf3bc3fa..e356e95cabb 100644 --- a/PWG0/CreateESDChain.C +++ b/PWG0/CreateESDChain.C @@ -1,14 +1,37 @@ /* $Id$ */ -// Helper macros for creating chains - -TChain* CreateESDChain(const char* aDataDir, Int_t aRuns = 20, Int_t offset = 0) +/************************************************************************** + * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * * + * Author: The ALICE Off-line Project. * + * Contributors are mentioned in the code where appropriate. * + * * + * Permission to use, copy, modify and distribute this software and its * + * documentation strictly for non-commercial purposes is hereby granted * + * without fee, provided that the above copyright notice appears in all * + * copies and that both the copyright notice and this permission notice * + * appear in the supporting documentation. The authors make no claims * + * about the suitability of this software for any purpose. It is * + * provided "as is" without express or implied warranty. * + **************************************************************************/ + +// This helper macros creates a chain of ESD files for you. Source can be either a text +// file with the file paths or a directory. In the latter case all ESD files in all subdirectories +// are considered. +// +// Author: Jan.Fiete.Grosse-Oetringhaus@cern.ch + +TChain* CreateESDChain(const char* aDataDir = "ESDfiles.txt", Int_t aRuns = 20, Int_t offset = 0, Bool_t addFileName = kFALSE, Bool_t addFriend = kFALSE, const char* check = 0) { // creates chain of files in a given directory or file containing a list. // In case of directory the structure is expected as: // //AliESDs.root // //AliESDs.root // ... + // + // if addFileName is true the list only needs to contain the directories that contain the AliESDs.root files + // if addFriend is true a file AliESDfriends.root is expected in the same directory and added to the chain as friend + // if check is != 0 the files that work are written back into the textfile with the name check if (!aDataDir) return 0; @@ -16,12 +39,15 @@ TChain* CreateESDChain(const char* aDataDir, Int_t aRuns = 20, Int_t offset = 0) Long_t id, size, flags, modtime; if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime)) { - print("%s not found.\n", aDataDir); + printf("%s not found.\n", aDataDir); return 0; } TChain* chain = new TChain("esdTree"); - TChain* chaingAlice = 0; + TChain* chainFriend = 0; + + if (addFriend) + chainFriend = new TChain("esdFriendTree"); if (flags & 2) { @@ -61,31 +87,157 @@ TChain* CreateESDChain(const char* aDataDir, Int_t aRuns = 20, Int_t offset = 0) ifstream in; in.open(aDataDir); + ofstream outfile; + if (check) + outfile.open(check); + Int_t count = 0; // Read the input list of files and add them to the chain - TString esdfile; - while(in.good()) { - in >> esdfile; - if (!esdfile.Contains("root")) continue; // protection + TString line; + while (in.good()) + { + in >> line; + + if (line.Length() == 0) + continue; if (offset > 0) { - --offset; + offset--; continue; } if (count++ == aRuns) break; + TString esdFile(line); + + if (addFileName) + esdFile += "/AliESDs.root"; + + TString esdFileFriend(esdFile); + esdFileFriend.ReplaceAll("AliESDs.root", "AliESDfriends.root"); + + if (check) + { + TFile* file = TFile::Open(esdFile); + if (!file) + continue; + file->Close(); + + if (chainFriend) + { + TFile* file = TFile::Open(esdFileFriend); + if (!file) + continue; + file->Close(); + } + + outfile << line.Data() << endl; + printf("%s\n", line.Data()); + } + // add esd file - chain->Add(esdfile); + chain->Add(esdFile); + + // add file + if (chainFriend) + chainFriend->Add(esdFileFriend); } in.close(); + + if (check) + outfile.close(); + } + + if (chainFriend) + chain->AddFriend(chainFriend); + + return chain; +} + +void ChainToTextFile(TChain* chain, const char* target) +{ + // write a text list of the files in the chain + + TObjArray* list = chain->GetListOfFiles(); + TIterator* iter = list->MakeIterator(); + TObject* obj = 0; + + ofstream outfile; + outfile.open(target); + + while ((obj = iter->Next())) { + TString fileName(obj->GetTitle()); + + outfile << fileName.Data() << endl; + } + + outfile.close(); + + delete iter; +} + +TObjArray* Chain2List(TChain* chain) +{ + // returns a TObjArray of TObjStrings of the file names in the chain + + TObjArray* result = new TObjArray; - chain->Lookup(); + for (Int_t i=0; iGetListOfFiles()->GetEntries(); i++) + result->Add(new TObjString(chain->GetListOfFiles()->At(i)->GetTitle())); + + return result; +} + +void LookupWrite(TChain* chain, const char* target) +{ + // looks up the chain and writes the remaining files to the text file target + + chain->Lookup(); + + ChainToTextFile(chain, target); +} + +TChain* CreateChain(const char* treeName, const char* aDataDir, Int_t aRuns, Int_t offset = 0) +{ + // creates chain of files in a given directory or file containing a list. + + if (!treeName || !aDataDir) + return 0; + + TChain* chain = new TChain(treeName); + + // Open the input stream + ifstream in; + in.open(aDataDir); + + Int_t count = 0; + + // Read the input list of files and add them to the chain + TString line; + while(in.good()) + { + in >> line; + + if (line.Length() == 0) + continue; + + if (offset > 0) + { + --offset; + continue; + } + + if (count++ == aRuns) + break; + + chain->Add(line); } + in.close(); + return chain; }