1 /*************************************************************************
2 * Copyright(c) 1998-2009, 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 **************************************************************************/
16 ///////////////////////////////////////////////////////////////////////////
26 ///////////////////////////////////////////////////////////////////////////
34 #include <AliVTrack.h>
35 #include <AliVCluster.h>
37 #include <AliExternalTrackParam.h>
38 #include <AliPIDResponse.h>
39 #include <AliTRDPIDResponse.h>
40 #include <AliESDtrack.h> //!!!!! Remove once Eta correction is treated in the tender
41 #include <AliAODTrack.h>
42 #include <AliAODPid.h>
44 #include "AliDielectronVarManager.h"
45 #include "AliDielectronVarCuts.h"
47 #include "AliDielectronPID.h"
49 ClassImp(AliDielectronPID)
51 TGraph *AliDielectronPID::fgFitCorr=0x0;
52 Double_t AliDielectronPID::fgCorr=0.0;
53 Double_t AliDielectronPID::fgCorrdEdx=1.0;
54 TF1 *AliDielectronPID::fgFunEtaCorr=0x0;
55 TF1 *AliDielectronPID::fgFunCntrdCorr=0x0;
56 TF1 *AliDielectronPID::fgFunWdthCorr=0x0;
57 TGraph *AliDielectronPID::fgdEdxRunCorr=0x0;
59 AliDielectronPID::AliDielectronPID() :
63 fElectronCentroidCentEta(0x0),
64 fElectronWidthCentEta(0x0)
67 // Default Constructor
69 for (Int_t icut=0; icut<kNmaxPID; ++icut){
71 fPartType[icut]=AliPID::kPion;
76 fExclude[icut]=kFALSE;
77 fFunUpperCut[icut]=0x0;
78 fFunLowerCut[icut]=0x0;
79 fRequirePIDbit[icut]=0;
85 fHistElectronCutLow[icut]=0x0;
86 fHistElectronCutUp[icut]=0x0;
90 //______________________________________________
91 AliDielectronPID::AliDielectronPID(const char* name, const char* title) :
92 AliAnalysisCuts(name, title),
95 fElectronCentroidCentEta(0x0),
96 fElectronWidthCentEta(0x0)
101 for (Int_t icut=0; icut<kNmaxPID; ++icut){
103 fPartType[icut]=AliPID::kPion;
108 fExclude[icut]=kFALSE;
109 fFunUpperCut[icut]=0x0;
110 fFunLowerCut[icut]=0x0;
111 fRequirePIDbit[icut]=0;
113 fSigmaFunLow[icut]=0;
117 fHistElectronCutLow[icut]=0x0;
118 fHistElectronCutUp[icut]=0x0;
122 //______________________________________________
123 AliDielectronPID::~AliDielectronPID()
126 // Default Destructor
130 //______________________________________________
131 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp/*=-99999.*/,
132 Double_t min/*=0*/, Double_t max/*=0*/, Bool_t exclude/*=kFALSE*/,
133 UInt_t pidBitType/*=AliDielectronPID::kRequire*/, Int_t var/*=-1*/)
136 // Add a pid nsigma cut
137 // use response of detector 'det' in the range ['min'] to ['max'] for var
138 // use a sigma band between 'nSigmaLow' and 'nSigmaUp'
139 // if nSigmaUp==-99999. then nSigmaLow will be uesd as a symmetric band +- nSigmaLow
140 // specify whether to 'exclude' the given band
143 if (fNcuts>=kNmaxPID){
144 AliError(Form("only %d pid cut ranges allowed",kNmaxPID));
147 if (TMath::Abs(nSigmaUp+99999.)<1e-20){
148 nSigmaUp=TMath::Abs(nSigmaLow);
149 nSigmaLow=-1.*nSigmaUp;
151 fDetType[fNcuts]=det;
152 fPartType[fNcuts]=type;
153 fNsigmaLow[fNcuts]=nSigmaLow;
154 fNsigmaUp[fNcuts]=nSigmaUp;
157 fExclude[fNcuts]=exclude;
158 fRequirePIDbit[fNcuts]=pidBitType;
159 fActiveCuts[fNcuts]=(var==-1 ? AliDielectronVarManager::kP : var);
161 AliDebug(1,Form("Add PID cut %d: sigma [% .1f,% .1f] \t cut [% .1f,% .f] \t var %d->%s \n",
162 fNcuts,nSigmaLow,nSigmaUp,min,max,fActiveCuts[fNcuts],AliDielectronVarManager::GetValueName(fActiveCuts[fNcuts])));
168 //______________________________________________
169 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, TF1 * const funUp,
170 Double_t min/*=0*/, Double_t max/*=0*/, Bool_t exclude/*=kFALSE*/,
171 UInt_t pidBitType/*=AliDielectronPID::kRequire*/, Int_t var/*=-1*/)
174 // cut using a TF1 as upper cut
177 AliError("A valid function is required for the upper cut. Not adding the cut!");
180 fFunUpperCut[fNcuts]=funUp;
181 AddCut(det,type,nSigmaLow,0.,min,max,exclude,pidBitType,var);
184 //______________________________________________
185 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, TF1 * const funLow, Double_t nSigmaUp,
186 Double_t min/*=0*/, Double_t max/*=0*/, Bool_t exclude/*=kFALSE*/,
187 UInt_t pidBitType/*=AliDielectronPID::kRequire*/, Int_t var/*=-1*/)
190 // cut using a TF1 as lower cut
193 AliError("A valid function is required for the lower cut. Not adding the cut!");
196 fFunLowerCut[fNcuts]=funLow;
197 AddCut(det,type,0.,nSigmaUp,min,max,exclude,pidBitType,var);
200 //______________________________________________
201 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, TF1 * const funLow, TF1 * const funUp,
202 Double_t min/*=0*/, Double_t max/*=0*/, Bool_t exclude/*=kFALSE*/,
203 UInt_t pidBitType/*=AliDielectronPID::kRequire*/, Int_t var/*=-1*/)
206 // cut using a TF1 as lower and upper cut
208 if ( (funUp==0x0) || (funLow==0x0) ){
209 AliError("A valid function is required for upper and lower cut. Not adding the cut!");
212 fFunUpperCut[fNcuts]=funUp;
213 fFunLowerCut[fNcuts]=funLow;
214 AddCut(det,type,0.,0.,min,max,exclude,pidBitType,var);
217 //______________________________________________
218 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp,
219 Double_t min, Double_t max, Bool_t exclude,
220 UInt_t pidBitType, TF1 * const funSigma)
223 // cut using a TF1 as lower cut
226 AliError("A valid function is required for the sigma cut. Not adding the cut!");
229 fFunSigma[fNcuts]=funSigma;
230 fSigmaFunLow[fNcuts]=min;
231 fSigmaFunUp[fNcuts]=max;
233 AddCut(det,type,nSigmaLow,nSigmaUp,0,0,exclude,pidBitType,-1);
236 //______________________________________________
237 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, TH3D * const histLow, Double_t nSigmaUp,
238 Double_t min/*=0*/, Double_t max/*=0*/, Bool_t exclude/*=kFALSE*/,
239 UInt_t pidBitType/*=AliDielectronPID::kRequire*/, Int_t var/*=-1*/)
242 // cut using a TH3D(Pin,centrality,eta) as a lower cut
245 AliError("A valid histogram is required for the lower cut. Not adding the cut!");
248 fHistElectronCutLow[fNcuts]=histLow;
249 AddCut(det,type,0.,nSigmaUp,min,max,exclude,pidBitType,var);
252 //______________________________________________
253 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, TH3D * const histLow, TH3D * const histUp,
254 Double_t min/*=0*/, Double_t max/*=0*/, Bool_t exclude/*=kFALSE*/,
255 UInt_t pidBitType/*=AliDielectronPID::kRequire*/, Int_t var/*=-1*/)
258 // cut using a TH3D(Pin,centrality,eta) as lower and upper cut
260 if ( (histUp==0x0) || (histLow==0x0) ){
261 AliError("A valid histogram is required for upper and lower cut. Not adding the cut!");
264 fHistElectronCutUp[fNcuts]=histUp;
265 fHistElectronCutLow[fNcuts]=histLow;
266 AddCut(det,type,0.,0.,min,max,exclude,pidBitType,var);
269 //______________________________________________
270 void AliDielectronPID::AddCut(DetType det, AliPID::EParticleType type, Double_t nSigmaLow, Double_t nSigmaUp,
271 AliDielectronVarCuts *var, Bool_t exclude/*=kFALSE*/,
272 UInt_t pidBitType/*=AliDielectronPID::kRequire*/)
275 // Add a pid nsigma cut
276 // use response of detector 'det' in the ranges for variables defined in var
277 // use a sigma band between 'nSigmaLow' and 'nSigmaUp'
278 // if nSigmaUp==-99999. then nSigmaLow will be uesd as a symmetric band +- nSigmaLow
279 // specify whether to 'exclude' the given band
282 if (fNcuts>=kNmaxPID){
283 AliError(Form("only %d pid cut ranges allowed",kNmaxPID));
286 if (TMath::Abs(nSigmaUp+99999.)<1e-20){
287 nSigmaUp=TMath::Abs(nSigmaLow);
288 nSigmaLow=-1.*nSigmaUp;
290 fDetType[fNcuts]=det;
291 fPartType[fNcuts]=type;
292 fNsigmaLow[fNcuts]=nSigmaLow;
293 fNsigmaUp[fNcuts]=nSigmaUp;
294 fExclude[fNcuts]=exclude;
295 fRequirePIDbit[fNcuts]=pidBitType;
296 fVarCuts[fNcuts]=var;
298 AliDebug(1,Form("Add PID cut %d: sigma [% .1f,% .1f] \n",
299 fNcuts,nSigmaLow,nSigmaUp));
305 //______________________________________________
306 Bool_t AliDielectronPID::IsSelected(TObject* track)
313 AliVTrack *part=static_cast<AliVTrack*>(track);
314 AliESDtrack *esdTrack=0x0;
315 AliAODTrack *aodTrack=0x0;
316 Double_t origdEdx=-1;
318 // apply ETa correction, remove once this is in the tender
319 if( (part->IsA() == AliESDtrack::Class()) ){
320 esdTrack=static_cast<AliESDtrack*>(part);
321 origdEdx=esdTrack->GetTPCsignal();
322 esdTrack->SetTPCsignal(origdEdx/GetEtaCorr(esdTrack)/fgCorrdEdx,esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN());
323 } else if ( (part->IsA() == AliAODTrack::Class()) ){
324 aodTrack=static_cast<AliAODTrack*>(track);
325 AliAODPid *pid=const_cast<AliAODPid*>(aodTrack->GetDetPid());
327 origdEdx=pid->GetTPCsignal();
328 pid->SetTPCsignal(origdEdx/GetEtaCorr(aodTrack)/fgCorrdEdx);
333 Double_t values[AliDielectronVarManager::kNMaxValues];
334 AliDielectronVarManager::Fill(track,values);
336 Bool_t selected=kFALSE;
337 fPIDResponse=AliDielectronVarManager::GetPIDResponse();
338 for (UChar_t icut=0; icut<fNcuts; ++icut){
339 Double_t min=fmin[icut];
340 Double_t max=fmax[icut];
341 Double_t val=values[fActiveCuts[icut]];
343 // test var range. In case min==max do not cut
344 if ( fVarCuts[icut] ) {
345 if ( !fVarCuts[icut]->IsSelected(part) ) continue;
347 else if ( ( (TMath::Abs(min-max)>1e-20) && (val<min || val>=max) ) ) {
351 // check if fFunSigma is set, then check if 'part' is in sigma range of the function
353 val= fPIDResponse->NumberOfSigmasTPC(part, fPartType[icut]);
354 if (fPartType[icut]==AliPID::kElectron){
357 min= fFunSigma[icut]->Eval(part->GetTPCmomentum())+fSigmaFunLow[icut];
358 max= fFunSigma[icut]->Eval(part->GetTPCmomentum())+fSigmaFunUp[icut];
359 if(val<min || val>=max) continue;
362 switch (fDetType[icut]){
364 selected = IsSelectedITS(part,icut);
367 selected = IsSelectedTPC(part,icut);
370 selected = IsSelectedTRD(part,icut);
373 selected = IsSelectedTRDeleEff(part,icut);
376 selected = IsSelectedTRDeleEff(part,icut,AliTRDPIDResponse::kLQ2D);
379 selected = IsSelectedTOF(part,icut);
382 selected = IsSelectedEMCAL(part,icut);
386 if (esdTrack) esdTrack->SetTPCsignal(origdEdx,esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN());
388 AliAODPid *pid=const_cast<AliAODPid*>(aodTrack->GetDetPid());
389 if (pid) pid->SetTPCsignal(origdEdx);
396 if (esdTrack) esdTrack->SetTPCsignal(origdEdx,esdTrack->GetTPCsignalSigma(),esdTrack->GetTPCsignalN());
398 AliAODPid *pid=const_cast<AliAODPid*>(aodTrack->GetDetPid());
399 if (pid) pid->SetTPCsignal(origdEdx);
404 //______________________________________________
405 Bool_t AliDielectronPID::IsSelectedITS(AliVTrack * const part, Int_t icut)
408 // ITS part of the PID check
409 // Don't accept the track if there was no pid bit set
411 AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kITS,part);
412 if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
413 if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
415 Double_t mom=part->P();
417 Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasITS(part, fPartType[icut]);
419 // test if we are supposed to use a function for the cut
420 if (fFunUpperCut[icut]) fNsigmaUp[icut] =fFunUpperCut[icut]->Eval(mom);
421 if (fFunLowerCut[icut]) fNsigmaLow[icut]=fFunLowerCut[icut]->Eval(mom);
423 Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
427 //______________________________________________
428 Bool_t AliDielectronPID::IsSelectedTPC(AliVTrack * const part, Int_t icut)
431 // TPC part of the PID check
432 // Don't accept the track if there was no pid bit set
434 AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kTPC,part);
435 if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
436 if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
438 Double_t mom=part->GetTPCmomentum();
439 Double_t centroid=0.0;
442 Double_t centrality = 0.0;
444 Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasTPC(part, fPartType[icut]);
446 if (fPartType[icut]==AliPID::kElectron){
447 numberOfSigmas-=fgCorr;
448 numberOfSigmas-=GetCntrdCorr(part);
449 numberOfSigmas/=GetWdthCorr(part);
451 // recalculate the number of sigmas from the electron assuption using the electron centroid and width maps
452 if(fElectronCentroidCentEta || fElectronWidthCentEta) {
454 centrality = AliDielectronVarManager::GetCurrentEvent()->GetCentrality()->GetCentralityPercentile("V0M");
455 if(fElectronCentroidCentEta) {
456 Int_t centBin = fElectronCentroidCentEta->GetXaxis()->FindBin(centrality);
457 Int_t etaBin = fElectronCentroidCentEta->GetYaxis()->FindBin(eta);
458 if(centBin>=1 && centBin<=fElectronCentroidCentEta->GetXaxis()->GetNbins() &&
459 etaBin>=1 && etaBin<=fElectronCentroidCentEta->GetYaxis()->GetNbins())
460 centroid = fElectronCentroidCentEta->GetBinContent(fElectronCentroidCentEta->GetXaxis()->FindBin(centrality),
461 fElectronCentroidCentEta->GetYaxis()->FindBin(eta));
463 if(fElectronWidthCentEta) {
464 Int_t centBin =fElectronWidthCentEta->GetXaxis()->FindBin(centrality);
465 Int_t etaBin = fElectronWidthCentEta->GetYaxis()->FindBin(eta);
466 if(centBin>=1 && centBin<=fElectronWidthCentEta->GetXaxis()->GetNbins() &&
467 etaBin>=1 && etaBin<=fElectronWidthCentEta->GetYaxis()->GetNbins())
468 width = fElectronWidthCentEta->GetBinContent(fElectronWidthCentEta->GetXaxis()->FindBin(centrality),
469 fElectronWidthCentEta->GetYaxis()->FindBin(eta));
472 if(width<0.01) width = 1.0;
473 numberOfSigmas = (numberOfSigmas-centroid)/width;
476 // test if we are supposed to use a function for the cut
477 if (fFunUpperCut[icut]) fNsigmaUp[icut] =fFunUpperCut[icut]->Eval(mom);
478 if (fFunLowerCut[icut]) fNsigmaLow[icut]=fFunLowerCut[icut]->Eval(mom);
480 // if electron selection 3D maps are loaded, then find the corresponding cuts based on momentum, eta and centrality
481 Double_t lowElectronCut = fNsigmaLow[icut];
482 Double_t upElectronCut = fNsigmaUp[icut];
483 if((fPartType[icut]==AliPID::kElectron) && (fHistElectronCutLow[icut] || fHistElectronCutUp[icut])) {
485 centrality = AliDielectronVarManager::GetCurrentEvent()->GetCentrality()->GetCentralityPercentile("V0M");
487 if((fPartType[icut]==AliPID::kElectron) && fHistElectronCutLow[icut]) {
488 Int_t pbin = fHistElectronCutLow[icut]->GetZaxis()->FindBin(mom);
489 Int_t centBin = fHistElectronCutLow[icut]->GetXaxis()->FindBin(centrality);
490 Int_t etaBin = fHistElectronCutLow[icut]->GetYaxis()->FindBin(eta);
491 // apply this cut only in the range covered in the histogram range
492 if(pbin!=0 && pbin!=(fHistElectronCutLow[icut]->GetZaxis()->GetNbins()+1) &&
493 centBin!=0 && centBin!=(fHistElectronCutLow[icut]->GetXaxis()->GetNbins()+1) &&
494 etaBin!=0 && etaBin!=(fHistElectronCutLow[icut]->GetYaxis()->GetNbins()+1))
495 lowElectronCut = fHistElectronCutLow[icut]->GetBinContent(centBin, etaBin, pbin);
497 if((fPartType[icut]==AliPID::kElectron) && fHistElectronCutUp[icut]) {
498 Int_t pbin = fHistElectronCutUp[icut]->GetZaxis()->FindBin(mom);
499 Int_t centBin = fHistElectronCutUp[icut]->GetXaxis()->FindBin(centrality);
500 Int_t etaBin = fHistElectronCutUp[icut]->GetYaxis()->FindBin(eta);
501 // apply this cut only in the p range existing in the histogram range
502 if(pbin!=0 && pbin!=(fHistElectronCutUp[icut]->GetZaxis()->GetNbins()+1) &&
503 centBin!=0 && centBin!=(fHistElectronCutUp[icut]->GetXaxis()->GetNbins()+1) &&
504 etaBin!=0 && etaBin!=(fHistElectronCutUp[icut]->GetYaxis()->GetNbins()+1))
505 upElectronCut = fHistElectronCutUp[icut]->GetBinContent(centBin, etaBin, pbin);
507 Bool_t selected=((numberOfSigmas>=lowElectronCut)&&(numberOfSigmas<=upElectronCut))^fExclude[icut];
511 //______________________________________________
512 Bool_t AliDielectronPID::IsSelectedTRD(AliVTrack * const part, Int_t icut)
515 // TRD part of the pid check
516 // the TRD checks on the probabilities.
519 AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kTRD,part);
520 if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
521 if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
523 if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable && (part->GetTRDntrackletsPID()<4)) return kTRUE;
525 Double_t p[AliPID::kSPECIES]={0.};
526 fPIDResponse->ComputeTRDProbability(part,AliPID::kSPECIES,p);
527 Float_t particleProb=p[fPartType[icut]];
529 Bool_t selected=((particleProb>=fNsigmaLow[icut])&&(particleProb<=fNsigmaUp[icut]))^fExclude[icut];
533 //______________________________________________
534 Bool_t AliDielectronPID::IsSelectedTRDeleEff(AliVTrack * const part, Int_t icut, AliTRDPIDResponse::ETRDPIDMethod PIDmethod)
537 // TRD part of the pid check using electron efficiency requirement
538 // in this case the upper limit as well as the particle specie is ignored
539 // and the lower limit regarded as the requested electron efficiency
542 AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kTRD,part);
543 if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
544 if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
546 Double_t centrality = -1.;
547 if(part->IsA() == AliESDtrack::Class())
548 centrality=(const_cast<AliESDEvent*>( (static_cast<const AliESDtrack*>(part))->GetESDEvent()) )->GetCentrality()->GetCentralityPercentile("V0M");
549 if(part->IsA() == AliAODTrack::Class())
550 centrality=(const_cast<AliAODEvent*>( (static_cast<const AliAODTrack*>(part))->GetAODEvent()) )->GetCentrality()->GetCentralityPercentile("V0M");
552 Bool_t selected=fPIDResponse->IdentifiedAsElectronTRD(part,fNsigmaLow[icut], centrality, PIDmethod)^fExclude[icut];
556 //______________________________________________
557 Bool_t AliDielectronPID::IsSelectedTOF(AliVTrack * const part, Int_t icut)
560 // TOF part of the PID check
561 // Don't accept the track if there was no pid bit set
563 AliPIDResponse::EDetPidStatus pidStatus = fPIDResponse->CheckPIDStatus(AliPIDResponse::kTOF,part);
564 if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kFALSE;
565 if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&(pidStatus!=AliPIDResponse::kDetPidOk)) return kTRUE;
567 Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasTOF(part, fPartType[icut]);
569 Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
573 //______________________________________________
574 Bool_t AliDielectronPID::IsSelectedEMCAL(AliVTrack * const part, Int_t icut)
577 // emcal pid selecttion
580 //TODO: correct way to check for emcal pid?
581 Float_t numberOfSigmas=fPIDResponse->NumberOfSigmasEMCAL(part, fPartType[icut]);
583 Bool_t hasPID=numberOfSigmas>-998.;
585 if (fRequirePIDbit[icut]==AliDielectronPID::kRequire&&!hasPID) return kFALSE;
586 if (fRequirePIDbit[icut]==AliDielectronPID::kIfAvailable&&!hasPID) return kTRUE;
589 Bool_t selected=((numberOfSigmas>=fNsigmaLow[icut])&&(numberOfSigmas<=fNsigmaUp[icut]))^fExclude[icut];
593 //______________________________________________
594 void AliDielectronPID::SetDefaults(Int_t def){
596 // initialise default pid strategies
602 // - exclude mu,K,pi,p
604 AddCut(kTPC,AliPID::kElectron,2);
605 AddCut(kTPC,AliPID::kMuon,-2.,2.,0.,0.,kTRUE);
606 AddCut(kTPC,AliPID::kPion,-2.,2.,0.,0.,kTRUE);
607 AddCut(kTPC,AliPID::kKaon,-2.,2.,0.,0.,kTRUE);
608 AddCut(kTPC,AliPID::kProton,-2.,2.,0.,0.,kTRUE);
611 // - include e 0<p<inf
612 // - exclude mu,K,pi,p 0<p<2
613 AddCut(kTPC,AliPID::kElectron,2.);
614 AddCut(kTPC,AliPID::kMuon,-2.,2.,0.,2.,kTRUE);
615 AddCut(kTPC,AliPID::kPion,-2.,2.,0.,2.,kTRUE);
616 AddCut(kTPC,AliPID::kKaon,-2.,2.,0.,2.,kTRUE);
617 AddCut(kTPC,AliPID::kProton,-2.,2.,0.,2.,kTRUE);
620 // include 2sigma e TPC
623 AddCut(kTPC,AliPID::kElectron,-3.,3.);
624 AddCut(kTPC,AliPID::kPion,-3.,3.,0.,0.,kTRUE);
625 AddCut(kTPC,AliPID::kProton,-3.,3.,0.,0.,kTRUE);
627 } else if (def==3 || def==4) { // def3 and def4 are the same??
628 // include 2sigma e TPC
632 AddCut(kTPC,AliPID::kElectron,2);
633 AddCut(kTOF,AliPID::kKaon,-3.,3.,0.,1.,kTRUE);
634 AddCut(kTOF,AliPID::kProton,-6.,6.,0.,1.,kTRUE);
635 AddCut(kTOF,AliPID::kProton,-3.,3.,1.,2.,kTRUE);
638 AddCut(kTPC,AliPID::kElectron,-0.5,3);
639 AddCut(kTOF,AliPID::kElectron,-3,3,0,1.5);
641 // lower cut TPC: parametrisation by HFE
642 // upper cut TPC: 3 sigma
643 // TOF ele band 3sigma 0<p<1.5GeV
644 TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)", 0, 100);
645 lowerCut->SetParameters(-2.7,-0.4357);
646 AddCut(kTPC,AliPID::kElectron,lowerCut,3.);
647 AddCut(kTOF,AliPID::kElectron,-3,3,0,1.5);
650 // TOF ele band 3sigma 0<p<1.5GeV
651 AddCut(kTPC,AliPID::kElectron,10.);
652 AddCut(kTOF,AliPID::kElectron,-3,3,0,1.5);
654 // TOF 5 sigma inclusion if TOFpid available
655 // this should reduce K,p,Pi to a large extent
656 AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
658 // lower cut TPC: parametrisation by HFE
659 // upper cut TPC: 3 sigma
660 // TOF 5 sigma inclusion if TOFpid available
661 // this should reduce K,p,Pi to a large extent
662 TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)", 0, 100);
663 lowerCut->SetParameters(-2.65,-0.6757);
664 AddCut(kTPC,AliPID::kElectron,lowerCut,4.);
665 AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
667 } else if (def==10) {
668 AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
669 AddCut(kTPC,AliPID::kElectron,3.);
670 AddCut(kTPC,AliPID::kPion,-3.,3.,0.,0.,kTRUE);
671 AddCut(kTPC,AliPID::kProton,-3.,3.,0.,0.,kTRUE);
673 } else if (def==11) {
674 // lower cut TPC: parametrisation by HFE
675 // only use from period d on !!
676 // upper cut TPC: 3 sigma
677 // TOF ele band 3sigma 0<p<2.0GeV
678 TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)+[2]", 0, 100);
679 lowerCut->SetParameters(-3.718,-0.4,0.27);
680 AddCut(kTPC,AliPID::kElectron,lowerCut,3.);
681 AddCut(kTOF,AliPID::kElectron,-3,3,0,2.);
682 } else if (def==12) {
683 // lower cut TPC: parametrisation by HFE
684 // only use from period d on !!
685 // upper cut TPC: 3 sigma
686 // TOF 5 sigma inclusion if TOFpid available
687 // this should reduce K,p,Pi to a large extent
688 TF1 *lowerCut=new TF1("lowerCut", "[0] * TMath::Exp([1]*x)+[2]", 0, 100);
689 lowerCut->SetParameters(-3.718,-0.4,0.27);
690 AddCut(kTPC,AliPID::kElectron,lowerCut,4.);
691 AddCut(kTOF,AliPID::kElectron,-5,5,0,200,kFALSE,AliDielectronPID::kIfAvailable);
694 // TPC electron inclusion
695 // TOF electron inclusion if available
696 AddCut(kTOF,AliPID::kElectron,-4.,4.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
697 AddCut(kTPC,AliPID::kElectron,-3.5,3.5);
700 // TRD 1D 90% elec eff, 4-6 tracklets
701 // TPC electron inclusion
702 // TOF electron inclusion if available
703 AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,3.5,6.,kFALSE,
704 AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDpidQuality);
705 AddCut(kTOF,AliPID::kElectron,-4.,4.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
706 AddCut(kTPC,AliPID::kElectron,-3.5,3.5);
709 // TRD 1D 90% elec eff, 4-6 tracklets, chi2 < 2
710 // TPC electron inclusion
711 // TOF electron inclusion if available
712 AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,3.5,6.,kFALSE,
713 AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDpidQuality);
714 AddCut(AliDielectronPID::kTRDeleEff,AliPID::kElectron,.9,1.,0.,2.,kFALSE,
715 AliDielectronPID::kIfAvailable,AliDielectronVarManager::kTRDchi2);
716 AddCut(kTOF,AliPID::kElectron,-4.,4.,0,200,kFALSE,AliDielectronPID::kIfAvailable);
717 AddCut(kTPC,AliPID::kElectron,-3.5,3.5);
722 //______________________________________________
723 void AliDielectronPID::SetCorrVal(Double_t run)
726 // set correction value for run
732 fgCorr=fgFitCorr->Eval(run);
733 if (run<fgFitCorr->GetX()[0]) fgCorr=fgFitCorr->GetY()[0];
734 if (run>fgFitCorr->GetX()[fgFitCorr->GetN()-1]) fgCorr=fgFitCorr->GetY()[fgFitCorr->GetN()-1];
738 fgCorrdEdx=fgdEdxRunCorr->Eval(run);
739 if (run<fgdEdxRunCorr->GetX()[0]) fgCorrdEdx=fgdEdxRunCorr->GetY()[0];
740 if (run>fgdEdxRunCorr->GetX()[fgFitCorr->GetN()-1]) fgCorrdEdx=fgdEdxRunCorr->GetY()[fgdEdxRunCorr->GetN()-1];
744 //______________________________________________
745 Double_t AliDielectronPID::GetEtaCorr(const AliVTrack *track)
748 // return eta correction
750 if (!fgFunEtaCorr) return 1;
751 return fgFunEtaCorr->Eval(track->Eta());
754 //______________________________________________
755 void AliDielectronPID::SetCentroidCorrFunction(TF1 *fun, UInt_t varx, UInt_t vary, UInt_t varz)
757 fun->GetHistogram()->GetXaxis()->SetUniqueID(varx);
758 fun->GetHistogram()->GetYaxis()->SetUniqueID(vary);
759 fun->GetHistogram()->GetZaxis()->SetUniqueID(varz);
762 //______________________________________________
763 void AliDielectronPID::SetWidthCorrFunction(TF1 *fun, UInt_t varx, UInt_t vary, UInt_t varz)
765 fun->GetHistogram()->GetXaxis()->SetUniqueID(varx);
766 fun->GetHistogram()->GetYaxis()->SetUniqueID(vary);
767 fun->GetHistogram()->GetZaxis()->SetUniqueID(varz);
771 //______________________________________________
772 Double_t AliDielectronPID::GetPIDCorr(const AliVTrack *track, TF1 *fun)
775 // return correction value
778 //Fill only event and vparticle values (otherwise we end up in a circle)
779 Double_t values[AliDielectronVarManager::kNMaxValues];
780 AliDielectronVarManager::FillVarVParticle(track,values);
782 Int_t dim=fun->GetNdim();
783 Double_t var[3] = {0.,0.,0.};
784 if(dim>0) var[0] = values[fun->GetHistogram()->GetXaxis()->GetUniqueID()];
785 if(dim>1) var[1] = values[fun->GetHistogram()->GetYaxis()->GetUniqueID()];
786 if(dim>2) var[2] = values[fun->GetHistogram()->GetZaxis()->GetUniqueID()];
787 Double_t corr = fun->Eval(var[0],var[1],var[2]);
788 // printf(" %d-dim CORR value: %f (track %p) \n",dim,corr,track);