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 **************************************************************************/
7 ////////////////////////////////////////////////////////////////////////////
9 // AliEveEventSelector class
10 // selects events according to given criteria
12 // origin: Mikolaj Krzewicki, Nikhef, Mikolaj.Krzewicki@cern.ch
14 ////////////////////////////////////////////////////////////////////////////
16 #include "AliEveEventSelector.h"
17 #include "AliEveEventManager.h"
19 #include "AliESDEvent.h"
20 #include "AliESDRun.h"
21 #include <TEntryList.h>
22 #include <TDirectory.h>
24 #include <TObjArray.h>
28 ClassImp(AliEveEventSelector)
30 //_____________________________________________________________________________
31 AliEveEventSelector::AliEveEventSelector(AliEveEventManager* evman):
32 fPEventManager(evman),
34 fSelectOnString(kFALSE),
39 fSelectOnTriggerType(kFALSE),
41 fSelectOnTriggerString(kFALSE),
42 fTriggerSelectionString(""),
43 fTriggerMaskPatternString("trgmask"),
44 fSelectOnMultiplicity(kFALSE),
51 //_____________________________________________________________________________
52 void AliEveEventSelector::SetSelectionString( const TString& str )
54 //selection string setter
55 //takes care of producing a list of entries passing selection
57 TTree* pESDTree = fPEventManager->GetESDTree();
58 TTree* pHLTESDTree = fPEventManager->GetHLTESDTree();
59 if ((!pESDTree && !pHLTESDTree) || fString==str) return;//don't waist time
61 if (str == "" ) return;//on reset don't recalculate
63 if(pESDTree!=0) pESDTree->Draw( ">>listofentries", fString, "entrylist");
64 if(pHLTESDTree!=0) pHLTESDTree->Draw( ">>listofentries", fString, "entrylist");
66 fPEntryList = dynamic_cast<TEntryList*>(gDirectory->Get("listofentries"));
69 //_____________________________________________________________________________
70 void AliEveEventSelector::SetSelectionString( const char* str )
72 //selection string setter
75 SetSelectionString(ts);
78 //_____________________________________________________________________________
79 void AliEveEventSelector::SetTriggerType( const TString& type )
86 //_____________________________________________________________________________
87 void AliEveEventSelector::SetTriggerType( const char* type)
95 //_____________________________________________________________________________
96 void AliEveEventSelector::UpdateEntryList()
98 //update the entrylist from if file changed
100 TTree* pESDTree = fPEventManager->GetESDTree();
101 TTree* pHLTESDTree = fPEventManager->GetHLTESDTree();
103 if (!pESDTree && !pHLTESDTree) return;
105 Long64_t treesize = fPEventManager->GetMaxEventId()+1;
106 if (treesize<=fLastTreeSize) return; //nothing changed, do nothing
109 if(pESDTree) pESDTree->Draw(">>+fPEntryList", fString, "entrylist", fLastTreeSize+1, treesize-fLastTreeSize );
110 if(pHLTESDTree) pHLTESDTree->Draw(">>+fPEntryList", fString, "entrylist", fLastTreeSize+1, treesize-fLastTreeSize );
112 fLastTreeSize = treesize;
115 //_____________________________________________________________________________
116 void AliEveEventSelector::Update()
123 //_____________________________________________________________________________
124 Bool_t AliEveEventSelector::FindNext( Int_t& output )
126 //does the magick of selecting the next event
128 static const TEveException kEH("AliEveEventSelector::GetNext ");
130 TTree* pESDTree = fPEventManager->GetESDTree();
131 TTree* pHLTESDTree = fPEventManager->GetHLTESDTree();
133 if (!pESDTree && !pHLTESDTree) return kFALSE;
135 Bool_t OfflineHasNext=kFALSE;
136 Bool_t HLTHasNext=kFALSE;
138 if(pESDTree) OfflineHasNext = FindNextInTree(pESDTree, output);
139 if(pHLTESDTree)HLTHasNext = FindNextInTree(pHLTESDTree,output);
141 return (OfflineHasNext | HLTHasNext);
144 Bool_t AliEveEventSelector::FindNextInTree(TTree* tree, Int_t& output)
146 if(!tree) return kFALSE;
148 static const TEveException kEH("AliEveEventSelector::FindNextInTree ");
150 AliESDEvent* pESDEvent = fPEventManager->GetESD();
151 Int_t eventId = fPEventManager->GetEventId();
152 Int_t fMaxEventId = fPEventManager->GetMaxEventId();
154 if (!fSelectOnString)
157 for (Int_t i = eventId+1; i<fMaxEventId+1; i++)
159 if (tree->GetEntry(i) <= 0)
160 throw (kEH + "failed getting required event from ESD.");
161 if (CheckOtherSelection(pESDEvent))
167 if (!fWrapAround) return kFALSE;
168 for (Int_t i = 0; i<eventId+1; i++)
170 if (tree->GetEntry(i) <= 0)
171 throw (kEH + "failed getting required event from ESD.");
172 if (CheckOtherSelection(pESDEvent))
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++ )
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))
196 if (!fWrapAround) return kFALSE;
197 for (Long64_t i=0; i<fEntryListId+1; i++ )
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))
215 //_____________________________________________________________________________
216 Bool_t AliEveEventSelector::FindPrev( Int_t& output )
218 //does the magick of selecting the previous event
219 TTree* pESDTree = fPEventManager->GetESDTree();
220 TTree* pHLTESDTree = fPEventManager->GetHLTESDTree();
222 if (!pESDTree && !pHLTESDTree) return kFALSE;
224 Bool_t OfflineHasNext=kFALSE;
225 Bool_t HLTHasNext=kFALSE;
227 if(pESDTree) OfflineHasNext = FindPrevInTree(pESDTree, output);
228 if(pHLTESDTree) HLTHasNext = FindPrevInTree(pHLTESDTree,output);
230 return (OfflineHasNext | HLTHasNext);
234 Bool_t AliEveEventSelector::FindPrevInTree(TTree* tree, Int_t& output)
236 static const TEveException kEH("AliEveEventSelector::FindPrevInTree ");
238 AliESDEvent* pESDEvent = fPEventManager->GetESD();
239 Int_t eventId = fPEventManager->GetEventId();
240 Int_t fMaxEventId = fPEventManager->GetMaxEventId();
242 if (!fSelectOnString)
245 for (Int_t i = eventId-1; i>-1; i--)
247 if (tree->GetEntry(i) <= 0)
248 throw (kEH + "failed getting required event from ESD.");
249 if (CheckOtherSelection(pESDEvent))
255 if (!fWrapAround) return kFALSE;
256 for (Int_t i = fMaxEventId; i>eventId-1; i--)
258 if (tree->GetEntry(i) <= 0)
259 throw (kEH + "failed getting required event from ESD.");
260 if (CheckOtherSelection(pESDEvent))
270 //select using the entrylist
271 for (Long64_t i=fEntryListId-1; i>-1; i--)
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))
283 if (!fWrapAround) return kFALSE;
284 for (Long64_t i=fPEntryList->GetN()-1; i>fEntryListId-1; i--)
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))
301 //_____________________________________________________________________________
302 Bool_t AliEveEventSelector::CheckOtherSelection( AliESDEvent* pESDEvent )
304 //checks the event for any other hardcoded selection criteria
309 if (fSelectOnTriggerType)
311 TString firedtrclasses = pESDEvent->GetFiredTriggerClasses();
312 if (!(firedtrclasses.Contains(fTriggerType))) return kFALSE;
313 //if (!pESDEvent->IsTriggerClassFired(fTriggerType.Data())) return kFALSE;
316 if (fSelectOnMultiplicity)
318 Int_t mult = pESDEvent->GetNumberOfTracks();
319 Int_t mhigh = (fMultiplicityHigh==0)?100000000:fMultiplicityHigh;
320 if (mult<fMultiplicityLow || mult>mhigh) return kFALSE;
323 if (fSelectOnTriggerString)
325 ULong64_t triggermask = pESDEvent->GetTriggerMask();
326 TString triggermaskstr;
327 triggermaskstr += triggermask;
328 TString selstr(fTriggerSelectionString); //make copy
329 selstr.ReplaceAll(fTriggerMaskPatternString,triggermaskstr);
331 Bool_t result = static_cast<Bool_t>(gROOT->ProcessLine(selstr));//,&returncode));
332 //if (!returncode) return kFALSE;
333 if (!result) return kFALSE;
339 //_____________________________________________________________________________
340 void AliEveEventSelector::SetTriggerSelectionString( TString str )
342 //parses and sets the trigger selection formula
344 const AliESDRun* run = fPEventManager->GetESD()->GetESDRun();
345 for (Int_t i=0; i<run->kNTriggerClasses; i++)
347 TString name(run->GetTriggerClass(i));
348 if (name.IsNull()) continue;
349 TString valuestr("(");
350 valuestr += fTriggerMaskPatternString;
352 valuestr += static_cast<ULong64_t>(1)<<i;
354 str.ReplaceAll(name,valuestr);
356 fTriggerSelectionString = str;