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 // Finds events according to specified criteria
11 // origin: Mikolaj Krzewicki, mikolaj.krzewicki@cern.ch
13 //////////////////////////////////////////////////////////////////////////
15 #include "AliEveEventSelector.h"
16 #include "AliEveEventManager.h"
18 #include "AliESDEvent.h"
19 #include "AliESDRun.h"
20 #include <TEntryList.h>
21 #include <TDirectory.h>
23 #include <TObjArray.h>
27 ClassImp(AliEveEventSelector)
29 //_____________________________________________________________________________
30 AliEveEventSelector::AliEveEventSelector(AliEveEventManager* evman):
31 fPEventManager(evman),
33 fMaxEventId(fPEventManager->GetMaxEventId()),
34 fSelectOnString(kFALSE),
38 fSelectOnTriggerType(kFALSE),
40 fSelectOnTriggerString(kFALSE),
41 fTriggerSelectionString(""),
42 fTriggerMaskPatternString("trgmask"),
43 fSelectOnMultiplicity(kFALSE),
50 //_____________________________________________________________________________
51 void AliEveEventSelector::SetSelectionString( const TString& str )
53 //selection string setter
55 TTree* pESDTree = fPEventManager->GetESDTree();
56 if (!pESDTree || fString==str) return;//don't waist time
58 if (str == "" ) return;//on reset don't recalculate
59 fMaxEventId = fPEventManager->GetMaxEventId();
60 pESDTree->Draw( ">>listofentries", fString, "entrylist");
61 fPEntryList = dynamic_cast<TEntryList*>(gDirectory->Get("listofentries"));
64 //_____________________________________________________________________________
65 void AliEveEventSelector::SetSelectionString( const char* str )
68 SetSelectionString(ts);
71 //_____________________________________________________________________________
72 void AliEveEventSelector::SetTriggerType( const TString& type )
77 //_____________________________________________________________________________
78 void AliEveEventSelector::SetTriggerType( const char* type)
84 //_____________________________________________________________________________
85 void AliEveEventSelector::UpdateEntryList()
87 //update the entrylist from file if file changed
88 TTree* pESDTree = fPEventManager->GetESDTree();
89 if (!pESDTree) return;
91 Long64_t treesize = fPEventManager->GetMaxEventId();
92 if (treesize<=fMaxEventId) return; //nothing changed, do nothing
93 pESDTree->Draw(">>+fPEntryList", fString, "entrylist",
94 fMaxEventId, treesize-fMaxEventId );
95 fMaxEventId = treesize;
98 //_____________________________________________________________________________
99 void AliEveEventSelector::Update()
106 //_____________________________________________________________________________
107 Bool_t AliEveEventSelector::FindNext( Int_t& output )
109 //does the magick of selecting the next event
111 static const TEveException kEH("AliEveEventSelector::GetNext ");
113 TTree* pESDTree = fPEventManager->GetESDTree();
114 if (!pESDTree) return kFALSE;
115 AliESDEvent* pESDEvent = fPEventManager->GetESD();
116 Int_t eventId = fPEventManager->GetEventId();
117 fMaxEventId = fPEventManager->GetMaxEventId();
119 if (!fSelectOnString)
122 for (Int_t i = eventId+1; i<fMaxEventId+1; i++)
124 if (pESDTree->GetEntry(i) <= 0)
125 throw (kEH + "failed getting required event from ESD.");
126 if (CheckOtherSelection(pESDEvent))
132 if (!fWrapAround) return kFALSE;
133 for (Int_t i = 0; i<eventId+1; i++)
135 if (pESDTree->GetEntry(i) <= 0)
136 throw (kEH + "failed getting required event from ESD.");
137 if (CheckOtherSelection(pESDEvent))
147 //select using the entrylist
148 for (Long64_t i=fEntryListId+1; i<fPEntryList->GetN(); i++ )
150 Long64_t entry = fPEntryList->GetEntry(i);
151 if (pESDTree->GetEntry(entry) <= 0)
152 throw (kEH + "failed getting required event from ESD.");
153 if (CheckOtherSelection(pESDEvent))
160 if (!fWrapAround) return kFALSE;
161 for (Long64_t i=0; i<fEntryListId+1; i++ )
163 Long64_t entry = fPEntryList->GetEntry(i);
164 if (pESDTree->GetEntry(entry) <= 0)
165 throw (kEH + "failed getting required event from ESD.");
166 if (CheckOtherSelection(pESDEvent))
179 //_____________________________________________________________________________
180 Bool_t AliEveEventSelector::FindPrev( Int_t& output )
182 //does the magick of selecting the previous event
184 static const TEveException kEH("AliEveEventSelector::GetNext ");
186 TTree* pESDTree = fPEventManager->GetESDTree();
187 if (!pESDTree) return kFALSE;
188 AliESDEvent* pESDEvent = fPEventManager->GetESD();
189 Int_t eventId = fPEventManager->GetEventId();
190 fMaxEventId = fPEventManager->GetMaxEventId();
192 if (!fSelectOnString)
195 for (Int_t i = eventId-1; i>-1; i--)
197 if (pESDTree->GetEntry(i) <= 0)
198 throw (kEH + "failed getting required event from ESD.");
199 if (CheckOtherSelection(pESDEvent))
205 if (!fWrapAround) return kFALSE;
206 for (Int_t i = fMaxEventId; i>eventId-1; i--)
208 if (pESDTree->GetEntry(i) <= 0)
209 throw (kEH + "failed getting required event from ESD.");
210 if (CheckOtherSelection(pESDEvent))
220 //select using the entrylist
221 for (Long64_t i=fEntryListId-1; i>-1; i--)
223 Long64_t entry = fPEntryList->GetEntry(i);
224 if (pESDTree->GetEntry(entry) <= 0)
225 throw (kEH + "failed getting required event from ESD.");
226 if (CheckOtherSelection(pESDEvent))
233 if (!fWrapAround) return kFALSE;
234 for (Long64_t i=fPEntryList->GetN()-1; i>fEntryListId-1; i--)
236 Long64_t entry = fPEntryList->GetEntry(i);
237 if (pESDTree->GetEntry(entry) <= 0)
238 throw (kEH + "failed getting required event from ESD.");
239 if (CheckOtherSelection(pESDEvent))
251 //_____________________________________________________________________________
252 Bool_t AliEveEventSelector::CheckOtherSelection( AliESDEvent* pESDEvent )
254 //checks the event for any other hardcoded selection criteria
258 if (fSelectOnTriggerType)
260 TString firedtrclasses = pESDEvent->GetFiredTriggerClasses();
261 printf(firedtrclasses.Data());
263 printf(fTriggerType.Data());
265 if (!(firedtrclasses.Contains(fTriggerType))) return kFALSE;
266 //if (!pESDEvent->IsTriggerClassFired(fTriggerType.Data())) return kFALSE;
269 if (fSelectOnMultiplicity)
271 Int_t mult = pESDEvent->GetNumberOfTracks();
272 Int_t mhigh = (fMultiplicityHigh==0)?100000000:fMultiplicityHigh;
273 if (mult<fMultiplicityLow || mult>mhigh) return kFALSE;
276 if (fSelectOnTriggerString)
278 ULong64_t triggermask = pESDEvent->GetTriggerMask();
279 TString triggermaskstr;
280 triggermaskstr += triggermask;
281 TString selstr(fTriggerSelectionString); //make copy
282 selstr.ReplaceAll(fTriggerMaskPatternString,triggermaskstr);
284 Bool_t result = static_cast<Bool_t>(gROOT->ProcessLine(selstr,&returncode));
285 //if (!returncode) return kFALSE;
286 if (!result) return kFALSE;
292 //_____________________________________________________________________________
293 void AliEveEventSelector::SetTriggerSelectionString( TString str )
295 const AliESDRun* run = fPEventManager->GetESD()->GetESDRun();
296 for (Int_t i=0; i<run->kNTriggerClasses; i++)
298 const char* name = run->GetTriggerClass(i);
299 if (name=="") continue;
300 TString valuestr("(");
301 valuestr += fTriggerMaskPatternString;
303 valuestr += static_cast<ULong64_t>(1<<i);
305 str.ReplaceAll(name,valuestr);
307 fTriggerSelectionString = str;