3891851a6a49ecc4178961c55aeb7806c3ccb1eb
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutStd.cxx
1 //
2 // Class AliRsnCutStd
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 <TMath.h>
20 #include <TLorentzVector.h>
21
22 #include "AliRsnDaughter.h"
23 #include "AliRsnMother.h"
24 #include "AliRsnEvent.h"
25
26 #include "AliRsnCutStd.h"
27
28 ClassImp(AliRsnCutStd)
29
30 //_________________________________________________________________________________________________
31 AliRsnCutStd::AliRsnCutStd() :
32   AliRsnCut(),
33   fType(kLastType),
34   fUseMC(kFALSE),
35   fMass(0.0)
36 {
37 //
38 // Default constructor.
39 //
40 }
41
42 //_________________________________________________________________________________________________
43 AliRsnCutStd::AliRsnCutStd
44 (const char *name, ETarget target, EType type, Int_t val1, Int_t val2, Bool_t useMC) :
45   AliRsnCut(name, target, val1, val2),
46   fType(type),
47   fUseMC(useMC),
48   fMass(0.0)
49 {
50 //
51 // Main constructor.
52 // Checks also that cut values are given in the correct type,
53 // in order to avoid that one passes, for example, a value which should be double
54 // but is interpreted as integer due to the overloading of constructors.
55 //
56
57   switch (fType) 
58   {
59     // int
60     case kMult:
61     case kCharge:
62       break;
63     // double
64     case kP:
65     case kPt:
66     case kEta:
67     case kY:
68     case kThetaDeg:
69       if (fVarType != kDouble) 
70       {
71         AliWarning(Form("[INT CONSTRUCTOR] Cut '%s' is based on DOUBLE. Casting values to DOUBLE", GetName()));
72         SetRange((Double_t)val1, (Double_t)val2);
73         AliWarning(Form("[INT CONSTRUCTOR] Cut '%s' DOUBLE range = %f, %f", GetName(), fMinD, fMaxD));
74       }
75       break;
76     // other cuts are not based on a value, so no problem
77     default:
78       break;
79   }
80 }
81
82 //_________________________________________________________________________________________________
83 AliRsnCutStd::AliRsnCutStd
84 (const char *name, ETarget target, EType type, Double_t val1, Double_t val2, Bool_t useMC) :
85   AliRsnCut(name, target, val1, val2),
86   fType(type),
87   fUseMC(useMC),
88   fMass(0.0)
89 {
90 //
91 // Main constructor.
92 // Checks also that cut values are given in the correct type,
93 // in order to avoid that one passes, for example, a value which should be double
94 // but is interpreted as integer due to the overloading of constructors
95 //
96
97   switch (fType) 
98   {
99     // int
100     case kMult:
101     case kCharge:
102       if (fVarType != kInt) 
103       {
104         AliWarning(Form("[DOUBLE CONSTRUCTOR] Cut '%s' is based on INT. Casting values to INT", GetName()));
105         SetRange((Int_t)val1, (Int_t)val2);
106         AliWarning(Form("[DOUBLE CONSTRUCTOR] Cut '%s' INT range = %d, %d", GetName(), fMinI, fMaxI));
107       }
108       break;
109     // double
110     case kP:
111     case kPt:
112     case kEta:
113     case kY:
114     case kThetaDeg:
115       break;
116     // other cuts are not based on a value, so no problem
117     default:
118       break;
119   }
120 }
121
122 //_________________________________________________________________________________________________
123 AliRsnCut::EVarType AliRsnCutStd::CheckType()
124 {
125 //
126 // Returns the variable type expected for the selected cut type
127 //
128
129   switch (fType) 
130   {
131     // integer cuts
132     case kMult:
133     case kCharge:
134       return kInt;
135     // double couts
136     case kP:
137     case kPt:
138     case kEta:
139     case kY:
140     case kThetaDeg:
141       return kDouble;
142     // other cuts are not based on a value, so no problem
143     default:
144       return kNoVar;
145   }
146 }
147
148 //_________________________________________________________________________________________________
149 Bool_t AliRsnCutStd::IsSelected(TObject *obj1, TObject *obj2)
150 {
151   // coherence check using the mother class method
152   if (!TargetOK(obj1, obj2)) 
153   {
154     AliError("Wrong target. Skipping cut");
155     return kTRUE;
156   }
157   
158   // if coherence check is OK, only one of the following
159   // dynamic casts will be successful, and it will trigger
160   // the correct internal method to check the cut
161   AliRsnDaughter *objD = dynamic_cast<AliRsnDaughter*>(obj1);
162   AliRsnMother   *objM = dynamic_cast<AliRsnMother*>(obj1);
163   AliRsnEvent    *objE = dynamic_cast<AliRsnEvent*>(obj1);  
164   if (objD) return IsDaughterSelected(objD);
165   else if (objM) return IsMotherSelected(objM);
166   else if (objE) return IsEventSelected(objE);
167   else return kTRUE;
168 }
169
170 //_________________________________________________________________________________________________
171 Bool_t AliRsnCutStd::IsDaughterSelected(AliRsnDaughter *daughter)
172 {
173 //
174 // Cut checker.
175 //
176
177   // get the correct reference object for kinematic cuts
178   // and check that this reference is not NULL, to avoid segfaults
179   AliVParticle *ref = fUseMC ? daughter->GetRefMC() : daughter->GetRef();
180
181   // loop on allowed possibilities
182   switch (fType) 
183   {
184     case kP:
185       fCutValueD = ref->P();
186       return OkRange();
187     case kPt:
188       fCutValueD = ref->Pt();
189       return OkRange();
190     case kThetaDeg:
191       fCutValueD = ref->Theta() * TMath::RadToDeg();
192       return OkRange();
193     case kEta:
194       fCutValueD = ref->Eta();
195       return OkRange();
196     case kCharge:
197       fCutValueI = (Int_t)ref->Charge();
198       return OkValue();
199     default:
200       AliWarning(Form("Value %d is not included in available cuts for DAUGHTER. Cut skipped.", fType));
201       return kTRUE;
202   }
203 }
204
205 //_________________________________________________________________________________________________
206 Bool_t AliRsnCutStd::IsMotherSelected(AliRsnMother * const mother)
207 {
208 //
209 // Cut checker
210 //
211   
212   // use MC flag if required
213   TLorentzVector &sum = fUseMC ? mother->SumMC() : mother->Sum();
214   TLorentzVector &ref = fUseMC ? mother->RefMC() : mother->Ref();
215   
216   // loop on allowed possibilities
217   switch (fType) 
218   {
219     case kP:
220       fCutValueD = sum.P();
221       return OkRange();
222     case kPt:
223       fCutValueD = sum.Perp();
224       return OkRange();
225     case kEta:
226       fCutValueD = sum.Eta();
227       return OkRange();
228     case kY:
229       fCutValueD = ref.Rapidity();
230       return OkRange();
231     case kSameLabel:
232       return mother->IsLabelEqual();
233     default:
234       AliWarning(Form("Value %d is not included in available cuts for PAIR. Cut skipped.", fType));
235       return kTRUE;
236   }
237 }
238
239 //_________________________________________________________________________________________________
240 Bool_t AliRsnCutStd::IsEventSelected(AliRsnEvent * const event)
241 {
242 //
243 // Cut checker
244 //
245
246   // loop on allowed possibilities
247   switch (fType) 
248   {
249     case kMult:
250       fCutValueI = event->GetMultiplicity();
251       return OkRange();
252     default:
253       AliWarning(Form("Value %d is not included in available cuts for EVENT. Cut skipped.", fType));
254       return kTRUE;
255   }
256 }