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

////////////////////////////////////////////////////////////////////////////////
//
//  This class works as generic interface to an event.
//  Its main purpose is to provide a unique reference which includes all the
//  facilities available in the AliVEvent generic base class, plus all info
//  which could be needed during analysis, which are not in AliVEvent but
//  need to be accessed from ESD or AOD objects, usually in different ways.
//  When MC is available, it is properly taken into account.
//
//  authors: A. Pulvirenti (alberto.pulvirenti@ct.infn.it)
//           M. Vala (martin.vala@cern.ch)
//
////////////////////////////////////////////////////////////////////////////////

#include <Riostream.h>
#include <TArrayF.h>

#include "AliGenEventHeader.h"

#include "AliRsnCutSet.h"
#include "AliRsnEvent.h"

ClassImp(AliRsnEvent)

//_____________________________________________________________________________
AliRsnEvent::AliRsnEvent(AliVEvent *ref, AliVEvent *refMC) :
   fRef(ref),
   fRefMC(refMC),
   fLeading(-1),
   fPID(0x0),
   fAODList(0x0)
{
//
// Default constructor.
//
}

//_____________________________________________________________________________
AliRsnEvent::AliRsnEvent(const AliRsnEvent &event) :
   TObject(event),
   fRef(event.fRef),
   fRefMC(event.fRefMC),
   fLeading(event.fLeading),
   fPID(event.fPID),
   fAODList(event.fAODList)
{
//
// Copy constructor.
//
}

//_____________________________________________________________________________
AliRsnEvent &AliRsnEvent::operator= (const AliRsnEvent &event)
{
//
// Works in the same way as the copy constructor.
//

   TObject::operator=(event);
   if (this == &event)
      return *this;
   fRef             = event.fRef;
   fRefMC           = event.fRefMC;
   fLeading         = event.fLeading;
   fPID             = event.fPID;
   fAODList         = event.fAODList;

   return (*this);
}

//_____________________________________________________________________________
AliRsnEvent::~AliRsnEvent()
{
//
// Destructor (does nothing since there are not owned pointers)
//
}

//_____________________________________________________________________________
void AliRsnEvent::SetDaughter(AliRsnDaughter &out, Int_t index, Bool_t fromMC)
{
//
// Assigns to the first argument the reference to the i-th track in the ref event.
// What assignment method to be used will depend on the index and on the type of input.
// If the last argument is kTRUE and an MC is referenced, then both fRef and fRefMC will
// point to the MC particle (pure MC analysis)
//

   // by default the daughter is reset
   // and assigned the used index
   out.Reset();
   out.SetRsnID(index);
   out.SetOwnerEvent(this);

   // check input type
   if (!InputOK()) return;
   Bool_t inputESD = IsESD();

   // if it is pure MC, the index tells what particle
   // to be read in the stack of MC particles, otherwise
   // it is converted into a real collection index
   if (fromMC) {
      out.SetLabel(index);
      Bool_t ok = (inputESD ? SetMCInfoESD(out) : SetMCInfoAOD(out));
      if (ok) {
         out.SetGood();
         out.SetRef(out.GetRefMC());
      }
   } else {
      Int_t trueIndex;
      AliRsnDaughter::ERefType type;
      if (!ConvertAbsoluteIndex(index, trueIndex, type)) {
         AliError(Form("Failed to convert absolute index %d", index));
         return;
      }
      switch (type) {
         case AliRsnDaughter::kTrack:
            if (inputESD) SetDaughterESDtrack(out, trueIndex); else SetDaughterAODtrack(out, trueIndex);
            break;
         case AliRsnDaughter::kV0:
            if (inputESD) SetDaughterESDv0(out, trueIndex); else SetDaughterAODv0(out, trueIndex);
            break;
         case AliRsnDaughter::kCascade:
            if (inputESD) SetDaughterESDcascade(out, trueIndex); else SetDaughterAODcascade(out, trueIndex);
            break;
         default:
            AliError("Unrecognized daughter type");
            return;
      }
   }
}

//_____________________________________________________________________________
AliRsnDaughter AliRsnEvent::GetDaughter(Int_t i, Bool_t fromMC)
{
//
// Returns a daughter set using same criteria as SetDaughter
//

   AliRsnDaughter d;
   SetDaughter(d, i, fromMC);
   return d;
}

//_____________________________________________________________________________
void AliRsnEvent::SetDaughterESDtrack(AliRsnDaughter &out, Int_t i)
{
//
// Setup the first argument to the track identified by the index.
// When available, adds the MC information and references.
// ---
// Version #1: ESD tracks
//

   AliESDEvent *esd = (AliESDEvent *)fRef;

   if (i >= 0 && i < esd->GetNumberOfTracks()) {
      AliESDtrack *track = esd->GetTrack(i);
      if (track) {
         out.SetRef(track);
         out.SetGood();
         // if MC is present, assign label and retrieve corresponding particle
         if (fRefMC) {
            out.SetLabel(TMath::Abs(track->GetLabel()));
            if (!SetMCInfoESD(out)) {
               AliWarning("Failed assignment of MC info");
            }
         }
      } else {
         AliWarning("Null track");
      }
   } else {
      AliWarning(Form("Overflow: required index = %d, max = %d", i, esd->GetNumberOfTracks()));
   }
}

