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

////////////////////////////////////////////////////////////////////////////
//                                                                        //
// Implementation of the TRD PID class                                    //
//                                                                        //
// Assigns the electron and pion likelihoods to each ESD track.           //
// The function MakePID(AliESDEvent *event) calculates the probability    //
// of having dedx and a maximum timbin at a given                         //
// momentum (mom) and particle type k                                     //
// from the precalculated distributions.                                  //
//                                                                        //
// Authors :                                                              //
//   Prashant Shukla <shukla@pi0.physi.uni-heidelberg.de> (orig. version) //
//   Alex Bercuci (a.bercuci@gsi.de)                                      //
//                                                                        //
////////////////////////////////////////////////////////////////////////////

#include "AliESDEvent.h"
#include "AliESDtrack.h"
#include "AliTracker.h"

#include "AliTRDpidESD.h"
#include "AliTRDgeometry.h"
#include "AliTRDcalibDB.h"
#include "Cal/AliTRDCalPID.h"

ClassImp(AliTRDpidESD)

Bool_t  AliTRDpidESD::fgCheckTrackStatus = kTRUE;
Bool_t  AliTRDpidESD::fgCheckKinkStatus  = kFALSE;
Int_t   AliTRDpidESD::fgMinPlane         = 0;

//_____________________________________________________________________________
AliTRDpidESD::AliTRDpidESD()
  :TObject()
  ,fTrack(NULL)
{
  //
  // Default constructor
  //

}

//_____________________________________________________________________________
AliTRDpidESD::AliTRDpidESD(const AliTRDpidESD &p)
  :TObject(p)
  ,fTrack(NULL)
{
  //
  // AliTRDpidESD copy constructor
  //

  ((AliTRDpidESD &) p).Copy(*this);

}

//_____________________________________________________________________________
AliTRDpidESD::~AliTRDpidESD()
{
  //
  // Destructor
  //

  if(fTrack) delete fTrack;

}

//_____________________________________________________________________________
AliTRDpidESD &AliTRDpidESD::operator=(const AliTRDpidESD &p)
{
  //
  // Assignment operator
  //

  if (this != &p) ((AliTRDpidESD &) p).Copy(*this);
  return *this;

}

//_____________________________________________________________________________
void AliTRDpidESD::Copy(TObject &p) const
{
  //
  // Copy function
  //

  ((AliTRDpidESD &) p).fgCheckTrackStatus         = fgCheckTrackStatus;
  ((AliTRDpidESD &) p).fgCheckKinkStatus          = fgCheckKinkStatus;
  ((AliTRDpidESD &) p).fgMinPlane                 = fgMinPlane;
  ((AliTRDpidESD &) p).fTrack                     = NULL;
  
}

