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.                  *
 **************************************************************************/
//
//
//             Base class for Heavy Flavour Correlations Analysis
//             Single Event and Mixed Event Analysis are implemented
//
//-----------------------------------------------------------------------
//          
//
//						   Author S.Bjelogrlic
//                         Utrecht University 
//                      sandro.bjelogrlic@cern.ch
//
//-----------------------------------------------------------------------

/* $Id: AliHFCorrelator.cxx 64115 2013-09-05 12:34:55Z arossi $ */

#include <TParticle.h>
#include <TVector3.h>
#include <TChain.h>
#include "TROOT.h"
#include "AliHFCorrelator.h"
#include "AliRDHFCutsDStartoKpipi.h"
#include "AliHFAssociatedTrackCuts.h"
#include "AliEventPoolManager.h"
#include "AliReducedParticle.h"
#include "AliCentrality.h"
#include "AliAODMCParticle.h"

using std::cout;
using std::endl;

//_____________________________________________________
AliHFCorrelator::AliHFCorrelator() :
//
// default constructor
//
TNamed(),
fPoolMgr(0x0),         
fPool(0x0),
fhadcuts(0x0),
fAODEvent(0x0),
fDMesonCutObject(0x0),
fAssociatedTracks(0x0),
fmcArray(0x0),
fReducedPart(0x0),
fD0cand(0x0), 
fhypD0(0), 
fDCharge(0),

fmixing(kFALSE),
fmontecarlo(kFALSE),
fUseCentrality(kFALSE),
fUseReco(kTRUE),
fselect(kUndefined),

fUseImpactParameter(0),
fPIDmode(0),

fNofTracks(0),
fPoolContent(0),

fPhiMin(0),
fPhiMax(0),

fMultCentr(-1),

fPtTrigger(0),
fPhiTrigger(0),
fEtaTrigger(0),


fDeltaPhi(0),
fDeltaEta(0),
fk0InvMass(0)

{
	// default constructor	
}



//_____________________________________________________
AliHFCorrelator::AliHFCorrelator(const Char_t* name, AliHFAssociatedTrackCuts *cuts, Bool_t useCentrality) :
TNamed(name,"title"),
fPoolMgr(0x0),         
fPool(0x0),
fhadcuts(0x0),
fAODEvent(0x0),
fDMesonCutObject(0x0),
fAssociatedTracks(0x0),
fmcArray(0x0),
fReducedPart(0x0),
fD0cand(0x0), 
fhypD0(0),
fDCharge(0),

fmixing(kFALSE),
fmontecarlo(kFALSE),
fUseCentrality(useCentrality),
fUseReco(kTRUE),
fselect(kUndefined),
fUseImpactParameter(0),
fPIDmode(0),

fNofTracks(0),
fPoolContent(0),

fPhiMin(0),
fPhiMax(0),

fMultCentr(-1),

fPtTrigger(0),
fPhiTrigger(0),
fEtaTrigger(0),


fDeltaPhi(0),
fDeltaEta(0),
fk0InvMass(0)
{
	fhadcuts = cuts;
     if(!fDMesonCutObject) AliInfo("D meson cut object not loaded - if using centrality the estimator will be V0M!");
}

//_______________________________________________________________________________________
AliHFCorrelator::AliHFCorrelator(const Char_t* name, AliHFAssociatedTrackCuts *cuts, Bool_t useCentrality, AliRDHFCuts * cutObject) :
TNamed(name,"title"),
fPoolMgr(0x0),
fPool(0x0),
fhadcuts(0x0),
fAODEvent(0x0),
fDMesonCutObject(0x0),
fAssociatedTracks(0x0),
fmcArray(0x0),
fReducedPart(0x0),
fD0cand(0x0),
fhypD0(0),
fDCharge(0),

fmixing(kFALSE),
fmontecarlo(kFALSE),
fUseCentrality(useCentrality),
fUseReco(kTRUE),
fselect(kUndefined),
fUseImpactParameter(0),
fPIDmode(0),

fNofTracks(0),
fPoolContent(0),

fPhiMin(0),
fPhiMax(0),

fMultCentr(-1),

fPtTrigger(0),
fPhiTrigger(0),
fEtaTrigger(0),


fDeltaPhi(0),
fDeltaEta(0),
fk0InvMass(0)
{
	fhadcuts = cuts;
    fDMesonCutObject = cutObject;
    
    if(!fDMesonCutObject) AliInfo("D meson cut object not implemented properly! Check your centrality estimators");
}



