ROOT logo
//
// *** Class AliRsnLoopPair ***
//
// "Core" method for defining the work on a pari of particles.
// For one analysis, one must setup one of this for each pair he wants to analyze,
// adding to it all analysis which he desires to do.
// Here he defines the cuts, and the particle types and charges, and can add
// functions which do different operations on the same pair, and some binning
// with respect to some kinematic variables (eta, momentum)
//
// authors: A. Pulvirenti (email: alberto.pulvirenti@ct.infn.it)
//          M. Vala (email: martin.vala@cern.ch)
//

#include <Riostream.h>
#include <TList.h>
#include <TEntryList.h>

#include "AliLog.h"

#include "AliRsnEvent.h"
#include "AliRsnPairDef.h"
#include "AliRsnMother.h"
#include "AliRsnCutSet.h"
#include "AliRsnDaughterSelector.h"

#include "AliRsnLoopPair.h"

ClassImp(AliRsnLoopPair)

//_____________________________________________________________________________
AliRsnLoopPair::AliRsnLoopPair(const char *name, AliRsnPairDef *def, Bool_t isMixed) :
   AliRsnLoop(name, isMixed),
   fTrueMC(kFALSE),
   fOnlyTrue(kFALSE),
   fUseMCRef(kFALSE),
   fCheckDecay(kFALSE),
   fRangeY(1E20),
   fRangeDCAproduct(1E20),
   fPairDef(def),
   fPairCuts(0x0),
   fMother()
{
//
// Default constructor
//

   fListID[0] = -1;
   fListID[1] = -1;
}

//_____________________________________________________________________________
AliRsnLoopPair::AliRsnLoopPair(const AliRsnLoopPair &copy) :
   AliRsnLoop(copy),
   fTrueMC(copy.fTrueMC),
   fOnlyTrue(copy.fOnlyTrue),
   fUseMCRef(copy.fUseMCRef),
   fCheckDecay(copy.fCheckDecay),
   fRangeY(copy.fRangeY),
   fRangeDCAproduct(copy.fRangeDCAproduct),
   fPairDef(copy.fPairDef),
   fPairCuts(copy.fPairCuts),
   fMother(copy.fMother)
{
//
// Copy constructor
//

   fListID[0] = copy.fListID[0];
   fListID[1] = copy.fListID[1];
}

//_____________________________________________________________________________
AliRsnLoopPair &AliRsnLoopPair::operator=(const AliRsnLoopPair &copy)
{
//
// Assignment operator
//

   AliRsnLoop::operator=(copy);
   if (this == &copy)
      return *this;
   fTrueMC = copy.fTrueMC;
   fOnlyTrue = copy.fOnlyTrue;
   fUseMCRef = copy.fUseMCRef;
   fCheckDecay = copy.fCheckDecay;
   fRangeY = copy.fRangeY;
   fRangeDCAproduct = copy.fRangeDCAproduct;
   fPairDef = copy.fPairDef;
   fPairCuts = copy.fPairCuts;
   fMother = copy.fMother;
   fListID[0] = copy.fListID[0];
   fListID[1] = copy.fListID[1];

   return (*this);
}

//_____________________________________________________________________________
AliRsnLoopPair::~AliRsnLoopPair()
{
//
// Destructor
//
}

//_____________________________________________________________________________
void AliRsnLoopPair::Print(Option_t * /*option*/) const
{
//
// Prints info about pair
//

   AliRsnLoop::Print();
}

//_____________________________________________________________________________
Bool_t AliRsnLoopPair::Init(const char *prefix, TList *list)
{
//
// Initialization function.
// Loops on all functions and eventual the ntuple, to initialize output objects.
//

   // assign data members relations
   fMother.SetDaughter(0, &fDaughter[0]);
   fMother.SetDaughter(1, &fDaughter[1]);
   AliInfo(Form("[%s] Initialization", GetName()));

   TString name(prefix);
   name += '.';
   name += GetName();
//    if (IsMixed()) name.Append("_mix");

   return AliRsnLoop::Init(name.Data(), list);
}

