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 SanityCheckGlobalTriggerDecisions.C
 * \brief Macro for performing sanity checks on the HLT global trigger decisions.
 *
 * Basic sanity checks are performed by the SanityCheckGlobalTriggerDecisions macro
 * on the HLT global trigger counters. These checks include:
 *  - The counters must be increasing with increasing event ID.
 *  - The total events counter must be the largest and the number of events read
 *    by the raw reader must be less than or equal to the total events counter.
 *
 * 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/SanityCheckGlobalTriggerDecisions.C
 * \endcode
 * This will expect data in DDL directory format in the current directory.
 *
 * \author Artur Szostak <artursz@iafrica.com>
 */

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "AliHLTGlobalTriggerDecision.h"
#include "TSystem.h"
#include "TString.h"
#include "TFile.h"
#include "TCollection.h"
#include "TMap.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TArrayI.h"
#include "TArrayL64.h"
#include "Riostream.h"
#endif

#include "DumpGlobalTrigger.C"


/**
 * Checks to see if a file contains global HLT trigger decision objects.
 * \param filename  The name of the ROOT file to check.
 * \returns true if the file contains AliHLTGlobalTriggerDecision objects and
 *    false otherwise.
 */
bool FileContainsDecisions(const char* filename)
{
	TFile* file = new TFile(filename, "READ");
	if (file == NULL)
	{
		cerr << "ERROR: Could not create a TFile object to open '"
			<< filename << "'." << endl;
		return false;
	}
	TIter next(file->GetListOfKeys());
	TObject* key = NULL;
	bool result = false;
	while ((key = next()) != NULL)
	{
		TObject* obj = file->Get(key->GetName());
		if (obj == NULL) continue;
		if (TString(obj->ClassName()) == "AliHLTGlobalTriggerDecision")
		{
			result = true;
			break;
		}
	}
	delete file;
	return result;
}

/**
 * Routine to print the counters in a HLT global trigger decision object.
 * \param key  The key object storing the key name of the object in the ROOT file.
 * \param decision  The HLT global decision object to print.
 */
void PrintCounters(const TObject* key, const AliHLTGlobalTriggerDecision* decision)
{
	if (key == NULL) return;
	if (decision == NULL) return;
	cout << key->GetName() << " (Global component ID = " << decision->GetUniqueID() << "):";
	const TArrayL64& counters = decision->Counters();
	for (Int_t i = 0; i < counters.GetSize(); ++i)
	{
		cout << " " << counters[i];
	}
	if (counters.GetSize() <= 0) cout << "(none)";
	cout << endl;
}

/**
 * Performs sanity checks on the global HLT trigger counters found in the raw 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).
 *     One can also specify the output ROOT file as generated by the
 *     DumpGlobalTrigger.C macro directly.
 * \param firstEvent  The event number of the first event to process. (default = 0)
 *     This parameter is ignored if dataSource points to a file containing
 *     AliHLTGlobalTriggerDecision objects.
 * \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)
 *     This parameter is ignored if dataSource points to a file containing
 *     AliHLTGlobalTriggerDecision objects.
 * \param debug  Specifies if full debug messages should be printed when running
 *     the DumpGlobalTrigger.C macro.
 * \returns true if the data passed all validity checks and false if there was a problem.
 */
