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

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
//  Particles stack class                                                    //
//  Implements the TMCVirtualStack of the Virtual Monte Carlo                //
//  Holds the particles transported during simulation                        //
//  Is used to compare results of reconstruction with simulation             //
//  Author A.Morsch                                                          //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

 
#include <TClonesArray.h>
#include <TObjArray.h>
#include <TPDGCode.h>
#include <TMCProcess.h>
#include <TParticle.h>
#include <TParticlePDG.h>
#include <TDatabasePDG.h>
#include <TTree.h>
#include <TDirectory.h>

#include "AliLog.h"
#include "AliStack.h"

ClassImp(AliStack)

//_______________________________________________________________________
AliStack::AliStack():
  fParticles("TParticle", 1000),
  fParticleMap(),
  fParticleFileMap(0),
  fParticleBuffer(0),
  fCurrentTrack(0),
  fTreeK(0),
  fNtrack(0),
  fNprimary(0),
  fCurrent(-1),
  fCurrentPrimary(-1),
  fHgwmk(0),
  fLoadPoint(0),
  fTrackLabelMap(0)
{
  //
  // Default constructor
  //
}

//_______________________________________________________________________
AliStack::AliStack(Int_t size, const char* /*evfoldname*/):
  fParticles("TParticle",1000),
  fParticleMap(size),
  fParticleFileMap(0),
  fParticleBuffer(0),
  fCurrentTrack(0),
  fTreeK(0),
  fNtrack(0),
  fNprimary(0),
  fCurrent(-1),
  fCurrentPrimary(-1),
  fHgwmk(0),
  fLoadPoint(0),
  fTrackLabelMap(0)
{
  //
  //  Constructor
  //
}

//_______________________________________________________________________
AliStack::AliStack(const AliStack& st):
    TVirtualMCStack(st),
    fParticles("TParticle",1000),
    fParticleMap(*(st.Particles())),
    fParticleFileMap(st.fParticleFileMap),
    fParticleBuffer(0),
    fCurrentTrack(0),
    fTreeK((TTree*)(st.fTreeK->Clone())),
    fNtrack(st.GetNtrack()),
    fNprimary(st.GetNprimary()),
    fCurrent(-1),
    fCurrentPrimary(-1),
    fHgwmk(0),
    fLoadPoint(0),
    fTrackLabelMap(0)
{
    // Copy constructor
}


//_______________________________________________________________________
void AliStack::Copy(TObject&) const
{
  AliFatal("Not implemented!");
}

//_______________________________________________________________________
AliStack::~AliStack()
{
  //
  // Destructor
  //
  
    fParticles.Clear();
}

//
// public methods
//

//_____________________________________________________________________________
void AliStack::PushTrack(Int_t done, Int_t parent, Int_t pdg, const Float_t *pmom,
                        const Float_t *vpos, const Float_t *polar, Float_t tof,
                        TMCProcess mech, Int_t &ntr, Float_t weight, Int_t is)
{ 
  //
  // Load a track on the stack
  //
  // done     1 if the track has to be transported
  //          0 if not
  // parent   identifier of the parent track. -1 for a primary
  // pdg    particle code
  // pmom     momentum GeV/c
  // vpos     position 
  // polar    polarisation 
  // tof      time of flight in seconds
  // mecha    production mechanism
  // ntr      on output the number of the track stored
  //

  //  const Float_t tlife=0;
  
  //
  // Here we get the static mass
  // For MC is ok, but a more sophisticated method could be necessary
  // if the calculated mass is required
  // also, this method is potentially dangerous if the mass
  // used in the MC is not the same of the PDG database
  //
    TParticlePDG* pmc =  TDatabasePDG::Instance()->GetParticle(pdg);
    if (pmc) {
	Float_t mass = TDatabasePDG::Instance()->GetParticle(pdg)->Mass();
	Float_t e=TMath::Sqrt(mass*mass+pmom[0]*pmom[0]+
			      pmom[1]*pmom[1]+pmom[2]*pmom[2]);
	
//    printf("Loading  mass %f ene %f No %d ip %d parent %d done %d pos %f %f %f mom %f %f %f kS %d m \n",
//	   mass,e,fNtrack,pdg,parent,done,vpos[0],vpos[1],vpos[2],pmom[0],pmom[1],pmom[2],kS);
  

	PushTrack(done, parent, pdg, pmom[0], pmom[1], pmom[2], e,
		 vpos[0], vpos[1], vpos[2], tof, polar[0], polar[1], polar[2],
		 mech, ntr, weight, is);
    } else {
	AliWarning(Form("Particle type %d not defined in PDG Database !", pdg));
	AliWarning("Particle skipped !");
    }
}

//_____________________________________________________________________________
void AliStack::PushTrack(Int_t done, Int_t parent, Int_t pdg,
  	              Double_t px, Double_t py, Double_t pz, Double_t e,
  		      Double_t vx, Double_t vy, Double_t vz, Double_t tof,
		      Double_t polx, Double_t poly, Double_t polz,
		      TMCProcess mech, Int_t &ntr, Double_t weight, Int_t is)
{ 
  //
  // Load a track on the stack
  //
  // done        1 if the track has to be transported
  //             0 if not
  // parent      identifier of the parent track. -1 for a primary
  // pdg         particle code
  // kS          generation status code
  // px, py, pz  momentum GeV/c
  // vx, vy, vz  position 
  // polar       polarisation 
  // tof         time of flight in seconds
  // mech        production mechanism
  // ntr         on output the number of the track stored
  //    
  // New method interface: 
  // arguments were changed to be in correspondence with TParticle
  // constructor.
  // Note: the energy is not calculated from the static mass but
  // it is passed by argument e.

  const Int_t kFirstDaughter=-1;
  const Int_t kLastDaughter=-1;


  TParticle* particle
    = new(fParticles[fLoadPoint++]) 
      TParticle(pdg, is, parent, -1, kFirstDaughter, kLastDaughter,
		px, py, pz, e, vx, vy, vz, tof);
                
  particle->SetPolarisation(polx, poly, polz);
  particle->SetWeight(weight);
  particle->SetUniqueID(mech);

  
  
  if(!done) {
      particle->SetBit(kDoneBit);
  } else {
      particle->SetBit(kTransportBit);
  }
  
  

  //  Declare that the daughter information is valid
  particle->SetBit(kDaughtersBit);
  //  Add the particle to the stack
  
  fParticleMap.AddAtAndExpand(particle, fNtrack);//CHECK!!

  if(parent>=0) {
      particle = GetParticleMapEntry(parent);
      if (particle) {
	  particle->SetLastDaughter(fNtrack);
	  if(particle->GetFirstDaughter()<0) particle->SetFirstDaughter(fNtrack);
      }
      else {
	  AliError(Form("Parent %d does not exist",parent));
      }
  } else { 
      //
      // This is a primary track. Set high water mark for this event
      fHgwmk = fNtrack;
      //
      // Set also number if primary tracks
      fNprimary = fHgwmk+1;
      fCurrentPrimary++;
  }
  ntr = fNtrack++;
}

//_____________________________________________________________________________
TParticle*  AliStack::PopNextTrack(Int_t& itrack)
{
  //
  // Returns next track from stack of particles
  //
  

  TParticle* track = GetNextParticle();

  if (track) {
    itrack = fCurrent;
    track->SetBit(kDoneBit);
  }
  else
    itrack = -1;
  
  fCurrentTrack = track;
  return track;
}

//_____________________________________________________________________________
TParticle*  AliStack::PopPrimaryForTracking(Int_t i)
{
  //
  // Returns i-th primary particle if it is flagged to be tracked,
  // 0 otherwise
  //
  
  TParticle* particle = Particle(i);
  
  if (!particle->TestBit(kDoneBit)) {
    fCurrentTrack = particle;
    return particle;
  }
  else
    return 0;
}      

