ROOT logo
/**************************************************************************
 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
 *                                                                        *
 * Author: The ALICE Off-line Project.                                    *
 * Contributors are mentioned in the code where appropriate.              *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// class for light nuclei identification
// author: Eulogio Serradilla <eulogio.serradilla@cern.ch>

#include <Riostream.h>
#include <AliExternalTrackParam.h>
#include <TParticle.h>
#include <AliESDtrack.h>
#include <AliPID.h>
#include <AliITSPIDResponse.h>
#include <AliTPCPIDResponse.h>
#include <TPDGCode.h>
#include <AliAODMCParticle.h>
#include "AliLnID.h"

ClassImp(AliLnID)

AliLnID::AliLnID()
: TObject()
, fPidProcedure(kBayes)
, fRange(5.)
, fZexp(2)
, fITSpid(0)
, fTPCpid(0)
{
//
// Default constructor
//
	fSpecies[0] = AliPID::kElectron;
	fSpecies[1] = AliPID::kMuon;
	fSpecies[2] = AliPID::kPion;
	fSpecies[3] = AliPID::kKaon;
	fSpecies[4] = AliPID::kProton;
	fSpecies[5] = AliPID::kDeuteron;
	fSpecies[6] = AliPID::kTriton;
	fSpecies[7] = AliPID::kHe3;
	fSpecies[8] = AliPID::kAlpha;
	
	// equal prior probabilities for all particle species
	for(Int_t i=0; i<kSPECIES; ++i) fPrior[i]=1./kSPECIES;
	
	// ALEPH Bethe Bloch parameters for ITS
	Double_t param[] = { 0.13, 15.77/0.95, 4.95, 0.312, 2.14, 0.82};
	fITSpid = new AliITSPIDResponse(&param[0]);
	
	fTPCpid = new AliTPCPIDResponse();
	fTPCpid->SetSigma(0.06,0);
}

AliLnID::AliLnID(const AliLnID& other)
: TObject(other)
, fPidProcedure(other.fPidProcedure)
, fRange(other.fRange)
, fZexp(other.fZexp)
, fITSpid(0)
, fTPCpid(0)
{
//
// Copy constructor
//
	for(Int_t i=0; i < kSPECIES; ++i)
	{
		fSpecies[i] = other.fSpecies[i];
		fPrior[i]   = other.fPrior[i];
	}
	
	fITSpid = new AliITSPIDResponse(*(other.fITSpid));
	fTPCpid = new AliTPCPIDResponse(*(other.fTPCpid));
}

AliLnID& AliLnID::operator=(const AliLnID& other)
{
//
// Assignment operator
//
	if(&other == this) return *this; // check for self-assignment
	
	fPidProcedure = other.fPidProcedure;
	fRange = other.fRange;
	fZexp = other.fZexp;
	
	// deallocate memory
	delete fITSpid;
	delete fTPCpid;
	
	// copy
	TObject::operator=(other);
	
	for(Int_t i=0; i < kSPECIES; ++i)
	{
		fSpecies[i] = other.fSpecies[i];
		fPrior[i]   = other.fPrior[i];
	}
	
	fITSpid = new AliITSPIDResponse(*(other.fITSpid));
	fTPCpid = new AliTPCPIDResponse(*(other.fTPCpid));
	
	return *this;
}

void AliLnID::SetPriorProbabilities(Double_t e, Double_t mu, Double_t pi, Double_t k, Double_t p, Double_t d, Double_t t, Double_t he3, Double_t alpha)
{
//
// Set prior probabilities
//
	fPrior[0] = e; // electron
	fPrior[1] = mu; // muon
	fPrior[2] = pi; // pion
	fPrior[3] = k; // kaon
	fPrior[4] = p; // proton
	fPrior[5] = d; // deuteron
	fPrior[6] = t; // triton
	fPrior[7] = he3; // he3
	fPrior[8] = alpha; // alpha
}

void AliLnID::SetPriorProbabilities(const Double_t* prob)
{
//
// Set prior probabilities
//
	for(Int_t i=0; i < kSPECIES; ++i) fPrior[i] = prob[i];
}

void AliLnID::SetITSBetheBlochParams(const Double_t* par, Double_t res)
{
//
// Set ALEPH Bethe Bloch parameters for ITS
//
	delete fITSpid;
	Double_t param[] = { res, par[0], par[1], par[2], par[3], par[4]};
	fITSpid = new AliITSPIDResponse(&param[0]);
}

void AliLnID::SetTPCBetheBlochParams(const Double_t* par, Double_t mip, Double_t res)
{
//
// Set ALEPH Bethe Bloch parameters for TPC
//
	fTPCpid->SetMip(mip);
	fTPCpid->SetSigma(res,0);
	fTPCpid->SetBetheBlochParameters(par[0], par[1], par[2], par[3], par[4]);
}

void AliLnID::SetTPCBetheBlochParams(Double_t c0, Double_t c1, Double_t c2, Double_t c3, Double_t c4, Double_t mip, Double_t res)
{
//
// Set ALEPH Bethe Bloch parameters for TPC
//
	fTPCpid->SetMip(mip);
	fTPCpid->SetSigma(res,0);
	fTPCpid->SetBetheBlochParameters(c0, c1, c2, c3, c4);
}

AliLnID::~AliLnID()
{
//
// Default destructor
//
	delete fITSpid;
	delete fTPCpid;
}

Int_t AliLnID::GetPID(const TParticle* p) const
{
//
// Montecarlo PID
//
	return this->GetPID(p->GetPdgCode());
}

Int_t AliLnID::GetPID(const AliAODMCParticle* p) const
{
//
// Montecarlo PID
//
	return this->GetPID(p->GetPdgCode());
}

Int_t AliLnID::GetPID(Int_t pdgCode) const
{
//
// Montecarlo PID
//
	enum { kDeuteron=1000010020, kTriton=1000010030, kHelium3=1000020030, kAlpha=1000020040 };
	
	switch(TMath::Abs(pdgCode))
	{
		case kElectron:  return AliPID::kElectron;
		case kMuonMinus: return AliPID::kMuon;
		case kPiPlus:    return AliPID::kPion;
		case kKPlus:     return AliPID::kKaon;
		case kProton:    return AliPID::kProton;
		case kDeuteron:  return AliPID::kDeuteron;
		case kTriton:    return AliPID::kTriton;
		case kHelium3:   return AliPID::kHe3;
		case kAlpha:     return AliPID::kAlpha;
	}
	
	return -1;
}

Int_t AliLnID::GetPID(Int_t pidCode, Double_t pITS, Double_t dEdxITS, Int_t nPointsITS, Double_t pTPC, Double_t dEdxTPC, Int_t nPointsTPC, Double_t pTOF, Double_t beta, Double_t nSigITS, Double_t nSigTPC, Double_t nSigTOF) const
{
//
// PID according to the selected procedure
//
	if(fPidProcedure == kBayes)
	{
		return this->GetBayesPID(pITS, dEdxITS, nPointsITS, pTPC, dEdxTPC, nPointsTPC, pTOF, beta);
	}
	else if(fPidProcedure == kMaxLikelihood)
	{
		return this->GetMaxLikelihoodPID(pITS, dEdxITS, nPointsITS, pTPC, dEdxTPC, nPointsTPC, pTOF, beta);
	}
	else if(fPidProcedure == kITS)
	{
		return this->GetITSpid(pidCode, pITS, dEdxITS, nPointsITS, nSigITS);
	}
	else if(fPidProcedure == kTPC)
	{
		return this->GetTPCpid(pidCode, pTPC, dEdxTPC, nPointsTPC, nSigTPC);
	}
	else if(fPidProcedure == kITSTPC)
	{
		return this->GetITSTPCpid(pidCode, pITS, dEdxITS, nPointsITS, nSigITS, pTPC, dEdxTPC, nPointsTPC, nSigTPC);
	}
	else if(fPidProcedure == kTPCTOF)
	{
		return this->GetTPCTOFpid(pidCode, pTPC, dEdxTPC, nPointsTPC, nSigTPC, pTOF, beta, nSigTOF);
	}
	
	return -1;
}

Int_t AliLnID::GetITSpid(Int_t pidCode, Double_t pITS, Double_t dEdxITS, Double_t nPointsITS, Double_t nSigmaITS) const
{
//
// Check if particle with the given pid code is within
// +/- nSigma around the expected dEdx in the ITS
//
	if( this->GetITSmatch(pidCode, pITS, dEdxITS, static_cast<Int_t>(nPointsITS), nSigmaITS)) return pidCode;
	
	return -1;
}

Int_t AliLnID::GetTPCpid(Int_t pidCode, Double_t pTPC, Double_t dEdxTPC, Double_t nPointsTPC, Double_t nSigmaTPC) const
{
//
// Check if particle with the given pid code is within
// +/- nSigma around the expected dEdx in the TPC
//
	if( this->GetTPCmatch(pidCode, pTPC, dEdxTPC, nPointsTPC, nSigmaTPC)) return pidCode;
	
	return -1;
}

Int_t AliLnID::GetTPCTOFpid(Int_t pidCode, Double_t pTPC, Double_t dEdxTPC, Double_t nPointsTPC, Double_t nSigmaTPC, Double_t pTOF, Double_t beta, Double_t nSigmaTOF) const
{
//
// Check if particle with the given pid code is within
// +/- nSigmaTPC around the expected dEdx in the TPC
// AND +/- nSigmaTOF around the expected beta in the TOF (when available)
//
	if(  beta > 0 )
	{
		if( this->GetTPCmatch(pidCode, pTPC, dEdxTPC, nPointsTPC, nSigmaTPC)
		 && this->GetTOFmatch(pidCode, pTOF, beta, nSigmaTOF))
		{
			return pidCode;
		}
	}
	else
	{
		if( this->GetTPCmatch(pidCode, pTPC, dEdxTPC, nPointsTPC, nSigmaTPC))
		{
			return pidCode;
		}
	}
	
	return -1;
}

Int_t AliLnID::GetITSTPCpid(Int_t pidCode, Double_t pITS, Double_t dEdxITS, Int_t nPointsITS, Double_t nSigmaITS, Double_t pTPC, Double_t dEdxTPC, Double_t nPointsTPC, Double_t nSigmaTPC) const
{
//
// Check if particle with the given pid code is within
// +/- nSigmaITS around the expected dEdx in the ITS
// AND +/- nSigmaTPC around the expected dEdx in the TPC
//
	if( this->GetITSmatch(pidCode, pITS, dEdxITS, nPointsITS, nSigmaITS)
	  && this->GetTPCmatch(pidCode, pTPC, dEdxTPC, nPointsTPC, nSigmaTPC))
	{
		return pidCode;
	}
	
	return -1;
}

Int_t AliLnID::GetIndexOfMaxValue(const Double_t* w) const
{
//
// Index with maximum value in the array of size kSPECIES
//
	Double_t wmax= 0;
	Int_t imax = -1;
	for(Int_t i=0; i < kSPECIES; ++i)
	{
		if(w[i] > wmax)
		{
			wmax = w[i];
			imax = i;
		}
	}
	
	return imax;
}

Bool_t AliLnID::GetLikelihood(Double_t pITS, Double_t dEdxITS, Int_t nPointsITS, Double_t pTPC, Double_t dEdxTPC, Int_t nPointsTPC, Double_t pTOF, Double_t beta, Double_t* r) const
{
//
// Fill r array with the combined likelihood for ITS, TPC and TOF when possible
// return 1 if success
//
	Double_t its[kSPECIES];
	Double_t tpc[kSPECIES];
	Double_t tof[kSPECIES];
	
	Bool_t itsPid = this->GetITSlikelihood(pITS, dEdxITS, nPointsITS, its);
	Bool_t tpcPid = this->GetTPClikelihood(pTPC, dEdxTPC, nPointsTPC, tpc);
	Bool_t tofPid = this->GetTOFlikelihood(pTOF, beta, tof);
	
	if(!itsPid && !tpcPid && !tofPid) return kFALSE;
	
	// Combine detector responses
	
	for(Int_t i=0; i<kSPECIES; ++i) r[i]=1.;
	
	if(itsPid)
	{
		for(Int_t i=0; i < kSPECIES; ++i) r[i] *= its[i];
	}
	if(tpcPid)
	{
		for(Int_t i=0; i < kSPECIES; ++i) r[i] *= tpc[i];
	}
	if(tofPid)
	{
		for(Int_t i=0; i < kSPECIES; ++i) r[i] *= tof[i];
	}
	
	return kTRUE;
}

Int_t AliLnID::GetMaxLikelihoodPID(Double_t pITS, Double_t dEdxITS, Int_t nPointsITS, Double_t pTPC, Double_t dEdxTPC, Int_t nPointsTPC, Double_t pTOF, Double_t beta) const
{
//
// Maximum likelihood principle
//
	Double_t r[kSPECIES];
	
	if(!this->GetLikelihood(pITS, dEdxITS, nPointsITS, pTPC, dEdxTPC, nPointsTPC, pTOF, beta, r)) return -1;
	
	Int_t imax = this->GetIndexOfMaxValue(r);
	
	if(imax < 0) return -1;
	
	return fSpecies[imax];
}

Int_t AliLnID::GetBayesPID(Double_t pITS, Double_t dEdxITS, Int_t nPointsITS, Double_t pTPC, Double_t dEdxTPC, Int_t nPointsTPC, Double_t pTOF, Double_t beta) const
{
//
// Bayesian inference
//
	Double_t r[kSPECIES];
	
	if(!this->GetLikelihood(pITS, dEdxITS, nPointsITS, pTPC, dEdxTPC, nPointsTPC, pTOF, beta, r)) return -1;
	
	// Bayes' rule
	
	Double_t w[kSPECIES] = {0};
	for(Int_t i = 0; i < kSPECIES; ++i) w[i] = r[i]*fPrior[i];  // no need to normalize
	
	Int_t imax = this->GetIndexOfMaxValue(w);
	
	if(imax < 0) return -1;
	
	return fSpecies[imax];
}

Bool_t AliLnID::GetITSlikelihood(Double_t pITS, Double_t dEdx, Int_t nPointsITS, Double_t* r) const
{
//
// Probability of dEdx in the ITS for each particle species.
// Adapted from STEER/ESD/AliESDpid.cxx
// (truncated mean method)
//
	if( pITS <= 0) return kFALSE;
	if( dEdx < 1.) return kFALSE;
	if( nPointsITS < 3) return kFALSE;
	
	Bool_t mismatch = kTRUE;
	
	Double_t sum = 0;
	for (Int_t i=0; i<kSPECIES; ++i)
	{
		Double_t mass = AliPID::ParticleMass(fSpecies[i]);
		Double_t p = (fSpecies[i] > AliPID::kTriton) ? 2.*pITS : pITS; // correct by Z
		Double_t expDedx = (fSpecies[i] > AliPID::kTriton) ? 4.*fITSpid->BetheAleph(p, mass) : fITSpid->BetheAleph(p, mass); // correct by Z^2
		Double_t sigma = fITSpid->GetResolution(expDedx, nPointsITS);
		
		if (TMath::Abs(dEdx - expDedx) > fRange*sigma)
		{
			r[i]=TMath::Exp(-0.5*fRange*fRange)/sigma;
		}
		else
		{
			r[i]=TMath::Exp(-0.5*(dEdx-expDedx)*(dEdx-expDedx)/(sigma*sigma))/sigma;
			mismatch = kFALSE;
		}
		
		sum += r[i];
	}
	
	if(sum <= 0. || mismatch)
	{
		return kFALSE;
	}
	
	for(Int_t i=0; i < kSPECIES; ++i) r[i] /= sum;
	
	return kTRUE;
}

Bool_t AliLnID::GetTPClikelihood(Double_t pTPC, Double_t dEdx, Int_t /*nPointsTPC*/, Double_t* r) const
{
//
// Probability of dEdx for each particle species in the TPC.
// Adapted from STEER/ESD/AliESDpid.cxx
//
	if( pTPC <= 0) return kFALSE;
	if( dEdx < 1.) return kFALSE;
	
	Bool_t mismatch = kTRUE;
	
	Double_t sum = 0;
	for(Int_t i=0; i < kSPECIES; ++i)
	{
		Double_t m = AliPID::ParticleMass(fSpecies[i]);
		Double_t p = (fSpecies[i] > AliPID::kTriton) ? 2.*pTPC : pTPC; // correct by Z
		Double_t expDedx = (fSpecies[i] > AliPID::kTriton) ? TMath::Power(2.,fZexp)*fTPCpid->Bethe(p/m) : fTPCpid->Bethe(p/m); // correct by Z^X (as in AliTPCPIDResponse)
		Double_t sigma = fTPCpid->GetRes0()*expDedx;
		
		if(TMath::Abs(dEdx - expDedx) > fRange*sigma)
		{
			r[i] = TMath::Exp(-0.5*fRange*fRange)/sigma;
		}
		else
		{
			r[i] = TMath::Exp(-0.5*(dEdx-expDedx)*(dEdx-expDedx)/(sigma*sigma))/sigma;
			mismatch=kFALSE;
		}
		
		sum += r[i];
	}
	
	if(sum <= 0. || mismatch)
	{
		return kFALSE;
	}
	
	for(Int_t i=0; i < kSPECIES; ++i) r[i] /= sum;
	
	return kTRUE;
}

