ROOT logo
/**************************************************************************
 * 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.                  *
 **************************************************************************/

// Title:   Class for ccessing data from STAR NTuples
//          produces data encapsulated in AliStarEvent and AliStarTrack classes
//
// Origin:  Jim Thomas,        jhthomas@lbl.gov
//          Mikolaj Krzewicki, mikolaj.krzewicki@cern.ch

#include <Riostream.h>

#include <TSystem.h>
#include <TSystemFile.h>
#include <TFile.h>
#include <TList.h>
#include <TLeaf.h>
#include <TMath.h>
#include <TNtuple.h>
#include <TString.h>

#include "AliStarEventReader.h"
#include "AliStarEvent.h"
#include "AliStarTrack.h"

using std::cout;
using std::endl;
using std::ifstream;
ClassImp(AliStarEventReader)

//______________________________________________________________________________
AliStarEventReader::AliStarEventReader():
  TObject(),
  fFileList(NULL),
  fEvent(NULL)
{
  //ctor
}
//______________________________________________________________________________
AliStarEventReader::AliStarEventReader( const char* inputFileDirectory ):
  TObject(),
  fFileList(NULL),
  fEvent(new AliStarEvent(1024))
{
  //ctor
  MakeFileList ( inputFileDirectory ) ;
}

//______________________________________________________________________________
AliStarEventReader::~AliStarEventReader()
{
  //dtor
  delete fFileList;
  delete fEvent;
}

//______________________________________________________________________________
Bool_t AliStarEventReader::GetNextEvent( )
{
  //gets next event
  static TFile*    nextFile    = NULL ;
  static TNtuple*  ntData      = NULL ;
  static Int_t     doOnce      = 0 ;
  static Long64_t  nextEntry   = 0 ;
  static Long64_t  entries     = 0 ;
  static Long64_t  fileCounter = 0 ;

  if ( doOnce == 0 )
  {
    doOnce = 1     ;
    nextFile = (TFile*)  fFileList->First() ;
    if ( nextFile == 0 ) return false      ;
    ntData        = (TNtuple*) ( nextFile->Get("NTtracks") ) ;
    entries       = ntData->GetEntriesFast() ;
    Int_t columns = ntData->GetNvar() ;
    if ( columns != 15 )
    {
      cout << "Error in reading Ntuple file: no. columns != 15" << endl ;
      return false ;
    }
    fileCounter++ ;
    cout << "Start New File " << fileCounter << endl ;
  }

  while ( nextFile )
  {
    while ( nextEntry < entries )
    {
      Float_t* header = NULL;
      Int_t numberOfParticles =  0 ;                   // Number of particle tracks in the next event
      Long64_t headerEntry    =  0 ;                   // Store position of Header and Set Flag in case of EOF or error
      Long64_t skipEvent      =  0 ;                   // Flag in case of wrong number of tracks in this event

      fEvent->Reset();           //reset the event

      // Search for the first "Event" record

      for ( Long64_t j = nextEntry ; j < entries ; j++ )
      {
        Long64_t BytesRead = ntData->GetEntry(j) ;
        if ( BytesRead < 60 )
        {
          cout << "Warning: error in file or EOF " <<  endl ;
          headerEntry = -1 ;
          break ;
        }
        header = ntData->GetArgs() ;
        if ( (int) header[10] == -1 && (int) header[11] == -1 && (int) header[12] == -1 &&
             (int) header[13] == -1 && (int) header[14] == -1 )
        {
          fEvent->SetParams(header);  //set the event params

          numberOfParticles = (int) header[9]  ;   // # of particles passing track cuts, thus in ntuple
          headerEntry = j ;
          break ;
        }
        cout << "Warning: no header entries found in this file" << endl ;
        headerEntry = -1 ;
      }

      if ( headerEntry == -1 ) break ;                 // Break out of main loop if I/O error

      // Get subsequent "track" data
      for ( Long64_t j = headerEntry + 1 ; j < headerEntry + 1 + numberOfParticles  ; j++ )
      {
        Long64_t BytesRead = ntData->GetEntry(j) ;
        if ( BytesRead < 60 )
        {
          cout << "Warning: error in file sequence or EOF" << endl ;
          nextEntry = -1 ;
          break ;
        }
        header = ntData->GetArgs() ;

        if ( TMath::IsNaN(header[10]) == 1 )
        {
          cout << "IsNan ... dEdx will be zeroed out" << endl ;
          header[10] = 0 ;
          header[11] = 999 ;
          header[12] = 999 ;
          header[13] = 999 ;
          header[14] = 999 ;
          cout << header[0]  << " " << header[1]  << " " << header[2]  << " " << header[3]  << " "
               << header[4]  << " " << header[5]  << " " << header[6]  << " " << header[7]  << " "
               << header[8]  << " " << header[9]  << " " << header[10] << " " << header[11] << " "
               << header[12] << " " << header[13] << " " << header[14] << endl ;  // JT test
        }

        if ( (int) header[10] == -1 && (int) header[11] == -1 && (int) header[12] == -1 &&
             (int) header[13] == -1 && (int) header[14] == -1 )
        {
          cout << "Warning: Header in the wrong place, skipping event" << endl ;
          skipEvent = 1 ;
          nextEntry = j ;          // Skip event and freeze nextEntry counter
          break ;
        }

        fEvent->AddTrack( new AliStarTrack(header) );    //add the new track

        nextEntry = j+1 ;
      }
      if ( nextEntry == -1 ) break ;      // Bad record in file, go to next file in fFileList
      if ( skipEvent ==  1 ) continue ;   // Bad event, go to next event in this file
      return true ;                       // Success: Event read OK, note unusual location for a successful return
    }

    nextEntry = 0 ; // this entry goes before nextFile
    nextFile = (TFile*) fFileList->After(nextFile) ;
    if ( nextFile == 0 ) break ;
    if (ntData) delete ntData;
    ntData        = (TNtuple*) ( nextFile->Get("NTtracks") ) ;
    entries       = ntData->GetEntriesFast() ;
    Int_t columns = ntData->GetNvar() ;
    if ( columns != 15 )
    {
      cout << "Error in reading Ntuple file: no. columns != 15" << endl ;
      break ;
    }
    fileCounter++ ;
    cout << "Start New File " << fileCounter << endl ;
  }

  return false ;  // Failure: Error or EOF
}