//_____________________________________________________________________________
Bool_t AliStack::PurifyKine()
{
  //
  // Compress kinematic tree keeping only flagged particles
  // and renaming the particle id's in all the hits
  //

  int nkeep = fHgwmk + 1, parent, i;
  TParticle *part, *father;
  fTrackLabelMap.Set(fParticleMap.GetLast()+1);

  // Save in Header total number of tracks before compression
  // If no tracks generated return now
  if(fHgwmk+1 == fNtrack) return kFALSE;

  // First pass, invalid Daughter information
  for(i=0; i<fNtrack; i++) {
      // Preset map, to be removed later
      if(i<=fHgwmk) fTrackLabelMap[i]=i ; 
      else {
	  fTrackLabelMap[i] = -99;
	  if((part=GetParticleMapEntry(i))) {
//
//        Check of this track should be kept for physics reasons 
	      if (KeepPhysics(part)) KeepTrack(i);
//
	      part->ResetBit(kDaughtersBit);
	      part->SetFirstDaughter(-1);
	      part->SetLastDaughter(-1);
	  }
      }
  }
  // Invalid daughter information for the parent of the first particle
  // generated. This may or may not be the current primary according to
  // whether decays have been recorded among the primaries
  part = GetParticleMapEntry(fHgwmk+1);
  fParticleMap.At(part->GetFirstMother())->ResetBit(kDaughtersBit);
  // Second pass, build map between old and new numbering
  for(i=fHgwmk+1; i<fNtrack; i++) {
      if(fParticleMap.At(i)->TestBit(kKeepBit)) {
	  // This particle has to be kept
	  fTrackLabelMap[i]=nkeep;
	  // If old and new are different, have to move the pointer
	  if(i!=nkeep) fParticleMap[nkeep]=fParticleMap.At(i);
	  part = GetParticleMapEntry(nkeep);
	  // as the parent is always *before*, it must be already
	  // in place. This is what we are checking anyway!
	  if((parent=part->GetFirstMother())>fHgwmk) {
	      if(fTrackLabelMap[parent]==-99) Fatal("PurifyKine","fTrackLabelMap[%d] = -99!\n",parent);
	      else part->SetFirstMother(fTrackLabelMap[parent]);}
	  nkeep++;
      }
  }
  
  // Fix daughters information
  for (i=fHgwmk+1; i<nkeep; i++) {
      part = GetParticleMapEntry(i);
      parent = part->GetFirstMother();
      if(parent>=0) {
	  father = GetParticleMapEntry(parent);
	  if(father->TestBit(kDaughtersBit)) {
	      
	      if(i<father->GetFirstDaughter()) father->SetFirstDaughter(i);
	      if(i>father->GetLastDaughter())  father->SetLastDaughter(i);
	  } else {
	      // Initialise daughters info for first pass
	      father->SetFirstDaughter(i);
	      father->SetLastDaughter(i);
	      father->SetBit(kDaughtersBit);
	  }
      }
  }
  //
  // Now the output bit, from fHgwmk to nkeep we write everything and we erase
  if(nkeep > fParticleFileMap.GetSize()) fParticleFileMap.Set(Int_t (nkeep*1.5));
  for (i=fHgwmk+1; i<nkeep; ++i) {
      fParticleBuffer = GetParticleMapEntry(i);
      fParticleFileMap[i]=static_cast<Int_t>(TreeK()->GetEntries());
      TreeK()->Fill();
      fParticleMap[i]=fParticleBuffer=0;
  }
  
  for (i = nkeep; i < fNtrack; ++i) fParticleMap[i]=0;
  
  Int_t toshrink = fNtrack-fHgwmk-1;
  fLoadPoint-=toshrink;
  
  for(i=fLoadPoint; i<fLoadPoint+toshrink; ++i) fParticles.RemoveAt(i);
  fNtrack=nkeep;
  fHgwmk=nkeep-1;
  return kTRUE;
}


Bool_t AliStack::ReorderKine()
{
//
// In some transport code children might not come in a continuous sequence.
// In this case the stack  has  to  be reordered in order to establish the 
// mother daughter relation using index ranges.
//    
  if(fHgwmk+1 == fNtrack) return kFALSE;

  //
  // Howmany secondaries have been produced ?
  Int_t nNew = fNtrack - fHgwmk - 1;
    
  if (nNew > 0) {
      Int_t i, j;
      TArrayI map1(nNew);
      //
      // Copy pointers to temporary array
      TParticle** tmp = new TParticle*[nNew];
      
      for (i = 0; i < nNew; i++) {
	  if (fParticleMap.At(fHgwmk + 1 + i)) {
	      tmp[i] = GetParticleMapEntry(fHgwmk + 1 + i);
	  } else {
	      tmp[i] = 0x0;
	  }
	  map1[i] = -99;
      }
  
      
      //
      // Reset  LoadPoint 
      // 
      Int_t loadPoint = fHgwmk + 1;
      //
      // Re-Push particles into stack 
      // The outer loop is over parents, the inner over children.
      // -1 refers to the primary particle
      //
      for (i = -1; i < nNew-1; i++) {
	  Int_t ipa;
	  TParticle* parP;
	  if (i == -1) {
	      ipa  = tmp[0]->GetFirstMother();
	      parP = GetParticleMapEntry(ipa);
	  } else {
	      ipa = (fHgwmk + 1 + i);
              // Skip deleted particles
	      if (!tmp[i])                          continue;
              // Skip particles without children
	      if (tmp[i]->GetFirstDaughter() == -1) continue;
	      parP = tmp[i];
	  }
          // Reset daughter information

	  Int_t idaumin = parP->GetFirstDaughter() - fHgwmk - 1;
	  Int_t idaumax = parP->GetLastDaughter()  - fHgwmk - 1;
	  parP->SetFirstDaughter(-1);
	  parP->SetLastDaughter(-1);
	  for (j = idaumin; j <= idaumax; j++) {
              // Skip deleted particles
	      if (!tmp[j])        continue;
              // Skip particles already handled
	      if (map1[j] != -99) continue;
	      Int_t jpa = tmp[j]->GetFirstMother();
              // Check if daughter of current parent
	      if (jpa == ipa) {
		  fParticleMap[loadPoint] = tmp[j];
		  // Re-establish daughter information
		  parP->SetLastDaughter(loadPoint);
		  if (parP->GetFirstDaughter() == -1) parP->SetFirstDaughter(loadPoint);
		  // Set Mother information
		  if (i != -1) {
		      tmp[j]->SetFirstMother(map1[i]);
		  } 
		  // Build the map
		  map1[j] = loadPoint;
		  // Increase load point
		  loadPoint++;
	      }
	  } // children
      } // parents

      delete[] tmp;

      //
      // Build map for remapping of hits
      // 
      fTrackLabelMap.Set(fNtrack);
      for (i = 0; i < fNtrack; i ++) {
	  if (i <= fHgwmk) {
	      fTrackLabelMap[i] = i;
	  } else{
	      fTrackLabelMap[i] = map1[i - fHgwmk -1];
	  }
      }
  } // new particles poduced
  
  return kTRUE;
}

Bool_t AliStack::KeepPhysics(const TParticle* part)
{
    //
    // Some particles have to kept on the stack for reasons motivated
    // by physics analysis. Decision is put here.
    //
    Bool_t keep = kFALSE;

    Int_t parent = part->GetFirstMother();
    if (parent >= 0 && parent <= fHgwmk) {
      TParticle* father = GetParticleMapEntry(parent);
    //
    // Keep first-generation daughter from primaries with heavy flavor 
    //
	Int_t kf = father->GetPdgCode();
	kf = TMath::Abs(kf);
	Int_t kfl = kf;
	// meson ?
	if  (kfl > 10) kfl/=100;
	// baryon
	if (kfl > 10)  kfl/=10;
	if (kfl > 10)  kfl/=10;
	if (kfl >= 4) {
	    keep = kTRUE;
	}
	//
	// e+e- from pair production of primary gammas
	//
	if ((part->GetUniqueID()) == kPPair)  keep = kTRUE;
    }
    //
    // Decay(cascade) from primaries
    // 
    if ((part->GetUniqueID() == kPDecay) && (parent >= 0)) {
      // Particles from decay
      TParticle* father = GetParticleMapEntry(parent);
      Int_t imo = parent;
      while((imo > fHgwmk) && (father->GetUniqueID() == kPDecay)) {
	imo =  father->GetFirstMother();
	father = GetParticleMapEntry(imo);
      }
      if ((imo <= fHgwmk)) keep = kTRUE;
    }
    return keep;
}