//_____________________________________________________
AliHFCorrelator::~AliHFCorrelator() 
{
//
// destructor
//	
	
	if(fPoolMgr)  {delete fPoolMgr; fPoolMgr=0;}       
	if(fPool) {delete fPool; fPool=0;}
	if(fhadcuts) {delete fhadcuts; fhadcuts=0;}
	if(fAODEvent) {delete fAODEvent; fAODEvent=0;}
    if(fDMesonCutObject) {delete fDMesonCutObject; fDMesonCutObject=0;}
	if(fAssociatedTracks) {delete fAssociatedTracks; fAssociatedTracks=0;}
	if(fmcArray) {delete fmcArray; fmcArray=0;}
	if(fReducedPart) {delete fReducedPart; fReducedPart=0;}
	if(fD0cand) {delete fD0cand; fD0cand=0;}
	
	
	if(fNofTracks) fNofTracks = 0;
	
	if(fPhiMin) fPhiMin = 0;
	if(fPhiMax) fPhiMax = 0;
	
	if(fPtTrigger) fPtTrigger=0;
	if(fPhiTrigger) fPhiTrigger=0;
	if(fEtaTrigger) fEtaTrigger=0;
	
	if(fDeltaPhi) fDeltaPhi=0;
	if(fDeltaEta) fDeltaEta=0;
	
	if(fk0InvMass) fk0InvMass=0;
	
}
//_____________________________________________________
Bool_t AliHFCorrelator::DefineEventPool(){
	// definition of the Pool Manager for Event Mixing
	

	Int_t MaxNofEvents = fhadcuts->GetMaxNEventsInPool();
	Int_t MinNofTracks = fhadcuts->GetMinNTracksInPool();
	Int_t NofCentBins = fhadcuts->GetNCentPoolBins();
	Double_t * CentBins = fhadcuts->GetCentPoolBins();
	Int_t NofZVrtxBins = fhadcuts->GetNZvtxPoolBins();
	Double_t *ZVrtxBins = fhadcuts->GetZvtxPoolBins();
		
			
	fPoolMgr = new AliEventPoolManager(MaxNofEvents, MinNofTracks, NofCentBins, CentBins, NofZVrtxBins, ZVrtxBins);
	if(!fPoolMgr) return kFALSE;
	return kTRUE;
}
//_____________________________________________________
Bool_t AliHFCorrelator::Initialize(){
	
    //  std::cout << "AliHFCorrelator::Initialize"<< std::endl;
//  AliInfo("AliHFCorrelator::Initialize") ;
  if(!fAODEvent){
    AliInfo("No AOD event") ;
    return kFALSE;
  }
    //std::cout << "No AOD event" << std::endl;
	
	AliCentrality *centralityObj = 0;
	//Int_t multiplicity = -1;
	//Double_t MultipOrCent = -1;
	
	// initialize the pool for event mixing
	if(!fUseCentrality){ // pp, pA
	//multiplicity = fAODEvent->GetNumberOfTracks();
        //MultipOrCent = AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(fAODEvent,-1.,1.);
        fMultCentr = AliVertexingHFUtils::GetNumberOfTrackletsInEtaRange(fAODEvent,-1.,1.);
	//	MultipOrCent = multiplicity; // convert from Int_t to Double_t
     //   AliInfo(Form("Multiplicity is %f", MultipOrCent));
	}
	if(fUseCentrality){ // PbPb
		if(!fDMesonCutObject){
           
                centralityObj = ((AliVAODHeader*)fAODEvent->GetHeader())->GetCentralityP();
		fMultCentr = centralityObj->GetCentralityPercentileUnchecked("V0M");
        }
        else fMultCentr = fDMesonCutObject->GetCentrality(fAODEvent);
//		AliInfo(Form("Centrality is %f", MultipOrCent));
	}
	
	AliAODVertex *vtx = fAODEvent->GetPrimaryVertex();
	Double_t zvertex = vtx->GetZ(); // zvertex
	Double_t * CentBins = fhadcuts->GetCentPoolBins();
	Double_t poolmin=CentBins[0];
	Double_t poolmax=CentBins[fhadcuts->GetNCentPoolBins()];

	
		if(TMath::Abs(zvertex)>=10 || fMultCentr>poolmax || fMultCentr < poolmin) {
		if(!fUseCentrality)AliInfo(Form("Event with Zvertex = %.2f cm and multiplicity = %.0f out of pool bounds, SKIPPING",zvertex,fMultCentr));
		if(fUseCentrality) AliInfo(Form("Event with Zvertex = %.2f cm and centrality = %.1f  out of pool bounds, SKIPPING",zvertex,fMultCentr));

			return kFALSE;
		}
	
	fPool = fPoolMgr->GetEventPool(fMultCentr, zvertex);
	
	if (!fPool){
		AliInfo(Form("No pool found for multiplicity = %f, zVtx = %f cm", fMultCentr, zvertex));
	    return kFALSE;
	}
	//fPool->PrintInfo();
	return kTRUE;
}

