ROOT logo
/*************************************************************************
* Copyright(c) 1998-2009, 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.                  *
**************************************************************************/

//#####################################################
//#                                                   # 
//#              Class AliDielectronMC                #
//#       Cut Class for Jpsi->e+e- analysis           #
//#                                                   #
//#   by WooJin J. Park, GSI / W.J.Park@gsi.de        #
//#                                                   #
//#####################################################

#include <AliAnalysisManager.h>
#include <AliAODHandler.h>
#include <AliESDInputHandler.h>
#include <AliAODInputHandler.h>
#include <AliMCEventHandler.h>
#include <AliMCEvent.h>
#include <AliMCParticle.h>
#include <AliAODMCParticle.h>
#include <AliAODMCHeader.h>
#include <AliStack.h>
#include <AliESDEvent.h>
#include <AliAODEvent.h>
#include <AliESDtrack.h>
#include <AliAODTrack.h>
#include <AliLog.h>

#include <TClonesArray.h>
#include <TParticle.h>
#include <TMCProcess.h>

#include "AliDielectronSignalMC.h"
#include "AliDielectronMC.h"


ClassImp(AliDielectronMC)

AliDielectronMC* AliDielectronMC::fgInstance=0x0;

//____________________________________________________________
AliDielectronMC* AliDielectronMC::Instance()
{
  //
  // return pointer to singleton implementation
  //
  if (fgInstance) return fgInstance;

  AnalysisType type=kUNSET;
  Bool_t hasMC=kFALSE;
  if (AliAnalysisManager::GetAnalysisManager()){
    if (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->IsA()==AliESDInputHandler::Class()) type=kESD;
    else if (AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler()->IsA()==AliAODInputHandler::Class()) type=kAOD;

    AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
    if(type == kESD) hasMC=mcHandler!=0x0;
    }
 
  fgInstance=new AliDielectronMC(type);
 
  fgInstance->SetHasMC(hasMC);
   
  return fgInstance;
}

//____________________________________________________________
AliDielectronMC::AliDielectronMC(AnalysisType type):
  fMCEvent(0x0),
  fStack(0x0),
  fAnaType(type),
  fHasMC(kTRUE),
  fMcArray(0x0)
{
  //
  // default constructor
  //
}


//____________________________________________________________
AliDielectronMC::~AliDielectronMC()
{
  //
  // default destructor
  //
  
}

//____________________________________________________________
void AliDielectronMC::Initialize()
{
  //
  // initialize MC class
  //
  if (!ConnectMCEvent()) AliError("Initialization of MC object failed!");
}

//____________________________________________________________
Int_t AliDielectronMC::GetNMCTracks()
{
  //
  //  return the number of generated tracks from MC event
  //
  if(fAnaType == kESD){
    if (!fMCEvent){ AliError("No fMCEvent"); return 0; }
    return fMCEvent->GetNumberOfTracks();}
  else if(fAnaType == kAOD){
    if(!fMcArray) { AliError("No fMcArray"); return 0; }
    return fMcArray->GetEntriesFast();
  }
  return 0;
}

//____________________________________________________________
Int_t AliDielectronMC::GetNMCTracksFromStack()
{
  //
  //  return the number of generated tracks from stack
  //
  if (!fStack){ AliError("No fStack"); return -999; }
  return fStack->GetNtrack();
}

//____________________________________________________________
Int_t AliDielectronMC::GetNPrimary() const
{
  //
  //  return the number of primary track from MC event
  //
  if (!fMCEvent){ AliError("No fMCEvent"); return 0; }
  return fMCEvent->GetNumberOfPrimaries();
}

//____________________________________________________________
Int_t AliDielectronMC::GetNPrimaryFromStack()
{
  //
  //  return the number of primary track from stack
  //
  if (!fStack){ AliError("No fStack"); return -999; }
  return fStack->GetNprimary();
}

//____________________________________________________________
AliVParticle* AliDielectronMC::GetMCTrackFromMCEvent(Int_t label) const
{
  //
  // return MC track directly from MC event
  // used not only for tracks but for mothers as well, therefore do not use abs(label)
  //
  if (label<0) return NULL;
  AliVParticle * track=0x0;
  if(fAnaType == kESD){
    if (!fMCEvent){ AliError("No fMCEvent"); return NULL;}
    track = fMCEvent->GetTrack(label); //  tracks from MC event (ESD)
  } else if(fAnaType == kAOD) {
    if (!fMcArray){ AliError("No fMcArray"); return NULL;}
    if (label>fMcArray->GetEntriesFast()) { AliDebug(10,Form("track %d out of array size %d",label,fMcArray->GetEntriesFast())); return NULL;}
    track = (AliVParticle*)fMcArray->At(label); //  tracks from MC event (AOD)
  }
  return track;
}

//____________________________________________________________
Bool_t AliDielectronMC::ConnectMCEvent()
{
  //
  // connect stack object from the mc handler
  //

  fMcArray = 0x0;
  fMCEvent = 0x0;
  
  if(fAnaType == kESD){
    AliMCEventHandler* mcHandler = dynamic_cast<AliMCEventHandler*> (AliAnalysisManager::GetAnalysisManager()->GetMCtruthEventHandler());
    if (!mcHandler){ /*AliError("Could not retrive MC event handler!");*/ return kFALSE; }
    if (!mcHandler->InitOk() ) return kFALSE;
    if (!mcHandler->TreeK() )  return kFALSE;
    if (!mcHandler->TreeTR() ) return kFALSE;
    
    AliMCEvent* mcEvent = mcHandler->MCEvent();
    if (!mcEvent){ /*AliError("Could not retrieve MC event!");*/ return kFALSE; }
    fMCEvent = mcEvent;
    
    if (!UpdateStack()) return kFALSE;
  }
  else if(fAnaType == kAOD)
  {
    AliAODInputHandler* aodHandler=(AliAODInputHandler*)(AliAnalysisManager::GetAnalysisManager()->GetInputEventHandler());
    if (!aodHandler) return kFALSE;
    AliAODEvent *aod=aodHandler->GetEvent();
    if (!aod) return kFALSE;

    fMcArray = dynamic_cast<TClonesArray*>(aod->FindListObject(AliAODMCParticle::StdBranchName()));
    if (!fMcArray){ /*AliError("Could not retrieve MC array!");*/ return kFALSE; }
    else fHasMC=kTRUE;
  }
  return kTRUE;
}

//____________________________________________________________
Bool_t AliDielectronMC::UpdateStack()
{
  //
  // update stack with new event
  //
  if (!fMCEvent){ AliError("No fMCEvent"); return kFALSE;}
  AliStack* stack = fMCEvent->Stack();
  if (!stack){ AliError("Could not retrive stack!"); return kFALSE; }
  fStack = stack;
  return kTRUE;
}

//____________________________________________________________
AliMCParticle* AliDielectronMC::GetMCTrack( const AliESDtrack* _track)
{
  //
  // return MC track
  //
  if (!fMCEvent){ AliError("No fMCEvent"); return NULL;}
  Int_t nStack = fMCEvent->GetNumberOfTracks();
  Int_t label  = TMath::Abs(_track->GetLabel()); // negative label indicate poor matching quality
  if(label>nStack)return NULL;
  AliMCParticle *mctrack = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(label));
  return mctrack;
}


//____________________________________________________________
AliAODMCParticle* AliDielectronMC::GetMCTrack( const AliAODTrack* _track)
{
  //
  // return MC track
  //
 if(!fMcArray) { AliError("No fMcArray"); return NULL;}
 Int_t nStack = fMcArray->GetEntriesFast();
 Int_t label  = TMath::Abs(_track->GetLabel()); // negative label indicate poor matching quality
 if(label > nStack) return NULL;
 AliAODMCParticle *mctrack = (AliAODMCParticle*)fMcArray->At(label);
 return mctrack; 
}

//____________________________________________________________
TParticle* AliDielectronMC::GetMCTrackFromStack(const AliESDtrack* _track)
{
  //
  // return MC track from stack
  //
  Int_t label = TMath::Abs(_track->GetLabel());
  if (!fStack) AliWarning("fStack is not available. Update stack first.");
  TParticle* mcpart = fStack->Particle(label);
  if (!mcpart) return NULL;
  return mcpart;
}

//____________________________________________________________
AliMCParticle* AliDielectronMC::GetMCTrackMother(const AliESDtrack* _track)
{
  //
  // return MC track mother
  //
  AliMCParticle* mcpart = GetMCTrack(_track);
  if (!mcpart) return NULL;
  if(mcpart->GetMother()<0) return NULL;
  AliMCParticle* mcmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(mcpart->GetMother()));
  if (!mcmother) return NULL;
  return mcmother;
}

//______________________________________________________________
AliAODMCParticle* AliDielectronMC::GetMCTrackMother(const AliAODTrack* _track)
{
 //
 // return MC track mother
 //
 AliAODMCParticle* mcpart = GetMCTrack(_track);
 if (!mcpart) return NULL;
 if(mcpart->GetMother() < 0) return NULL;
 AliAODMCParticle* mcmother = dynamic_cast<AliAODMCParticle *>(fMcArray->At(mcpart->GetMother()));
 if (!mcmother) return NULL;
 return mcmother;
}
//____________________________________________________________
AliMCParticle* AliDielectronMC::GetMCTrackMother(const AliMCParticle* _particle){
  //
  // return MC track mother
  //
  if(_particle->GetMother() < 0) return NULL;
  AliMCParticle* mcmother = dynamic_cast<AliMCParticle *>(fMCEvent->GetTrack(_particle->GetMother()));
  return mcmother;
}

//____________________________________________________________
AliAODMCParticle* AliDielectronMC::GetMCTrackMother(const AliAODMCParticle* _particle){
  //
  // return MC track mother
  //
  if( _particle->GetMother() < 0) return NULL;
  AliAODMCParticle* mcmother = dynamic_cast<AliAODMCParticle *>(fMcArray->At(_particle->GetMother()));
  return mcmother;
}

//____________________________________________________________
TParticle* AliDielectronMC::GetMCTrackMotherFromStack(const AliESDtrack* _track)
{
  //
  // return MC track mother from stack
  //
  TParticle* mcpart = GetMCTrackFromStack(_track);
  if ( !mcpart || mcpart->GetFirstMother()<=0 ) return NULL; 
  TParticle* mcmother = fStack->Particle(mcpart->GetFirstMother());
  if (!mcmother) return NULL;
  return mcmother;
}

//____________________________________________________________
Int_t AliDielectronMC::GetMCPID(const AliESDtrack* _track)
{
  //
  // return PDG code of the track from the MC truth info
  //
  AliMCParticle* mcpart = GetMCTrack(_track);
  if (!mcpart) return -999;
  return mcpart->PdgCode();
}

//__________________________________________________________
Int_t AliDielectronMC::GetMCPID(const AliAODTrack* _track)
{
 //
 // return PDG code of the track from the MC truth info
 //
 AliAODMCParticle* mcpart = GetMCTrack(_track);
 if (!mcpart) return -999;
 return mcpart->PdgCode();
}

//____________________________________________________________
Int_t AliDielectronMC::GetMCPIDFromStack(const AliESDtrack* _track)
{
  // 
  // return MC PDG code from stack
  //
  TParticle* mcpart = GetMCTrackFromStack(_track);
  if (!mcpart) return -999;
  return mcpart->GetPdgCode();
}

//____________________________________________________________
Int_t AliDielectronMC::GetMotherPDG( const AliESDtrack* _track)
{
  //
  // return PDG code of the mother track from the MC truth info
  //
  AliMCParticle* mcmother = GetMCTrackMother(_track);
  if (!mcmother) return -999;
  return mcmother->PdgCode();
}

//________________________________________________________
Int_t AliDielectronMC::GetMotherPDG( const AliAODTrack* _track)
{
  //
  // return PDG code of the mother track from the MC truth info
  //
  AliAODMCParticle* mcmother = GetMCTrackMother(_track);
  if (!mcmother) return -999;
  return mcmother->PdgCode();
}

//________________________________________________________
Int_t AliDielectronMC::GetMotherPDG( const AliMCParticle* _track)
{
  //
  // return PDG code of the mother track from the MC truth info
  //
  AliMCParticle* mcmother = GetMCTrackMother(_track);
  if (!mcmother) return -999;
  return mcmother->PdgCode();
}

//________________________________________________________
Int_t AliDielectronMC::GetMotherPDG( const AliAODMCParticle* _track)
{
  //
  // return PDG code of the mother track from the MC truth info
  //
  AliAODMCParticle* mcmother = GetMCTrackMother(_track);
  if (!mcmother) return -999;
  return mcmother->PdgCode();
}

//____________________________________________________________
Int_t AliDielectronMC::GetMotherPDGFromStack(const AliESDtrack* _track)
{
  //
  // return PDG code of the mother track from stack
  //
  TParticle* mcmother = GetMCTrackMotherFromStack(_track);
  if (!mcmother) return -999;
  return mcmother->GetPdgCode();
}

//____________________________________________________________
Int_t AliDielectronMC::GetMCProcess(const AliESDtrack* _track)
{
  //
  // return process number of the track
  //
  AliMCParticle* mcpart = GetMCTrack(_track);
  if (!mcpart) return -999;
  return 0;
}

//____________________________________________________________
Int_t AliDielectronMC::GetMCProcessFromStack(const AliESDtrack* _track)
{
  //
  // return process number of the track
  //
  TParticle* mcpart = GetMCTrackFromStack(_track);
  if (!mcpart) return -999;
  return mcpart->GetUniqueID();
}

//____________________________________________________________
Int_t AliDielectronMC::NumberOfDaughters(const AliESDtrack* track)
{
  //
  // returns the number of daughters
  //
  AliMCParticle *mcmother=GetMCTrackMother(track);
  if(!mcmother||!mcmother->Particle()) return -999;
  //   return mcmother->GetFirstDaughter()>0?mcmother->GetLastDaughter()-mcmother->GetFirstDaughter()+1:0;
  return mcmother->Particle()->GetNDaughters();
}

//_________________________________________________________
Int_t AliDielectronMC::NumberOfDaughters(const AliAODTrack* track)
{
  //
  // returns the number of daughters
  //
  AliAODMCParticle *mcmother=GetMCTrackMother(track);
  if(!mcmother) return -999;
  return NumberOfDaughters(mcmother);  

}