//_____________________________________________________________________________
void AliStack::FinishEvent()
{
//
// Write out the kinematics that was not yet filled
//
  
// Update event header

  if (!TreeK()) {
//    Fatal("FinishEvent", "No kinematics tree is defined.");
//    Don't panic this is a probably a lego run
      return;
  }  
  
  CleanParents();
   if(TreeK()->GetEntries() ==0) {
    // set the fParticleFileMap size for the first time
    fParticleFileMap.Set(fHgwmk+1);
  }

  Bool_t allFilled = kFALSE;
  TParticle *part;
  for(Int_t i=0; i<fHgwmk+1; ++i) {
    if((part=GetParticleMapEntry(i))) {
      fParticleBuffer = part;
      fParticleFileMap[i]= static_cast<Int_t>(TreeK()->GetEntries());
      TreeK()->Fill();
      fParticleBuffer=0;      
      fParticleMap.AddAt(0,i);      
      
      // When all primaries were filled no particle!=0
      // should be left => to be removed later.
      if (allFilled) AliWarning(Form("Why != 0 part # %d?\n",i));
    }
    else 
    {
      // // printf("Why = 0 part # %d?\n",i); => We know.
      // break;
      // we don't break now in order to be sure there is no
      // particle !=0 left.
      // To be removed later and replaced with break.
       if(!allFilled) allFilled = kTRUE;
    }
  }
} 
//_____________________________________________________________________________

void AliStack::FlagTrack(Int_t track)
{
  //
  // Flags a track and all its family tree to be kept
  //
  
  TParticle *particle;

  Int_t curr=track;
  while(1) {
    particle = GetParticleMapEntry(curr);
    
    // If the particle is flagged the three from here upward is saved already
    if(particle->TestBit(kKeepBit)) return;
    
    // Save this particle
    particle->SetBit(kKeepBit);
    
    // Move to father if any
    if((curr=particle->GetFirstMother())==-1) return;
  }
}
 
//_____________________________________________________________________________
void AliStack::KeepTrack(Int_t track)
{ 
  //
  // Flags a track to be kept
  //
  
  fParticleMap.At(track)->SetBit(kKeepBit);
}

//_____________________________________________________________________________
void  AliStack::Clean(Int_t size) 
{
  //
  // Reset stack data except for fTreeK
  //
  
  fNtrack=0;
  fNprimary=0;
  fHgwmk=0;
  fLoadPoint=0;
  fCurrent = -1;
  ResetArrays(size);
}

//_____________________________________________________________________________
void  AliStack::Reset(Int_t size) 
{
  //
  // Reset stack data including fTreeK
  //

  Clean(size);
  delete fParticleBuffer; fParticleBuffer = 0;
  fTreeK = 0x0;
}

//_____________________________________________________________________________
void  AliStack::ResetArrays(Int_t size) 
{
  //
  // Resets stack arrays
  //
  fParticles.Clear();
  fParticleMap.Clear();
  if (size>0) fParticleMap.Expand(size);
}

//_____________________________________________________________________________
void AliStack::SetHighWaterMark(Int_t)
{
  //
  // Set high water mark for last track in event
  //
    
    fHgwmk = fNtrack-1;
    fCurrentPrimary=fHgwmk;
    // Set also number of primary tracks
    fNprimary = fHgwmk+1;
}

//_____________________________________________________________________________
TParticle* AliStack::Particle(Int_t i)
{
  //
  // Return particle with specified ID

  if(!fParticleMap.At(i)) {
    Int_t nentries = fParticles.GetEntriesFast();
    // algorithmic way of getting entry index
    // (primary particles are filled after secondaries)
    Int_t entry = TreeKEntry(i);
    // check whether algorithmic way and 
    // and the fParticleFileMap[i] give the same;
    // give the fatal error if not
    if (entry != fParticleFileMap[i]) {
      AliFatal(Form(
        "!! The algorithmic way and map are different: !!\n entry: %d map: %d",
	entry, fParticleFileMap[i])); 
    } 
    // Load particle at entry into fParticleBuffer
    TreeK()->GetEntry(entry);
    // Add to the TClonesarray
    new (fParticles[nentries]) TParticle(*fParticleBuffer);
    // Store a pointer in the TObjArray
    fParticleMap.AddAt(fParticles[nentries],i);
  }
  return GetParticleMapEntry(i);
}

//_____________________________________________________________________________
TParticle* AliStack::ParticleFromTreeK(Int_t id) const
{
// 
// return pointer to TParticle with label id
//
  Int_t entry;
  if ((entry = TreeKEntry(id)) < 0) return 0;
  if (fTreeK->GetEntry(entry)<=0) return 0;
  return fParticleBuffer;
}

//_____________________________________________________________________________
Int_t AliStack::TreeKEntry(Int_t id) const 
{
//
// Return entry number in the TreeK for particle with label id
// Return negative number if label>fNtrack
//
// The order of particles in TreeK reflects the order of the transport of primaries and production of secondaries:
//
// Before transport there are fNprimary particles on the stack.
// They are transported one by one and secondaries (fNtrack - fNprimary) are produced. 
// After the transport of each particles secondaries are written to the TreeK
// They occupy the entries 0 ... fNtrack - fNprimary - 1
// The primaries are written after they have been transported and occupy 
// fNtrack - fNprimary .. fNtrack - 1

  Int_t entry;
  if (id<fNprimary)
    entry = id+fNtrack-fNprimary;
  else 
    entry = id-fNprimary;
  return entry;
}

//_____________________________________________________________________________
Int_t AliStack::GetCurrentParentTrackNumber() const
{
  //
  // Return number of the parent of the current track
  //
  
  TParticle* current = GetParticleMapEntry(fCurrent);

  if (current) 
    return current->GetFirstMother();
  else {
    AliWarning("Current track not found in the stack");
    return -1;
  }  
}
 
//_____________________________________________________________________________
Int_t AliStack::GetPrimary(Int_t id)
{
  //
  // Return number of primary that has generated track
  //
  
  int current, parent;
  //
  parent=id;
  while (1) {
    current=parent;
    parent=Particle(current)->GetFirstMother();
    if(parent<0) return current;
  }
}
 
//_____________________________________________________________________________
void AliStack::DumpPart (Int_t i) const
{
  //
  // Dumps particle i in the stack
  //
  GetParticleMapEntry(i)->Print();
}

//_____________________________________________________________________________
void AliStack::DumpPStack ()
{
  //
  // Dumps the particle stack
  //

  Int_t i;

  printf("\n\n=======================================================================\n");
  for (i=0;i<fNtrack;i++) 
    {
      TParticle* particle = Particle(i);
      if (particle) {
        printf("-> %d ",i); particle->Print();
        printf("--------------------------------------------------------------\n");
      }
      else 
        Warning("DumpPStack", "No particle with id %d.", i); 
    }	 

  printf("\n=======================================================================\n\n");
  
  // print  particle file map
  // printf("\nParticle file map: \n");
  // for (i=0; i<fNtrack; i++) 
  //     printf("   %d th entry: %d \n",i,fParticleFileMap[i]);
}


//_____________________________________________________________________________
void AliStack::DumpLoadedStack() const
{
  //
  // Dumps the particle in the stack
  // that are loaded in memory.
  //

  printf(
	 "\n\n=======================================================================\n");
  for (Int_t i=0;i<fNtrack;i++) 
    {
      TParticle* particle = GetParticleMapEntry(i);
      if (particle) {
        printf("-> %d ",i); particle->Print();
        printf("--------------------------------------------------------------\n");
      }
      else { 	
        printf("-> %d  Particle not loaded.\n",i);
        printf("--------------------------------------------------------------\n");
      }	
    }
  printf(
	 "\n=======================================================================\n\n");
}

//_____________________________________________________________________________
void  AliStack::SetCurrentTrack(Int_t track)
{ 
  fCurrent = track; 
  if (fCurrent < fNprimary) fCurrentTrack = Particle(track);
}


//_____________________________________________________________________________
//
// protected methods
//

//_____________________________________________________________________________
void AliStack::CleanParents()
{
  //
  // Clean particles stack
  // Set parent/daughter relations
  //
  
  TParticle *part;
  int i;
  for(i=0; i<fHgwmk+1; i++) {
    part = GetParticleMapEntry(i);
    if(part) if(!part->TestBit(kDaughtersBit)) {
      part->SetFirstDaughter(-1);
      part->SetLastDaughter(-1);
    }
  }
}