//_____________________________________________________
Bool_t AliHFCorrelator::ProcessEventPool(){
	 // analysis on Mixed Events
	//cout << "AliHFCorrelator::ProcessEventPool"<< endl;
		if(!fmixing) return kFALSE;
		if(!fPool->IsReady()) return kFALSE;
		if(fPool->GetCurrentNEvents()<fhadcuts->GetMinEventsToMix()) return kFALSE;
	//	fPool->PrintInfo();
		fPoolContent = fPool->GetCurrentNEvents();
		
		return kTRUE;
	
}

//_____________________________________________________
Bool_t AliHFCorrelator::ProcessAssociatedTracks(Int_t EventLoopIndex, const TObjArray* associatedTracks){
  // associatedTracks is not deleted, it should be (if needed) deleted in the user task
  
  if(!fmixing){ // analysis on Single Event
    if(fAssociatedTracks){
      fAssociatedTracks->Delete();
      delete fAssociatedTracks;
    }      
    if(fselect==kHadron || fselect ==kKaon){
      fAssociatedTracks = AcceptAndReduceTracks(fAODEvent);
      fAssociatedTracks->SetOwner(kTRUE);
    }
    if(fselect==kKZero) {
      fAssociatedTracks = AcceptAndReduceKZero(fAODEvent);
      fAssociatedTracks->SetOwner(kTRUE);
    }	
    if(fselect==kElectron && associatedTracks) {
      fAssociatedTracks=new TObjArray(*associatedTracks);// Maybe better to call the copy constructor
      fAssociatedTracks->SetOwner(kFALSE);
    }
    
  }
  
  if(fmixing) { // analysis on Mixed Events
		
			
    fAssociatedTracks = fPool->GetEvent(EventLoopIndex);
				
    
    
    
  } // end if mixing
  
  if(!fAssociatedTracks) return kFALSE;
  
  fNofTracks = fAssociatedTracks->GetEntriesFast(); 
  
  return kTRUE;
	
}
//_____________________________________________________
Bool_t AliHFCorrelator::Correlate(Int_t loopindex){

	if(loopindex >= fNofTracks) return kFALSE;
	if(!fAssociatedTracks) return kFALSE;
	
	fReducedPart = (AliReducedParticle*)fAssociatedTracks->At(loopindex);
	

	fDeltaPhi = SetCorrectPhiRange(fPhiTrigger - fReducedPart->Phi());
	
	fDeltaEta = fEtaTrigger - fReducedPart->Eta();

	return kTRUE;
	
}
		
//_____________________________________________________
Bool_t AliHFCorrelator::PoolUpdate(const TObjArray* associatedTracks){

	if(!fmixing) return kFALSE;
	if(!fPool) return kFALSE;
	if(fmixing) { // update the pool for Event Mixing
		TObjArray* objArr = NULL;
		if(fselect==kHadron || fselect==kKaon) objArr = (TObjArray*)AcceptAndReduceTracks(fAODEvent);
		else if(fselect==kKZero) objArr = (TObjArray*)AcceptAndReduceKZero(fAODEvent);
		else if(fselect==kElectron && associatedTracks){
		  objArr = new TObjArray(*associatedTracks);
		}
		else return kFALSE;
		if(objArr->GetEntriesFast()>0) fPool->UpdatePool(objArr); // updating the pool only if there are entries in the array
	}
		
	return kTRUE;
	
}
		
//_____________________________________________________
Double_t AliHFCorrelator::SetCorrectPhiRange(Double_t phi){
	Double_t pi = TMath::Pi();
	
	if(phi<fPhiMin) phi = phi + 2*pi;
	if(phi>fPhiMax) phi = phi - 2*pi;
	
	return phi;
}

