X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=PWG0%2FCreateESDChain.C;h=157849980327eeb4ed1d15e973c8aa890b1e611e;hb=64c42545e1bdaf11280a47c501c94f291f4bf7c1;hp=45dbbeb6818dacbee4b424319c41c548b9f91622;hpb=ea1224c5ab214e92dc3a8d233a9b711f82009a30;p=u%2Fmrichter%2FAliRoot.git diff --git a/PWG0/CreateESDChain.C b/PWG0/CreateESDChain.C index 45dbbeb6818..15784998032 100644 --- a/PWG0/CreateESDChain.C +++ b/PWG0/CreateESDChain.C @@ -1,14 +1,37 @@ /* $Id$ */ -// Helper macros for creating chains - -TChain* CreateESDChain(const char* aDataDir = "ESDfiles.txt", 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 = "ESDfiles.txt", Int_t aRuns = 20, 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,14 +87,21 @@ TChain* CreateESDChain(const char* aDataDir = "ESDfiles.txt", Int_t aRuns = 20, 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; @@ -78,12 +111,123 @@ TChain* CreateESDChain(const char* aDataDir = "ESDfiles.txt", Int_t aRuns = 20, 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()); + + fileName.Remove(fileName.Length()-13); + + outfile << fileName.Data() << endl; + } + + outfile.close(); + + delete iter; +} + +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; }