//_____________________________________________________________________________
TParticle* AliStack::GetNextParticle()
{
  //
  // Return next particle from stack of particles
  //
  
  TParticle* particle = 0;
  
  // search secondaries
  //for(Int_t i=fNtrack-1; i>=0; i--) {
  for(Int_t i=fNtrack-1; i>fHgwmk; i--) {
      particle = GetParticleMapEntry(i);
      if ((particle) && (!particle->TestBit(kDoneBit))) {
	  fCurrent=i;    
	  return particle;
      }   
  }    

  // take next primary if all secondaries were done
  while (fCurrentPrimary>=0) {
      fCurrent = fCurrentPrimary;    
      particle = GetParticleMapEntry(fCurrentPrimary--);
      if ((particle) && (!particle->TestBit(kDoneBit))) {
	  return particle;
      } 
  }
  
  // nothing to be tracked
  fCurrent = -1;
 
  
  return particle;  
}
//__________________________________________________________________________________________

void AliStack::ConnectTree(TTree* tree)
{
//
//  Creates branch for writing particles
//

  fTreeK = tree;
    
  AliDebug(1, "Connecting TreeK");
  if (fTreeK == 0x0)
   {
    if (TreeK() == 0x0)
     {
      AliFatal("Parameter is NULL");//we don't like such a jokes
      return;
     }
    return;//in this case TreeK() calls back this method (ConnectTree) 
           //tree after setting fTreeK, the rest was already executed
           //it is safe to return now
   }

 //  Create a branch for particles   
  
  AliDebug(2, Form("Tree name is %s",fTreeK->GetName()));
   
  if (fTreeK->GetDirectory())
   {
     AliDebug(2, Form("and dir is %s",fTreeK->GetDirectory()->GetName()));
   }    
  else
    AliWarning("DIR IS NOT SET !!!");
  
  TBranch *branch=fTreeK->GetBranch("Particles");
  if(branch == 0x0)
   {
    branch = fTreeK->Branch("Particles", &fParticleBuffer, 4000);
    AliDebug(2, "Creating Branch in Tree");
   }  
  else
   {
    AliDebug(2, "Branch Found in Tree");
    branch->SetAddress(&fParticleBuffer);
   }
  if (branch->GetDirectory())
   {
    AliDebug(1, Form("Branch Dir Name is %s",branch->GetDirectory()->GetName()));
   } 
  else
    AliWarning("Branch Dir is NOT SET");
}

//_____________________________________________________________________________

Bool_t AliStack::GetEvent()
{
//
// Get new event from TreeK

    // Reset/Create the particle stack
    Int_t size = (Int_t)TreeK()->GetEntries();
    ResetArrays(size);
    return kTRUE;
}
//_____________________________________________________________________________

Bool_t AliStack::IsStable(Int_t pdg) const
{
  //
  // Decide whether particle (pdg) is stable
  //
  
  
  // All ions/nucleons are considered as stable
  // Nuclear code is 10LZZZAAAI
  if(pdg>1000000000)return kTRUE;

  const Int_t kNstable = 18;
  Int_t i;
  
  Int_t pdgStable[kNstable] = {
    kGamma,             // Photon
    kElectron,          // Electron
    kMuonPlus,          // Muon 
    kPiPlus,            // Pion
    kKPlus,             // Kaon
    kK0Short,           // K0s
    kK0Long,            // K0l
    kProton,            // Proton 
    kNeutron,           // Neutron
    kLambda0,           // Lambda_0
    kSigmaMinus,        // Sigma Minus
    kSigmaPlus,         // Sigma Plus
    3312,               // Xsi Minus 
    3322,               // Xsi 
    3334,               // Omega
    kNuE,               // Electron Neutrino 
    kNuMu,              // Muon Neutrino
    kNuTau              // Tau Neutrino
  };
    
  Bool_t isStable = kFALSE;
  for (i = 0; i < kNstable; i++) {
    if (pdg == TMath::Abs(pdgStable[i])) {
      isStable = kTRUE;
      break;
    }
  }
  
  return isStable;
}

//_____________________________________________________________________________
Bool_t AliStack::IsPhysicalPrimary(Int_t index)
{
    //
    // Test if a particle is a physical primary according to the following definition:
    // Particles produced in the collision including products of strong and
    // electromagnetic decay and excluding feed-down from weak decays of strange
    // particles.
    //
    TParticle* p = Particle(index);
    Int_t ist = p->GetStatusCode();
    
    //
    // Initial state particle
    if (ist > 1) return kFALSE;
    
    Int_t pdg = TMath::Abs(p->GetPdgCode());
    
    if (!IsStable(pdg)) return kFALSE;
    
    if (index < GetNprimary()) {
//
// Particle produced by generator
	return kTRUE;
    } else {
//
// Particle produced during transport
//

	Int_t imo =  p->GetFirstMother();
	TParticle* pm  = Particle(imo);
	Int_t mpdg = TMath::Abs(pm->GetPdgCode());
// Check for Sigma0 
	if ((mpdg == 3212) &&  (imo <  GetNprimary())) return kTRUE;
// 
// Check if it comes from a pi0 decay
//
	if ((mpdg == kPi0) && (imo < GetNprimary()))   return kTRUE; 

// Check if this is a heavy flavor decay product
	Int_t mfl  = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));
	//
	// Light hadron
	if (mfl < 4) return kFALSE;
	
	//
	// Heavy flavor hadron produced by generator
	if (imo <  GetNprimary()) {
	    return kTRUE;
	}
	
	// To be sure that heavy flavor has not been produced in a secondary interaction
	// Loop back to the generated mother
	while (imo >=  GetNprimary()) {
	    imo = pm->GetFirstMother();
	    pm  =  Particle(imo);
	}
	mpdg = TMath::Abs(pm->GetPdgCode());
	mfl  = Int_t (mpdg / TMath::Power(10, Int_t(TMath::Log10(mpdg))));

	if (mfl < 4) {
	    return kFALSE;
	} else {
	    return kTRUE;
	} 
    } // produced by generator ?
} 

