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 if (!pESDTree || fString==str) return;//don't waist time
60 if (str == "" ) return;//on reset don't recalculate
61 pESDTree->Draw( ">>listofentries", fString, "entrylist");
62 fPEntryList = dynamic_cast<TEntryList*>(gDirectory->Get("listofentries"));
65 //_____________________________________________________________________________
66 void AliEveEventSelector::SetSelectionString( const char* str )
68 //selection string setter
71 SetSelectionString(ts);
74 //_____________________________________________________________________________
75 void AliEveEventSelector::SetTriggerType( const TString& type )
82 //_____________________________________________________________________________
83 void AliEveEventSelector::SetTriggerType( const char* type)
91 //_____________________________________________________________________________
92 void AliEveEventSelector::UpdateEntryList()
94 //update the entrylist from if file changed
96 TTree* pESDTree = fPEventManager->GetESDTree();
97 if (!pESDTree) return;
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;
106 //_____________________________________________________________________________
107 void AliEveEventSelector::Update()
114 //_____________________________________________________________________________
115 Bool_t AliEveEventSelector::FindNext( Int_t& output )
117 //does the magick of selecting the next event
119 static const TEveException kEH("AliEveEventSelector::GetNext ");
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();
127 if (!fSelectOnString)
130 for (Int_t i = eventId+1; i<fMaxEventId+1; i++)
132 if (pESDTree->GetEntry(i) <= 0)
133 throw (kEH + "failed getting required event from ESD.");
134 if (CheckOtherSelection(pESDEvent))
140 if (!fWrapAround) return kFALSE;
141 for (Int_t i = 0; i<eventId+1; i++)
143 if (pESDTree->GetEntry(i) <= 0)
144 throw (kEH + "failed getting required event from ESD.");
145 if (CheckOtherSelection(pESDEvent))
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++ )
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))
169 if (!fWrapAround) return kFALSE;
170 for (Long64_t i=0; i<fEntryListId+1; i++ )
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))
188 //_____________________________________________________________________________
189 Bool_t AliEveEventSelector::FindPrev( Int_t& output )
191 //does the magick of selecting the previous event
193 static const TEveException kEH("AliEveEventSelector::GetNext ");
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();
201 if (!fSelectOnString)
204 for (Int_t i = eventId-1; i>-1; i--)
206 if (pESDTree->GetEntry(i) <= 0)
207 throw (kEH + "failed getting required event from ESD.");
208 if (CheckOtherSelection(pESDEvent))
214 if (!fWrapAround) return kFALSE;
215 for (Int_t i = fMaxEventId; i>eventId-1; i--)
217 if (pESDTree->GetEntry(i) <= 0)
218 throw (kEH + "failed getting required event from ESD.");
219 if (CheckOtherSelection(pESDEvent))
229 //select using the entrylist
230 for (Long64_t i=fEntryListId-1; i>-1; i--)
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))
242 if (!fWrapAround) return kFALSE;
243 for (Long64_t i=fPEntryList->GetN()-1; i>fEntryListId-1; i--)
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))
260 //_____________________________________________________________________________
261 Bool_t AliEveEventSelector::CheckOtherSelection( AliESDEvent* pESDEvent )
263 //checks the event for any other hardcoded selection criteria
268 if (fSelectOnTriggerType)
270 TString firedtrclasses = pESDEvent->GetFiredTriggerClasses();
271 if (!(firedtrclasses.Contains(fTriggerType))) return kFALSE;
272 //if (!pESDEvent->IsTriggerClassFired(fTriggerType.Data())) return kFALSE;
275 if (fSelectOnMultiplicity)
277 Int_t mult = pESDEvent->GetNumberOfTracks();
278 Int_t mhigh = (fMultiplicityHigh==0)?100000000:fMultiplicityHigh;
279 if (mult<fMultiplicityLow || mult>mhigh) return kFALSE;
282 if (fSelectOnTriggerString)
284 ULong64_t triggermask = pESDEvent->GetTriggerMask();
285 TString triggermaskstr;
286 triggermaskstr += triggermask;
287 TString selstr(fTriggerSelectionString); //make copy
288 selstr.ReplaceAll(fTriggerMaskPatternString,triggermaskstr);
290 Bool_t result = static_cast<Bool_t>(gROOT->ProcessLine(selstr));//,&returncode));
291 //if (!returncode) return kFALSE;
292 if (!result) return kFALSE;
298 //_____________________________________________________________________________
299 void AliEveEventSelector::SetTriggerSelectionString( TString str )
301 //parses and sets the trigger selection formula
303 const AliESDRun* run = fPEventManager->GetESD()->GetESDRun();
304 for (Int_t i=0; i<run->kNTriggerClasses; i++)
306 TString name(run->GetTriggerClass(i));
307 if (name.IsNull()) continue;
308 TString valuestr("(");
309 valuestr += fTriggerMaskPatternString;
311 valuestr += static_cast<ULong64_t>(1<<i);
313 str.ReplaceAll(name,valuestr);
315 fTriggerSelectionString = str;