#include "AliHBTReaderKineTree.h"
+//_______________________________________________________________________
+/////////////////////////////////////////////////////////////////////////
+//
+// class AliHBTReaderKineTree
+//
+// Reader for Kinematics
+//
+// Piotr.Skowronski@cern.ch
+//
+/////////////////////////////////////////////////////////////////////////
-#include <Riostream.h>
#include <TString.h>
-#include <TObjString.h>
-#include <TTree.h>
-#include <TFile.h>
#include <TParticle.h>
-#include <AliRun.h>
#include <AliRunLoader.h>
#include <AliStack.h>
-#include <AliHeader.h>
-#include "AliHBTRun.h"
#include "AliHBTEvent.h"
#include "AliHBTParticle.h"
-#include "AliHBTParticleCut.h"
ClassImp(AliHBTReaderKineTree)
/**********************************************************/
const TString AliHBTReaderKineTree::fgkEventFolderName("HBTReaderKineTree");
-AliHBTReaderKineTree::AliHBTReaderKineTree():fFileName("galice.root")
+AliHBTReaderKineTree::AliHBTReaderKineTree():
+ fFileName("galice.root"),
+ fRunLoader(0x0)
{
- fParticles = new AliHBTRun();
- fIsRead = kFALSE;
+ //ctor
}
+/**********************************************************/
-AliHBTReaderKineTree::
-AliHBTReaderKineTree(TString& fname):fFileName(fname)
+AliHBTReaderKineTree::AliHBTReaderKineTree(TString& fname):
+ fFileName(fname),
+ fRunLoader(0x0)
{
- fParticles = new AliHBTRun();
- fIsRead = kFALSE;
+ //ctor
}
+/**********************************************************/
+AliHBTReaderKineTree::AliHBTReaderKineTree(TObjArray* dirs,const Char_t *filename):
+ AliHBTReader(dirs),
+ fFileName(filename),
+ fRunLoader(0x0)
+{
+ //ctor
+}
/**********************************************************/
-AliHBTReaderKineTree::
-AliHBTReaderKineTree(TObjArray* dirs,const Char_t *filename):AliHBTReader(dirs),fFileName(filename)
+AliHBTReaderKineTree::AliHBTReaderKineTree(const AliHBTReaderKineTree& in):
+ AliHBTReader(in),
+ fFileName(in.fFileName),
+ fRunLoader(0x0)
{
- fParticles = new AliHBTRun();
- fIsRead = kFALSE;
+ //cpy ctor
}
-/**********************************************************/
-AliHBTEvent* AliHBTReaderKineTree::GetParticleEvent(Int_t n)
- {
- //returns Nth event with simulated particles
- if (!fIsRead)
- if(Read(fParticles,0x0))
- {
- Error("GetParticleEvent","Error in reading");
- return 0x0;
- }
-
- return fParticles->GetEvent(n);
- }
-
-/********************************************************************/
-
-Int_t AliHBTReaderKineTree::GetNumberOfPartEvents()
- {
- //returns number of events of particles
- if (!fIsRead)
- if(Read(fParticles,0x0))
- {
- Error("GetNumberOfPartEvents","Error in reading");
- return 0;
- }
- return fParticles->GetNumberOfEvents();
- }
+/**********************************************************/
+AliHBTReaderKineTree::~AliHBTReaderKineTree()
+{
+ //dtor
+ delete fRunLoader;
+}
+/**********************************************************/
+AliHBTReaderKineTree& AliHBTReaderKineTree::operator=(const AliHBTReaderKineTree& in)
+{
+//Assiment operator
+ if (this == &in) return *this;
+ AliHBTReader::operator=(in);
+ delete fRunLoader;
+ fRunLoader = 0x0;
+ return * this;
+}
+/**********************************************************/
+void AliHBTReaderKineTree::Rewind()
+{
+//Rewinds to the beginning
+ delete fRunLoader;
+ fRunLoader = 0x0;
+ fCurrentDir = 0;
+ fNEventsRead= 0;
+}
/**********************************************************/
-Int_t AliHBTReaderKineTree::
-Read(AliHBTRun* particles, AliHBTRun *tracks)
- {
- cout<<"AliHBTReaderKineTree::Read()"<<endl;
- if (!particles) //check if an object is instatiated
- {
- Error("Read"," particles object must instatiated before passing it to the reader");
- return 1;
- }
- particles->Reset();//clear runs == delete all old events
-
- Int_t Ndirs;//total number of directories specified in fDirs array
- Int_t Nevents; //number of events read in current directory
- Int_t totalNevents = 0; //total number of read events
- Int_t currentdir = 0; //number of current directory name is fDirs array
- if (fDirs) //if array with directories is supplied by user
- {
- Ndirs = fDirs->GetEntries(); //get the number if directories
- }
- else
- {
- Ndirs = 0; //if the array is not supplied read only from current directory
- }
+Int_t AliHBTReaderKineTree::ReadNext()
+{
+ //Reads Kinematics Tree
+
+ Info("Read","");
+ if (fParticlesEvent == 0x0) fParticlesEvent = new AliHBTEvent();
+ fParticlesEvent->Reset();
do //do{}while; is OK even if 0 dirs specified. In that case we try to read from "./"
{
- cout<<"________________________________________________________\n";
- AliRunLoader * rl = OpenFile(currentdir);
-
- if (rl == 0x0)
+ if (fRunLoader == 0x0)
+ if (OpenNextFile())
+ {
+ fCurrentDir++;
+ continue;
+ }
+
+ if (fCurrentEvent == fRunLoader->GetNumberOfEvents())
{
- Error("Read","Cannot open session");
- return 2;
+ //read next directory
+ delete fRunLoader;//close current session
+ fRunLoader = 0x0;//assure pointer is null
+ fCurrentDir++;//go to next dir
+ continue;//directory counter is increased inside in case of error
}
- rl->LoadHeader();
- rl->LoadKinematics("READ");
- Nevents = rl->GetNumberOfEvents();
+
+ Info("ReadNext","Reading Event %d",fCurrentEvent);
+
+ fRunLoader->GetEvent(fCurrentEvent);
- for(Int_t currentEvent =0; currentEvent<Nevents;currentEvent++)//loop over all events
+ AliStack* stack = fRunLoader->Stack();
+ if (!stack)
{
-// cout<<"processing event "<<currentEvent<<" in current dir."<<endl;
- rl->GetEvent(currentEvent);
- AliStack* stack = rl->Stack();
- if (!stack)
- {
- Error("Read","Can not get stack for event %d",currentEvent);
- continue;
- }
- Int_t npart = stack->GetNtrack();
- Int_t nnn = 0;
- for (Int_t i = 0;i<npart; i++)
- {
-
+ Error("ReadNext","Can not get stack for event %d",fCurrentEvent);
+ continue;
+ }
+ Int_t npart = stack->GetNtrack();
+ for (Int_t i = 0;i<npart; i++)
+ {
TParticle * p = stack->Particle(i);
// if (p->GetFirstMother() >= 0) continue; do not apply with pythia etc
AliHBTParticle* part = new AliHBTParticle(*p,i);
if(Pass(part)) { delete part; continue;}//check if meets all criteria of any of our cuts
//if it does not delete it and take next good track
- particles->AddParticle(totalNevents,part);//put track and particle on the run
-
- if ( (nnn%100) == 0)
- {
- cout<<nnn<<"\r";
- fflush(0);
- }
- nnn++;
- }
- cout<<"Total read "<<nnn<<endl;
- totalNevents++;
- }
- delete rl;
- currentdir++;
- }while(currentdir < Ndirs);//end of loop over directories specified in fDirs Obj Array
- fIsRead = kTRUE;
- return 0;
+ fParticlesEvent->AddParticle(part);//put particle in event
+ }
+ Info("ReadNext","Read %d particles from event %d (event %d in dir %d).",
+ fParticlesEvent->GetNumberOfParticles(),
+ fNEventsRead,fCurrentEvent,fCurrentDir);
+
+ fCurrentEvent++;
+ fNEventsRead++;
+ return 0;
+ }while(fCurrentDir < GetNumberOfDirs());//end of loop over directories specified in fDirs Obj Array
+
+ return 1;
}
+/**********************************************************/
-AliRunLoader* AliHBTReaderKineTree::OpenFile(Int_t n)
+Int_t AliHBTReaderKineTree::OpenNextFile()
{
//opens file with kine tree
-
- const TString& dirname = GetDirName(n);
+ Info("OpenNextFile","________________________________________________________");
+
+ const TString& dirname = GetDirName(fCurrentEvent);
if (dirname == "")
{
- Error("OpenFiles","Can not get directory name");
- return 0x0;
+ Error("OpenNextFile","Can not get directory name");
+ return 1;
}
TString filename = dirname +"/"+ fFileName;
- AliRunLoader *ret = AliRunLoader::Open(filename.Data(),fgkEventFolderName,"READ");
+ fRunLoader = AliRunLoader::Open(filename.Data(),fgkEventFolderName,"READ");
- if ( ret == 0x0)
+ if ( fRunLoader == 0x0)
{
- Error("OpenFiles","Can't open session from file %s",filename.Data());
- return 0x0;
+ Error("OpenNextFile","Can't open session from file %s",filename.Data());
+ return 1;
}
-
- return ret;
+
+ if (fRunLoader->GetNumberOfEvents() <= 0)
+ {
+ Error("OpenNextFile","There is no events in this directory.");
+ delete fRunLoader;
+ fRunLoader = 0x0;
+ return 2;
+ }
+
+ if (fRunLoader->LoadKinematics())
+ {
+ Error("OpenNextFile","Error occured while loading kinematics.");
+ return 3;
+ }
+
+ fCurrentEvent = 0;
+ return 0;
}