Bool_t AliLnID::GetTOFlikelihood(Double_t pTOF, Double_t beta, Double_t* r) const
{
//
// Probability of beta for each particle species
//
	if( pTOF <= 0) return kFALSE;
	if( beta <= 0) return kFALSE;
	
	Double_t mismatch = kTRUE;
	
	Double_t sum = 0;
	for(Int_t i=0; i < kSPECIES; ++i)
	{
		Double_t mass = AliPID::ParticleMass(fSpecies[i]);
		Double_t p = (fSpecies[i] > AliPID::kTriton) ? 2.*pTOF : pTOF; // correct by Z
		Double_t expBeta = this->Beta(p,mass);
		Double_t sigma = this->GetBetaExpectedSigma(p,mass);
		
		if(TMath::Abs(beta-expBeta) > fRange*sigma)
		{
			r[i] = TMath::Exp(-0.5*fRange*fRange)/sigma;
		}
		else
		{
			r[i] = TMath::Exp(-0.5*(beta-expBeta)*(beta-expBeta)/(sigma*sigma))/sigma;
			mismatch = kFALSE;
		}
		
		sum += r[i];
	}
	
	if(sum <= 0. || mismatch)
	{
		return kFALSE;
	}
	
	for(Int_t i=0; i < kSPECIES; ++i) r[i] /= sum;
	
	return kTRUE;
}

