]> git.uio.no Git - u/mrichter/AliRoot.git/blob - PWGLF/RESONANCES/AliRsnCutV0.cxx
edit to output container arg list from Claude
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / AliRsnCutV0.cxx
1 //
2 // Class AliRsnCutV0
3 //
4 // General implementation of a single cut strategy, which can be:
5 // - a value contained in a given interval  [--> IsBetween()   ]
6 // - a value equal to a given reference     [--> MatchesValue()]
7 //
8 // In all cases, the reference value(s) is (are) given as data members
9 // and each kind of cut requires a given value type (Int, UInt, Double),
10 // but the cut check procedure is then automatized and chosen thanks to
11 // an enumeration of the implemented cut types.
12 // At the end, the user (or any other point which uses this object) has
13 // to use the method IsSelected() to check if this cut has been passed.
14 //
15 // authors: Martin Vala (martin.vala@cern.ch)
16 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
17 //
18
19 #include <Riostream.h>
20 #include <TFormula.h>
21 #include <TBits.h>
22
23 #include "AliLog.h"
24 #include "AliESDtrackCuts.h"
25
26 #include "AliRsnEvent.h"
27 #include "AliRsnDaughter.h"
28 #include "AliRsnCutV0.h"
29
30 ClassImp(AliRsnCutV0)
31
32 //_________________________________________________________________________________________________
33 AliRsnCutV0::AliRsnCutV0(const char *name, Int_t hypothesis) :
34    AliRsnCut(name, AliRsnTarget::kDaughter),
35    fHypothesis(0),
36    fMass(0.0),
37    fTolerance(0.2),
38    fMaxDCAVertex(0.3),
39    fMinCosPointAngle(0.95),
40    fMaxDaughtersDCA(0.1),
41    fESDtrackCuts(0x0)
42 {
43 //
44 // Default constructor.
45 // Initializes all cuts in such a way that all of them are disabled.
46 //
47
48    SetHypothesis(hypothesis);
49 }
50
51 //_________________________________________________________________________________________________
52 AliRsnCutV0::AliRsnCutV0(const AliRsnCutV0 &copy) :
53    AliRsnCut(copy),
54    fHypothesis(copy.fHypothesis),
55    fMass(copy.fMass),
56    fTolerance(copy.fTolerance),
57    fMaxDCAVertex(copy.fMaxDCAVertex),
58    fMinCosPointAngle(copy.fMinCosPointAngle),
59    fMaxDaughtersDCA(copy.fMaxDaughtersDCA),
60    fESDtrackCuts(copy.fESDtrackCuts)
61 {
62 //
63 // Copy constructor.
64 // Just copy all data member values.
65 //
66 }
67
68 //_________________________________________________________________________________________________
69 AliRsnCutV0 &AliRsnCutV0::operator=(const AliRsnCutV0 &copy)
70 {
71 //
72 // Assignment operator.
73 // Just copy all data member values.
74 //
75
76    if (this == &copy)
77       return *this;
78
79    fHypothesis = copy.fHypothesis;
80    fMass = copy.fMass;
81    fTolerance = copy.fTolerance;
82    fMaxDCAVertex = copy.fMaxDCAVertex;
83    fMinCosPointAngle = copy.fMinCosPointAngle;
84    fMaxDaughtersDCA = copy.fMaxDaughtersDCA;
85    fESDtrackCuts = copy.fESDtrackCuts;
86
87    return (*this);
88 }
89
90 //_________________________________________________________________________________________________
91 Bool_t AliRsnCutV0::IsSelected(TObject *object)
92 {
93 //
94 // Cut checker.
95 // Checks the type of object being evaluated
96 // and then calls the appropriate sub-function (for ESD or AOD)
97 //
98
99    // coherence check
100    if (!TargetOK(object)) return kFALSE;
101
102    // check cast
103    AliESDv0 *v0esd = fDaughter->Ref2ESDv0();
104    AliAODv0 *v0aod = fDaughter->Ref2AODv0();
105    //cout << fDaughter->GetRef()->ClassName() << ' ' << v0esd << ' ' << v0aod << endl;
106
107    // operate depending on cast
108    if (v0esd) {
109       return CheckESD(v0esd);
110    } else if (v0aod) {
111       return CheckAOD(v0aod);
112    } else {
113       AliDebugClass(1, "Object is not a V0");
114       return kFALSE;
115    }
116 }
117
118 //_________________________________________________________________________________________________
119 Bool_t AliRsnCutV0::CheckESD(AliESDv0 *v0)
120 {
121 //
122 // Check an ESD V0.
123 // This is done using the default track checker for ESD.
124 // It is declared static, not to recreate it every time.
125 //
126
127    AliDebugClass(1, "Check ESD");
128    if (v0->GetOnFlyStatus()) {
129       AliDebugClass(1, "Rejecting V0 in 'on fly' status");
130       return kFALSE; // if kTRUE, then this V0 is recontructed
131    }
132
133    // retrieve pointer to owner event
134    AliESDEvent *lESDEvent = fEvent->GetRefESD();
135    Double_t xPrimaryVertex = lESDEvent->GetPrimaryVertex()->GetX();
136    Double_t yPrimaryVertex = lESDEvent->GetPrimaryVertex()->GetY();
137    Double_t zPrimaryVertex = lESDEvent->GetPrimaryVertex()->GetZ();
138    AliDebugClass(2, Form("Primary vertex: %f %f %f", xPrimaryVertex, yPrimaryVertex, zPrimaryVertex));
139
140    // retrieve the V0 daughters
141    UInt_t lIdxPos      = (UInt_t) TMath::Abs(v0->GetPindex());
142    UInt_t lIdxNeg      = (UInt_t) TMath::Abs(v0->GetNindex());
143    AliESDtrack *pTrack = lESDEvent->GetTrack(lIdxPos);
144    AliESDtrack *nTrack = lESDEvent->GetTrack(lIdxNeg);
145
146    // check quality cuts
147    if (fESDtrackCuts) {
148       AliDebugClass(2, "Checking quality cuts");
149       if (!fESDtrackCuts->IsSelected(pTrack)) {
150          AliDebugClass(2, "Positive daughter failed quality cuts");
151          return kFALSE;
152       }
153       if (!fESDtrackCuts->IsSelected(nTrack)) {
154          AliDebugClass(2, "Negative daughter failed quality cuts");
155          return kFALSE;
156       }
157    }
158
159    // filter like-sign V0
160    //if ((TMath::Abs(pTrack->GetSign()) - TMath::Abs(nTrack->GetSign()) ) < 0.1) {
161    //   AliDebugClass(2, "Failed like-sign V0 check");
162    //   return kFALSE;
163    //}
164
165    // check compatibility with expected species hypothesis
166    v0->ChangeMassHypothesis(fHypothesis);
167    if ((TMath::Abs(v0->GetEffMass() - fMass)) > fTolerance) {
168       AliDebugClass(2, "V0 is not in the expected inv mass range");
169       return kFALSE;
170    }
171
172    // topological checks
173    if (TMath::Abs(v0->GetD(xPrimaryVertex, yPrimaryVertex, zPrimaryVertex)) > fMaxDCAVertex) {
174       AliDebugClass(2, "Failed check on DCA to primary vertes");
175       return kFALSE;
176    }
177    if (TMath::Abs(v0->GetV0CosineOfPointingAngle()) < fMinCosPointAngle) {
178       AliDebugClass(2, "Failed check on cosine of pointing angle");
179       return kFALSE;
180    }
181    if (TMath::Abs(v0->GetDcaV0Daughters()) > fMaxDaughtersDCA) {
182       AliDebugClass(2, "Failed check on DCA between daughters");
183       return kFALSE;
184    }
185
186    // if we reach this point, all checks were successful
187    AliDebugClass(2, "Good V0 (hallelujah)");
188    return kTRUE;
189 }
190
191 //_________________________________________________________________________________________________
192 Bool_t AliRsnCutV0::CheckAOD(AliAODv0 *)
193 {
194 //
195 // Check an AOD V0.
196 // This is done doing directly all checks, since there is not
197 // an equivalend checker for AOD tracks
198 //
199
200    AliWarning("Cuts is not yet implemented for AOD");
201
202    return kTRUE;
203 }
204
205 //_________________________________________________________________________________________________
206 void AliRsnCutV0::Print(const Option_t *) const
207 {
208 //
209 // Print information on this cut
210 //
211 }