//_____________________________________________________
TObjArray*  AliHFCorrelator::AcceptAndReduceTracks(AliAODEvent* inputEvent){

  Double_t weight=1.;
  Int_t nTracks = inputEvent->GetNumberOfTracks();
  AliAODVertex * vtx = inputEvent->GetPrimaryVertex();
  Double_t pos[3],cov[6];
  vtx->GetXYZ(pos);
  vtx->GetCovarianceMatrix(cov);
  const AliESDVertex vESD(pos,cov,100.,100);
  
  Double_t Bz = inputEvent->GetMagneticField();
	
  
  TObjArray* tracksClone = new TObjArray;
  tracksClone->SetOwner(kTRUE);
  
  //*******************************************************
  // use reconstruction
  if(fUseReco){
    for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
      AliAODTrack* track = dynamic_cast<AliAODTrack*>(inputEvent->GetTrack(iTrack));
      if (!track) continue;
      if(!fhadcuts->IsHadronSelected(track,&vESD,Bz)) continue; // apply ESD level selections
      if(!fhadcuts->Charge(fDCharge,track)) continue; // apply selection on charge, if required

      Double_t pT = track->Pt();
      
      //compute impact parameter
      Double_t d0z0[2],covd0z0[3];
      Double_t d0=-999999.;
      if(fUseImpactParameter) track->PropagateToDCA(vtx,Bz,100,d0z0,covd0z0);
      else d0z0[0] = 1. ; // random number - be careful with the cuts you applied
      
      if(fUseImpactParameter==1) d0 = TMath::Abs(d0z0[0]); // use impact parameter
      if(fUseImpactParameter==2) { // use impact parameter over resolution
	if(TMath::Abs(covd0z0[0])>0.00000001) d0 = TMath::Abs(d0z0[0])/TMath::Sqrt(covd0z0[0]); 
	else d0 = -1.; // if the resoultion is Zero, rejects the track - to be on the safe side
	
      }
      
      if(fmontecarlo) {// THIS TO BE CHECKED
        Int_t hadLabel = track->GetLabel();
	if(hadLabel < 0) continue;	
      }
      
      if(!fhadcuts->CheckHadronKinematic(pT,d0)) continue; // apply kinematic cuts
      Bool_t rejectsoftpi = kTRUE;// TO BE CHECKED: DO WE WANT IT TO kTRUE AS A DEFAULT?
      if(fD0cand && !fmixing) rejectsoftpi = fhadcuts->InvMassDstarRejection(fD0cand,track,fhypD0); // TO BE CHECKED: WHY NOT FOR EM?
      
      
      if(fselect ==kKaon){	
	if(!fhadcuts->CheckKaonCompatibility(track,fmontecarlo,fmcArray,fPIDmode)) continue; // check if it is a Kaon - data and MC
      }
      weight=fhadcuts->GetTrackWeight(pT,track->Eta(),pos[2]);
      tracksClone->Add(new AliReducedParticle(track->Eta(), track->Phi(), pT,track->GetLabel(),track->GetID(),d0,rejectsoftpi,track->Charge(),weight));
    } // end loop on tracks
  } // end if use reconstruction kTRUE
  
  //*******************************************************
  
  //use MC truth
  if(fmontecarlo && !fUseReco){
    
    for (Int_t iPart=0; iPart<fmcArray->GetEntriesFast(); iPart++) { 
      AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(fmcArray->At(iPart));
      if (!mcPart) {
	AliWarning("MC Particle not found in tree, skipping"); 
	continue;
      }
      if(!mcPart->Charge()) continue; // consider only charged tracks
      
      Int_t PDG =TMath::Abs(mcPart->PdgCode()); 
if(fselect ==kHadron) {if(!((PDG==321)||(PDG==211)||(PDG==2212)||(PDG==13)||(PDG==11))) continue;} // select only if kaon, pion, proton, muon or electron
      else if(fselect ==kKaon) {if(!(PDG==321)) continue;} // select only if kaon
      else if(fselect ==kElectron) {if(!(PDG==11)) continue;} // select only if electron

      Double_t pT = mcPart->Pt();
      Double_t d0 =1; // set 1 fot the moment - no displacement calculation implemented yet
      if(!fhadcuts->CheckHadronKinematic(pT,d0)) continue; // apply kinematic cuts
      
      tracksClone->Add(new AliReducedParticle(mcPart->Eta(), mcPart->Phi(), pT,iPart,-1,d0,kFALSE,mcPart->Charge()));
    }
    
  } // end if use  MC truth
  
  
  return tracksClone;
}

