ROOT logo
/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        *
 * All rights reserved.                                                   *
 *                                                                        *
 * Primary Authors:                                                       *
 *   Artur Szostak <artursz@iafrica.com>                                  *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          *
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// $Id: $

/**
 * \ingroup macros
 * \file FindHLTTriggeredEvents.C
 * \brief Macro for finding event numbers of HLT triggered events.
 *
 * This macro is used to generate or print a list of event numbers which had
 * a positive HLT trigger decision.
 *
 * The simplest way to run this macro with defaults (which will process any raw
 * data in the current directory) is to run the following command from a terminal
 * shell:
 * \code
 *   > aliroot -b -q $ALICE_ROOT/HLT/trigger/macros/FindHLTTriggeredEvents.C
 * \endcode
 *
 * It is also possible to use as input a file or a chunk sitting on the GRID.
 * \code 
 *   > aliroot -b -q  $ALICE_ROOT/HLT/trigger/macros/FindHLTTriggeredEvents.C'("alien:///alice/data/2010/LHC10h/000137124/raw/10000137124054.10.root")'
 *   > aliroot -b -q  $ALICE_ROOT/HLT/trigger/macros/FindHLTTriggeredEvents.C'("raw://run137124")'
 * \author Artur Szostak <artursz@iafrica.com>
 */

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "AliRawReader.h"
#include "AliHLTPluginBase.h"
#include "AliHLTOUT.h"
#include "AliHLTSystem.h"
#include "AliHLTComponent.h"
#include "AliHLTGlobalTriggerDecision.h"
#include "AliLog.h"
#include "TSystem.h"
#include "TString.h"
#include "TFile.h"
#include "Riostream.h"
#endif

/**
 * Finds all the events in raw data that contains a positive HLT decision.
 *
 * \param [in] dataSource  This is the path to the raw data or the ROOT/DATE file
 *     contining the raw data.
 * \param [out] events  The output list that will be filled with event numbers of
 *     the events that were triggered by HLT for the given data source.
 * \param [in] triggerCode  The HLT trigger code to search for. These must be the same as
 *     the codes defined in the HLT trigger menu used for producing the data source. If
 *     this parameter is set to NULL then all HLT triggered events are marked. (default NULL)
 * \param [in] firstEvent  The event number of the first event to process. (default = 0)
 * \param [in] lastEvent  The event number of the last event to process. If this is
 *     less than firstEvent then the maximum events available in the data are
 *     processed automatically. (default = -1)
 * \param [in] print  Indicates if the found event information should be printed or not.
 * \returns true if there were no problems accessing the data and false otherwise.
 */
