ROOT logo
#include "AliSpectraAODPID.h"
#include "AliAODEvent.h"      
#include "TH1F.h"             
#include "TH2F.h"             
#include "TList.h"            
#include "AliAODTrack.h"      
#include "AliAODMCParticle.h" 
#include "AliPIDResponse.h"   
#include "AliAnalysisManager.h"
#include "AliInputEventHandler.h"
#include "AliSpectraAODTrackCuts.h"

ClassImp(AliSpectraAODPID)

AliSpectraAODPID::AliSpectraAODPID() : TNamed("PID", "PID object"), fPIDType(kNSigmaTPCTOF), fNSigmaPID(3), fPIDResponse(0) {

}

AliSpectraAODPID::AliSpectraAODPID(AODPIDType_t pidType) : TNamed("PID", "PID object"), fPIDType(pidType), fNSigmaPID(3), fPIDResponse(0) {



}



void AliSpectraAODPID::FillQAHistos(AliSpectraAODHistoManager * hman, AliAODTrack * track, AliSpectraAODTrackCuts * trackCuts) {

  // fill a bunch of QA histos


  // Get PID response object, if needed
  if(!fPIDResponse) {
    AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
    AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());
    fPIDResponse = inputHandler->GetPIDResponse();
  }
  
  //Response
  AliVParticle *inEvHMain = dynamic_cast<AliVParticle *>(track);
  
  hman->GetPIDHistogram(kHistPIDTPC)->Fill(track->GetTPCmomentum(), track->GetTPCsignal()*track->Charge()); // PID histo
  hman->GetPIDHistogram(kHistPIDTPCPion)->Fill(track->GetTPCmomentum(),fPIDResponse->GetTPCResponse().GetExpectedSignal(track->GetTPCmomentum(),AliPID::kPion)*track->Charge()); // Expected PIDPion histo
  hman->GetPIDHistogram(kHistPIDTPCKaon)->Fill(track->GetTPCmomentum(),fPIDResponse->GetTPCResponse().GetExpectedSignal(track->GetTPCmomentum(),AliPID::kKaon)*track->Charge()); // Expected PIDKaon histo
  hman->GetPIDHistogram(kHistPIDTPCProton)->Fill(track->GetTPCmomentum(),fPIDResponse->GetTPCResponse().GetExpectedSignal(track->GetTPCmomentum(),AliPID::kProton)*track->Charge()); // Expected PIDProton histo
  
  Double_t nsigmaTPCkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton));
  Double_t nsigmaTPCkKaon = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon)); 
  Double_t nsigmaTPCkPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion)); 
  Double_t nsigmaTOFkProton=0,nsigmaTOFkKaon=0,nsigmaTOFkPion=0;

  if(track->Pt()>trackCuts->GetPtTOFMatching()){
    hman->GetPIDHistogram(kHistPIDTOF)->Fill(track->P(),(track->GetTOFsignal()/100)*track->Charge()); // PID histo
    
    nsigmaTOFkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));
    nsigmaTOFkKaon = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon)); 
    nsigmaTOFkPion = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion)); 
    
    //TOF
    hman->GetPtHistogram(kHistNSigProtonTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));
    hman->GetPtHistogram(kHistNSigKaonTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon));
    hman->GetPtHistogram(kHistNSigPionTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion));
    hman->GetPtHistogram(kHistNSigProtonPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));
    hman->GetPtHistogram(kHistNSigKaonPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon));
    hman->GetPtHistogram(kHistNSigPionPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion));
  }
  
  Double_t nsigmaTPCTOFkProton = TMath::Sqrt((nsigmaTPCkProton*nsigmaTPCkProton+nsigmaTOFkProton*nsigmaTOFkProton)/2);
  Double_t nsigmaTPCTOFkKaon = TMath::Sqrt((nsigmaTPCkKaon*nsigmaTPCkKaon+nsigmaTOFkKaon*nsigmaTOFkKaon)/2);
  Double_t nsigmaTPCTOFkPion = TMath::Sqrt((nsigmaTPCkPion*nsigmaTPCkPion+nsigmaTOFkPion*nsigmaTOFkPion)/2);
  
  //TPC
  hman->GetPtHistogram(kHistNSigProtonTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton));
  hman->GetPtHistogram(kHistNSigKaonTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon));
  hman->GetPtHistogram(kHistNSigPionTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion));
  hman->GetPtHistogram(kHistNSigProtonPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton));
  hman->GetPtHistogram(kHistNSigKaonPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon));
  hman->GetPtHistogram(kHistNSigPionPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion));
  //TPCTOF
  hman->GetPtHistogram(kHistNSigProtonTPCTOF)->Fill(track->P(),nsigmaTPCTOFkProton);
  hman->GetPtHistogram(kHistNSigKaonTPCTOF)->Fill(track->P(),nsigmaTPCTOFkKaon);
  hman->GetPtHistogram(kHistNSigPionTPCTOF)->Fill(track->P(),nsigmaTPCTOFkPion);
  hman->GetPtHistogram(kHistNSigProtonPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkProton);
  hman->GetPtHistogram(kHistNSigKaonPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkKaon);
  hman->GetPtHistogram(kHistNSigPionPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkPion);

}

