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.                  *
**************************************************************************/
//
// PID Response class for the TRD detector
// Based on 1D Likelihood approach
// Calculation of probabilities using Bayesian approach
// Attention: This method is only used to separate electrons from pions
//
// Authors:
//  Markus Fasel <M.Fasel@gsi.de>
//  Anton Andronic <A.Andronic@gsi.de>
//
#include <TAxis.h>
#include <TClass.h>
#include <TDirectory.h>
#include <TFile.h>
#include <TH1.h>
#include <TKey.h>
#include <TMath.h>
#include <TObjArray.h>
#include <TROOT.h> 
#include <TString.h>
#include <TSystem.h>

#include "AliLog.h"
 
#include "AliVTrack.h"

#include "AliTRDPIDResponseObject.h"
#include "AliTRDPIDResponse.h"
//#include "AliTRDTKDInterpolator.h"
#include "AliTRDNDFast.h"
#include "AliTRDdEdxParams.h"

ClassImp(AliTRDPIDResponse)

//____________________________________________________________
AliTRDPIDResponse::AliTRDPIDResponse():
  TObject()
  ,fkPIDResponseObject(NULL)
  ,fkTRDdEdxParams(NULL)
  ,fGainNormalisationFactor(1.)
{
  //
  // Default constructor
  //
}

//____________________________________________________________
AliTRDPIDResponse::AliTRDPIDResponse(const AliTRDPIDResponse &ref):
  TObject(ref)
  ,fkPIDResponseObject(NULL)
  ,fkTRDdEdxParams(NULL)
  ,fGainNormalisationFactor(ref.fGainNormalisationFactor)
{
  //
  // Copy constructor
  //
}

//____________________________________________________________
AliTRDPIDResponse &AliTRDPIDResponse::operator=(const AliTRDPIDResponse &ref){
  //
  // Assignment operator
  //
  if(this == &ref) return *this;
  
  // Make copy
  TObject::operator=(ref);
  fGainNormalisationFactor = ref.fGainNormalisationFactor;
  fkPIDResponseObject = ref.fkPIDResponseObject;
  fkTRDdEdxParams = ref.fkTRDdEdxParams;

  return *this;
}

//____________________________________________________________
AliTRDPIDResponse::~AliTRDPIDResponse(){
  //
  // Destructor
  //
  if(IsOwner()) {
    delete fkPIDResponseObject;
    delete fkTRDdEdxParams;
  }
}

//____________________________________________________________
Bool_t AliTRDPIDResponse::Load(const Char_t * filename){
  //
  // Load References into the toolkit
  //
  AliDebug(1, "Loading reference histos from root file");
  TDirectory *owd = gDirectory;// store old working directory
  
  if(!filename)
    filename = Form("%s/STEER/LQ1dRef_v1.root",gSystem->ExpandPathName("$ALICE_ROOT"));
  TFile *in = TFile::Open(filename);
  if(!in){
    AliError("Ref file not available.");
    return kFALSE;
  }
  
  gROOT->cd();
  fkPIDResponseObject = dynamic_cast<const AliTRDPIDResponseObject *>(in->Get("TRDPIDResponse")->Clone());
  in->Close(); delete in;
  owd->cd();
  SetBit(kIsOwner, kTRUE);
  AliDebug(2, Form("Successfully loaded References for %d Momentum bins", fkPIDResponseObject->GetNumberOfMomentumBins()));
  return kTRUE;
}



//____________________________________________________________
Double_t AliTRDPIDResponse::GetNumberOfSigmas(const AliVTrack *track, AliPID::EParticleType type) const
{
  //
  //calculate the TRD nSigma
  //

  const Double_t badval = -9999;
  Double_t info[5]; for(int i=0; i<5; i++){info[i]=badval;}

  const Double_t delta = GetSignalDelta(track, type, kFALSE, info);

  const Double_t mean = info[0];
  const Double_t res = info[1];
  if(res<0){
    return badval;
  }

  const Double_t sigma = mean*res;
  const Double_t eps = 1e-12;
  return delta/(sigma + eps);
}