Bool_t AliStack::IsSecondaryFromWeakDecay(Int_t index) {

  // If a particle is not a physical primary, check if it comes from weak decay

  TParticle* particle = Particle(index);
  Int_t uniqueID = particle->GetUniqueID();

  if(IsPhysicalPrimary(index)) return kFALSE;

  Int_t mfl = 0;
  Int_t indexMoth = particle->GetFirstMother();
  if(indexMoth < 0) return kFALSE; // if index mother < 0 and not a physical primary, is a non-stable product or one of the beams
  TParticle* moth = Particle(indexMoth);
  Float_t codemoth = (Float_t)TMath::Abs(moth->GetPdgCode());
  // mass of the flavour
  mfl = Int_t (codemoth / TMath::Power(10, Int_t(TMath::Log10(codemoth))));
  
  if(mfl == 3 && uniqueID == kPDecay) return kTRUE;// The first mother is strange and it's a decay
  if(codemoth == 211 && uniqueID == kPDecay) return kTRUE;// pion+- decay products
  if(codemoth == 13 && uniqueID == kPDecay) return kTRUE;// muon decay products

  

  return kFALSE;
  
}
Bool_t AliStack::IsSecondaryFromMaterial(Int_t index) {

  // If a particle is not a physical primary, check if it comes from material

  if(IsPhysicalPrimary(index)) return kFALSE;
  if(IsSecondaryFromWeakDecay(index)) return kFALSE;
  TParticle* particle = Particle(index);
  Int_t indexMoth = particle->GetFirstMother();
  if(indexMoth < 0) return kFALSE; // if index mother < 0 and not a physical primary, is a non-stable product or one of the beams
  return kTRUE;

}
 AliStack.cxx:1
 AliStack.cxx:2
 AliStack.cxx:3
 AliStack.cxx:4
 AliStack.cxx:5
 AliStack.cxx:6
 AliStack.cxx:7
 AliStack.cxx:8
 AliStack.cxx:9
 AliStack.cxx:10
 AliStack.cxx:11
 AliStack.cxx:12
 AliStack.cxx:13
 AliStack.cxx:14
 AliStack.cxx:15
 AliStack.cxx:16
 AliStack.cxx:17
 AliStack.cxx:18
 AliStack.cxx:19
 AliStack.cxx:20
 AliStack.cxx:21
 AliStack.cxx:22
 AliStack.cxx:23
 AliStack.cxx:24
 AliStack.cxx:25
 AliStack.cxx:26
 AliStack.cxx:27
 AliStack.cxx:28
 AliStack.cxx:29
 AliStack.cxx:30
 AliStack.cxx:31
 AliStack.cxx:32
 AliStack.cxx:33
 AliStack.cxx:34
 AliStack.cxx:35
 AliStack.cxx:36
 AliStack.cxx:37
 AliStack.cxx:38
 AliStack.cxx:39
 AliStack.cxx:40
 AliStack.cxx:41
 AliStack.cxx:42
 AliStack.cxx:43
 AliStack.cxx:44
 AliStack.cxx:45
 AliStack.cxx:46
 AliStack.cxx:47
 AliStack.cxx:48
 AliStack.cxx:49
 AliStack.cxx:50
 AliStack.cxx:51
 AliStack.cxx:52
 AliStack.cxx:53
 AliStack.cxx:54
 AliStack.cxx:55
 AliStack.cxx:56
 AliStack.cxx:57
 AliStack.cxx:58
 AliStack.cxx:59
 AliStack.cxx:60
 AliStack.cxx:61
 AliStack.cxx:62
 AliStack.cxx:63
 AliStack.cxx:64
 AliStack.cxx:65
 AliStack.cxx:66
 AliStack.cxx:67
 AliStack.cxx:68
 AliStack.cxx:69
 AliStack.cxx:70
 AliStack.cxx:71
 AliStack.cxx:72
 AliStack.cxx:73
 AliStack.cxx:74
 AliStack.cxx:75
 AliStack.cxx:76
 AliStack.cxx:77
 AliStack.cxx:78
 AliStack.cxx:79
 AliStack.cxx:80
 AliStack.cxx:81
 AliStack.cxx:82
 AliStack.cxx:83
 AliStack.cxx:84
 AliStack.cxx:85
 AliStack.cxx:86
 AliStack.cxx:87
 AliStack.cxx:88
 AliStack.cxx:89
 AliStack.cxx:90
 AliStack.cxx:91
 AliStack.cxx:92
 AliStack.cxx:93
 AliStack.cxx:94
 AliStack.cxx:95
 AliStack.cxx:96
 AliStack.cxx:97
 AliStack.cxx:98
 AliStack.cxx:99
 AliStack.cxx:100
 AliStack.cxx:101
 AliStack.cxx:102
 AliStack.cxx:103
 AliStack.cxx:104
 AliStack.cxx:105
 AliStack.cxx:106
 AliStack.cxx:107
 AliStack.cxx:108
 AliStack.cxx:109
 AliStack.cxx:110
 AliStack.cxx:111
 AliStack.cxx:112
 AliStack.cxx:113
 AliStack.cxx:114
 AliStack.cxx:115
 AliStack.cxx:116
 AliStack.cxx:117
 AliStack.cxx:118
 AliStack.cxx:119
 AliStack.cxx:120
 AliStack.cxx:121
 AliStack.cxx:122
 AliStack.cxx:123
 AliStack.cxx:124
 AliStack.cxx:125
 AliStack.cxx:126
 AliStack.cxx:127
 AliStack.cxx:128
 AliStack.cxx:129
 AliStack.cxx:130
 AliStack.cxx:131
 AliStack.cxx:132
 AliStack.cxx:133
 AliStack.cxx:134
 AliStack.cxx:135
 AliStack.cxx:136
 AliStack.cxx:137
 AliStack.cxx:138
 AliStack.cxx:139
 AliStack.cxx:140
 AliStack.cxx:141
 AliStack.cxx:142
 AliStack.cxx:143
 AliStack.cxx:144
 AliStack.cxx:145
 AliStack.cxx:146
 AliStack.cxx:147
 AliStack.cxx:148
 AliStack.cxx:149
 AliStack.cxx:150
 AliStack.cxx:151
 AliStack.cxx:152
 AliStack.cxx:153
 AliStack.cxx:154
 AliStack.cxx:155
 AliStack.cxx:156
 AliStack.cxx:157
 AliStack.cxx:158
 AliStack.cxx:159
 AliStack.cxx:160
 AliStack.cxx:161
 AliStack.cxx:162
 AliStack.cxx:163
 AliStack.cxx:164
 AliStack.cxx:165
 AliStack.cxx:166
 AliStack.cxx:167
 AliStack.cxx:168
 AliStack.cxx:169
 AliStack.cxx:170
 AliStack.cxx:171
 AliStack.cxx:172
 AliStack.cxx:173
 AliStack.cxx:174
 AliStack.cxx:175
 AliStack.cxx:176
 AliStack.cxx:177
 AliStack.cxx:178
 AliStack.cxx:179
 AliStack.cxx:180
 AliStack.cxx:181
 AliStack.cxx:182
 AliStack.cxx:183
 AliStack.cxx:184
 AliStack.cxx:185
 AliStack.cxx:186
 AliStack.cxx:187
 AliStack.cxx:188
 AliStack.cxx:189
 AliStack.cxx:190
 AliStack.cxx:191
 AliStack.cxx:192
 AliStack.cxx:193
 AliStack.cxx:194
 AliStack.cxx:195
 AliStack.cxx:196
 AliStack.cxx:197
 AliStack.cxx:198
 AliStack.cxx:199
 AliStack.cxx:200
 AliStack.cxx:201
 AliStack.cxx:202
 AliStack.cxx:203
 AliStack.cxx:204
 AliStack.cxx:205
 AliStack.cxx:206
 AliStack.cxx:207
 AliStack.cxx:208
 AliStack.cxx:209
 AliStack.cxx:210
 AliStack.cxx:211
 AliStack.cxx:212
 AliStack.cxx:213
 AliStack.cxx:214
 AliStack.cxx:215
 AliStack.cxx:216
 AliStack.cxx:217
 AliStack.cxx:218
 AliStack.cxx:219
 AliStack.cxx:220
 AliStack.cxx:221
 AliStack.cxx:222
 AliStack.cxx:223
 AliStack.cxx:224
 AliStack.cxx:225
 AliStack.cxx:226
 AliStack.cxx:227
 AliStack.cxx:228
 AliStack.cxx:229
 AliStack.cxx:230
 AliStack.cxx:231
 AliStack.cxx:232
 AliStack.cxx:233
 AliStack.cxx:234
 AliStack.cxx:235
 AliStack.cxx:236
 AliStack.cxx:237
 AliStack.cxx:238
 AliStack.cxx:239
 AliStack.cxx:240
 AliStack.cxx:241
 AliStack.cxx:242
 AliStack.cxx:243
 AliStack.cxx:244
 AliStack.cxx:245
 AliStack.cxx:246
 AliStack.cxx:247
 AliStack.cxx:248
 AliStack.cxx:249
 AliStack.cxx:250
 AliStack.cxx:251
 AliStack.cxx:252
 AliStack.cxx:253
 AliStack.cxx:254
 AliStack.cxx:255
 AliStack.cxx:256
 AliStack.cxx:257
 AliStack.cxx:258
 AliStack.cxx:259
 AliStack.cxx:260
 AliStack.cxx:261
 AliStack.cxx:262
 AliStack.cxx:263
 AliStack.cxx:264
 AliStack.cxx:265
 AliStack.cxx:266
 AliStack.cxx:267
 AliStack.cxx:268
 AliStack.cxx:269
 AliStack.cxx:270
 AliStack.cxx:271
 AliStack.cxx:272
 AliStack.cxx:273
 AliStack.cxx:274
 AliStack.cxx:275
 AliStack.cxx:276
 AliStack.cxx:277
 AliStack.cxx:278
 AliStack.cxx:279
 AliStack.cxx:280
 AliStack.cxx:281
 AliStack.cxx:282
 AliStack.cxx:283
 AliStack.cxx:284
 AliStack.cxx:285
 AliStack.cxx:286
 AliStack.cxx:287
 AliStack.cxx:288
 AliStack.cxx:289
 AliStack.cxx:290
 AliStack.cxx:291
 AliStack.cxx:292
 AliStack.cxx:293
 AliStack.cxx:294
 AliStack.cxx:295
 AliStack.cxx:296
 AliStack.cxx:297
 AliStack.cxx:298
 AliStack.cxx:299
 AliStack.cxx:300
 AliStack.cxx:301
 AliStack.cxx:302
 AliStack.cxx:303
 AliStack.cxx:304
 AliStack.cxx:305
 AliStack.cxx:306
 AliStack.cxx:307
 AliStack.cxx:308
 AliStack.cxx:309
 AliStack.cxx:310
 AliStack.cxx:311
 AliStack.cxx:312
 AliStack.cxx:313
 AliStack.cxx:314
 AliStack.cxx:315
 AliStack.cxx:316
 AliStack.cxx:317
 AliStack.cxx:318
 AliStack.cxx:319
 AliStack.cxx:320
 AliStack.cxx:321
 AliStack.cxx:322
 AliStack.cxx:323
 AliStack.cxx:324
 AliStack.cxx:325
 AliStack.cxx:326
 AliStack.cxx:327
 AliStack.cxx:328
 AliStack.cxx:329
 AliStack.cxx:330
 AliStack.cxx:331
 AliStack.cxx:332
 AliStack.cxx:333
 AliStack.cxx:334
 AliStack.cxx:335
 AliStack.cxx:336
 AliStack.cxx:337
 AliStack.cxx:338
 AliStack.cxx:339
 AliStack.cxx:340
 AliStack.cxx:341
 AliStack.cxx:342
 AliStack.cxx:343
 AliStack.cxx:344
 AliStack.cxx:345
 AliStack.cxx:346
 AliStack.cxx:347
 AliStack.cxx:348
 AliStack.cxx:349
 AliStack.cxx:350
 AliStack.cxx:351
 AliStack.cxx:352
 AliStack.cxx:353
 AliStack.cxx:354
 AliStack.cxx:355
 AliStack.cxx:356
 AliStack.cxx:357
 AliStack.cxx:358
 AliStack.cxx:359
 AliStack.cxx:360
 AliStack.cxx:361
 AliStack.cxx:362
 AliStack.cxx:363
 AliStack.cxx:364
 AliStack.cxx:365
 AliStack.cxx:366
 AliStack.cxx:367
 AliStack.cxx:368
 AliStack.cxx:369
 AliStack.cxx:370
 AliStack.cxx:371
 AliStack.cxx:372
 AliStack.cxx:373
 AliStack.cxx:374
 AliStack.cxx:375
 AliStack.cxx:376
 AliStack.cxx:377
 AliStack.cxx:378
 AliStack.cxx:379
 AliStack.cxx:380
 AliStack.cxx:381
 AliStack.cxx:382
 AliStack.cxx:383
 AliStack.cxx:384
 AliStack.cxx:385
 AliStack.cxx:386
 AliStack.cxx:387
 AliStack.cxx:388
 AliStack.cxx:389
 AliStack.cxx:390
 AliStack.cxx:391
 AliStack.cxx:392
 AliStack.cxx:393
 AliStack.cxx:394
 AliStack.cxx:395
 AliStack.cxx:396
 AliStack.cxx:397
 AliStack.cxx:398
 AliStack.cxx:399
 AliStack.cxx:400
 AliStack.cxx:401
 AliStack.cxx:402
 AliStack.cxx:403
 AliStack.cxx:404
 AliStack.cxx:405
 AliStack.cxx:406
 AliStack.cxx:407
 AliStack.cxx:408
 AliStack.cxx:409
 AliStack.cxx:410
 AliStack.cxx:411
 AliStack.cxx:412
 AliStack.cxx:413
 AliStack.cxx:414
 AliStack.cxx:415
 AliStack.cxx:416
 AliStack.cxx:417
 AliStack.cxx:418
 AliStack.cxx:419
 AliStack.cxx:420
 AliStack.cxx:421
 AliStack.cxx:422
 AliStack.cxx:423
 AliStack.cxx:424
 AliStack.cxx:425
 AliStack.cxx:426
 AliStack.cxx:427
 AliStack.cxx:428
 AliStack.cxx:429
 AliStack.cxx:430
 AliStack.cxx:431
 AliStack.cxx:432
 AliStack.cxx:433
 AliStack.cxx:434
 AliStack.cxx:435
 AliStack.cxx:436
 AliStack.cxx:437
 AliStack.cxx:438
 AliStack.cxx:439
 AliStack.cxx:440
 AliStack.cxx:441
 AliStack.cxx:442
 AliStack.cxx:443
 AliStack.cxx:444
 AliStack.cxx:445
 AliStack.cxx:446
 AliStack.cxx:447
 AliStack.cxx:448
 AliStack.cxx:449
 AliStack.cxx:450
 AliStack.cxx:451
 AliStack.cxx:452
 AliStack.cxx:453
 AliStack.cxx:454
 AliStack.cxx:455
 AliStack.cxx:456
 AliStack.cxx:457
 AliStack.cxx:458
 AliStack.cxx:459
 AliStack.cxx:460
 AliStack.cxx:461
 AliStack.cxx:462
 AliStack.cxx:463
 AliStack.cxx:464
 AliStack.cxx:465
 AliStack.cxx:466
 AliStack.cxx:467
 AliStack.cxx:468
 AliStack.cxx:469
 AliStack.cxx:470
 AliStack.cxx:471
 AliStack.cxx:472
 AliStack.cxx:473
 AliStack.cxx:474
 AliStack.cxx:475
 AliStack.cxx:476
 AliStack.cxx:477
 AliStack.cxx:478
 AliStack.cxx:479
 AliStack.cxx:480
 AliStack.cxx:481
 AliStack.cxx:482
 AliStack.cxx:483
 AliStack.cxx:484
 AliStack.cxx:485
 AliStack.cxx:486
 AliStack.cxx:487
 AliStack.cxx:488
 AliStack.cxx:489
 AliStack.cxx:490
 AliStack.cxx:491
 AliStack.cxx:492
 AliStack.cxx:493
 AliStack.cxx:494
 AliStack.cxx:495
 AliStack.cxx:496
 AliStack.cxx:497
 AliStack.cxx:498
 AliStack.cxx:499
 AliStack.cxx:500
 AliStack.cxx:501
 AliStack.cxx:502
 AliStack.cxx:503
 AliStack.cxx:504
 AliStack.cxx:505
 AliStack.cxx:506
 AliStack.cxx:507
 AliStack.cxx:508
 AliStack.cxx:509
 AliStack.cxx:510
 AliStack.cxx:511
 AliStack.cxx:512
 AliStack.cxx:513
 AliStack.cxx:514
 AliStack.cxx:515
 AliStack.cxx:516
 AliStack.cxx:517
 AliStack.cxx:518
 AliStack.cxx:519
 AliStack.cxx:520
 AliStack.cxx:521
 AliStack.cxx:522
 AliStack.cxx:523
 AliStack.cxx:524
 AliStack.cxx:525
 AliStack.cxx:526
 AliStack.cxx:527
 AliStack.cxx:528
 AliStack.cxx:529
 AliStack.cxx:530
 AliStack.cxx:531
 AliStack.cxx:532
 AliStack.cxx:533
 AliStack.cxx:534
 AliStack.cxx:535
 AliStack.cxx:536
 AliStack.cxx:537
 AliStack.cxx:538
 AliStack.cxx:539
 AliStack.cxx:540
 AliStack.cxx:541
 AliStack.cxx:542
 AliStack.cxx:543
 AliStack.cxx:544
 AliStack.cxx:545
 AliStack.cxx:546
 AliStack.cxx:547
 AliStack.cxx:548
 AliStack.cxx:549
 AliStack.cxx:550
 AliStack.cxx:551
 AliStack.cxx:552
 AliStack.cxx:553
 AliStack.cxx:554
 AliStack.cxx:555
 AliStack.cxx:556
 AliStack.cxx:557
 AliStack.cxx:558
 AliStack.cxx:559
 AliStack.cxx:560
 AliStack.cxx:561
 AliStack.cxx:562
 AliStack.cxx:563
 AliStack.cxx:564
 AliStack.cxx:565
 AliStack.cxx:566
 AliStack.cxx:567
 AliStack.cxx:568
 AliStack.cxx:569
 AliStack.cxx:570
 AliStack.cxx:571
 AliStack.cxx:572
 AliStack.cxx:573
 AliStack.cxx:574
 AliStack.cxx:575
 AliStack.cxx:576
 AliStack.cxx:577
 AliStack.cxx:578
 AliStack.cxx:579
 AliStack.cxx:580
 AliStack.cxx:581
 AliStack.cxx:582
 AliStack.cxx:583
 AliStack.cxx:584
 AliStack.cxx:585
 AliStack.cxx:586
 AliStack.cxx:587
 AliStack.cxx:588
 AliStack.cxx:589
 AliStack.cxx:590
 AliStack.cxx:591
 AliStack.cxx:592
 AliStack.cxx:593
 AliStack.cxx:594
 AliStack.cxx:595
 AliStack.cxx:596
 AliStack.cxx:597
 AliStack.cxx:598
 AliStack.cxx:599
 AliStack.cxx:600
 AliStack.cxx:601
 AliStack.cxx:602
 AliStack.cxx:603
 AliStack.cxx:604
 AliStack.cxx:605
 AliStack.cxx:606
 AliStack.cxx:607
 AliStack.cxx:608
 AliStack.cxx:609
 AliStack.cxx:610
 AliStack.cxx:611
 AliStack.cxx:612
 AliStack.cxx:613
 AliStack.cxx:614
 AliStack.cxx:615
 AliStack.cxx:616
 AliStack.cxx:617
 AliStack.cxx:618
 AliStack.cxx:619
 AliStack.cxx:620
 AliStack.cxx:621
 AliStack.cxx:622
 AliStack.cxx:623
 AliStack.cxx:624
 AliStack.cxx:625
 AliStack.cxx:626
 AliStack.cxx:627
 AliStack.cxx:628
 AliStack.cxx:629
 AliStack.cxx:630
 AliStack.cxx:631
 AliStack.cxx:632
 AliStack.cxx:633
 AliStack.cxx:634
 AliStack.cxx:635
 AliStack.cxx:636
 AliStack.cxx:637
 AliStack.cxx:638
 AliStack.cxx:639
 AliStack.cxx:640
 AliStack.cxx:641
 AliStack.cxx:642
 AliStack.cxx:643
 AliStack.cxx:644
 AliStack.cxx:645
 AliStack.cxx:646
 AliStack.cxx:647
 AliStack.cxx:648
 AliStack.cxx:649
 AliStack.cxx:650
 AliStack.cxx:651
 AliStack.cxx:652
 AliStack.cxx:653
 AliStack.cxx:654
 AliStack.cxx:655
 AliStack.cxx:656
 AliStack.cxx:657
 AliStack.cxx:658
 AliStack.cxx:659
 AliStack.cxx:660
 AliStack.cxx:661
 AliStack.cxx:662
 AliStack.cxx:663
 AliStack.cxx:664
 AliStack.cxx:665
 AliStack.cxx:666
 AliStack.cxx:667
 AliStack.cxx:668
 AliStack.cxx:669
 AliStack.cxx:670
 AliStack.cxx:671
 AliStack.cxx:672
 AliStack.cxx:673
 AliStack.cxx:674
 AliStack.cxx:675
 AliStack.cxx:676
 AliStack.cxx:677
 AliStack.cxx:678
 AliStack.cxx:679
 AliStack.cxx:680
 AliStack.cxx:681
 AliStack.cxx:682
 AliStack.cxx:683
 AliStack.cxx:684
 AliStack.cxx:685
 AliStack.cxx:686
 AliStack.cxx:687
 AliStack.cxx:688
 AliStack.cxx:689
 AliStack.cxx:690
 AliStack.cxx:691
 AliStack.cxx:692
 AliStack.cxx:693
 AliStack.cxx:694
 AliStack.cxx:695
 AliStack.cxx:696
 AliStack.cxx:697
 AliStack.cxx:698
 AliStack.cxx:699
 AliStack.cxx:700
 AliStack.cxx:701
 AliStack.cxx:702
 AliStack.cxx:703
 AliStack.cxx:704
 AliStack.cxx:705
 AliStack.cxx:706
 AliStack.cxx:707
 AliStack.cxx:708
 AliStack.cxx:709
 AliStack.cxx:710
 AliStack.cxx:711
 AliStack.cxx:712
 AliStack.cxx:713
 AliStack.cxx:714
 AliStack.cxx:715
 AliStack.cxx:716
 AliStack.cxx:717
 AliStack.cxx:718
 AliStack.cxx:719
 AliStack.cxx:720
 AliStack.cxx:721
 AliStack.cxx:722
 AliStack.cxx:723
 AliStack.cxx:724
 AliStack.cxx:725
 AliStack.cxx:726
 AliStack.cxx:727
 AliStack.cxx:728
 AliStack.cxx:729
 AliStack.cxx:730
 AliStack.cxx:731
 AliStack.cxx:732
 AliStack.cxx:733
 AliStack.cxx:734
 AliStack.cxx:735
 AliStack.cxx:736
 AliStack.cxx:737
 AliStack.cxx:738
 AliStack.cxx:739
 AliStack.cxx:740
 AliStack.cxx:741
 AliStack.cxx:742
 AliStack.cxx:743
 AliStack.cxx:744
 AliStack.cxx:745
 AliStack.cxx:746
 AliStack.cxx:747
 AliStack.cxx:748
 AliStack.cxx:749
 AliStack.cxx:750
 AliStack.cxx:751
 AliStack.cxx:752
 AliStack.cxx:753
 AliStack.cxx:754
 AliStack.cxx:755
 AliStack.cxx:756
 AliStack.cxx:757
 AliStack.cxx:758
 AliStack.cxx:759
 AliStack.cxx:760
 AliStack.cxx:761
 AliStack.cxx:762
 AliStack.cxx:763
 AliStack.cxx:764
 AliStack.cxx:765
 AliStack.cxx:766
 AliStack.cxx:767
 AliStack.cxx:768
 AliStack.cxx:769
 AliStack.cxx:770
 AliStack.cxx:771
 AliStack.cxx:772
 AliStack.cxx:773
 AliStack.cxx:774
 AliStack.cxx:775
 AliStack.cxx:776
 AliStack.cxx:777
 AliStack.cxx:778
 AliStack.cxx:779
 AliStack.cxx:780
 AliStack.cxx:781
 AliStack.cxx:782
 AliStack.cxx:783
 AliStack.cxx:784
 AliStack.cxx:785
 AliStack.cxx:786
 AliStack.cxx:787
 AliStack.cxx:788
 AliStack.cxx:789
 AliStack.cxx:790
 AliStack.cxx:791
 AliStack.cxx:792
 AliStack.cxx:793
 AliStack.cxx:794
 AliStack.cxx:795
 AliStack.cxx:796
 AliStack.cxx:797
 AliStack.cxx:798
 AliStack.cxx:799
 AliStack.cxx:800
 AliStack.cxx:801
 AliStack.cxx:802
 AliStack.cxx:803
 AliStack.cxx:804
 AliStack.cxx:805
 AliStack.cxx:806
 AliStack.cxx:807
 AliStack.cxx:808
 AliStack.cxx:809
 AliStack.cxx:810
 AliStack.cxx:811
 AliStack.cxx:812
 AliStack.cxx:813
 AliStack.cxx:814
 AliStack.cxx:815
 AliStack.cxx:816
 AliStack.cxx:817
 AliStack.cxx:818
 AliStack.cxx:819
 AliStack.cxx:820
 AliStack.cxx:821
 AliStack.cxx:822
 AliStack.cxx:823
 AliStack.cxx:824
 AliStack.cxx:825
 AliStack.cxx:826
 AliStack.cxx:827
 AliStack.cxx:828
 AliStack.cxx:829
 AliStack.cxx:830
 AliStack.cxx:831
 AliStack.cxx:832
 AliStack.cxx:833
 AliStack.cxx:834
 AliStack.cxx:835
 AliStack.cxx:836
 AliStack.cxx:837
 AliStack.cxx:838
 AliStack.cxx:839
 AliStack.cxx:840
 AliStack.cxx:841
 AliStack.cxx:842
 AliStack.cxx:843
 AliStack.cxx:844
 AliStack.cxx:845
 AliStack.cxx:846
 AliStack.cxx:847
 AliStack.cxx:848
 AliStack.cxx:849
 AliStack.cxx:850
 AliStack.cxx:851
 AliStack.cxx:852
 AliStack.cxx:853
 AliStack.cxx:854
 AliStack.cxx:855
 AliStack.cxx:856
 AliStack.cxx:857
 AliStack.cxx:858
 AliStack.cxx:859
 AliStack.cxx:860
 AliStack.cxx:861
 AliStack.cxx:862
 AliStack.cxx:863
 AliStack.cxx:864
 AliStack.cxx:865
 AliStack.cxx:866
 AliStack.cxx:867
 AliStack.cxx:868
 AliStack.cxx:869
 AliStack.cxx:870
 AliStack.cxx:871
 AliStack.cxx:872
 AliStack.cxx:873
 AliStack.cxx:874
 AliStack.cxx:875
 AliStack.cxx:876
 AliStack.cxx:877
 AliStack.cxx:878
 AliStack.cxx:879
 AliStack.cxx:880
 AliStack.cxx:881
 AliStack.cxx:882
 AliStack.cxx:883
 AliStack.cxx:884
 AliStack.cxx:885
 AliStack.cxx:886
 AliStack.cxx:887
 AliStack.cxx:888
 AliStack.cxx:889
 AliStack.cxx:890
 AliStack.cxx:891
 AliStack.cxx:892
 AliStack.cxx:893
 AliStack.cxx:894
 AliStack.cxx:895
 AliStack.cxx:896
 AliStack.cxx:897
 AliStack.cxx:898
 AliStack.cxx:899
 AliStack.cxx:900
 AliStack.cxx:901
 AliStack.cxx:902
 AliStack.cxx:903
 AliStack.cxx:904
 AliStack.cxx:905
 AliStack.cxx:906
 AliStack.cxx:907
 AliStack.cxx:908
 AliStack.cxx:909
 AliStack.cxx:910
 AliStack.cxx:911
 AliStack.cxx:912
 AliStack.cxx:913
 AliStack.cxx:914
 AliStack.cxx:915
 AliStack.cxx:916
 AliStack.cxx:917
 AliStack.cxx:918
 AliStack.cxx:919
 AliStack.cxx:920
 AliStack.cxx:921
 AliStack.cxx:922
 AliStack.cxx:923
 AliStack.cxx:924
 AliStack.cxx:925
 AliStack.cxx:926
 AliStack.cxx:927
 AliStack.cxx:928
 AliStack.cxx:929
 AliStack.cxx:930
 AliStack.cxx:931
 AliStack.cxx:932
 AliStack.cxx:933
 AliStack.cxx:934
 AliStack.cxx:935
 AliStack.cxx:936
 AliStack.cxx:937
 AliStack.cxx:938
 AliStack.cxx:939
 AliStack.cxx:940
 AliStack.cxx:941
 AliStack.cxx:942
 AliStack.cxx:943
 AliStack.cxx:944
 AliStack.cxx:945
 AliStack.cxx:946
 AliStack.cxx:947
 AliStack.cxx:948
 AliStack.cxx:949
 AliStack.cxx:950
 AliStack.cxx:951
 AliStack.cxx:952
 AliStack.cxx:953
 AliStack.cxx:954
 AliStack.cxx:955
 AliStack.cxx:956
 AliStack.cxx:957
 AliStack.cxx:958
 AliStack.cxx:959
 AliStack.cxx:960
 AliStack.cxx:961
 AliStack.cxx:962
 AliStack.cxx:963
 AliStack.cxx:964
 AliStack.cxx:965
 AliStack.cxx:966
 AliStack.cxx:967
 AliStack.cxx:968
 AliStack.cxx:969
 AliStack.cxx:970
 AliStack.cxx:971
 AliStack.cxx:972
 AliStack.cxx:973
 AliStack.cxx:974
 AliStack.cxx:975
 AliStack.cxx:976
 AliStack.cxx:977
 AliStack.cxx:978
 AliStack.cxx:979
 AliStack.cxx:980
 AliStack.cxx:981
 AliStack.cxx:982
 AliStack.cxx:983
 AliStack.cxx:984
 AliStack.cxx:985
 AliStack.cxx:986
 AliStack.cxx:987
 AliStack.cxx:988
 AliStack.cxx:989
 AliStack.cxx:990
 AliStack.cxx:991
 AliStack.cxx:992
 AliStack.cxx:993
 AliStack.cxx:994
 AliStack.cxx:995
 AliStack.cxx:996
 AliStack.cxx:997
 AliStack.cxx:998
 AliStack.cxx:999
 AliStack.cxx:1000
 AliStack.cxx:1001
 AliStack.cxx:1002
 AliStack.cxx:1003
 AliStack.cxx:1004
 AliStack.cxx:1005
 AliStack.cxx:1006
 AliStack.cxx:1007
 AliStack.cxx:1008
 AliStack.cxx:1009
 AliStack.cxx:1010
 AliStack.cxx:1011
 AliStack.cxx:1012
 AliStack.cxx:1013
 AliStack.cxx:1014
 AliStack.cxx:1015
 AliStack.cxx:1016
 AliStack.cxx:1017
 AliStack.cxx:1018
 AliStack.cxx:1019
 AliStack.cxx:1020
 AliStack.cxx:1021
 AliStack.cxx:1022
 AliStack.cxx:1023
 AliStack.cxx:1024
 AliStack.cxx:1025
 AliStack.cxx:1026
 AliStack.cxx:1027
 AliStack.cxx:1028
 AliStack.cxx:1029
 AliStack.cxx:1030
 AliStack.cxx:1031
 AliStack.cxx:1032
 AliStack.cxx:1033
 AliStack.cxx:1034
 AliStack.cxx:1035
 AliStack.cxx:1036
 AliStack.cxx:1037
 AliStack.cxx:1038
 AliStack.cxx:1039
 AliStack.cxx:1040
 AliStack.cxx:1041
 AliStack.cxx:1042
 AliStack.cxx:1043
 AliStack.cxx:1044
 AliStack.cxx:1045
 AliStack.cxx:1046
 AliStack.cxx:1047
 AliStack.cxx:1048
 AliStack.cxx:1049
 AliStack.cxx:1050
 AliStack.cxx:1051
 AliStack.cxx:1052
 AliStack.cxx:1053
 AliStack.cxx:1054
 AliStack.cxx:1055
 AliStack.cxx:1056
 AliStack.cxx:1057
 AliStack.cxx:1058
 AliStack.cxx:1059
 AliStack.cxx:1060
 AliStack.cxx:1061
 AliStack.cxx:1062
 AliStack.cxx:1063
 AliStack.cxx:1064
 AliStack.cxx:1065
 AliStack.cxx:1066
 AliStack.cxx:1067
 AliStack.cxx:1068
 AliStack.cxx:1069
 AliStack.cxx:1070
 AliStack.cxx:1071
 AliStack.cxx:1072
 AliStack.cxx:1073
 AliStack.cxx:1074
 AliStack.cxx:1075
 AliStack.cxx:1076
 AliStack.cxx:1077
 AliStack.cxx:1078
 AliStack.cxx:1079
 AliStack.cxx:1080
 AliStack.cxx:1081
 AliStack.cxx:1082
 AliStack.cxx:1083
 AliStack.cxx:1084
 AliStack.cxx:1085
 AliStack.cxx:1086
 AliStack.cxx:1087
 AliStack.cxx:1088
 AliStack.cxx:1089
 AliStack.cxx:1090
 AliStack.cxx:1091
 AliStack.cxx:1092
 AliStack.cxx:1093
 AliStack.cxx:1094
 AliStack.cxx:1095
 AliStack.cxx:1096
 AliStack.cxx:1097
 AliStack.cxx:1098
 AliStack.cxx:1099
 AliStack.cxx:1100
 AliStack.cxx:1101
 AliStack.cxx:1102
 AliStack.cxx:1103
 AliStack.cxx:1104
 AliStack.cxx:1105
 AliStack.cxx:1106
 AliStack.cxx:1107
 AliStack.cxx:1108
 AliStack.cxx:1109
 AliStack.cxx:1110
 AliStack.cxx:1111
 AliStack.cxx:1112
 AliStack.cxx:1113
 AliStack.cxx:1114