//____________________________________________________________
Int_t AliDielectronMC::NumberOfDaughters(const AliMCParticle* particle)
{
  //
  // returns the number of daughters
  //
  AliMCParticle *mcmother=GetMCTrackMother(particle);
  if(!mcmother||!mcmother->Particle()) return -999;
  //return mcmother->GetFirstDaughter()>0?mcmother->GetLastDaughter()-mcmother->GetFirstDaughter()+1:0;
  return mcmother->Particle()->GetNDaughters();
}

//____________________________________________________________
Int_t AliDielectronMC::NumberOfDaughters(const AliAODMCParticle* particle)
{
  //
  // returns the number of daughters
  //
  AliAODMCParticle *mcmother=GetMCTrackMother(particle);
  if(!mcmother) return -999;
  return mcmother->GetNDaughters();
}

//____________________________________________________________
Int_t AliDielectronMC::GetMCProcessMother(const AliESDtrack* _track)
{
  //
  // return process number of the mother of the track
  //
  AliMCParticle* mcmother = GetMCTrackMother(_track);
  if (!mcmother) return -999;
  return 0;
}

//____________________________________________________________
Int_t AliDielectronMC::GetMCProcessMotherFromStack(const AliESDtrack* _track)
{
  //
  // return process number of the mother of the track
  //
  TParticle* mcmother = GetMCTrackMotherFromStack(_track);
  if (!mcmother) return -999;
  return mcmother->GetUniqueID();
}

//____________________________________________________________
Bool_t AliDielectronMC::IsMCMotherToEE(const AliVParticle *particle, Int_t pdgMother)
{
  //
  // Check if the Mother 'particle' is of type pdgMother and decays to e+e-
  //
  if (fAnaType==kESD && !fMCEvent) return kFALSE;
  if (fAnaType==kAOD && !fMcArray) return kFALSE;
  if (!particle) return kFALSE;
  
  if (particle->IsA()==AliMCParticle::Class()){
    return IsMCMotherToEEesd(static_cast<const AliMCParticle*>(particle),pdgMother);
  } else if (particle->IsA()==AliAODMCParticle::Class()){
   return IsMCMotherToEEaod(static_cast<const AliAODMCParticle*>(particle),pdgMother);
  } else {
    AliError("Unknown particle type");
  }
  return kFALSE;
}

//____________________________________________________________
Bool_t AliDielectronMC::IsMCMotherToEEesd(const AliMCParticle *particle, Int_t pdgMother)
{
  //
  // Check if the Mother 'particle' is of type pdgMother and decays to e+e-
  // ESD case
  //
  
  //check pdg code
  if (particle->PdgCode()!=pdgMother) return kFALSE;
  Int_t ifirst = particle->GetFirstDaughter();
  Int_t ilast  = particle->GetLastDaughter();
  
  //check number of daughters
  if ((ilast-ifirst)!=1) return kFALSE;
  AliMCParticle *firstD=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(ifirst));
  AliMCParticle *secondD=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(ilast));

  //TODO: check how you can get rid of the hardcoded numbers. One should make use of the PdgCodes set in AliDielectron!!!
  if (firstD->Charge()>0){
    if (firstD->PdgCode()!=-11) return kFALSE;
    if (secondD->PdgCode()!=11) return kFALSE;
  }else{
    if (firstD->PdgCode()!=11) return kFALSE;
    if (secondD->PdgCode()!=-11) return kFALSE;
  }
  
  return kTRUE;
}

//____________________________________________________________
Bool_t AliDielectronMC::IsMCMotherToEEaod(const AliAODMCParticle *particle, Int_t pdgMother)
{
  //
  // Check if the Mother 'particle' is of type pdgMother and decays to e+e-
  // AOD case
  //

  if (particle->GetPdgCode()!=pdgMother) return kFALSE;
  if (particle->GetNDaughters()!=2) return kFALSE;
 
  Int_t ifirst = particle->GetDaughter(0);
  Int_t ilast  = particle->GetDaughter(1);
  
  //check number of daughters
  if ((ilast-ifirst)!=1) return kFALSE;
  
  AliAODMCParticle *firstD=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(ifirst));
  AliAODMCParticle *secondD=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(ilast));
   
  //TODO: check how you can get rid of the hardcoded numbers. One should make use of the PdgCodes set in AliDielectron!!!
 
  if (firstD->Charge()>0){
    if (firstD->GetPdgCode()!=-11) return kFALSE;
    if (secondD->GetPdgCode()!=11) return kFALSE;
  }else{
    if (firstD->GetPdgCode()!=11) return kFALSE;
    if (secondD->GetPdgCode()!=-11) return kFALSE;
  }
  return kTRUE;
}

//____________________________________________________________
Int_t AliDielectronMC::GetLabelMotherWithPdg(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
{
  //
  // test if mother of particle 1 and 2 has pdgCode pdgMother and is the same;
  //
  if (fAnaType==kESD){
  if (!fMCEvent) return -1;
  return GetLabelMotherWithPdgESD(particle1, particle2, pdgMother);
  }
  else if (fAnaType==kAOD)
  {
  if (!fMcArray) return -1;
  return GetLabelMotherWithPdgAOD(particle1, particle2, pdgMother);
  }  

  return -1;
}

//____________________________________________________________
Int_t AliDielectronMC::GetLabelMotherWithPdgESD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
{
  //
  // test if mother of particle 1 and 2 has pdgCode +-11 (electron),
  //    have the same mother and the mother had pdg code pdgMother
  // ESD case
  //TODO: check how you can get rid of the hardcoded numbers. One should make use of the PdgCodes set in AliDielectron!!!
  //
  // negative label indicate poor matching quality
  Int_t lblPart1 = TMath::Abs(particle1->GetLabel());
  Int_t lblPart2 = TMath::Abs(particle2->GetLabel());
  AliMCParticle *mcPart1=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(lblPart1));
  AliMCParticle *mcPart2=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(lblPart2));
  
  if (!mcPart1||!mcPart2) return -1;
  
  Int_t lblMother1=mcPart1->GetMother();
  Int_t lblMother2=mcPart2->GetMother();
  AliMCParticle *mcMother1=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(lblMother1));

  if (!mcMother1) return -1;
  if (lblMother1!=lblMother2) return -1;
  if (TMath::Abs(mcPart1->PdgCode())!=11) return -1;
  if (mcPart1->PdgCode()!=-mcPart2->PdgCode()) return -1;
  if (mcMother1->PdgCode()!=pdgMother) return -1;
  
  return lblMother1;
}

//____________________________________________________________
Int_t AliDielectronMC::GetLabelMotherWithPdgAOD(const AliVParticle *particle1, const AliVParticle *particle2, Int_t pdgMother)
{
  //
  // test if mother of particle 1 and 2 has pdgCode +-11 (electron),
  //    have the same mother and the mother had pdg code pdgMother
  // AOD case
  //TODO: check how you can get rid of the hardcoded numbers. One should make use of the PdgCodes set in AliDielectron!!!
  //
  // negative label indicate poor matching quality
  Int_t lblPart1 = TMath::Abs(particle1->GetLabel());
  Int_t lblPart2 = TMath::Abs(particle2->GetLabel());
  AliAODMCParticle *mcPart1=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(lblPart1));
  AliAODMCParticle *mcPart2=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(lblPart2));
  
  if (!mcPart1||!mcPart2) return -1;
  
  Int_t lblMother1=mcPart1->GetMother();
  Int_t lblMother2=mcPart2->GetMother();
  AliAODMCParticle *mcMother1=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(lblMother1));
  
  if (!mcMother1) return -1;
  if (lblMother1!=lblMother2) return -1;
  if (TMath::Abs(mcPart1->GetPdgCode())!=11) return -1;
  if (mcPart1->GetPdgCode()!=-mcPart2->GetPdgCode()) return -1;
  if (mcMother1->GetPdgCode()!=pdgMother) return -1;
  
  return lblMother1;
}

//____________________________________________________________
void AliDielectronMC::GetDaughters(const TObject *mother, AliVParticle* &d1, AliVParticle* &d2)
{
  //
  // Get First two daughters of the mother
  //
  Int_t lblD1=-1;
  Int_t lblD2=-1;
  d1=0;
  d2=0;
  if (fAnaType==kAOD){
    if(!fMcArray) return;
    const AliAODMCParticle *aodMother=static_cast<const AliAODMCParticle*>(mother);
    lblD1=aodMother->GetDaughter(0);
    lblD2=aodMother->GetDaughter(1);
    d1 = (AliVParticle*)fMcArray->At(lblD1);
    d2 = (AliVParticle*)fMcArray->At(lblD2);
   } else if (fAnaType==kESD){
    if (!fMCEvent) return;
    const AliMCParticle *aodMother=static_cast<const AliMCParticle*>(mother);
    lblD1=aodMother->GetFirstDaughter();
    lblD2=aodMother->GetLastDaughter();
    d1=fMCEvent->GetTrack(lblD1);
    d2=fMCEvent->GetTrack(lblD2);
   }
}


//________________________________________________________________________________
Int_t AliDielectronMC::GetMothersLabel(Int_t daughterLabel) const {
  //
  //  Get the label of the mother for particle with label daughterLabel
  //  NOTE: for tracks, the absolute label should be passed
  //
  if(daughterLabel<0) return -1;
  if (fAnaType==kAOD) {
    if(!fMcArray) return -1;
    if(GetMCTrackFromMCEvent(daughterLabel))
      return (static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(daughterLabel)))->GetMother();
  } else if(fAnaType==kESD) {
    if (!fMCEvent) return -1;
    if(GetMCTrackFromMCEvent(daughterLabel))
      return (static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(daughterLabel)))->GetMother();
  }
  return -1;
}


//________________________________________________________________________________
Int_t AliDielectronMC::GetPdgFromLabel(Int_t label) const {
  //
  //  Get particle code using the label from stack
  //  NOTE: for tracks, the absolute label should be passed
  //
  if(label<0) return 0;
  if(fAnaType==kAOD) {
    if(!fMcArray) return 0;
    return (static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(label)))->PdgCode();
  } else if(fAnaType==kESD) {
    if (!fMCEvent) return 0;
    return (static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(label)))->PdgCode();
  }
  return 0;
}


//________________________________________________________________________________
Bool_t AliDielectronMC::ComparePDG(Int_t particlePDG, Int_t requiredPDG, Bool_t pdgExclusion, Bool_t checkBothCharges) const {
  //
  //  Test the PDG codes of particles with the required ones
  //
  Bool_t result = kTRUE;
  Int_t absRequiredPDG = TMath::Abs(requiredPDG);

  switch(absRequiredPDG) {
  case 0:
    result = kTRUE;    // PDG not required (any code will do fine)
    break;
  case 100:     // light flavoured mesons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=100 && TMath::Abs(particlePDG)<=199;
    else {
      if(requiredPDG>0) result = particlePDG>=100 && particlePDG<=199;
      if(requiredPDG<0) result = particlePDG>=-199 && particlePDG<=-100;
    }
    break;
  case 1000:     // light flavoured baryons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=1000 && TMath::Abs(particlePDG)<=1999;
    else {
      if(requiredPDG>0) result = particlePDG>=1000 && particlePDG<=1999;
      if(requiredPDG<0) result = particlePDG>=-1999 && particlePDG<=-1000;
    }
    break;
  case 200:     // light flavoured mesons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=200 && TMath::Abs(particlePDG)<=299;
    else {
      if(requiredPDG>0)result = particlePDG>=200 && particlePDG<=299;
      if(requiredPDG<0)result = particlePDG>=-299 && particlePDG<=-200;
    }
    break;
  case 2000:     // light flavoured baryons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=2000 && TMath::Abs(particlePDG)<=2999;
    else {
      if(requiredPDG>0) result = particlePDG>=2000 && particlePDG<=2999;
      if(requiredPDG<0) result = particlePDG>=-2999 && particlePDG<=-2000;
    }
    break;
  case 300:     // all strange mesons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=300 && TMath::Abs(particlePDG)<=399;
    else {
      if(requiredPDG>0) result = particlePDG>=300 && particlePDG<=399;
      if(requiredPDG<0) result = particlePDG>=-399 && particlePDG<=-300;
    }
    break;
  case 3000:     // all strange baryons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=3000 && TMath::Abs(particlePDG)<=3999;
    else {
      if(requiredPDG>0) result = particlePDG>=3000 && particlePDG<=3999;
      if(requiredPDG<0) result = particlePDG>=-3999 && particlePDG<=-3000;
    }
    break;
  case 400:     // all charmed mesons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=400 && TMath::Abs(particlePDG)<=499;
    else {
      if(requiredPDG>0) result = particlePDG>=400 && particlePDG<=499;
      if(requiredPDG<0) result = particlePDG>=-499 && particlePDG<=-400;
    }
    break;
  case 401:     // open charm mesons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=400 && TMath::Abs(particlePDG)<=439;
    else {
      if(requiredPDG>0) result = particlePDG>=400 && particlePDG<=439;
      if(requiredPDG<0) result = particlePDG>=-439 && particlePDG<=-400;
    }
    break;
  case 402:     // open charm mesons and baryons together
    if(checkBothCharges)
      result = (TMath::Abs(particlePDG)>=400 && TMath::Abs(particlePDG)<=439) ||
	       (TMath::Abs(particlePDG)>=4000 && TMath::Abs(particlePDG)<=4399);
    else {
      if(requiredPDG>0) result = (particlePDG>=400 && particlePDG<=439) ||
			         (particlePDG>=4000 && particlePDG<=4399);
      if(requiredPDG<0) result = (particlePDG>=-439 && particlePDG<=-400) ||
 			         (particlePDG>=-4399 && particlePDG<=-4000);
    }
    break;
  case 403:     // all charm hadrons
    if(checkBothCharges)
      result = (TMath::Abs(particlePDG)>=400 && TMath::Abs(particlePDG)<=499) ||
	       (TMath::Abs(particlePDG)>=4000 && TMath::Abs(particlePDG)<=4999);
    else {
      if(requiredPDG>0) result = (particlePDG>=400 && particlePDG<=499) ||
			         (particlePDG>=4000 && particlePDG<=4999);
      if(requiredPDG<0) result = (particlePDG>=-499 && particlePDG<=-400) ||
 			         (particlePDG>=-4999 && particlePDG<=-4000);
    }
    break;
  case 4000:     // all charmed baryons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=4000 && TMath::Abs(particlePDG)<=4999;
    else {
      if(requiredPDG>0) result = particlePDG>=4000 && particlePDG<=4999;
      if(requiredPDG<0) result = particlePDG>=-4999 && particlePDG<=-4000;
    }
    break;
  case 4001:     // open charm baryons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=4000 && TMath::Abs(particlePDG)<=4399;
    else {
      if(requiredPDG>0) result = particlePDG>=4000 && particlePDG<=4399;
      if(requiredPDG<0) result = particlePDG>=-4399 && particlePDG<=-4000;
    }
    break;
  case 500:      // all beauty mesons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=500 && TMath::Abs(particlePDG)<=599;
    else {
      if(requiredPDG>0) result = particlePDG>=500 && particlePDG<=599;
      if(requiredPDG<0) result = particlePDG>=-599 && particlePDG<=-500;
    }
    break;
  case 501:      // open beauty mesons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=500 && TMath::Abs(particlePDG)<=549;
    else {
      if(requiredPDG>0) result = particlePDG>=500 && particlePDG<=549;
      if(requiredPDG<0) result = particlePDG>=-549 && particlePDG<=-500;
    }
    break;
  case 502:      // open beauty mesons and baryons
    if(checkBothCharges)
      result = (TMath::Abs(particlePDG)>=500 && TMath::Abs(particlePDG)<=549) ||
	       (TMath::Abs(particlePDG)>=5000 && TMath::Abs(particlePDG)<=5499);
    else {
      if(requiredPDG>0) result = (particlePDG>=500 && particlePDG<=549) ||
			         (particlePDG>=5000 && particlePDG<=5499);
      if(requiredPDG<0) result = (particlePDG>=-549 && particlePDG<=-500) ||
                                 (particlePDG>=-5499 && particlePDG<=-5000);
    }
    break;
  case 503:      // all beauty hadrons
    if(checkBothCharges)
      result = (TMath::Abs(particlePDG)>=500 && TMath::Abs(particlePDG)<=599) ||
	       (TMath::Abs(particlePDG)>=5000 && TMath::Abs(particlePDG)<=5999);
    else {
      if(requiredPDG>0) result = (particlePDG>=500 && particlePDG<=599) ||
			         (particlePDG>=5000 && particlePDG<=5999);
      if(requiredPDG<0) result = (particlePDG>=-599 && particlePDG<=-500) ||
                                 (particlePDG>=-5999 && particlePDG<=-5000);
    }
    break;
  case 5000:      // all beauty baryons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=5000 && TMath::Abs(particlePDG)<=5999;
    else {
      if(requiredPDG>0) result = particlePDG>=5000 && particlePDG<=5999;
      if(requiredPDG<0) result = particlePDG>=-5999 && particlePDG<=-5000;
    }
    break;
  case 5001:      // open beauty baryons
    if(checkBothCharges)
      result = TMath::Abs(particlePDG)>=5000 && TMath::Abs(particlePDG)<=5499;
    else {
      if(requiredPDG>0) result = particlePDG>=5000 && particlePDG<=5499;
      if(requiredPDG<0) result = particlePDG>=-5499 && particlePDG<=-5000;
    }
    break;
  case 902:      // // open charm,beauty  mesons and baryons together
    if(checkBothCharges)
      result = (TMath::Abs(particlePDG)>=400 && TMath::Abs(particlePDG)<=439) ||
	(TMath::Abs(particlePDG)>=4000 && TMath::Abs(particlePDG)<=4399) ||
	(TMath::Abs(particlePDG)>=500 && TMath::Abs(particlePDG)<=549) ||
	(TMath::Abs(particlePDG)>=5000 && TMath::Abs(particlePDG)<=5499);
    else {
      if(requiredPDG>0) result = (particlePDG>=400 && particlePDG<=439) ||
			  (particlePDG>=4000 && particlePDG<=4399)      ||
			  (particlePDG>=500 && particlePDG<=549)        ||
			  (particlePDG>=5000 && particlePDG<=5499);
      if(requiredPDG<0) result = (particlePDG>=-439 && particlePDG<=-400) ||
			  (particlePDG>=-4399 && particlePDG<=-4000)      ||
			  (particlePDG>=-549 && particlePDG<=-500)        ||
			  (particlePDG>=-5499 && particlePDG<=-5000);
    }
    break;
  default:          // all specific cases
    if(checkBothCharges)
      result = (absRequiredPDG==TMath::Abs(particlePDG));
    else
      result = (requiredPDG==particlePDG);
  }

  if(absRequiredPDG!=0 && pdgExclusion) result = !result;
  return result;
}