//____________________________________________________________
Double_t AliTRDPIDResponse::GetSignalDelta( const AliVTrack* track, AliPID::EParticleType type, Bool_t ratio/*=kFALSE*/, Double_t *info/*=0x0*/) const
{
  //
  //calculate the TRD signal difference w.r.t. the expected
  //output other information in info[]
  //

  const Double_t badval = -9999;

  if(!track){
    return badval;
  }

  Double_t pTRD = -999;
  for(Int_t ich=0; ich<6; ich++){
    pTRD = track->GetTRDmomentum(ich);
    if(pTRD>0)
      break;
  }
  if(pTRD<0){
    return badval;
  }

  if(!fkTRDdEdxParams){
    AliError("fkTRDdEdxParams null");
    return -99999;
  }

  const Double_t nch = track->GetTRDNchamberdEdx();
  const Double_t ncls = track->GetTRDNclusterdEdx();

  const TVectorF meanvec = fkTRDdEdxParams->GetMeanParameter(type, nch, ncls);
  if(meanvec.GetNrows()==0){
    return badval;
  }

  const TVectorF resvec  = fkTRDdEdxParams->GetSigmaParameter(type, nch, ncls);
  if(resvec.GetNrows()==0){
    return badval;
  }

  const Float_t *meanpar = meanvec.GetMatrixArray();
  const Float_t *respar  = resvec.GetMatrixArray();

  //============================================================================================<<<<<<<<<<<<<

  const Double_t bg = pTRD/AliPID::ParticleMass(type);
  const Double_t expsig = MeandEdxTR(&bg, meanpar);

  if(info){
    info[0]= expsig;
    info[1]= ResolutiondEdxTR(&ncls, respar);
  }

  const Double_t eps = 1e-10;

  if(ratio){
    return track->GetTRDsignal()/(expsig +  eps);
  }
  else{
    return track->GetTRDsignal() - expsig;
  }
}


Double_t AliTRDPIDResponse::ResolutiondEdxTR(const Double_t * xx,  const Float_t * par)
{
  //
  //resolution 
  //npar=3
  //

  const Double_t ncls = xx[0];

  return par[0]+par[1]*TMath::Power(ncls, par[2]);
}

Double_t AliTRDPIDResponse::MeandEdxTR(const Double_t * xx,  const Float_t * pin)
{
  //
  //ALEPH+LOGISTIC parametrization for dEdx+TR, in unit of MIP
  //npar = 8 = 3+5
  //

  Float_t ptr[4]={0};
  for(int ii=0; ii<3; ii++){
    ptr[ii+1]=pin[ii];
  }
  return MeanTR(xx,ptr) + MeandEdx(xx,&(pin[3]));
}

Double_t AliTRDPIDResponse::MeanTR(const Double_t * xx,  const Float_t * par)
{
  //
  //LOGISTIC parametrization for TR, in unit of MIP
  //npar = 4
  //
                                                                                                                                                                                                                                                        
  const Double_t bg = xx[0];
  const Double_t gamma = sqrt(1+bg*bg);

  const Double_t p0 = TMath::Abs(par[1]);
  const Double_t p1 = TMath::Abs(par[2]);
  const Double_t p2 = TMath::Abs(par[3]);

  const Double_t zz = TMath::Log(gamma);
  const Double_t tryield = p0/( 1 + TMath::Exp(-p1*(zz-p2)) );

  return par[0]+tryield;
}

Double_t AliTRDPIDResponse::MeandEdx(const Double_t * xx,  const Float_t * par)
{
  //
  //ALEPH parametrization for dEdx
  //npar = 5
  //

  const Double_t bg = xx[0];
  const Double_t beta = bg/TMath::Sqrt(1.+ bg*bg);

  const Double_t p0 = TMath::Abs(par[0]);
  const Double_t p1 = TMath::Abs(par[1]);

  const Double_t p2 = TMath::Abs(par[2]);

  const Double_t p3 = TMath::Abs(par[3]);
  const Double_t p4 = TMath::Abs(par[4]);

  const Double_t aa = TMath::Power(beta, p3);

  const Double_t bb = TMath::Log( p2 + TMath::Power(1./bg, p4) );

  return (p1-aa-bb)*p0/aa;

}