//_____________________________________________________________________________
Int_t AliRsnLoopPair::DoLoop
(AliRsnEvent *evMain, AliRsnDaughterSelector *selMain, AliRsnEvent *evMix, AliRsnDaughterSelector *selMix)
{
//
// Loop function.
// Computes what is needed from passed events.
// Returns the number of pairs successfully processed.
//

   if (fIsMixed) {
      AliDebugClass(3, Form("[%s]: event-mixing loop", GetName()));
      if (!evMix || !selMix) {
         AliError(Form("[%s] NULL mixed event when mixing is required: cannot process", GetName()));
         return 0;
      }
   } else {
      AliDebugClass(3, Form("[%s]: single-event loop", GetName()));
      evMix = evMain;
      selMix = selMain;
   }
   fMother.SetRefEvent(evMain);

   // check cuts
   if (!OkEvent(evMain)) {
      AliDebugClass(3, Form("[%s]: main event not accepted", GetName()));
      return 0;
   }
   if (!OkEvent(evMix)) {
      AliDebugClass(3, Form("[%s]: mixed event not accepted", GetName()));
      return 0;
   }

   // if it is required to loop over True MC, do this here and skip the rest of the method
   if (fTrueMC) return LoopTrueMC(evMain);

   Int_t i0, i1, start, npairs = 0;

   TEntryList *list0 = selMain->GetSelected(fListID[0], fPairDef->GetDef1().GetChargeC());
   TEntryList *list1 = selMix ->GetSelected(fListID[1], fPairDef->GetDef2().GetChargeC());
   if (!list0 || !list1) {
      AliError("Can't process NULL lists");
      return 0;
   }
   AliDebugClass(3, Form("[%s]: list counts: %lld, %lld", GetName(), list0->GetN(), list1->GetN()));
   if (!list0->GetN() || !list1->GetN()) {
      AliDebugClass(3, Form("[%s]: at least one list is empty", GetName()));
      return 0;
   }

   TObjArrayIter next(&fOutputs);
   AliRsnListOutput *out = 0x0;
   Long64_t iEntry1,iEntry2;
   for (i0 = 0; i0 < list0->GetN(); i0++) {
      iEntry1 = list0->GetEntry(i0);
      evMain->SetDaughter(fDaughter[0], iEntry1,fUseMCRef);
      fDaughter[0].FillP(fPairDef->GetDef1().GetMass());
      start = 0;
      if (!fIsMixed && list0 == list1) start = i0 + 1;
      for (i1 = start; i1 < list1->GetN(); i1++) {
         iEntry2 = list1->GetEntry(i1);
         if (iEntry1 == iEntry2) continue;
         AliDebugClass(4, Form("Checking entries pair: %d (%lld) with %d (%lld)", i0, iEntry1, i1, iEntry2));
         evMix->SetDaughter(fDaughter[1], iEntry2,fUseMCRef);
         fDaughter[1].FillP(fPairDef->GetDef2().GetMass());
         fMother.Sum(0) = fDaughter[0].Prec() + fDaughter[1].Prec();
         fMother.Sum(1) = fDaughter[0].Psim() + fDaughter[1].Psim();
         fMother.Ref(0).SetXYZM(fMother.Sum(0).X(), fMother.Sum(0).Y(), fMother.Sum(0).Z(), fPairDef->GetMotherMass());
         fMother.Ref(1).SetXYZM(fMother.Sum(1).X(), fMother.Sum(1).Y(), fMother.Sum(1).Z(), fPairDef->GetMotherMass());
         // check rapidity range
         if (TMath::Abs(fMother.Rapidity(0)) > fRangeY) {
            AliDebugClass(2, Form("[%s]: Outside rapidity range", GetName()));
            continue;
         }
	 // check daughter's DCA product range
         if (TMath::Abs(fMother.DCAproduct()) > fRangeDCAproduct) {
            AliDebugClass(2, Form("[%s]: Outside daughter's DCA products range", GetName()));
            continue;
         }
         // check mother
         if (fOnlyTrue) {
            if (!IsTrueMother()) {
               AliDebugClass(2, Form("[%s]: candidate mother is not true", GetName()));
               continue;
            }
         }
         // check cuts
         if (fPairCuts) {
            if (!fPairCuts->IsSelected(&fMother)) {
               AliDebugClass(2, Form("[%s]: candidate mother didn't pass the cuts", GetName()));
               continue;
            }
         }
         // fill outputs
         next.Reset();
         while ( (out = (AliRsnListOutput *)next()) ) {
            if (out->Fill(&fMother)) npairs++;
            else AliDebugClass(3, Form("[%s]: failed computation", GetName()));
         }
      }
   }

   return npairs;
}