Double_t AliLnID::Beta(Double_t p, Double_t m) const
{
//
// Expected beta for mass hypothesis m
//
	return p/TMath::Sqrt(p*p+m*m);
}

Double_t AliLnID::GetBetaExpectedSigma(Double_t p, Double_t m) const
{
//
// Expected sigma for the given mass hypothesis
//
	const Double_t kC0 = 0.0131203;
	const Double_t kC1 = 0.00670148;
	
	Double_t kappa = kC0*m*m/(p*(p*p+m*m)) + kC1;
	return kappa*Beta(p,m);
}

Bool_t AliLnID::GetITSmatch(Int_t pid, Double_t pITS, Double_t dEdxITS, Int_t nPointsITS, Double_t nSigma) const
{
//
// Check if the signal is less than nSigma from the expected ITS dEdx
//
	Double_t mass = AliPID::ParticleMass(pid);
	Double_t p = (pid > AliPID::kTriton) ? 2.*pITS : pITS; // correct by Z
	Double_t expDedx = (pid > AliPID::kTriton) ? 4.*fITSpid->BetheAleph(p, mass) : fITSpid->BetheAleph(p, mass); // correct by Z^2
	Double_t sigma = fITSpid->GetResolution(expDedx, nPointsITS);
	
	if(TMath::Abs(dEdxITS-expDedx) < nSigma*sigma)
	{
		return kTRUE;
	}
	
	return kFALSE;
}