//____________________________________________________________
Int_t AliTRDPIDResponse::GetResponse(Int_t n, const Double_t * const dedx, const Float_t * const p, Double_t prob[AliPID::kSPECIES],ETRDPIDMethod PIDmethod,Bool_t kNorm) const
{
  //
  // Calculate TRD likelihood values for the track based on dedx and 
  // momentum values. The likelihoods are calculated by query the 
  // reference data depending on the PID method selected
  //
  // Input parameter :
  //   n - number of dedx slices/chamber
  //   dedx - array of dedx slices organized layer wise
  //   p - array of momentum measurements organized layer wise
  // 
  // Return parameters
  //   prob - probabilities allocated by TRD for particle specis
  //   kNorm - switch to normalize probabilities to 1. By default true. If false return not normalized prob.
  // 
  // Return value
  //   number of tracklets used for PID, 0 if no PID
    //
    AliDebug(3,Form(" Response for PID method: %d",PIDmethod));


    if(!fkPIDResponseObject){
	AliDebug(3,"Missing reference data. PID calculation not possible.");
	return 0;
    }

    for(Int_t is(AliPID::kSPECIES); is--;) prob[is]=.2;
    Double_t prLayer[AliPID::kSPECIES];
    Double_t dE[10], s(0.);
    Int_t ntrackletsPID=0;
    for(Int_t il(kNlayer); il--;){
	memset(prLayer, 0, AliPID::kSPECIES*sizeof(Double_t));
	if(!CookdEdx(n, &dedx[il*n], &dE[0],PIDmethod)) continue;
        s=0.;
        Bool_t filled=kTRUE;
	for(Int_t is(AliPID::kSPECIES); is--;){
	    //if((PIDmethod==kLQ2D)&&(!(is==0||is==2)))continue;
	    if((dE[0] > 0.) && (p[il] > 0.)) prLayer[is] = GetProbabilitySingleLayer(is, p[il], &dE[0],PIDmethod);
	    AliDebug(3, Form("Probability for Species %d in Layer %d: %e", is, il, prLayer[is]));
	    if(prLayer[is]<1.e-30){
		AliDebug(2, Form("Null for species %d species prob layer[%d].",is,il));
		filled=kFALSE;
		break;
	    }
	    s+=prLayer[is];
	}
	if(!filled){
	    continue;
	}
	if(s<1.e-30){
	    AliDebug(2, Form("Null all species prob layer[%d].", il));
	    continue;
	}
	for(Int_t is(AliPID::kSPECIES); is--;){
	    if(kNorm) prLayer[is] /= s;
	    prob[is] *= prLayer[is];
	}
	ntrackletsPID++;
    }
    if(!kNorm) return ntrackletsPID;

    s=0.;
    for(Int_t is(AliPID::kSPECIES); is--;) s+=prob[is];
    if(s<1.e-30){
	AliDebug(2, "Null total prob.");
	return 0;
    }
    for(Int_t is(AliPID::kSPECIES); is--;) prob[is]/=s;
    return ntrackletsPID;
}