bool FindHLTTriggeredEvents(
		const char* dataSource,
		TArrayI& events,
		const char* triggerCode = NULL,
		Int_t firstEvent = 0,
		Int_t lastEvent = -1,
		bool print = true
	)
{
	gSystem->Load("libHLTrec.so");
	// FIXME: Loading the following libraries is a workaround to get rid of warnings from AliHLTOUT.
	gSystem->Load("libANALYSIS.so");
	gSystem->Load("libANALYSISalice.so");
	gSystem->Load("libAliHLTUtil.so");
	gSystem->Load("libAliHLTTRD.so");
	gSystem->Load("libAliHLTMUON.so");
	gSystem->Load("libAliHLTTrigger.so");
	
	TString strfile = dataSource;
	if(strfile.BeginsWith("alien://") || strfile.BeginsWith("raw://")) TGrid::Connect("alien");

	// Setup the raw reader and HLTOUT handler.
	AliRawReader* rawReader = AliRawReader::Create(dataSource);
	if (rawReader == NULL)
	{
		cerr << "ERROR: Could not create raw reader for '" << dataSource << "'." << endl;
		return false;
	}
	if (! rawReader->IsRawReaderValid())
	{
		cerr << "ERROR: Raw reader is not valid for '" << dataSource << "'." << endl;
		delete rawReader;
		return false;
	}
	AliHLTOUT* hltout = AliHLTOUT::New(rawReader);
	if (hltout == NULL)
	{
		cerr << "ERROR: Could not create an AliHLTOUT object for '" << dataSource << "'." << endl;
		delete rawReader;
		return false;
	}
	
	// Check if we need to process all events or not.
	if (lastEvent < firstEvent) lastEvent = 0x7FFFFFFF;
	
	bool decodingOK = true;
	
	// Now step through the events.
	for (Int_t currentEvent = firstEvent, eventLoopResult = rawReader->GotoEvent(firstEvent);
	     currentEvent <= lastEvent && eventLoopResult == kTRUE;
	     ++currentEvent, eventLoopResult = rawReader->NextEvent()
	    )
	{
		int result = hltout->Init();
		if (result != 0)
		{
			cerr << "ERROR: could not initialise HLTOUT. Moving to next event." << endl;
			hltout->Reset();
			decodingOK = false;
			continue;
		}
		
		// Go through all the data blocks, looking for the HLT global trigger object.
		for (result = hltout->SelectFirstDataBlock(kAliHLTDataTypeGlobalTrigger);
		     result >= 0;
		     result = hltout->SelectNextDataBlock()
		    )
		{
			TObject* obj = hltout->GetDataObject();
			if (obj == NULL) continue;
			if (obj->IsA()->GetBaseClass("AliHLTGlobalTriggerDecision") != NULL)
			{
				AliHLTGlobalTriggerDecision* decision = (AliHLTGlobalTriggerDecision*)obj;
				bool hltTriggered = false;
				if (triggerCode != NULL)
				{
					hltTriggered = TString(decision->Description()).Contains(triggerCode);
				}
				else
				{
					hltTriggered = decision->Result();
				}
				if (hltTriggered)
				{
					if (print)
					{
						cout << "Event " << currentEvent << " in " << dataSource
							<< " with event ID = " << hltout->EventId()
							<< " (0x" << hex << hltout->EventId() << dec << ")"
							<< " was triggered by HLT with \""
							<< (triggerCode != NULL ? triggerCode : decision->Description())
							<< "\"." << endl;
					}
					events.Set(events.GetSize()+1);
					events[events.GetSize()-1] = currentEvent;
				}
			}
			hltout->ReleaseDataObject(obj);
		}
		
		result = hltout->Reset();
		if (result != 0)
		{
			cerr << "ERROR: could not reset HLTOUT properly." << endl;
			decodingOK = false;
			continue;
		}
	}
	
	AliHLTOUT::Delete(hltout);
	delete rawReader;
	return decodingOK;
}


