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

/* $Id$ */
//
// Realisation of AliGenReader to be used with AliGenExtFile
// It reads events from a kinematics TreeK.
// NextEvent() is used to loop over events 
// and NextParticle() to loop over particles.  
// Author: andreas.morsch@cern.ch
//
#include <TFile.h>
#include <TTree.h>
#include <TParticle.h>
#include <TObjString.h>
#include <TObjArray.h>

#include "AliGenReaderTreeK.h"
#include "AliHeader.h"
#include "AliRun.h"
#include "AliStack.h"
#include "AliRunLoader.h"

ClassImp(AliGenReaderTreeK)

const TString AliGenReaderTreeK::fgkEventFolderName("GenReaderTreeK");

AliGenReaderTreeK::AliGenReaderTreeK():
    AliGenReader(),
    fNcurrent(0),
    fNparticle(0),
    fNp(0),
    fInRunLoader(0),
    fBaseFile(0),
    fStack(0),
    fOnlyPrimaries(kFALSE),
    fDirs(0x0),
    fCurrentDir(0)
{
//  Default constructor
}

AliGenReaderTreeK::AliGenReaderTreeK(const AliGenReaderTreeK &reader):
    AliGenReader(reader),
    fNcurrent(0),
    fNparticle(0),
    fNp(0),
    fInRunLoader(0),
    fBaseFile(0),
    fStack(0),
    fOnlyPrimaries(kFALSE),
    fDirs(0x0),
    fCurrentDir(0)
{
    reader.Copy(*this);
}


AliGenReaderTreeK::~AliGenReaderTreeK() 
{
// Destructor
    delete fInRunLoader;//it cleans all the loaded data
    delete fDirs;
}

void AliGenReaderTreeK::Init() 
{
// Initialization
// Connect base file and file to read from

    TTree *ali = AliRunLoader::Instance()->TreeE();
    if (ali) {
      fBaseFile = ali->GetCurrentFile();
    } else {
      printf("\n Warning: Basefile cannot be found !\n");
    }
    //if (!fFile) fFile  = new TFile(fFileName);
    if (fInRunLoader == 0x0) 
     {
       fInRunLoader = AliRunLoader::Open((GetDirName(fCurrentDir++)+"/")+fFileName,fgkEventFolderName);
       fInRunLoader->LoadHeader();
       fInRunLoader->LoadKinematics("READ");
     }
}

Int_t AliGenReaderTreeK::NextEvent() 
{
//  Read the next event  
//  cd to file with old kine tree    
    if (!fBaseFile) Init();
//  Get next event
    
    if (fNcurrent >= fInRunLoader->GetNumberOfEvents())
     {
      if (fCurrentDir >= fDirs->GetEntries())
       {
         Warning("NextEvent","No more events");
         return 0;
       }
      delete fInRunLoader;
      fInRunLoader = AliRunLoader::Open((GetDirName(fCurrentDir++)+"/")+fFileName,fgkEventFolderName);
      fInRunLoader->LoadHeader();
      fInRunLoader->LoadKinematics("READ");
      fNcurrent = 0;
     }
    fInRunLoader->GetEvent(fNcurrent);
    fStack = fInRunLoader->Stack();
    
//  cd back to base file
    fBaseFile->cd();
//
    fNcurrent++;
    fNparticle = 0;
    fNp =  fStack->GetNtrack();
    printf("\n Next event contains %d particles", fNp);
//    
    return  fNp;
}

TParticle* AliGenReaderTreeK::NextParticle() 
{
//Return next particle
  TParticle* part = GetParticle(fNparticle++);
  if (part == 0x0) return 0x0;
  //if only primaries are to be read, and this particle is not primary enter loop  
  if (fOnlyPrimaries && ( part->GetFirstMother() > -1) ) 
   for (;;)
    { //look for a primary
      part = GetParticle(fNparticle++);
      if (part == 0x0) return 0x0;
      if (part->GetFirstMother() == -1) return part;
    }

  return part;
}

void AliGenReaderTreeK::RewindEvent()
{
  // Go back to the first particle of the event
  fNparticle = 0;
}


AliGenReaderTreeK& AliGenReaderTreeK::operator=(const  AliGenReaderTreeK& rhs)
{
// Assignment operator
    rhs.Copy(*this);
    return *this;
}

void AliGenReaderTreeK::Copy(TObject&) const
{
    //
    // Copy 
    //
    Fatal("Copy","Not implemented!\n");
}



TString& AliGenReaderTreeK::GetDirName(Int_t entry)
 {
// Get the current directory name

   TString* retval;//return value
   if (fDirs ==  0x0)
    {
      retval = new TString(".");
      return *retval;
    }
   
   if ( (entry>fDirs->GetEntries()) || (entry<0))//if out of bounds return empty string
    {                                            //note that entry==0 is accepted even if array is empty (size=0)
      Error("GetDirName","Name out of bounds");
      retval = new TString();
      return *retval;
    }
   
   if (fDirs->GetEntries() == 0)
    { 
      retval = new TString(".");
      return *retval;
    }
   
   TObjString *dir = dynamic_cast<TObjString*>(fDirs->At(entry));
   if(dir == 0x0)
    {
      Error("GetDirName","Object in TObjArray is not a TObjString or its descendant");
      retval = new TString();
      return *retval;
    }
   if (gDebug > 0) Info("GetDirName","Returned ok %s",dir->String().Data());
   return dir->String();
 }
 
void AliGenReaderTreeK::AddDir(const char* dirname)
{
  //adds a directory to the list of directories where data are looked for
  if(fDirs == 0x0) 
   {
     fDirs = new TObjArray();
     fDirs->SetOwner(kTRUE);
   }
  TObjString *odir= new TObjString(dirname);
  fDirs->Add(odir);
}

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