//____________________________________________________________
Double_t AliTRDPIDResponse::GetProbabilitySingleLayer(Int_t species, Double_t plocal, Double_t *dEdx,ETRDPIDMethod PIDmethod) const {
  //
  // Get the non-normalized probability for a certain particle species as coming
  // from the reference histogram
  // Interpolation between momentum bins
  //
  AliDebug(1, Form("Make Probability for Species %d with Momentum %f", species, plocal));

  Double_t probLayer = 0.;

  Float_t pLower, pUpper;
	
  AliTRDNDFast *refUpper = dynamic_cast<AliTRDNDFast *>(fkPIDResponseObject->GetUpperReference((AliPID::EParticleType)species, plocal, pUpper,PIDmethod)),
      *refLower = dynamic_cast<AliTRDNDFast *>(fkPIDResponseObject->GetLowerReference((AliPID::EParticleType)species, plocal, pLower,PIDmethod));

  // Do Interpolation exept for underflow and overflow
  if(refLower && refUpper){
      Double_t probLower = refLower->Eval(dEdx);
      Double_t probUpper = refUpper->Eval(dEdx);

      probLayer = probLower + (probUpper - probLower)/(pUpper-pLower) * (plocal - pLower);
  } else if(refLower){
     // underflow
      probLayer = refLower->Eval(dEdx);
  } else if(refUpper){
      // overflow
      probLayer = refUpper->Eval(dEdx);
  } else {
      AliError("No references available");
  }
  AliDebug(1, Form("Eval 1D dEdx %f Probability %e", dEdx[0],probLayer));

  return probLayer;

/* old implementation

switch(PIDmethod){
case kNN: // NN
      break;
  case kLQ2D: // 2D LQ
      {
	  if(species==0||species==2){ // references only for electrons and pions
	      Double_t error = 0.;
	      Double_t point[kNslicesLQ2D];
	      for(Int_t idim=0;idim<kNslicesLQ2D;idim++){point[idim]=dEdx[idim];}

	      AliTRDTKDInterpolator *refUpper = dynamic_cast<AliTRDTKDInterpolator *>(fkPIDResponseObject->GetUpperReference((AliPID::EParticleType)species, plocal, pUpper,kLQ2D)),
	      *refLower = dynamic_cast<AliTRDTKDInterpolator *>(fkPIDResponseObject->GetLowerReference((AliPID::EParticleType)species, plocal, pLower,kLQ2D));
	      // Do Interpolation exept for underflow and overflow
	      if(refLower && refUpper){
                  Double_t probLower=0,probUpper=0;
		  refLower->Eval(point,probLower,error);
                  refUpper->Eval(point,probUpper,error);
		  probLayer = probLower + (probUpper - probLower)/(pUpper-pLower) * (plocal - pLower);
	      } else if(refLower){
		  // underflow
		  refLower->Eval(point,probLayer,error);
		  } else if(refUpper){
		  // overflow
		  refUpper->Eval(point,probLayer,error);
	      } else {
		  AliError("No references available");
	      }
	      AliDebug(2,Form("Eval 2D Q0 %f Q1 %f P %e Err %e",point[0],point[1],probLayer,error));
	  }
      }
      break;
  case kLQ1D: // 1D LQ
      {
	  TH1 *refUpper = dynamic_cast<TH1 *>(fkPIDResponseObject->GetUpperReference((AliPID::EParticleType)species, plocal, pUpper,kLQ1D)),
	      *refLower = dynamic_cast<TH1 *>(fkPIDResponseObject->GetLowerReference((AliPID::EParticleType)species, plocal, pLower,kLQ1D));
	  // Do Interpolation exept for underflow and overflow
	  if(refLower && refUpper){
	      Double_t probLower = refLower->GetBinContent(refLower->GetXaxis()->FindBin(dEdx[0]));
	      Double_t probUpper = refUpper->GetBinContent(refUpper->GetXaxis()->FindBin(dEdx[0]));

	      probLayer = probLower + (probUpper - probLower)/(pUpper-pLower) * (plocal - pLower);
	  } else if(refLower){
	      // underflow
	      probLayer = refLower->GetBinContent(refLower->GetXaxis()->FindBin(dEdx[0]));
	  } else if(refUpper){
	      // overflow
	      probLayer = refUpper->GetBinContent(refUpper->GetXaxis()->FindBin(dEdx[0]));
	  } else {
	      AliError("No references available");
	  }
	  AliDebug(1, Form("Eval 1D dEdx %f Probability %e", dEdx[0],probLayer));
      }
      break;
  default:
      break;
      }
      return probLayer;
      */

}