//______________________________________________________________________________
Bool_t AliStarEventReader::MakeFileList ( const char* input )
{
  //get the files to process
  TString inputstring(input);
  inputstring = inputstring.Strip(TString::kBoth);
  TSystemFile inputfile(inputstring.Data(),"");
  if (inputfile.IsDirectory())
    return MakeFileListFromDir(inputstring.Data());
  else
    return MakeFileListFromFile(inputstring.Data());
}

//______________________________________________________________________________
Bool_t AliStarEventReader::MakeFileListFromDir ( const char* inputFileDirectory )
{
  //get the files to process
  Int_t  Count        = 0 ;
  static Int_t doOnce = 0 ;
  fFileList =  new TList() ;
  void*   directory = gSystem->OpenDirectory(inputFileDirectory) ;
  const char* entry = gSystem->GetDirEntry(directory) ;

  if ( entry == 0 )
  {
    cout << endl <<  "Error: \"" << inputFileDirectory << "\" does not exist" << endl << endl ;
    return false ;
  }
  else cout << endl ;

  while(entry != 0)
  {
    int len = strlen(entry);
    if( len >= 5 && strcmp( &entry[len - 5], ".root" ) == 0 )
    {
      TString fileName ;
      fileName = inputFileDirectory ;
      if( !fileName.EndsWith("/") ) fileName += "/" ;
      fileName += entry;
      fFileList->Add ( TFile::Open(fileName) ) ;
      if ( doOnce == 0 )
      {
        cout << "Add: " << fileName << endl ;
        doOnce = 1 ;
      }
      Count ++ ;
    }
    entry = gSystem->GetDirEntry(directory) ;
  }

  cout << "Add: " << Count-1 << " more file(s) from this directory for a total of " << Count << " files." << endl ;
  cout << "Finished creating file list ... preparing to open first file." << endl << endl ;
  return true ;
}

//______________________________________________________________________________
Bool_t AliStarEventReader::MakeFileListFromFile ( const char* inputFile )
{
  //get the files to process, from a text file, one file per line
  if (!fFileList) fFileList=new TList();
  ifstream filein;
  filein.open(inputFile);
  if (!filein.good()) 
  {
    printf("problem reading the file list \"%s\"\n",inputFile);
    return kFALSE;
  }
  TString line;
  while (filein.good())
  {
    printf("opening file: ");
    line.ReadLine(filein);
    if (line.Length() == 0) continue;
    TFile* file = TFile::Open(line.Data());
    if (!file) 
    {
      printf("problem opening file \"%s\"\n",line.Data());
      continue;
    }
    fFileList->Add(file);
    printf("%s\n",line.Data());
  }
  if (fFileList->GetEntries()>0) return kTRUE;
  return kFALSE;
}

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