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.                  *
 **************************************************************************/

/* $Id: AliAODpidUtil.cxx 38329 2010-01-17 19:17:24Z hristov $ */

//-----------------------------------------------------------------
//           Implementation of the combined PID class
//           For the AOD Class
//           containing information on the particle identification
//      Origin: Rosa Romita, GSI, r.romita@gsi.de
//-----------------------------------------------------------------

#include "TRandom.h"
#include "AliLog.h"
#include "AliPID.h"
#include "AliAODpidUtil.h"
#include "AliAODEvent.h"
#include "AliAODTrack.h"
#include "AliAODPid.h"
#include "AliTRDPIDResponse.h"
#include "AliESDtrack.h"
#include "AliAODMCHeader.h"
#include "AliAODMCParticle.h"
#include "AliTOFPIDParams.h"

#include <AliDetectorPID.h>

ClassImp(AliAODpidUtil)

//_________________________________________________________________________
Float_t AliAODpidUtil::GetTPCsignalTunedOnData(const AliVTrack *t) const {
    AliAODTrack *track = (AliAODTrack *) t;
    Float_t dedx = track->GetTPCsignalTunedOnData();
    if(dedx > 0) return dedx;

    dedx = t->GetTPCsignal();
    track->SetTPCsignalTunedOnData(dedx);

    if(dedx < 20) return dedx;

    
    AliPID::EParticleType type = AliPID::kPion;
    
    AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(track->GetAODEvent()->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
    if (mcHeader) {
        
	TClonesArray *mcArray = (TClonesArray*)track->GetAODEvent()->GetList()->FindObject(AliAODMCParticle::StdBranchName());
	
	Bool_t kGood = kTRUE;

	if ( mcArray->At(TMath::Abs(t->GetLabel())) != NULL ) {  // protects against label-0 tracks e.g. the initial proton for Phythia events
	  Int_t iS = TMath::Abs(((AliAODMCParticle*)mcArray->At(TMath::Abs(t->GetLabel())))->GetPdgCode());
	  if(iS==AliPID::ParticleCode(AliPID::kElectron)){
	    type = AliPID::kElectron;
	  }
	  else if(iS==AliPID::ParticleCode(AliPID::kMuon)){
	    type = AliPID::kMuon;
	  }
	  else if(iS==AliPID::ParticleCode(AliPID::kPion)){
	    type = AliPID::kPion;
	  }
	  else if(iS==AliPID::ParticleCode(AliPID::kKaon)){
	    type = AliPID::kKaon;
	  }
	  else if(iS==AliPID::ParticleCode(AliPID::kProton)){
	    type = AliPID::kProton;
	  }
	  else if(iS==AliPID::ParticleCode(AliPID::kDeuteron)){ // d
	    type = AliPID::kDeuteron;
	  }
	  else if(iS==AliPID::ParticleCode(AliPID::kTriton)){ // t
	    type = AliPID::kTriton;
	  }
	  else if(iS==AliPID::ParticleCode(AliPID::kHe3)){ // 3He
	    type = AliPID::kHe3;
	  }
	  else if(iS==AliPID::ParticleCode(AliPID::kAlpha)){ // 4He
	    type = AliPID::kAlpha;
	  }
	else
	    kGood = kFALSE;
	} else kGood = kFALSE;

	if(kGood){
	    //TODO maybe introduce different dEdxSources?
        Double_t bethe = fTPCResponse.GetExpectedSignal(track, type, AliTPCPIDResponse::kdEdxDefault, this->UseTPCEtaCorrection(),
                                                        this->UseTPCMultiplicityCorrection());
        Double_t sigma = fTPCResponse.GetExpectedSigma(track, type, AliTPCPIDResponse::kdEdxDefault, this->UseTPCEtaCorrection(),
                                                       this->UseTPCMultiplicityCorrection());
        dedx = gRandom->Gaus(bethe,sigma);
        
// 	    if(iS == AliPID::ParticleCode(AliPID::kHe3) || iS == AliPID::ParticleCode(AliPID::kAlpha)) dedx *= 5;
	}

    }

    track->SetTPCsignalTunedOnData(dedx);
    return dedx;
}
//_________________________________________________________________________
Float_t AliAODpidUtil::GetTOFsignalTunedOnData(const AliVTrack *t) const {
    AliAODTrack *track = (AliAODTrack *) t;
    Double_t tofSignal = track->GetTOFsignalTunedOnData();

    if(tofSignal <  99999) return (Float_t)tofSignal; // it has been already set

    // read additional mismatch fraction
    Float_t addmism = GetTOFPIDParams()->GetTOFadditionalMismForMC();
    if(addmism > 1.){
      Float_t centr = GetCurrentCentrality();
      if(centr > 50) addmism *= 0.1667;
      else if(centr > 20) addmism *= 0.33;
    }

    AliAODPid *pidObj = track->GetDetPid();
    tofSignal = pidObj->GetTOFsignal() + fTOFResponse.GetTailRandomValue(t->Pt(),t->Eta(),pidObj->GetTOFsignal(),addmism);
    track->SetTOFsignalTunedOnData(tofSignal);
    return (Float_t)tofSignal;
}

//_________________________________________________________________________
Float_t AliAODpidUtil::GetSignalDeltaTOFold(const AliVParticle *vtrack, AliPID::EParticleType type, Bool_t ratio/*=kFALSE*/) const
{
  //
  // Number of sigma implementation for the TOF
  //
  
  AliAODTrack *track=(AliAODTrack*)vtrack;
  AliAODPid *pidObj = track->GetDetPid();
  if (!pidObj) return -9999.;
  Double_t tofTime = 99999;
  if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
  else tofTime=pidObj->GetTOFsignal();
  const Double_t expTime=fTOFResponse.GetExpectedSignal((AliVTrack*)vtrack,type);
  Double_t sigmaTOFPid[AliPID::kSPECIES];
  pidObj->GetTOFpidResolution(sigmaTOFPid);
  AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
  if (event) {  // protection if the user didn't call GetTrack, which sets the internal pointer
    AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
    if (tofH && (TMath::Abs(sigmaTOFPid[0]) <= 1.E-16) ) { // new AOD
        tofTime -= fTOFResponse.GetStartTime(vtrack->P());
    }
  } else {
    AliError("pointer to AliAODEvent not found, please call GetTrack to set it");
    return -9999.;
  }

  Double_t delta=-9999.;

  if (!ratio) delta=tofTime-expTime;
  else if (expTime>1.e-20) delta=tofTime/expTime;
  
  return delta;
}

//_________________________________________________________________________
Float_t AliAODpidUtil::GetNumberOfSigmasTOFold(const AliVParticle *vtrack, AliPID::EParticleType type) const
{
  //
  // Number of sigma implementation for the TOF
  //
  
  AliAODTrack *track=(AliAODTrack*)vtrack;

  Bool_t oldAod=kTRUE;
  Double_t sigTOF=0.;
  AliAODPid *pidObj = track->GetDetPid();
  if (!pidObj) return -999.;
  Double_t tofTime = 99999;
  if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
  else tofTime=pidObj->GetTOFsignal();
  Double_t expTime=fTOFResponse.GetExpectedSignal((AliVTrack*)vtrack,type);
  Double_t sigmaTOFPid[AliPID::kSPECIES];
  pidObj->GetTOFpidResolution(sigmaTOFPid);
  AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
  if (event) {  // protection if the user didn't call GetTrack, which sets the internal pointer
    AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
    if (tofH && (TMath::Abs(sigmaTOFPid[0]) <= 1.E-16) ) { // new AOD
        sigTOF=fTOFResponse.GetExpectedSigma(track->P(),expTime,AliPID::ParticleMassZ(type)); //fTOFResponse is set in InitialiseEvent
        tofTime -= fTOFResponse.GetStartTime(vtrack->P());
        oldAod=kFALSE;
    }
  } else {
    AliError("pointer to AliAODEvent not found, please call GetTrack to set it");
    return -996.;
  }
  if (oldAod) { // old AOD
    if (type <= AliPID::kProton) {
      sigTOF=sigmaTOFPid[type];
    } else return -998.;  // light nuclei cannot be supported on old AOD because we don't have timeZero resolution
  }
  if (sigTOF>0) return (tofTime - expTime)/sigTOF;
  else return -997.;
}
 AliAODpidUtil.cxx:1
 AliAODpidUtil.cxx:2
 AliAODpidUtil.cxx:3
 AliAODpidUtil.cxx:4
 AliAODpidUtil.cxx:5
 AliAODpidUtil.cxx:6
 AliAODpidUtil.cxx:7
 AliAODpidUtil.cxx:8
 AliAODpidUtil.cxx:9
 AliAODpidUtil.cxx:10
 AliAODpidUtil.cxx:11
 AliAODpidUtil.cxx:12
 AliAODpidUtil.cxx:13
 AliAODpidUtil.cxx:14
 AliAODpidUtil.cxx:15
 AliAODpidUtil.cxx:16
 AliAODpidUtil.cxx:17
 AliAODpidUtil.cxx:18
 AliAODpidUtil.cxx:19
 AliAODpidUtil.cxx:20
 AliAODpidUtil.cxx:21
 AliAODpidUtil.cxx:22
 AliAODpidUtil.cxx:23
 AliAODpidUtil.cxx:24
 AliAODpidUtil.cxx:25
 AliAODpidUtil.cxx:26
 AliAODpidUtil.cxx:27
 AliAODpidUtil.cxx:28
 AliAODpidUtil.cxx:29
 AliAODpidUtil.cxx:30
 AliAODpidUtil.cxx:31
 AliAODpidUtil.cxx:32
 AliAODpidUtil.cxx:33
 AliAODpidUtil.cxx:34
 AliAODpidUtil.cxx:35
 AliAODpidUtil.cxx:36
 AliAODpidUtil.cxx:37
 AliAODpidUtil.cxx:38
 AliAODpidUtil.cxx:39
 AliAODpidUtil.cxx:40
 AliAODpidUtil.cxx:41
 AliAODpidUtil.cxx:42
 AliAODpidUtil.cxx:43
 AliAODpidUtil.cxx:44
 AliAODpidUtil.cxx:45
 AliAODpidUtil.cxx:46
 AliAODpidUtil.cxx:47
 AliAODpidUtil.cxx:48
 AliAODpidUtil.cxx:49
 AliAODpidUtil.cxx:50
 AliAODpidUtil.cxx:51
 AliAODpidUtil.cxx:52
 AliAODpidUtil.cxx:53
 AliAODpidUtil.cxx:54
 AliAODpidUtil.cxx:55
 AliAODpidUtil.cxx:56
 AliAODpidUtil.cxx:57
 AliAODpidUtil.cxx:58
 AliAODpidUtil.cxx:59
 AliAODpidUtil.cxx:60
 AliAODpidUtil.cxx:61
 AliAODpidUtil.cxx:62
 AliAODpidUtil.cxx:63
 AliAODpidUtil.cxx:64
 AliAODpidUtil.cxx:65
 AliAODpidUtil.cxx:66
 AliAODpidUtil.cxx:67
 AliAODpidUtil.cxx:68
 AliAODpidUtil.cxx:69
 AliAODpidUtil.cxx:70
 AliAODpidUtil.cxx:71
 AliAODpidUtil.cxx:72
 AliAODpidUtil.cxx:73
 AliAODpidUtil.cxx:74
 AliAODpidUtil.cxx:75
 AliAODpidUtil.cxx:76
 AliAODpidUtil.cxx:77
 AliAODpidUtil.cxx:78
 AliAODpidUtil.cxx:79
 AliAODpidUtil.cxx:80
 AliAODpidUtil.cxx:81
 AliAODpidUtil.cxx:82
 AliAODpidUtil.cxx:83
 AliAODpidUtil.cxx:84
 AliAODpidUtil.cxx:85
 AliAODpidUtil.cxx:86
 AliAODpidUtil.cxx:87
 AliAODpidUtil.cxx:88
 AliAODpidUtil.cxx:89
 AliAODpidUtil.cxx:90
 AliAODpidUtil.cxx:91
 AliAODpidUtil.cxx:92
 AliAODpidUtil.cxx:93
 AliAODpidUtil.cxx:94
 AliAODpidUtil.cxx:95
 AliAODpidUtil.cxx:96
 AliAODpidUtil.cxx:97
 AliAODpidUtil.cxx:98
 AliAODpidUtil.cxx:99
 AliAODpidUtil.cxx:100
 AliAODpidUtil.cxx:101
 AliAODpidUtil.cxx:102
 AliAODpidUtil.cxx:103
 AliAODpidUtil.cxx:104
 AliAODpidUtil.cxx:105
 AliAODpidUtil.cxx:106
 AliAODpidUtil.cxx:107
 AliAODpidUtil.cxx:108
 AliAODpidUtil.cxx:109
 AliAODpidUtil.cxx:110
 AliAODpidUtil.cxx:111
 AliAODpidUtil.cxx:112
 AliAODpidUtil.cxx:113
 AliAODpidUtil.cxx:114
 AliAODpidUtil.cxx:115
 AliAODpidUtil.cxx:116
 AliAODpidUtil.cxx:117
 AliAODpidUtil.cxx:118
 AliAODpidUtil.cxx:119
 AliAODpidUtil.cxx:120
 AliAODpidUtil.cxx:121
 AliAODpidUtil.cxx:122
 AliAODpidUtil.cxx:123
 AliAODpidUtil.cxx:124
 AliAODpidUtil.cxx:125
 AliAODpidUtil.cxx:126
 AliAODpidUtil.cxx:127
 AliAODpidUtil.cxx:128
 AliAODpidUtil.cxx:129
 AliAODpidUtil.cxx:130
 AliAODpidUtil.cxx:131
 AliAODpidUtil.cxx:132
 AliAODpidUtil.cxx:133
 AliAODpidUtil.cxx:134
 AliAODpidUtil.cxx:135
 AliAODpidUtil.cxx:136
 AliAODpidUtil.cxx:137
 AliAODpidUtil.cxx:138
 AliAODpidUtil.cxx:139
 AliAODpidUtil.cxx:140
 AliAODpidUtil.cxx:141
 AliAODpidUtil.cxx:142
 AliAODpidUtil.cxx:143
 AliAODpidUtil.cxx:144
 AliAODpidUtil.cxx:145
 AliAODpidUtil.cxx:146
 AliAODpidUtil.cxx:147
 AliAODpidUtil.cxx:148
 AliAODpidUtil.cxx:149
 AliAODpidUtil.cxx:150
 AliAODpidUtil.cxx:151
 AliAODpidUtil.cxx:152
 AliAODpidUtil.cxx:153
 AliAODpidUtil.cxx:154
 AliAODpidUtil.cxx:155
 AliAODpidUtil.cxx:156
 AliAODpidUtil.cxx:157
 AliAODpidUtil.cxx:158
 AliAODpidUtil.cxx:159
 AliAODpidUtil.cxx:160
 AliAODpidUtil.cxx:161
 AliAODpidUtil.cxx:162
 AliAODpidUtil.cxx:163
 AliAODpidUtil.cxx:164
 AliAODpidUtil.cxx:165
 AliAODpidUtil.cxx:166
 AliAODpidUtil.cxx:167
 AliAODpidUtil.cxx:168
 AliAODpidUtil.cxx:169
 AliAODpidUtil.cxx:170
 AliAODpidUtil.cxx:171
 AliAODpidUtil.cxx:172
 AliAODpidUtil.cxx:173
 AliAODpidUtil.cxx:174
 AliAODpidUtil.cxx:175
 AliAODpidUtil.cxx:176
 AliAODpidUtil.cxx:177
 AliAODpidUtil.cxx:178
 AliAODpidUtil.cxx:179
 AliAODpidUtil.cxx:180
 AliAODpidUtil.cxx:181
 AliAODpidUtil.cxx:182
 AliAODpidUtil.cxx:183
 AliAODpidUtil.cxx:184
 AliAODpidUtil.cxx:185
 AliAODpidUtil.cxx:186
 AliAODpidUtil.cxx:187
 AliAODpidUtil.cxx:188
 AliAODpidUtil.cxx:189
 AliAODpidUtil.cxx:190
 AliAODpidUtil.cxx:191
 AliAODpidUtil.cxx:192
 AliAODpidUtil.cxx:193
 AliAODpidUtil.cxx:194
 AliAODpidUtil.cxx:195
 AliAODpidUtil.cxx:196
 AliAODpidUtil.cxx:197
 AliAODpidUtil.cxx:198
 AliAODpidUtil.cxx:199
 AliAODpidUtil.cxx:200
 AliAODpidUtil.cxx:201
 AliAODpidUtil.cxx:202
 AliAODpidUtil.cxx:203
 AliAODpidUtil.cxx:204
 AliAODpidUtil.cxx:205
 AliAODpidUtil.cxx:206