]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveBase/AliEveEventSelector.cxx
Missing #ifdef ZMQ added in AliEveEventManager.cxx
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventSelector.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
3  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
4  * full copyright notice.                                                 *
5  **************************************************************************/
6
7 ////////////////////////////////////////////////////////////////////////////
8 //
9 //  AliEveEventSelector class
10 //  selects events according to given criteria
11 //
12 //  origin: Mikolaj Krzewicki, Nikhef, Mikolaj.Krzewicki@cern.ch
13 //
14 ////////////////////////////////////////////////////////////////////////////
15
16 #include "AliEveEventSelector.h"
17 #include "AliEveEventManager.h"
18 #include "AliESD.h"
19 #include "AliESDEvent.h"
20 #include "AliESDRun.h"
21 #include <TEntryList.h>
22 #include <TDirectory.h>
23 #include <TTree.h>
24 #include <TObjArray.h>
25 #include <TRegexp.h>
26 #include <TROOT.h>
27
28 ClassImp(AliEveEventSelector)
29
30 //_____________________________________________________________________________
31 AliEveEventSelector::AliEveEventSelector(AliEveEventManager* evman):
32     fPEventManager(evman),
33     fWrapAround(kFALSE),
34     fSelectOnString(kFALSE),
35     fString(""),
36     fPEntryList(0),
37     fEntryListId(0),
38     fLastTreeSize(-1),
39     fSelectOnTriggerType(kFALSE),
40     fTriggerType(""),
41     fSelectOnTriggerString(kFALSE),
42     fTriggerSelectionString(""),
43     fTriggerMaskPatternString("trgmask"),
44     fSelectOnMultiplicity(kFALSE),
45     fMultiplicityLow(0),
46     fMultiplicityHigh(0)
47 {
48     //ctor
49 }
50
51 //_____________________________________________________________________________
52 void AliEveEventSelector::SetSelectionString( const TString& str )
53 {
54     //selection string setter
55     //takes care of producing a list of entries passing selection
56
57     TTree* pESDTree    = fPEventManager->GetESDTree();
58     TTree* pHLTESDTree = fPEventManager->GetHLTESDTree();
59     if ((!pESDTree && !pHLTESDTree) || fString==str) return;//don't waist time
60     fString = str;
61     if (str == "" ) return;//on reset don't recalculate
62
63     if(pESDTree!=0)    pESDTree->Draw( ">>listofentries", fString, "entrylist");
64     if(pHLTESDTree!=0) pHLTESDTree->Draw( ">>listofentries", fString, "entrylist");
65
66     fPEntryList = dynamic_cast<TEntryList*>(gDirectory->Get("listofentries"));
67 }
68
69 //_____________________________________________________________________________
70 void AliEveEventSelector::SetSelectionString( const char* str )
71 {
72     //selection string setter
73
74     TString ts = str;
75     SetSelectionString(ts);
76 }
77
78 //_____________________________________________________________________________
79 void AliEveEventSelector::SetTriggerType( const TString& type )
80 {
81     //trigger type setter
82
83     fTriggerType = type;
84 }
85
86 //_____________________________________________________________________________
87 void AliEveEventSelector::SetTriggerType( const char* type)
88 {
89     //trigger type setter
90
91     TString ts = type;
92     SetTriggerType(ts);
93 }
94
95 //_____________________________________________________________________________
96 void AliEveEventSelector::UpdateEntryList()
97 {
98     //update the entrylist from if file changed
99
100     TTree* pESDTree = fPEventManager->GetESDTree();
101     TTree* pHLTESDTree = fPEventManager->GetHLTESDTree();
102
103     if (!pESDTree && !pHLTESDTree) return;
104
105     Long64_t treesize = fPEventManager->GetMaxEventId()+1;
106     if (treesize<=fLastTreeSize) return; //nothing changed, do nothing
107
108
109     if(pESDTree) pESDTree->Draw(">>+fPEntryList", fString, "entrylist", fLastTreeSize+1, treesize-fLastTreeSize );
110     if(pHLTESDTree) pHLTESDTree->Draw(">>+fPEntryList", fString, "entrylist", fLastTreeSize+1, treesize-fLastTreeSize );
111
112     fLastTreeSize = treesize;
113 }
114
115 //_____________________________________________________________________________
116 void AliEveEventSelector::Update()
117 {
118     //refresh stuff
119
120     UpdateEntryList();
121 }
122
123 //_____________________________________________________________________________
124 Bool_t AliEveEventSelector::FindNext( Int_t& output )
125 {
126     //does the magick of selecting the next event
127
128     static const TEveException kEH("AliEveEventSelector::GetNext ");
129
130     TTree* pESDTree = fPEventManager->GetESDTree();
131     TTree* pHLTESDTree = fPEventManager->GetHLTESDTree();
132
133     if (!pESDTree && !pHLTESDTree) return kFALSE;
134
135     Bool_t OfflineHasNext=kFALSE;
136     Bool_t HLTHasNext=kFALSE;
137
138     if(pESDTree)   OfflineHasNext = FindNextInTree(pESDTree, output);
139     if(pHLTESDTree)HLTHasNext = FindNextInTree(pHLTESDTree,output);
140
141     return (OfflineHasNext | HLTHasNext);
142 }
143
144 Bool_t AliEveEventSelector::FindNextInTree(TTree* tree, Int_t& output)
145 {
146     if(!tree) return kFALSE;
147
148     static const TEveException kEH("AliEveEventSelector::FindNextInTree ");
149
150     AliESDEvent* pESDEvent = fPEventManager->GetESD();
151     Int_t eventId = fPEventManager->GetEventId();
152     Int_t fMaxEventId = fPEventManager->GetMaxEventId();
153
154     if (!fSelectOnString)
155     {
156         // pure non-string
157         for (Int_t i = eventId+1; i<fMaxEventId+1; i++)
158         {
159             if (tree->GetEntry(i) <= 0)
160                 throw (kEH + "failed getting required event from ESD.");
161             if (CheckOtherSelection(pESDEvent))
162             {
163                 output = i;
164                 return kTRUE;
165             }
166         }
167         if (!fWrapAround) return kFALSE;
168         for (Int_t i = 0; i<eventId+1; i++)
169         {
170             if (tree->GetEntry(i) <= 0)
171                 throw (kEH + "failed getting required event from ESD.");
172             if (CheckOtherSelection(pESDEvent))
173             {
174                 output = i;
175                 return kTRUE;
176             }
177         }
178         return kFALSE;
179     }
180     else
181     {
182         //select using the entrylist
183         UpdateEntryList(); //update entry list if tree got bigger
184         for (Long64_t i=fEntryListId+1; i<fPEntryList->GetN(); i++ )
185         {
186             Long64_t entry = fPEntryList->GetEntry(i);
187             if (tree->GetEntry(entry) <= 0)
188                 throw (kEH + "failed getting required event from ESD.");
189             if (CheckOtherSelection(pESDEvent))
190             {
191                 output = entry;
192                 fEntryListId = i;
193                 return kTRUE;
194             }
195         }
196         if (!fWrapAround) return kFALSE;
197         for (Long64_t i=0; i<fEntryListId+1; i++ )
198         {
199             Long64_t entry = fPEntryList->GetEntry(i);
200             if (tree->GetEntry(entry) <= 0)
201                 throw (kEH + "failed getting required event from ESD.");
202             if (CheckOtherSelection(pESDEvent))
203             {
204                 output = entry;
205                 fEntryListId=i;
206                 return kTRUE;
207             }
208         }
209         return kFALSE;
210     }
211     return kFALSE;
212
213 }
214
215 //_____________________________________________________________________________
216 Bool_t AliEveEventSelector::FindPrev( Int_t& output )
217 {
218     //does the magick of selecting the previous event
219     TTree* pESDTree = fPEventManager->GetESDTree();
220     TTree* pHLTESDTree = fPEventManager->GetHLTESDTree();
221
222     if (!pESDTree && !pHLTESDTree) return kFALSE;
223
224     Bool_t OfflineHasNext=kFALSE;
225     Bool_t HLTHasNext=kFALSE;
226
227     if(pESDTree)    OfflineHasNext = FindPrevInTree(pESDTree, output);
228     if(pHLTESDTree) HLTHasNext = FindPrevInTree(pHLTESDTree,output);
229
230     return (OfflineHasNext | HLTHasNext);
231 }
232
233
234 Bool_t AliEveEventSelector::FindPrevInTree(TTree* tree, Int_t& output)
235 {
236     static const TEveException kEH("AliEveEventSelector::FindPrevInTree ");
237
238     AliESDEvent* pESDEvent = fPEventManager->GetESD();
239     Int_t eventId = fPEventManager->GetEventId();
240     Int_t fMaxEventId = fPEventManager->GetMaxEventId();
241
242     if (!fSelectOnString)
243     {
244         // pure non-string
245         for (Int_t i = eventId-1; i>-1; i--)
246         {
247             if (tree->GetEntry(i) <= 0)
248                 throw (kEH + "failed getting required event from ESD.");
249             if (CheckOtherSelection(pESDEvent))
250             {
251                 output = i;
252                 return kTRUE;
253             }
254         }
255         if (!fWrapAround) return kFALSE;
256         for (Int_t i = fMaxEventId; i>eventId-1; i--)
257         {
258             if (tree->GetEntry(i) <= 0)
259                 throw (kEH + "failed getting required event from ESD.");
260             if (CheckOtherSelection(pESDEvent))
261             {
262                 output = i;
263                 return kTRUE;
264             }
265         }
266         return kFALSE;
267     }
268     else
269     {
270         //select using the entrylist
271         for (Long64_t i=fEntryListId-1; i>-1; i--)
272         {
273             Long64_t entry = fPEntryList->GetEntry(i);
274             if (tree->GetEntry(entry) <= 0)
275                 throw (kEH + "failed getting required event from ESD.");
276             if (CheckOtherSelection(pESDEvent))
277             {
278                 output = entry;
279                 fEntryListId = i;
280                 return kTRUE;
281             }
282         }
283         if (!fWrapAround) return kFALSE;
284         for (Long64_t i=fPEntryList->GetN()-1; i>fEntryListId-1; i--)
285         {
286             Long64_t entry = fPEntryList->GetEntry(i);
287             if (tree->GetEntry(entry) <= 0)
288                 throw (kEH + "failed getting required event from ESD.");
289             if (CheckOtherSelection(pESDEvent))
290             {
291                 output = entry;
292                 fEntryListId=i;
293                 return kTRUE;
294             }
295         }
296         return kFALSE;
297     }
298     return kFALSE;
299 }
300
301 //_____________________________________________________________________________
302 Bool_t AliEveEventSelector::CheckOtherSelection( AliESDEvent* pESDEvent )
303 {
304     //checks the event for any other hardcoded selection criteria
305
306     Bool_t ret=kTRUE;
307
308     //trigger stuff
309     if (fSelectOnTriggerType)
310     {
311         TString firedtrclasses = pESDEvent->GetFiredTriggerClasses();
312         if (!(firedtrclasses.Contains(fTriggerType))) return kFALSE;
313         //if (!pESDEvent->IsTriggerClassFired(fTriggerType.Data())) return kFALSE;
314     }
315
316     if (fSelectOnMultiplicity)
317     {
318         Int_t mult = pESDEvent->GetNumberOfTracks();
319         Int_t mhigh = (fMultiplicityHigh==0)?100000000:fMultiplicityHigh;
320         if (mult<fMultiplicityLow || mult>mhigh) return kFALSE;
321     }
322
323     if (fSelectOnTriggerString)
324     {
325         ULong64_t triggermask = pESDEvent->GetTriggerMask();
326         TString triggermaskstr;
327         triggermaskstr += triggermask;
328         TString selstr(fTriggerSelectionString); //make copy
329         selstr.ReplaceAll(fTriggerMaskPatternString,triggermaskstr);
330         //Int_t returncode;
331         Bool_t result = static_cast<Bool_t>(gROOT->ProcessLine(selstr));//,&returncode));
332         //if (!returncode) return kFALSE;
333         if (!result) return kFALSE;
334     }
335
336     return ret;
337 }
338
339 //_____________________________________________________________________________
340 void AliEveEventSelector::SetTriggerSelectionString( TString str )
341 {
342     //parses and sets the trigger selection formula
343
344     const AliESDRun* run = fPEventManager->GetESD()->GetESDRun();
345     for (Int_t i=0; i<run->kNTriggerClasses; i++)
346     {
347         TString name(run->GetTriggerClass(i));
348         if (name.IsNull()) continue;
349         TString valuestr("(");
350         valuestr += fTriggerMaskPatternString;
351         valuestr += "&";
352         valuestr += static_cast<ULong64_t>(1)<<i;
353         valuestr += ")";
354         str.ReplaceAll(name,valuestr);
355     }//for i
356     fTriggerSelectionString = str;
357 }
358