//_____________________________________________________________________________
Int_t AliTRDpidESD::MakePID(AliESDEvent * const event)
{
  //
  // This function calculates the PID probabilities based on TRD signals
  //
  // The method produces probabilities based on the charge
  // and the position of the maximum time bin in each layer.
  // The dE/dx information can be used as global charge or 2 to 3
  // slices. Check AliTRDCalPID and AliTRDCalPIDRefMaker for the actual
  // implementation.
  //
  // Author
  // Alex Bercuci (A.Bercuci@gsi.de) 2nd May 2007
  //

  AliTRDcalibDB *calibration = AliTRDcalibDB::Instance();
  if (!calibration) {
    AliErrorGeneral("AliTRDpidESD::MakePID()"
      ,"No access to calibration data");
    return -1;
  }
  
//   AliTRDrecoParam *rec = AliTRDReconstructor::RecoParam();
//   if (!rec) {
//     AliErrorGeneral("AliTRDpidESD::MakePID()", "No TRD reco param.");
//     return 0x0;
//   }

  // Retrieve the CDB container class with the probability distributions
  const AliTRDCalPID *pd = calibration->GetPIDObject(AliTRDpidUtil::kLQ);
  if (!pd) {
    AliErrorGeneral("AliTRDpidESD::MakePID()"
      ,"No access to AliTRDCalPID");
    return -1;
  }

  // Loop through all ESD tracks
  Double_t p[10];
  AliESDtrack *t = NULL;
  Float_t dedx[AliTRDCalPID::kNSlicesLQ], dEdx;
  Int_t   timebin;
  Float_t mom, length;
  Int_t   nPlanePID;
  for (Int_t i=0; i<event->GetNumberOfTracks(); i++) {
    t = event->GetTrack(i);
    
    // Check track
    if(!CheckTrack(t)) continue;

            
    // Skip tracks which have no TRD signal at all
    if (t->GetTRDsignal()<1.e-5) continue;
  
    // Loop over detector layers
    mom          = 0.;
    length       = 0.;
    nPlanePID    = 0;
    for (Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++) 
                  p[iSpecies] = 1./AliPID::kSPECIES;

    for (Int_t iLayer = 0; iLayer < AliTRDgeometry::kNlayer; iLayer++) {
      // read data for track segment
      for(int iSlice=0; iSlice<AliTRDCalPID::kNSlicesLQ; iSlice++)
        dedx[iSlice] = t->GetTRDslice(iLayer, iSlice);
      dEdx    = t->GetTRDslice(iLayer, -1);
      timebin = t->GetTRDTimBin(iLayer);

      // check data
      if ((dEdx <=  0.) || (timebin <= -1.)) continue;

      // retrive kinematic info for this track segment
      if(!RecalculateTrackSegmentKine(t, iLayer, mom, length)){
        // information is not fully reliable especialy for length
        // estimation. To be used in the future. 
      }
      
      // this track segment has fulfilled all requierments
      nPlanePID++;

      // Get the probabilities for the different particle species
      for (Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++) {
        p[iSpecies] *= pd->GetProbability(iSpecies, mom, dedx, length, iLayer);
        //p[iSpecies] *= pd->GetProbabilityT(iSpecies, mom, timebin);
      }
    }
    if(nPlanePID == 0) continue;
    
    // normalize probabilities
    Double_t probTotal = 0.;
    for (Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++) probTotal   += p[iSpecies];
    if(probTotal <= 0.){
      AliWarning(Form("The total probability (%e) over all species <= 0 in ESD track %d."
                                      , probTotal, i));
      AliWarning("This may be caused by some error in reference data.");
      AliWarning("Calculation continues but results might be corrupted.");
      continue;
    }
    for(Int_t iSpecies = 0; iSpecies < AliPID::kSPECIES; iSpecies++) p[iSpecies] /= probTotal;

    // book PID to the track
    t->SetTRDpid(p);
    t->SetTRDntracklets(nPlanePID<<3);
  }
  
  return 0;

}

//_____________________________________________________________________________
Bool_t AliTRDpidESD::CheckTrack(AliESDtrack * const t)
{
  //
  // Check if track is eligible for PID calculations
  //
  
  // Check the ESD track status
  if (fgCheckTrackStatus) {
    if (((t->GetStatus() & AliESDtrack::kTRDout  ) == 0) &&
      ((t->GetStatus() & AliESDtrack::kTRDrefit) == 0)) return kFALSE;
  }

  // Check for ESD kink tracks
  if (fgCheckKinkStatus && (t->GetKinkIndex(0) != 0)) return kFALSE;

  return kTRUE;

}