//_____________________________________________________________________________
void AliRsnEvent::SetDaughterAODtrack(AliRsnDaughter &out, Int_t i)
{
//
// Setup the first argument to the track identified by the index.
// When available, adds the MC information and references.
// ---
// Version #2: AOD tracks
//

   AliAODEvent *aod = (AliAODEvent *)fRef;

   if (i >= 0 && i < aod->GetNumberOfTracks()) {
      AliAODTrack *track = dynamic_cast<AliAODTrack*>(aod->GetTrack(i));
      if(!track) AliFatal("Not a standard AOD");
      if (track) {
         out.SetRef(track);
         out.SetGood();
         // if MC is present, assign label and retrieve corresponding particle
         if (fRefMC) {
            out.SetLabel(TMath::Abs(track->GetLabel()));
            if (!SetMCInfoAOD(out)) {
               AliWarning("Failed assignment of MC info");
            }
         }
      } else {
         AliWarning("Null track");
      }
   } else {
      AliWarning(Form("Overflow: required index = %d, max = %d", i, aod->GetNumberOfTracks()));
   }
}

//_____________________________________________________________________________
void AliRsnEvent::SetDaughterESDv0(AliRsnDaughter &out, Int_t i)
{
//
// Setup the first argument to the track identified by the index.
// When available, adds the MC information and references.
// ---
// Version #3: ESD v0
//

   if (i >= 0 && i < fRef->GetNumberOfV0s()) {
      AliESDEvent *ev = GetRefESD();
      AliESDv0    *v0 = ev->GetV0(i);
      if (v0) {
         out.SetRef(v0);
         out.SetGood();
         // if MC is present, retrieve the label of V0 from those of daughters
         if (fRefMC) {
            AliMCEvent  *mc = (AliMCEvent *)fRefMC;
            AliESDtrack *tp = ev->GetTrack(v0->GetPindex());
            AliESDtrack *tn = ev->GetTrack(v0->GetNindex());
            if (mc && tp && tn) {
               Int_t lp = TMath::Abs(tp->GetLabel());
               Int_t ln = TMath::Abs(tn->GetLabel());
               TParticle *pp = mc->Stack()->Particle(lp);
               TParticle *pn = mc->Stack()->Particle(ln);
               if (pp && pn) {
                  // if their first mothers are the same, the V0 is true
                  // otherwise label remains '-1' --> fake V0
                  if (pp->GetFirstMother() == pn->GetFirstMother() && pp->GetFirstMother() >= 0) {
                     out.SetLabel(pp->GetFirstMother());
                     //patch for k0s/k0l
                     TParticle *mom = mc->Stack()->Particle(pn->GetFirstMother());
                     if(mom->GetPdgCode() == 310) {
                        //take the mother of the k0s which is a k0 (311)
                        out.SetLabel(mom->GetFirstMother());
                     }
                     SetMCInfoESD(out);
                  }
               }
            }
         }
      }
   }
}

//_____________________________________________________________________________
void AliRsnEvent::SetDaughterAODv0(AliRsnDaughter &out, Int_t i)
{
//
// Setup the first argument to the track identified by the index.
// When available, adds the MC information and references.
// ---
// Version #4: AOD v0
//

   if (i >= 0 && i < fRef->GetNumberOfV0s()) {
      AliAODEvent *ev = (AliAODEvent *)fRef;
      AliAODv0    *v0 = ev->GetV0(i);
      if (v0) {
         out.SetRef(v0);
         out.SetGood();
         if (fRefMC) {
            AliAODEvent  *mc = (AliAODEvent *)fRefMC;
            TClonesArray *mcArray = (TClonesArray *)mc->GetList()->FindObject(AliAODMCParticle::StdBranchName());
            AliAODTrack  *tp  = (AliAODTrack *)v0->GetDaughter(0);
            AliAODTrack  *tn  = (AliAODTrack *)v0->GetDaughter(1);
            if (mcArray && tp && tn) {
               Int_t lp = TMath::Abs(tp->GetLabel());
               Int_t ln = TMath::Abs(tn->GetLabel());
               AliAODMCParticle *pp = (AliAODMCParticle *)mcArray->At(lp);
               AliAODMCParticle *pn = (AliAODMCParticle *)mcArray->At(ln);
               if (pp && pn) {
                  // if their first mothers are the same, the V0 is true
                  // otherwise label remains '-1' --> fake V0
                  if (pp->GetMother() == pn->GetMother() && pp->GetMother() >= 0) {
                     out.SetLabel(pp->GetMother());
                     SetMCInfoAOD(out);
                  }
               }
            }
         }
      }
   }
}

//_____________________________________________________________________________
void AliRsnEvent::SetDaughterESDcascade(AliRsnDaughter &out, Int_t i)
{
//
// Setup the first argument to the track identified by the index.
// When available, adds the MC information and references.
// ---
// Version #3: ESD cascade
//

   if (i >= 0 && i < fRef->GetNumberOfCascades()) {
      AliESDEvent   *ev   = GetRefESD();
      AliESDcascade *casc = ev->GetCascade(i);
      if (casc) {
         out.SetRef(casc);
         out.SetGood();
         if (fRefMC) {

         }
      }
   }
}