//_____________________________________________________
TObjArray*  AliHFCorrelator::AcceptAndReduceKZero(AliAODEvent* inputEvent){
	
	Int_t nOfVZeros = inputEvent->GetNumberOfV0s();
	TObjArray* KZeroClone = new TObjArray;
	AliAODVertex *vertex1 = (AliAODVertex*)inputEvent->GetPrimaryVertex();

 // use reconstruction	 	
     if(fUseReco){
	Int_t v0label = -1;
	Int_t pdgDgK0toPipi[2] = {211,211};
	Double_t mPDGK0=0.497614;//TDatabasePDG::Instance()->GetParticle(310)->Mass();
	const Int_t size = inputEvent->GetNumberOfV0s();
	Int_t prevnegID[size];
	Int_t prevposID[size];
	for(Int_t iv0 =0; iv0< nOfVZeros; iv0++){// loop on all v0 candidates
		AliAODv0 *v0 = (static_cast<AliAODEvent*> (inputEvent))->GetV0(iv0);
		if(!v0) {
		  AliInfo(Form("is not a v0 at step, %d", iv0)) ;
		  //cout << "is not a v0 at step " << iv0 << endl;
		  continue;
		}
		
		if(!fhadcuts->IsKZeroSelected(v0,vertex1)) continue; // check if it is a k0
	    
		// checks to avoid double counting
		Int_t negID = -999;
		Int_t posID = -998;
		//Int_t a = 0;
		prevnegID[iv0] = -997;
		prevposID[iv0]= -996;
		negID = v0->GetNegID();
		posID = v0->GetPosID();
		Bool_t DoubleCounting = kFALSE;
		
		for(Int_t k=0; k<iv0; k++){
			if(((negID==prevnegID[k])&&(posID==prevposID[k]))||((negID==prevposID[k])&&(posID==prevnegID[k]))){
				DoubleCounting = kTRUE;
				//a=k;
				break;
			}//end if
		} // end for
		
		if(DoubleCounting) continue;
		else{ 
			prevposID[iv0] = posID; 
			prevnegID[iv0] = negID;
		}
		
		if(fmontecarlo)	v0label = v0->MatchToMC(310,fmcArray, 0, pdgDgK0toPipi); //match a K0 short
		Double_t k0pt = v0->Pt();
		Double_t k0eta = v0->Eta();
		Double_t k0Phi = v0->Phi();
	    fk0InvMass = v0->MassK0Short();	
		
		//if (loopindex == 0) {
		//	if(!plotassociation) ((TH2F*)fOutput->FindObject("KZeroSpectra"))->Fill(k0InvMass,k0pt); // spectra for all k0
		//	if(plotassociation) ((TH2F*)fOutput->FindObject("KZeroSpectraifHF"))->Fill(k0InvMass,k0pt); // spectra for k0 in association with a D*
		//}
		// if there are more D* candidates per event, loopindex == 0 makes sure you fill the mass spectra only once!
		
		if(TMath::Abs(fk0InvMass-mPDGK0)>3*0.004) continue; // select candidates within 3 sigma
		KZeroClone->Add(new AliReducedParticle(k0eta,k0Phi,k0pt,v0label));
		
	}
     } // end if use reconstruction kTRUE
	


//*********************************************************************//
     //use MC truth
     if(fmontecarlo && !fUseReco){
		
		for (Int_t iPart=0; iPart<fmcArray->GetEntriesFast(); iPart++) { 
			AliAODMCParticle* mcPart = dynamic_cast<AliAODMCParticle*>(fmcArray->At(iPart));
			if (!mcPart) {
				AliWarning("MC Particle not found in tree, skipping"); 
				continue;
			}
			
			Int_t PDG =TMath::Abs(mcPart->PdgCode()); 
			if(!(PDG==310)) continue; // select only if k0 short
		
			Double_t pT = mcPart->Pt();
            Double_t d0 =1; // set 1 fot the moment - no displacement calculation implemented yet
			if(!fhadcuts->CheckHadronKinematic(pT,d0)) continue; // apply kinematic cuts
			
			KZeroClone->Add(new AliReducedParticle(mcPart->Eta(), mcPart->Phi(), pT,iPart,-1,d0,kTRUE,mcPart->Charge()));
		}
		
	} // end if use  MC truth



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