.so cleanup: removed from gSystem->Load()
[u/mrichter/AliRoot.git] / HLT / trigger / macros / FindHLTTriggeredEvents.C
1 /**************************************************************************
2  * This file is property of and copyright by the ALICE HLT Project        *
3  * All rights reserved.                                                   *
4  *                                                                        *
5  * Primary Authors:                                                       *
6  *   Artur Szostak <artursz@iafrica.com>                                  *
7  *                                                                        *
8  * Permission to use, copy, modify and distribute this software and its   *
9  * documentation strictly for non-commercial purposes is hereby granted   *
10  * without fee, provided that the above copyright notice appears in all   *
11  * copies and that both the copyright notice and this permission notice   *
12  * appear in the supporting documentation. The authors make no claims     *
13  * about the suitability of this software for any purpose. It is          *
14  * provided "as is" without express or implied warranty.                  *
15  **************************************************************************/
16
17 // $Id: $
18
19 /**
20  * \ingroup macros
21  * \file FindHLTTriggeredEvents.C
22  * \brief Macro for finding event numbers of HLT triggered events.
23  *
24  * This macro is used to generate or print a list of event numbers which had
25  * a positive HLT trigger decision.
26  *
27  * The simplest way to run this macro with defaults (which will process any raw
28  * data in the current directory) is to run the following command from a terminal
29  * shell:
30  * \code
31  *   > aliroot -b -q $ALICE_ROOT/HLT/trigger/macros/FindHLTTriggeredEvents.C
32  * \endcode
33  *
34  * It is also possible to use as input a file or a chunk sitting on the GRID.
35  * \code 
36  *   > aliroot -b -q  $ALICE_ROOT/HLT/trigger/macros/FindHLTTriggeredEvents.C'("alien:///alice/data/2010/LHC10h/000137124/raw/10000137124054.10.root")'
37  *   > aliroot -b -q  $ALICE_ROOT/HLT/trigger/macros/FindHLTTriggeredEvents.C'("raw://run137124")'
38  * \author Artur Szostak <artursz@iafrica.com>
39  */
40
41 #if !defined(__CINT__) || defined(__MAKECINT__)
42 #include "AliRawReader.h"
43 #include "AliHLTPluginBase.h"
44 #include "AliHLTOUT.h"
45 #include "AliHLTSystem.h"
46 #include "AliHLTComponent.h"
47 #include "AliHLTGlobalTriggerDecision.h"
48 #include "AliLog.h"
49 #include "TSystem.h"
50 #include "TString.h"
51 #include "TFile.h"
52 #include "Riostream.h"
53 #endif
54
55 /**
56  * Finds all the events in raw data that contains a positive HLT decision.
57  *
58  * \param [in] dataSource  This is the path to the raw data or the ROOT/DATE file
59  *     contining the raw data.
60  * \param [out] events  The output list that will be filled with event numbers of
61  *     the events that were triggered by HLT for the given data source.
62  * \param [in] triggerCode  The HLT trigger code to search for. These must be the same as
63  *     the codes defined in the HLT trigger menu used for producing the data source. If
64  *     this parameter is set to NULL then all HLT triggered events are marked. (default NULL)
65  * \param [in] firstEvent  The event number of the first event to process. (default = 0)
66  * \param [in] lastEvent  The event number of the last event to process. If this is
67  *     less than firstEvent then the maximum events available in the data are
68  *     processed automatically. (default = -1)
69  * \param [in] print  Indicates if the found event information should be printed or not.
70  * \returns true if there were no problems accessing the data and false otherwise.
71  */
72 bool FindHLTTriggeredEvents(
73                 const char* dataSource,
74                 TArrayI& events,
75                 const char* triggerCode = NULL,
76                 Int_t firstEvent = 0,
77                 Int_t lastEvent = -1,
78                 bool print = true
79         )
80 {
81         gSystem->Load("libHLTrec");
82         // FIXME: Loading the following libraries is a workaround to get rid of warnings from AliHLTOUT.
83         gSystem->Load("libANALYSIS");
84         gSystem->Load("libANALYSISalice");
85         gSystem->Load("libAliHLTUtil");
86         gSystem->Load("libAliHLTTRD");
87         gSystem->Load("libAliHLTMUON");
88         gSystem->Load("libAliHLTTrigger");
89         
90         TString strfile = dataSource;
91         if(strfile.BeginsWith("alien://") || strfile.BeginsWith("raw://")) TGrid::Connect("alien");
92
93         // Setup the raw reader and HLTOUT handler.
94         AliRawReader* rawReader = AliRawReader::Create(dataSource);
95         if (rawReader == NULL)
96         {
97                 cerr << "ERROR: Could not create raw reader for '" << dataSource << "'." << endl;
98                 return false;
99         }
100         if (! rawReader->IsRawReaderValid())
101         {
102                 cerr << "ERROR: Raw reader is not valid for '" << dataSource << "'." << endl;
103                 delete rawReader;
104                 return false;
105         }
106         AliHLTOUT* hltout = AliHLTOUT::New(rawReader);
107         if (hltout == NULL)
108         {
109                 cerr << "ERROR: Could not create an AliHLTOUT object for '" << dataSource << "'." << endl;
110                 delete rawReader;
111                 return false;
112         }
113         
114         // Check if we need to process all events or not.
115         if (lastEvent < firstEvent) lastEvent = 0x7FFFFFFF;
116         
117         bool decodingOK = true;
118         
119         // Now step through the events.
120         for (Int_t currentEvent = firstEvent, eventLoopResult = rawReader->GotoEvent(firstEvent);
121              currentEvent <= lastEvent && eventLoopResult == kTRUE;
122              ++currentEvent, eventLoopResult = rawReader->NextEvent()
123             )
124         {
125                 int result = hltout->Init();
126                 if (result != 0)
127                 {
128                         cerr << "ERROR: could not initialise HLTOUT. Moving to next event." << endl;
129                         hltout->Reset();
130                         decodingOK = false;
131                         continue;
132                 }
133                 
134                 // Go through all the data blocks, looking for the HLT global trigger object.
135                 for (result = hltout->SelectFirstDataBlock(kAliHLTDataTypeGlobalTrigger);
136                      result >= 0;
137                      result = hltout->SelectNextDataBlock()
138                     )
139                 {
140                         TObject* obj = hltout->GetDataObject();
141                         if (obj == NULL) continue;
142                         if (obj->IsA()->GetBaseClass("AliHLTGlobalTriggerDecision") != NULL)
143                         {
144                                 AliHLTGlobalTriggerDecision* decision = (AliHLTGlobalTriggerDecision*)obj;
145                                 bool hltTriggered = false;
146                                 if (triggerCode != NULL)
147                                 {
148                                         hltTriggered = TString(decision->Description()).Contains(triggerCode);
149                                 }
150                                 else
151                                 {
152                                         hltTriggered = decision->Result();
153                                 }
154                                 if (hltTriggered)
155                                 {
156                                         if (print)
157                                         {
158                                                 cout << "Event " << currentEvent << " in " << dataSource
159                                                         << " with event ID = " << hltout->EventId()
160                                                         << " (0x" << hex << hltout->EventId() << dec << ")"
161                                                         << " was triggered by HLT with \""
162                                                         << (triggerCode != NULL ? triggerCode : decision->Description())
163                                                         << "\"." << endl;
164                                         }
165                                         events.Set(events.GetSize()+1);
166                                         events[events.GetSize()-1] = currentEvent;
167                                 }
168                         }
169                         hltout->ReleaseDataObject(obj);
170                 }
171                 
172                 result = hltout->Reset();
173                 if (result != 0)
174                 {
175                         cerr << "ERROR: could not reset HLTOUT properly." << endl;
176                         decodingOK = false;
177                         continue;
178                 }
179         }
180         
181         AliHLTOUT::Delete(hltout);
182         delete rawReader;
183         return decodingOK;
184 }
185
186
187 bool FindHLTTriggeredEvents(const char* dataSource = "./")
188 {
189         TArrayI events;
190         return FindHLTTriggeredEvents(dataSource, events, NULL, 0, -1, true);
191 }