ROOT logo
//
// Class AliRsnLoopEffPair
//
// Inherits from basic AliRsnLoopEff for efficiency,
// and computed efficiencies for single-tracks
//
// author: Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
//

#include <Riostream.h>

#include "AliStack.h"
#include "AliGenEventHeader.h"
#include "AliAODMCHeader.h"

#include "AliRsnEvent.h"
#include "AliRsnCutManager.h"
#include "AliRsnDaughterDef.h"
#include "AliRsnPairDef.h"
#include "AliRsnLoopEffPair.h"

ClassImp(AliRsnLoopEffPair)

//_____________________________________________________________________________
AliRsnLoopEffPair::AliRsnLoopEffPair(const char *name, AliRsnPairDef *def) :
   AliRsnLoopEff(name, 1),
   fDef(def),
   fMother()
{
//
// Default constructor.
// Do not repeat 'DefineOutput' since it is done in base class and we don't add new ones.
//
}

//_____________________________________________________________________________
AliRsnLoopEffPair::AliRsnLoopEffPair(const AliRsnLoopEffPair &copy) :
   AliRsnLoopEff(copy),
   fDef(copy.fDef),
   fMother(copy.fMother)
{
//
// Copy constrtuctor.
//
}

//_____________________________________________________________________________
AliRsnLoopEffPair &AliRsnLoopEffPair::operator=(const AliRsnLoopEffPair &copy)
{
//
// Assignment operator.
// Owned data members are meaningless for this operator.
//

   AliRsnLoopEff::operator=(copy);
   if (this == &copy)
      return *this;
   fDef = copy.fDef;

   return (*this);
}

