1 #include "AliSpectraBothPID.h"
2 #include "AliAODEvent.h"
6 #include "AliAODTrack.h"
7 #include "AliAODMCParticle.h"
8 #include "AliPIDResponse.h"
9 #include "AliAnalysisManager.h"
10 #include "AliInputEventHandler.h"
11 #include "AliSpectraBothTrackCuts.h"
13 ClassImp(AliSpectraBothPID)
15 AliSpectraBothPID::AliSpectraBothPID() : TNamed("PID", "PID object"), fPIDType(kNSigmaTPCTOF), fNSigmaPID(3), fPIDResponse(0),fshiftTPC(0),fshiftTOF(0)
20 AliSpectraBothPID::AliSpectraBothPID(BothPIDType_t pidType) : TNamed("PID", "PID object"), fPIDType(pidType), fNSigmaPID(3), fPIDResponse(0), fshiftTPC(0),fshiftTOF(0)
29 void AliSpectraBothPID::FillQAHistos(AliSpectraBothHistoManager * hman, AliVTrack * track, AliSpectraBothTrackCuts * trackCuts)
32 // fill a bunch of QA histos
35 // Get PID response object, if needed
38 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
39 AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());
40 fPIDResponse = inputHandler->GetPIDResponse();
44 AliVParticle *inEvHMain = dynamic_cast<AliVParticle *>(track);
46 hman->GetPIDHistogram(kHistPIDTPC)->Fill(track->GetTPCmomentum(), track->GetTPCsignal()*track->Charge()); // PID histo
47 hman->GetPIDHistogram(kHistPIDTPCPion)->Fill(track->GetTPCmomentum(),fPIDResponse->GetTPCResponse().GetExpectedSignal(track->GetTPCmomentum(),AliPID::kPion)*track->Charge()); // Expected PIDPion histo
48 hman->GetPIDHistogram(kHistPIDTPCKaon)->Fill(track->GetTPCmomentum(),fPIDResponse->GetTPCResponse().GetExpectedSignal(track->GetTPCmomentum(),AliPID::kKaon)*track->Charge()); // Expected PIDKaon histo
49 hman->GetPIDHistogram(kHistPIDTPCProton)->Fill(track->GetTPCmomentum(),fPIDResponse->GetTPCResponse().GetExpectedSignal(track->GetTPCmomentum(),AliPID::kProton)*track->Charge()); // Expected PIDProton histo
51 Double_t nsigmaTPCkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton)+fshiftTPC);
52 Double_t nsigmaTPCkKaon = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon)+fshiftTPC);
53 Double_t nsigmaTPCkPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion)+fshiftTPC);
54 Double_t nsigmaTOFkProton=100.0,nsigmaTOFkKaon=100.0,nsigmaTOFkPion=100.0;
56 Double_t nsigmaTPCTOFkProton = TMath::Abs(nsigmaTPCkProton);
57 Double_t nsigmaTPCTOFkKaon = TMath::Abs(nsigmaTPCkKaon);
58 Double_t nsigmaTPCTOFkPion = TMath::Abs(nsigmaTPCkPion);
59 if(fPIDType==kNSigmaTOF)
61 nsigmaTPCTOFkProton = 100.0;
62 nsigmaTPCTOFkKaon = 100.0;
63 nsigmaTPCTOFkPion =100.0;
67 if(track->Pt()>trackCuts->GetPtTOFMatching())
70 hman->GetPIDHistogram(kHistPIDTOF)->Fill(track->P(),(track->GetTOFsignal()/100)*track->Charge()); // PID histo
72 nsigmaTOFkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton)+fshiftTOF);
73 nsigmaTOFkKaon = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon)+fshiftTOF);
74 nsigmaTOFkPion = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion)+fshiftTOF);
77 hman->GetPtHistogram(kHistNSigProtonTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));
78 hman->GetPtHistogram(kHistNSigKaonTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon));
79 hman->GetPtHistogram(kHistNSigPionTOF)->Fill(track->P(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion));
80 hman->GetPtHistogram(kHistNSigProtonPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton));
81 hman->GetPtHistogram(kHistNSigKaonPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon));
82 hman->GetPtHistogram(kHistNSigPionPtTOF)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion));
84 nsigmaTPCTOFkProton = TMath::Sqrt((nsigmaTPCkProton*nsigmaTPCkProton+nsigmaTOFkProton*nsigmaTOFkProton)/2);
85 nsigmaTPCTOFkKaon = TMath::Sqrt((nsigmaTPCkKaon*nsigmaTPCkKaon+nsigmaTOFkKaon*nsigmaTOFkKaon)/2);
86 nsigmaTPCTOFkPion = TMath::Sqrt((nsigmaTPCkPion*nsigmaTPCkPion+nsigmaTOFkPion*nsigmaTOFkPion)/2);
91 if (fPIDType==kNSigmaTOF)
96 hman->GetPtHistogram(kHistNSigProtonTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton)+fshiftTPC);
97 hman->GetPtHistogram(kHistNSigKaonTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon)+fshiftTPC);
98 hman->GetPtHistogram(kHistNSigPionTPC)->Fill(track->P(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion)+fshiftTPC);
99 hman->GetPtHistogram(kHistNSigProtonPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton)+fshiftTPC);
100 hman->GetPtHistogram(kHistNSigKaonPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon)+fshiftTPC);
101 hman->GetPtHistogram(kHistNSigPionPtTPC)->Fill(track->Pt(),fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion)+fshiftTPC);
103 hman->GetPtHistogram(kHistNSigProtonTPCTOF)->Fill(track->P(),nsigmaTPCTOFkProton);
104 hman->GetPtHistogram(kHistNSigKaonTPCTOF)->Fill(track->P(),nsigmaTPCTOFkKaon);
105 hman->GetPtHistogram(kHistNSigPionTPCTOF)->Fill(track->P(),nsigmaTPCTOFkPion);
106 hman->GetPtHistogram(kHistNSigProtonPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkProton);
107 hman->GetPtHistogram(kHistNSigKaonPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkKaon);
108 hman->GetPtHistogram(kHistNSigPionPtTPCTOF)->Fill(track->Pt(),nsigmaTPCTOFkPion);
112 Int_t AliSpectraBothPID::GetParticleSpecie(AliAODMCParticle * part)
114 // return PID according to MC truth
115 switch(TMath::Abs(part->PdgCode()))
131 Int_t AliSpectraBothPID::GetParticleSpecie(TParticle* part)
133 // return PID according to MC truth
134 switch(TMath::Abs(part->GetPdgCode()))
150 Int_t AliSpectraBothPID::GetParticleSpecie(AliSpectraBothHistoManager * hman,AliVTrack * trk, AliSpectraBothTrackCuts * trackCuts, Bool_t* rec)
152 // return PID according to detectors
153 // Get PID response object, if needed
155 // guess the particle based on the smaller nsigma
159 rec[kSpProton]=false;
163 AliAnalysisManager *man = AliAnalysisManager::GetAnalysisManager();
164 AliInputEventHandler* inputHandler = (AliInputEventHandler*)(man->GetInputEventHandler());
165 fPIDResponse = inputHandler->GetPIDResponse();
170 AliFatal("Cannot get pid response");
175 // Compute nsigma for each hypthesis
176 AliVParticle *inEvHMain = dynamic_cast<AliVParticle *>(trk);
179 Double_t nsigmaTPCkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kProton)+fshiftTPC);
180 Double_t nsigmaTPCkKaon = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kKaon)+fshiftTPC);
181 Double_t nsigmaTPCkPion = TMath::Abs(fPIDResponse->NumberOfSigmasTPC(inEvHMain, AliPID::kPion)+fshiftTPC);
185 Double_t nsigmaTOFkProton=100.0,nsigmaTOFkKaon=100.0,nsigmaTOFkPion=100.0;
187 Double_t nsigmaTPCTOFkProton = TMath::Abs(nsigmaTPCkProton);
188 Double_t nsigmaTPCTOFkKaon = TMath::Abs(nsigmaTPCkKaon);
189 Double_t nsigmaTPCTOFkPion = TMath::Abs(nsigmaTPCkPion);
190 if(fPIDType==kNSigmaTOF)
192 nsigmaTPCTOFkProton = 100.0;
193 nsigmaTPCTOFkKaon = 100.0;
194 nsigmaTPCTOFkPion =100.0;
200 if(trk->Pt()>trackCuts->GetPtTOFMatching())
202 nsigmaTOFkProton = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kProton)+fshiftTOF);
203 nsigmaTOFkKaon = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kKaon)+fshiftTOF);
204 nsigmaTOFkPion = TMath::Abs(fPIDResponse->NumberOfSigmasTOF(inEvHMain, AliPID::kPion)+fshiftTOF);
205 // the TOF info is used in combined
206 nsigmaTPCTOFkProton = TMath::Sqrt((nsigmaTPCkProton*nsigmaTPCkProton+nsigmaTOFkProton*nsigmaTOFkProton)/2.);
207 nsigmaTPCTOFkKaon = TMath::Sqrt((nsigmaTPCkKaon*nsigmaTPCkKaon+nsigmaTOFkKaon*nsigmaTOFkKaon)/2.);
208 nsigmaTPCTOFkPion = TMath::Sqrt((nsigmaTPCkPion*nsigmaTPCkPion+nsigmaTOFkPion*nsigmaTOFkPion)/2.);
212 if (fPIDType==kNSigmaTOF)
217 // select the nsigma to be used for the actual PID
218 Double_t nsigmaPion=100;
219 Double_t nsigmaKaon=100;
220 Double_t nsigmaProton=100;
225 nsigmaProton = nsigmaTPCkProton;
226 nsigmaKaon = nsigmaTPCkKaon ;
227 nsigmaPion = nsigmaTPCkPion ;
230 nsigmaProton = nsigmaTOFkProton;
231 nsigmaKaon = nsigmaTOFkKaon ;
232 nsigmaPion = nsigmaTOFkPion ;
235 nsigmaProton = nsigmaTPCTOFkProton;
236 nsigmaKaon = nsigmaTPCTOFkKaon ;
237 nsigmaPion = nsigmaTPCTOFkPion ;
241 if(nsigmaPion < fNSigmaPID)
243 if(nsigmaKaon < fNSigmaPID)
245 if(nsigmaProton < fNSigmaPID)
248 if( ( nsigmaKaon==nsigmaPion ) && ( nsigmaKaon==nsigmaProton ))
249 return kSpUndefined;//if is the default value for the three
250 if( ( nsigmaKaon < nsigmaPion ) && ( nsigmaKaon < nsigmaProton ) && (nsigmaKaon < fNSigmaPID))
252 hman->GetPIDHistogram(kHistPIDTPCKaonRec)->Fill(trk->GetTPCmomentum(), trk->GetTPCsignal()*trk->Charge()); // Reconstructed PIDKaon histo
255 if( ( nsigmaPion < nsigmaKaon ) && ( nsigmaPion < nsigmaProton ) && (nsigmaPion < fNSigmaPID))
257 hman->GetPIDHistogram(kHistPIDTPCPionRec)->Fill(trk->GetTPCmomentum(), trk->GetTPCsignal()*trk->Charge()); // Reconstructed PIDPion histo
260 if( ( nsigmaProton < nsigmaKaon ) && ( nsigmaProton < nsigmaPion ) && (nsigmaProton < fNSigmaPID))
262 hman->GetPIDHistogram(kHistPIDTPCProtonRec)->Fill(trk->GetTPCmomentum(), trk->GetTPCsignal()*trk->Charge()); // Reconstructed PIDProton histo
265 // else, return undefined
270 Long64_t AliSpectraBothPID::Merge(TCollection* list)
272 // Merging interface.
273 // Returns the number of merged objects (including this).
283 TIterator* iter = list->MakeIterator();
286 // Actually, we don't do anything here...
287 // collections of all histograms
288 // TList collections;
292 while ((obj = iter->Next())) {
293 AliSpectraBothPID* entry = dynamic_cast<AliSpectraBothPID*> (obj);
297 // TH1I * histo = entry->GetHistoCuts();
298 // collections.Add(histo);
302 // fHistoCuts->Merge(&collections);