bool SanityCheckGlobalTriggerDecisions(
		const char* dataSource = "./",
		Int_t firstEvent = 0,
		Int_t lastEvent = -1,
		bool debug = false
	)
{
	const char* outputFile = "globalTriggerDecisions.root";
	if ((! TString(dataSource).EndsWith(".root")) ||
	    (TString(dataSource).EndsWith(".root") && ! FileContainsDecisions(dataSource))
	   )
	{
		if (gSystem->Exec(Form("test -f %s", outputFile)) == 0)
		{
			cerr << "ERROR: File " << outputFile
				<< " already exists. It must be moved or removed."
				<< " This script will not overwrite it."
				<< endl;
			return false;
		}
		DumpGlobalTrigger(dataSource, firstEvent, lastEvent, outputFile, debug);
	}
	else
	{
		outputFile = dataSource;
	}

	TMap map;
	map.SetOwnerKeyValue(kTRUE, kTRUE);
	TObjArray eventIds;
	eventIds.SetOwner(kFALSE);
	TArrayI objIds;

	TFile* file = new TFile(outputFile, "READ");
	if (file == NULL)
	{
		cerr << "ERROR: Could not create a TFile object to open '"
			<< outputFile << "'." << endl;
		return false;
	}
	TIter next(file->GetListOfKeys());
	TObject* key = NULL;
	while ((key = next()) != NULL)
	{
		TObject* obj = file->Get(key->GetName());
		if (obj == NULL)
		{
			cerr << "Warning: Could not fetch object '" << key->GetName() << "'." << endl;
			continue;
		}
		TObjString* id = new TObjString(key->GetName());
		map.Add(id, obj->Clone());
		eventIds.Add(id);
		bool addID = true;
		for (Int_t i = 0; i < objIds.GetSize(); ++i)
		{
			if (objIds[i] == Int_t(obj->GetUniqueID()))
			{
				addID = false;
				break;
			}
		}
		if (addID)
		{
			objIds.Set(objIds.GetSize()+1);
			objIds[objIds.GetSize()-1] = Int_t(obj->GetUniqueID());
		}
	}
	delete file;

	eventIds.Sort();  // Must sort the events in order of increasing event ID.
	ULong64_t totalCounters = 0;
	bool result = true;

	for (Int_t n = 0; n < objIds.GetSize(); ++n)
	{
		UInt_t objId = UInt_t(objIds[n]);
		TObject* oldKey = NULL;
		AliHLTGlobalTriggerDecision* oldDecision = NULL;
		TIter nextEvent(&eventIds);
		AliHLTGlobalTriggerDecision* decision = NULL;
		while ((key = nextEvent()) != NULL)
		{
			TPair* pair = (TPair*) map.FindObject(key->GetName());
			if (pair == NULL)
			{
				cerr << "Warning: Could not find trigger decision '" << key->GetName() << "' in the map." << endl;
				continue;
			}
			decision = (AliHLTGlobalTriggerDecision*) pair->Value();
			if (decision == NULL)
			{
				cerr << "Warning: The trigger decision object for '" << key->GetName() << "' was NULL in the map." << endl;
				continue;
			}
			if (decision->GetUniqueID() != objId) continue;  // Filter on the current ID we are handling.

			bool printCounters = false;
			const TArrayL64& counters = decision->Counters();

			// Check that all current counters are larger than the old ones.
			if (oldDecision != NULL)
			{
				const TArrayL64& oldCounters = oldDecision->Counters();
				if (counters.GetSize() == oldCounters.GetSize())
				{
					for (Int_t i = 0; i < counters.GetSize(); ++i)
					{
						if (oldCounters[i] > counters[i])
						{
							cerr << "ERROR: Previous counter value " << oldCounters[i]
								<< " from object " << oldKey->GetName()
								<< " is larger than the new one " << counters[i]
								<< " from " << key->GetName()
								<< "." << endl;
							printCounters = true;
							result = false;
						}
					}
				}
				else
				{
					cerr << "ERROR: Number of previous counters from object " << oldKey->GetName()
						<< " do not match the current counters from " << key->GetName()
						<< "." << endl;
					printCounters = true;
					result = false;
				}
			}

			// Check that all counters are larger than the total counter at the end.
			if (counters.GetSize() > 0)
			{
				for (Int_t i = 0; i < counters.GetSize()-1; ++i)
				{
					if (counters[i] > counters[counters.GetSize()-1])
					{
						cerr << "ERROR: Counter " << i
							<< " with value " << counters[i]
							<< " from object " << oldKey->GetName()
							<< " is larger than the last counter " << counters[counters.GetSize()-1]
							<< "." << endl;
						printCounters = true;
						result = false;
					}
				}
			}

			if (debug && ! printCounters) PrintCounters(key, decision);
			if (printCounters)
			{				
				cout << "Previous counters: "; PrintCounters(oldKey, oldDecision);
				cout << " Current counters: "; PrintCounters(key, decision);
				cout << endl;
			}
			oldDecision = decision;
			oldKey = key;
		}
		if (oldDecision != NULL)
		{
			if (oldDecision->Counters().GetSize() > 0)
			{
				// oldDecision will contain the last counter, which we use to get
				// the total number of events seen by the global trigger component.
				const TArrayL64& oldCounters = oldDecision->Counters();
				totalCounters += oldCounters[oldCounters.GetSize()-1];
			}
		}
	}
	
	if (ULong64_t(eventIds.GetEntries()) > totalCounters)
	{
		cerr << "ERROR: The total number of events counters added up to " << totalCounters
			<< ", but the total number of events seen on file is " << eventIds.GetEntries()
			<< ". This is inconsistent." << endl;
		result = false;
	}
	return result;
}

 SanityCheckGlobalTriggerDecisions.C:1
 SanityCheckGlobalTriggerDecisions.C:2
 SanityCheckGlobalTriggerDecisions.C:3
 SanityCheckGlobalTriggerDecisions.C:4
 SanityCheckGlobalTriggerDecisions.C:5
 SanityCheckGlobalTriggerDecisions.C:6
 SanityCheckGlobalTriggerDecisions.C:7
 SanityCheckGlobalTriggerDecisions.C:8
 SanityCheckGlobalTriggerDecisions.C:9
 SanityCheckGlobalTriggerDecisions.C:10
 SanityCheckGlobalTriggerDecisions.C:11
 SanityCheckGlobalTriggerDecisions.C:12
 SanityCheckGlobalTriggerDecisions.C:13
 SanityCheckGlobalTriggerDecisions.C:14
 SanityCheckGlobalTriggerDecisions.C:15
 SanityCheckGlobalTriggerDecisions.C:16
 SanityCheckGlobalTriggerDecisions.C:17
 SanityCheckGlobalTriggerDecisions.C:18
 SanityCheckGlobalTriggerDecisions.C:19
 SanityCheckGlobalTriggerDecisions.C:20
 SanityCheckGlobalTriggerDecisions.C:21
 SanityCheckGlobalTriggerDecisions.C:22
 SanityCheckGlobalTriggerDecisions.C:23
 SanityCheckGlobalTriggerDecisions.C:24
 SanityCheckGlobalTriggerDecisions.C:25
 SanityCheckGlobalTriggerDecisions.C:26
 SanityCheckGlobalTriggerDecisions.C:27
 SanityCheckGlobalTriggerDecisions.C:28
 SanityCheckGlobalTriggerDecisions.C:29
 SanityCheckGlobalTriggerDecisions.C:30
 SanityCheckGlobalTriggerDecisions.C:31
 SanityCheckGlobalTriggerDecisions.C:32
 SanityCheckGlobalTriggerDecisions.C:33
 SanityCheckGlobalTriggerDecisions.C:34
 SanityCheckGlobalTriggerDecisions.C:35
 SanityCheckGlobalTriggerDecisions.C:36
 SanityCheckGlobalTriggerDecisions.C:37
 SanityCheckGlobalTriggerDecisions.C:38
 SanityCheckGlobalTriggerDecisions.C:39
 SanityCheckGlobalTriggerDecisions.C:40
 SanityCheckGlobalTriggerDecisions.C:41
 SanityCheckGlobalTriggerDecisions.C:42
 SanityCheckGlobalTriggerDecisions.C:43
 SanityCheckGlobalTriggerDecisions.C:44
 SanityCheckGlobalTriggerDecisions.C:45
 SanityCheckGlobalTriggerDecisions.C:46
 SanityCheckGlobalTriggerDecisions.C:47
 SanityCheckGlobalTriggerDecisions.C:48
 SanityCheckGlobalTriggerDecisions.C:49
 SanityCheckGlobalTriggerDecisions.C:50
 SanityCheckGlobalTriggerDecisions.C:51
 SanityCheckGlobalTriggerDecisions.C:52
 SanityCheckGlobalTriggerDecisions.C:53
 SanityCheckGlobalTriggerDecisions.C:54
 SanityCheckGlobalTriggerDecisions.C:55
 SanityCheckGlobalTriggerDecisions.C:56
 SanityCheckGlobalTriggerDecisions.C:57
 SanityCheckGlobalTriggerDecisions.C:58
 SanityCheckGlobalTriggerDecisions.C:59
 SanityCheckGlobalTriggerDecisions.C:60
 SanityCheckGlobalTriggerDecisions.C:61
 SanityCheckGlobalTriggerDecisions.C:62
 SanityCheckGlobalTriggerDecisions.C:63
 SanityCheckGlobalTriggerDecisions.C:64
 SanityCheckGlobalTriggerDecisions.C:65
 SanityCheckGlobalTriggerDecisions.C:66
 SanityCheckGlobalTriggerDecisions.C:67
 SanityCheckGlobalTriggerDecisions.C:68
 SanityCheckGlobalTriggerDecisions.C:69
 SanityCheckGlobalTriggerDecisions.C:70
 SanityCheckGlobalTriggerDecisions.C:71
 SanityCheckGlobalTriggerDecisions.C:72
 SanityCheckGlobalTriggerDecisions.C:73
 SanityCheckGlobalTriggerDecisions.C:74
 SanityCheckGlobalTriggerDecisions.C:75
 SanityCheckGlobalTriggerDecisions.C:76
 SanityCheckGlobalTriggerDecisions.C:77
 SanityCheckGlobalTriggerDecisions.C:78
 SanityCheckGlobalTriggerDecisions.C:79
 SanityCheckGlobalTriggerDecisions.C:80
 SanityCheckGlobalTriggerDecisions.C:81
 SanityCheckGlobalTriggerDecisions.C:82
 SanityCheckGlobalTriggerDecisions.C:83
 SanityCheckGlobalTriggerDecisions.C:84
 SanityCheckGlobalTriggerDecisions.C:85
 SanityCheckGlobalTriggerDecisions.C:86
 SanityCheckGlobalTriggerDecisions.C:87
 SanityCheckGlobalTriggerDecisions.C:88
 SanityCheckGlobalTriggerDecisions.C:89
 SanityCheckGlobalTriggerDecisions.C:90
 SanityCheckGlobalTriggerDecisions.C:91
 SanityCheckGlobalTriggerDecisions.C:92
 SanityCheckGlobalTriggerDecisions.C:93
 SanityCheckGlobalTriggerDecisions.C:94
 SanityCheckGlobalTriggerDecisions.C:95
 SanityCheckGlobalTriggerDecisions.C:96
 SanityCheckGlobalTriggerDecisions.C:97
 SanityCheckGlobalTriggerDecisions.C:98
 SanityCheckGlobalTriggerDecisions.C:99
 SanityCheckGlobalTriggerDecisions.C:100
 SanityCheckGlobalTriggerDecisions.C:101
 SanityCheckGlobalTriggerDecisions.C:102
 SanityCheckGlobalTriggerDecisions.C:103
 SanityCheckGlobalTriggerDecisions.C:104
 SanityCheckGlobalTriggerDecisions.C:105
 SanityCheckGlobalTriggerDecisions.C:106
 SanityCheckGlobalTriggerDecisions.C:107
 SanityCheckGlobalTriggerDecisions.C:108
 SanityCheckGlobalTriggerDecisions.C:109
 SanityCheckGlobalTriggerDecisions.C:110
 SanityCheckGlobalTriggerDecisions.C:111
 SanityCheckGlobalTriggerDecisions.C:112
 SanityCheckGlobalTriggerDecisions.C:113
 SanityCheckGlobalTriggerDecisions.C:114
 SanityCheckGlobalTriggerDecisions.C:115
 SanityCheckGlobalTriggerDecisions.C:116
 SanityCheckGlobalTriggerDecisions.C:117
 SanityCheckGlobalTriggerDecisions.C:118
 SanityCheckGlobalTriggerDecisions.C:119
 SanityCheckGlobalTriggerDecisions.C:120
 SanityCheckGlobalTriggerDecisions.C:121
 SanityCheckGlobalTriggerDecisions.C:122
 SanityCheckGlobalTriggerDecisions.C:123
 SanityCheckGlobalTriggerDecisions.C:124
 SanityCheckGlobalTriggerDecisions.C:125
 SanityCheckGlobalTriggerDecisions.C:126
 SanityCheckGlobalTriggerDecisions.C:127
 SanityCheckGlobalTriggerDecisions.C:128
 SanityCheckGlobalTriggerDecisions.C:129
 SanityCheckGlobalTriggerDecisions.C:130
 SanityCheckGlobalTriggerDecisions.C:131
 SanityCheckGlobalTriggerDecisions.C:132
 SanityCheckGlobalTriggerDecisions.C:133
 SanityCheckGlobalTriggerDecisions.C:134
 SanityCheckGlobalTriggerDecisions.C:135
 SanityCheckGlobalTriggerDecisions.C:136
 SanityCheckGlobalTriggerDecisions.C:137
 SanityCheckGlobalTriggerDecisions.C:138
 SanityCheckGlobalTriggerDecisions.C:139
 SanityCheckGlobalTriggerDecisions.C:140
 SanityCheckGlobalTriggerDecisions.C:141
 SanityCheckGlobalTriggerDecisions.C:142
 SanityCheckGlobalTriggerDecisions.C:143
 SanityCheckGlobalTriggerDecisions.C:144
 SanityCheckGlobalTriggerDecisions.C:145
 SanityCheckGlobalTriggerDecisions.C:146
 SanityCheckGlobalTriggerDecisions.C:147
 SanityCheckGlobalTriggerDecisions.C:148
 SanityCheckGlobalTriggerDecisions.C:149
 SanityCheckGlobalTriggerDecisions.C:150
 SanityCheckGlobalTriggerDecisions.C:151
 SanityCheckGlobalTriggerDecisions.C:152
 SanityCheckGlobalTriggerDecisions.C:153
 SanityCheckGlobalTriggerDecisions.C:154
 SanityCheckGlobalTriggerDecisions.C:155
 SanityCheckGlobalTriggerDecisions.C:156
 SanityCheckGlobalTriggerDecisions.C:157
 SanityCheckGlobalTriggerDecisions.C:158
 SanityCheckGlobalTriggerDecisions.C:159
 SanityCheckGlobalTriggerDecisions.C:160
 SanityCheckGlobalTriggerDecisions.C:161
 SanityCheckGlobalTriggerDecisions.C:162
 SanityCheckGlobalTriggerDecisions.C:163
 SanityCheckGlobalTriggerDecisions.C:164
 SanityCheckGlobalTriggerDecisions.C:165
 SanityCheckGlobalTriggerDecisions.C:166
 SanityCheckGlobalTriggerDecisions.C:167
 SanityCheckGlobalTriggerDecisions.C:168
 SanityCheckGlobalTriggerDecisions.C:169
 SanityCheckGlobalTriggerDecisions.C:170
 SanityCheckGlobalTriggerDecisions.C:171
 SanityCheckGlobalTriggerDecisions.C:172
 SanityCheckGlobalTriggerDecisions.C:173
 SanityCheckGlobalTriggerDecisions.C:174
 SanityCheckGlobalTriggerDecisions.C:175
 SanityCheckGlobalTriggerDecisions.C:176
 SanityCheckGlobalTriggerDecisions.C:177
 SanityCheckGlobalTriggerDecisions.C:178
 SanityCheckGlobalTriggerDecisions.C:179
 SanityCheckGlobalTriggerDecisions.C:180
 SanityCheckGlobalTriggerDecisions.C:181
 SanityCheckGlobalTriggerDecisions.C:182
 SanityCheckGlobalTriggerDecisions.C:183
 SanityCheckGlobalTriggerDecisions.C:184
 SanityCheckGlobalTriggerDecisions.C:185
 SanityCheckGlobalTriggerDecisions.C:186
 SanityCheckGlobalTriggerDecisions.C:187
 SanityCheckGlobalTriggerDecisions.C:188
 SanityCheckGlobalTriggerDecisions.C:189
 SanityCheckGlobalTriggerDecisions.C:190
 SanityCheckGlobalTriggerDecisions.C:191
 SanityCheckGlobalTriggerDecisions.C:192
 SanityCheckGlobalTriggerDecisions.C:193
 SanityCheckGlobalTriggerDecisions.C:194
 SanityCheckGlobalTriggerDecisions.C:195
 SanityCheckGlobalTriggerDecisions.C:196
 SanityCheckGlobalTriggerDecisions.C:197
 SanityCheckGlobalTriggerDecisions.C:198
 SanityCheckGlobalTriggerDecisions.C:199
 SanityCheckGlobalTriggerDecisions.C:200
 SanityCheckGlobalTriggerDecisions.C:201
 SanityCheckGlobalTriggerDecisions.C:202
 SanityCheckGlobalTriggerDecisions.C:203
 SanityCheckGlobalTriggerDecisions.C:204
 SanityCheckGlobalTriggerDecisions.C:205
 SanityCheckGlobalTriggerDecisions.C:206
 SanityCheckGlobalTriggerDecisions.C:207
 SanityCheckGlobalTriggerDecisions.C:208
 SanityCheckGlobalTriggerDecisions.C:209
 SanityCheckGlobalTriggerDecisions.C:210
 SanityCheckGlobalTriggerDecisions.C:211
 SanityCheckGlobalTriggerDecisions.C:212
 SanityCheckGlobalTriggerDecisions.C:213
 SanityCheckGlobalTriggerDecisions.C:214
 SanityCheckGlobalTriggerDecisions.C:215
 SanityCheckGlobalTriggerDecisions.C:216
 SanityCheckGlobalTriggerDecisions.C:217
 SanityCheckGlobalTriggerDecisions.C:218
 SanityCheckGlobalTriggerDecisions.C:219
 SanityCheckGlobalTriggerDecisions.C:220
 SanityCheckGlobalTriggerDecisions.C:221
 SanityCheckGlobalTriggerDecisions.C:222
 SanityCheckGlobalTriggerDecisions.C:223
 SanityCheckGlobalTriggerDecisions.C:224
 SanityCheckGlobalTriggerDecisions.C:225
 SanityCheckGlobalTriggerDecisions.C:226
 SanityCheckGlobalTriggerDecisions.C:227
 SanityCheckGlobalTriggerDecisions.C:228
 SanityCheckGlobalTriggerDecisions.C:229
 SanityCheckGlobalTriggerDecisions.C:230
 SanityCheckGlobalTriggerDecisions.C:231
 SanityCheckGlobalTriggerDecisions.C:232
 SanityCheckGlobalTriggerDecisions.C:233
 SanityCheckGlobalTriggerDecisions.C:234
 SanityCheckGlobalTriggerDecisions.C:235
 SanityCheckGlobalTriggerDecisions.C:236
 SanityCheckGlobalTriggerDecisions.C:237
 SanityCheckGlobalTriggerDecisions.C:238
 SanityCheckGlobalTriggerDecisions.C:239
 SanityCheckGlobalTriggerDecisions.C:240
 SanityCheckGlobalTriggerDecisions.C:241
 SanityCheckGlobalTriggerDecisions.C:242
 SanityCheckGlobalTriggerDecisions.C:243
 SanityCheckGlobalTriggerDecisions.C:244
 SanityCheckGlobalTriggerDecisions.C:245
 SanityCheckGlobalTriggerDecisions.C:246
 SanityCheckGlobalTriggerDecisions.C:247
 SanityCheckGlobalTriggerDecisions.C:248
 SanityCheckGlobalTriggerDecisions.C:249
 SanityCheckGlobalTriggerDecisions.C:250
 SanityCheckGlobalTriggerDecisions.C:251
 SanityCheckGlobalTriggerDecisions.C:252
 SanityCheckGlobalTriggerDecisions.C:253
 SanityCheckGlobalTriggerDecisions.C:254
 SanityCheckGlobalTriggerDecisions.C:255
 SanityCheckGlobalTriggerDecisions.C:256
 SanityCheckGlobalTriggerDecisions.C:257
 SanityCheckGlobalTriggerDecisions.C:258
 SanityCheckGlobalTriggerDecisions.C:259
 SanityCheckGlobalTriggerDecisions.C:260
 SanityCheckGlobalTriggerDecisions.C:261
 SanityCheckGlobalTriggerDecisions.C:262
 SanityCheckGlobalTriggerDecisions.C:263
 SanityCheckGlobalTriggerDecisions.C:264
 SanityCheckGlobalTriggerDecisions.C:265
 SanityCheckGlobalTriggerDecisions.C:266
 SanityCheckGlobalTriggerDecisions.C:267
 SanityCheckGlobalTriggerDecisions.C:268
 SanityCheckGlobalTriggerDecisions.C:269
 SanityCheckGlobalTriggerDecisions.C:270
 SanityCheckGlobalTriggerDecisions.C:271
 SanityCheckGlobalTriggerDecisions.C:272
 SanityCheckGlobalTriggerDecisions.C:273
 SanityCheckGlobalTriggerDecisions.C:274
 SanityCheckGlobalTriggerDecisions.C:275
 SanityCheckGlobalTriggerDecisions.C:276
 SanityCheckGlobalTriggerDecisions.C:277
 SanityCheckGlobalTriggerDecisions.C:278
 SanityCheckGlobalTriggerDecisions.C:279
 SanityCheckGlobalTriggerDecisions.C:280
 SanityCheckGlobalTriggerDecisions.C:281
 SanityCheckGlobalTriggerDecisions.C:282
 SanityCheckGlobalTriggerDecisions.C:283
 SanityCheckGlobalTriggerDecisions.C:284
 SanityCheckGlobalTriggerDecisions.C:285
 SanityCheckGlobalTriggerDecisions.C:286
 SanityCheckGlobalTriggerDecisions.C:287
 SanityCheckGlobalTriggerDecisions.C:288
 SanityCheckGlobalTriggerDecisions.C:289
 SanityCheckGlobalTriggerDecisions.C:290
 SanityCheckGlobalTriggerDecisions.C:291
 SanityCheckGlobalTriggerDecisions.C:292
 SanityCheckGlobalTriggerDecisions.C:293
 SanityCheckGlobalTriggerDecisions.C:294
 SanityCheckGlobalTriggerDecisions.C:295
 SanityCheckGlobalTriggerDecisions.C:296
 SanityCheckGlobalTriggerDecisions.C:297
 SanityCheckGlobalTriggerDecisions.C:298
 SanityCheckGlobalTriggerDecisions.C:299
 SanityCheckGlobalTriggerDecisions.C:300
 SanityCheckGlobalTriggerDecisions.C:301
 SanityCheckGlobalTriggerDecisions.C:302
 SanityCheckGlobalTriggerDecisions.C:303
 SanityCheckGlobalTriggerDecisions.C:304
 SanityCheckGlobalTriggerDecisions.C:305
 SanityCheckGlobalTriggerDecisions.C:306
 SanityCheckGlobalTriggerDecisions.C:307