Int_t AliSpectraAODPID::GetParticleSpecie(AliAODMCParticle * part) {
  // return PID according to MC truth
  switch(TMath::Abs(part->PdgCode())){
  case 2212:
    return kSpProton;
    break;
  case 321:
    return kSpKaon;
    break;
  case 211:
    return kSpPion;
    break;
  default:
    return kSpUndefined;
  } 
}


Int_t AliSpectraAODPID::GetParticleSpecie(AliSpectraAODHistoManager * hman,AliAODTrack      * trk, AliSpectraAODTrackCuts * trackCuts) {
  // return PID according to detectors
  
  // Get PID response object, if needed
  if(!fPIDResponse) {
    AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
    AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());
    fPIDResponse = inputHandler->GetPIDResponse();
  }

  if(!fPIDResponse) {
    AliFatal("Cannot get pid response");
    return 0;
  }


  // Compute nsigma for each hypthesis
  AliVParticle *inEvHMain = dynamic_cast<AliVParticle *>(trk);

  // --- TPC
  Double_t nsigmaTPCkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton));
  Double_t nsigmaTPCkKaon   = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon)); 
  Double_t nsigmaTPCkPion   = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion)); 
  // --- TOF
  Double_t nsigmaTOFkProton=0,nsigmaTOFkKaon=0,nsigmaTOFkPion=0;
  if(trk->Pt()>trackCuts->GetPtTOFMatching()){
    nsigmaTOFkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));
    nsigmaTOFkKaon   = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon)); 
    nsigmaTOFkPion   = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion)); 
  }
	  
  // --- combined
  Double_t nsigmaTPCTOFkProton = TMath::Sqrt((nsigmaTPCkProton*nsigmaTPCkProton+nsigmaTOFkProton*nsigmaTOFkProton)/2.);
  Double_t nsigmaTPCTOFkKaon   = TMath::Sqrt((nsigmaTPCkKaon*nsigmaTPCkKaon+nsigmaTOFkKaon*nsigmaTOFkKaon)/2.);
  Double_t nsigmaTPCTOFkPion   = TMath::Sqrt((nsigmaTPCkPion*nsigmaTPCkPion+nsigmaTOFkPion*nsigmaTOFkPion)/2.);


  // select the nsigma to be used for the actual PID
  Double_t nsigmaPion=0, nsigmaKaon=0, nsigmaProton=0;

  switch (fPIDType) {
  case kNSigmaTPC:
    nsigmaProton  =  nsigmaTPCkProton;
    nsigmaKaon	  =  nsigmaTPCkKaon  ;
    nsigmaPion    =  nsigmaTPCkPion  ;
    break;
  case kNSigmaTOF:
    nsigmaProton  =  nsigmaTOFkProton;
    nsigmaKaon	  =  nsigmaTOFkKaon  ;
    nsigmaPion    =  nsigmaTOFkPion  ;
    break;
  case kNSigmaTPCTOF:
    nsigmaProton  =  nsigmaTPCTOFkProton;
    nsigmaKaon	  =  nsigmaTPCTOFkKaon  ;
    nsigmaPion    =  nsigmaTPCTOFkPion  ;
    break;
  }

  // guess the particle based on the smaller nsigma
  if( ( nsigmaKaon==nsigmaPion ) && ( nsigmaKaon==nsigmaProton )) return kSpUndefined;//if is the default value for the three
  if( ( nsigmaKaon   < nsigmaPion ) && ( nsigmaKaon < nsigmaProton ) && (nsigmaKaon   < fNSigmaPID)){
    hman->GetPIDHistogram(kHistPIDTPCKaonRec)->Fill(trk->GetTPCmomentum(), trk->GetTPCsignal()*trk->Charge()); // Reconstructed PIDKaon histo
    return kSpKaon;
  }
  if( ( nsigmaPion   < nsigmaKaon ) && ( nsigmaPion < nsigmaProton ) && (nsigmaPion   < fNSigmaPID)){
    hman->GetPIDHistogram(kHistPIDTPCPionRec)->Fill(trk->GetTPCmomentum(), trk->GetTPCsignal()*trk->Charge()); // Reconstructed PIDPion histo
    return kSpPion;
  }
  if( ( nsigmaProton < nsigmaKaon ) && ( nsigmaProton < nsigmaPion ) && (nsigmaProton < fNSigmaPID)){
    hman->GetPIDHistogram(kHistPIDTPCProtonRec)->Fill(trk->GetTPCmomentum(), trk->GetTPCsignal()*trk->Charge()); // Reconstructed PIDProton histo
    return kSpProton;
  }
  // else, return undefined
  return kSpUndefined;

}

Long64_t AliSpectraAODPID::Merge(TCollection* list)
{
  // Merging interface.
  // Returns the number of merged objects (including this).

  Printf("Merging");

  if (!list)
    return 0;

  if (list->IsEmpty())
    return 1;

  TIterator* iter = list->MakeIterator();
  TObject* obj;

  // Actually, we don't do anything here...
  // collections of all histograms
  //  TList collections;

  Int_t count = 0;

  while ((obj = iter->Next())) {
    AliSpectraAODPID* entry = dynamic_cast<AliSpectraAODPID*> (obj);
    if (entry == 0) 
      continue;

    // TH1I * histo = entry->GetHistoCuts();      
    // collections.Add(histo);
    count++;
  }
  
  //  fHistoCuts->Merge(&collections);
  
  delete iter;
  Printf("OK");
  return count+1;
}

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