b8e9d521c806daca6ad401896df4432e70f94ebb
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / AliRsnDaughterSelector.cxx
1 #include <Riostream.h>
2 #include <TEntryList.h>
3
4 #include "AliLog.h"
5
6 #include "AliRsnCutSet.h"
7 #include "AliRsnDaughterDef.h"
8
9 #include "AliRsnDaughterSelector.h"
10
11 ClassImp(AliRsnDaughterSelector)
12
13 //__________________________________________________________________________________________________
14 AliRsnDaughterSelector::AliRsnDaughterSelector(const char *name, const char *title) :
15    TNamed(name, title),
16    fCutSetsN("AliRsnCutSet", 0),
17    fCutSetsC("AliRsnCutSet", 0),
18    fEntryListsN("TEntryList", 0),
19    fEntryListsP("TEntryList", 0),
20    fEntryListsM("TEntryList", 0),
21    fUseLabelCheck(kTRUE)
22 {
23 //
24 // Default constructor.
25 //
26
27    AliDebug(AliLog::kDebug + 10, "<-");
28    AliDebug(AliLog::kDebug + 10, "->");
29 }
30
31 //__________________________________________________________________________________________________
32 AliRsnDaughterSelector::AliRsnDaughterSelector(const AliRsnDaughterSelector &copy) :
33    TNamed(copy),
34    fCutSetsN(copy.fCutSetsN),
35    fCutSetsC(copy.fCutSetsC),
36    fEntryListsN(copy.fEntryListsN),
37    fEntryListsP(copy.fEntryListsP),
38    fEntryListsM(copy.fEntryListsM),
39    fUseLabelCheck(copy.fUseLabelCheck)
40 {
41 //
42 // Copy constructor.
43 //
44
45    AliDebug(AliLog::kDebug + 10, "<-");
46    AliDebug(AliLog::kDebug + 10, "->");
47 }
48
49 //__________________________________________________________________________________________________
50 AliRsnDaughterSelector &AliRsnDaughterSelector::operator=(const AliRsnDaughterSelector &copy)
51 {
52 //
53 // Copy constructor.
54 //
55
56    AliDebug(AliLog::kDebug + 10, "<-");
57
58    TNamed::operator=(copy);
59    if (this == &copy)
60       return *this;
61    fCutSetsN = copy.fCutSetsN;
62    fCutSetsC = copy.fCutSetsC;
63    fEntryListsN = copy.fEntryListsN;
64    fEntryListsP = copy.fEntryListsP;
65    fEntryListsM = copy.fEntryListsM;
66    fUseLabelCheck = copy.fUseLabelCheck;
67
68    AliDebug(AliLog::kDebug + 10, "->");
69
70    return (*this);
71 }
72
73 //__________________________________________________________________________________________________
74 AliRsnDaughterSelector::~AliRsnDaughterSelector()
75 {
76 //
77 // Destructor
78 //
79
80    AliDebug(AliLog::kDebug + 10, "<-");
81
82    fCutSetsN.Delete();
83    fCutSetsC.Delete();
84    fEntryListsN.Delete();
85    fEntryListsP.Delete();
86    fEntryListsM.Delete();
87
88    AliDebug(AliLog::kDebug + 10, "->");
89 }
90
91 //__________________________________________________________________________________________________
92 void AliRsnDaughterSelector::Print(Option_t *option) const
93 {
94 //
95 // Override TObject::Print()
96 //
97
98    TNamed::Print(option);
99
100    Int_t i, nSets;
101    AliRsnCutSet *set = 0x0;
102    TEntryList *list = 0x0;
103
104    // neutral
105    nSets = fCutSetsN.GetEntries();
106    for (i = 0; i < nSets; i++) {
107       set = (AliRsnCutSet *)fCutSetsN[i];
108       list = (TEntryList *)fEntryListsN[i];
109       AliInfo(Form("Neutral entry list for cut set '%s' has %d entries", set->GetName(), (Int_t)list->GetN()));
110    }
111
112    // charged
113    nSets = fCutSetsC.GetEntries();
114    for (i = 0; i < nSets; i++) {
115       set = (AliRsnCutSet *)fCutSetsC[i];
116       list = (TEntryList *)fEntryListsP[i];
117       AliInfo(Form("Positive entry list for cut set '%s' has %d entries", set->GetName(), (Int_t)list->GetN()));
118       list = (TEntryList *)fEntryListsM[i];
119       AliInfo(Form("Negative entry list for cut set '%s' has %d entries", set->GetName(), (Int_t)list->GetN()));
120    }
121 }
122
123 //__________________________________________________________________________________________________
124 void AliRsnDaughterSelector::Init()
125 {
126 //
127 // Initialize the arrays of entry lists to the same size
128 // of the corresponding arrays of cut sets.
129 // If they are not empty, they are cleared.
130 //
131
132    Int_t i, nSets;
133
134    // neutral
135    nSets = fCutSetsN.GetEntries();
136    if (!fEntryListsN.IsEmpty()) fEntryListsN.Delete();
137    for (i = 0; i < nSets; i++) {
138       AliRsnCutSet *set = (AliRsnCutSet *)fCutSetsN[i];
139       new (fEntryListsN[i]) TEntryList;
140       AliInfo(Form("Adding 1 entry list for neutrals --> cut set '%s' [scheme = '%s']", set->GetName(), set->GetCutScheme().Data()));
141    }
142
143    // charged
144    nSets = fCutSetsC.GetEntries();
145    if (!fEntryListsP.IsEmpty()) fEntryListsP.Delete();
146    if (!fEntryListsM.IsEmpty()) fEntryListsM.Delete();
147    for (i = 0; i < nSets; i++) {
148       AliRsnCutSet *set = (AliRsnCutSet *)fCutSetsC[i];
149       new (fEntryListsP[i]) TEntryList;
150       new (fEntryListsM[i]) TEntryList;
151       AliInfo(Form("Adding 2 entry lists for charged --> cut set '%s' [scheme = '%s']", set->GetName(), set->GetCutScheme().Data()));
152    }
153 }
154
155 //__________________________________________________________________________________________________
156 void AliRsnDaughterSelector::Reset()
157 {
158    TEntryList *el;
159    Int_t i, nSets;
160
161    // N
162    nSets = fCutSetsN.GetEntries();
163    for (i = 0; i < nSets; i++) {
164       el = (TEntryList *)fEntryListsN.At(i);
165       el->Reset();
166    }
167
168    // charged
169    nSets = fCutSetsC.GetEntries();
170    for (i = 0; i < nSets; i++) {
171       el = (TEntryList *)fEntryListsP.At(i);
172       el->Reset();
173       el = (TEntryList *)fEntryListsM.At(i);
174       el->Reset();
175    }
176 }
177
178 //__________________________________________________________________________________________________
179 Int_t AliRsnDaughterSelector::Add(AliRsnCutSet *cuts, Bool_t charged)
180 {
181 //
182 // Add a new selection slot defined by a set of cuts and daughter definition
183 //
184
185    Int_t n = 0;
186
187    if (!charged) {
188       n = fCutSetsN.GetEntries();
189       new (fCutSetsN[n]) AliRsnCutSet(*cuts);
190    } else {
191       n = fCutSetsC.GetEntries();
192       new (fCutSetsC[n]) AliRsnCutSet(*cuts);
193    }
194
195    return n;
196 }
197
198 //__________________________________________________________________________________________________
199 Int_t AliRsnDaughterSelector::GetID(const char *name, Bool_t charged)
200 {
201 //
202 // Add a new selection slot defined by a set of cuts and daughter definition
203 //
204
205    AliRsnCutSet *cuts;
206
207    if (!charged) {
208       cuts = (AliRsnCutSet *)fCutSetsN.FindObject(name);
209       if (cuts) return fCutSetsN.IndexOf(cuts);
210    } else {
211       cuts = (AliRsnCutSet *)fCutSetsC.FindObject(name);
212       if (cuts) return fCutSetsC.IndexOf(cuts);
213    }
214
215    return -1;
216 }
217
218 //__________________________________________________________________________________________________
219 TEntryList *AliRsnDaughterSelector::GetSelected(Int_t i, Char_t charge)
220 {
221 //
222 // Retrieve a given entry list (needs charge specified as a char)
223 //
224
225    if (charge == '+')
226       return (TEntryList *)fEntryListsP.At(i);
227    else if (charge == '-')
228       return (TEntryList *)fEntryListsM.At(i);
229    else
230       return (TEntryList *)fEntryListsN.At(i);
231 }
232
233 //__________________________________________________________________________________________________
234 TEntryList *AliRsnDaughterSelector::GetSelected(Int_t i, Short_t charge)
235 {
236 //
237 // Retrieve a given entry list passing charge as short
238 //
239
240    if (charge > 0)
241       return (TEntryList *)fEntryListsP.At(i);
242    else if (charge < 0)
243       return (TEntryList *)fEntryListsM.At(i);
244    else
245       return (TEntryList *)fEntryListsN.At(i);
246 }
247
248 //__________________________________________________________________________________________________
249 void AliRsnDaughterSelector::ScanEvent(AliRsnEvent *ev)
250 {
251 //
252 // Loop over event and fill all entry lists
253 //
254
255    Int_t id, is;
256    Int_t nSel, nTot = ev->GetAbsoluteSum();
257    AliRsnDaughter check;
258    TClonesArray *cutsArray = 0x0, *entryArray = 0x0;
259    TEntryList labelList;
260    TEntryList *el = 0;
261    AliRsnCutSet *cuts;
262    for (id = 0; id < nTot; id++) {
263       ev->SetDaughter(check, id);
264       // some checks
265       if (!check.GetRef()) {
266          AliDebugClass(1, Form("[%s]: daughter has NULL ref", GetName()));
267          continue;
268       }
269       if (!check.IsOK()) {
270          AliDebugClass(1, Form("[%s]: daughter is BAD", GetName()));
271          continue;
272       }
273       // set pointers according to charge
274       if (check.ChargeS() > 0) {
275          cutsArray = &fCutSetsC;
276          entryArray = &fEntryListsP;
277       } else if (check.ChargeS() < 0) {
278          cutsArray = &fCutSetsC;
279          entryArray = &fEntryListsM;
280       } else {
281          cutsArray = &fCutSetsN;
282          entryArray = &fEntryListsN;
283       }
284
285       if (fUseLabelCheck && labelList.Contains(check.GetLabel())) continue;
286
287       // check with all cuts in that charge
288       nSel = cutsArray->GetEntries();
289       for (is = 0; is < nSel; is++) {
290          cuts = (AliRsnCutSet *)cutsArray->At(is);
291          if (cuts->IsSelected(&check)) {
292             el = (TEntryList *)entryArray->At(is);
293             el->Enter(id);
294             if (fUseLabelCheck) labelList.Enter(check.GetLabel());
295          }
296       }
297    }
298
299    //Print();
300 }
301