//_____________________________________________________________________________
void AliRsnEvent::SetDaughterAODcascade(AliRsnDaughter &out, Int_t i)
{
//
// Setup the first argument to the track identified by the index.
// When available, adds the MC information and references.
// ---
// Version #4: AOD cascade
//

   if (i >= 0 && i < fRef->GetNumberOfCascades()) {
      AliAODEvent *ev = GetRefAOD();
      AliAODv0    *casc = ev->GetCascade(i);
      if (casc) {
         out.SetRef(casc);
         out.SetGood();
         if (fRefMC) {

         }
      }
   }
}

//_____________________________________________________________________________
Bool_t AliRsnEvent::SetMCInfoESD(AliRsnDaughter &out)
{
//
// Using the label assigned to the daughter, searches for the MC informations:
// -- MC reference
// -- mother
//

   // if label makes no sense --> failed
   Int_t label = out.GetLabel();
   if (label < 0 || !fRefMC) return kFALSE;

   // get number of particles
   Int_t nMC = fRefMC->GetNumberOfTracks();

   // if label too large --> failed
   if (label >= nMC) {
     AliDebug(4, Form("Stack overflow: track label = %d -- stack maximum = %d", label, nMC));
      return kFALSE;
   }

   // retrieve particle
   AliMCEvent    *mc = (AliMCEvent *)fRefMC;
   AliMCParticle *mcPart = (AliMCParticle *)mc->GetTrack(label);

   // if particle = NULL --> failed
   if (!mcPart) {
      AliWarning(Form("Stack discontinuity: label %d refers to a NULL object", label));
      return kFALSE;
   }
   // otherwise --> success
   out.SetRefMC(mcPart);

   // if the particle is not primary, find the mother and get its PDG
   Int_t imum = mcPart->Particle()->GetFirstMother();
   if (imum >= 0 && imum < nMC) {
      AliMCParticle *mcMother = (AliMCParticle *)mc->GetTrack(imum);
      if (mcMother) {
         out.SetMotherPDG(mcMother->Particle()->GetPdgCode());
      } else {
         AliWarning(Form("Stack discontinuity: label mother %d refers to a NULL object", imum));
      }
   } else {
     AliDebug(4, Form("Stack overflow: mother label = %d -- stack maximum = %d", imum, nMC));
   }

   return kTRUE;
}

//_____________________________________________________________________________
Bool_t AliRsnEvent::SetMCInfoAOD(AliRsnDaughter &out)
{
//
// Using the label assigned to the daughter, searches for the MC informations:
// -- MC reference
// -- mother
//

   // if label makes no sense --> failed
   Int_t label = out.GetLabel();
   if (label < 0 || !fRefMC) return kFALSE;

   // retrieve particle
   AliAODEvent  *mc = (AliAODEvent *)fRefMC;
   TClonesArray *mcArray = (TClonesArray *)mc->GetList()->FindObject(AliAODMCParticle::StdBranchName());

   // get number of particles
   Int_t nMC = mcArray->GetEntriesFast();

   // if label too large --> failed
   if (label >= nMC) {
     AliDebug(4, Form("Stack overflow: track label = %d -- stack maximum = %d", label, nMC));
      return kFALSE;
   }

   // if particle = NULL --> failed
   AliAODMCParticle *mcPart = (AliAODMCParticle *)mcArray->At(label);
   if (!mcPart) {
      AliWarning(Form("Stack discontinuity: label %d refers to a NULL object", label));
      return kFALSE;
   }
   // otherwise --> success
   out.SetRefMC(mcPart);

   // if the particle is not primary, find the mother and get its PDG
   Int_t imum = mcPart->GetMother();
   if (imum >= 0 && imum < nMC) {
      AliAODMCParticle *mcMother = (AliAODMCParticle *)mcArray->At(imum);
      if (mcMother) {
         out.SetMotherPDG(mcMother->GetPdgCode());
      } else {
         AliWarning(Form("Stack discontinuity: label mother %d refers to a NULL object", imum));
      }
   } else if (imum >= nMC) {
     AliDebug(4, Form("Stack overflow: mother label = %d -- stack maximum = %d", imum, nMC));
   }

   return kTRUE;
}

//_____________________________________________________________________________
Bool_t AliRsnEvent::ConvertAbsoluteIndex(Int_t index, Int_t &realIndex, AliRsnDaughter::ERefType &type)
{
//
// Using the phylosophy of the absolute index, which loops over
// all tracks, V0s and cascades, returns the result of a check
// on it (first argument) based on this criterion:
// 1) if the absolute ID is smaller than number of tracks,
//    return itself and the type 'track'
// 2) if the absolute ID is larger than number of tracks, subtract it
//    and if the result is smaller than number of V0s,
//    return the corresponding V0 index and type
// 3) if the absolute ID is larger than number of tracks + V0s, subtract them
//    and if the result is smaller than number of cascades,
//    return the corresponding cascade index and type
// The results of this check are stored in the reference arguments, while the outcome of
// the function is kTRUE if one of these checks was successful, otherwise it is kFALSE,
// meaning that the absolute index reached the end.
//

   Int_t nTracks   = fRef->GetNumberOfTracks();
   Int_t nV0s      = fRef->GetNumberOfV0s();
   Int_t nCascades = fRef->GetNumberOfCascades();

   if (index < nTracks) {
      realIndex = index;
      type = AliRsnDaughter::kTrack;
      return kTRUE;
   } else if (index >= nTracks && index < nTracks + nV0s) {
      realIndex = index - nTracks;
      type = AliRsnDaughter::kV0;
      return kTRUE;
   } else if (index >= nTracks + nV0s && index < nTracks + nV0s + nCascades) {
      realIndex = index - nTracks - nV0s;
      type = AliRsnDaughter::kCascade;
      return kTRUE;
   }

   realIndex = -1;
   type = AliRsnDaughter::kNoType;
   return kFALSE;
}

