]> git.uio.no Git - u/mrichter/AliRoot.git/blob - EVE/EveBase/AliEveEventSelector.cxx
Coverity
[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   if (!pESDTree || fString==str) return;//don't waist time
59   fString = str;
60   if (str == "" ) return;//on reset don't recalculate
61   pESDTree->Draw( ">>listofentries", fString, "entrylist");
62   fPEntryList = dynamic_cast<TEntryList*>(gDirectory->Get("listofentries"));
63 }
64
65 //_____________________________________________________________________________
66 void AliEveEventSelector::SetSelectionString( const char* str )
67 {
68   //selection string setter
69
70   TString ts = str;
71   SetSelectionString(ts);
72 }
73
74 //_____________________________________________________________________________
75 void AliEveEventSelector::SetTriggerType( const TString& type )
76 {
77   //trigger type setter
78
79   fTriggerType = type;
80 }
81
82 //_____________________________________________________________________________
83 void AliEveEventSelector::SetTriggerType( const char* type)
84 {
85   //trigger type setter
86
87   TString ts = type;
88   SetTriggerType(ts);
89 }
90
91 //_____________________________________________________________________________
92 void AliEveEventSelector::UpdateEntryList()
93 {
94   //update the entrylist from if file changed
95
96   TTree* pESDTree = fPEventManager->GetESDTree();
97   if (!pESDTree) return;
98   
99   Long64_t treesize = fPEventManager->GetMaxEventId()+1;
100   if (treesize<=fLastTreeSize) return; //nothing changed, do nothing
101   pESDTree->Draw(">>+fPEntryList", fString, "entrylist",
102                  fLastTreeSize+1, treesize-fLastTreeSize );
103   fLastTreeSize = treesize;
104 }
105
106 //_____________________________________________________________________________
107 void AliEveEventSelector::Update()
108 {
109   //refresh stuff
110
111   UpdateEntryList();
112 }
113
114 //_____________________________________________________________________________
115 Bool_t AliEveEventSelector::FindNext( Int_t& output )
116 {
117   //does the magick of selecting the next event
118
119   static const TEveException kEH("AliEveEventSelector::GetNext ");
120   
121   TTree* pESDTree = fPEventManager->GetESDTree();
122   if (!pESDTree) return kFALSE;
123   AliESDEvent* pESDEvent = fPEventManager->GetESD();
124   Int_t eventId = fPEventManager->GetEventId();
125   Int_t fMaxEventId = fPEventManager->GetMaxEventId();
126
127   if (!fSelectOnString)
128   {
129     // pure non-string
130     for (Int_t i = eventId+1; i<fMaxEventId+1; i++)
131     {
132       if (pESDTree->GetEntry(i) <= 0)
133         throw (kEH + "failed getting required event from ESD.");
134       if (CheckOtherSelection(pESDEvent))
135       {
136         output = i;
137         return kTRUE;
138       }
139     }
140     if (!fWrapAround) return kFALSE;
141     for (Int_t i = 0; i<eventId+1; i++)
142     {
143       if (pESDTree->GetEntry(i) <= 0)
144         throw (kEH + "failed getting required event from ESD.");
145       if (CheckOtherSelection(pESDEvent))
146       {
147         output = i;
148         return kTRUE;
149       }
150     }
151     return kFALSE;
152   }
153   else
154   {
155     //select using the entrylist
156     UpdateEntryList(); //update entry list if tree got bigger
157     for (Long64_t i=fEntryListId+1; i<fPEntryList->GetN(); i++ )
158     {
159       Long64_t entry = fPEntryList->GetEntry(i);
160       if (pESDTree->GetEntry(entry) <= 0)
161         throw (kEH + "failed getting required event from ESD.");
162       if (CheckOtherSelection(pESDEvent))
163       {
164         output = entry;
165         fEntryListId = i;
166         return kTRUE;
167       }
168     }
169     if (!fWrapAround) return kFALSE;
170     for (Long64_t i=0; i<fEntryListId+1; i++ )
171     {
172       Long64_t entry = fPEntryList->GetEntry(i);
173       if (pESDTree->GetEntry(entry) <= 0)
174         throw (kEH + "failed getting required event from ESD.");
175       if (CheckOtherSelection(pESDEvent))
176       {
177         output = entry;
178         fEntryListId=i;
179         return kTRUE;
180       }
181     }
182     return kFALSE;
183   }
184   return kFALSE;
185
186 }
187
188 //_____________________________________________________________________________
189 Bool_t AliEveEventSelector::FindPrev( Int_t& output )
190 {
191   //does the magick of selecting the previous event
192
193   static const TEveException kEH("AliEveEventSelector::GetNext ");
194   
195   TTree* pESDTree = fPEventManager->GetESDTree();
196   if (!pESDTree) return kFALSE;
197   AliESDEvent* pESDEvent = fPEventManager->GetESD();
198   Int_t eventId = fPEventManager->GetEventId();
199   Int_t fMaxEventId = fPEventManager->GetMaxEventId();
200
201   if (!fSelectOnString)
202   {
203     // pure non-string
204     for (Int_t i = eventId-1; i>-1; i--)
205     {
206       if (pESDTree->GetEntry(i) <= 0)
207         throw (kEH + "failed getting required event from ESD.");
208       if (CheckOtherSelection(pESDEvent))
209       {
210         output = i;
211         return kTRUE;
212       }
213     }
214     if (!fWrapAround) return kFALSE;
215     for (Int_t i = fMaxEventId; i>eventId-1; i--)
216     {
217       if (pESDTree->GetEntry(i) <= 0)
218         throw (kEH + "failed getting required event from ESD.");
219       if (CheckOtherSelection(pESDEvent))
220       {
221         output = i;
222         return kTRUE;
223       }
224     }
225     return kFALSE;
226   }
227   else
228   {
229     //select using the entrylist
230     for (Long64_t i=fEntryListId-1; i>-1; i--)
231     {
232       Long64_t entry = fPEntryList->GetEntry(i);
233       if (pESDTree->GetEntry(entry) <= 0)
234         throw (kEH + "failed getting required event from ESD.");
235       if (CheckOtherSelection(pESDEvent))
236       {
237         output = entry;
238         fEntryListId = i;
239         return kTRUE;
240       }
241     }
242     if (!fWrapAround) return kFALSE;
243     for (Long64_t i=fPEntryList->GetN()-1; i>fEntryListId-1; i--)
244     {
245       Long64_t entry = fPEntryList->GetEntry(i);
246       if (pESDTree->GetEntry(entry) <= 0)
247         throw (kEH + "failed getting required event from ESD.");
248       if (CheckOtherSelection(pESDEvent))
249       {
250         output = entry;
251         fEntryListId=i;
252         return kTRUE;
253       }
254     }
255     return kFALSE;
256   }
257   return kFALSE;
258 }
259
260 //_____________________________________________________________________________
261 Bool_t AliEveEventSelector::CheckOtherSelection( AliESDEvent* pESDEvent )
262 {
263   //checks the event for any other hardcoded selection criteria
264   
265   Bool_t ret=kTRUE;
266
267   //trigger stuff
268   if (fSelectOnTriggerType)
269   {
270     TString firedtrclasses = pESDEvent->GetFiredTriggerClasses();
271     if (!(firedtrclasses.Contains(fTriggerType))) return kFALSE;
272     //if (!pESDEvent->IsTriggerClassFired(fTriggerType.Data())) return kFALSE;
273   }
274
275   if (fSelectOnMultiplicity)
276   {
277     Int_t mult = pESDEvent->GetNumberOfTracks();
278     Int_t mhigh = (fMultiplicityHigh==0)?100000000:fMultiplicityHigh;
279     if (mult<fMultiplicityLow || mult>mhigh) return kFALSE;
280   }
281
282   if (fSelectOnTriggerString)
283   {
284     ULong64_t triggermask = pESDEvent->GetTriggerMask();
285     TString triggermaskstr;
286     triggermaskstr += triggermask;
287     TString selstr(fTriggerSelectionString); //make copy
288     selstr.ReplaceAll(fTriggerMaskPatternString,triggermaskstr);
289     //Int_t returncode;
290     Bool_t result = static_cast<Bool_t>(gROOT->ProcessLine(selstr));//,&returncode));
291     //if (!returncode) return kFALSE;
292     if (!result) return kFALSE;
293   }
294
295   return ret;
296 }
297
298 //_____________________________________________________________________________
299 void AliEveEventSelector::SetTriggerSelectionString( TString str )
300 {
301   //parses and sets the trigger selection formula
302   
303   const AliESDRun* run = fPEventManager->GetESD()->GetESDRun();
304   for (Int_t i=0; i<run->kNTriggerClasses; i++)
305   {
306     TString name(run->GetTriggerClass(i));
307     if (name.IsNull()) continue;
308     TString valuestr("(");
309     valuestr += fTriggerMaskPatternString;
310     valuestr += "&";
311     valuestr += static_cast<ULong64_t>(1<<i);
312     valuestr += ")";
313     str.ReplaceAll(name,valuestr);
314   }//for i
315   fTriggerSelectionString = str;
316 }
317