//____________________________________________________________
void AliTRDPIDResponse::SetOwner(){
  //
  // Make Deep Copy of the Reference Histograms
  //
    if(!fkPIDResponseObject || IsOwner()) return;
    const AliTRDPIDResponseObject *tmp = fkPIDResponseObject;
    fkPIDResponseObject = dynamic_cast<const AliTRDPIDResponseObject *>(tmp->Clone());
    SetBit(kIsOwner, kTRUE);
}

//____________________________________________________________
Bool_t AliTRDPIDResponse::CookdEdx(Int_t nSlice, const Double_t * const in, Double_t *out,ETRDPIDMethod PIDmethod) const
{
    //
    // Recalculate dE/dx
    //
  switch(PIDmethod){
  case kNN: // NN 
      break;
  case kLQ2D: // 2D LQ
      out[0]=0;
      out[1]=0;
      for(Int_t islice = 0; islice < nSlice; islice++){
	  if(in[islice]<=0){out[0]=0;out[1]=0;return kFALSE;}  // Require that all slices are filled
	  if(islice<fkPIDResponseObject->GetNSlicesQ0())out[0]+= in[islice];
	  else out[1]+= in[islice];
      }
      // normalize signal to number of slices
      out[0]*=1./Double_t(fkPIDResponseObject->GetNSlicesQ0());
      out[1]*=1./Double_t(nSlice-fkPIDResponseObject->GetNSlicesQ0());
      if(out[0] < 1e-6) return kFALSE;
      AliDebug(3,Form("CookdEdx Q0 %f Q1 %f",out[0],out[1]));
      break;
  case kLQ1D: // 1D LQ
      out[0]= 0.;
      for(Int_t islice = 0; islice < nSlice; islice++)
	  if(in[islice] > 0) out[0] += in[islice] * fGainNormalisationFactor;   // Protect against negative values for slices having no dE/dx information
      out[0]*=1./Double_t(nSlice);
      if(out[0] < 1e-6) return kFALSE;
      AliDebug(3,Form("CookdEdx dEdx %f",out[0]));
      break;

  default:
      return kFALSE;
  }
  return kTRUE;
}

//____________________________________________________________
Bool_t AliTRDPIDResponse::IdentifiedAsElectron(Int_t nTracklets, const Double_t *like, Double_t p, Double_t level,Double_t centrality,ETRDPIDMethod PIDmethod) const {
    //
    // Check whether particle is identified as electron assuming a certain electron efficiency level
    // Only electron and pion hypothesis is taken into account
    //
    // Inputs:
    //         Number of tracklets
    //         Likelihood values
    //         Momentum
    //         Electron efficiency level
    //
    // If the function fails when the params are not accessible, the function returns true
    //
  if(!fkPIDResponseObject){
    AliDebug(3,"No PID Param object available");
    return kTRUE;
  } 
  Double_t probEle = like[AliPID::kElectron]/(like[AliPID::kElectron] + like[AliPID::kPion]);
  Double_t params[4];
  if(!fkPIDResponseObject->GetThresholdParameters(nTracklets, level, params,centrality,PIDmethod)){
    AliError("No Params found for the given configuration");
    return kTRUE;
  }
  Double_t threshold = 1. - params[0] - params[1] * p - params[2] * TMath::Exp(-params[3] * p);
  if(probEle > TMath::Max(TMath::Min(threshold, 0.99), 0.2)) return kTRUE; // truncate the threshold upperwards to 0.999 and lowerwards to 0.2 and exclude unphysical values
  return kFALSE;
}

//____________________________________________________________
Bool_t AliTRDPIDResponse::SetPIDResponseObject(const AliTRDPIDResponseObject * obj){

    fkPIDResponseObject = obj;
    if((AliLog::GetDebugLevel("",IsA()->GetName()))>0)fkPIDResponseObject->Print("");
    return kTRUE;
}


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