//_____________________________________________________________________________
Bool_t AliRsnLoopPair::IsTrueMother()
{
//
// Checks to see if the mother comes from a true resonance.
// It is triggered by the 'SetOnlyTrue()' function
//

   // check #1:
   // daughters have same mother with the right PDG code
   Int_t commonPDG = fMother.CommonMother();
   if (commonPDG != fPairDef->GetMotherPDG()) return kFALSE;
   AliDebugClass(1, "Found a true mother");

   // check #2:
   // checks if daughter have the right particle type
   // (activated by fCheckDecay)
   if (fCheckDecay) {
      AliRsnDaughterDef &def1 = fPairDef->GetDef1();
      AliRsnDaughterDef &def2 = fPairDef->GetDef2();
      if (!def1.MatchesPID(&fDaughter[0])) return kFALSE;
      if (!def2.MatchesPID(&fDaughter[1])) return kFALSE;
   }
   AliDebugClass(1, "Decay products match");

   return kTRUE;
}

//__________________________________________________________________________________________________
Bool_t AliRsnLoopPair::AssignMotherAndDaughters(AliRsnEvent *rsnEvent, Int_t ipart)
{
//
// Calls the appropriate assignment method
//

   // setup pointers
   fMother.SetDaughter(0, &fDaughter[0]);
   fMother.SetDaughter(1, &fDaughter[1]);
   fMother.SetRefEvent(rsnEvent);
   fDaughter[0].SetOwnerEvent(rsnEvent);
   fDaughter[1].SetOwnerEvent(rsnEvent);

   if (rsnEvent->IsESD())
      return AssignMotherAndDaughtersESD(rsnEvent, ipart);
   else if (rsnEvent->IsAOD())
      return AssignMotherAndDaughtersAOD(rsnEvent, ipart);
   else {
      AliError("Unrecognized input event");
      return kFALSE;
   }
}

//__________________________________________________________________________________________________
Bool_t AliRsnLoopPair::AssignMotherAndDaughtersESD(AliRsnEvent *rsnEvent, Int_t ipart)
{
//
// Gets a particle in the MC event and try to assign it to the mother.
// If it has two daughters, retrieve them and assign also them.
// NOTE: assignment is done only for MC, since reconstructed match is assigned in the same way
//       for ESD and AOD, if available
// ---
// Implementation for ESD inputs
//

   AliMCEvent    *mc      = rsnEvent->GetRefMCESD();
   AliStack      *stack   = mc->Stack();
   AliMCParticle *mother  = (AliMCParticle *)mc->GetTrack(ipart);
   TParticle     *motherP = mother->Particle();
   Int_t          ntracks = stack->GetNtrack();

   // check PDG code and exit if it is wrong
   if (TMath::Abs(motherP->GetPdgCode()) != fPairDef->GetMotherPDG()) return kFALSE;

   // check number of daughters and exit if it is not 2
   if (motherP->GetNDaughters() < 2) return kFALSE;
   //if (!stack->IsPhysicalPrimary(ipart)) return kFALSE;

   /*
   // check distance from primary vertex
   TLorentzVector vprod;
   motherP->ProductionVertex(vprod);
   if (!CheckDistanceFromPV(vprod.X(), vprod.Y(), vprod.Z())) {
      AliDebugClass(1, "Distant production vertex");
      return kFALSE;
   }
   */

   // get the daughters and check their PDG code and charge:
   // if they match one of the pair daughter definitions,
   // assign them as MC reference of the 'fDaughter' objects
   fDaughter[0].Reset();
   fDaughter[1].Reset();
   Int_t index[2] = {motherP->GetDaughter(0), motherP->GetDaughter(1)};
   Int_t i, pdg;
   Short_t charge;
   AliMCParticle *daughter = 0x0;
   for (i = 0; i < 2; i++) {
      // check index for stack
      if (index[i] < 0 || index[i] > ntracks) {
         AliError(Form("Index %d overflow: value = %d, max = %d", i, index[i], ntracks));
         return kFALSE;
      }
      // get daughter and its PDG and charge
      daughter = (AliMCParticle *)mc->GetTrack(index[i]);
      pdg      = TMath::Abs(daughter->Particle()->GetPdgCode());
      charge   = (Short_t)(daughter->Particle()->GetPDG()->Charge() / 3);
      // check if it matches one definition
      if (fPairDef->GetDef1().MatchesPDG(pdg) && fPairDef->GetDef1().MatchesChargeS(charge)) {
         fDaughter[0].SetGood();
         fDaughter[0].SetRefMC(daughter);
         fDaughter[0].SetLabel(index[i]);
      } else if (fPairDef->GetDef2().MatchesPDG(pdg) && fPairDef->GetDef2().MatchesChargeS(charge)) {
         fDaughter[1].SetGood();
         fDaughter[1].SetRefMC(daughter);
         fDaughter[1].SetLabel(index[i]);
      }
   }

   // return success if both daughters were assigned
   if (fDaughter[0].IsOK() && fDaughter[1].IsOK()) {
      return kTRUE;
   } else {
      fDaughter[0].Reset();
      fDaughter[1].Reset();
      return kFALSE;
   }
}

