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 DumpGlobalTrigger.C
 * \brief Macro for dumping HLT global trigger decisions.
 *
 * This macro is used to dump to screen the HLT global trigger decisions encoded
 * in AliHLTGlobalTriggerDecision objects found in the HLT raw data. The raw data
 * should be packed in a ROOT or DATE file, or in DDL data files in raw*
 * directories. An appropriate AliRawReader is created to read the data.
 *
 * The simplest way to run this macro with defaults is to run the following
 * command from a terminal shell:
 * \code
 *   > aliroot -b -q $ALICE_ROOT/HLT/trigger/macros/DumpGlobalTrigger.C
 * \endcode
 *
 * \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 "AliLog.h"
#include "TSystem.h"
#include "TFile.h"
#include "Riostream.h"
#endif

/**
 * Dumps the AliHLTGlobalTriggerDecision objects found in HLT output data.
 *
 * \param dataSource  This is the path to the raw data or the ROOT/DATE file
 *     contining the raw data. (default is the current directory).
 * \param firstEvent  The event number of the first event to process. (default = 0)
 * \param lastEvent  The event number of the last event to process. If this is
 *     less than firstEvent then it is set to maximum events available
 *     automatically. (default = -1)
 * \param output  Specifies the name of a ROOT output file. This file will be
 *     generated and the objects written to it. If the value is NULL then
 *     no output is written to file. (default = NULL)
 * \param debug  Specifies if full debug messages should be printed.
 */