Bool_t AliLnID::GetTPCmatch(Int_t pid, Double_t pTPC, Double_t dEdxTPC, Double_t /*nPointsTPC*/, Double_t nSigma) const
{
//
// Check if the signal is less than nSigma from the expected TPC dEdx
//
	Double_t m = AliPID::ParticleMass(pid);
	Double_t p = (pid > AliPID::kTriton) ? 2.*pTPC : pTPC; // correct by Z
	Double_t expDedx = (pid > AliPID::kTriton) ? TMath::Power(2.,fZexp)*fTPCpid->Bethe(p/m) : fTPCpid->Bethe(p/m); // correct by Z^X (as in AliTPCPIDResponse)
	Double_t sigma = fTPCpid->GetRes0()*expDedx;
	
	if(TMath::Abs(dEdxTPC-expDedx) < nSigma*sigma)
	{
		return kTRUE;
	}
	
	return kFALSE;
}

Bool_t AliLnID::GetTOFmatch(Int_t pid, Double_t pTOF, Double_t beta, Double_t nSigma) const
{
//
// Check if the signal is less than nSigma from the expected velocity
//
	Double_t mass = AliPID::ParticleMass(pid);
	Double_t p = (pid > AliPID::kTriton) ? 2.*pTOF : pTOF;
	Double_t expBeta = this->Beta(p, mass);
	Double_t sigma = this->GetBetaExpectedSigma(p, mass);
	
	if(TMath::Abs(beta-expBeta) < nSigma*sigma)
	{
		return kTRUE;
	}
	
	return kFALSE;
}