//_____________________________________________________________________________
Bool_t AliTRDpidESD::RecalculateTrackSegmentKine(AliESDtrack * const esd
                                              , Int_t layer
                                              , Float_t &mom
                                              , Float_t &length)
{
  //
  // Retrive momentum "mom" and track "length" in TRD chamber from plane
  // "plan" according to information stored in AliESDtrack "t".
  //
  // Origin
  // Alex Bercuci (A.Bercuci@gsi.de)	
  //

  const Float_t kAmHalfWidth = AliTRDgeometry::AmThick() / 2.;
        const Float_t kDrWidth     = AliTRDgeometry::DrThick();
  const Float_t kTime0       = AliTRDgeometry::GetTime0(layer);

  // set initial length value to chamber height 
  length = 2 * kAmHalfWidth + kDrWidth;
    
  // retrive track's outer param
  const AliExternalTrackParam *op = esd->GetOuterParam();
  if(!op){
    mom    = esd->GetP();
    return kFALSE;
  }

  AliExternalTrackParam *param = NULL;
  if(!fTrack){
    fTrack = new AliExternalTrackParam(*op);
    param = fTrack;
  } else param = new(fTrack) AliExternalTrackParam(*op);
  
  // retrive the magnetic field
  Double_t xyz0[3];
  op->GetXYZ(xyz0);
  Float_t field = AliTracker::GetBz(xyz0); // Bz in kG at point xyz0
  Double_t s, t;

  // propagate to chamber entrance
  if(!param->PropagateTo(kTime0-kAmHalfWidth-kDrWidth, field)){
    mom    = op->GetP();
    s      = op->GetSnp();
    t      = op->GetTgl();
    if (s < 1.) length /= TMath::Sqrt((1.-s)*(1.+s) / (1. + t*t));
    return kFALSE;
  }
  mom        = param->GetP();
  s = param->GetSnp();
  t = param->GetTgl();
  if (s < 1.) length    /= TMath::Sqrt((1.-s)*(1.+s) / (1. + t*t));

  // check if track is crossing tracking sector by propagating to chamber exit- maybe is too much :)
  Double_t alpha = param->GetAlpha();
  if(!param->PropagateTo(kTime0+kAmHalfWidth, field)) return kFALSE;
    
  // mark track segments which are crossing SM boundaries along chamber
  if(TMath::Abs(alpha-param->GetAlpha())>.01) return kFALSE;
  
  return kTRUE;

}
 AliTRDpidESD.cxx:1
 AliTRDpidESD.cxx:2
 AliTRDpidESD.cxx:3
 AliTRDpidESD.cxx:4
 AliTRDpidESD.cxx:5
 AliTRDpidESD.cxx:6
 AliTRDpidESD.cxx:7
 AliTRDpidESD.cxx:8
 AliTRDpidESD.cxx:9
 AliTRDpidESD.cxx:10
 AliTRDpidESD.cxx:11
 AliTRDpidESD.cxx:12
 AliTRDpidESD.cxx:13
 AliTRDpidESD.cxx:14
 AliTRDpidESD.cxx:15
 AliTRDpidESD.cxx:16
 AliTRDpidESD.cxx:17
 AliTRDpidESD.cxx:18
 AliTRDpidESD.cxx:19
 AliTRDpidESD.cxx:20
 AliTRDpidESD.cxx:21
 AliTRDpidESD.cxx:22
 AliTRDpidESD.cxx:23
 AliTRDpidESD.cxx:24
 AliTRDpidESD.cxx:25
 AliTRDpidESD.cxx:26
 AliTRDpidESD.cxx:27
 AliTRDpidESD.cxx:28
 AliTRDpidESD.cxx:29
 AliTRDpidESD.cxx:30
 AliTRDpidESD.cxx:31
 AliTRDpidESD.cxx:32
 AliTRDpidESD.cxx:33
 AliTRDpidESD.cxx:34
 AliTRDpidESD.cxx:35
 AliTRDpidESD.cxx:36
 AliTRDpidESD.cxx:37
 AliTRDpidESD.cxx:38
 AliTRDpidESD.cxx:39
 AliTRDpidESD.cxx:40
 AliTRDpidESD.cxx:41
 AliTRDpidESD.cxx:42
 AliTRDpidESD.cxx:43
 AliTRDpidESD.cxx:44
 AliTRDpidESD.cxx:45
 AliTRDpidESD.cxx:46
 AliTRDpidESD.cxx:47
 AliTRDpidESD.cxx:48
 AliTRDpidESD.cxx:49
 AliTRDpidESD.cxx:50
 AliTRDpidESD.cxx:51
 AliTRDpidESD.cxx:52
 AliTRDpidESD.cxx:53
 AliTRDpidESD.cxx:54
 AliTRDpidESD.cxx:55
 AliTRDpidESD.cxx:56
 AliTRDpidESD.cxx:57
 AliTRDpidESD.cxx:58
 AliTRDpidESD.cxx:59
 AliTRDpidESD.cxx:60
 AliTRDpidESD.cxx:61
 AliTRDpidESD.cxx:62
 AliTRDpidESD.cxx:63
 AliTRDpidESD.cxx:64
 AliTRDpidESD.cxx:65
 AliTRDpidESD.cxx:66
 AliTRDpidESD.cxx:67
 AliTRDpidESD.cxx:68
 AliTRDpidESD.cxx:69
 AliTRDpidESD.cxx:70
 AliTRDpidESD.cxx:71
 AliTRDpidESD.cxx:72
 AliTRDpidESD.cxx:73
 AliTRDpidESD.cxx:74
 AliTRDpidESD.cxx:75
 AliTRDpidESD.cxx:76
 AliTRDpidESD.cxx:77
 AliTRDpidESD.cxx:78
 AliTRDpidESD.cxx:79
 AliTRDpidESD.cxx:80
 AliTRDpidESD.cxx:81
 AliTRDpidESD.cxx:82
 AliTRDpidESD.cxx:83
 AliTRDpidESD.cxx:84
 AliTRDpidESD.cxx:85
 AliTRDpidESD.cxx:86
 AliTRDpidESD.cxx:87
 AliTRDpidESD.cxx:88
 AliTRDpidESD.cxx:89
 AliTRDpidESD.cxx:90
 AliTRDpidESD.cxx:91
 AliTRDpidESD.cxx:92
 AliTRDpidESD.cxx:93
 AliTRDpidESD.cxx:94
 AliTRDpidESD.cxx:95
 AliTRDpidESD.cxx:96
 AliTRDpidESD.cxx:97
 AliTRDpidESD.cxx:98
 AliTRDpidESD.cxx:99
 AliTRDpidESD.cxx:100
 AliTRDpidESD.cxx:101
 AliTRDpidESD.cxx:102
 AliTRDpidESD.cxx:103
 AliTRDpidESD.cxx:104
 AliTRDpidESD.cxx:105
 AliTRDpidESD.cxx:106
 AliTRDpidESD.cxx:107
 AliTRDpidESD.cxx:108
 AliTRDpidESD.cxx:109
 AliTRDpidESD.cxx:110
 AliTRDpidESD.cxx:111
 AliTRDpidESD.cxx:112
 AliTRDpidESD.cxx:113
 AliTRDpidESD.cxx:114
 AliTRDpidESD.cxx:115
 AliTRDpidESD.cxx:116
 AliTRDpidESD.cxx:117
 AliTRDpidESD.cxx:118
 AliTRDpidESD.cxx:119
 AliTRDpidESD.cxx:120
 AliTRDpidESD.cxx:121
 AliTRDpidESD.cxx:122
 AliTRDpidESD.cxx:123
 AliTRDpidESD.cxx:124
 AliTRDpidESD.cxx:125
 AliTRDpidESD.cxx:126
 AliTRDpidESD.cxx:127
 AliTRDpidESD.cxx:128
 AliTRDpidESD.cxx:129
 AliTRDpidESD.cxx:130
 AliTRDpidESD.cxx:131
 AliTRDpidESD.cxx:132
 AliTRDpidESD.cxx:133
 AliTRDpidESD.cxx:134
 AliTRDpidESD.cxx:135
 AliTRDpidESD.cxx:136
 AliTRDpidESD.cxx:137
 AliTRDpidESD.cxx:138
 AliTRDpidESD.cxx:139
 AliTRDpidESD.cxx:140
 AliTRDpidESD.cxx:141
 AliTRDpidESD.cxx:142
 AliTRDpidESD.cxx:143
 AliTRDpidESD.cxx:144
 AliTRDpidESD.cxx:145
 AliTRDpidESD.cxx:146
 AliTRDpidESD.cxx:147
 AliTRDpidESD.cxx:148
 AliTRDpidESD.cxx:149
 AliTRDpidESD.cxx:150
 AliTRDpidESD.cxx:151
 AliTRDpidESD.cxx:152
 AliTRDpidESD.cxx:153
 AliTRDpidESD.cxx:154
 AliTRDpidESD.cxx:155
 AliTRDpidESD.cxx:156
 AliTRDpidESD.cxx:157
 AliTRDpidESD.cxx:158
 AliTRDpidESD.cxx:159
 AliTRDpidESD.cxx:160
 AliTRDpidESD.cxx:161
 AliTRDpidESD.cxx:162
 AliTRDpidESD.cxx:163
 AliTRDpidESD.cxx:164
 AliTRDpidESD.cxx:165
 AliTRDpidESD.cxx:166
 AliTRDpidESD.cxx:167
 AliTRDpidESD.cxx:168
 AliTRDpidESD.cxx:169
 AliTRDpidESD.cxx:170
 AliTRDpidESD.cxx:171
 AliTRDpidESD.cxx:172
 AliTRDpidESD.cxx:173
 AliTRDpidESD.cxx:174
 AliTRDpidESD.cxx:175
 AliTRDpidESD.cxx:176
 AliTRDpidESD.cxx:177
 AliTRDpidESD.cxx:178
 AliTRDpidESD.cxx:179
 AliTRDpidESD.cxx:180
 AliTRDpidESD.cxx:181
 AliTRDpidESD.cxx:182
 AliTRDpidESD.cxx:183
 AliTRDpidESD.cxx:184
 AliTRDpidESD.cxx:185
 AliTRDpidESD.cxx:186
 AliTRDpidESD.cxx:187
 AliTRDpidESD.cxx:188
 AliTRDpidESD.cxx:189
 AliTRDpidESD.cxx:190
 AliTRDpidESD.cxx:191
 AliTRDpidESD.cxx:192
 AliTRDpidESD.cxx:193
 AliTRDpidESD.cxx:194
 AliTRDpidESD.cxx:195
 AliTRDpidESD.cxx:196
 AliTRDpidESD.cxx:197
 AliTRDpidESD.cxx:198
 AliTRDpidESD.cxx:199
 AliTRDpidESD.cxx:200
 AliTRDpidESD.cxx:201
 AliTRDpidESD.cxx:202
 AliTRDpidESD.cxx:203
 AliTRDpidESD.cxx:204
 AliTRDpidESD.cxx:205
 AliTRDpidESD.cxx:206
 AliTRDpidESD.cxx:207
 AliTRDpidESD.cxx:208
 AliTRDpidESD.cxx:209
 AliTRDpidESD.cxx:210
 AliTRDpidESD.cxx:211
 AliTRDpidESD.cxx:212
 AliTRDpidESD.cxx:213
 AliTRDpidESD.cxx:214
 AliTRDpidESD.cxx:215
 AliTRDpidESD.cxx:216
 AliTRDpidESD.cxx:217
 AliTRDpidESD.cxx:218
 AliTRDpidESD.cxx:219
 AliTRDpidESD.cxx:220
 AliTRDpidESD.cxx:221
 AliTRDpidESD.cxx:222
 AliTRDpidESD.cxx:223
 AliTRDpidESD.cxx:224
 AliTRDpidESD.cxx:225
 AliTRDpidESD.cxx:226
 AliTRDpidESD.cxx:227
 AliTRDpidESD.cxx:228
 AliTRDpidESD.cxx:229
 AliTRDpidESD.cxx:230
 AliTRDpidESD.cxx:231
 AliTRDpidESD.cxx:232
 AliTRDpidESD.cxx:233
 AliTRDpidESD.cxx:234
 AliTRDpidESD.cxx:235
 AliTRDpidESD.cxx:236
 AliTRDpidESD.cxx:237
 AliTRDpidESD.cxx:238
 AliTRDpidESD.cxx:239
 AliTRDpidESD.cxx:240
 AliTRDpidESD.cxx:241
 AliTRDpidESD.cxx:242
 AliTRDpidESD.cxx:243
 AliTRDpidESD.cxx:244
 AliTRDpidESD.cxx:245
 AliTRDpidESD.cxx:246
 AliTRDpidESD.cxx:247
 AliTRDpidESD.cxx:248
 AliTRDpidESD.cxx:249
 AliTRDpidESD.cxx:250
 AliTRDpidESD.cxx:251
 AliTRDpidESD.cxx:252
 AliTRDpidESD.cxx:253
 AliTRDpidESD.cxx:254
 AliTRDpidESD.cxx:255
 AliTRDpidESD.cxx:256
 AliTRDpidESD.cxx:257
 AliTRDpidESD.cxx:258
 AliTRDpidESD.cxx:259
 AliTRDpidESD.cxx:260
 AliTRDpidESD.cxx:261
 AliTRDpidESD.cxx:262
 AliTRDpidESD.cxx:263
 AliTRDpidESD.cxx:264
 AliTRDpidESD.cxx:265
 AliTRDpidESD.cxx:266
 AliTRDpidESD.cxx:267
 AliTRDpidESD.cxx:268
 AliTRDpidESD.cxx:269
 AliTRDpidESD.cxx:270
 AliTRDpidESD.cxx:271
 AliTRDpidESD.cxx:272
 AliTRDpidESD.cxx:273
 AliTRDpidESD.cxx:274
 AliTRDpidESD.cxx:275
 AliTRDpidESD.cxx:276
 AliTRDpidESD.cxx:277
 AliTRDpidESD.cxx:278
 AliTRDpidESD.cxx:279
 AliTRDpidESD.cxx:280
 AliTRDpidESD.cxx:281
 AliTRDpidESD.cxx:282
 AliTRDpidESD.cxx:283
 AliTRDpidESD.cxx:284
 AliTRDpidESD.cxx:285
 AliTRDpidESD.cxx:286
 AliTRDpidESD.cxx:287
 AliTRDpidESD.cxx:288
 AliTRDpidESD.cxx:289
 AliTRDpidESD.cxx:290
 AliTRDpidESD.cxx:291
 AliTRDpidESD.cxx:292
 AliTRDpidESD.cxx:293
 AliTRDpidESD.cxx:294
 AliTRDpidESD.cxx:295
 AliTRDpidESD.cxx:296
 AliTRDpidESD.cxx:297
 AliTRDpidESD.cxx:298
 AliTRDpidESD.cxx:299
 AliTRDpidESD.cxx:300
 AliTRDpidESD.cxx:301