//________________________________________________________________________________
Bool_t AliDielectronMC::IsPhysicalPrimary(Int_t label) const {
  //
  // Check if the particle with label "label" is a physical primary according to the
  // definition in AliStack::IsPhysicalPrimary(Int_t label)
  // Convention for being physical primary:
  // 1.) particles produced in the collision
  // 2.) stable particles with respect to strong and electromagnetic interactions
  // 3.) excludes initial state particles
  // 4.) includes products of directly produced Sigma0 hyperon decay
  // 5.) includes products of directly produced pi0 decays
  // 6.) includes products of directly produced beauty hadron decays
  //
  if(label<0) return kFALSE;
  if(fAnaType==kAOD) {
    if(!fMcArray) return kFALSE;
    return (static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(label)))->IsPhysicalPrimary();
  } else if(fAnaType==kESD) {
    if (!fMCEvent) return kFALSE;
    return fStack->IsPhysicalPrimary(label);
  }
  return kFALSE;
}

//________________________________________________________________________________
Bool_t AliDielectronMC::IsSecondaryFromWeakDecay(Int_t label) const {
  //
  // Check if the particle with label "label" is a physical secondary from weak decay according to the
  // definition in AliStack::IsSecondaryFromWeakDecay(Int_t label)
  //
  if(label<0) return kFALSE;
  if(fAnaType==kAOD) {
    if(!fMcArray) return kFALSE;
    return (static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(label)))->IsSecondaryFromWeakDecay();
  } else if(fAnaType==kESD) {
    if (!fMCEvent) return kFALSE;
    return fStack->IsSecondaryFromWeakDecay(label);
  }
  return kFALSE;
}

//________________________________________________________________________________
Bool_t AliDielectronMC::IsSecondaryFromMaterial(Int_t label) const {
  //
  // Check if the particle with label "label" is a physical secondary from weak decay according to the
  // definition in AliStack::IsSecondaryFromMaterial(Int_t label)
  //
  if(label<0) return kFALSE;
  if(fAnaType==kAOD) {
    if(!fMcArray) return kFALSE;
    return (static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(label)))->IsSecondaryFromMaterial();
  } else if(fAnaType==kESD) {
    if (!fMCEvent) return kFALSE;
    return fStack->IsSecondaryFromMaterial(label);
  }
  return kFALSE;
}


//________________________________________________________________________________
Bool_t AliDielectronMC::CheckGEANTProcess(Int_t label, TMCProcess process) const {
  //
  //  Check the GEANT process for the particle 
  //  NOTE: for tracks the absolute label should be passed
  //
  if(label<0) return kFALSE;
  if(fAnaType==kAOD) {
    if(!fMcArray) return kFALSE;
    UInt_t processID = static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(label))->GetMCProcessCode();
    //    printf("process: id %d --> %s \n",processID,TMCProcessName[processID]);
    return (process==processID);
  } else if(fAnaType==kESD) {
    if (!fMCEvent) return kFALSE;
    AliError(Form("return of GEANT process not implemented for ESD "));
    return kFALSE;
  }
  return kFALSE;

}

//________________________________________________________________________________
Bool_t AliDielectronMC::CheckParticleSource(Int_t label, AliDielectronSignalMC::ESource source) const {
  //
  //  Check the source for the particle 
  //  NOTE: for tracks the absolute label should be passed
  //

  switch (source) {
    case AliDielectronSignalMC::kDontCare :
      return kTRUE;
    break;
    case AliDielectronSignalMC::kPrimary :            
      // true if label is in the list of particles from physics generator 
      // NOTE: This includes all physics event history (initial state particles,
      //       exchange bosons, quarks, di-quarks, strings, un-stable particles, final state particles)
      //       Only the final state particles make it to the detector!!
      return (label>=0 && label<=GetNPrimary());      
    break;
    case AliDielectronSignalMC::kFinalState :         
      // primary particles created in the collision which reach the detectors
      // These would be:
      // 1.) particles produced in the collision
      // 2.) stable particles with respect to strong and electromagnetic interactions
      // 3.) excludes initial state particles
      // 4.) includes products of directly produced Sigma0 hyperon decay
      // 5.) includes products of directly produced pi0 decays
      // 6.) includes products of directly produced beauty hadron decays
      return IsPhysicalPrimary(label);
    break;
    case AliDielectronSignalMC::kDirect :
      // Primary particles which do not have any mother
      // This is the case for:
      // 1.) Initial state particles (the 2 protons in Pythia pp collisions)
      // 2.) In some codes, with sudden freeze-out, all particles generated from the fireball are direct.
      //     There is no history for these particles.
      // 3.) Certain particles added via MC generator cocktails (e.g. J/psi added to pythia MB events)
      return (label>=0 && GetMothersLabel(label)<0);
      break;
    case AliDielectronSignalMC::kNoCocktail :
      // Particles from the HIJING event and NOT from the AliGenCocktail
      return (label>=0 && GetMothersLabel(label)>=0);
      break;
    case AliDielectronSignalMC::kSecondary :          
      // particles which are created by the interaction of final state primaries with the detector
      // or particles from strange weakly decaying particles (e.g. lambda, kaons, etc.)
      return (label>=GetNPrimary() && !IsPhysicalPrimary(label));
    break;
    case AliDielectronSignalMC::kSecondaryFromWeakDecay :          
      // secondary particle from weak decay
      // or particles from strange weakly decaying particles (e.g. lambda, kaons, etc.)
      return (IsSecondaryFromWeakDecay(label));
    break;
    case AliDielectronSignalMC::kSecondaryFromMaterial :
      // secondary particle from material
      return (IsSecondaryFromMaterial(label));
    break;
    default :
      return kFALSE;
  }
  return kFALSE;
}

//________________________________________________________________________________
Bool_t AliDielectronMC::CheckIsRadiative(Int_t label) const
{
  //
  // Check if the particle has a three body decay, one being a photon
  //
  if(label<0) return kFALSE;


  if(fAnaType==kAOD) {
    if(!fMcArray) return kFALSE;
    AliAODMCParticle *mother=static_cast<AliAODMCParticle*>(GetMCTrackFromMCEvent(label));
    if (!mother) return kFALSE;
    const Int_t nd=mother->GetNDaughters();
    if (nd==2) return kFALSE;
    for (Int_t i=2; i<nd; ++i)
      if (GetMCTrackFromMCEvent(mother->GetDaughter(0)+i)->PdgCode()!=22) return kFALSE; //last daughter is photon
  } else if(fAnaType==kESD) {
    if (!fMCEvent) return kFALSE;
    AliMCParticle *mother=static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(label));
    if (!mother) return kFALSE;
    const Int_t nd=(mother->GetLastDaughter()-mother->GetFirstDaughter()+1);
    if (nd==2) return kFALSE;
    for (Int_t i=2; i<nd; ++i)
      if (GetMCTrackFromMCEvent(mother->GetFirstDaughter()+i)->PdgCode()!=22) return kFALSE; //last daughters are photons
  }
  return kTRUE;
}

//________________________________________________________________________________
Bool_t AliDielectronMC::CheckRadiativeDecision(Int_t mLabel, const AliDielectronSignalMC * const signalMC) const
{
  //
  // Check for the decision of the radiative type request
  //
  
  if (!signalMC) return kFALSE;
  
  if (signalMC->GetJpsiRadiative()==AliDielectronSignalMC::kAll) return kTRUE;
  
  Bool_t isRadiative=CheckIsRadiative(mLabel);
  if ((signalMC->GetJpsiRadiative()==AliDielectronSignalMC::kIsRadiative) && !isRadiative) return kFALSE;
  if ((signalMC->GetJpsiRadiative()==AliDielectronSignalMC::kIsNotRadiative) && isRadiative) return kFALSE;
  
  return kTRUE;
}

//________________________________________________________________________________
Bool_t AliDielectronMC::IsMCTruth(Int_t label, AliDielectronSignalMC* signalMC, Int_t branch) const {
  //
  // Check if the particle corresponds to the MC truth in signalMC in the branch specified
  //
  
  // NOTE:  Some particles have the sign of the label flipped. It is related to the quality of matching
  //        between the ESD and the MC track. The negative labels indicate a poor matching quality
  //if(label<0) return kFALSE;
  if(label<0) label *= -1; 

  AliVParticle* part = GetMCTrackFromMCEvent(label);
  if (!part) {
    AliError(Form("Could not find MC particle with label %d",label));
    return kFALSE;
  }

  // check geant process if set
  if(signalMC->GetCheckGEANTProcess() && !CheckGEANTProcess(label,signalMC->GetGEANTProcess())) return kFALSE;

  // check the leg
  if(!ComparePDG(part->PdgCode(),signalMC->GetLegPDG(branch),signalMC->GetLegPDGexclude(branch),signalMC->GetCheckBothChargesLegs(branch))) return kFALSE;
  if(!CheckParticleSource(label, signalMC->GetLegSource(branch))) return kFALSE;

  // check the mother
  AliVParticle* mcMother=0x0;
  Int_t mLabel = -1;
  if(signalMC->GetMotherPDG(branch)!=0 || signalMC->GetMotherSource(branch)!=AliDielectronSignalMC::kDontCare) {
    if(part) {
      mLabel = GetMothersLabel(label);
      mcMother = GetMCTrackFromMCEvent(mLabel);
    }
    if(!mcMother && !signalMC->GetMotherPDGexclude(branch)) return kFALSE;
    
    if(!ComparePDG((mcMother ? mcMother->PdgCode() : 0),signalMC->GetMotherPDG(branch),signalMC->GetMotherPDGexclude(branch),signalMC->GetCheckBothChargesMothers(branch))) return kFALSE;
    if(!CheckParticleSource(mLabel, signalMC->GetMotherSource(branch))) return kFALSE;

    //check for radiative deday
    if (!CheckRadiativeDecision(mLabel, signalMC)) return kFALSE;
  }
  
  // check the grandmother
  AliVParticle* mcGrandMother=0x0;
  if(signalMC->GetGrandMotherPDG(branch)!=0 || signalMC->GetGrandMotherSource(branch)!=AliDielectronSignalMC::kDontCare) {
    Int_t gmLabel = -1;
    if(mcMother) {
      gmLabel = GetMothersLabel(mLabel);
      mcGrandMother = static_cast<AliMCParticle*>(GetMCTrackFromMCEvent(gmLabel));
    }
    if(!mcGrandMother && !signalMC->GetGrandMotherPDGexclude(branch)) return kFALSE;
    
    if(!ComparePDG((mcGrandMother ? mcGrandMother->PdgCode() : 0),signalMC->GetGrandMotherPDG(branch),signalMC->GetGrandMotherPDGexclude(branch),signalMC->GetCheckBothChargesGrandMothers(branch))) return kFALSE;
    if(!CheckParticleSource(gmLabel, signalMC->GetGrandMotherSource(branch))) return kFALSE;
  }

  return kTRUE;
}



