ROOT logo
/* $Id$ */

/**************************************************************************
 * 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:
  // <aDataDir>/<dir0>/AliESDs.root
  // <aDataDir>/<dir1>/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;

  Long_t id, size, flags, modtime;
  if (gSystem->GetPathInfo(aDataDir, &id, &size, &flags, &modtime))
  {
    printf("%s not found.\n", aDataDir);
    return 0;
  }

  TChain* chain = new TChain("esdTree");
  TChain* chainFriend = 0;
  
  if (addFriend)
    chainFriend = new TChain("esdFriendTree");

  if (flags & 2)
  {
    TString execDir(gSystem->pwd());
    TSystemDirectory* baseDir = new TSystemDirectory(".", aDataDir);
    TList* dirList            = baseDir->GetListOfFiles();
    Int_t nDirs               = dirList->GetEntries();
    gSystem->cd(execDir);

    Int_t count = 0;

    for (Int_t iDir=0; iDir<nDirs; ++iDir)
    {
      TSystemFile* presentDir = (TSystemFile*) dirList->At(iDir);
      if (!presentDir || !presentDir->IsDirectory() || strcmp(presentDir->GetName(), ".") == 0 || strcmp(presentDir->GetName(), "..") == 0)
        continue;

      if (offset > 0)
      {
        --offset;
        continue;
      }

      if (count++ == aRuns)
        break;

      TString presentDirName(aDataDir);
      presentDirName += "/";
      presentDirName += presentDir->GetName();

      chain->Add(presentDirName + "/AliESDs.root/esdTree");
    }
  }
  else
  {
    // Open the input stream
    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 line;
    while (in.good())
    {
      in >> line;

      if (line.Length() == 0)
        continue;

      if (offset > 0)
      {
        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);

        // 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;

  for (Int_t i=0; i<chain->GetListOfFiles()->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;
}
 CreateESDChain.C:1
 CreateESDChain.C:2
 CreateESDChain.C:3
 CreateESDChain.C:4
 CreateESDChain.C:5
 CreateESDChain.C:6
 CreateESDChain.C:7
 CreateESDChain.C:8
 CreateESDChain.C:9
 CreateESDChain.C:10
 CreateESDChain.C:11
 CreateESDChain.C:12
 CreateESDChain.C:13
 CreateESDChain.C:14
 CreateESDChain.C:15
 CreateESDChain.C:16
 CreateESDChain.C:17
 CreateESDChain.C:18
 CreateESDChain.C:19
 CreateESDChain.C:20
 CreateESDChain.C:21
 CreateESDChain.C:22
 CreateESDChain.C:23
 CreateESDChain.C:24
 CreateESDChain.C:25
 CreateESDChain.C:26
 CreateESDChain.C:27
 CreateESDChain.C:28
 CreateESDChain.C:29
 CreateESDChain.C:30
 CreateESDChain.C:31
 CreateESDChain.C:32
 CreateESDChain.C:33
 CreateESDChain.C:34
 CreateESDChain.C:35
 CreateESDChain.C:36
 CreateESDChain.C:37
 CreateESDChain.C:38
 CreateESDChain.C:39
 CreateESDChain.C:40
 CreateESDChain.C:41
 CreateESDChain.C:42
 CreateESDChain.C:43
 CreateESDChain.C:44
 CreateESDChain.C:45
 CreateESDChain.C:46
 CreateESDChain.C:47
 CreateESDChain.C:48
 CreateESDChain.C:49
 CreateESDChain.C:50
 CreateESDChain.C:51
 CreateESDChain.C:52
 CreateESDChain.C:53
 CreateESDChain.C:54
 CreateESDChain.C:55
 CreateESDChain.C:56
 CreateESDChain.C:57
 CreateESDChain.C:58
 CreateESDChain.C:59
 CreateESDChain.C:60
 CreateESDChain.C:61
 CreateESDChain.C:62
 CreateESDChain.C:63
 CreateESDChain.C:64
 CreateESDChain.C:65
 CreateESDChain.C:66
 CreateESDChain.C:67
 CreateESDChain.C:68
 CreateESDChain.C:69
 CreateESDChain.C:70
 CreateESDChain.C:71
 CreateESDChain.C:72
 CreateESDChain.C:73
 CreateESDChain.C:74
 CreateESDChain.C:75
 CreateESDChain.C:76
 CreateESDChain.C:77
 CreateESDChain.C:78
 CreateESDChain.C:79
 CreateESDChain.C:80
 CreateESDChain.C:81
 CreateESDChain.C:82
 CreateESDChain.C:83
 CreateESDChain.C:84
 CreateESDChain.C:85
 CreateESDChain.C:86
 CreateESDChain.C:87
 CreateESDChain.C:88
 CreateESDChain.C:89
 CreateESDChain.C:90
 CreateESDChain.C:91
 CreateESDChain.C:92
 CreateESDChain.C:93
 CreateESDChain.C:94
 CreateESDChain.C:95
 CreateESDChain.C:96
 CreateESDChain.C:97
 CreateESDChain.C:98
 CreateESDChain.C:99
 CreateESDChain.C:100
 CreateESDChain.C:101
 CreateESDChain.C:102
 CreateESDChain.C:103
 CreateESDChain.C:104
 CreateESDChain.C:105
 CreateESDChain.C:106
 CreateESDChain.C:107
 CreateESDChain.C:108
 CreateESDChain.C:109
 CreateESDChain.C:110
 CreateESDChain.C:111
 CreateESDChain.C:112
 CreateESDChain.C:113
 CreateESDChain.C:114
 CreateESDChain.C:115
 CreateESDChain.C:116
 CreateESDChain.C:117
 CreateESDChain.C:118
 CreateESDChain.C:119
 CreateESDChain.C:120
 CreateESDChain.C:121
 CreateESDChain.C:122
 CreateESDChain.C:123
 CreateESDChain.C:124
 CreateESDChain.C:125
 CreateESDChain.C:126
 CreateESDChain.C:127
 CreateESDChain.C:128
 CreateESDChain.C:129
 CreateESDChain.C:130
 CreateESDChain.C:131
 CreateESDChain.C:132
 CreateESDChain.C:133
 CreateESDChain.C:134
 CreateESDChain.C:135
 CreateESDChain.C:136
 CreateESDChain.C:137
 CreateESDChain.C:138
 CreateESDChain.C:139
 CreateESDChain.C:140
 CreateESDChain.C:141
 CreateESDChain.C:142
 CreateESDChain.C:143
 CreateESDChain.C:144
 CreateESDChain.C:145
 CreateESDChain.C:146
 CreateESDChain.C:147
 CreateESDChain.C:148
 CreateESDChain.C:149
 CreateESDChain.C:150
 CreateESDChain.C:151
 CreateESDChain.C:152
 CreateESDChain.C:153
 CreateESDChain.C:154
 CreateESDChain.C:155
 CreateESDChain.C:156
 CreateESDChain.C:157
 CreateESDChain.C:158
 CreateESDChain.C:159
 CreateESDChain.C:160
 CreateESDChain.C:161
 CreateESDChain.C:162
 CreateESDChain.C:163
 CreateESDChain.C:164
 CreateESDChain.C:165
 CreateESDChain.C:166
 CreateESDChain.C:167
 CreateESDChain.C:168
 CreateESDChain.C:169
 CreateESDChain.C:170
 CreateESDChain.C:171
 CreateESDChain.C:172
 CreateESDChain.C:173
 CreateESDChain.C:174
 CreateESDChain.C:175
 CreateESDChain.C:176
 CreateESDChain.C:177
 CreateESDChain.C:178
 CreateESDChain.C:179
 CreateESDChain.C:180
 CreateESDChain.C:181
 CreateESDChain.C:182
 CreateESDChain.C:183
 CreateESDChain.C:184
 CreateESDChain.C:185
 CreateESDChain.C:186
 CreateESDChain.C:187
 CreateESDChain.C:188
 CreateESDChain.C:189
 CreateESDChain.C:190
 CreateESDChain.C:191
 CreateESDChain.C:192
 CreateESDChain.C:193
 CreateESDChain.C:194
 CreateESDChain.C:195
 CreateESDChain.C:196
 CreateESDChain.C:197
 CreateESDChain.C:198
 CreateESDChain.C:199
 CreateESDChain.C:200
 CreateESDChain.C:201
 CreateESDChain.C:202
 CreateESDChain.C:203
 CreateESDChain.C:204
 CreateESDChain.C:205
 CreateESDChain.C:206
 CreateESDChain.C:207
 CreateESDChain.C:208
 CreateESDChain.C:209
 CreateESDChain.C:210
 CreateESDChain.C:211
 CreateESDChain.C:212
 CreateESDChain.C:213
 CreateESDChain.C:214
 CreateESDChain.C:215
 CreateESDChain.C:216
 CreateESDChain.C:217
 CreateESDChain.C:218
 CreateESDChain.C:219
 CreateESDChain.C:220
 CreateESDChain.C:221
 CreateESDChain.C:222
 CreateESDChain.C:223
 CreateESDChain.C:224
 CreateESDChain.C:225
 CreateESDChain.C:226
 CreateESDChain.C:227
 CreateESDChain.C:228
 CreateESDChain.C:229
 CreateESDChain.C:230
 CreateESDChain.C:231
 CreateESDChain.C:232
 CreateESDChain.C:233
 CreateESDChain.C:234
 CreateESDChain.C:235
 CreateESDChain.C:236
 CreateESDChain.C:237
 CreateESDChain.C:238
 CreateESDChain.C:239
 CreateESDChain.C:240
 CreateESDChain.C:241
 CreateESDChain.C:242
 CreateESDChain.C:243
 CreateESDChain.C:244