//_____________________________________________________________________________
Int_t AliRsnEvent::ConvertRealIndex(Int_t index, AliRsnDaughter::ERefType type)
{
//
// Translates a pair made by index + object type into the corresponding
// absolute index, which is set to -1 in case the real index overflows.
//

   Int_t nTracks   = fRef->GetNumberOfTracks();
   Int_t nV0s      = fRef->GetNumberOfV0s();
   Int_t nCascades = fRef->GetNumberOfCascades();

   switch (type) {
      case AliRsnDaughter::kTrack:
         if (index >= 0 && index < nTracks)
            return index;
         else
            return -1;
      case AliRsnDaughter::kV0:
         if (index >= 0 && index < nV0s)
            return nTracks + index;
         else
            return -1;
      case AliRsnDaughter::kCascade:
         if (index >= 0 && index < nCascades)
            return nTracks + nV0s + index;
         else
            return -1;
      default:
         return -1;
   }
}

//_____________________________________________________________________________
Int_t AliRsnEvent::SelectLeadingParticle(AliRsnCutSet *cuts)
{
//
// Searches the collection of all particles with given PID type and charge,
// and returns the one with largest momentum, provided that it is greater than 1st argument.
// If one specifies AliRsnPID::kUnknown as type or AliRsnDaughter::kNoPID as method,
// the check is done over all particles irrespectively of their PID.
// If the sign argument is '+' or '-', the check is done over the particles of that charge,
// otherwise it is done irrespectively of the charge.
//

   // check input type
   Bool_t inputESD = IsESD();
   if (!inputESD && !IsAOD()) {
      AliError("Need to process ESD or AOD input");
      return -1;
   }

   Double_t ptMax = 0.0;
   Int_t i, nTracks = fRef->GetNumberOfTracks();

   fLeading = -1;
   AliRsnDaughter leading;

   for (i = 0; i < nTracks; i++) {
      if (inputESD)
         SetDaughterESDtrack(leading, i);
      else
         SetDaughterAODtrack(leading, i);
      if (!leading.IsOK()) {
         AliDebugClass(1, Form("Failed assignment of track %d", i));
         continue;
      }
      if (cuts && !cuts->IsSelected(&leading)) {
         AliDebugClass(1, Form("Track %d didn't pass cuts", i));
         continue;
      }
      // check if it has largest momentum
      if (leading.GetRef()->Pt() > ptMax) {
         ptMax = leading.GetRef()->Pt();
         fLeading = i;
      }
   }

   return fLeading;
}
 AliRsnEvent.cxx:1
 AliRsnEvent.cxx:2
 AliRsnEvent.cxx:3
 AliRsnEvent.cxx:4
 AliRsnEvent.cxx:5
 AliRsnEvent.cxx:6
 AliRsnEvent.cxx:7
 AliRsnEvent.cxx:8
 AliRsnEvent.cxx:9
 AliRsnEvent.cxx:10
 AliRsnEvent.cxx:11
 AliRsnEvent.cxx:12
 AliRsnEvent.cxx:13
 AliRsnEvent.cxx:14
 AliRsnEvent.cxx:15
 AliRsnEvent.cxx:16
 AliRsnEvent.cxx:17
 AliRsnEvent.cxx:18
 AliRsnEvent.cxx:19
 AliRsnEvent.cxx:20
 AliRsnEvent.cxx:21
 AliRsnEvent.cxx:22
 AliRsnEvent.cxx:23
 AliRsnEvent.cxx:24
 AliRsnEvent.cxx:25
 AliRsnEvent.cxx:26
 AliRsnEvent.cxx:27
 AliRsnEvent.cxx:28
 AliRsnEvent.cxx:29
 AliRsnEvent.cxx:30
 AliRsnEvent.cxx:31
 AliRsnEvent.cxx:32
 AliRsnEvent.cxx:33
 AliRsnEvent.cxx:34
 AliRsnEvent.cxx:35
 AliRsnEvent.cxx:36
 AliRsnEvent.cxx:37
 AliRsnEvent.cxx:38
 AliRsnEvent.cxx:39
 AliRsnEvent.cxx:40
 AliRsnEvent.cxx:41
 AliRsnEvent.cxx:42
 AliRsnEvent.cxx:43
 AliRsnEvent.cxx:44
 AliRsnEvent.cxx:45
 AliRsnEvent.cxx:46
 AliRsnEvent.cxx:47
 AliRsnEvent.cxx:48
 AliRsnEvent.cxx:49
 AliRsnEvent.cxx:50
 AliRsnEvent.cxx:51
 AliRsnEvent.cxx:52
 AliRsnEvent.cxx:53
 AliRsnEvent.cxx:54
 AliRsnEvent.cxx:55
 AliRsnEvent.cxx:56
 AliRsnEvent.cxx:57
 AliRsnEvent.cxx:58
 AliRsnEvent.cxx:59
 AliRsnEvent.cxx:60
 AliRsnEvent.cxx:61
 AliRsnEvent.cxx:62
 AliRsnEvent.cxx:63
 AliRsnEvent.cxx:64
 AliRsnEvent.cxx:65
 AliRsnEvent.cxx:66
 AliRsnEvent.cxx:67
 AliRsnEvent.cxx:68
 AliRsnEvent.cxx:69
 AliRsnEvent.cxx:70
 AliRsnEvent.cxx:71
 AliRsnEvent.cxx:72
 AliRsnEvent.cxx:73
 AliRsnEvent.cxx:74
 AliRsnEvent.cxx:75
 AliRsnEvent.cxx:76
 AliRsnEvent.cxx:77
 AliRsnEvent.cxx:78
 AliRsnEvent.cxx:79
 AliRsnEvent.cxx:80
 AliRsnEvent.cxx:81
 AliRsnEvent.cxx:82
 AliRsnEvent.cxx:83
 AliRsnEvent.cxx:84
 AliRsnEvent.cxx:85
 AliRsnEvent.cxx:86
 AliRsnEvent.cxx:87
 AliRsnEvent.cxx:88
 AliRsnEvent.cxx:89
 AliRsnEvent.cxx:90
 AliRsnEvent.cxx:91
 AliRsnEvent.cxx:92
 AliRsnEvent.cxx:93
 AliRsnEvent.cxx:94
 AliRsnEvent.cxx:95
 AliRsnEvent.cxx:96
 AliRsnEvent.cxx:97
 AliRsnEvent.cxx:98
 AliRsnEvent.cxx:99
 AliRsnEvent.cxx:100
 AliRsnEvent.cxx:101
 AliRsnEvent.cxx:102
 AliRsnEvent.cxx:103
 AliRsnEvent.cxx:104
 AliRsnEvent.cxx:105
 AliRsnEvent.cxx:106
 AliRsnEvent.cxx:107
 AliRsnEvent.cxx:108
 AliRsnEvent.cxx:109
 AliRsnEvent.cxx:110
 AliRsnEvent.cxx:111
 AliRsnEvent.cxx:112
 AliRsnEvent.cxx:113
 AliRsnEvent.cxx:114
 AliRsnEvent.cxx:115
 AliRsnEvent.cxx:116
 AliRsnEvent.cxx:117
 AliRsnEvent.cxx:118
 AliRsnEvent.cxx:119
 AliRsnEvent.cxx:120
 AliRsnEvent.cxx:121
 AliRsnEvent.cxx:122
 AliRsnEvent.cxx:123
 AliRsnEvent.cxx:124
 AliRsnEvent.cxx:125
 AliRsnEvent.cxx:126
 AliRsnEvent.cxx:127
 AliRsnEvent.cxx:128
 AliRsnEvent.cxx:129
 AliRsnEvent.cxx:130
 AliRsnEvent.cxx:131
 AliRsnEvent.cxx:132
 AliRsnEvent.cxx:133
 AliRsnEvent.cxx:134
 AliRsnEvent.cxx:135
 AliRsnEvent.cxx:136
 AliRsnEvent.cxx:137
 AliRsnEvent.cxx:138
 AliRsnEvent.cxx:139
 AliRsnEvent.cxx:140
 AliRsnEvent.cxx:141
 AliRsnEvent.cxx:142
 AliRsnEvent.cxx:143
 AliRsnEvent.cxx:144
 AliRsnEvent.cxx:145
 AliRsnEvent.cxx:146
 AliRsnEvent.cxx:147
 AliRsnEvent.cxx:148
 AliRsnEvent.cxx:149
 AliRsnEvent.cxx:150
 AliRsnEvent.cxx:151
 AliRsnEvent.cxx:152
 AliRsnEvent.cxx:153
 AliRsnEvent.cxx:154
 AliRsnEvent.cxx:155
 AliRsnEvent.cxx:156
 AliRsnEvent.cxx:157
 AliRsnEvent.cxx:158
 AliRsnEvent.cxx:159
 AliRsnEvent.cxx:160
 AliRsnEvent.cxx:161
 AliRsnEvent.cxx:162
 AliRsnEvent.cxx:163
 AliRsnEvent.cxx:164
 AliRsnEvent.cxx:165
 AliRsnEvent.cxx:166
 AliRsnEvent.cxx:167
 AliRsnEvent.cxx:168
 AliRsnEvent.cxx:169
 AliRsnEvent.cxx:170
 AliRsnEvent.cxx:171
 AliRsnEvent.cxx:172
 AliRsnEvent.cxx:173
 AliRsnEvent.cxx:174
 AliRsnEvent.cxx:175
 AliRsnEvent.cxx:176
 AliRsnEvent.cxx:177
 AliRsnEvent.cxx:178
 AliRsnEvent.cxx:179
 AliRsnEvent.cxx:180
 AliRsnEvent.cxx:181
 AliRsnEvent.cxx:182
 AliRsnEvent.cxx:183
 AliRsnEvent.cxx:184
 AliRsnEvent.cxx:185
 AliRsnEvent.cxx:186
 AliRsnEvent.cxx:187
 AliRsnEvent.cxx:188
 AliRsnEvent.cxx:189
 AliRsnEvent.cxx:190
 AliRsnEvent.cxx:191
 AliRsnEvent.cxx:192
 AliRsnEvent.cxx:193
 AliRsnEvent.cxx:194
 AliRsnEvent.cxx:195
 AliRsnEvent.cxx:196
 AliRsnEvent.cxx:197
 AliRsnEvent.cxx:198
 AliRsnEvent.cxx:199
 AliRsnEvent.cxx:200
 AliRsnEvent.cxx:201
 AliRsnEvent.cxx:202
 AliRsnEvent.cxx:203
 AliRsnEvent.cxx:204
 AliRsnEvent.cxx:205
 AliRsnEvent.cxx:206
 AliRsnEvent.cxx:207
 AliRsnEvent.cxx:208
 AliRsnEvent.cxx:209
 AliRsnEvent.cxx:210
 AliRsnEvent.cxx:211
 AliRsnEvent.cxx:212
 AliRsnEvent.cxx:213
 AliRsnEvent.cxx:214
 AliRsnEvent.cxx:215
 AliRsnEvent.cxx:216
 AliRsnEvent.cxx:217
 AliRsnEvent.cxx:218
 AliRsnEvent.cxx:219
 AliRsnEvent.cxx:220
 AliRsnEvent.cxx:221
 AliRsnEvent.cxx:222
 AliRsnEvent.cxx:223
 AliRsnEvent.cxx:224
 AliRsnEvent.cxx:225
 AliRsnEvent.cxx:226
 AliRsnEvent.cxx:227
 AliRsnEvent.cxx:228
 AliRsnEvent.cxx:229
 AliRsnEvent.cxx:230
 AliRsnEvent.cxx:231
 AliRsnEvent.cxx:232
 AliRsnEvent.cxx:233
 AliRsnEvent.cxx:234
 AliRsnEvent.cxx:235
 AliRsnEvent.cxx:236
 AliRsnEvent.cxx:237
 AliRsnEvent.cxx:238
 AliRsnEvent.cxx:239
 AliRsnEvent.cxx:240
 AliRsnEvent.cxx:241
 AliRsnEvent.cxx:242
 AliRsnEvent.cxx:243
 AliRsnEvent.cxx:244
 AliRsnEvent.cxx:245
 AliRsnEvent.cxx:246
 AliRsnEvent.cxx:247
 AliRsnEvent.cxx:248
 AliRsnEvent.cxx:249
 AliRsnEvent.cxx:250
 AliRsnEvent.cxx:251
 AliRsnEvent.cxx:252
 AliRsnEvent.cxx:253
 AliRsnEvent.cxx:254
 AliRsnEvent.cxx:255
 AliRsnEvent.cxx:256
 AliRsnEvent.cxx:257
 AliRsnEvent.cxx:258
 AliRsnEvent.cxx:259
 AliRsnEvent.cxx:260
 AliRsnEvent.cxx:261
 AliRsnEvent.cxx:262
 AliRsnEvent.cxx:263
 AliRsnEvent.cxx:264
 AliRsnEvent.cxx:265
 AliRsnEvent.cxx:266
 AliRsnEvent.cxx:267
 AliRsnEvent.cxx:268
 AliRsnEvent.cxx:269
 AliRsnEvent.cxx:270
 AliRsnEvent.cxx:271
 AliRsnEvent.cxx:272
 AliRsnEvent.cxx:273
 AliRsnEvent.cxx:274
 AliRsnEvent.cxx:275
 AliRsnEvent.cxx:276
 AliRsnEvent.cxx:277
 AliRsnEvent.cxx:278
 AliRsnEvent.cxx:279
 AliRsnEvent.cxx:280
 AliRsnEvent.cxx:281
 AliRsnEvent.cxx:282
 AliRsnEvent.cxx:283
 AliRsnEvent.cxx:284
 AliRsnEvent.cxx:285
 AliRsnEvent.cxx:286
 AliRsnEvent.cxx:287
 AliRsnEvent.cxx:288
 AliRsnEvent.cxx:289
 AliRsnEvent.cxx:290
 AliRsnEvent.cxx:291
 AliRsnEvent.cxx:292
 AliRsnEvent.cxx:293
 AliRsnEvent.cxx:294
 AliRsnEvent.cxx:295
 AliRsnEvent.cxx:296
 AliRsnEvent.cxx:297
 AliRsnEvent.cxx:298
 AliRsnEvent.cxx:299
 AliRsnEvent.cxx:300
 AliRsnEvent.cxx:301
 AliRsnEvent.cxx:302
 AliRsnEvent.cxx:303
 AliRsnEvent.cxx:304
 AliRsnEvent.cxx:305
 AliRsnEvent.cxx:306
 AliRsnEvent.cxx:307
 AliRsnEvent.cxx:308
 AliRsnEvent.cxx:309
 AliRsnEvent.cxx:310
 AliRsnEvent.cxx:311
 AliRsnEvent.cxx:312
 AliRsnEvent.cxx:313
 AliRsnEvent.cxx:314
 AliRsnEvent.cxx:315
 AliRsnEvent.cxx:316
 AliRsnEvent.cxx:317
 AliRsnEvent.cxx:318
 AliRsnEvent.cxx:319
 AliRsnEvent.cxx:320
 AliRsnEvent.cxx:321
 AliRsnEvent.cxx:322
 AliRsnEvent.cxx:323
 AliRsnEvent.cxx:324
 AliRsnEvent.cxx:325
 AliRsnEvent.cxx:326
 AliRsnEvent.cxx:327
 AliRsnEvent.cxx:328
 AliRsnEvent.cxx:329
 AliRsnEvent.cxx:330
 AliRsnEvent.cxx:331
 AliRsnEvent.cxx:332
 AliRsnEvent.cxx:333
 AliRsnEvent.cxx:334
 AliRsnEvent.cxx:335
 AliRsnEvent.cxx:336
 AliRsnEvent.cxx:337
 AliRsnEvent.cxx:338
 AliRsnEvent.cxx:339
 AliRsnEvent.cxx:340
 AliRsnEvent.cxx:341
 AliRsnEvent.cxx:342
 AliRsnEvent.cxx:343
 AliRsnEvent.cxx:344
 AliRsnEvent.cxx:345
 AliRsnEvent.cxx:346
 AliRsnEvent.cxx:347
 AliRsnEvent.cxx:348
 AliRsnEvent.cxx:349
 AliRsnEvent.cxx:350
 AliRsnEvent.cxx:351
 AliRsnEvent.cxx:352
 AliRsnEvent.cxx:353
 AliRsnEvent.cxx:354
 AliRsnEvent.cxx:355
 AliRsnEvent.cxx:356
 AliRsnEvent.cxx:357
 AliRsnEvent.cxx:358
 AliRsnEvent.cxx:359
 AliRsnEvent.cxx:360
 AliRsnEvent.cxx:361
 AliRsnEvent.cxx:362
 AliRsnEvent.cxx:363
 AliRsnEvent.cxx:364
 AliRsnEvent.cxx:365
 AliRsnEvent.cxx:366
 AliRsnEvent.cxx:367
 AliRsnEvent.cxx:368
 AliRsnEvent.cxx:369
 AliRsnEvent.cxx:370
 AliRsnEvent.cxx:371
 AliRsnEvent.cxx:372
 AliRsnEvent.cxx:373
 AliRsnEvent.cxx:374
 AliRsnEvent.cxx:375
 AliRsnEvent.cxx:376
 AliRsnEvent.cxx:377
 AliRsnEvent.cxx:378
 AliRsnEvent.cxx:379
 AliRsnEvent.cxx:380
 AliRsnEvent.cxx:381
 AliRsnEvent.cxx:382
 AliRsnEvent.cxx:383
 AliRsnEvent.cxx:384
 AliRsnEvent.cxx:385
 AliRsnEvent.cxx:386
 AliRsnEvent.cxx:387
 AliRsnEvent.cxx:388
 AliRsnEvent.cxx:389
 AliRsnEvent.cxx:390
 AliRsnEvent.cxx:391
 AliRsnEvent.cxx:392
 AliRsnEvent.cxx:393
 AliRsnEvent.cxx:394
 AliRsnEvent.cxx:395
 AliRsnEvent.cxx:396
 AliRsnEvent.cxx:397
 AliRsnEvent.cxx:398
 AliRsnEvent.cxx:399
 AliRsnEvent.cxx:400
 AliRsnEvent.cxx:401
 AliRsnEvent.cxx:402
 AliRsnEvent.cxx:403
 AliRsnEvent.cxx:404
 AliRsnEvent.cxx:405
 AliRsnEvent.cxx:406
 AliRsnEvent.cxx:407
 AliRsnEvent.cxx:408
 AliRsnEvent.cxx:409
 AliRsnEvent.cxx:410
 AliRsnEvent.cxx:411
 AliRsnEvent.cxx:412
 AliRsnEvent.cxx:413
 AliRsnEvent.cxx:414
 AliRsnEvent.cxx:415
 AliRsnEvent.cxx:416
 AliRsnEvent.cxx:417
 AliRsnEvent.cxx:418
 AliRsnEvent.cxx:419
 AliRsnEvent.cxx:420
 AliRsnEvent.cxx:421
 AliRsnEvent.cxx:422
 AliRsnEvent.cxx:423
 AliRsnEvent.cxx:424
 AliRsnEvent.cxx:425
 AliRsnEvent.cxx:426
 AliRsnEvent.cxx:427
 AliRsnEvent.cxx:428
 AliRsnEvent.cxx:429
 AliRsnEvent.cxx:430
 AliRsnEvent.cxx:431
 AliRsnEvent.cxx:432
 AliRsnEvent.cxx:433
 AliRsnEvent.cxx:434
 AliRsnEvent.cxx:435
 AliRsnEvent.cxx:436
 AliRsnEvent.cxx:437
 AliRsnEvent.cxx:438
 AliRsnEvent.cxx:439
 AliRsnEvent.cxx:440
 AliRsnEvent.cxx:441
 AliRsnEvent.cxx:442
 AliRsnEvent.cxx:443
 AliRsnEvent.cxx:444
 AliRsnEvent.cxx:445
 AliRsnEvent.cxx:446
 AliRsnEvent.cxx:447
 AliRsnEvent.cxx:448
 AliRsnEvent.cxx:449
 AliRsnEvent.cxx:450
 AliRsnEvent.cxx:451
 AliRsnEvent.cxx:452
 AliRsnEvent.cxx:453
 AliRsnEvent.cxx:454
 AliRsnEvent.cxx:455
 AliRsnEvent.cxx:456
 AliRsnEvent.cxx:457
 AliRsnEvent.cxx:458
 AliRsnEvent.cxx:459
 AliRsnEvent.cxx:460
 AliRsnEvent.cxx:461
 AliRsnEvent.cxx:462
 AliRsnEvent.cxx:463
 AliRsnEvent.cxx:464
 AliRsnEvent.cxx:465
 AliRsnEvent.cxx:466
 AliRsnEvent.cxx:467
 AliRsnEvent.cxx:468
 AliRsnEvent.cxx:469
 AliRsnEvent.cxx:470
 AliRsnEvent.cxx:471
 AliRsnEvent.cxx:472
 AliRsnEvent.cxx:473
 AliRsnEvent.cxx:474
 AliRsnEvent.cxx:475
 AliRsnEvent.cxx:476
 AliRsnEvent.cxx:477
 AliRsnEvent.cxx:478
 AliRsnEvent.cxx:479
 AliRsnEvent.cxx:480
 AliRsnEvent.cxx:481
 AliRsnEvent.cxx:482
 AliRsnEvent.cxx:483
 AliRsnEvent.cxx:484
 AliRsnEvent.cxx:485
 AliRsnEvent.cxx:486
 AliRsnEvent.cxx:487
 AliRsnEvent.cxx:488
 AliRsnEvent.cxx:489
 AliRsnEvent.cxx:490
 AliRsnEvent.cxx:491
 AliRsnEvent.cxx:492
 AliRsnEvent.cxx:493
 AliRsnEvent.cxx:494
 AliRsnEvent.cxx:495
 AliRsnEvent.cxx:496
 AliRsnEvent.cxx:497
 AliRsnEvent.cxx:498
 AliRsnEvent.cxx:499
 AliRsnEvent.cxx:500
 AliRsnEvent.cxx:501
 AliRsnEvent.cxx:502
 AliRsnEvent.cxx:503
 AliRsnEvent.cxx:504
 AliRsnEvent.cxx:505
 AliRsnEvent.cxx:506
 AliRsnEvent.cxx:507
 AliRsnEvent.cxx:508
 AliRsnEvent.cxx:509
 AliRsnEvent.cxx:510
 AliRsnEvent.cxx:511
 AliRsnEvent.cxx:512
 AliRsnEvent.cxx:513
 AliRsnEvent.cxx:514
 AliRsnEvent.cxx:515
 AliRsnEvent.cxx:516
 AliRsnEvent.cxx:517
 AliRsnEvent.cxx:518
 AliRsnEvent.cxx:519
 AliRsnEvent.cxx:520
 AliRsnEvent.cxx:521
 AliRsnEvent.cxx:522
 AliRsnEvent.cxx:523
 AliRsnEvent.cxx:524
 AliRsnEvent.cxx:525
 AliRsnEvent.cxx:526
 AliRsnEvent.cxx:527
 AliRsnEvent.cxx:528
 AliRsnEvent.cxx:529
 AliRsnEvent.cxx:530
 AliRsnEvent.cxx:531
 AliRsnEvent.cxx:532
 AliRsnEvent.cxx:533
 AliRsnEvent.cxx:534
 AliRsnEvent.cxx:535
 AliRsnEvent.cxx:536
 AliRsnEvent.cxx:537
 AliRsnEvent.cxx:538
 AliRsnEvent.cxx:539
 AliRsnEvent.cxx:540
 AliRsnEvent.cxx:541
 AliRsnEvent.cxx:542
 AliRsnEvent.cxx:543
 AliRsnEvent.cxx:544
 AliRsnEvent.cxx:545
 AliRsnEvent.cxx:546
 AliRsnEvent.cxx:547
 AliRsnEvent.cxx:548
 AliRsnEvent.cxx:549
 AliRsnEvent.cxx:550
 AliRsnEvent.cxx:551
 AliRsnEvent.cxx:552
 AliRsnEvent.cxx:553
 AliRsnEvent.cxx:554
 AliRsnEvent.cxx:555
 AliRsnEvent.cxx:556
 AliRsnEvent.cxx:557
 AliRsnEvent.cxx:558
 AliRsnEvent.cxx:559
 AliRsnEvent.cxx:560
 AliRsnEvent.cxx:561
 AliRsnEvent.cxx:562
 AliRsnEvent.cxx:563
 AliRsnEvent.cxx:564
 AliRsnEvent.cxx:565
 AliRsnEvent.cxx:566
 AliRsnEvent.cxx:567
 AliRsnEvent.cxx:568
 AliRsnEvent.cxx:569
 AliRsnEvent.cxx:570
 AliRsnEvent.cxx:571
 AliRsnEvent.cxx:572
 AliRsnEvent.cxx:573
 AliRsnEvent.cxx:574
 AliRsnEvent.cxx:575
 AliRsnEvent.cxx:576
 AliRsnEvent.cxx:577
 AliRsnEvent.cxx:578
 AliRsnEvent.cxx:579
 AliRsnEvent.cxx:580