void DumpGlobalTrigger(
		const char* dataSource = "./",
		Int_t firstEvent = 0,
		Int_t lastEvent = -1,
		const char* output = NULL,
		bool debug = false
	)
{
	if (debug)
	{
		AliLog::SetModuleDebugLevel("HLT", AliLog::kMaxType);
		AliHLTSystem* sys = AliHLTPluginBase::GetInstance();
		sys->SetGlobalLoggingLevel(kHLTLogAll);
	}
	
	gSystem->Load("libHLTrec.so");
	TFile* file = NULL;
	if (output != NULL)
	{
		file = new TFile(output, "RECREATE");
		if (file == NULL)
		{
			cerr << "ERROR: Could not create file '" << output << "'." << endl;
			return;
		}
	}
	
	// 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;
		if (file != NULL) delete file;
		return;
	}
	if (! rawReader->IsRawReaderValid())
	{
		cerr << "ERROR: Raw reader is not valid for '" << dataSource << "'." << endl;
		delete rawReader;
		if (file != NULL) delete file;
		return;
	}
	AliHLTOUT* hltout = AliHLTOUT::New(rawReader);
	if (hltout == NULL)
	{
		cerr << "ERROR: Could not create an AliHLTOUT object for '" << dataSource << "'." << endl;
		delete rawReader;
		if (file != NULL) delete file;
		return;
	}
	
	// Make sure that the lastEvent is greater than firstEvent.
	if (lastEvent < firstEvent) lastEvent = rawReader->GetNumberOfEvents();
	if (lastEvent < firstEvent) lastEvent = firstEvent;
	
	// Need to call NextEvent once here or we will start at the wrong event.
	if (! rawReader->NextEvent())
	{
		cout << "No events found in '" << dataSource << "'." << endl;
		AliHLTOUT::Delete(hltout);
		delete rawReader;
		if (file != NULL) delete file;
		return;
	}
	
	// Now step through the events.
	for (int i = 0; i < firstEvent; i++) rawReader->NextEvent();
	for (int i = firstEvent; i <= lastEvent; i++)
	{
		int result = hltout->Init();
		if (result != 0)
		{
			cerr << "ERROR: could not initialise HLTOUT." << endl;
			hltout->Reset();
			continue;
		}
		cout << "#################### Event " << i << " in " << dataSource
			<< " has event ID = " << hltout->EventId()
			<< " (0x" << hex << hltout->EventId() << dec << ")"
			<< " ####################" << endl;
		
		for (result = hltout->SelectFirstDataBlock();
		     result >= 0;
		     result = hltout->SelectNextDataBlock()
		    )
		{
			AliHLTComponentDataType dt;
			AliHLTUInt32_t spec = 0;
			hltout->GetDataBlockDescription(dt, spec);
			TObject* obj = hltout->GetDataObject();
			if (obj == NULL) continue;
			if (obj->IsA()->GetBaseClass("AliHLTGlobalTriggerDecision") != NULL)
			{
				if (dt != kAliHLTDataTypeGlobalTrigger)
				{
					cerr << "WARNING: Found an AliHLTGlobalTriggerDecision object in a data block of type '"
						<< AliHLTComponent::DataType2Text(dt).c_str()
						<< "' but expected '"
						<< AliHLTComponent::DataType2Text(kAliHLTDataTypeGlobalTrigger).c_str()
						<< "'." << endl;
				}
				if (file != NULL)
				{
					obj->Write(
						Form("HLTGlobalDecision_event_0x%llX", hltout->EventId()),
						TObject::kOverwrite
					);
				}
				obj->Print();
			}
			hltout->ReleaseDataObject(obj);
		}
		
		result = hltout->Reset();
		if (result != 0)
		{
			cerr << "ERROR: could not reset HLTOUT." << endl;
			hltout->Reset();
			continue;
		}
		rawReader->NextEvent();
	}
	
	AliHLTOUT::Delete(hltout);
	delete rawReader;
	if (file != NULL) delete file;
}
 DumpGlobalTrigger.C:1
 DumpGlobalTrigger.C:2
 DumpGlobalTrigger.C:3
 DumpGlobalTrigger.C:4
 DumpGlobalTrigger.C:5
 DumpGlobalTrigger.C:6
 DumpGlobalTrigger.C:7
 DumpGlobalTrigger.C:8
 DumpGlobalTrigger.C:9
 DumpGlobalTrigger.C:10
 DumpGlobalTrigger.C:11
 DumpGlobalTrigger.C:12
 DumpGlobalTrigger.C:13
 DumpGlobalTrigger.C:14
 DumpGlobalTrigger.C:15
 DumpGlobalTrigger.C:16
 DumpGlobalTrigger.C:17
 DumpGlobalTrigger.C:18
 DumpGlobalTrigger.C:19
 DumpGlobalTrigger.C:20
 DumpGlobalTrigger.C:21
 DumpGlobalTrigger.C:22
 DumpGlobalTrigger.C:23
 DumpGlobalTrigger.C:24
 DumpGlobalTrigger.C:25
 DumpGlobalTrigger.C:26
 DumpGlobalTrigger.C:27
 DumpGlobalTrigger.C:28
 DumpGlobalTrigger.C:29
 DumpGlobalTrigger.C:30
 DumpGlobalTrigger.C:31
 DumpGlobalTrigger.C:32
 DumpGlobalTrigger.C:33
 DumpGlobalTrigger.C:34
 DumpGlobalTrigger.C:35
 DumpGlobalTrigger.C:36
 DumpGlobalTrigger.C:37
 DumpGlobalTrigger.C:38
 DumpGlobalTrigger.C:39
 DumpGlobalTrigger.C:40
 DumpGlobalTrigger.C:41
 DumpGlobalTrigger.C:42
 DumpGlobalTrigger.C:43
 DumpGlobalTrigger.C:44
 DumpGlobalTrigger.C:45
 DumpGlobalTrigger.C:46
 DumpGlobalTrigger.C:47
 DumpGlobalTrigger.C:48
 DumpGlobalTrigger.C:49
 DumpGlobalTrigger.C:50
 DumpGlobalTrigger.C:51
 DumpGlobalTrigger.C:52
 DumpGlobalTrigger.C:53
 DumpGlobalTrigger.C:54
 DumpGlobalTrigger.C:55
 DumpGlobalTrigger.C:56
 DumpGlobalTrigger.C:57
 DumpGlobalTrigger.C:58
 DumpGlobalTrigger.C:59
 DumpGlobalTrigger.C:60
 DumpGlobalTrigger.C:61
 DumpGlobalTrigger.C:62
 DumpGlobalTrigger.C:63
 DumpGlobalTrigger.C:64
 DumpGlobalTrigger.C:65
 DumpGlobalTrigger.C:66
 DumpGlobalTrigger.C:67
 DumpGlobalTrigger.C:68
 DumpGlobalTrigger.C:69
 DumpGlobalTrigger.C:70
 DumpGlobalTrigger.C:71
 DumpGlobalTrigger.C:72
 DumpGlobalTrigger.C:73
 DumpGlobalTrigger.C:74
 DumpGlobalTrigger.C:75
 DumpGlobalTrigger.C:76
 DumpGlobalTrigger.C:77
 DumpGlobalTrigger.C:78
 DumpGlobalTrigger.C:79
 DumpGlobalTrigger.C:80
 DumpGlobalTrigger.C:81
 DumpGlobalTrigger.C:82
 DumpGlobalTrigger.C:83
 DumpGlobalTrigger.C:84
 DumpGlobalTrigger.C:85
 DumpGlobalTrigger.C:86
 DumpGlobalTrigger.C:87
 DumpGlobalTrigger.C:88
 DumpGlobalTrigger.C:89
 DumpGlobalTrigger.C:90
 DumpGlobalTrigger.C:91
 DumpGlobalTrigger.C:92
 DumpGlobalTrigger.C:93
 DumpGlobalTrigger.C:94
 DumpGlobalTrigger.C:95
 DumpGlobalTrigger.C:96
 DumpGlobalTrigger.C:97
 DumpGlobalTrigger.C:98
 DumpGlobalTrigger.C:99
 DumpGlobalTrigger.C:100
 DumpGlobalTrigger.C:101
 DumpGlobalTrigger.C:102
 DumpGlobalTrigger.C:103
 DumpGlobalTrigger.C:104
 DumpGlobalTrigger.C:105
 DumpGlobalTrigger.C:106
 DumpGlobalTrigger.C:107
 DumpGlobalTrigger.C:108
 DumpGlobalTrigger.C:109
 DumpGlobalTrigger.C:110
 DumpGlobalTrigger.C:111
 DumpGlobalTrigger.C:112
 DumpGlobalTrigger.C:113
 DumpGlobalTrigger.C:114
 DumpGlobalTrigger.C:115
 DumpGlobalTrigger.C:116
 DumpGlobalTrigger.C:117
 DumpGlobalTrigger.C:118
 DumpGlobalTrigger.C:119
 DumpGlobalTrigger.C:120
 DumpGlobalTrigger.C:121
 DumpGlobalTrigger.C:122
 DumpGlobalTrigger.C:123
 DumpGlobalTrigger.C:124
 DumpGlobalTrigger.C:125
 DumpGlobalTrigger.C:126
 DumpGlobalTrigger.C:127
 DumpGlobalTrigger.C:128
 DumpGlobalTrigger.C:129
 DumpGlobalTrigger.C:130
 DumpGlobalTrigger.C:131
 DumpGlobalTrigger.C:132
 DumpGlobalTrigger.C:133
 DumpGlobalTrigger.C:134
 DumpGlobalTrigger.C:135
 DumpGlobalTrigger.C:136
 DumpGlobalTrigger.C:137
 DumpGlobalTrigger.C:138
 DumpGlobalTrigger.C:139
 DumpGlobalTrigger.C:140
 DumpGlobalTrigger.C:141
 DumpGlobalTrigger.C:142
 DumpGlobalTrigger.C:143
 DumpGlobalTrigger.C:144
 DumpGlobalTrigger.C:145
 DumpGlobalTrigger.C:146
 DumpGlobalTrigger.C:147
 DumpGlobalTrigger.C:148
 DumpGlobalTrigger.C:149
 DumpGlobalTrigger.C:150
 DumpGlobalTrigger.C:151
 DumpGlobalTrigger.C:152
 DumpGlobalTrigger.C:153
 DumpGlobalTrigger.C:154
 DumpGlobalTrigger.C:155
 DumpGlobalTrigger.C:156
 DumpGlobalTrigger.C:157
 DumpGlobalTrigger.C:158
 DumpGlobalTrigger.C:159
 DumpGlobalTrigger.C:160
 DumpGlobalTrigger.C:161
 DumpGlobalTrigger.C:162
 DumpGlobalTrigger.C:163
 DumpGlobalTrigger.C:164
 DumpGlobalTrigger.C:165
 DumpGlobalTrigger.C:166
 DumpGlobalTrigger.C:167
 DumpGlobalTrigger.C:168
 DumpGlobalTrigger.C:169
 DumpGlobalTrigger.C:170
 DumpGlobalTrigger.C:171
 DumpGlobalTrigger.C:172
 DumpGlobalTrigger.C:173
 DumpGlobalTrigger.C:174
 DumpGlobalTrigger.C:175
 DumpGlobalTrigger.C:176
 DumpGlobalTrigger.C:177
 DumpGlobalTrigger.C:178
 DumpGlobalTrigger.C:179
 DumpGlobalTrigger.C:180
 DumpGlobalTrigger.C:181
 DumpGlobalTrigger.C:182
 DumpGlobalTrigger.C:183
 DumpGlobalTrigger.C:184
 DumpGlobalTrigger.C:185
 DumpGlobalTrigger.C:186
 DumpGlobalTrigger.C:187
 DumpGlobalTrigger.C:188
 DumpGlobalTrigger.C:189
 DumpGlobalTrigger.C:190
 DumpGlobalTrigger.C:191