//________________________________________________________________________________
Bool_t AliDielectronMC::IsMCTruth(const AliDielectronPair* pair, const AliDielectronSignalMC* signalMC) const {
  //
  // Check if the pair corresponds to the MC truth in signalMC 
  //
 
  // legs (daughters)
  const AliVParticle * mcD1 = pair->GetFirstDaughterP();
  const AliVParticle * mcD2 = pair->GetSecondDaughterP();
  Int_t labelD1 = (mcD1 ? TMath::Abs(mcD1->GetLabel()) : -1);
  Int_t labelD2 = (mcD2 ? TMath::Abs(mcD2->GetLabel()) : -1);
  Int_t d1Pdg = GetPdgFromLabel(labelD1);
  Int_t d2Pdg = GetPdgFromLabel(labelD2);
  
  // mothers
  AliVParticle* mcM1=0x0;
  AliVParticle* mcM2=0x0;
  
  // grand-mothers
  AliVParticle* mcG1 = 0x0;
  AliVParticle* mcG2 = 0x0;
  
  // make direct(1-1 and 2-2) and cross(1-2 and 2-1) comparisons for the whole branch
  Bool_t directTerm = kTRUE;
  // daughters
  directTerm = directTerm && mcD1 && ComparePDG(d1Pdg,signalMC->GetLegPDG(1),signalMC->GetLegPDGexclude(1),signalMC->GetCheckBothChargesLegs(1)) 
               && CheckParticleSource(labelD1, signalMC->GetLegSource(1));
    
  directTerm = directTerm && mcD2 && ComparePDG(d2Pdg,signalMC->GetLegPDG(2),signalMC->GetLegPDGexclude(2),signalMC->GetCheckBothChargesLegs(2))
               && CheckParticleSource(labelD2, signalMC->GetLegSource(2));
    
  // mothers
  Int_t labelM1 = -1;
  if(signalMC->GetMotherPDG(1)!=0 || signalMC->GetMotherSource(1)!=AliDielectronSignalMC::kDontCare) {
    labelM1 = GetMothersLabel(labelD1);
    if(labelD1>-1 && labelM1>-1) mcM1 = GetMCTrackFromMCEvent(labelM1);
    directTerm = directTerm && (mcM1 || signalMC->GetMotherPDGexclude(1))
                 && ComparePDG((mcM1 ? mcM1->PdgCode() : 0),signalMC->GetMotherPDG(1),signalMC->GetMotherPDGexclude(1),signalMC->GetCheckBothChargesMothers(1))
                 && CheckParticleSource(labelM1, signalMC->GetMotherSource(1))
                 && CheckRadiativeDecision(labelM1,signalMC);
  }
  
  Int_t labelM2 = -1;
  if(signalMC->GetMotherPDG(2)!=0 || signalMC->GetMotherSource(2)!=AliDielectronSignalMC::kDontCare) {
    labelM2 = GetMothersLabel(labelD2);
    if(labelD2>-1 && labelM2>-1) mcM2 = GetMCTrackFromMCEvent(labelM2);
    directTerm = directTerm && (mcM2 || signalMC->GetMotherPDGexclude(2))
                 && ComparePDG((mcM2 ? mcM2->PdgCode() : 0),signalMC->GetMotherPDG(2),signalMC->GetMotherPDGexclude(2),signalMC->GetCheckBothChargesMothers(2))
                 && CheckParticleSource(labelM2, signalMC->GetMotherSource(2))
                 && CheckRadiativeDecision(labelM2,signalMC);
  }
 
  // grand-mothers
  Int_t labelG1 = -1;
  if(signalMC->GetGrandMotherPDG(1)!=0 || signalMC->GetGrandMotherSource(1)!=AliDielectronSignalMC::kDontCare) {
    labelG1 = GetMothersLabel(labelM1);
    if(mcM1 && labelG1>-1) mcG1 = GetMCTrackFromMCEvent(labelG1);
    directTerm = directTerm && (mcG1 || signalMC->GetGrandMotherPDGexclude(1))
                 && ComparePDG((mcG1 ? mcG1->PdgCode() : 0),signalMC->GetGrandMotherPDG(1),signalMC->GetGrandMotherPDGexclude(1),signalMC->GetCheckBothChargesGrandMothers(1))
                 && CheckParticleSource(labelG1, signalMC->GetGrandMotherSource(1));
  }

  Int_t labelG2 = -1;
  if(signalMC->GetGrandMotherPDG(2)!=0 || signalMC->GetGrandMotherSource(2)!=AliDielectronSignalMC::kDontCare) {
    labelG2 = GetMothersLabel(labelM2);
    if(mcM2 && labelG2>-1) mcG2 = GetMCTrackFromMCEvent(labelG2);
    directTerm = directTerm && (mcG2 || signalMC->GetGrandMotherPDGexclude(2))
                 && ComparePDG((mcG2 ? mcG2->PdgCode() : 0),signalMC->GetGrandMotherPDG(2),signalMC->GetGrandMotherPDGexclude(2),signalMC->GetCheckBothChargesGrandMothers(2))
                 && CheckParticleSource(labelG2, signalMC->GetGrandMotherSource(2));
  }

  // Cross term
  Bool_t crossTerm = kTRUE;
  // daughters
  crossTerm = crossTerm && mcD2 
              && ComparePDG(d2Pdg,signalMC->GetLegPDG(1),signalMC->GetLegPDGexclude(1),signalMC->GetCheckBothChargesLegs(1))
              && CheckParticleSource(labelD2, signalMC->GetLegSource(1));
    
  crossTerm = crossTerm && mcD1 
              && ComparePDG(d1Pdg,signalMC->GetLegPDG(2),signalMC->GetLegPDGexclude(2),signalMC->GetCheckBothChargesLegs(2))
              && CheckParticleSource(labelD1, signalMC->GetLegSource(2));
  
  // mothers  
  if(signalMC->GetMotherPDG(1)!=0 || signalMC->GetMotherSource(1)!=AliDielectronSignalMC::kDontCare) {
    if(!mcM2 && labelD2>-1) {
      labelM2 = GetMothersLabel(labelD2);
      if(labelM2>-1) mcM2 = GetMCTrackFromMCEvent(labelM2);
    }
    crossTerm = crossTerm && (mcM2 || signalMC->GetMotherPDGexclude(1)) 
                && ComparePDG((mcM2 ? mcM2->PdgCode() : 0),signalMC->GetMotherPDG(1),signalMC->GetMotherPDGexclude(1),signalMC->GetCheckBothChargesMothers(1))
                && CheckParticleSource(labelM2, signalMC->GetMotherSource(1))
                && CheckRadiativeDecision(labelM2,signalMC);
  }
  
  if(signalMC->GetMotherPDG(2)!=0 || signalMC->GetMotherSource(2)!=AliDielectronSignalMC::kDontCare) {
    if(!mcM1 && labelD1>-1) {
      labelM1 = GetMothersLabel(labelD1);
      if(labelM1>-1) mcM1 = GetMCTrackFromMCEvent(labelM1);  
    }
    crossTerm = crossTerm && (mcM1 || signalMC->GetMotherPDGexclude(2)) 
                && ComparePDG((mcM1 ? mcM1->PdgCode() : 0),signalMC->GetMotherPDG(2),signalMC->GetMotherPDGexclude(2),signalMC->GetCheckBothChargesMothers(2))
                && CheckParticleSource(labelM1, signalMC->GetMotherSource(2))
                && CheckRadiativeDecision(labelM1,signalMC);
  }

  // grand-mothers
  if(signalMC->GetGrandMotherPDG(1)!=0 || signalMC->GetGrandMotherSource(1)!=AliDielectronSignalMC::kDontCare) {
    if(!mcG2 && mcM2) {
      labelG2 = GetMothersLabel(labelM2);
      if(labelG2>-1) mcG2 = GetMCTrackFromMCEvent(labelG2);
    }
    crossTerm = crossTerm && (mcG2 || signalMC->GetGrandMotherPDGexclude(1))
                && ComparePDG((mcG2 ? mcG2->PdgCode() : 0),signalMC->GetGrandMotherPDG(1),signalMC->GetGrandMotherPDGexclude(1),signalMC->GetCheckBothChargesGrandMothers(1))
                && CheckParticleSource(labelG2, signalMC->GetGrandMotherSource(1));
  }

  if(signalMC->GetGrandMotherPDG(2)!=0 || signalMC->GetGrandMotherSource(2)!=AliDielectronSignalMC::kDontCare) {
    if(!mcG1 && mcM1) {
      labelG1 = GetMothersLabel(labelM1);
      if(labelG1>-1) mcG1 = GetMCTrackFromMCEvent(labelG1);
    }
    crossTerm = crossTerm && (mcG1 || signalMC->GetGrandMotherPDGexclude(2))
                && ComparePDG((mcG1 ? mcG1->PdgCode() : 0),signalMC->GetGrandMotherPDG(2),signalMC->GetGrandMotherPDGexclude(2),signalMC->GetCheckBothChargesGrandMothers(2))
                && CheckParticleSource(labelG1, signalMC->GetGrandMotherSource(2));
  }

  Bool_t motherRelation = kTRUE;
  if(signalMC->GetMothersRelation()==AliDielectronSignalMC::kSame) {
    motherRelation = motherRelation && HaveSameMother(pair);
  }
  if(signalMC->GetMothersRelation()==AliDielectronSignalMC::kDifferent) {
    motherRelation = motherRelation && !HaveSameMother(pair);
  }

  // check geant process if set
  Bool_t processGEANT = kTRUE;
  if(signalMC->GetCheckGEANTProcess()) {
    if(!CheckGEANTProcess(labelD1,signalMC->GetGEANTProcess()) &&
       !CheckGEANTProcess(labelD2,signalMC->GetGEANTProcess())   ) processGEANT= kFALSE;
  }

  return ((directTerm || crossTerm) && motherRelation && processGEANT);
}



//____________________________________________________________
Bool_t AliDielectronMC::HaveSameMother(const AliDielectronPair * pair) const
{
  //
  // Check whether two particles have the same mother
  //

  const AliVParticle * daughter1 = pair->GetFirstDaughterP();
  const AliVParticle * daughter2 = pair->GetSecondDaughterP();
  if (!daughter1 || !daughter2) return 0;

  AliVParticle *mcDaughter1=GetMCTrackFromMCEvent(daughter1->GetLabel());
  AliVParticle *mcDaughter2=GetMCTrackFromMCEvent(daughter2->GetLabel());
  if (!mcDaughter1 || !mcDaughter2) return 0;

  Int_t labelMother1=-1;
  Int_t labelMother2=-1;

  if (mcDaughter1->IsA()==AliMCParticle::Class()){
    labelMother1=(static_cast<AliMCParticle*>(mcDaughter1))->GetMother();
    labelMother2=(static_cast<AliMCParticle*>(mcDaughter2))->GetMother();
  } else if (mcDaughter1->IsA()==AliAODMCParticle::Class()) {
    labelMother1=(static_cast<AliAODMCParticle*>(mcDaughter1))->GetMother();
    labelMother2=(static_cast<AliAODMCParticle*>(mcDaughter2))->GetMother();
  }

  Bool_t sameMother=(labelMother1>-1)&&(labelMother2>-1)&&(labelMother1==labelMother2);

  return sameMother;
}

//________________________________________________________________
Int_t AliDielectronMC::IsJpsiPrimary(const AliDielectronPair * pair)
{
 // return: "0" for primary jpsi 
 //         "1" for secondary jpsi (from beauty)
 //         "2" for background  
 if(!HaveSameMother(pair)) return 2;
 AliVParticle *mcDaughter1=GetMCTrackFromMCEvent((pair->GetFirstDaughterP())->GetLabel());
 Int_t labelMother=-1;

  if (mcDaughter1->IsA()==AliMCParticle::Class()){
     labelMother=(static_cast<AliMCParticle*>(mcDaughter1))->GetMother();
     } else if (mcDaughter1->IsA()==AliAODMCParticle::Class()) {
     labelMother=(static_cast<AliAODMCParticle*>(mcDaughter1))->GetMother();
     }

 AliVParticle* mcMother=GetMCTrackFromMCEvent(labelMother);
 if(!IsMCMotherToEE(mcMother,443)) return 2;
 return IsJpsiPrimary(mcMother);
}

//______________________________________________________________
Int_t AliDielectronMC::IsJpsiPrimary(const AliVParticle * particle)
{
  // return: "0" for primary jpsi
  //         "1" for secondary jpsi (come from B decay)
 Int_t labelMoth=-1;
 Int_t pdgCode;

 if (particle->IsA()==AliMCParticle::Class()){
     labelMoth = (static_cast<const AliMCParticle*>(particle))->GetMother();
     while(labelMoth>0){
       particle = GetMCTrackFromMCEvent(labelMoth);
       pdgCode = TMath::Abs((static_cast<const AliMCParticle*>(particle))->PdgCode());
       if((pdgCode>500 && pdgCode<600) || (pdgCode>5000 && pdgCode<6000)) return 1;
       labelMoth = (static_cast<const AliMCParticle*>(particle))->GetMother();
       }
    }
 else if (particle->IsA()==AliAODMCParticle::Class()){
     labelMoth = (static_cast<const AliAODMCParticle*>(particle))->GetMother();
     while(labelMoth>0){
     particle = GetMCTrackFromMCEvent(labelMoth);
     pdgCode = TMath::Abs((static_cast<const AliAODMCParticle*>(particle))->PdgCode());
     if((pdgCode>500 && pdgCode<600) || (pdgCode>5000 && pdgCode<6000)) return 1;
     labelMoth = (static_cast<const AliAODMCParticle*>(particle))->GetMother();
     }
  }
  return 0;
}