Bool_t AliLnID::IsITSTPCmismatch(Double_t pITS, Double_t dEdxITS, Int_t nPointsITS, Double_t pTPC, Double_t dEdxTPC, Int_t nPointsTPC, Double_t nSigma) const
{
//
// Check track TPC mismatch with ITS
//
	for(Int_t i=0; i<kSPECIES; ++i)
	{
		if(this->GetTPCmatch(fSpecies[i], pTPC, dEdxTPC, nPointsTPC, nSigma) &&
		   this->GetITSmatch(fSpecies[i], pITS, dEdxITS, nPointsITS, 5.))
		{
			return kFALSE;
		}
	}
	
	return kTRUE;
}

Bool_t AliLnID::IsITSTOFmismatch(Double_t pITS, Double_t dEdxITS, Int_t nPointsITS, Double_t pTOF, Double_t beta, Double_t nSigma) const
{
//
// Check track TOF mismatch with ITS
//
	for(Int_t i=0; i<kSPECIES; ++i)
	{
		if(this->GetTOFmatch(fSpecies[i], pTOF, beta, nSigma) &&
		   this->GetITSmatch(fSpecies[i], pITS, dEdxITS, nPointsITS, 3.))
		{
			return kFALSE;
		}
	}
	
	return kTRUE;
}

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