bool FindHLTTriggeredEvents(const char* dataSource = "./")
{
	TArrayI events;
	return FindHLTTriggeredEvents(dataSource, events, NULL, 0, -1, true);
}
 FindHLTTriggeredEvents.C:1
 FindHLTTriggeredEvents.C:2
 FindHLTTriggeredEvents.C:3
 FindHLTTriggeredEvents.C:4
 FindHLTTriggeredEvents.C:5
 FindHLTTriggeredEvents.C:6
 FindHLTTriggeredEvents.C:7
 FindHLTTriggeredEvents.C:8
 FindHLTTriggeredEvents.C:9
 FindHLTTriggeredEvents.C:10
 FindHLTTriggeredEvents.C:11
 FindHLTTriggeredEvents.C:12
 FindHLTTriggeredEvents.C:13
 FindHLTTriggeredEvents.C:14
 FindHLTTriggeredEvents.C:15
 FindHLTTriggeredEvents.C:16
 FindHLTTriggeredEvents.C:17
 FindHLTTriggeredEvents.C:18
 FindHLTTriggeredEvents.C:19
 FindHLTTriggeredEvents.C:20
 FindHLTTriggeredEvents.C:21
 FindHLTTriggeredEvents.C:22
 FindHLTTriggeredEvents.C:23
 FindHLTTriggeredEvents.C:24
 FindHLTTriggeredEvents.C:25
 FindHLTTriggeredEvents.C:26
 FindHLTTriggeredEvents.C:27
 FindHLTTriggeredEvents.C:28
 FindHLTTriggeredEvents.C:29
 FindHLTTriggeredEvents.C:30
 FindHLTTriggeredEvents.C:31
 FindHLTTriggeredEvents.C:32
 FindHLTTriggeredEvents.C:33
 FindHLTTriggeredEvents.C:34
 FindHLTTriggeredEvents.C:35
 FindHLTTriggeredEvents.C:36
 FindHLTTriggeredEvents.C:37
 FindHLTTriggeredEvents.C:38
 FindHLTTriggeredEvents.C:39
 FindHLTTriggeredEvents.C:40
 FindHLTTriggeredEvents.C:41
 FindHLTTriggeredEvents.C:42
 FindHLTTriggeredEvents.C:43
 FindHLTTriggeredEvents.C:44
 FindHLTTriggeredEvents.C:45
 FindHLTTriggeredEvents.C:46
 FindHLTTriggeredEvents.C:47
 FindHLTTriggeredEvents.C:48
 FindHLTTriggeredEvents.C:49
 FindHLTTriggeredEvents.C:50
 FindHLTTriggeredEvents.C:51
 FindHLTTriggeredEvents.C:52
 FindHLTTriggeredEvents.C:53
 FindHLTTriggeredEvents.C:54
 FindHLTTriggeredEvents.C:55
 FindHLTTriggeredEvents.C:56
 FindHLTTriggeredEvents.C:57
 FindHLTTriggeredEvents.C:58
 FindHLTTriggeredEvents.C:59
 FindHLTTriggeredEvents.C:60
 FindHLTTriggeredEvents.C:61
 FindHLTTriggeredEvents.C:62
 FindHLTTriggeredEvents.C:63
 FindHLTTriggeredEvents.C:64
 FindHLTTriggeredEvents.C:65
 FindHLTTriggeredEvents.C:66
 FindHLTTriggeredEvents.C:67
 FindHLTTriggeredEvents.C:68
 FindHLTTriggeredEvents.C:69
 FindHLTTriggeredEvents.C:70
 FindHLTTriggeredEvents.C:71
 FindHLTTriggeredEvents.C:72
 FindHLTTriggeredEvents.C:73
 FindHLTTriggeredEvents.C:74
 FindHLTTriggeredEvents.C:75
 FindHLTTriggeredEvents.C:76
 FindHLTTriggeredEvents.C:77
 FindHLTTriggeredEvents.C:78
 FindHLTTriggeredEvents.C:79
 FindHLTTriggeredEvents.C:80
 FindHLTTriggeredEvents.C:81
 FindHLTTriggeredEvents.C:82
 FindHLTTriggeredEvents.C:83
 FindHLTTriggeredEvents.C:84
 FindHLTTriggeredEvents.C:85
 FindHLTTriggeredEvents.C:86
 FindHLTTriggeredEvents.C:87
 FindHLTTriggeredEvents.C:88
 FindHLTTriggeredEvents.C:89
 FindHLTTriggeredEvents.C:90
 FindHLTTriggeredEvents.C:91
 FindHLTTriggeredEvents.C:92
 FindHLTTriggeredEvents.C:93
 FindHLTTriggeredEvents.C:94
 FindHLTTriggeredEvents.C:95
 FindHLTTriggeredEvents.C:96
 FindHLTTriggeredEvents.C:97
 FindHLTTriggeredEvents.C:98
 FindHLTTriggeredEvents.C:99
 FindHLTTriggeredEvents.C:100
 FindHLTTriggeredEvents.C:101
 FindHLTTriggeredEvents.C:102
 FindHLTTriggeredEvents.C:103
 FindHLTTriggeredEvents.C:104
 FindHLTTriggeredEvents.C:105
 FindHLTTriggeredEvents.C:106
 FindHLTTriggeredEvents.C:107
 FindHLTTriggeredEvents.C:108
 FindHLTTriggeredEvents.C:109
 FindHLTTriggeredEvents.C:110
 FindHLTTriggeredEvents.C:111
 FindHLTTriggeredEvents.C:112
 FindHLTTriggeredEvents.C:113
 FindHLTTriggeredEvents.C:114
 FindHLTTriggeredEvents.C:115
 FindHLTTriggeredEvents.C:116
 FindHLTTriggeredEvents.C:117
 FindHLTTriggeredEvents.C:118
 FindHLTTriggeredEvents.C:119
 FindHLTTriggeredEvents.C:120
 FindHLTTriggeredEvents.C:121
 FindHLTTriggeredEvents.C:122
 FindHLTTriggeredEvents.C:123
 FindHLTTriggeredEvents.C:124
 FindHLTTriggeredEvents.C:125
 FindHLTTriggeredEvents.C:126
 FindHLTTriggeredEvents.C:127
 FindHLTTriggeredEvents.C:128
 FindHLTTriggeredEvents.C:129
 FindHLTTriggeredEvents.C:130
 FindHLTTriggeredEvents.C:131
 FindHLTTriggeredEvents.C:132
 FindHLTTriggeredEvents.C:133
 FindHLTTriggeredEvents.C:134
 FindHLTTriggeredEvents.C:135
 FindHLTTriggeredEvents.C:136
 FindHLTTriggeredEvents.C:137
 FindHLTTriggeredEvents.C:138
 FindHLTTriggeredEvents.C:139
 FindHLTTriggeredEvents.C:140
 FindHLTTriggeredEvents.C:141
 FindHLTTriggeredEvents.C:142
 FindHLTTriggeredEvents.C:143
 FindHLTTriggeredEvents.C:144
 FindHLTTriggeredEvents.C:145
 FindHLTTriggeredEvents.C:146
 FindHLTTriggeredEvents.C:147
 FindHLTTriggeredEvents.C:148
 FindHLTTriggeredEvents.C:149
 FindHLTTriggeredEvents.C:150
 FindHLTTriggeredEvents.C:151
 FindHLTTriggeredEvents.C:152
 FindHLTTriggeredEvents.C:153
 FindHLTTriggeredEvents.C:154
 FindHLTTriggeredEvents.C:155
 FindHLTTriggeredEvents.C:156
 FindHLTTriggeredEvents.C:157
 FindHLTTriggeredEvents.C:158
 FindHLTTriggeredEvents.C:159
 FindHLTTriggeredEvents.C:160
 FindHLTTriggeredEvents.C:161
 FindHLTTriggeredEvents.C:162
 FindHLTTriggeredEvents.C:163
 FindHLTTriggeredEvents.C:164
 FindHLTTriggeredEvents.C:165
 FindHLTTriggeredEvents.C:166
 FindHLTTriggeredEvents.C:167
 FindHLTTriggeredEvents.C:168
 FindHLTTriggeredEvents.C:169
 FindHLTTriggeredEvents.C:170
 FindHLTTriggeredEvents.C:171
 FindHLTTriggeredEvents.C:172
 FindHLTTriggeredEvents.C:173
 FindHLTTriggeredEvents.C:174
 FindHLTTriggeredEvents.C:175
 FindHLTTriggeredEvents.C:176
 FindHLTTriggeredEvents.C:177
 FindHLTTriggeredEvents.C:178
 FindHLTTriggeredEvents.C:179
 FindHLTTriggeredEvents.C:180
 FindHLTTriggeredEvents.C:181
 FindHLTTriggeredEvents.C:182
 FindHLTTriggeredEvents.C:183
 FindHLTTriggeredEvents.C:184
 FindHLTTriggeredEvents.C:185
 FindHLTTriggeredEvents.C:186
 FindHLTTriggeredEvents.C:187
 FindHLTTriggeredEvents.C:188
 FindHLTTriggeredEvents.C:189
 FindHLTTriggeredEvents.C:190
 FindHLTTriggeredEvents.C:191
 FindHLTTriggeredEvents.C:192