]> git.uio.no Git - u/mrichter/AliRoot.git/blame - PWG3/hfe/AliHFEextraCuts.cxx
Corrections for Coverity warnings
[u/mrichter/AliRoot.git] / PWG3 / hfe / AliHFEextraCuts.cxx
CommitLineData
809a4336 1/**************************************************************************
2* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3* *
4* Author: The ALICE Off-line Project. *
5* Contributors are mentioned in the code where appropriate. *
6* *
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**************************************************************************/
50685501 15//
16// Extra cuts implemented by the ALICE Heavy Flavour Electron Group
17// Cuts stored here:
18// - ITS pixels
19// - TPC cluster ratio
20// - TRD tracklets
21//
22// Authors:
23// Markus Fasel <M.Fasel@gsi.de>
24//
3a72645a 25#include <TBits.h>
809a4336 26#include <TClass.h>
27#include <TH1F.h>
28#include <TH2F.h>
29#include <TList.h>
30#include <TString.h>
75d81601 31#include <TMath.h>
809a4336 32
3a72645a 33#include "AliAODTrack.h"
34#include "AliAODPid.h"
35#include "AliESDEvent.h"
36#include "AliESDVertex.h"
809a4336 37#include "AliESDtrack.h"
70da6c5a 38#include "AliLog.h"
809a4336 39#include "AliMCParticle.h"
3a72645a 40#include "AliVEvent.h"
41#include "AliVTrack.h"
42#include "AliVParticle.h"
43#include "AliVertexerTracks.h"
44#include "AliVVertex.h"
809a4336 45
46#include "AliHFEextraCuts.h"
47
48ClassImp(AliHFEextraCuts)
49
50//______________________________________________________
51AliHFEextraCuts::AliHFEextraCuts(const Char_t *name, const Char_t *title):
52 AliCFCutBase(name, title),
3a72645a 53 fEvent(NULL),
809a4336 54 fCutCorrelation(0),
55 fRequirements(0),
3a72645a 56 fMinNClustersTPC(0),
809a4336 57 fClusterRatioTPC(0.),
58 fMinTrackletsTRD(0),
59 fPixelITS(0),
e3ae862b 60 fTOFpid(kFALSE),
61 fTPCclusterDef(0),
62 fTPCclusterRatioDef(0),
70da6c5a 63 fCheck(kFALSE),
64 fQAlist(0x0) ,
dbe3abbe 65 fDebugLevel(0)
809a4336 66{
67 //
68 // Default Constructor
69 //
70 memset(fImpactParamCut, 0, sizeof(Float_t) * 4);
71}
72
73//______________________________________________________
74AliHFEextraCuts::AliHFEextraCuts(const AliHFEextraCuts &c):
75 AliCFCutBase(c),
3a72645a 76 fEvent(c.fEvent),
809a4336 77 fCutCorrelation(c.fCutCorrelation),
78 fRequirements(c.fRequirements),
3a72645a 79 fMinNClustersTPC(c.fMinNClustersTPC),
809a4336 80 fClusterRatioTPC(c.fClusterRatioTPC),
81 fMinTrackletsTRD(c.fMinTrackletsTRD),
82 fPixelITS(c.fPixelITS),
e3ae862b 83 fTOFpid(c.fTOFpid),
84 fTPCclusterDef(c.fTPCclusterDef),
85 fTPCclusterRatioDef(c.fTPCclusterRatioDef),
75d81601 86 fCheck(c.fCheck),
dbe3abbe 87 fQAlist(0x0),
70da6c5a 88 fDebugLevel(0)
809a4336 89{
90 //
91 // Copy constructor
92 // Performs a deep copy
93 //
94 memcpy(fImpactParamCut, c.fImpactParamCut, sizeof(Float_t) * 4);
95 if(IsQAOn()){
96 fIsQAOn = kTRUE;
97 fQAlist = dynamic_cast<TList *>(c.fQAlist->Clone());
bf892a6a 98 if(fQAlist) fQAlist->SetOwner();
809a4336 99 }
100}
101
102//______________________________________________________
103AliHFEextraCuts &AliHFEextraCuts::operator=(const AliHFEextraCuts &c){
104 //
105 // Assignment operator
106 //
107 if(this != &c){
108 AliCFCutBase::operator=(c);
3a72645a 109 fEvent = c.fEvent;
809a4336 110 fCutCorrelation = c.fCutCorrelation;
111 fRequirements = c.fRequirements;
112 fClusterRatioTPC = c.fClusterRatioTPC;
3a72645a 113 fMinNClustersTPC = c.fMinNClustersTPC;
809a4336 114 fMinTrackletsTRD = c.fMinTrackletsTRD;
115 fPixelITS = c.fPixelITS;
e3ae862b 116 fTPCclusterDef = c.fTPCclusterDef;
117 fTPCclusterRatioDef = c.fTPCclusterRatioDef;
118 fTOFpid = c.fTOFpid;
75d81601 119 fCheck = c.fCheck;
dbe3abbe 120 fDebugLevel = c.fDebugLevel;
809a4336 121 memcpy(fImpactParamCut, c.fImpactParamCut, sizeof(Float_t) * 4);
122 if(IsQAOn()){
123 fIsQAOn = kTRUE;
124 fQAlist = dynamic_cast<TList *>(c.fQAlist->Clone());
bf892a6a 125 if(fQAlist) fQAlist->SetOwner();
809a4336 126 }else fQAlist = 0x0;
127 }
128 return *this;
129}
130
131//______________________________________________________
132AliHFEextraCuts::~AliHFEextraCuts(){
133 //
134 // Destructor
135 //
3a72645a 136 if(fQAlist) delete fQAlist;
137}
138
139//______________________________________________________
140void AliHFEextraCuts::SetRecEventInfo(const TObject *event){
141 //
142 // Set Virtual event an make a copy
143 //
144 if (!event) {
145 AliError("Pointer to AliVEvent !");
146 return;
147 }
148 TString className(event->ClassName());
149 if (! (className.CompareTo("AliESDEvent")==0 || className.CompareTo("AliAODEvent")==0)) {
150 AliError("argument must point to an AliESDEvent or AliAODEvent !");
151 return ;
809a4336 152 }
3a72645a 153 fEvent = (AliVEvent*) event;
154
809a4336 155}
156
157//______________________________________________________
9eeae5d5 158Bool_t AliHFEextraCuts::IsSelected(TObject *o){
809a4336 159 //
160 // Steering function for the track selection
161 //
3a72645a 162 TString type = o->IsA()->GetName();
163 AliDebug(2, Form("Object type %s", type.Data()));
164 if(!type.CompareTo("AliESDtrack") || !type.CompareTo("AliAODTrack")){
165 return CheckRecCuts(dynamic_cast<AliVTrack *>(o));
809a4336 166 }
3a72645a 167 return CheckMCCuts(dynamic_cast<AliVParticle *>(o));
809a4336 168}
169
170//______________________________________________________
3a72645a 171Bool_t AliHFEextraCuts::CheckRecCuts(AliVTrack *track){
809a4336 172 //
173 // Checks cuts on reconstructed tracks
174 // returns true if track is selected
175 // QA histograms are filled before track selection and for
176 // selected tracks after track selection
177 //
70da6c5a 178 AliDebug(1, "Called");
809a4336 179 ULong64_t survivedCut = 0; // Bitmap for cuts which are passed by the track, later to be compared with fRequirements
3a72645a 180 if(IsQAOn()) FillQAhistosRec(track, kBeforeCuts);
809a4336 181 // Apply cuts
e3ae862b 182 Float_t impactR, impactZ;
3a72645a 183 Double_t hfeimpactR, hfeimpactnsigmaR;
184 Double_t hfeimpactRcut, hfeimpactnsigmaRcut;
e3ae862b 185 Bool_t tofstep = kTRUE;
3a72645a 186 GetImpactParameters(track, impactR, impactZ);
187 if(TESTBIT(fRequirements, kMinHFEImpactParamR) || TESTBIT(fRequirements, kMinHFEImpactParamNsigmaR)){
188 // Protection for PbPb
189 GetHFEImpactParameterCuts(track, hfeimpactRcut, hfeimpactnsigmaRcut);
190 GetHFEImpactParameters(track, hfeimpactR, hfeimpactnsigmaR);
191 }
e3ae862b 192 UInt_t nclsTPC = GetTPCncls(track);
809a4336 193 // printf("Check TPC findable clusters: %d, found Clusters: %d\n", track->GetTPCNclsF(), track->GetTPCNcls());
e3ae862b 194 Double_t ratioTPC = GetTPCclusterRatio(track);
809a4336 195 UChar_t trdTracklets;
3a72645a 196 trdTracklets = GetTRDnTrackletsPID(track);
809a4336 197 UChar_t itsPixel = track->GetITSClusterMap();
3a72645a 198 Int_t status1 = GetITSstatus(track, 0);
199 Int_t status2 = GetITSstatus(track, 1);
70da6c5a 200 Bool_t statusL0 = CheckITSstatus(status1);
201 Bool_t statusL1 = CheckITSstatus(status2);
809a4336 202 if(TESTBIT(fRequirements, kMinImpactParamR)){
203 // cut on min. Impact Parameter in Radial direction
75d81601 204 if(TMath::Abs(impactR) >= fImpactParamCut[0]) SETBIT(survivedCut, kMinImpactParamR);
809a4336 205 }
206 if(TESTBIT(fRequirements, kMinImpactParamZ)){
207 // cut on min. Impact Parameter in Z direction
75d81601 208 if(TMath::Abs(impactZ) >= fImpactParamCut[1]) SETBIT(survivedCut, kMinImpactParamZ);
809a4336 209 }
210 if(TESTBIT(fRequirements, kMaxImpactParamR)){
211 // cut on max. Impact Parameter in Radial direction
75d81601 212 if(TMath::Abs(impactR) <= fImpactParamCut[2]) SETBIT(survivedCut, kMaxImpactParamR);
809a4336 213 }
214 if(TESTBIT(fRequirements, kMaxImpactParamZ)){
215 // cut on max. Impact Parameter in Z direction
75d81601 216 if(TMath::Abs(impactZ) <= fImpactParamCut[3]) SETBIT(survivedCut, kMaxImpactParamZ);
809a4336 217 }
3a72645a 218 if(TESTBIT(fRequirements, kMinHFEImpactParamR)){
219 // cut on min. HFE Impact Parameter in Radial direction
220 if(TMath::Abs(hfeimpactR) >= hfeimpactRcut) SETBIT(survivedCut, kMinHFEImpactParamR);
221 }
222 if(TESTBIT(fRequirements, kMinHFEImpactParamNsigmaR)){
223 // cut on max. HFE Impact Parameter n sigma in Radial direction
224 if(TMath::Abs(hfeimpactnsigmaR) >= hfeimpactnsigmaRcut) SETBIT(survivedCut, kMinHFEImpactParamNsigmaR);
225 }
809a4336 226 if(TESTBIT(fRequirements, kClusterRatioTPC)){
227 // cut on min ratio of found TPC clusters vs findable TPC clusters
228 if(ratioTPC >= fClusterRatioTPC) SETBIT(survivedCut, kClusterRatioTPC);
229 }
230 if(TESTBIT(fRequirements, kMinTrackletsTRD)){
231 // cut on minimum number of TRD tracklets
70da6c5a 232 AliDebug(1, Form("Min TRD cut: [%d|%d]\n", fMinTrackletsTRD, trdTracklets));
809a4336 233 if(trdTracklets >= fMinTrackletsTRD) SETBIT(survivedCut, kMinTrackletsTRD);
234 }
3a72645a 235 if(TESTBIT(fRequirements, kMinNClustersTPC)){
236 // cut on minimum number of TRD tracklets
237 AliDebug(1, Form("Min TPC cut: [%d|%d]\n", fMinNClustersTPC, nclsTPC));
238 if(nclsTPC >= fMinNClustersTPC) SETBIT(survivedCut, kMinNClustersTPC);
239 }
809a4336 240 if(TESTBIT(fRequirements, kPixelITS)){
241 // cut on ITS pixel layers
70da6c5a 242 AliDebug(1, "ITS cluster Map: ");
243 //PrintBitMap(itsPixel);
809a4336 244 switch(fPixelITS){
70da6c5a 245 case kFirst:
246 AliDebug(2, "First");
247 if(TESTBIT(itsPixel, 0))
248 SETBIT(survivedCut, kPixelITS);
249 else
250 if(fCheck && !statusL0)
251 SETBIT(survivedCut, kPixelITS);
dbe3abbe 252 break;
253 case kSecond:
70da6c5a 254 AliDebug(2, "Second");
255 if(TESTBIT(itsPixel, 1))
256 SETBIT(survivedCut, kPixelITS);
257 else
258 if(fCheck && !statusL1)
259 SETBIT(survivedCut, kPixelITS);
dbe3abbe 260 break;
261 case kBoth:
70da6c5a 262 AliDebug(2, "Both");
263 if(TESTBIT(itsPixel,0) && TESTBIT(itsPixel,1))
264 SETBIT(survivedCut, kPixelITS);
265 else
266 if(fCheck && !(statusL0 && statusL1))
267 SETBIT(survivedCut, kPixelITS);
268 break;
dbe3abbe 269 case kAny:
70da6c5a 270 AliDebug(2, "Any");
271 if(TESTBIT(itsPixel, 0) || TESTBIT(itsPixel, 1))
272 SETBIT(survivedCut, kPixelITS);
273 else
274 if(fCheck && !(statusL0 || statusL1))
275 SETBIT(survivedCut, kPixelITS);
dbe3abbe 276 break;
70da6c5a 277 default:
278 AliDebug(2, "None");
279 break;
809a4336 280 }
70da6c5a 281 AliDebug(1, Form("Survived Cut: %s\n", TESTBIT(survivedCut, kPixelITS) ? "YES" : "NO"));
809a4336 282 }
e3ae862b 283 if(fTOFpid){
284 // cut on TOF pid
285 tofstep = kFALSE;
286 if(track->GetStatus() & AliESDtrack::kTOFpid) tofstep = kTRUE;
287
288 }
289 if(fRequirements == survivedCut && tofstep){
809a4336 290 //
291 // Track selected
292 //
3a72645a 293 AliDebug(2, "Track Survived cuts\n");
294 if(IsQAOn()) FillQAhistosRec(track, kAfterCuts);
809a4336 295 return kTRUE;
296 }
3a72645a 297 AliDebug(2, "Track cut");
809a4336 298 if(IsQAOn()) FillCutCorrelation(survivedCut);
299 return kFALSE;
300}
301
302//______________________________________________________
3a72645a 303Bool_t AliHFEextraCuts::CheckMCCuts(AliVParticle */*track*/) const {
809a4336 304 //
305 // Checks cuts on Monte Carlo tracks
306 // returns true if track is selected
307 // QA histograms are filled before track selection and for
308 // selected tracks after track selection
309 //
310 return kTRUE; // not yet implemented
311}
312
313//______________________________________________________
3a72645a 314void AliHFEextraCuts::FillQAhistosRec(AliVTrack *track, UInt_t when){
809a4336 315 //
316 // Fill the QA histograms for ESD tracks
317 // Function can be called before cuts or after cut application (second argument)
318 //
3a72645a 319 const Int_t kNhistos = 6;
75d81601 320 Float_t impactR, impactZ;
3a72645a 321 GetImpactParameters(track, impactR, impactZ);
bf892a6a 322 TH1 *htmp = NULL;
323 if((htmp = dynamic_cast<TH1F *>(fQAlist->At(0 + when * kNhistos)))) htmp->Fill(impactR);
324 if((htmp = dynamic_cast<TH1F *>(fQAlist->At(1 + when * kNhistos)))) htmp->Fill(impactZ);
809a4336 325 // printf("TPC findable clusters: %d, found Clusters: %d\n", track->GetTPCNclsF(), track->GetTPCNcls());
e3ae862b 326 if((htmp = dynamic_cast<TH1F *>(fQAlist->At(2 + when * kNhistos)))) htmp->Fill(GetTPCclusterRatio(track));
bf892a6a 327 if((htmp = dynamic_cast<TH1F *>(fQAlist->At(3 + when * kNhistos)))) htmp->Fill(GetTRDnTrackletsPID(track));
e3ae862b 328 if((htmp = dynamic_cast<TH1F *>(fQAlist->At(4 + when * kNhistos)))) htmp->Fill(GetTPCncls(track));
809a4336 329 UChar_t itsPixel = track->GetITSClusterMap();
3a72645a 330 TH1 *pixelHist = dynamic_cast<TH1F *>(fQAlist->At(5 + when * kNhistos));
e3fc062d 331 //Int_t firstEntry = pixelHist->GetXaxis()->GetFirst();
bf892a6a 332 if(pixelHist){
333 Double_t firstEntry = 0.5;
334 if(!((itsPixel & BIT(0)) || (itsPixel & BIT(1))))
335 pixelHist->Fill(firstEntry + 3);
336 else{
337 if(itsPixel & BIT(0)){
338 pixelHist->Fill(firstEntry);
339 if(itsPixel & BIT(1)) pixelHist->Fill(firstEntry + 2);
340 else pixelHist->Fill(firstEntry + 4);
341 }
342 if(itsPixel & BIT(1)){
343 pixelHist->Fill(firstEntry + 1);
344 if(!(itsPixel & BIT(0))) pixelHist->Fill(firstEntry + 5);
345 }
809a4336 346 }
347 }
348}
349
350// //______________________________________________________
351// void AliHFEextraCuts::FillQAhistosMC(AliMCParticle *track, UInt_t when){
352// //
353// // Fill the QA histograms for MC tracks
354// // Function can be called before cuts or after cut application (second argument)
355// // Not yet implemented
356// //
357// }
358
359//______________________________________________________
360void AliHFEextraCuts::FillCutCorrelation(ULong64_t survivedCut){
361 //
362 // Fill cut correlation histograms for tracks that didn't pass cuts
363 //
3a72645a 364 const Int_t kNhistos = 6;
365 TH2 *correlation = dynamic_cast<TH2F *>(fQAlist->At(2 * kNhistos));
bf892a6a 366 if(correlation){
367 for(Int_t icut = 0; icut < kNcuts; icut++){
368 if(!TESTBIT(fRequirements, icut)) continue;
369 for(Int_t jcut = icut; jcut < kNcuts; jcut++){
370 if(!TESTBIT(fRequirements, jcut)) continue;
371 if(TESTBIT(survivedCut, icut) && TESTBIT(survivedCut, jcut))
372 correlation->Fill(icut, jcut);
373 }
809a4336 374 }
375 }
376}
377
378//______________________________________________________
379void AliHFEextraCuts::AddQAHistograms(TList *qaList){
380 //
381 // Add QA histograms
382 // For each cut a histogram before and after track cut is created
383 // Histos before respectively after cut are stored in different lists
384 // Additionally a histogram with the cut correlation is created and stored
385 // in the top directory
386 //
3a72645a 387
388 const Int_t kNhistos = 6;
809a4336 389 TH1 *histo1D = 0x0;
390 TH2 *histo2D = 0x0;
809a4336 391 TString cutstr[2] = {"before", "after"};
3a72645a 392
393 if(!fQAlist) fQAlist = new TList; // for internal representation, not owner
809a4336 394 for(Int_t icond = 0; icond < 2; icond++){
3a72645a 395 qaList->AddAt((histo1D = new TH1F(Form("%s_impactParamR%s",GetName(),cutstr[icond].Data()), "Radial Impact Parameter", 100, 0, 10)), 0 + icond * kNhistos);
396 fQAlist->AddAt(histo1D, 0 + icond * kNhistos);
809a4336 397 histo1D->GetXaxis()->SetTitle("Impact Parameter");
398 histo1D->GetYaxis()->SetTitle("Number of Tracks");
3a72645a 399 qaList->AddAt((histo1D = new TH1F(Form("%s_impactParamZ%s",GetName(),cutstr[icond].Data()), "Z Impact Parameter", 200, 0, 20)), 1 + icond * kNhistos);
400 fQAlist->AddAt(histo1D, 1 + icond * kNhistos);
809a4336 401 histo1D->GetXaxis()->SetTitle("Impact Parameter");
402 histo1D->GetYaxis()->SetTitle("Number of Tracks");
e3ae862b 403 qaList->AddAt((histo1D = new TH1F(Form("%s_tpcClr%s",GetName(),cutstr[icond].Data()), "Cluster Ratio TPC", 100, 0, 1)), 2 + icond * kNhistos);
3a72645a 404 fQAlist->AddAt(histo1D, 2 + icond * kNhistos);
809a4336 405 histo1D->GetXaxis()->SetTitle("Cluster Ratio TPC");
406 histo1D->GetYaxis()->SetTitle("Number of Tracks");
3a72645a 407 qaList->AddAt((histo1D = new TH1F(Form("%s_trdTracklets%s",GetName(),cutstr[icond].Data()), "Number of TRD tracklets", 7, 0, 7)), 3 + icond * kNhistos);
408 fQAlist->AddAt(histo1D, 3 + icond * kNhistos);
809a4336 409 histo1D->GetXaxis()->SetTitle("Number of TRD Tracklets");
410 histo1D->GetYaxis()->SetTitle("Number of Tracks");
3a72645a 411 qaList->AddAt((histo1D = new TH1F(Form("%s_tpcClusters%s",GetName(),cutstr[icond].Data()), "Number of TPC clusters", 161, 0, 160)), 4 + icond * kNhistos);
412 fQAlist->AddAt(histo1D, 4 + icond * kNhistos);
413 histo1D->GetXaxis()->SetTitle("Number of TPC clusters");
414 histo1D->GetYaxis()->SetTitle("Number of Tracks");
415 qaList->AddAt((histo1D = new TH1F(Form("%s_itsPixel%s",GetName(),cutstr[icond].Data()), "ITS Pixel Hits", 6, 0, 6)), 5 + icond * kNhistos);
416 fQAlist->AddAt(histo1D, 5 + icond * kNhistos);
809a4336 417 histo1D->GetXaxis()->SetTitle("ITS Pixel");
418 histo1D->GetYaxis()->SetTitle("Number of Tracks");
419 Int_t first = histo1D->GetXaxis()->GetFirst();
420 TString binNames[6] = { "First", "Second", "Both", "None", "Exclusive First", "Exclusive Second"};
421 for(Int_t ilabel = 0; ilabel < 6; ilabel++)
422 histo1D->GetXaxis()->SetBinLabel(first + ilabel, binNames[ilabel].Data());
423 }
809a4336 424 // Add cut correlation
3a72645a 425 qaList->AddAt((histo2D = new TH2F(Form("%s_cutcorrelation",GetName()), "Cut Correlation", kNcuts, 0, kNcuts - 1, kNcuts, 0, kNcuts -1)), 2 * kNhistos);
426 fQAlist->AddAt(histo2D, 2 * kNhistos);
427 TString labels[kNcuts] = {"MinImpactParamR", "MaxImpactParamR", "MinImpactParamZ", "MaxImpactParamZ", "ClusterRatioTPC", "MinTrackletsTRD", "ITSpixel", "kMinHFEImpactParamR", "kMinHFEImpactParamNsigmaR", "TPC Number of clusters"};
809a4336 428 Int_t firstx = histo2D->GetXaxis()->GetFirst(), firsty = histo2D->GetYaxis()->GetFirst();
429 for(Int_t icut = 0; icut < kNcuts; icut++){
430 histo2D->GetXaxis()->SetBinLabel(firstx + icut, labels[icut].Data());
431 histo2D->GetYaxis()->SetBinLabel(firsty + icut, labels[icut].Data());
432 }
809a4336 433}
dbe3abbe 434
435//______________________________________________________
436void AliHFEextraCuts::PrintBitMap(Int_t bitmap){
437 for(Int_t ibit = 32; ibit--; )
438 printf("%d", bitmap & BIT(ibit) ? 1 : 0);
439 printf("\n");
440}
441
442//______________________________________________________
75d81601 443Bool_t AliHFEextraCuts::CheckITSstatus(Int_t itsStatus) const {
dbe3abbe 444 //
445 // Check whether ITS area is dead
446 //
447 Bool_t status;
448 switch(itsStatus){
449 case 2: status = kFALSE; break;
450 case 3: status = kFALSE; break;
451 case 7: status = kFALSE; break;
452 default: status = kTRUE;
453 }
454 return status;
455}
3a72645a 456
457//______________________________________________________
458Int_t AliHFEextraCuts::GetTRDnTrackletsPID(AliVTrack *track){
459 //
460 // Get Number of TRD tracklets
461 //
462 Int_t nTracklets = 0;
463 if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
464 AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
bf892a6a 465 if(esdtrack) nTracklets = esdtrack->GetTRDntrackletsPID();
3a72645a 466 } else if(!TString(track->IsA()->GetName()).CompareTo("AliAODTrack")){
467 AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
bf892a6a 468 AliAODPid *pidobject = NULL;
469 if(aodtrack) pidobject = aodtrack->GetDetPid();
3a72645a 470 // this is normally NOT the way to do this, but due to limitation in the
471 // AOD track it is not possible in a different way
472 if(pidobject){
473 Float_t *trdmom = pidobject->GetTRDmomentum();
474 for(Int_t ily = 0; ily < 6; ily++){
475 if(trdmom[ily] > -1) nTracklets++;
476 }
477 } else nTracklets = 6; // No Cut possible
478 }
479 return nTracklets;
480}
481
482//______________________________________________________
483Int_t AliHFEextraCuts::GetITSstatus(AliVTrack *track, Int_t layer){
484 //
485 // Check ITS layer status
486 //
487 Int_t status = 0;
488 if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
489 Int_t det;
490 Float_t xloc, zloc;
491 AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
bf892a6a 492 if(esdtrack) esdtrack->GetITSModuleIndexInfo(layer, det, status, xloc, zloc);
3a72645a 493 }
494 return status;
495}
496
497//______________________________________________________
e3ae862b 498UInt_t AliHFEextraCuts::GetTPCncls(AliVTrack *track){
3a72645a 499 //
500 // Get Number of findable clusters in the TPC
501 //
3a72645a 502 Int_t nClusters = 0; // in case no Information available consider all clusters findable
503 TString type = track->IsA()->GetName();
504 if(!type.CompareTo("AliESDtrack")){
505 AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
bf892a6a 506 if(esdtrack){ // coverity
e3ae862b 507 if(TESTBIT(fTPCclusterDef, kFoundIter1)){
bf892a6a 508 nClusters = esdtrack->GetTPCNclsIter1();
e3ae862b 509 AliDebug(2, ("Using def kFoundIter1"));
510 } else if(TESTBIT(fTPCclusterDef, kCrossedRows)){
511 AliDebug(2, ("Using def kCrossedRows"));
512 nClusters = static_cast<UInt_t>(esdtrack->GetTPCClusterInfo(2,1));
513 } else{
514 AliDebug(2, ("Using def kFound"));
bf892a6a 515 nClusters = esdtrack->GetTPCNcls();
e3ae862b 516 }
bf892a6a 517 }
3a72645a 518 }
519 else if(!type.CompareTo("AliAODTrack")){
520 AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
e3ae862b 521 if(aodtrack){
522 const TBits &tpcmap = aodtrack->GetTPCClusterMap();
523 for(UInt_t ibit = 0; ibit < tpcmap.GetNbits(); ibit++)
524 if(tpcmap.TestBitNumber(ibit)) nClusters++;
525 }
3a72645a 526 }
527 return nClusters;
528}
529
e3ae862b 530//______________________________________________________
531Double_t AliHFEextraCuts::GetTPCclusterRatio(AliVTrack *track){
532 //
533 // Get Ratio of found / findable clusters for different definitions
534 // Only implemented for ESD tracks
535 //
536 Double_t clusterRatio = 1.; // in case no Information available consider all clusters findable
537 TString type = track->IsA()->GetName();
538 if(!type.CompareTo("AliESDtrack")){
539 AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
540 if(esdtrack){ // coverity
541 if(TESTBIT(fTPCclusterRatioDef, kCROverFindable)){
542 AliDebug(2, "Using ratio def kCROverFindable");
543 clusterRatio = esdtrack->GetTPCNclsF() ? esdtrack->GetTPCClusterInfo(2,1)/static_cast<Double_t>(esdtrack->GetTPCNclsF()) : 1.; // crossed rows/findable
544 } else if(TESTBIT(fTPCclusterRatioDef, kFoundOverCR)){
545 AliDebug(2, "Using ratio def kFoundOverCR");
546 clusterRatio = esdtrack->GetTPCClusterInfo(2,0); // found/crossed rows
547 } else if(TESTBIT(fTPCclusterRatioDef, kFoundOverFindableIter1)){
548 AliDebug(2, "Using ratio def kFoundOverFindableIter1");
549 clusterRatio = esdtrack->GetTPCNclsFIter1() ? static_cast<Double_t>(esdtrack->GetTPCNclsIter1())/static_cast<Double_t>(esdtrack->GetTPCNclsFIter1()) : 1.; // crossed
550 } else {
551 AliDebug(2, "Using ratio def kFoundOverFindable");
552 clusterRatio = esdtrack->GetTPCNclsF() ? static_cast<Double_t>(esdtrack->GetTPCNcls())/static_cast<Double_t>(esdtrack->GetTPCNclsF()) : 1.; // found/findable
553 }
554 }
555 }
556 return clusterRatio;
557}
558
3a72645a 559//______________________________________________________
560void AliHFEextraCuts::GetImpactParameters(AliVTrack *track, Float_t &radial, Float_t &z){
561 //
562 // Get impact parameter
563 //
564 TString type = track->IsA()->GetName();
565 if(!type.CompareTo("AliESDtrack")){
566 AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
bf892a6a 567 if(esdtrack) esdtrack->GetImpactParameters(radial, z);
3a72645a 568 }
569 else if(!type.CompareTo("AliAODTrack")){
570 AliAODTrack *aodtrack = dynamic_cast<AliAODTrack *>(track);
bf892a6a 571 if(aodtrack){
572 Double_t xyz[3];
573 aodtrack->XYZAtDCA(xyz);
574 z = xyz[2];
575 radial = TMath::Sqrt(xyz[0]*xyz[0] + xyz[1]+xyz[1]);
576 }
3a72645a 577 }
578}
579
580//______________________________________________________
581void AliHFEextraCuts::GetHFEImpactParameters(AliVTrack *track, Double_t &dcaxy, Double_t &dcansigmaxy){
582 //
583 // Get HFE impact parameter (with recalculated primary vertex)
584 //
585 dcaxy=0;
586 dcansigmaxy=0;
587 if(!fEvent){
588 AliDebug(1, "No Input event available\n");
589 return;
590 }
591 const Double_t kBeampiperadius=3.;
592 TString type = track->IsA()->GetName();
593 Double_t dca[2]={-999.,-999.};
594 Double_t cov[3]={-999.,-999.,-999.};
595
596 // recalculate primary vertex
597 AliVertexerTracks vertexer(fEvent->GetMagneticField());
598 vertexer.SetITSMode();
599 vertexer.SetMinClusters(4);
600 Int_t skipped[2];
601 skipped[0] = track->GetID();
602 vertexer.SetSkipTracks(1,skipped);
603 AliVVertex *vtxESDSkip = vertexer.FindPrimaryVertex(fEvent);
604 vertexer.SetSkipTracks(1,skipped);
605 if(vtxESDSkip->GetNContributors()<2) return;
606
607 // Getting the DCA
608 // Propagation always done on a working copy to not disturb the track params of the original track
609 AliESDtrack *esdtrack = NULL;
610 if(!TString(track->IsA()->GetName()).CompareTo("AliESDtrack")){
611 // Case ESD track: take copy constructor
bf892a6a 612 AliESDtrack *tmptrack = dynamic_cast<AliESDtrack *>(track);
613 if(tmptrack) esdtrack = new AliESDtrack(*tmptrack);
3a72645a 614 } else {
615 // Case AOD track: take different constructor
616 esdtrack = new AliESDtrack(track);
617 }
e3ae862b 618 if(esdtrack && esdtrack->PropagateToDCA(vtxESDSkip, fEvent->GetMagneticField(), kBeampiperadius, dca, cov)){
3a72645a 619 // protection
620 dcaxy = dca[0];
621 if(cov[0]) dcansigmaxy = dcaxy/TMath::Sqrt(cov[0]);
622 if(!cov[0]) dcansigmaxy = -99.;
623 }
624 delete esdtrack;
625 delete vtxESDSkip;
626}
627
628
629//______________________________________________________
630void AliHFEextraCuts::GetHFEImpactParameterCuts(AliVTrack *track, Double_t &hfeimpactRcut, Double_t &hfeimpactnsigmaRcut){
631 //
632 // Get HFE impact parameter cut(pt dependent)
633 //
634
bf892a6a 635 TString type = track->IsA()->GetName();
636 if(!type.CompareTo("AliESDtrack")){
637 AliESDtrack *esdtrack = dynamic_cast<AliESDtrack *>(track);
638 if(!esdtrack) return;
639 Double_t pt = esdtrack->Pt();
640 //hfeimpactRcut=0.0064+0.078*exp(-0.56*pt); // used Carlo's old parameter
641 hfeimpactRcut=0.011+0.077*exp(-0.65*pt); // used Carlo's new parameter
642 hfeimpactnsigmaRcut=3; // 3 sigma trail cut
3a72645a 643 }
644}
645