1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
17 * checks ITS PID based on ITS dE/dx truncated mean
19 * Authors: Matus Kalisky <matus.kalisky@cern.ch>
20 * Markus Fasel <M.Fasel@gsi.de>
27 #include "AliESDtrack.h"
30 #include "AliVParticle.h"
32 #include "AliHFEpidITS.h"
34 //___________________________________________________________________
35 AliHFEpidITS::AliHFEpidITS(const Char_t *name):
40 // Default constructor
44 //___________________________________________________________________
45 AliHFEpidITS::AliHFEpidITS(const AliHFEpidITS &ref):
55 //___________________________________________________________________
56 AliHFEpidITS &AliHFEpidITS::operator=(const AliHFEpidITS &ref){
58 // Assignment operator
60 if(this != &ref) ref.Copy(*this);
64 //___________________________________________________________________
65 AliHFEpidITS::~AliHFEpidITS(){
75 //___________________________________________________________________
76 void AliHFEpidITS::Copy(TObject &o) const {
79 // Provides a deep copy
81 AliHFEpidITS &target = dynamic_cast<AliHFEpidITS &>(o);
83 target.fQAlist = dynamic_cast<TList *>(fQAlist->Clone());
84 AliHFEpidBase::Copy(target);
87 //___________________________________________________________________
88 Bool_t AliHFEpidITS::InitializePID(){
90 // ITS PID initialization
96 //___________________________________________________________________
97 Int_t AliHFEpidITS::IsSelected(AliVParticle * /*track*/){
99 // Does PID decision for ITS
101 return 11; // @TODO: Implement ITS PID decision
104 //___________________________________________________________________
105 void AliHFEpidITS::AddQAhistograms(TList *l){
107 // Adding QA histograms for ITS PID
109 // QA histograms are:
110 // - all Particles ITS signal vs. p (both methods)
111 // - single particle ITS signal vs. p (both methods)
113 if(!fQAlist) fQAlist = new TList;
114 fQAlist->SetName("fITSqaHistograms");
117 const Int_t kMomentumBins = 41;
118 const Double_t kPtMin = 0.1;
119 const Double_t kPtMax = 10.;
120 const Int_t kSigBins = 300;
121 Double_t momentumBins[kMomentumBins];
122 for(Int_t ibin = 0; ibin < kMomentumBins; ibin++)
123 momentumBins[ibin] = static_cast<Double_t>(TMath::Power(10,TMath::Log10(kPtMin) + (TMath::Log10(kPtMax)-TMath::Log10(kPtMin))/(kMomentumBins-1)*static_cast<Double_t>(ibin)));
126 fQAlist->AddAt((histo = new TH2F("fITSsigV1all", "ITS signal vs. p (all species, Method1):p / GeV/c:ITS signal / a.u.", kMomentumBins - 1, momentumBins, kSigBins, 0., kSigBins)), kITSsigV1);
127 fQAlist->AddAt((histo = new TH2F("fITSsigV2all", "ITS signal vs. p (all species, Method2):p / GeV/c:ITS signal / a.u.", kMomentumBins - 1, momentumBins, kSigBins, 0., kSigBins)), kITSsigV2);
128 for(Int_t ispec = 0; ispec < AliPID::kSPECIES; ispec++){
129 fQAlist->AddAt((histo = new TH2F(Form("fITSsigV1%s", AliPID::ParticleName(ispec)), Form("ITS signal vs. p (%s, Method1):p / GeV/c:ITS signal / a.u.", AliPID::ParticleName(ispec)), kMomentumBins - 1, momentumBins, kSigBins, 0., kSigBins)), 2 * ispec + kHistosSigAll);
130 fQAlist->AddAt((histo = new TH2F(Form("fITSsigV2%s", AliPID::ParticleName(ispec)), Form("ITS signal vs. p (%s, Method2):p / GeV/c:ITS signal / a.u.", AliPID::ParticleName(ispec)), kMomentumBins - 1, momentumBins, kSigBins, 0., kSigBins)), 2 * ispec + 1 + kHistosSigAll);
135 //___________________________________________________________________
136 Double_t AliHFEpidITS::GetITSSignalV1(AliESDtrack *track){
138 // Calculate the ITS signal according to the mean charge of the clusters
140 Double_t signal = 0.;
143 track->GetITSdEdxSamples(dedx);
144 signal = TMath::Mean(4, dedx);
146 signal = track->GetITSsignal();
148 Double_t p = track->GetTPCInnerParam() ? track->GetTPCInnerParam()->P() : track->P();
149 AliDebug(1, Form("Momentum: %f, ITS Signal: %f", p, signal));
150 if(IsQAon()) FillHistogramsSignalV1(p, signal, GetMCpid(track));
154 //___________________________________________________________________
155 Double_t AliHFEpidITS::GetITSSignalV2(AliESDtrack *track){
157 // Calculates the ITS signal. Truncated mean is used.
159 Double_t dedx[4], tmp[4];
161 track->GetITSdEdxSamples(tmp);
162 TMath::Sort(4, tmp, indices);
163 for(Int_t ien = 0; ien < 4; ien++) dedx[ien] = tmp[indices[ien]];
164 Double_t signal = TMath::Mean(3, dedx);
165 Double_t p = track->GetTPCInnerParam() ? track->GetTPCInnerParam()->P() : track->P();
166 AliDebug(1, Form("Momentum: %f, ITS Signal: %f", p, signal));
167 if(IsQAon()) FillHistogramsSignalV2(p, signal, GetMCpid(track));
171 //___________________________________________________________________
172 void AliHFEpidITS::FillHistogramsSignalV1(Double_t p, Double_t signal, Int_t species){
173 (dynamic_cast<TH2 *>(fQAlist->At(kITSsigV1)))->Fill(p, signal);
174 if(species >= 0 && species < AliPID::kSPECIES)
175 (dynamic_cast<TH2 *>(fQAlist->At(kHistosSigAll + 2 * species)))->Fill(p, signal);
178 //___________________________________________________________________
179 void AliHFEpidITS::FillHistogramsSignalV2(Double_t p, Double_t signal, Int_t species){
180 (dynamic_cast<TH2 *>(fQAlist->At(kITSsigV2)))->Fill(p, signal);
181 if(species >= 0 && species < AliPID::kSPECIES)
182 (dynamic_cast<TH2 *>(fQAlist->At(kHistosSigAll + 2 * species + 1)))->Fill(p, signal);
185 //___________________________________________________________________
186 Int_t AliHFEpidITS::GetMCpid(AliESDtrack *track){
188 // Return species of the track according to MC information
190 Int_t pdg = TMath::Abs(AliHFEpidBase::GetPdgCode(track));
193 case 11: pid = AliPID::kElectron; break;
194 case 13: pid = AliPID::kMuon; break;
195 case 211: pid = AliPID::kPion; break;
196 case 321: pid = AliPID::kKaon; break;
197 case 2212: pid = AliPID::kProton; break;
198 default: pid = -1; break;