//__________________________________________________________________________________________________
Bool_t AliRsnLoopPair::AssignMotherAndDaughtersAOD(AliRsnEvent *rsnEvent, Int_t ipart)
{
//
// Gets a particle in the MC event and try to assign it to the mother.
// If it has two daughters, retrieve them and assign also them.
// NOTE: assignment is done only for MC, since reconstructed match is assigned in the same way
//       for ESD and AOD, if available
// ---
// Implementation for AOD inputs
//

   AliAODEvent      *aod     = rsnEvent->GetRefAOD();
   TClonesArray     *listAOD = (TClonesArray *)(aod->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
   AliAODMCParticle *mother  = (AliAODMCParticle *)listAOD->At(ipart);

   // check PDG code and exit if it is wrong
   if (TMath::Abs(mother->GetPdgCode()) != fPairDef->GetMotherPDG()) return kFALSE;

   // check number of daughters and exit if it is not 2
   if (mother->GetNDaughters() < 2) return kFALSE;
   if (!mother->IsPrimary()) return kFALSE;

   /*
   // check distance from primary vertex
   Double_t vprod[3] = {(Double_t)mother->Xv(), (Double_t)mother->Yv(), (Double_t)mother->Zv()};
   Double_t dv = DistanceFromPV(vprod[0], vprod[1], vprod[2]);
   if (dv > fMaxDistPV) {
      AliDebugClass(1, "Distant production vertex");
      return kFALSE;
   }
   */

   // get the daughters and check their PDG code and charge:
   // if they match one of the pair daughter definitions,
   // assign them as MC reference of the 'fDaughter' objects
   fDaughter[0].Reset();
   fDaughter[1].Reset();
   Int_t index[2] = {(Int_t)mother->GetDaughter(0), (Int_t)mother->GetDaughter(1)};
   Int_t ntracks = listAOD->GetEntriesFast();
   Int_t i, pdg;
   Short_t charge;
   AliAODMCParticle *daughter = 0x0;
   for (i = 0; i < 2; i++) {
      // check index for stack
      if (index[i] < 0 || index[i] > ntracks) {
         AliError(Form("Index %d overflow: value = %d, max = %d", i, index[i], ntracks));
         return kFALSE;
      }
      // get daughter and its PDG and charge
      daughter = (AliAODMCParticle *)listAOD->At(index[i]);
      pdg      = TMath::Abs(daughter->GetPdgCode());
      charge   = (Short_t)(daughter->Charge() / 3);
      // check if it matches one definition
      if (fPairDef->GetDef1().MatchesPDG(pdg) && fPairDef->GetDef1().MatchesChargeS(charge)) {
         fDaughter[0].SetGood();
         fDaughter[0].SetRefMC(daughter);
         fDaughter[0].SetLabel(index[i]);
      } else if (fPairDef->GetDef2().MatchesPDG(pdg) && fPairDef->GetDef2().MatchesChargeS(charge)) {
         fDaughter[1].SetGood();
         fDaughter[1].SetRefMC(daughter);
         fDaughter[1].SetLabel(index[i]);
      }
   }

   // return success if both daughters were assigned
   if (fDaughter[0].IsOK() && fDaughter[1].IsOK()) {
      return kTRUE;
   } else {
      fDaughter[0].Reset();
      fDaughter[1].Reset();
      return kFALSE;
   }
}

//_____________________________________________________________________________
Int_t AliRsnLoopPair::LoopTrueMC(AliRsnEvent *rsn)
{
//
// Loop on event and fill containers
//

   // check presence of MC reference
   if (!rsn->GetRefMC()) {
      AliError("Need a MC to compute efficiency");
      return 0;
   }

   // check event type:
   // must be ESD or AOD, and then use a bool to know in the rest
   if (!rsn->IsESD() && !rsn->IsAOD()) {
      AliError("Need to process ESD or AOD input");
      return 0;
   }

   // retrieve the MC primary vertex position
   // and do some additional coherence checks
   //Double_t fVertex[3] = {0.0, 0.0, 0.0};
   Int_t npart = 0;
   if (rsn->IsESD()) {
      //TArrayF mcVertex(3);
      //AliGenEventHeader *genEH = rsn->GetRefMCESD()->GenEventHeader();
      //genEH->PrimaryVertex(mcVertex);
      //for (i = 0; i < 3; i++) fVertex[i] = (Double_t)mcVertex[i];
      npart = rsn->GetRefMCESD()->GetNumberOfTracks();
   } else {
      //for (i = 0; i < 3; i++) fVertex[i] = 0.0;
      AliAODEvent *aod = rsn->GetRefMCAOD();
      TClonesArray *listAOD = (TClonesArray *)(aod->GetList()->FindObject(AliAODMCParticle::StdBranchName()));
      if (listAOD) npart = listAOD->GetEntries();
      //AliAODMCHeader *mcH = static_cast<AliAODMCHeader*>(aod->FindListObject(AliAODMCHeader::StdBranchName()));
      //if (mcH) mcH->GetVertex(fVertex);
   }

   // check number of particles
   if (!npart) {
      AliInfo("Empty event");
      return 0;
   }

   // utility variables
   Int_t ipart, count = 0;
   AliRsnDaughter check;

   TObjArrayIter next(&fOutputs);
   AliRsnListOutput *out = 0x0;

   // loop over particles
   for (ipart = 0; ipart < npart; ipart++) {
      // check i-th particle
      if (!AssignMotherAndDaughters(rsn, ipart)) continue;
      // if assignment was successful, for first step, use MC info
      fDaughter[0].SetRef(fDaughter[0].GetRefMC());
      fDaughter[1].SetRef(fDaughter[1].GetRefMC());
      fMother.SetRefEvent(rsn);
      fMother.ComputeSum(fPairDef->GetDef1().GetMass(), fPairDef->GetDef2().GetMass(), fPairDef->GetMotherMass());
      // check rapidity range
      if (TMath::Abs(fMother.Rapidity(0)) > fRangeY) {
         AliDebugClass(2, Form("[%s]: Outside rapidity range", GetName()));
         continue;
      }
      if (TMath::Abs(fMother.DCAproduct()) > fRangeDCAproduct) {
         AliDebugClass(2, Form("[%s]: Outside rapidity range", GetName()));
         continue;
      }
      // fill outputs
      next.Reset();
      while ( (out = (AliRsnListOutput *)next()) ) {
         if (out->Fill(&fMother)) count++;
         else AliDebugClass(3, Form("[%s]: failed computation", GetName()));
      }
   }

   return count;
}

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