1 #include "AliAnalysisMuMuCutRegistry.h"
5 * \ingroup pwg-muon-mumu
7 * \class AliAnalysisMuMuCutRegistry
8 * The cut elements and cut combinations are stored per type, i.e. there's a set for
9 * event cuts/combinations, a set for track cuts/combinations, and a set for track pair cuts/combinations.
11 * To define a new cut use the AddEventCut, AddTrackCut, AndTrackPairCut and AddTriggerClassCut methods.
13 * To add an existing cut see AddCutElement.
15 * To define the negation of a cut, use the Not method.
17 * To add a new combination use one of the AddCutCombination methods, depending on the number
18 * of cut element(s) the combination is made of.
20 * Note that what the sub-analysis are really concerned with are cut combinations (i.e. if
21 * you fail to define any combination, nothing will be cut, whatever the number of cut elements
24 * This class also defines a few default control cut elements aptly named AlwaysTrue.
30 #include "TMethodCall.h"
31 #include "AliVEvent.h"
33 #include "AliAnalysisMuMuCutElement.h"
34 #include "AliAnalysisMuMuCutCombination.h"
35 #include "TObjArray.h"
36 #include "Riostream.h"
39 ClassImp(AliAnalysisMuMuCutRegistry)
41 //_____________________________________________________________________________
42 AliAnalysisMuMuCutRegistry::AliAnalysisMuMuCutRegistry()
50 //_____________________________________________________________________________
51 AliAnalysisMuMuCutRegistry::~AliAnalysisMuMuCutRegistry()
56 delete fCutCombinations;
59 //_____________________________________________________________________________
60 Int_t AliAnalysisMuMuCutRegistry::AddCutCombination(const TObjArray& cutElements)
62 /// Add a cut combination composed of the cuts in the cutElements array.
64 /// \return 1 in case of success, 0 if already there, -1 failure
66 if ( cutElements.IsEmpty() ) return -1;
68 AliAnalysisMuMuCutCombination* cutCombination = new AliAnalysisMuMuCutCombination;
70 TIter next(&cutElements);
71 AliAnalysisMuMuCutElement* ce;
73 while ( ( ce = static_cast<AliAnalysisMuMuCutElement*>(next()) ) )
75 cutCombination->Add(ce);
78 if ( GetCutCombinations(AliAnalysisMuMuCutElement::kAny)->FindObject(cutCombination) )
80 delete cutCombination;
84 GetCutCombinations(AliAnalysisMuMuCutElement::kAny)->Add(cutCombination);
86 if ( cutCombination->IsEventCutter() || cutCombination->IsEventHandlerCutter() )
88 GetCutCombinations(AliAnalysisMuMuCutElement::kEvent)->Add(cutCombination);
91 if ( cutCombination->IsTrackCutter() )
93 GetCutCombinations(AliAnalysisMuMuCutElement::kTrack)->Add(cutCombination);
96 if ( cutCombination->IsTrackPairCutter() )
98 GetCutCombinations(AliAnalysisMuMuCutElement::kTrackPair)->Add(cutCombination);
101 if ( cutCombination->IsTriggerClassCutter() )
103 GetCutCombinations(AliAnalysisMuMuCutElement::kTriggerClass)->Add(cutCombination);
109 //_____________________________________________________________________________
110 Int_t AliAnalysisMuMuCutRegistry::AddCutCombination(AliAnalysisMuMuCutElement* ce1)
112 /// Convenience method to create a cut combination made of a single cut
113 TObjArray cutElements;
114 if ( ce1 ) cutElements.Add(ce1);
115 return AddCutCombination(cutElements);
118 //_____________________________________________________________________________
119 Int_t AliAnalysisMuMuCutRegistry::AddCutCombination(AliAnalysisMuMuCutElement* ce1,
120 AliAnalysisMuMuCutElement* ce2)
122 /// Convenience method to create a cut combination made of 2 cuts
123 TObjArray cutElements;
124 if ( ce1 ) cutElements.Add(ce1);
125 if ( ce2 ) cutElements.Add(ce2);
126 return AddCutCombination(cutElements);
129 //_____________________________________________________________________________
130 Int_t AliAnalysisMuMuCutRegistry::AddCutCombination(AliAnalysisMuMuCutElement* ce1,
131 AliAnalysisMuMuCutElement* ce2,
132 AliAnalysisMuMuCutElement* ce3)
134 /// Convenience method to create a cut combination made of 3 cuts
135 TObjArray cutElements;
136 if ( ce1 ) cutElements.Add(ce1);
137 if ( ce2 ) cutElements.Add(ce2);
138 if ( ce3 ) cutElements.Add(ce3);
139 return AddCutCombination(cutElements);
142 //_____________________________________________________________________________
143 Int_t AliAnalysisMuMuCutRegistry::AddCutCombination(AliAnalysisMuMuCutElement* ce1, AliAnalysisMuMuCutElement* ce2, AliAnalysisMuMuCutElement* ce3,
144 AliAnalysisMuMuCutElement* ce4)
146 /// Convenience method to create a cut combination made of 4 cuts
147 TObjArray cutElements;
148 if ( ce1 ) cutElements.Add(ce1);
149 if ( ce2 ) cutElements.Add(ce2);
150 if ( ce3 ) cutElements.Add(ce3);
151 if ( ce4 ) cutElements.Add(ce4);
152 return AddCutCombination(cutElements);
154 //_____________________________________________________________________________
155 Int_t AliAnalysisMuMuCutRegistry::AddCutCombination(AliAnalysisMuMuCutElement* ce1, AliAnalysisMuMuCutElement* ce2, AliAnalysisMuMuCutElement* ce3,
156 AliAnalysisMuMuCutElement* ce4, AliAnalysisMuMuCutElement* ce5)
158 /// Convenience method to create a cut combination made of 5 cuts
160 TObjArray cutElements;
161 if ( ce1 ) cutElements.Add(ce1);
162 if ( ce2 ) cutElements.Add(ce2);
163 if ( ce3 ) cutElements.Add(ce3);
164 if ( ce4 ) cutElements.Add(ce4);
165 if ( ce5 ) cutElements.Add(ce5);
166 return AddCutCombination(cutElements);
169 //_____________________________________________________________________________
170 Int_t AliAnalysisMuMuCutRegistry::AddCutCombination(AliAnalysisMuMuCutElement* ce1, AliAnalysisMuMuCutElement* ce2, AliAnalysisMuMuCutElement* ce3,
171 AliAnalysisMuMuCutElement* ce4, AliAnalysisMuMuCutElement* ce5, AliAnalysisMuMuCutElement* ce6)
173 /// Convenience method to create a cut combination made of 6 cuts
175 TObjArray cutElements;
176 if ( ce1 ) cutElements.Add(ce1);
177 if ( ce2 ) cutElements.Add(ce2);
178 if ( ce3 ) cutElements.Add(ce3);
179 if ( ce4 ) cutElements.Add(ce4);
180 if ( ce5 ) cutElements.Add(ce5);
181 if ( ce6 ) cutElements.Add(ce6);
182 return AddCutCombination(cutElements);
185 //_____________________________________________________________________________
186 AliAnalysisMuMuCutElement*
187 AliAnalysisMuMuCutRegistry::CreateCutElement(AliAnalysisMuMuCutElement::ECutType type,
189 const char* cutMethodName,
190 const char* cutMethodPrototype,
191 const char* defaultParameters)
193 /** Create a cut element. See the ctor of AliAnalysisMuMuCutElement for the meaning
197 AliAnalysisMuMuCutElement* ce = new AliAnalysisMuMuCutElement(type,cutClass,cutMethodName,cutMethodPrototype,defaultParameters);
199 AliAnalysisMuMuCutElement* added = AddCutElement(ce);
209 //_____________________________________________________________________________
210 AliAnalysisMuMuCutElement*
211 AliAnalysisMuMuCutRegistry::AddCutElement(AliAnalysisMuMuCutElement* ce)
213 /// Add an existing cut element to the registry if it is valid
215 if ( ce && ce->IsValid() )
217 if (!GetCutElements(AliAnalysisMuMuCutElement::kAny)->FindObject(ce))
219 GetCutElements(AliAnalysisMuMuCutElement::kAny)->Add(ce);
220 if ( ce->IsEventCutter() || ce->IsEventHandlerCutter() )
222 GetCutElements(AliAnalysisMuMuCutElement::kEvent)->Add(ce);
224 else if ( ce->IsTrackCutter() )
226 GetCutElements(AliAnalysisMuMuCutElement::kTrack)->Add(ce);
228 else if ( ce->IsTrackPairCutter() )
230 GetCutElements(AliAnalysisMuMuCutElement::kTrackPair)->Add(ce);
232 else if ( ce->IsTriggerClassCutter() )
234 GetCutElements(AliAnalysisMuMuCutElement::kTriggerClass)->Add(ce);
242 //_____________________________________________________________________________
243 AliAnalysisMuMuCutElement* AliAnalysisMuMuCutRegistry::AddEventCut(TObject& cutClass,
244 const char* cutMethodName,
245 const char* cutMethodPrototype,
246 const char* defaultParameters)
248 /// Shortcut method to create a cut element of type kEvent
249 return CreateCutElement(AliAnalysisMuMuCutElement::kEvent,cutClass,cutMethodName,
250 cutMethodPrototype,defaultParameters);
253 //_____________________________________________________________________________
254 AliAnalysisMuMuCutElement* AliAnalysisMuMuCutRegistry::AddTrackCut(TObject& cutClass,
255 const char* cutMethodName,
256 const char* cutMethodPrototype,
257 const char* defaultParameters)
259 /// Shortcut method to create a cut element of type kTrack
260 return CreateCutElement(AliAnalysisMuMuCutElement::kTrack,cutClass,cutMethodName,
261 cutMethodPrototype,defaultParameters);
264 //_____________________________________________________________________________
265 AliAnalysisMuMuCutElement* AliAnalysisMuMuCutRegistry::AddTrackPairCut(TObject& cutClass,
266 const char* cutMethodName,
267 const char* cutMethodPrototype,
268 const char* defaultParameters)
270 /// Shortcut method to create a cut element of type kTrackPair
271 return CreateCutElement(AliAnalysisMuMuCutElement::kTrackPair,cutClass,cutMethodName,
272 cutMethodPrototype,defaultParameters);
275 //_____________________________________________________________________________
276 AliAnalysisMuMuCutElement* AliAnalysisMuMuCutRegistry::AddTriggerClassCut(TObject& cutClass,
277 const char* cutMethodName,
278 const char* cutMethodPrototype,
279 const char* defaultParameters)
281 /// Shortcut method to create a cut element of type kTriggerClass
282 return CreateCutElement(AliAnalysisMuMuCutElement::kTriggerClass,cutClass,cutMethodName,
283 cutMethodPrototype,defaultParameters);
286 //_____________________________________________________________________________
287 const TObjArray* AliAnalysisMuMuCutRegistry::GetCutCombinations(AliAnalysisMuMuCutElement::ECutType type) const
289 /// Get (and create if not already done) the array of cut combinations of the given type
291 if (!fCutCombinations) return 0x0;
293 return static_cast<TObjArray*>(fCutCombinations->At(type));
296 //_____________________________________________________________________________
297 TObjArray* AliAnalysisMuMuCutRegistry::GetCutCombinations(AliAnalysisMuMuCutElement::ECutType type)
299 /// Get (and create if not already done) the array of cut combinations of the given type
301 if (!fCutCombinations)
303 // the fCutCombinations array will be the owner of all the cut combinations
305 Int_t N = AliAnalysisMuMuCutElement::kAny + 1;
307 fCutCombinations = new TObjArray(N);
308 fCutCombinations->SetOwner(kTRUE);
310 for ( Int_t i = 0; i < N; ++i )
312 TObjArray* array = new TObjArray;
313 array->SetOwner(kFALSE);
314 if (i==AliAnalysisMuMuCutElement::kAny)
316 // only the first array, containing all the combinations
317 // is the owner of the combinations
318 // the other arrays are just pointing to those
319 array->SetOwner(kTRUE);
321 fCutCombinations->AddAt(array,i);
324 return static_cast<TObjArray*>(fCutCombinations->At(type));
327 //_____________________________________________________________________________
328 const TObjArray* AliAnalysisMuMuCutRegistry::GetCutElements(AliAnalysisMuMuCutElement::ECutType type) const
330 /// Get the array of cut elements of the given type. Return 0x0 if the array does not exist yet
332 if (!fCutElements) return 0x0;
334 return static_cast<TObjArray*>(fCutElements->At(type));
337 //_____________________________________________________________________________
338 TObjArray* AliAnalysisMuMuCutRegistry::GetCutElements(AliAnalysisMuMuCutElement::ECutType type)
340 /// Get (and create if not already done) the array of cut elements of the given type
344 // owner of all the cut elements
345 Int_t N = AliAnalysisMuMuCutElement::kAny + 1;
346 fCutElements = new TObjArray(N);
347 fCutElements->SetOwner(kTRUE);
349 for ( Int_t i = 0; i < N; ++i )
351 TObjArray* array = new TObjArray;
352 array->SetOwner(kFALSE);
353 if (i == AliAnalysisMuMuCutElement::kAny )
355 // only the first array is the owner of the cuts
356 // the other ones are just pointing to this one
357 array->SetOwner(kTRUE);
359 fCutElements->AddAt(array,i);
362 return static_cast<TObjArray*>(fCutElements->At(type));
365 //_____________________________________________________________________________
366 AliAnalysisMuMuCutElement* AliAnalysisMuMuCutRegistry::Not(const AliAnalysisMuMuCutElement& cutElement)
368 /// Create a cut which is the opposite of cutElement, and adds it.
370 AliAnalysisMuMuCutElementBar* bar = new AliAnalysisMuMuCutElementBar(cutElement);
372 AliAnalysisMuMuCutElement* added = AddCutElement(bar);
382 //_____________________________________________________________________________
383 void AliAnalysisMuMuCutRegistry::Print(Option_t* opt) const
390 std::cout << "++++ Cut combinations defined : " << std::endl;
392 AliAnalysisMuMuCutElement::ECutType cutTypes[] = { AliAnalysisMuMuCutElement::kEvent, AliAnalysisMuMuCutElement::kTrack,
393 AliAnalysisMuMuCutElement::kTrackPair, AliAnalysisMuMuCutElement::kTriggerClass };
397 for ( Int_t iCutType = 0; iCutType < 4; ++iCutType )
399 if (GetCutElements(cutTypes[iCutType])->IsEmpty()) continue;
400 std::cout << " Cutting on " << AliAnalysisMuMuCutElement::CutTypeName(cutTypes[iCutType]) << std::endl;
401 TIter next(GetCutCombinations(cutTypes[iCutType]));
402 AliAnalysisMuMuCutCombination* cutCombination;
404 while ( ( cutCombination = static_cast<AliAnalysisMuMuCutCombination*>(next())) )
406 std::cout << Form(" %4d ",i);
407 cutCombination->Print(" ");
412 if ( sopt.Contains("FULL") || sopt.Contains("ALL") )
414 std::cout << "++++ Individual cuts defined : " << std::endl;
416 for ( Int_t iCutType = 0; iCutType < 4; ++iCutType )
418 if (GetCutElements(cutTypes[iCutType])->IsEmpty()) continue;
419 std::cout << " Cutting on " << AliAnalysisMuMuCutElement::CutTypeName(cutTypes[iCutType]) << std::endl;
420 TIter nextCutRef(GetCutElements(cutTypes[iCutType]));
421 AliAnalysisMuMuCutElement* ce;
423 while ( ( ce = static_cast<AliAnalysisMuMuCutElement*>(nextCutRef()) ) )
425 std::cout << Form("%4d ",i);