Line data Source code
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 : **************************************************************************/
15 :
16 : /* $Id$ */
17 : //
18 : // This class applies the ITSsa cuts at the AOD level.
19 : // Needed for MuonCalo pass where the FilterBit information was not properly saved.
20 : // It contains also some quality cuts which can be modifed by user.
21 : //
22 : // Author: Igor Lakomov <Igor.Lakomov@cern.ch>
23 : //
24 :
25 : #include "AliAODITSsaTrackCuts.h"
26 :
27 0 : AliAODITSsaTrackCuts::AliAODITSsaTrackCuts() : fMinNClustersITS(0), fMaxChi2PerClustersITS(0), fdcaxycut(0), fdcazcut(0), fPrimaryVertex(0)
28 0 : {
29 : //constructor
30 0 : }
31 :
32 : AliAODITSsaTrackCuts::~AliAODITSsaTrackCuts()
33 0 : {
34 : //destructor
35 0 : delete fdcaxycut;
36 0 : delete fdcazcut;
37 : // Do not delete, not owner delete fPrimaryVertex;
38 0 : }
39 :
40 : Bool_t AliAODITSsaTrackCuts::AcceptTrack(const AliAODTrack* aodTrack)
41 : {
42 0 : if (!fPrimaryVertex) {
43 0 : AliFatal("PrimaryVertex is not set! Please, use AliAODITSsaTrackCuts::ExtractAndSetPrimaryVertex(AliVEvent *event)\n");
44 : // return kFALSE;
45 0 : }
46 :
47 0 : if (aodTrack->IsMuonTrack()) return kFALSE; //reject Muon duplicates
48 :
49 : Int_t nClustersITS = 0;
50 0 : nClustersITS = aodTrack->GetITSNcls();
51 0 : if (nClustersITS<fMinNClustersITS) return kFALSE; //cut on minimum number of ITS clusters
52 :
53 : Float_t chi2PerClusterITS = -1;
54 0 : chi2PerClusterITS = aodTrack->GetITSchi2()/Float_t(nClustersITS);
55 0 : if (chi2PerClusterITS>fMaxChi2PerClustersITS) return kFALSE; //cut on max chi2 per ITS cluster
56 :
57 0 : if ( !( aodTrack->HasPointOnITSLayer(AliESDtrackCuts::kSPD*2) || aodTrack->HasPointOnITSLayer(AliESDtrackCuts::kSPD*2+1) ) ) return kFALSE; //at least one point in the SPD
58 :
59 0 : UInt_t status = aodTrack->GetStatus();
60 0 : if ((status&AliESDtrack::kITSrefit)==0) return kFALSE;
61 :
62 0 : if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)) return kFALSE; else if(!(status & AliESDtrack::kITSpureSA)) return kFALSE;
63 :
64 0 : Double_t pt = aodTrack->Pt();
65 0 : Double_t fDCAXY = CalculateDCAXY(aodTrack);
66 0 : if (fDCAXY>fdcaxycut->Eval(pt)) return kFALSE; // pt-dependent cut on DCAXY
67 :
68 0 : Double_t fDCAZ = CalculateDCAZ(aodTrack);
69 0 : if (TMath::Abs(fDCAZ)>fdcazcut->Eval(pt)) return kFALSE; // pt-dependent cut on DCAZ
70 :
71 0 : return kTRUE; //default return
72 0 : }
73 :
74 : Double_t AliAODITSsaTrackCuts::CalculateDCAXY(const AliAODTrack* aodTrack)
75 : {
76 0 : if (!fPrimaryVertex) {
77 0 : AliFatal("PrimaryVertex is not set! Please, use AliAODITSsaTrackCuts::ExtractAndSetPrimaryVertex(AliVEvent *event)\n");
78 : // return -1;
79 0 : }
80 0 : Double_t pos[3], v[3];
81 0 : fPrimaryVertex->GetXYZ(v);
82 0 : aodTrack->GetXYZ(pos);
83 0 : Double_t vDCAglobalx = pos[0] - v[0];
84 0 : Double_t vDCAglobaly = pos[1] - v[1];
85 0 : return TMath::Sqrt(vDCAglobalx*vDCAglobalx + vDCAglobaly*vDCAglobaly);
86 0 : }
87 :
88 : Double_t AliAODITSsaTrackCuts::CalculateDCAZ(const AliAODTrack* aodTrack)
89 : {
90 0 : if (!fPrimaryVertex) {
91 0 : AliFatal("PrimaryVertex is not set! Please, use AliAODITSsaTrackCuts::ExtractAndSetPrimaryVertex(AliVEvent *event)\n");
92 : // return -1;
93 0 : }
94 0 : Double_t pos[3], vz;
95 0 : vz = fPrimaryVertex->GetZ();
96 0 : aodTrack->GetXYZ(pos);
97 0 : return pos[2] - vz;
98 0 : }
99 :
100 : void AliAODITSsaTrackCuts::SetDefaultDCAXYptdepCut2015()
101 : {
102 0 : if(fdcaxycut){
103 0 : delete fdcaxycut;
104 : }
105 0 : fdcaxycut = new TFormula("fdcaxycut","0.0231+0.0315/x^1.3"); // 7*(0.0033+0.0045/pt^1.3)
106 0 : }
107 :
108 : void AliAODITSsaTrackCuts::SetUserDCAXYptdepCut(const char *formula)
109 : {
110 0 : if(fdcaxycut){
111 0 : delete fdcaxycut;
112 : }
113 0 : fdcaxycut = new TFormula("fdcaxycut",formula);
114 0 : }
115 :
116 : void AliAODITSsaTrackCuts::SetDefaultDCAZptdepCut2015()
117 : {
118 0 : if(fdcazcut){
119 0 : delete fdcazcut;
120 : }
121 0 : fdcazcut = new TFormula("fdcazcut","1");
122 0 : }
123 :
124 : void AliAODITSsaTrackCuts::SetUserDCAZptdepCut(const char *formula)
125 : {
126 0 : if(fdcazcut){
127 0 : delete fdcazcut;
128 : }
129 0 : fdcazcut = new TFormula("fdcazcut",formula);
130 0 : }
131 :
132 : AliAODITSsaTrackCuts* AliAODITSsaTrackCuts::GetStandardAODITSsaTrackCuts2015()
133 : {
134 0 : AliAODITSsaTrackCuts* itssatrackcuts = new AliAODITSsaTrackCuts();
135 0 : itssatrackcuts->SetDefaultDCAXYptdepCut2015();
136 0 : itssatrackcuts->SetDefaultDCAZptdepCut2015();
137 0 : itssatrackcuts->SetMinNClustersITS(4);
138 0 : itssatrackcuts->SetMaxChi2PerClustersITS(2.5);
139 :
140 0 : return itssatrackcuts;
141 0 : }
|