//__________________________________________________________________________________________________
Bool_t AliRsnLoopEffPair::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 AliRsnLoopEffPair::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()) != fDef->GetMotherPDG()) return kFALSE;

   // check number of daughters and exit if it is not 2
   if (motherP->GetNDaughters() < 2) 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->GetFirstDaughter(), motherP->GetLastDaughter()};
   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 (fDef->GetDef1().MatchesPDG(pdg) && fDef->GetDef1().MatchesChargeS(charge)) {
         fDaughter[0].SetGood();
         fDaughter[0].SetRefMC(daughter);
         fDaughter[0].SetLabel(index[i]);
      } else if (fDef->GetDef2().MatchesPDG(pdg) && fDef->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 AliRsnLoopEffPair::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);
   Int_t             ntracks = listAOD->GetEntries();

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

   // check number of daughters and exit if it is not 2
   if (mother->GetNDaughters() < 2) 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 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 (fDef->GetDef1().MatchesPDG(pdg) && fDef->GetDef1().MatchesChargeS(charge)) {
         fDaughter[0].SetGood();
         fDaughter[0].SetRefMC(daughter);
         fDaughter[0].SetLabel(index[i]);
      } else if (fDef->GetDef2().MatchesPDG(pdg) && fDef->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 AliRsnLoopEffPair::DoLoop(AliRsnEvent *rsn, AliRsnDaughterSelector *, AliRsnEvent *, AliRsnDaughterSelector *)
{
//
// Loop on event and fill containers
//

   // check event cuts
   if (!OkEvent(rsn)) return 0;

   // retrieve output
   fOutput = (AliRsnListOutput *)fOutputs[0];

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

   // check presence of event
   if (!rsn->GetRef()) {
      AliError("Need an event 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
   Int_t i, 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, istep, count = 0, nsteps = fSteps.GetEntries();
   Int_t ntracks = rsn->GetAbsoluteSum();
   AliRsnDaughter check;

   // 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(fDef->GetDef1().GetMass(), fDef->GetDef2().GetMass(), fDef->GetMotherMass());
      fOutput->Fill(&fMother, 0);
      count++;
      // for each further step, try to find two tracks which pass the related cuts
      for (istep = 0; istep < nsteps; istep++) {
         AliRsnCutManager *cuts = (AliRsnCutManager *)fSteps[istep];
         fDaughter[0].SetBad();
         fDaughter[1].SetBad();
         for (i = 0; i < ntracks; i++) {
            rsn->SetDaughter(check, i);
            if (!cuts->PassCommonDaughterCuts(&check)) continue;
            if (TMath::Abs(check.GetLabel()) == fDaughter[0].GetLabel()) {
               if (!cuts->PassDaughter1Cuts(&check)) continue;
               fDaughter[0].SetRef(check.GetRef());
               fDaughter[0].SetGood();
            } else if (TMath::Abs(check.GetLabel()) == fDaughter[1].GetLabel()) {
               if (!cuts->PassDaughter2Cuts(&check)) continue;
               fDaughter[1].SetRef(check.GetRef());
               fDaughter[1].SetGood();
            }
            if (fDaughter[0].IsOK() && fDaughter[1].IsOK()) {
               fMother.ComputeSum(fDef->GetDef1().GetMass(), fDef->GetDef2().GetMass(), fDef->GetMotherMass());
               if (cuts->PassMotherCuts(&fMother)) {
                  fOutput->Fill(&fMother, 1 + istep);
                  break;
               }
            }
         }
      }
   }

   return count;
}
 AliRsnLoopEffPair.cxx:1
 AliRsnLoopEffPair.cxx:2
 AliRsnLoopEffPair.cxx:3
 AliRsnLoopEffPair.cxx:4
 AliRsnLoopEffPair.cxx:5
 AliRsnLoopEffPair.cxx:6
 AliRsnLoopEffPair.cxx:7
 AliRsnLoopEffPair.cxx:8
 AliRsnLoopEffPair.cxx:9
 AliRsnLoopEffPair.cxx:10
 AliRsnLoopEffPair.cxx:11
 AliRsnLoopEffPair.cxx:12
 AliRsnLoopEffPair.cxx:13
 AliRsnLoopEffPair.cxx:14
 AliRsnLoopEffPair.cxx:15
 AliRsnLoopEffPair.cxx:16
 AliRsnLoopEffPair.cxx:17
 AliRsnLoopEffPair.cxx:18
 AliRsnLoopEffPair.cxx:19
 AliRsnLoopEffPair.cxx:20
 AliRsnLoopEffPair.cxx:21
 AliRsnLoopEffPair.cxx:22
 AliRsnLoopEffPair.cxx:23
 AliRsnLoopEffPair.cxx:24
 AliRsnLoopEffPair.cxx:25
 AliRsnLoopEffPair.cxx:26
 AliRsnLoopEffPair.cxx:27
 AliRsnLoopEffPair.cxx:28
 AliRsnLoopEffPair.cxx:29
 AliRsnLoopEffPair.cxx:30
 AliRsnLoopEffPair.cxx:31
 AliRsnLoopEffPair.cxx:32
 AliRsnLoopEffPair.cxx:33
 AliRsnLoopEffPair.cxx:34
 AliRsnLoopEffPair.cxx:35
 AliRsnLoopEffPair.cxx:36
 AliRsnLoopEffPair.cxx:37
 AliRsnLoopEffPair.cxx:38
 AliRsnLoopEffPair.cxx:39
 AliRsnLoopEffPair.cxx:40
 AliRsnLoopEffPair.cxx:41
 AliRsnLoopEffPair.cxx:42
 AliRsnLoopEffPair.cxx:43
 AliRsnLoopEffPair.cxx:44
 AliRsnLoopEffPair.cxx:45
 AliRsnLoopEffPair.cxx:46
 AliRsnLoopEffPair.cxx:47
 AliRsnLoopEffPair.cxx:48
 AliRsnLoopEffPair.cxx:49
 AliRsnLoopEffPair.cxx:50
 AliRsnLoopEffPair.cxx:51
 AliRsnLoopEffPair.cxx:52
 AliRsnLoopEffPair.cxx:53
 AliRsnLoopEffPair.cxx:54
 AliRsnLoopEffPair.cxx:55
 AliRsnLoopEffPair.cxx:56
 AliRsnLoopEffPair.cxx:57
 AliRsnLoopEffPair.cxx:58
 AliRsnLoopEffPair.cxx:59
 AliRsnLoopEffPair.cxx:60
 AliRsnLoopEffPair.cxx:61
 AliRsnLoopEffPair.cxx:62
 AliRsnLoopEffPair.cxx:63
 AliRsnLoopEffPair.cxx:64
 AliRsnLoopEffPair.cxx:65
 AliRsnLoopEffPair.cxx:66
 AliRsnLoopEffPair.cxx:67
 AliRsnLoopEffPair.cxx:68
 AliRsnLoopEffPair.cxx:69
 AliRsnLoopEffPair.cxx:70
 AliRsnLoopEffPair.cxx:71
 AliRsnLoopEffPair.cxx:72
 AliRsnLoopEffPair.cxx:73
 AliRsnLoopEffPair.cxx:74
 AliRsnLoopEffPair.cxx:75
 AliRsnLoopEffPair.cxx:76
 AliRsnLoopEffPair.cxx:77
 AliRsnLoopEffPair.cxx:78
 AliRsnLoopEffPair.cxx:79
 AliRsnLoopEffPair.cxx:80
 AliRsnLoopEffPair.cxx:81
 AliRsnLoopEffPair.cxx:82
 AliRsnLoopEffPair.cxx:83
 AliRsnLoopEffPair.cxx:84
 AliRsnLoopEffPair.cxx:85
 AliRsnLoopEffPair.cxx:86
 AliRsnLoopEffPair.cxx:87
 AliRsnLoopEffPair.cxx:88
 AliRsnLoopEffPair.cxx:89
 AliRsnLoopEffPair.cxx:90
 AliRsnLoopEffPair.cxx:91
 AliRsnLoopEffPair.cxx:92
 AliRsnLoopEffPair.cxx:93
 AliRsnLoopEffPair.cxx:94
 AliRsnLoopEffPair.cxx:95
 AliRsnLoopEffPair.cxx:96
 AliRsnLoopEffPair.cxx:97
 AliRsnLoopEffPair.cxx:98
 AliRsnLoopEffPair.cxx:99
 AliRsnLoopEffPair.cxx:100
 AliRsnLoopEffPair.cxx:101
 AliRsnLoopEffPair.cxx:102
 AliRsnLoopEffPair.cxx:103
 AliRsnLoopEffPair.cxx:104
 AliRsnLoopEffPair.cxx:105
 AliRsnLoopEffPair.cxx:106
 AliRsnLoopEffPair.cxx:107
 AliRsnLoopEffPair.cxx:108
 AliRsnLoopEffPair.cxx:109
 AliRsnLoopEffPair.cxx:110
 AliRsnLoopEffPair.cxx:111
 AliRsnLoopEffPair.cxx:112
 AliRsnLoopEffPair.cxx:113
 AliRsnLoopEffPair.cxx:114
 AliRsnLoopEffPair.cxx:115
 AliRsnLoopEffPair.cxx:116
 AliRsnLoopEffPair.cxx:117
 AliRsnLoopEffPair.cxx:118
 AliRsnLoopEffPair.cxx:119
 AliRsnLoopEffPair.cxx:120
 AliRsnLoopEffPair.cxx:121
 AliRsnLoopEffPair.cxx:122
 AliRsnLoopEffPair.cxx:123
 AliRsnLoopEffPair.cxx:124
 AliRsnLoopEffPair.cxx:125
 AliRsnLoopEffPair.cxx:126
 AliRsnLoopEffPair.cxx:127
 AliRsnLoopEffPair.cxx:128
 AliRsnLoopEffPair.cxx:129
 AliRsnLoopEffPair.cxx:130
 AliRsnLoopEffPair.cxx:131
 AliRsnLoopEffPair.cxx:132
 AliRsnLoopEffPair.cxx:133
 AliRsnLoopEffPair.cxx:134
 AliRsnLoopEffPair.cxx:135
 AliRsnLoopEffPair.cxx:136
 AliRsnLoopEffPair.cxx:137
 AliRsnLoopEffPair.cxx:138
 AliRsnLoopEffPair.cxx:139
 AliRsnLoopEffPair.cxx:140
 AliRsnLoopEffPair.cxx:141
 AliRsnLoopEffPair.cxx:142
 AliRsnLoopEffPair.cxx:143
 AliRsnLoopEffPair.cxx:144
 AliRsnLoopEffPair.cxx:145
 AliRsnLoopEffPair.cxx:146
 AliRsnLoopEffPair.cxx:147
 AliRsnLoopEffPair.cxx:148
 AliRsnLoopEffPair.cxx:149
 AliRsnLoopEffPair.cxx:150
 AliRsnLoopEffPair.cxx:151
 AliRsnLoopEffPair.cxx:152
 AliRsnLoopEffPair.cxx:153
 AliRsnLoopEffPair.cxx:154
 AliRsnLoopEffPair.cxx:155
 AliRsnLoopEffPair.cxx:156
 AliRsnLoopEffPair.cxx:157
 AliRsnLoopEffPair.cxx:158
 AliRsnLoopEffPair.cxx:159
 AliRsnLoopEffPair.cxx:160
 AliRsnLoopEffPair.cxx:161
 AliRsnLoopEffPair.cxx:162
 AliRsnLoopEffPair.cxx:163
 AliRsnLoopEffPair.cxx:164
 AliRsnLoopEffPair.cxx:165
 AliRsnLoopEffPair.cxx:166
 AliRsnLoopEffPair.cxx:167
 AliRsnLoopEffPair.cxx:168
 AliRsnLoopEffPair.cxx:169
 AliRsnLoopEffPair.cxx:170
 AliRsnLoopEffPair.cxx:171
 AliRsnLoopEffPair.cxx:172
 AliRsnLoopEffPair.cxx:173
 AliRsnLoopEffPair.cxx:174
 AliRsnLoopEffPair.cxx:175
 AliRsnLoopEffPair.cxx:176
 AliRsnLoopEffPair.cxx:177
 AliRsnLoopEffPair.cxx:178
 AliRsnLoopEffPair.cxx:179
 AliRsnLoopEffPair.cxx:180
 AliRsnLoopEffPair.cxx:181
 AliRsnLoopEffPair.cxx:182
 AliRsnLoopEffPair.cxx:183
 AliRsnLoopEffPair.cxx:184
 AliRsnLoopEffPair.cxx:185
 AliRsnLoopEffPair.cxx:186
 AliRsnLoopEffPair.cxx:187
 AliRsnLoopEffPair.cxx:188
 AliRsnLoopEffPair.cxx:189
 AliRsnLoopEffPair.cxx:190
 AliRsnLoopEffPair.cxx:191
 AliRsnLoopEffPair.cxx:192
 AliRsnLoopEffPair.cxx:193
 AliRsnLoopEffPair.cxx:194
 AliRsnLoopEffPair.cxx:195
 AliRsnLoopEffPair.cxx:196
 AliRsnLoopEffPair.cxx:197
 AliRsnLoopEffPair.cxx:198
 AliRsnLoopEffPair.cxx:199
 AliRsnLoopEffPair.cxx:200
 AliRsnLoopEffPair.cxx:201
 AliRsnLoopEffPair.cxx:202
 AliRsnLoopEffPair.cxx:203
 AliRsnLoopEffPair.cxx:204
 AliRsnLoopEffPair.cxx:205
 AliRsnLoopEffPair.cxx:206
 AliRsnLoopEffPair.cxx:207
 AliRsnLoopEffPair.cxx:208
 AliRsnLoopEffPair.cxx:209
 AliRsnLoopEffPair.cxx:210
 AliRsnLoopEffPair.cxx:211
 AliRsnLoopEffPair.cxx:212
 AliRsnLoopEffPair.cxx:213
 AliRsnLoopEffPair.cxx:214
 AliRsnLoopEffPair.cxx:215
 AliRsnLoopEffPair.cxx:216
 AliRsnLoopEffPair.cxx:217
 AliRsnLoopEffPair.cxx:218
 AliRsnLoopEffPair.cxx:219
 AliRsnLoopEffPair.cxx:220
 AliRsnLoopEffPair.cxx:221
 AliRsnLoopEffPair.cxx:222
 AliRsnLoopEffPair.cxx:223
 AliRsnLoopEffPair.cxx:224
 AliRsnLoopEffPair.cxx:225
 AliRsnLoopEffPair.cxx:226
 AliRsnLoopEffPair.cxx:227
 AliRsnLoopEffPair.cxx:228
 AliRsnLoopEffPair.cxx:229
 AliRsnLoopEffPair.cxx:230
 AliRsnLoopEffPair.cxx:231
 AliRsnLoopEffPair.cxx:232
 AliRsnLoopEffPair.cxx:233
 AliRsnLoopEffPair.cxx:234
 AliRsnLoopEffPair.cxx:235
 AliRsnLoopEffPair.cxx:236
 AliRsnLoopEffPair.cxx:237
 AliRsnLoopEffPair.cxx:238
 AliRsnLoopEffPair.cxx:239
 AliRsnLoopEffPair.cxx:240
 AliRsnLoopEffPair.cxx:241
 AliRsnLoopEffPair.cxx:242
 AliRsnLoopEffPair.cxx:243
 AliRsnLoopEffPair.cxx:244
 AliRsnLoopEffPair.cxx:245
 AliRsnLoopEffPair.cxx:246
 AliRsnLoopEffPair.cxx:247
 AliRsnLoopEffPair.cxx:248
 AliRsnLoopEffPair.cxx:249
 AliRsnLoopEffPair.cxx:250
 AliRsnLoopEffPair.cxx:251
 AliRsnLoopEffPair.cxx:252
 AliRsnLoopEffPair.cxx:253
 AliRsnLoopEffPair.cxx:254
 AliRsnLoopEffPair.cxx:255
 AliRsnLoopEffPair.cxx:256
 AliRsnLoopEffPair.cxx:257
 AliRsnLoopEffPair.cxx:258
 AliRsnLoopEffPair.cxx:259
 AliRsnLoopEffPair.cxx:260
 AliRsnLoopEffPair.cxx:261
 AliRsnLoopEffPair.cxx:262
 AliRsnLoopEffPair.cxx:263
 AliRsnLoopEffPair.cxx:264
 AliRsnLoopEffPair.cxx:265
 AliRsnLoopEffPair.cxx:266
 AliRsnLoopEffPair.cxx:267
 AliRsnLoopEffPair.cxx:268
 AliRsnLoopEffPair.cxx:269
 AliRsnLoopEffPair.cxx:270
 AliRsnLoopEffPair.cxx:271
 AliRsnLoopEffPair.cxx:272
 AliRsnLoopEffPair.cxx:273
 AliRsnLoopEffPair.cxx:274
 AliRsnLoopEffPair.cxx:275
 AliRsnLoopEffPair.cxx:276
 AliRsnLoopEffPair.cxx:277
 AliRsnLoopEffPair.cxx:278
 AliRsnLoopEffPair.cxx:279
 AliRsnLoopEffPair.cxx:280
 AliRsnLoopEffPair.cxx:281
 AliRsnLoopEffPair.cxx:282
 AliRsnLoopEffPair.cxx:283
 AliRsnLoopEffPair.cxx:284
 AliRsnLoopEffPair.cxx:285
 AliRsnLoopEffPair.cxx:286
 AliRsnLoopEffPair.cxx:287
 AliRsnLoopEffPair.cxx:288
 AliRsnLoopEffPair.cxx:289
 AliRsnLoopEffPair.cxx:290
 AliRsnLoopEffPair.cxx:291
 AliRsnLoopEffPair.cxx:292
 AliRsnLoopEffPair.cxx:293
 AliRsnLoopEffPair.cxx:294
 AliRsnLoopEffPair.cxx:295
 AliRsnLoopEffPair.cxx:296
 AliRsnLoopEffPair.cxx:297
 AliRsnLoopEffPair.cxx:298
 AliRsnLoopEffPair.cxx:299
 AliRsnLoopEffPair.cxx:300
 AliRsnLoopEffPair.cxx:301
 AliRsnLoopEffPair.cxx:302
 AliRsnLoopEffPair.cxx:303
 AliRsnLoopEffPair.cxx:304
 AliRsnLoopEffPair.cxx:305
 AliRsnLoopEffPair.cxx:306
 AliRsnLoopEffPair.cxx:307
 AliRsnLoopEffPair.cxx:308
 AliRsnLoopEffPair.cxx:309
 AliRsnLoopEffPair.cxx:310
 AliRsnLoopEffPair.cxx:311
 AliRsnLoopEffPair.cxx:312
 AliRsnLoopEffPair.cxx:313
 AliRsnLoopEffPair.cxx:314
 AliRsnLoopEffPair.cxx:315
 AliRsnLoopEffPair.cxx:316
 AliRsnLoopEffPair.cxx:317
 AliRsnLoopEffPair.cxx:318
 AliRsnLoopEffPair.cxx:319
 AliRsnLoopEffPair.cxx:320
 AliRsnLoopEffPair.cxx:321
 AliRsnLoopEffPair.cxx:322
 AliRsnLoopEffPair.cxx:323
 AliRsnLoopEffPair.cxx:324
 AliRsnLoopEffPair.cxx:325
 AliRsnLoopEffPair.cxx:326
 AliRsnLoopEffPair.cxx:327
 AliRsnLoopEffPair.cxx:328
 AliRsnLoopEffPair.cxx:329
 AliRsnLoopEffPair.cxx:330
 AliRsnLoopEffPair.cxx:331
 AliRsnLoopEffPair.cxx:332
 AliRsnLoopEffPair.cxx:333