1 /**************************************************************************
2 * Copyright(c) 2009-2012, 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 **************************************************************************/
19 ///////////////////////////////////////////////////////////////////
21 // Class to store information for PID with ITS //
22 // and truncated mean computation methods //
23 // Origin: F.Prino, Torino, prino@to.infn.it //
25 ///////////////////////////////////////////////////////////////////
27 #include "AliITSPidParams.h"
28 #include "AliITSdEdxSamples.h"
32 ClassImp(AliITSdEdxSamples)
34 //______________________________________________________________________
35 AliITSdEdxSamples::AliITSdEdxSamples():TObject(),
42 // Default constructor
43 for(Int_t i=0; i<kMaxSamples; i++){
50 //______________________________________________________________________
51 AliITSdEdxSamples::AliITSdEdxSamples(Int_t nSamples, Double_t* esamples, Double_t* xsamples, Double_t mom, Int_t specie) :
56 fParticleSpecie(specie),
59 // Standard constructor
60 SetdESamples(nSamples,esamples);
61 SetdxSamples(nSamples,xsamples);
62 SetClusterMapFromdE();
65 //______________________________________________________________________
66 AliITSdEdxSamples::AliITSdEdxSamples(const AliITSdEdxSamples& source) :
68 fNSamples(source.fNSamples),
69 fClusterMap(source.fClusterMap),
71 fParticleSpecie(source.fParticleSpecie),
72 fLayersForPid(source.fLayersForPid)
75 for(Int_t i=0; i<kMaxSamples; i++){
76 fdESamples[i]=source.GetdESample(i);
77 fdxSamples[i]=source.GetdxSample(i);
78 fPAtSample[i]=source.GetMomentumAtSample(i);
81 //_____________________________________________________________________________
82 AliITSdEdxSamples& AliITSdEdxSamples::operator=(const AliITSdEdxSamples &source){
83 // Assignment operator
84 if(this==&source) return *this;
85 ((TObject *)this)->operator=(source);
86 fNSamples = source.fNSamples;
87 fClusterMap = source.fClusterMap;
89 fParticleSpecie = source.fParticleSpecie;
90 fLayersForPid = source.fLayersForPid;
91 for(Int_t i=0; i<kMaxSamples; i++){
92 fdESamples[i]=source.GetdESample(i);
93 fdxSamples[i]=source.GetdxSample(i);
94 fPAtSample[i]=source.GetMomentumAtSample(i);
98 //______________________________________________________________________
99 void AliITSdEdxSamples::SetdESamples(Int_t nSamples, Double_t* samples){
102 if(nSamples>kMaxSamples){
103 AliWarning(Form("Too many dE samples,only first %d will be used",kMaxSamples));
104 fNSamples=kMaxSamples;
108 for(Int_t i=0; i<fNSamples; i++) fdESamples[i]=samples[i];
109 for(Int_t i=fNSamples; i<kMaxSamples; i++) fdESamples[i]=0.;
112 //______________________________________________________________________
113 void AliITSdEdxSamples::SetdxSamples(Int_t nSamples, Double_t* samples){
116 if(nSamples>kMaxSamples){
117 AliWarning(Form("Too many dx samples,only first %d will be used",kMaxSamples));
118 fNSamples=kMaxSamples;
122 for(Int_t i=0; i<fNSamples; i++) fdxSamples[i]=samples[i];
123 for(Int_t i=fNSamples; i<kMaxSamples; i++) fdxSamples[i]=0.;
127 //______________________________________________________________________
128 void AliITSdEdxSamples::SetSamplesAndMomenta(Int_t nSamples, Double_t* esamples, Double_t* xsamples, Double_t* mom){
130 SetdESamples(nSamples,esamples);
131 SetdxSamples(nSamples,xsamples);
132 for(Int_t i=0; i<fNSamples; i++) fPAtSample[i]=mom[i];
133 for(Int_t i=fNSamples; i<kMaxSamples; i++) fPAtSample[i]=0.;
136 //______________________________________________________________________
137 void AliITSdEdxSamples::SetLayerSample(Int_t iLayer, Bool_t haspoint, Double_t dE, Double_t dx, Double_t p){
138 // set info from single layer
140 SetPointOnLayer(iLayer);
141 fdESamples[iLayer]=dE;
142 fdxSamples[iLayer]=dx;
143 fPAtSample[iLayer]=p;
145 if(HasPointOnLayer(iLayer)) fClusterMap-=(1<<iLayer);
146 fdESamples[iLayer]=0.;
147 fdxSamples[iLayer]=0.;
148 fPAtSample[iLayer]=0.;
152 //______________________________________________________________________
153 Double_t AliITSdEdxSamples::GetTruncatedMean(Double_t frac, Double_t mindedx) const {
154 // compute truncated mean
157 Double_t dedx[kMaxSamples];
158 for (Int_t il=0; il<fNSamples; il++) { // count good (>0) dE/dx values
159 Double_t dedxsamp=GetdEdxSample(il);
160 if(HasPointOnLayer(il) && UseLayerForPid(il) && dedxsamp>mindedx){
167 Int_t swap; // sort in ascending order
170 for (Int_t i=0; i<nc-1; i++) {
171 if (dedx[i]<=dedx[i+1]) continue;
172 Double_t tmp=dedx[i];
179 Double_t sumamp=0,sumweight=0;
180 Double_t weight[kMaxSamples];
181 for(Int_t iw=0; iw<kMaxSamples; iw++) weight[iw]=0.;
182 Int_t lastUsed=(Int_t)(frac*nc+0.00001);
183 if(lastUsed==0) lastUsed=1;
184 if(lastUsed>kMaxSamples) lastUsed=kMaxSamples;
185 for(Int_t iw=0; iw<lastUsed; iw++) weight[iw]=1.;
186 if((frac*nc-lastUsed)>0.4 && lastUsed<kMaxSamples) weight[lastUsed]=0.5;
187 for (Int_t i=0; i<nc; i++) {
188 // AliDebug(5,Form("dE/dx %f weight %f",dedx[i],weight[i]));
189 sumamp+= dedx[i]*weight[i];
190 sumweight+=weight[i];
192 if(sumweight>0.) return sumamp/sumweight;
196 //______________________________________________________________________
197 Double_t AliITSdEdxSamples::GetWeightedMean(Double_t mindedx) const {
198 // compute generalized mean with k=-2 (used by CMS)
200 Double_t dedx[kMaxSamples];
201 for (Int_t il=0; il<fNSamples; il++) { // count good (>0) dE/dx values
202 Double_t dedxsamp=GetdEdxSample(il);
203 if(HasPointOnLayer(il) && UseLayerForPid(il) && dedxsamp>mindedx){
210 Double_t weiSum = 0.;
211 for (Int_t i=0; i<nc; i++) {
212 weiSum+=TMath::Power(dedx[i],-2);
215 if(weiSum>0.) wMean= TMath::Power(weiSum/nc,-0.5);
219 //______________________________________________________________________
220 void AliITSdEdxSamples::GetConditionalProbabilities(AliITSPidParams* pars, Double_t condprob[AliPID::kSPECIES], Double_t mindedx) const {
221 // compute conditional probablilities
222 const Int_t nPart = 3;
223 Double_t itsProb[nPart] = {1,1,1}; // p, K, pi
225 for(Int_t iS=0; iS<fNSamples; iS++){
226 if(!HasPointOnLayer(iS)) continue;
227 if(!UseLayerForPid(iS)) continue;
228 Int_t iLayer=iS+3; // to match with present ITS
229 if(iLayer>6) iLayer=6; // all extra points are treated as SSD
230 Float_t dedx = GetdEdxSample(iS);
231 if(dedx<mindedx) continue;
232 Float_t layProb = pars->GetLandauGausNorm(dedx,AliPID::kProton,fP,iLayer);
233 itsProb[0] *= layProb;
235 layProb = pars->GetLandauGausNorm(dedx,AliPID::kKaon,fP,iLayer);
236 if (fP < 0.16) layProb=0.00001;
237 itsProb[1] *= layProb;
239 layProb = pars->GetLandauGausNorm(dedx,AliPID::kPion,fP,iLayer);
240 itsProb[2] *= layProb;
243 // Normalise probabilities
244 Double_t sumProb = 0;
245 for (Int_t iPart = 0; iPart < nPart; iPart++) {
246 sumProb += itsProb[iPart];
248 sumProb += 2*itsProb[2]; // muon and electron cannot be distinguished from pions
250 for (Int_t iPart = 0; iPart < nPart; iPart++) {
251 itsProb[iPart]/=sumProb;
254 condprob[AliPID::kElectron] = itsProb[2];
255 condprob[AliPID::kMuon] = itsProb[2];
256 condprob[AliPID::kPion] = itsProb[2];
257 condprob[AliPID::kKaon] = itsProb[1];
258 condprob[AliPID::kProton] = itsProb[0];
262 //______________________________________________________________________
263 void AliITSdEdxSamples::PrintAll() const{
264 // print all the infos
265 printf("Particle %d momentum %f GeV/c, number of points %d\n",
266 GetParticleSpecieMC(),
268 GetNumberOfEffectiveSamples());
269 for(Int_t iLay=0; iLay<fNSamples; iLay++){
270 printf(" Layer %d Point %d dE %f keV dx %f cm mom %f GeV/c\n",iLay,
271 HasPointOnLayer(iLay),
274 GetMomentumAtSample(iLay));
277 printf("Layers used for PID:\n");
279 for(Int_t iLay=0; iLay<fNSamples; iLay++){
285 for(Int_t iLay=0; iLay<fNSamples; iLay++){
286 printf("%d ",UseLayerForPid(iLay));
289 printf("Truncated mean = %f\n",GetTruncatedMean());
291 //______________________________________________________________________
292 void AliITSdEdxSamples::PrintClusterMap() const{
293 // print the cluster map
296 for(Int_t iLay=0; iLay<fNSamples; iLay++){
302 for(Int_t iLay=0; iLay<fNSamples; iLay++){
303 printf("%d ",HasPointOnLayer(iLay));