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 to benchmark the V0 pid capabilties
// runs over reconstructed V0 candidates and uses MC information for 
// further analysis [purity, PID perfortmance]
//
// authors:
//    Matus Kalisky <matus.kalisky@cern.ch>
//

#include "TIterator.h"

#include "AliVParticle.h"
#include "AliESDtrack.h"
#include "AliMCParticle.h"
#include "AliMCEvent.h"

#include "AliHFEcollection.h"

#include "AliHFEV0pidMC.h"
ClassImp(AliHFEV0pidMC)

//____________________________________________________________
  AliHFEV0pidMC::AliHFEV0pidMC():
    fMC(0x0)
    , fColl(NULL)
    , fDestBits(0)
{
  //
  // default constructor
  //

}
//____________________________________________________________
AliHFEV0pidMC::~AliHFEV0pidMC(){
  //
  // destructor
  //
  if (fColl) delete fColl;
}
//____________________________________________________________
void AliHFEV0pidMC::Init(){
  //
  // initialize objects
  //
  
  memset(&fDestBits, 0, sizeof(UInt_t));
  SETBIT(fDestBits, 1);

  fColl = new AliHFEcollection("V0pidMC", "MC based V0 benchmarking");
  // QA
  fColl->CreateTH1F("h_QA_nParticles", "QA on track processing", 10, -0.5, 9.5);

  const Int_t nBins = 20;
  const Float_t pMin = 0.1;
  const Float_t pMax = 10.;

  // before PID
  fColl->CreateTH1F("h_Electron", "all electron candidates (no MC); p (GeV/c); counts", nBins, pMin, pMax, 0);
  fColl->CreateTH1F("h_PionK0", "all K0 pion candidates (no MC); p (GeV/c); counts",  nBins, pMin, pMax, 0);
  fColl->CreateTH1F("h_PionL", "all Lambda pion candidates (no MC); p (GeV/c); counts", nBins, pMin, pMax, 0);
  fColl->CreateTH1F("h_Kaon", "all Kaon candidates (no MC); p (GeV/c); counts",  nBins, pMin, pMax, 0);
  fColl->CreateTH1F("h_Proton", "all Lambda proton candidates (no MC); p (GeV/c); counts",  nBins, pMin, pMax, 0);
  
  fColl->CreateTH1F("h_mis_Electron", "all NON electron candidates MC tagged; p (GeV/c); counts",  nBins, pMin, pMax, 0);
  fColl->CreateTH1F("h_mis_PionK0", "all NON K0 pion candidates MC tagged; p (GeV/c); counts",  nBins, pMin, pMax, 0);
  fColl->CreateTH1F("h_mis_PionL", "all NON Lambda pion candidates MC tagged ; p (GeV/c); counts", nBins, pMin, pMax, 0);
  fColl->CreateTH1F("h_mis_Kaon", "all NON Kaon candidates MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
  fColl->CreateTH1F("h_mis_Proton", "all NON Lambda proton candidates MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);  

  fColl->CreateTH1Fvector1(5, "h_tag_Electron", "electron candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
  fColl->CreateTH1Fvector1(5, "h_tag_PionK0", "K0 pion candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
  fColl->CreateTH1Fvector1(5, "h_tag_PionL", "Lambda pion candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
  fColl->CreateTH1Fvector1(5, "h_tag_Kaon", "kaon candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);
  fColl->CreateTH1Fvector1(5, "h_tag_Proton", "Lambda proton candidate MC tagged; p (GeV/c); counts", nBins, pMin, pMax, 0);

}
//____________________________________________________________
Bool_t  AliHFEV0pidMC::Process(TObjArray * const particles, Int_t type){
  //
  // process the selected V0 daughter tracks
  //
  
  TString hname;
  const TString typeName[5] = {"Electron", "PionK0", "PionL", "Kaon", "Proton"};
  const Int_t  typePID[5] = {0, 2, 2, 3, 4};

  if(!fMC) return kFALSE;
  if(!particles) return kFALSE;
  
  AliVParticle *recTrack = NULL;
  TIterator *trackIter = particles->MakeIterator(); 
  while((recTrack = dynamic_cast<AliVParticle *>(trackIter->Next()))){
    fColl->Fill("h_QA_nParticles", 0);
    // only ESD for now
    AliESDtrack *track = dynamic_cast<AliESDtrack *>(recTrack);
    if(!track) continue;
    const AliExternalTrackParam *ext = track->GetOuterParam();
    if(!ext) continue;
    // MC label
    Int_t label = track->GetLabel();
    if(label <0){
       fColl->Fill("h_QA_nParticles", 1);
      continue;
    }
    AliMCParticle *mcpD = dynamic_cast<AliMCParticle*>(fMC->GetTrack(label));
    if(!mcpD){
      fColl->Fill("h_QA_nParticles", 2);
      continue;
    }

    Float_t p = ext->P();
    //Short_t charge = ext->Charge();
    Int_t pdgD = mcpD->PdgCode();
    AliMCParticle *mcpM = dynamic_cast<AliMCParticle*>(fMC->GetTrack(mcpD->GetMother()));
    if(!mcpM){
      fColl->Fill("h_QA_nParticles", 3);
      continue;
    }
    //Int_t pdgM = mcpM->PdgCode();

    // all candidates
    hname = "h_" + typeName[type];
    fColl->Fill(hname, p);
    Int_t pidD = PDGtoPIDdaughter(pdgD);
    
    // all misidentified candidates
    hname = "h_mis_" + typeName[type];
    if(typePID[type] != pidD){
      fColl->Fill(hname, p);
    }

    // for every particle fill detailed information about the missidentified particles
    hname = "h_tag_" + typeName[type];
    Int_t aliPID = PDGtoAliPID(pdgD);
    fColl->Fill(hname, aliPID, p);
    
  }// .. loop over array
  
  
  return kTRUE;
}  
//____________________________________________________________
Int_t AliHFEV0pidMC::PDGtoPIDdaughter(Int_t pdg) const {
  //
  // convert PDG to local pid 
  //
  switch (TMath::Abs(pdg)){
  case 11:
    return 0;  // electron gamma
  case 211:
    return 2; // pion K0 or pion Lambda
  case 321:
    return 3; //kaon Phi
  case 2212:
    return 4; // proton Lambda
  default:
    return -1;
  };
  
  return -1;
}
//____________________________________________________________
Int_t AliHFEV0pidMC::PDGtoPIDmother(Int_t pdg) const {
  //
  // convert PDG to local pid
  //
  switch (TMath::Abs(pdg)){
  case 22:
      return 0; // gamma
    case 310: 
    return 1; // K0s
  case 333:
    return 2; // Phi
  case 3122:
    return 3; // Lambda
  default:
    return -1;
  };
  
  return -1;
}
//____________________________________________________________
Int_t AliHFEV0pidMC::PDGtoAliPID(Int_t pdg) const {
  //
  // convert PDG to AliPID
  //
  
  switch (TMath::Abs(pdg)){
  case 11:
    return 0; // electron 
  case 13:
    return 1; // muon
  case 211:
    return 2; // pion 
  case 321:
    return 3; // kaon 
  case 2212:
    return 4; // proton 
  default:
    return -1;
  };
  return -1;
}
//____________________________________________________________
TList *AliHFEV0pidMC::GetListOfQAhistograms(){
  //
  // Get QA histograms
  //
  
  CLRBIT(fDestBits, 1);
  if(fColl)
    return fColl->GetList();
  return NULL;
}

 AliHFEV0pidMC.cxx:1
 AliHFEV0pidMC.cxx:2
 AliHFEV0pidMC.cxx:3
 AliHFEV0pidMC.cxx:4
 AliHFEV0pidMC.cxx:5
 AliHFEV0pidMC.cxx:6
 AliHFEV0pidMC.cxx:7
 AliHFEV0pidMC.cxx:8
 AliHFEV0pidMC.cxx:9
 AliHFEV0pidMC.cxx:10
 AliHFEV0pidMC.cxx:11
 AliHFEV0pidMC.cxx:12
 AliHFEV0pidMC.cxx:13
 AliHFEV0pidMC.cxx:14
 AliHFEV0pidMC.cxx:15
 AliHFEV0pidMC.cxx:16
 AliHFEV0pidMC.cxx:17
 AliHFEV0pidMC.cxx:18
 AliHFEV0pidMC.cxx:19
 AliHFEV0pidMC.cxx:20
 AliHFEV0pidMC.cxx:21
 AliHFEV0pidMC.cxx:22
 AliHFEV0pidMC.cxx:23
 AliHFEV0pidMC.cxx:24
 AliHFEV0pidMC.cxx:25
 AliHFEV0pidMC.cxx:26
 AliHFEV0pidMC.cxx:27
 AliHFEV0pidMC.cxx:28
 AliHFEV0pidMC.cxx:29
 AliHFEV0pidMC.cxx:30
 AliHFEV0pidMC.cxx:31
 AliHFEV0pidMC.cxx:32
 AliHFEV0pidMC.cxx:33
 AliHFEV0pidMC.cxx:34
 AliHFEV0pidMC.cxx:35
 AliHFEV0pidMC.cxx:36
 AliHFEV0pidMC.cxx:37
 AliHFEV0pidMC.cxx:38
 AliHFEV0pidMC.cxx:39
 AliHFEV0pidMC.cxx:40
 AliHFEV0pidMC.cxx:41
 AliHFEV0pidMC.cxx:42
 AliHFEV0pidMC.cxx:43
 AliHFEV0pidMC.cxx:44
 AliHFEV0pidMC.cxx:45
 AliHFEV0pidMC.cxx:46
 AliHFEV0pidMC.cxx:47
 AliHFEV0pidMC.cxx:48
 AliHFEV0pidMC.cxx:49
 AliHFEV0pidMC.cxx:50
 AliHFEV0pidMC.cxx:51
 AliHFEV0pidMC.cxx:52
 AliHFEV0pidMC.cxx:53
 AliHFEV0pidMC.cxx:54
 AliHFEV0pidMC.cxx:55
 AliHFEV0pidMC.cxx:56
 AliHFEV0pidMC.cxx:57
 AliHFEV0pidMC.cxx:58
 AliHFEV0pidMC.cxx:59
 AliHFEV0pidMC.cxx:60
 AliHFEV0pidMC.cxx:61
 AliHFEV0pidMC.cxx:62
 AliHFEV0pidMC.cxx:63
 AliHFEV0pidMC.cxx:64
 AliHFEV0pidMC.cxx:65
 AliHFEV0pidMC.cxx:66
 AliHFEV0pidMC.cxx:67
 AliHFEV0pidMC.cxx:68
 AliHFEV0pidMC.cxx:69
 AliHFEV0pidMC.cxx:70
 AliHFEV0pidMC.cxx:71
 AliHFEV0pidMC.cxx:72
 AliHFEV0pidMC.cxx:73
 AliHFEV0pidMC.cxx:74
 AliHFEV0pidMC.cxx:75
 AliHFEV0pidMC.cxx:76
 AliHFEV0pidMC.cxx:77
 AliHFEV0pidMC.cxx:78
 AliHFEV0pidMC.cxx:79
 AliHFEV0pidMC.cxx:80
 AliHFEV0pidMC.cxx:81
 AliHFEV0pidMC.cxx:82
 AliHFEV0pidMC.cxx:83
 AliHFEV0pidMC.cxx:84
 AliHFEV0pidMC.cxx:85
 AliHFEV0pidMC.cxx:86
 AliHFEV0pidMC.cxx:87
 AliHFEV0pidMC.cxx:88
 AliHFEV0pidMC.cxx:89
 AliHFEV0pidMC.cxx:90
 AliHFEV0pidMC.cxx:91
 AliHFEV0pidMC.cxx:92
 AliHFEV0pidMC.cxx:93
 AliHFEV0pidMC.cxx:94
 AliHFEV0pidMC.cxx:95
 AliHFEV0pidMC.cxx:96
 AliHFEV0pidMC.cxx:97
 AliHFEV0pidMC.cxx:98
 AliHFEV0pidMC.cxx:99
 AliHFEV0pidMC.cxx:100
 AliHFEV0pidMC.cxx:101
 AliHFEV0pidMC.cxx:102
 AliHFEV0pidMC.cxx:103
 AliHFEV0pidMC.cxx:104
 AliHFEV0pidMC.cxx:105
 AliHFEV0pidMC.cxx:106
 AliHFEV0pidMC.cxx:107
 AliHFEV0pidMC.cxx:108
 AliHFEV0pidMC.cxx:109
 AliHFEV0pidMC.cxx:110
 AliHFEV0pidMC.cxx:111
 AliHFEV0pidMC.cxx:112
 AliHFEV0pidMC.cxx:113
 AliHFEV0pidMC.cxx:114
 AliHFEV0pidMC.cxx:115
 AliHFEV0pidMC.cxx:116
 AliHFEV0pidMC.cxx:117
 AliHFEV0pidMC.cxx:118
 AliHFEV0pidMC.cxx:119
 AliHFEV0pidMC.cxx:120
 AliHFEV0pidMC.cxx:121
 AliHFEV0pidMC.cxx:122
 AliHFEV0pidMC.cxx:123
 AliHFEV0pidMC.cxx:124
 AliHFEV0pidMC.cxx:125
 AliHFEV0pidMC.cxx:126
 AliHFEV0pidMC.cxx:127
 AliHFEV0pidMC.cxx:128
 AliHFEV0pidMC.cxx:129
 AliHFEV0pidMC.cxx:130
 AliHFEV0pidMC.cxx:131
 AliHFEV0pidMC.cxx:132
 AliHFEV0pidMC.cxx:133
 AliHFEV0pidMC.cxx:134
 AliHFEV0pidMC.cxx:135
 AliHFEV0pidMC.cxx:136
 AliHFEV0pidMC.cxx:137
 AliHFEV0pidMC.cxx:138
 AliHFEV0pidMC.cxx:139
 AliHFEV0pidMC.cxx:140
 AliHFEV0pidMC.cxx:141
 AliHFEV0pidMC.cxx:142
 AliHFEV0pidMC.cxx:143
 AliHFEV0pidMC.cxx:144
 AliHFEV0pidMC.cxx:145
 AliHFEV0pidMC.cxx:146
 AliHFEV0pidMC.cxx:147
 AliHFEV0pidMC.cxx:148
 AliHFEV0pidMC.cxx:149
 AliHFEV0pidMC.cxx:150
 AliHFEV0pidMC.cxx:151
 AliHFEV0pidMC.cxx:152
 AliHFEV0pidMC.cxx:153
 AliHFEV0pidMC.cxx:154
 AliHFEV0pidMC.cxx:155
 AliHFEV0pidMC.cxx:156
 AliHFEV0pidMC.cxx:157
 AliHFEV0pidMC.cxx:158
 AliHFEV0pidMC.cxx:159
 AliHFEV0pidMC.cxx:160
 AliHFEV0pidMC.cxx:161
 AliHFEV0pidMC.cxx:162
 AliHFEV0pidMC.cxx:163
 AliHFEV0pidMC.cxx:164
 AliHFEV0pidMC.cxx:165
 AliHFEV0pidMC.cxx:166
 AliHFEV0pidMC.cxx:167
 AliHFEV0pidMC.cxx:168
 AliHFEV0pidMC.cxx:169
 AliHFEV0pidMC.cxx:170
 AliHFEV0pidMC.cxx:171
 AliHFEV0pidMC.cxx:172
 AliHFEV0pidMC.cxx:173
 AliHFEV0pidMC.cxx:174
 AliHFEV0pidMC.cxx:175
 AliHFEV0pidMC.cxx:176
 AliHFEV0pidMC.cxx:177
 AliHFEV0pidMC.cxx:178
 AliHFEV0pidMC.cxx:179
 AliHFEV0pidMC.cxx:180
 AliHFEV0pidMC.cxx:181
 AliHFEV0pidMC.cxx:182
 AliHFEV0pidMC.cxx:183
 AliHFEV0pidMC.cxx:184
 AliHFEV0pidMC.cxx:185
 AliHFEV0pidMC.cxx:186
 AliHFEV0pidMC.cxx:187
 AliHFEV0pidMC.cxx:188
 AliHFEV0pidMC.cxx:189
 AliHFEV0pidMC.cxx:190
 AliHFEV0pidMC.cxx:191
 AliHFEV0pidMC.cxx:192
 AliHFEV0pidMC.cxx:193
 AliHFEV0pidMC.cxx:194
 AliHFEV0pidMC.cxx:195
 AliHFEV0pidMC.cxx:196
 AliHFEV0pidMC.cxx:197
 AliHFEV0pidMC.cxx:198
 AliHFEV0pidMC.cxx:199
 AliHFEV0pidMC.cxx:200
 AliHFEV0pidMC.cxx:201
 AliHFEV0pidMC.cxx:202
 AliHFEV0pidMC.cxx:203
 AliHFEV0pidMC.cxx:204
 AliHFEV0pidMC.cxx:205
 AliHFEV0pidMC.cxx:206
 AliHFEV0pidMC.cxx:207
 AliHFEV0pidMC.cxx:208
 AliHFEV0pidMC.cxx:209
 AliHFEV0pidMC.cxx:210
 AliHFEV0pidMC.cxx:211
 AliHFEV0pidMC.cxx:212
 AliHFEV0pidMC.cxx:213
 AliHFEV0pidMC.cxx:214
 AliHFEV0pidMC.cxx:215
 AliHFEV0pidMC.cxx:216
 AliHFEV0pidMC.cxx:217
 AliHFEV0pidMC.cxx:218
 AliHFEV0pidMC.cxx:219
 AliHFEV0pidMC.cxx:220
 AliHFEV0pidMC.cxx:221
 AliHFEV0pidMC.cxx:222
 AliHFEV0pidMC.cxx:223
 AliHFEV0pidMC.cxx:224
 AliHFEV0pidMC.cxx:225
 AliHFEV0pidMC.cxx:226
 AliHFEV0pidMC.cxx:227
 AliHFEV0pidMC.cxx:228
 AliHFEV0pidMC.cxx:229