Bool_t AliDielectronMC::GetPrimaryVertex(Double_t &primVtxX, Double_t &primVtxY, Double_t &primVtxZ){

     if(fAnaType == kESD){
     const AliVVertex* mcVtx =  fMCEvent->GetPrimaryVertex();
     if(!mcVtx) return kFALSE;
     primVtxX = mcVtx->GetX();
     primVtxY = mcVtx->GetY();
     primVtxZ = mcVtx->GetZ();
     }else if(fAnaType == kAOD){
     AliAODEvent *aod=((AliAODInputHandler*)((AliAnalysisManager::GetAnalysisManager())->GetInputEventHandler()))->GetEvent();
     if(!aod) return kFALSE;
     AliAODMCHeader *mcHead = dynamic_cast<AliAODMCHeader*>(aod->FindListObject(AliAODMCHeader::StdBranchName()));
     if(!mcHead) return kFALSE; 
     primVtxX = mcHead->GetVtxX();
     primVtxY = mcHead->GetVtxY();
     primVtxZ = mcHead->GetVtxZ();
     }

return kTRUE;
}
 AliDielectronMC.cxx:1
 AliDielectronMC.cxx:2
 AliDielectronMC.cxx:3
 AliDielectronMC.cxx:4
 AliDielectronMC.cxx:5
 AliDielectronMC.cxx:6
 AliDielectronMC.cxx:7
 AliDielectronMC.cxx:8
 AliDielectronMC.cxx:9
 AliDielectronMC.cxx:10
 AliDielectronMC.cxx:11
 AliDielectronMC.cxx:12
 AliDielectronMC.cxx:13
 AliDielectronMC.cxx:14
 AliDielectronMC.cxx:15
 AliDielectronMC.cxx:16
 AliDielectronMC.cxx:17
 AliDielectronMC.cxx:18
 AliDielectronMC.cxx:19
 AliDielectronMC.cxx:20
 AliDielectronMC.cxx:21
 AliDielectronMC.cxx:22
 AliDielectronMC.cxx:23
 AliDielectronMC.cxx:24
 AliDielectronMC.cxx:25
 AliDielectronMC.cxx:26
 AliDielectronMC.cxx:27
 AliDielectronMC.cxx:28
 AliDielectronMC.cxx:29
 AliDielectronMC.cxx:30
 AliDielectronMC.cxx:31
 AliDielectronMC.cxx:32
 AliDielectronMC.cxx:33
 AliDielectronMC.cxx:34
 AliDielectronMC.cxx:35
 AliDielectronMC.cxx:36
 AliDielectronMC.cxx:37
 AliDielectronMC.cxx:38
 AliDielectronMC.cxx:39
 AliDielectronMC.cxx:40
 AliDielectronMC.cxx:41
 AliDielectronMC.cxx:42
 AliDielectronMC.cxx:43
 AliDielectronMC.cxx:44
 AliDielectronMC.cxx:45
 AliDielectronMC.cxx:46
 AliDielectronMC.cxx:47
 AliDielectronMC.cxx:48
 AliDielectronMC.cxx:49
 AliDielectronMC.cxx:50
 AliDielectronMC.cxx:51
 AliDielectronMC.cxx:52
 AliDielectronMC.cxx:53
 AliDielectronMC.cxx:54
 AliDielectronMC.cxx:55
 AliDielectronMC.cxx:56
 AliDielectronMC.cxx:57
 AliDielectronMC.cxx:58
 AliDielectronMC.cxx:59
 AliDielectronMC.cxx:60
 AliDielectronMC.cxx:61
 AliDielectronMC.cxx:62
 AliDielectronMC.cxx:63
 AliDielectronMC.cxx:64
 AliDielectronMC.cxx:65
 AliDielectronMC.cxx:66
 AliDielectronMC.cxx:67
 AliDielectronMC.cxx:68
 AliDielectronMC.cxx:69
 AliDielectronMC.cxx:70
 AliDielectronMC.cxx:71
 AliDielectronMC.cxx:72
 AliDielectronMC.cxx:73
 AliDielectronMC.cxx:74
 AliDielectronMC.cxx:75
 AliDielectronMC.cxx:76
 AliDielectronMC.cxx:77
 AliDielectronMC.cxx:78
 AliDielectronMC.cxx:79
 AliDielectronMC.cxx:80
 AliDielectronMC.cxx:81
 AliDielectronMC.cxx:82
 AliDielectronMC.cxx:83
 AliDielectronMC.cxx:84
 AliDielectronMC.cxx:85
 AliDielectronMC.cxx:86
 AliDielectronMC.cxx:87
 AliDielectronMC.cxx:88
 AliDielectronMC.cxx:89
 AliDielectronMC.cxx:90
 AliDielectronMC.cxx:91
 AliDielectronMC.cxx:92
 AliDielectronMC.cxx:93
 AliDielectronMC.cxx:94
 AliDielectronMC.cxx:95
 AliDielectronMC.cxx:96
 AliDielectronMC.cxx:97
 AliDielectronMC.cxx:98
 AliDielectronMC.cxx:99
 AliDielectronMC.cxx:100
 AliDielectronMC.cxx:101
 AliDielectronMC.cxx:102
 AliDielectronMC.cxx:103
 AliDielectronMC.cxx:104
 AliDielectronMC.cxx:105
 AliDielectronMC.cxx:106
 AliDielectronMC.cxx:107
 AliDielectronMC.cxx:108
 AliDielectronMC.cxx:109
 AliDielectronMC.cxx:110
 AliDielectronMC.cxx:111
 AliDielectronMC.cxx:112
 AliDielectronMC.cxx:113
 AliDielectronMC.cxx:114
 AliDielectronMC.cxx:115
 AliDielectronMC.cxx:116
 AliDielectronMC.cxx:117
 AliDielectronMC.cxx:118
 AliDielectronMC.cxx:119
 AliDielectronMC.cxx:120
 AliDielectronMC.cxx:121
 AliDielectronMC.cxx:122
 AliDielectronMC.cxx:123
 AliDielectronMC.cxx:124
 AliDielectronMC.cxx:125
 AliDielectronMC.cxx:126
 AliDielectronMC.cxx:127
 AliDielectronMC.cxx:128
 AliDielectronMC.cxx:129
 AliDielectronMC.cxx:130
 AliDielectronMC.cxx:131
 AliDielectronMC.cxx:132
 AliDielectronMC.cxx:133
 AliDielectronMC.cxx:134
 AliDielectronMC.cxx:135
 AliDielectronMC.cxx:136
 AliDielectronMC.cxx:137
 AliDielectronMC.cxx:138
 AliDielectronMC.cxx:139
 AliDielectronMC.cxx:140
 AliDielectronMC.cxx:141
 AliDielectronMC.cxx:142
 AliDielectronMC.cxx:143
 AliDielectronMC.cxx:144
 AliDielectronMC.cxx:145
 AliDielectronMC.cxx:146
 AliDielectronMC.cxx:147
 AliDielectronMC.cxx:148
 AliDielectronMC.cxx:149
 AliDielectronMC.cxx:150
 AliDielectronMC.cxx:151
 AliDielectronMC.cxx:152
 AliDielectronMC.cxx:153
 AliDielectronMC.cxx:154
 AliDielectronMC.cxx:155
 AliDielectronMC.cxx:156
 AliDielectronMC.cxx:157
 AliDielectronMC.cxx:158
 AliDielectronMC.cxx:159
 AliDielectronMC.cxx:160
 AliDielectronMC.cxx:161
 AliDielectronMC.cxx:162
 AliDielectronMC.cxx:163
 AliDielectronMC.cxx:164
 AliDielectronMC.cxx:165
 AliDielectronMC.cxx:166
 AliDielectronMC.cxx:167
 AliDielectronMC.cxx:168
 AliDielectronMC.cxx:169
 AliDielectronMC.cxx:170
 AliDielectronMC.cxx:171
 AliDielectronMC.cxx:172
 AliDielectronMC.cxx:173
 AliDielectronMC.cxx:174
 AliDielectronMC.cxx:175
 AliDielectronMC.cxx:176
 AliDielectronMC.cxx:177
 AliDielectronMC.cxx:178
 AliDielectronMC.cxx:179
 AliDielectronMC.cxx:180
 AliDielectronMC.cxx:181
 AliDielectronMC.cxx:182
 AliDielectronMC.cxx:183
 AliDielectronMC.cxx:184
 AliDielectronMC.cxx:185
 AliDielectronMC.cxx:186
 AliDielectronMC.cxx:187
 AliDielectronMC.cxx:188
 AliDielectronMC.cxx:189
 AliDielectronMC.cxx:190
 AliDielectronMC.cxx:191
 AliDielectronMC.cxx:192
 AliDielectronMC.cxx:193
 AliDielectronMC.cxx:194
 AliDielectronMC.cxx:195
 AliDielectronMC.cxx:196
 AliDielectronMC.cxx:197
 AliDielectronMC.cxx:198
 AliDielectronMC.cxx:199
 AliDielectronMC.cxx:200
 AliDielectronMC.cxx:201
 AliDielectronMC.cxx:202
 AliDielectronMC.cxx:203
 AliDielectronMC.cxx:204
 AliDielectronMC.cxx:205
 AliDielectronMC.cxx:206
 AliDielectronMC.cxx:207
 AliDielectronMC.cxx:208
 AliDielectronMC.cxx:209
 AliDielectronMC.cxx:210
 AliDielectronMC.cxx:211
 AliDielectronMC.cxx:212
 AliDielectronMC.cxx:213
 AliDielectronMC.cxx:214
 AliDielectronMC.cxx:215
 AliDielectronMC.cxx:216
 AliDielectronMC.cxx:217
 AliDielectronMC.cxx:218
 AliDielectronMC.cxx:219
 AliDielectronMC.cxx:220
 AliDielectronMC.cxx:221
 AliDielectronMC.cxx:222
 AliDielectronMC.cxx:223
 AliDielectronMC.cxx:224
 AliDielectronMC.cxx:225
 AliDielectronMC.cxx:226
 AliDielectronMC.cxx:227
 AliDielectronMC.cxx:228
 AliDielectronMC.cxx:229
 AliDielectronMC.cxx:230
 AliDielectronMC.cxx:231
 AliDielectronMC.cxx:232
 AliDielectronMC.cxx:233
 AliDielectronMC.cxx:234
 AliDielectronMC.cxx:235
 AliDielectronMC.cxx:236
 AliDielectronMC.cxx:237
 AliDielectronMC.cxx:238
 AliDielectronMC.cxx:239
 AliDielectronMC.cxx:240
 AliDielectronMC.cxx:241
 AliDielectronMC.cxx:242
 AliDielectronMC.cxx:243
 AliDielectronMC.cxx:244
 AliDielectronMC.cxx:245
 AliDielectronMC.cxx:246
 AliDielectronMC.cxx:247
 AliDielectronMC.cxx:248
 AliDielectronMC.cxx:249
 AliDielectronMC.cxx:250
 AliDielectronMC.cxx:251
 AliDielectronMC.cxx:252
 AliDielectronMC.cxx:253
 AliDielectronMC.cxx:254
 AliDielectronMC.cxx:255
 AliDielectronMC.cxx:256
 AliDielectronMC.cxx:257
 AliDielectronMC.cxx:258
 AliDielectronMC.cxx:259
 AliDielectronMC.cxx:260
 AliDielectronMC.cxx:261
 AliDielectronMC.cxx:262
 AliDielectronMC.cxx:263
 AliDielectronMC.cxx:264
 AliDielectronMC.cxx:265
 AliDielectronMC.cxx:266
 AliDielectronMC.cxx:267
 AliDielectronMC.cxx:268
 AliDielectronMC.cxx:269
 AliDielectronMC.cxx:270
 AliDielectronMC.cxx:271
 AliDielectronMC.cxx:272
 AliDielectronMC.cxx:273
 AliDielectronMC.cxx:274
 AliDielectronMC.cxx:275
 AliDielectronMC.cxx:276
 AliDielectronMC.cxx:277
 AliDielectronMC.cxx:278
 AliDielectronMC.cxx:279
 AliDielectronMC.cxx:280
 AliDielectronMC.cxx:281
 AliDielectronMC.cxx:282
 AliDielectronMC.cxx:283
 AliDielectronMC.cxx:284
 AliDielectronMC.cxx:285
 AliDielectronMC.cxx:286
 AliDielectronMC.cxx:287
 AliDielectronMC.cxx:288
 AliDielectronMC.cxx:289
 AliDielectronMC.cxx:290
 AliDielectronMC.cxx:291
 AliDielectronMC.cxx:292
 AliDielectronMC.cxx:293
 AliDielectronMC.cxx:294
 AliDielectronMC.cxx:295
 AliDielectronMC.cxx:296
 AliDielectronMC.cxx:297
 AliDielectronMC.cxx:298
 AliDielectronMC.cxx:299
 AliDielectronMC.cxx:300
 AliDielectronMC.cxx:301
 AliDielectronMC.cxx:302
 AliDielectronMC.cxx:303
 AliDielectronMC.cxx:304
 AliDielectronMC.cxx:305
 AliDielectronMC.cxx:306
 AliDielectronMC.cxx:307
 AliDielectronMC.cxx:308
 AliDielectronMC.cxx:309
 AliDielectronMC.cxx:310
 AliDielectronMC.cxx:311
 AliDielectronMC.cxx:312
 AliDielectronMC.cxx:313
 AliDielectronMC.cxx:314
 AliDielectronMC.cxx:315
 AliDielectronMC.cxx:316
 AliDielectronMC.cxx:317
 AliDielectronMC.cxx:318
 AliDielectronMC.cxx:319
 AliDielectronMC.cxx:320
 AliDielectronMC.cxx:321
 AliDielectronMC.cxx:322
 AliDielectronMC.cxx:323
 AliDielectronMC.cxx:324
 AliDielectronMC.cxx:325
 AliDielectronMC.cxx:326
 AliDielectronMC.cxx:327
 AliDielectronMC.cxx:328
 AliDielectronMC.cxx:329
 AliDielectronMC.cxx:330
 AliDielectronMC.cxx:331
 AliDielectronMC.cxx:332
 AliDielectronMC.cxx:333
 AliDielectronMC.cxx:334
 AliDielectronMC.cxx:335
 AliDielectronMC.cxx:336
 AliDielectronMC.cxx:337
 AliDielectronMC.cxx:338
 AliDielectronMC.cxx:339
 AliDielectronMC.cxx:340
 AliDielectronMC.cxx:341
 AliDielectronMC.cxx:342
 AliDielectronMC.cxx:343
 AliDielectronMC.cxx:344
 AliDielectronMC.cxx:345
 AliDielectronMC.cxx:346
 AliDielectronMC.cxx:347
 AliDielectronMC.cxx:348
 AliDielectronMC.cxx:349
 AliDielectronMC.cxx:350
 AliDielectronMC.cxx:351
 AliDielectronMC.cxx:352
 AliDielectronMC.cxx:353
 AliDielectronMC.cxx:354
 AliDielectronMC.cxx:355
 AliDielectronMC.cxx:356
 AliDielectronMC.cxx:357
 AliDielectronMC.cxx:358
 AliDielectronMC.cxx:359
 AliDielectronMC.cxx:360
 AliDielectronMC.cxx:361
 AliDielectronMC.cxx:362
 AliDielectronMC.cxx:363
 AliDielectronMC.cxx:364
 AliDielectronMC.cxx:365
 AliDielectronMC.cxx:366
 AliDielectronMC.cxx:367
 AliDielectronMC.cxx:368
 AliDielectronMC.cxx:369
 AliDielectronMC.cxx:370
 AliDielectronMC.cxx:371
 AliDielectronMC.cxx:372
 AliDielectronMC.cxx:373
 AliDielectronMC.cxx:374
 AliDielectronMC.cxx:375
 AliDielectronMC.cxx:376
 AliDielectronMC.cxx:377
 AliDielectronMC.cxx:378
 AliDielectronMC.cxx:379
 AliDielectronMC.cxx:380
 AliDielectronMC.cxx:381
 AliDielectronMC.cxx:382
 AliDielectronMC.cxx:383
 AliDielectronMC.cxx:384
 AliDielectronMC.cxx:385
 AliDielectronMC.cxx:386
 AliDielectronMC.cxx:387
 AliDielectronMC.cxx:388
 AliDielectronMC.cxx:389
 AliDielectronMC.cxx:390
 AliDielectronMC.cxx:391
 AliDielectronMC.cxx:392
 AliDielectronMC.cxx:393
 AliDielectronMC.cxx:394
 AliDielectronMC.cxx:395
 AliDielectronMC.cxx:396
 AliDielectronMC.cxx:397
 AliDielectronMC.cxx:398
 AliDielectronMC.cxx:399
 AliDielectronMC.cxx:400
 AliDielectronMC.cxx:401
 AliDielectronMC.cxx:402
 AliDielectronMC.cxx:403
 AliDielectronMC.cxx:404
 AliDielectronMC.cxx:405
 AliDielectronMC.cxx:406
 AliDielectronMC.cxx:407
 AliDielectronMC.cxx:408
 AliDielectronMC.cxx:409
 AliDielectronMC.cxx:410
 AliDielectronMC.cxx:411
 AliDielectronMC.cxx:412
 AliDielectronMC.cxx:413
 AliDielectronMC.cxx:414
 AliDielectronMC.cxx:415
 AliDielectronMC.cxx:416
 AliDielectronMC.cxx:417
 AliDielectronMC.cxx:418
 AliDielectronMC.cxx:419
 AliDielectronMC.cxx:420
 AliDielectronMC.cxx:421
 AliDielectronMC.cxx:422
 AliDielectronMC.cxx:423
 AliDielectronMC.cxx:424
 AliDielectronMC.cxx:425
 AliDielectronMC.cxx:426
 AliDielectronMC.cxx:427
 AliDielectronMC.cxx:428
 AliDielectronMC.cxx:429
 AliDielectronMC.cxx:430
 AliDielectronMC.cxx:431
 AliDielectronMC.cxx:432
 AliDielectronMC.cxx:433
 AliDielectronMC.cxx:434
 AliDielectronMC.cxx:435
 AliDielectronMC.cxx:436
 AliDielectronMC.cxx:437
 AliDielectronMC.cxx:438
 AliDielectronMC.cxx:439
 AliDielectronMC.cxx:440
 AliDielectronMC.cxx:441
 AliDielectronMC.cxx:442
 AliDielectronMC.cxx:443
 AliDielectronMC.cxx:444
 AliDielectronMC.cxx:445
 AliDielectronMC.cxx:446
 AliDielectronMC.cxx:447
 AliDielectronMC.cxx:448
 AliDielectronMC.cxx:449
 AliDielectronMC.cxx:450
 AliDielectronMC.cxx:451
 AliDielectronMC.cxx:452
 AliDielectronMC.cxx:453
 AliDielectronMC.cxx:454
 AliDielectronMC.cxx:455
 AliDielectronMC.cxx:456
 AliDielectronMC.cxx:457
 AliDielectronMC.cxx:458
 AliDielectronMC.cxx:459
 AliDielectronMC.cxx:460
 AliDielectronMC.cxx:461
 AliDielectronMC.cxx:462
 AliDielectronMC.cxx:463
 AliDielectronMC.cxx:464
 AliDielectronMC.cxx:465
 AliDielectronMC.cxx:466
 AliDielectronMC.cxx:467
 AliDielectronMC.cxx:468
 AliDielectronMC.cxx:469
 AliDielectronMC.cxx:470
 AliDielectronMC.cxx:471
 AliDielectronMC.cxx:472
 AliDielectronMC.cxx:473
 AliDielectronMC.cxx:474
 AliDielectronMC.cxx:475
 AliDielectronMC.cxx:476
 AliDielectronMC.cxx:477
 AliDielectronMC.cxx:478
 AliDielectronMC.cxx:479
 AliDielectronMC.cxx:480
 AliDielectronMC.cxx:481
 AliDielectronMC.cxx:482
 AliDielectronMC.cxx:483
 AliDielectronMC.cxx:484
 AliDielectronMC.cxx:485
 AliDielectronMC.cxx:486
 AliDielectronMC.cxx:487
 AliDielectronMC.cxx:488
 AliDielectronMC.cxx:489
 AliDielectronMC.cxx:490
 AliDielectronMC.cxx:491
 AliDielectronMC.cxx:492
 AliDielectronMC.cxx:493
 AliDielectronMC.cxx:494
 AliDielectronMC.cxx:495
 AliDielectronMC.cxx:496
 AliDielectronMC.cxx:497
 AliDielectronMC.cxx:498
 AliDielectronMC.cxx:499
 AliDielectronMC.cxx:500
 AliDielectronMC.cxx:501
 AliDielectronMC.cxx:502
 AliDielectronMC.cxx:503
 AliDielectronMC.cxx:504
 AliDielectronMC.cxx:505
 AliDielectronMC.cxx:506
 AliDielectronMC.cxx:507
 AliDielectronMC.cxx:508
 AliDielectronMC.cxx:509
 AliDielectronMC.cxx:510
 AliDielectronMC.cxx:511
 AliDielectronMC.cxx:512
 AliDielectronMC.cxx:513
 AliDielectronMC.cxx:514
 AliDielectronMC.cxx:515
 AliDielectronMC.cxx:516
 AliDielectronMC.cxx:517
 AliDielectronMC.cxx:518
 AliDielectronMC.cxx:519
 AliDielectronMC.cxx:520
 AliDielectronMC.cxx:521
 AliDielectronMC.cxx:522
 AliDielectronMC.cxx:523
 AliDielectronMC.cxx:524
 AliDielectronMC.cxx:525
 AliDielectronMC.cxx:526
 AliDielectronMC.cxx:527
 AliDielectronMC.cxx:528
 AliDielectronMC.cxx:529
 AliDielectronMC.cxx:530
 AliDielectronMC.cxx:531
 AliDielectronMC.cxx:532
 AliDielectronMC.cxx:533
 AliDielectronMC.cxx:534
 AliDielectronMC.cxx:535
 AliDielectronMC.cxx:536
 AliDielectronMC.cxx:537
 AliDielectronMC.cxx:538
 AliDielectronMC.cxx:539
 AliDielectronMC.cxx:540
 AliDielectronMC.cxx:541
 AliDielectronMC.cxx:542
 AliDielectronMC.cxx:543
 AliDielectronMC.cxx:544
 AliDielectronMC.cxx:545
 AliDielectronMC.cxx:546
 AliDielectronMC.cxx:547
 AliDielectronMC.cxx:548
 AliDielectronMC.cxx:549
 AliDielectronMC.cxx:550
 AliDielectronMC.cxx:551
 AliDielectronMC.cxx:552
 AliDielectronMC.cxx:553
 AliDielectronMC.cxx:554
 AliDielectronMC.cxx:555
 AliDielectronMC.cxx:556
 AliDielectronMC.cxx:557
 AliDielectronMC.cxx:558
 AliDielectronMC.cxx:559
 AliDielectronMC.cxx:560
 AliDielectronMC.cxx:561
 AliDielectronMC.cxx:562
 AliDielectronMC.cxx:563
 AliDielectronMC.cxx:564
 AliDielectronMC.cxx:565
 AliDielectronMC.cxx:566
 AliDielectronMC.cxx:567
 AliDielectronMC.cxx:568
 AliDielectronMC.cxx:569
 AliDielectronMC.cxx:570
 AliDielectronMC.cxx:571
 AliDielectronMC.cxx:572
 AliDielectronMC.cxx:573
 AliDielectronMC.cxx:574
 AliDielectronMC.cxx:575
 AliDielectronMC.cxx:576
 AliDielectronMC.cxx:577
 AliDielectronMC.cxx:578
 AliDielectronMC.cxx:579
 AliDielectronMC.cxx:580
 AliDielectronMC.cxx:581
 AliDielectronMC.cxx:582
 AliDielectronMC.cxx:583
 AliDielectronMC.cxx:584
 AliDielectronMC.cxx:585
 AliDielectronMC.cxx:586
 AliDielectronMC.cxx:587
 AliDielectronMC.cxx:588
 AliDielectronMC.cxx:589
 AliDielectronMC.cxx:590
 AliDielectronMC.cxx:591
 AliDielectronMC.cxx:592
 AliDielectronMC.cxx:593
 AliDielectronMC.cxx:594
 AliDielectronMC.cxx:595
 AliDielectronMC.cxx:596
 AliDielectronMC.cxx:597
 AliDielectronMC.cxx:598
 AliDielectronMC.cxx:599
 AliDielectronMC.cxx:600
 AliDielectronMC.cxx:601
 AliDielectronMC.cxx:602
 AliDielectronMC.cxx:603
 AliDielectronMC.cxx:604
 AliDielectronMC.cxx:605
 AliDielectronMC.cxx:606
 AliDielectronMC.cxx:607
 AliDielectronMC.cxx:608
 AliDielectronMC.cxx:609
 AliDielectronMC.cxx:610
 AliDielectronMC.cxx:611
 AliDielectronMC.cxx:612
 AliDielectronMC.cxx:613
 AliDielectronMC.cxx:614
 AliDielectronMC.cxx:615
 AliDielectronMC.cxx:616
 AliDielectronMC.cxx:617
 AliDielectronMC.cxx:618
 AliDielectronMC.cxx:619
 AliDielectronMC.cxx:620
 AliDielectronMC.cxx:621
 AliDielectronMC.cxx:622
 AliDielectronMC.cxx:623
 AliDielectronMC.cxx:624
 AliDielectronMC.cxx:625
 AliDielectronMC.cxx:626
 AliDielectronMC.cxx:627
 AliDielectronMC.cxx:628
 AliDielectronMC.cxx:629
 AliDielectronMC.cxx:630
 AliDielectronMC.cxx:631
 AliDielectronMC.cxx:632
 AliDielectronMC.cxx:633
 AliDielectronMC.cxx:634
 AliDielectronMC.cxx:635
 AliDielectronMC.cxx:636
 AliDielectronMC.cxx:637
 AliDielectronMC.cxx:638
 AliDielectronMC.cxx:639
 AliDielectronMC.cxx:640
 AliDielectronMC.cxx:641
 AliDielectronMC.cxx:642
 AliDielectronMC.cxx:643
 AliDielectronMC.cxx:644
 AliDielectronMC.cxx:645
 AliDielectronMC.cxx:646
 AliDielectronMC.cxx:647
 AliDielectronMC.cxx:648
 AliDielectronMC.cxx:649
 AliDielectronMC.cxx:650
 AliDielectronMC.cxx:651
 AliDielectronMC.cxx:652
 AliDielectronMC.cxx:653
 AliDielectronMC.cxx:654
 AliDielectronMC.cxx:655
 AliDielectronMC.cxx:656
 AliDielectronMC.cxx:657
 AliDielectronMC.cxx:658
 AliDielectronMC.cxx:659
 AliDielectronMC.cxx:660
 AliDielectronMC.cxx:661
 AliDielectronMC.cxx:662
 AliDielectronMC.cxx:663
 AliDielectronMC.cxx:664
 AliDielectronMC.cxx:665
 AliDielectronMC.cxx:666
 AliDielectronMC.cxx:667
 AliDielectronMC.cxx:668
 AliDielectronMC.cxx:669
 AliDielectronMC.cxx:670
 AliDielectronMC.cxx:671
 AliDielectronMC.cxx:672
 AliDielectronMC.cxx:673
 AliDielectronMC.cxx:674
 AliDielectronMC.cxx:675
 AliDielectronMC.cxx:676
 AliDielectronMC.cxx:677
 AliDielectronMC.cxx:678
 AliDielectronMC.cxx:679
 AliDielectronMC.cxx:680
 AliDielectronMC.cxx:681
 AliDielectronMC.cxx:682
 AliDielectronMC.cxx:683
 AliDielectronMC.cxx:684
 AliDielectronMC.cxx:685
 AliDielectronMC.cxx:686
 AliDielectronMC.cxx:687
 AliDielectronMC.cxx:688
 AliDielectronMC.cxx:689
 AliDielectronMC.cxx:690
 AliDielectronMC.cxx:691
 AliDielectronMC.cxx:692
 AliDielectronMC.cxx:693
 AliDielectronMC.cxx:694
 AliDielectronMC.cxx:695
 AliDielectronMC.cxx:696
 AliDielectronMC.cxx:697
 AliDielectronMC.cxx:698
 AliDielectronMC.cxx:699
 AliDielectronMC.cxx:700
 AliDielectronMC.cxx:701
 AliDielectronMC.cxx:702
 AliDielectronMC.cxx:703
 AliDielectronMC.cxx:704
 AliDielectronMC.cxx:705
 AliDielectronMC.cxx:706
 AliDielectronMC.cxx:707
 AliDielectronMC.cxx:708
 AliDielectronMC.cxx:709
 AliDielectronMC.cxx:710
 AliDielectronMC.cxx:711
 AliDielectronMC.cxx:712
 AliDielectronMC.cxx:713
 AliDielectronMC.cxx:714
 AliDielectronMC.cxx:715
 AliDielectronMC.cxx:716
 AliDielectronMC.cxx:717
 AliDielectronMC.cxx:718
 AliDielectronMC.cxx:719
 AliDielectronMC.cxx:720
 AliDielectronMC.cxx:721
 AliDielectronMC.cxx:722
 AliDielectronMC.cxx:723
 AliDielectronMC.cxx:724
 AliDielectronMC.cxx:725
 AliDielectronMC.cxx:726
 AliDielectronMC.cxx:727
 AliDielectronMC.cxx:728
 AliDielectronMC.cxx:729
 AliDielectronMC.cxx:730
 AliDielectronMC.cxx:731
 AliDielectronMC.cxx:732
 AliDielectronMC.cxx:733
 AliDielectronMC.cxx:734
 AliDielectronMC.cxx:735
 AliDielectronMC.cxx:736
 AliDielectronMC.cxx:737
 AliDielectronMC.cxx:738
 AliDielectronMC.cxx:739
 AliDielectronMC.cxx:740
 AliDielectronMC.cxx:741
 AliDielectronMC.cxx:742
 AliDielectronMC.cxx:743
 AliDielectronMC.cxx:744
 AliDielectronMC.cxx:745
 AliDielectronMC.cxx:746
 AliDielectronMC.cxx:747
 AliDielectronMC.cxx:748
 AliDielectronMC.cxx:749
 AliDielectronMC.cxx:750
 AliDielectronMC.cxx:751
 AliDielectronMC.cxx:752
 AliDielectronMC.cxx:753
 AliDielectronMC.cxx:754
 AliDielectronMC.cxx:755
 AliDielectronMC.cxx:756
 AliDielectronMC.cxx:757
 AliDielectronMC.cxx:758
 AliDielectronMC.cxx:759
 AliDielectronMC.cxx:760
 AliDielectronMC.cxx:761
 AliDielectronMC.cxx:762
 AliDielectronMC.cxx:763
 AliDielectronMC.cxx:764
 AliDielectronMC.cxx:765
 AliDielectronMC.cxx:766
 AliDielectronMC.cxx:767
 AliDielectronMC.cxx:768
 AliDielectronMC.cxx:769
 AliDielectronMC.cxx:770
 AliDielectronMC.cxx:771
 AliDielectronMC.cxx:772
 AliDielectronMC.cxx:773
 AliDielectronMC.cxx:774
 AliDielectronMC.cxx:775
 AliDielectronMC.cxx:776
 AliDielectronMC.cxx:777
 AliDielectronMC.cxx:778
 AliDielectronMC.cxx:779
 AliDielectronMC.cxx:780
 AliDielectronMC.cxx:781
 AliDielectronMC.cxx:782
 AliDielectronMC.cxx:783
 AliDielectronMC.cxx:784
 AliDielectronMC.cxx:785
 AliDielectronMC.cxx:786
 AliDielectronMC.cxx:787
 AliDielectronMC.cxx:788
 AliDielectronMC.cxx:789
 AliDielectronMC.cxx:790
 AliDielectronMC.cxx:791
 AliDielectronMC.cxx:792
 AliDielectronMC.cxx:793
 AliDielectronMC.cxx:794
 AliDielectronMC.cxx:795
 AliDielectronMC.cxx:796
 AliDielectronMC.cxx:797
 AliDielectronMC.cxx:798
 AliDielectronMC.cxx:799
 AliDielectronMC.cxx:800
 AliDielectronMC.cxx:801
 AliDielectronMC.cxx:802
 AliDielectronMC.cxx:803
 AliDielectronMC.cxx:804
 AliDielectronMC.cxx:805
 AliDielectronMC.cxx:806
 AliDielectronMC.cxx:807
 AliDielectronMC.cxx:808
 AliDielectronMC.cxx:809
 AliDielectronMC.cxx:810
 AliDielectronMC.cxx:811
 AliDielectronMC.cxx:812
 AliDielectronMC.cxx:813
 AliDielectronMC.cxx:814
 AliDielectronMC.cxx:815
 AliDielectronMC.cxx:816
 AliDielectronMC.cxx:817
 AliDielectronMC.cxx:818
 AliDielectronMC.cxx:819
 AliDielectronMC.cxx:820
 AliDielectronMC.cxx:821
 AliDielectronMC.cxx:822
 AliDielectronMC.cxx:823
 AliDielectronMC.cxx:824
 AliDielectronMC.cxx:825
 AliDielectronMC.cxx:826
 AliDielectronMC.cxx:827
 AliDielectronMC.cxx:828
 AliDielectronMC.cxx:829
 AliDielectronMC.cxx:830
 AliDielectronMC.cxx:831
 AliDielectronMC.cxx:832
 AliDielectronMC.cxx:833
 AliDielectronMC.cxx:834
 AliDielectronMC.cxx:835
 AliDielectronMC.cxx:836
 AliDielectronMC.cxx:837
 AliDielectronMC.cxx:838
 AliDielectronMC.cxx:839
 AliDielectronMC.cxx:840
 AliDielectronMC.cxx:841
 AliDielectronMC.cxx:842
 AliDielectronMC.cxx:843
 AliDielectronMC.cxx:844
 AliDielectronMC.cxx:845
 AliDielectronMC.cxx:846
 AliDielectronMC.cxx:847
 AliDielectronMC.cxx:848
 AliDielectronMC.cxx:849
 AliDielectronMC.cxx:850
 AliDielectronMC.cxx:851
 AliDielectronMC.cxx:852
 AliDielectronMC.cxx:853
 AliDielectronMC.cxx:854
 AliDielectronMC.cxx:855
 AliDielectronMC.cxx:856
 AliDielectronMC.cxx:857
 AliDielectronMC.cxx:858
 AliDielectronMC.cxx:859
 AliDielectronMC.cxx:860
 AliDielectronMC.cxx:861
 AliDielectronMC.cxx:862
 AliDielectronMC.cxx:863
 AliDielectronMC.cxx:864
 AliDielectronMC.cxx:865
 AliDielectronMC.cxx:866
 AliDielectronMC.cxx:867
 AliDielectronMC.cxx:868
 AliDielectronMC.cxx:869
 AliDielectronMC.cxx:870
 AliDielectronMC.cxx:871
 AliDielectronMC.cxx:872
 AliDielectronMC.cxx:873
 AliDielectronMC.cxx:874
 AliDielectronMC.cxx:875
 AliDielectronMC.cxx:876
 AliDielectronMC.cxx:877
 AliDielectronMC.cxx:878
 AliDielectronMC.cxx:879
 AliDielectronMC.cxx:880
 AliDielectronMC.cxx:881
 AliDielectronMC.cxx:882
 AliDielectronMC.cxx:883
 AliDielectronMC.cxx:884
 AliDielectronMC.cxx:885
 AliDielectronMC.cxx:886
 AliDielectronMC.cxx:887
 AliDielectronMC.cxx:888
 AliDielectronMC.cxx:889
 AliDielectronMC.cxx:890
 AliDielectronMC.cxx:891
 AliDielectronMC.cxx:892
 AliDielectronMC.cxx:893
 AliDielectronMC.cxx:894
 AliDielectronMC.cxx:895
 AliDielectronMC.cxx:896
 AliDielectronMC.cxx:897
 AliDielectronMC.cxx:898
 AliDielectronMC.cxx:899
 AliDielectronMC.cxx:900
 AliDielectronMC.cxx:901
 AliDielectronMC.cxx:902
 AliDielectronMC.cxx:903
 AliDielectronMC.cxx:904
 AliDielectronMC.cxx:905
 AliDielectronMC.cxx:906
 AliDielectronMC.cxx:907
 AliDielectronMC.cxx:908
 AliDielectronMC.cxx:909
 AliDielectronMC.cxx:910
 AliDielectronMC.cxx:911
 AliDielectronMC.cxx:912
 AliDielectronMC.cxx:913
 AliDielectronMC.cxx:914
 AliDielectronMC.cxx:915
 AliDielectronMC.cxx:916
 AliDielectronMC.cxx:917
 AliDielectronMC.cxx:918
 AliDielectronMC.cxx:919
 AliDielectronMC.cxx:920
 AliDielectronMC.cxx:921
 AliDielectronMC.cxx:922
 AliDielectronMC.cxx:923
 AliDielectronMC.cxx:924
 AliDielectronMC.cxx:925
 AliDielectronMC.cxx:926
 AliDielectronMC.cxx:927
 AliDielectronMC.cxx:928
 AliDielectronMC.cxx:929
 AliDielectronMC.cxx:930
 AliDielectronMC.cxx:931
 AliDielectronMC.cxx:932
 AliDielectronMC.cxx:933
 AliDielectronMC.cxx:934
 AliDielectronMC.cxx:935
 AliDielectronMC.cxx:936
 AliDielectronMC.cxx:937
 AliDielectronMC.cxx:938
 AliDielectronMC.cxx:939
 AliDielectronMC.cxx:940
 AliDielectronMC.cxx:941
 AliDielectronMC.cxx:942
 AliDielectronMC.cxx:943
 AliDielectronMC.cxx:944
 AliDielectronMC.cxx:945
 AliDielectronMC.cxx:946
 AliDielectronMC.cxx:947
 AliDielectronMC.cxx:948
 AliDielectronMC.cxx:949
 AliDielectronMC.cxx:950
 AliDielectronMC.cxx:951
 AliDielectronMC.cxx:952
 AliDielectronMC.cxx:953
 AliDielectronMC.cxx:954
 AliDielectronMC.cxx:955
 AliDielectronMC.cxx:956
 AliDielectronMC.cxx:957
 AliDielectronMC.cxx:958
 AliDielectronMC.cxx:959
 AliDielectronMC.cxx:960
 AliDielectronMC.cxx:961
 AliDielectronMC.cxx:962
 AliDielectronMC.cxx:963
 AliDielectronMC.cxx:964
 AliDielectronMC.cxx:965
 AliDielectronMC.cxx:966
 AliDielectronMC.cxx:967
 AliDielectronMC.cxx:968
 AliDielectronMC.cxx:969
 AliDielectronMC.cxx:970
 AliDielectronMC.cxx:971
 AliDielectronMC.cxx:972
 AliDielectronMC.cxx:973
 AliDielectronMC.cxx:974
 AliDielectronMC.cxx:975
 AliDielectronMC.cxx:976
 AliDielectronMC.cxx:977
 AliDielectronMC.cxx:978
 AliDielectronMC.cxx:979
 AliDielectronMC.cxx:980
 AliDielectronMC.cxx:981
 AliDielectronMC.cxx:982
 AliDielectronMC.cxx:983
 AliDielectronMC.cxx:984
 AliDielectronMC.cxx:985
 AliDielectronMC.cxx:986
 AliDielectronMC.cxx:987
 AliDielectronMC.cxx:988
 AliDielectronMC.cxx:989
 AliDielectronMC.cxx:990
 AliDielectronMC.cxx:991
 AliDielectronMC.cxx:992
 AliDielectronMC.cxx:993
 AliDielectronMC.cxx:994
 AliDielectronMC.cxx:995
 AliDielectronMC.cxx:996
 AliDielectronMC.cxx:997
 AliDielectronMC.cxx:998
 AliDielectronMC.cxx:999
 AliDielectronMC.cxx:1000
 AliDielectronMC.cxx:1001
 AliDielectronMC.cxx:1002
 AliDielectronMC.cxx:1003
 AliDielectronMC.cxx:1004
 AliDielectronMC.cxx:1005
 AliDielectronMC.cxx:1006
 AliDielectronMC.cxx:1007
 AliDielectronMC.cxx:1008
 AliDielectronMC.cxx:1009
 AliDielectronMC.cxx:1010
 AliDielectronMC.cxx:1011
 AliDielectronMC.cxx:1012
 AliDielectronMC.cxx:1013
 AliDielectronMC.cxx:1014
 AliDielectronMC.cxx:1015
 AliDielectronMC.cxx:1016
 AliDielectronMC.cxx:1017
 AliDielectronMC.cxx:1018
 AliDielectronMC.cxx:1019
 AliDielectronMC.cxx:1020
 AliDielectronMC.cxx:1021
 AliDielectronMC.cxx:1022
 AliDielectronMC.cxx:1023
 AliDielectronMC.cxx:1024
 AliDielectronMC.cxx:1025
 AliDielectronMC.cxx:1026
 AliDielectronMC.cxx:1027
 AliDielectronMC.cxx:1028
 AliDielectronMC.cxx:1029
 AliDielectronMC.cxx:1030
 AliDielectronMC.cxx:1031
 AliDielectronMC.cxx:1032
 AliDielectronMC.cxx:1033
 AliDielectronMC.cxx:1034
 AliDielectronMC.cxx:1035
 AliDielectronMC.cxx:1036
 AliDielectronMC.cxx:1037
 AliDielectronMC.cxx:1038
 AliDielectronMC.cxx:1039
 AliDielectronMC.cxx:1040
 AliDielectronMC.cxx:1041
 AliDielectronMC.cxx:1042
 AliDielectronMC.cxx:1043
 AliDielectronMC.cxx:1044
 AliDielectronMC.cxx:1045
 AliDielectronMC.cxx:1046
 AliDielectronMC.cxx:1047
 AliDielectronMC.cxx:1048
 AliDielectronMC.cxx:1049
 AliDielectronMC.cxx:1050
 AliDielectronMC.cxx:1051
 AliDielectronMC.cxx:1052
 AliDielectronMC.cxx:1053
 AliDielectronMC.cxx:1054
 AliDielectronMC.cxx:1055
 AliDielectronMC.cxx:1056
 AliDielectronMC.cxx:1057
 AliDielectronMC.cxx:1058
 AliDielectronMC.cxx:1059
 AliDielectronMC.cxx:1060
 AliDielectronMC.cxx:1061
 AliDielectronMC.cxx:1062
 AliDielectronMC.cxx:1063
 AliDielectronMC.cxx:1064
 AliDielectronMC.cxx:1065
 AliDielectronMC.cxx:1066
 AliDielectronMC.cxx:1067
 AliDielectronMC.cxx:1068
 AliDielectronMC.cxx:1069
 AliDielectronMC.cxx:1070
 AliDielectronMC.cxx:1071
 AliDielectronMC.cxx:1072
 AliDielectronMC.cxx:1073
 AliDielectronMC.cxx:1074
 AliDielectronMC.cxx:1075
 AliDielectronMC.cxx:1076
 AliDielectronMC.cxx:1077
 AliDielectronMC.cxx:1078
 AliDielectronMC.cxx:1079
 AliDielectronMC.cxx:1080
 AliDielectronMC.cxx:1081
 AliDielectronMC.cxx:1082
 AliDielectronMC.cxx:1083
 AliDielectronMC.cxx:1084
 AliDielectronMC.cxx:1085
 AliDielectronMC.cxx:1086
 AliDielectronMC.cxx:1087
 AliDielectronMC.cxx:1088
 AliDielectronMC.cxx:1089
 AliDielectronMC.cxx:1090
 AliDielectronMC.cxx:1091
 AliDielectronMC.cxx:1092
 AliDielectronMC.cxx:1093
 AliDielectronMC.cxx:1094
 AliDielectronMC.cxx:1095
 AliDielectronMC.cxx:1096
 AliDielectronMC.cxx:1097
 AliDielectronMC.cxx:1098
 AliDielectronMC.cxx:1099
 AliDielectronMC.cxx:1100
 AliDielectronMC.cxx:1101
 AliDielectronMC.cxx:1102
 AliDielectronMC.cxx:1103
 AliDielectronMC.cxx:1104
 AliDielectronMC.cxx:1105
 AliDielectronMC.cxx:1106
 AliDielectronMC.cxx:1107
 AliDielectronMC.cxx:1108
 AliDielectronMC.cxx:1109
 AliDielectronMC.cxx:1110
 AliDielectronMC.cxx:1111
 AliDielectronMC.cxx:1112
 AliDielectronMC.cxx:1113
 AliDielectronMC.cxx:1114
 AliDielectronMC.cxx:1115
 AliDielectronMC.cxx:1116
 AliDielectronMC.cxx:1117
 AliDielectronMC.cxx:1118
 AliDielectronMC.cxx:1119
 AliDielectronMC.cxx:1120
 AliDielectronMC.cxx:1121
 AliDielectronMC.cxx:1122
 AliDielectronMC.cxx:1123
 AliDielectronMC.cxx:1124
 AliDielectronMC.cxx:1125
 AliDielectronMC.cxx:1126
 AliDielectronMC.cxx:1127
 AliDielectronMC.cxx:1128
 AliDielectronMC.cxx:1129
 AliDielectronMC.cxx:1130
 AliDielectronMC.cxx:1131
 AliDielectronMC.cxx:1132
 AliDielectronMC.cxx:1133
 AliDielectronMC.cxx:1134
 AliDielectronMC.cxx:1135
 AliDielectronMC.cxx:1136
 AliDielectronMC.cxx:1137
 AliDielectronMC.cxx:1138
 AliDielectronMC.cxx:1139
 AliDielectronMC.cxx:1140
 AliDielectronMC.cxx:1141
 AliDielectronMC.cxx:1142
 AliDielectronMC.cxx:1143
 AliDielectronMC.cxx:1144
 AliDielectronMC.cxx:1145
 AliDielectronMC.cxx:1146
 AliDielectronMC.cxx:1147
 AliDielectronMC.cxx:1148
 AliDielectronMC.cxx:1149
 AliDielectronMC.cxx:1150
 AliDielectronMC.cxx:1151
 AliDielectronMC.cxx:1152
 AliDielectronMC.cxx:1153
 AliDielectronMC.cxx:1154
 AliDielectronMC.cxx:1155
 AliDielectronMC.cxx:1156
 AliDielectronMC.cxx:1157
 AliDielectronMC.cxx:1158
 AliDielectronMC.cxx:1159
 AliDielectronMC.cxx:1160
 AliDielectronMC.cxx:1161
 AliDielectronMC.cxx:1162
 AliDielectronMC.cxx:1163
 AliDielectronMC.cxx:1164
 AliDielectronMC.cxx:1165
 AliDielectronMC.cxx:1166
 AliDielectronMC.cxx:1167
 AliDielectronMC.cxx:1168
 AliDielectronMC.cxx:1169
 AliDielectronMC.cxx:1170
 AliDielectronMC.cxx:1171
 AliDielectronMC.cxx:1172
 AliDielectronMC.cxx:1173
 AliDielectronMC.cxx:1174
 AliDielectronMC.cxx:1175
 AliDielectronMC.cxx:1176
 AliDielectronMC.cxx:1177
 AliDielectronMC.cxx:1178
 AliDielectronMC.cxx:1179
 AliDielectronMC.cxx:1180
 AliDielectronMC.cxx:1181
 AliDielectronMC.cxx:1182
 AliDielectronMC.cxx:1183
 AliDielectronMC.cxx:1184
 AliDielectronMC.cxx:1185
 AliDielectronMC.cxx:1186
 AliDielectronMC.cxx:1187
 AliDielectronMC.cxx:1188
 AliDielectronMC.cxx:1189
 AliDielectronMC.cxx:1190
 AliDielectronMC.cxx:1191
 AliDielectronMC.cxx:1192
 AliDielectronMC.cxx:1193
 AliDielectronMC.cxx:1194
 AliDielectronMC.cxx:1195
 AliDielectronMC.cxx:1196
 AliDielectronMC.cxx:1197
 AliDielectronMC.cxx:1198
 AliDielectronMC.cxx:1199
 AliDielectronMC.cxx:1200
 AliDielectronMC.cxx:1201
 AliDielectronMC.cxx:1202
 AliDielectronMC.cxx:1203
 AliDielectronMC.cxx:1204
 AliDielectronMC.cxx:1205
 AliDielectronMC.cxx:1206
 AliDielectronMC.cxx:1207
 AliDielectronMC.cxx:1208
 AliDielectronMC.cxx:1209
 AliDielectronMC.cxx:1210
 AliDielectronMC.cxx:1211
 AliDielectronMC.cxx:1212
 AliDielectronMC.cxx:1213
 AliDielectronMC.cxx:1214
 AliDielectronMC.cxx:1215
 AliDielectronMC.cxx:1216
 AliDielectronMC.cxx:1217
 AliDielectronMC.cxx:1218
 AliDielectronMC.cxx:1219
 AliDielectronMC.cxx:1220
 AliDielectronMC.cxx:1221
 AliDielectronMC.cxx:1222
 AliDielectronMC.cxx:1223
 AliDielectronMC.cxx:1224
 AliDielectronMC.cxx:1225
 AliDielectronMC.cxx:1226
 AliDielectronMC.cxx:1227
 AliDielectronMC.cxx:1228
 AliDielectronMC.cxx:1229
 AliDielectronMC.cxx:1230
 AliDielectronMC.cxx:1231
 AliDielectronMC.cxx:1232
 AliDielectronMC.cxx:1233
 AliDielectronMC.cxx:1234
 AliDielectronMC.cxx:1235
 AliDielectronMC.cxx:1236
 AliDielectronMC.cxx:1237
 AliDielectronMC.cxx:1238
 AliDielectronMC.cxx:1239
 AliDielectronMC.cxx:1240
 AliDielectronMC.cxx:1241
 AliDielectronMC.cxx:1242
 AliDielectronMC.cxx:1243
 AliDielectronMC.cxx:1244
 AliDielectronMC.cxx:1245
 AliDielectronMC.cxx:1246
 AliDielectronMC.cxx:1247
 AliDielectronMC.cxx:1248
 AliDielectronMC.cxx:1249
 AliDielectronMC.cxx:1250
 AliDielectronMC.cxx:1251
 AliDielectronMC.cxx:1252
 AliDielectronMC.cxx:1253
 AliDielectronMC.cxx:1254
 AliDielectronMC.cxx:1255
 AliDielectronMC.cxx:1256
 AliDielectronMC.cxx:1257
 AliDielectronMC.cxx:1258
 AliDielectronMC.cxx:1259
 AliDielectronMC.cxx:1260
 AliDielectronMC.cxx:1261
 AliDielectronMC.cxx:1262
 AliDielectronMC.cxx:1263
 AliDielectronMC.cxx:1264
 AliDielectronMC.cxx:1265
 AliDielectronMC.cxx:1266
 AliDielectronMC.cxx:1267
 AliDielectronMC.cxx:1268
 AliDielectronMC.cxx:1269
 AliDielectronMC.cxx:1270
 AliDielectronMC.cxx:1271
 AliDielectronMC.cxx:1272
 AliDielectronMC.cxx:1273
 AliDielectronMC.cxx:1274
 AliDielectronMC.cxx:1275
 AliDielectronMC.cxx:1276
 AliDielectronMC.cxx:1277
 AliDielectronMC.cxx:1278
 AliDielectronMC.cxx:1279
 AliDielectronMC.cxx:1280
 AliDielectronMC.cxx:1281
 AliDielectronMC.cxx:1282
 AliDielectronMC.cxx:1283
 AliDielectronMC.cxx:1284
 AliDielectronMC.cxx:1285
 AliDielectronMC.cxx:1286
 AliDielectronMC.cxx:1287
 AliDielectronMC.cxx:1288
 AliDielectronMC.cxx:1289
 AliDielectronMC.cxx:1290
 AliDielectronMC.cxx:1291
 AliDielectronMC.cxx:1292
 AliDielectronMC.cxx:1293
 AliDielectronMC.cxx:1294
 AliDielectronMC.cxx:1295
 AliDielectronMC.cxx:1296
 AliDielectronMC.cxx:1297
 AliDielectronMC.cxx:1298
 AliDielectronMC.cxx:1299
 AliDielectronMC.cxx:1300
 AliDielectronMC.cxx:1301
 AliDielectronMC.cxx:1302
 AliDielectronMC.cxx:1303
 AliDielectronMC.cxx:1304
 AliDielectronMC.cxx:1305
 AliDielectronMC.cxx:1306
 AliDielectronMC.cxx:1307
 AliDielectronMC.cxx:1308
 AliDielectronMC.cxx:1309
 AliDielectronMC.cxx:1310
 AliDielectronMC.cxx:1311
 AliDielectronMC.cxx:1312
 AliDielectronMC.cxx:1313
 AliDielectronMC.cxx:1314
 AliDielectronMC.cxx:1315
 AliDielectronMC.cxx:1316
 AliDielectronMC.cxx:1317
 AliDielectronMC.cxx:1318
 AliDielectronMC.cxx:1319
 AliDielectronMC.cxx:1320
 AliDielectronMC.cxx:1321
 AliDielectronMC.cxx:1322
 AliDielectronMC.cxx:1323
 AliDielectronMC.cxx:1324
 AliDielectronMC.cxx:1325
 AliDielectronMC.cxx:1326
 AliDielectronMC.cxx:1327
 AliDielectronMC.cxx:1328
 AliDielectronMC.cxx:1329
 AliDielectronMC.cxx:1330
 AliDielectronMC.cxx:1331
 AliDielectronMC.cxx:1332
 AliDielectronMC.cxx:1333
 AliDielectronMC.cxx:1334
 AliDielectronMC.cxx:1335
 AliDielectronMC.cxx:1336
 AliDielectronMC.cxx:1337
 AliDielectronMC.cxx:1338
 AliDielectronMC.cxx:1339
 AliDielectronMC.cxx:1340
 AliDielectronMC.cxx:1341
 AliDielectronMC.cxx:1342
 AliDielectronMC.cxx:1343
 AliDielectronMC.cxx:1344
 AliDielectronMC.cxx:1345
 AliDielectronMC.cxx:1346
 AliDielectronMC.cxx:1347
 AliDielectronMC.cxx:1348
 AliDielectronMC.cxx:1349
 AliDielectronMC.cxx:1350
 AliDielectronMC.cxx:1351
 AliDielectronMC.cxx:1352
 AliDielectronMC.cxx:1353
 AliDielectronMC.cxx:1354
 AliDielectronMC.cxx:1355
 AliDielectronMC.cxx:1356
 AliDielectronMC.cxx:1357
 AliDielectronMC.cxx:1358
 AliDielectronMC.cxx:1359
 AliDielectronMC.cxx:1360
 AliDielectronMC.cxx:1361
 AliDielectronMC.cxx:1362
 AliDielectronMC.cxx:1363
 AliDielectronMC.cxx:1364
 AliDielectronMC.cxx:1365
 AliDielectronMC.cxx:1366
 AliDielectronMC.cxx:1367
 AliDielectronMC.cxx:1368
 AliDielectronMC.cxx:1369
 AliDielectronMC.cxx:1370
 AliDielectronMC.cxx:1371
 AliDielectronMC.cxx:1372
 AliDielectronMC.cxx:1373
 AliDielectronMC.cxx:1374
 AliDielectronMC.cxx:1375
 AliDielectronMC.cxx:1376
 AliDielectronMC.cxx:1377
 AliDielectronMC.cxx:1378
 AliDielectronMC.cxx:1379
 AliDielectronMC.cxx:1380
 AliDielectronMC.cxx:1381
 AliDielectronMC.cxx:1382
 AliDielectronMC.cxx:1383
 AliDielectronMC.cxx:1384
 AliDielectronMC.cxx:1385
 AliDielectronMC.cxx:1386
 AliDielectronMC.cxx:1387
 AliDielectronMC.cxx:1388
 AliDielectronMC.cxx:1389
 AliDielectronMC.cxx:1390
 AliDielectronMC.cxx:1391
 AliDielectronMC.cxx:1392
 AliDielectronMC.cxx:1393
 AliDielectronMC.cxx:1394
 AliDielectronMC.cxx:1395
 AliDielectronMC.cxx:1396
 AliDielectronMC.cxx:1397
 AliDielectronMC.cxx:1398
 AliDielectronMC.cxx:1399
 AliDielectronMC.cxx:1400
 AliDielectronMC.cxx:1401
 AliDielectronMC.cxx:1402
 AliDielectronMC.cxx:1403
 AliDielectronMC.cxx:1404
 AliDielectronMC.cxx:1405
 AliDielectronMC.cxx:1406
 AliDielectronMC.cxx:1407
 AliDielectronMC.cxx:1408
 AliDielectronMC.cxx:1409
 AliDielectronMC.cxx:1410
 AliDielectronMC.cxx:1411
 AliDielectronMC.cxx:1412
 AliDielectronMC.cxx:1413
 AliDielectronMC.cxx:1414
 AliDielectronMC.cxx:1415
 AliDielectronMC.cxx:1416
 AliDielectronMC.cxx:1417
 AliDielectronMC.cxx:1418
 AliDielectronMC.cxx:1419
 AliDielectronMC.cxx:1420
 AliDielectronMC.cxx:1421
 AliDielectronMC.cxx:1422
 AliDielectronMC.cxx:1423
 AliDielectronMC.cxx:1424
 AliDielectronMC.cxx:1425
 AliDielectronMC.cxx:1426