ROOT logo
/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        *
 * ALICE Experiment at CERN, All rights reserved.                         *
 *                                                                        *
 * Primary Authors: Artur Szostak <artursz@iafrica.com>                   *
 *                  for The ALICE HLT Project.                            *
 *                                                                        *
 * 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.                  *
 **************************************************************************/

/**
 * @file   testGlobalTriggerComponent.C
 * @author Artur Szostak <artursz@iafrica.com>
 * @date   19 Dec 2008
 *
 * This macro is used to test the AliHLTGlobalTriggerComponent class.
 * A number of tests are run with the AliHLTSystem framework to check that
 * the automatically generated global trigger logic is generated correctly.
 *
 * This macro can also be used to debug the configuration that fails.
 * If a configuration test fails then the global trigger logic implementation
 * is left in a generated file with a name of the form \<AliHLTGlobalTriggerImpl_*.cxx\>.
 * For example a file named like: AliHLTGlobalTriggerImpl_08869e64_c54b_11de_9717_0101007fbeef.cxx
 * One can make manual modifications to this file and then rerun the test with
 * these manual modifications with the following command in aliroot:
 *  .x testGlobalTriggerComponent.C+(\<configVersion\>,"\<AliHLTGlobalTriggerImpl_*\>")
 * where \<configVersion\> is the appropriate config version number as passed to the
 * TriggerConfig.C file to initialise the configuration we want to test. Also take note
 * that we only specify the root of the file name without the .cxx file name extention.
 * For our example file name the command to execute in aliroot would be:
 *  .x testGlobalTriggerComponent.C+(2,"AliHLTGlobalTriggerImpl_08869e64_c54b_11de_9717_0101007fbeef")
 * where we are testing the 2nd trigger configuration in TriggerConfig.C.
 */

#if defined(__CINT__) && (! defined(__MAKECINT__))
#error This macro must be compiled. Try running as testGlobalTriggerComponent.C++, but remember to load the libAliHLTTrigger.so library first.
#endif

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TSystem.h"
#include "TClassTable.h"
#include "TFile.h"
#include "AliLog.h"
#include "AliHLTReadoutList.h"
#include "AliHLTTriggerDomain.h"
#include "AliHLTTriggerDecision.h"
#include "AliHLTGlobalTriggerDecision.h"
#include "AliHLTScalars.h"
#include "AliHLTSystem.h"
#include "AliHLTConfiguration.h"
#include "Riostream.h"
#endif

/**
 * Generates some sample input data and writes it into 8 files named
 * testInputFile1.root ... testInputFile8.root
 */
void GenerateInputData()
{
	bool loadedLibs = false;
	if (gClassTable->GetID("AliHLTGlobalTriggerComponent") < 0)
	{
		gSystem->Load("libAliHLTUtil.so");
		gSystem->Load("libAliHLTTRD.so");
		gSystem->Load("libAliHLTMUON.so");
		gSystem->Load("libAliHLTTrigger.so");
		loadedLibs = true;
	}

	AliHLTReadoutList readoutList1("TPC");
	AliHLTTriggerDomain triggerDomain1;
	triggerDomain1.Add("CLUSTERS", "TPC ");
	triggerDomain1.Add("TRACKS", "TPC ");
	triggerDomain1.Add(readoutList1);
	AliHLTTriggerDecision decision1(true, "triggerTPC", triggerDomain1, "TPC has data");
	
	AliHLTReadoutList readoutList2a("MUONTRK");
	AliHLTReadoutList readoutList2b("MUONTRG");
	AliHLTTriggerDomain triggerDomain2;
	triggerDomain2.Add("TRACKS", "MUON");
	triggerDomain2.Add(readoutList2a);
	triggerDomain2.Add(readoutList2b);
	AliHLTTriggerDecision decision2(true, "triggerMUON", triggerDomain2, "MUON has data");
	
	AliHLTReadoutList readoutList3("ITSSSD");
	AliHLTTriggerDomain triggerDomain3;
	triggerDomain3.Add("*******", "SSD ");
	triggerDomain3.Add(readoutList3);
	AliHLTTriggerDecision decision3(true, "triggerSSD", triggerDomain3, "SSD has data");
	
	AliHLTScalars summary1;
	summary1.GetScalar("TrigClass").Value(0x1);
	
	AliHLTScalars summary2;
	summary2.GetScalar("TrigClass").Value(0x2);
	
	TFile* file = new TFile("testInputFile1.root", "RECREATE");
	decision1.Write("triggerTPC");
	decision2.Write("triggerMUON");
	decision3.Write("triggerSSD");
	summary2.Write("summary");
	delete file;
	
	file = new TFile("testInputFile2.root", "RECREATE");
	decision1.Write("triggerTPC");
	summary2.Write("summary");
	delete file;
	
	file = new TFile("testInputFile3.root", "RECREATE");
	decision2.Write("triggerMUON");
	summary1.Write("summary");
	delete file;
	
	file = new TFile("testInputFile4.root", "RECREATE");
	decision3.Write("triggerSSD");
	summary2.Write("summary");
	delete file;
	
	file = new TFile("testInputFile5.root", "RECREATE");
	decision1.Write("triggerTPC");
	decision2.Write("triggerMUON");
	summary1.Write("summary");
	delete file;
	
	file = new TFile("testInputFile6.root", "RECREATE");
	decision1.Write("triggerTPC");
	decision3.Write("triggerSSD");
	summary2.Write("summary");
	delete file;
	
	file = new TFile("testInputFile7.root", "RECREATE");
	decision2.Write("triggerMUON");
	decision3.Write("triggerSSD");
	summary1.Write("summary");
	delete file;
	
	file = new TFile("testInputFile8.root", "RECREATE");
	delete file;
	
	/*FIXME This has stopped working in AliRoot, it causes a segfault now within the AliHLTReadoutList vtable.
	if (loadedLibs)
	{
		gSystem->Unload("libAliHLTTrigger.so");
		gSystem->Unload("libAliHLTMUON.so");
		gSystem->Unload("libAliHLTTRD.so");
		gSystem->Unload("libAliHLTUtil.so");
	}
	*/
}

/**
 * Runs a small global trigger test chain with the different configuration as specified
 * in TriggerConfig.C.
 * \param config  The configuration version to pass to TriggerConfig.C
 * \param usecint  If true then the global trigger component uses CINT to interpret
 *     the code rather than compiling it.
 * \param debug  If true then the global trigger component generates extra debug
 *     statements in the on the fly AliHLTGlobalTriggerImp_*.cxx file.
 * \param numOfEvents  The number of events to run the chain for.
 * \param customClass  Names the custom class that should be loaded from the file
 *     <i>\<customClass\>.cxx</i>. This is useful for debugging only. i.e. you can
 *     edit a generated logic file and test it by hand.
 */
void RunTrigger(int config = 0, bool usecint = false, bool debug = false, int numOfEvents = 8, const char* customClass = NULL)
{
	AliHLTSystem sys;
	sys.ScanOptions("ECS=CTP_TRIGGER_CLASS=00:TRIGGER-ALL:00-01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17");
	sys.LoadComponentLibraries("libAliHLTUtil.so");
	sys.LoadComponentLibraries("libAliHLTTRD.so");
	sys.LoadComponentLibraries("libAliHLTMUON.so");
	sys.LoadComponentLibraries("libAliHLTTrigger.so");
	if (debug)
	{
		AliLog::SetGlobalLogLevel(AliLog::kMaxType);
		sys.SetGlobalLoggingLevel(kHLTLogAll);
	}
	
	TString cmdline = "-datatype ROOTTOBJ 'HLT ' ";
	for (int i = 1; i <= 8; i++)
	{
		if (i > 1) cmdline += " -nextevent";
		cmdline += Form(" -datafile testInputFile%d.root", i);
	}
	AliHLTConfiguration pub("pub", "ROOTFilePublisher", NULL, cmdline.Data());
	
	cmdline = Form("-config $ALICE_ROOT/HLT/trigger/test/TriggerConfig.C(%d)"
		" -includepath $ALICE_ROOT/include -includepath $ALICE_ROOT/HLT/BASE"
		" -includepath $ALICE_ROOT/HLT/trigger -include AliHLTScalars.h",
		config
		);
	if (customClass != NULL) cmdline += Form(" -usecode %s.cxx %s", customClass, customClass);
	if (usecint) cmdline += " -cint";
	if (debug) cmdline += " -debug";
	AliHLTConfiguration proc("proc", "HLTGlobalTrigger", "pub", cmdline.Data());
	
	AliHLTConfiguration sink("sink", "ROOTFileWriter", "proc", "-datafile testOutputFile.root -concatenate-events");
	
	sys.BuildTaskList("sink");
	sys.Run(
		numOfEvents,
		1,   // Stop chain at end of run.
		0x1, // Active CTP trigger mask.
		0,   // Time stamp.
		0    // Event type.
	);
}

/**
 * This method calls the RunTrigger method in an independant aliroot process.
 * This is necessary since we get memory corruption if we run too many instances of
 * AliHLTSystem in the same process.
 */
void CallRunTrigger(
		int config = 0, bool usecint = false, bool debug = false,
		int numOfEvents = 8, const char* customClass = NULL,
		bool showOutput = false
	)
{
	const char* redirection = "> /dev/null";
	const char* classNameString = "NULL";
	if (showOutput) redirection = "";
	if (customClass != NULL) classNameString = Form("\"%s\"", customClass);
	const char* command = Form(
			"aliroot %s <<EOF\n"
			"gSystem->Load(\"libAliHLTUtil.so\");\n"
			"gSystem->Load(\"libAliHLTTRD.so\");\n"
			"gSystem->Load(\"libAliHLTMUON.so\");\n"
			"gSystem->Load(\"libAliHLTTrigger.so\");\n"
			"gSystem->SetIncludePath(\"-I${ALICE_ROOT}/include"
			" -I${ALICE_ROOT}/HLT/BASE -I${ALICE_ROOT}/HLT/trigger\");\n"
			".L $ALICE_ROOT/HLT/trigger/test/testGlobalTriggerComponent.C+\n"
			"RunTrigger(%d,%d,%d,%d,%s);\n"
			"EOF\n",
			redirection,
			config,
			usecint,
			debug,
			numOfEvents,
			classNameString
		);
	gSystem->Exec(command);
}

/**
 * Runs a global trigger test chain to test L0 software triggers.
 * \param config  The configuration version to pass to TriggerConfig.C
 * \param usecint  If true then the global trigger component uses CINT to interpret
 *     the code rather than compiling it.
 * \param debug  If true then the global trigger component generates extra debug
 *     statements in the on the fly AliHLTGlobalTriggerImp_*.cxx file.
 * \param customClass  Names the custom class that should be loaded from the file
 *     <i>\<customClass\>.cxx</i>. This is useful for debugging only. i.e. you can
 *     edit a generated logic file and test it by hand.
 */
void RunTriggerSW(int config = 0, bool usecint = false, bool debug = false, const char* customClass = NULL)
{
	AliHLTSystem sys;
	sys.ScanOptions("ECS=CTP_TRIGGER_CLASS=00:TRIGGER-ALL:00-01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17");
	sys.LoadComponentLibraries("libAliHLTUtil.so");
	sys.LoadComponentLibraries("libAliHLTTRD.so");
	sys.LoadComponentLibraries("libAliHLTMUON.so");
	sys.LoadComponentLibraries("libAliHLTTrigger.so");
	if (debug)
	{
		AliLog::SetGlobalLogLevel(AliLog::kMaxType);
		sys.SetGlobalLoggingLevel(kHLTLogAll);
	}
	
	TString cmdline = "-datatype ROOTTOBJ 'HLT ' ";
	for (int i = 1; i <= 8; i++)
	{
		if (i > 1) cmdline += " -nextevent";
		cmdline += Form(" -datafile testInputFile%d.root", i);
	}
	AliHLTConfiguration pub("pub", "ROOTFilePublisher", NULL, cmdline.Data());
	
	cmdline = Form("-config $ALICE_ROOT/HLT/trigger/test/TriggerConfig.C(%d)"
		" -includepath $ALICE_ROOT/include -includepath $ALICE_ROOT/HLT/BASE"
		" -includepath $ALICE_ROOT/HLT/trigger -include AliHLTScalars.h"
		" -process-all-events",
		config
		);
	if (customClass != NULL) cmdline += Form(" -usecode %s.cxx %s", customClass, customClass);
	if (usecint) cmdline += " -cint";
	if (debug) cmdline += " -debug";
	AliHLTConfiguration proc("proc", "HLTGlobalTrigger", "pub", cmdline.Data());
	
	AliHLTConfiguration sink("sink", "ROOTFileWriter", "proc", "-datafile testOutputFile.root -concatenate-events");
	
	sys.BuildTaskList("sink");
	sys.Run(
		1,   // Number of events to process.
		0,   // Stop chain at end of run.
		0x1, // Active CTP trigger mask.
		0,   // Time stamp.
		gkAliEventTypeSoftware  // Event type.
	);
	sys.Run(
		1,   // Number of events to process.
		0,   // Stop chain at end of run.
		0x1, // Active CTP trigger mask.
		0,   // Time stamp.
		gkAliEventTypeCalibration  // Event type.
	);
	sys.Run(
		1,   // Number of events to process.
		0,   // Stop chain at end of run.
		0x1, // Active CTP trigger mask.
		0,   // Time stamp.
		0    // Event type.
	);
	sys.Run(
		1,   // Number of events to process.
		1,   // Stop chain at end of run.
		0x1, // Active CTP trigger mask.
		0,   // Time stamp.
		gkAliEventTypeSoftware,  // Event type.
		AliHLTReadoutList::kTPC
	);
}

/**
 * This method calls the RunTriggerSW method in an independant aliroot process.
 * This is necessary since we get memory corruption if we run too many instances of
 * AliHLTSystem in the same process.
 */
void CallRunTriggerSW(
		int config = 0, bool usecint = false, bool debug = false,
		const char* customClass = NULL, bool showOutput = false
	)
{
	const char* redirection = "> /dev/null";
	const char* classNameString = "NULL";
	if (showOutput) redirection = "";
	if (customClass != NULL) classNameString = Form("\"%s\"", customClass);
	const char* command = Form(
			"aliroot %s <<EOF\n"
			"gSystem->Load(\"libAliHLTUtil.so\");\n"
			"gSystem->Load(\"libAliHLTTRD.so\");\n"
			"gSystem->Load(\"libAliHLTMUON.so\");\n"
			"gSystem->Load(\"libAliHLTTrigger.so\");\n"
			"gSystem->SetIncludePath(\"-I${ALICE_ROOT}/include"
			" -I${ALICE_ROOT}/HLT/BASE -I${ALICE_ROOT}/HLT/trigger\");\n"
			".L $ALICE_ROOT/HLT/trigger/test/testGlobalTriggerComponent.C+\n"
			"RunTriggerSW(%d,%d,%d,%s);\n"
			"EOF\n",
			redirection,
			config,
			usecint,
			debug,
			classNameString
		);
	gSystem->Exec(command);
}

/**
 * Checks that a particular decision is as expected and prints error messages
 * if it is not.
 * \param testName  The name of the test being run.
 * \param eventNum  The number of the event being checked.
 * \param decision  The global trigger decision being checked.
 * \param expectedResult  The expected global trigger result.
 * \param expectedDomain  The expected resulting global trigger domain.
 * \param expectedDescription  The expected resulting trigger description.
 * \returns true if the decision is as expected.
 */
bool Check(
		const char* testName,
		int eventNum,
		AliHLTGlobalTriggerDecision* decision,
		bool expectedResult,
		AliHLTTriggerDomain expectedDomain,
		TString expectedDescription
	)
{
	if (decision == NULL)
	{
		cerr << "ERROR (Test: " << testName
		     << "): No decision found where expected for event "
		     << eventNum << "." << endl;
		return false;
	}
	if (decision->Result() != expectedResult)
	{
		cerr << "ERROR (Test: " << testName
		     << "): The result does not match the expected value for event "
		     << eventNum << ". Got " << decision->Result() << " but expected "
		     << expectedResult << "." << endl;
		return false;
	}
	if (decision->TriggerDomain() != expectedDomain)
	{
		cerr << "ERROR (Test: " << testName
		     << "): The domain does not match the expected value for event "
		     << eventNum << ". Got:" << endl;
		decision->TriggerDomain().Print();
		cerr << "but expected:" << endl;
		expectedDomain.Print();
		return false;
	}
	if (decision->Description() != expectedDescription)
	{
		cerr << "ERROR (Test: " << testName
		     << "): The description does not match the expected value for event "
		     << eventNum << ". Got '" << decision->Description() << "' but expected '"
		     << expectedDescription << "'." << endl;
		return false;
	}
	return true;
}


/// Routine for checking the result of the PriorityGroupTestConfig() config in TriggerConfig.C
bool CheckPriorityGroupTestConfig(const char* testName = "Priority group config")
{
	AliHLTGlobalTriggerDecision* decision = NULL;
	bool result = false;
	
	AliHLTTriggerDomain domainTPC("CLUSTERS:TPC ,TRACKS:TPC ");
	domainTPC.Add(AliHLTReadoutList("TPC"));
	AliHLTTriggerDomain domainMUON("TRACKS:MUON");
	domainMUON.Add(AliHLTReadoutList("MUONTRK"));
	domainMUON.Add(AliHLTReadoutList("MUONTRG"));
	AliHLTTriggerDomain domainSSD("*******:SSD ");
	domainSSD.Add(AliHLTReadoutList("ITSSSD"));

	TFile* file = new TFile("testOutputFile.root", "READ");
	
	// Triggers in events (i.e. input triggers):
	// event 1: TPC MUON SSD
	// event 2: TPC
	// event 3: MUON
	// event 4: SSD
	// event 5: TPC MUON
	// event 6: TPC SSD
	// event 7: MUON SSD
	// event 8: (empty)
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;1"));
	result = Check(testName, 1, decision, true, domainSSD, "Fast SSD trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;2"));
	result = Check(testName, 2, decision, true, domainTPC, "TPC trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;3"));
	result = Check(testName, 3, decision, true, domainMUON, "MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;4"));
	result = Check(testName, 4, decision, true, domainSSD, "MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;5"));
	result = Check(testName, 5, decision, true, domainMUON, "MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;6"));
	result = Check(testName, 6, decision, true, domainSSD, "Fast SSD trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;7"));
	result = Check(testName, 7, decision, true, domainMUON | domainSSD, "MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;8"));
	result = Check(testName, 8, decision, false, AliHLTTriggerDomain(), "No trigger");
	if (! result) goto cleanup;
	
	delete file;
	return true;
	
cleanup:
	if (decision != NULL)
	{
		cout << "========== Dumping incorrect decision ========== " << endl;
		decision->Print();
	}
	delete file;
	return false;
}


/// Routine for checking the result of the SingleGroupTestConfig() config in TriggerConfig.C
bool CheckSingleGroupTestConfig(const char* testName = "Single group config")
{
	AliHLTGlobalTriggerDecision* decision = NULL;
	bool result = false;
	
	AliHLTTriggerDomain domainTPC("CLUSTERS:TPC ,TRACKS:TPC ");
	domainTPC.Add(AliHLTReadoutList("TPC"));
	AliHLTTriggerDomain domainMUON("TRACKS:MUON");
	domainMUON.Add(AliHLTReadoutList("MUONTRK"));
	domainMUON.Add(AliHLTReadoutList("MUONTRG"));
	AliHLTTriggerDomain domainSSD("*******:SSD ");
	domainSSD.Add(AliHLTReadoutList("ITSSSD"));

	TFile* file = new TFile("testOutputFile.root", "READ");
	
	// Triggers in events (i.e. input triggers):
	// event 1: TPC MUON SSD
	// event 2: TPC
	// event 3: MUON
	// event 4: SSD
	// event 5: TPC MUON
	// event 6: TPC SSD
	// event 7: MUON SSD
	// event 8: (empty)
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;1"));
	result = Check(testName, 1, decision, true, domainTPC | domainMUON | domainSSD, "TPC trigger,MUON trigger,SSD trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;2"));
	result = Check(testName, 2, decision, true, domainTPC, "TPC trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;3"));
	result = Check(testName, 3, decision, true, domainMUON, "MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;4"));
	result = Check(testName, 4, decision, true, domainSSD, "SSD trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;5"));
	result = Check(testName, 5, decision, true, domainTPC | domainMUON, "TPC trigger,MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;6"));
	result = Check(testName, 6, decision, true, domainTPC | domainSSD, "TPC trigger,SSD trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;7"));
	result = Check(testName, 7, decision, true, domainMUON | domainSSD, "MUON trigger,SSD trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;8"));
	result = Check(testName, 8, decision, false, AliHLTTriggerDomain(), "");
	if (! result) goto cleanup;
	
	delete file;
	return true;
	
cleanup:
	if (decision != NULL)
	{
		cout << "========== Dumping incorrect decision ========== " << endl;
		decision->Print();
	}
	delete file;
	return false;
}


/// Routine for checking the result of the PrescalarTestConfig() config in TriggerConfig.C
bool CheckPrescalarTestConfig(const char* testName = "Prescalar config")
{
	AliHLTGlobalTriggerDecision* decision = NULL;
	bool result = false;
	
	AliHLTTriggerDomain domainTPC("CLUSTERS:TPC ,TRACKS:TPC ");
	domainTPC.Add(AliHLTReadoutList("TPC"));
	AliHLTTriggerDomain domainMUON("TRACKS:MUON");
	domainMUON.Add(AliHLTReadoutList("MUONTRK"));
	domainMUON.Add(AliHLTReadoutList("MUONTRG"));
	AliHLTTriggerDomain domainSSD("*******:SSD ");
	domainSSD.Add(AliHLTReadoutList("ITSSSD"));
	AliHLTTriggerDomain defaultDomain("*******:HLT ");

	TFile* file = new TFile("testOutputFile.root", "READ");
	
	// Triggers in events (i.e. input triggers):
	// event 1: TPC MUON SSD
	// event 2: TPC
	// event 3: MUON
	// event 4: SSD
	// event 5: TPC MUON
	// event 6: TPC SSD
	// event 7: MUON SSD
	// event 8: (empty)
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;1"));
	result = Check(testName, 1, decision, true, domainTPC, "TPC trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;2"));
	result = Check(testName, 2, decision, false, defaultDomain, "No trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;3"));
	result = Check(testName, 3, decision, true, domainMUON, "MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;4"));
	result = Check(testName, 4, decision, false, defaultDomain, "No trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;5"));
	result = Check(testName, 5, decision, true, domainMUON, "MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;6"));
	result = Check(testName, 6, decision, true, domainTPC, "TPC trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;7"));
	result = Check(testName, 7, decision, true, domainMUON, "MUON trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;8"));
	result = Check(testName, 8, decision, false, defaultDomain, "No trigger");
	if (! result) goto cleanup;
	
	delete file;
	return true;
	
cleanup:
	if (decision != NULL)
	{
		cout << "========== Dumping incorrect decision ========== " << endl;
		decision->Print();
	}
	delete file;
	return false;
}


/// Routine for checking the result of the SymbolTestConfig() config in TriggerConfig.C
bool CheckSymbolTestConfig(const char* testName = "Symbol config")
{
	AliHLTGlobalTriggerDecision* decision = NULL;
	bool result = false;
	
	AliHLTTriggerDomain domainAll("*******:***,-DAQRDOUT:TST");
	AliHLTTriggerDomain domainPHOS("CLUSTERS:PHOS,TRACKS:PHOS");
	AliHLTTriggerDomain domainTPC("CLUSTERS:TPC ,TRACKS:TPC ");
	domainTPC.Add(AliHLTReadoutList("TPC"));
	AliHLTTriggerDomain domainMUON("TRACKS:MUON");
	domainMUON.Add(AliHLTReadoutList("MUONTRK"));
	domainMUON.Add(AliHLTReadoutList("MUONTRG"));
	AliHLTTriggerDomain domainSSD("*******:SSD ");
	domainSSD.Add(AliHLTReadoutList("ITSSSD"));

	TFile* file = new TFile("testOutputFile.root", "READ");
	
	// Triggers in events (i.e. input triggers) and trigger classes in AliHLTScalars:
	// event 1: TPC MUON SSD, 0x2
	// event 2: TPC         , 0x2
	// event 3: MUON        , 0x1
	// event 4: SSD         , 0x2
	// event 5: TPC MUON    , 0x1
	// event 6: TPC SSD     , 0x2
	// event 7: MUON SSD    , 0x1
	// event 8: (empty)     , 0x0
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;1"));
	result = Check(testName, 1, decision, true, domainAll - AliHLTTriggerDomain("DAQRDOUT:EMC"), "Pass through");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;2"));
	result = Check(testName, 2, decision, true, domainTPC | domainPHOS, "Trigger class 2");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;3"));
	result = Check(testName, 3, decision, false, AliHLTTriggerDomain(), "");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;4"));
	result = Check(testName, 4, decision, true, domainPHOS, "Trigger class 2");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;5"));
	result = Check(testName, 5, decision, true, domainAll - AliHLTTriggerDomain("DAQRDOUT:EMC"), "Pass through");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;6"));
	result = Check(testName, 6, decision, true, domainTPC | domainPHOS, "Trigger class 2");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;7"));
	result = Check(testName, 7, decision, false, AliHLTTriggerDomain(), "");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;8"));
	result = Check(testName, 8, decision, false, AliHLTTriggerDomain(), "");
	if (! result) goto cleanup;
	
	delete file;
	return true;
	
cleanup:
	if (decision != NULL)
	{
		cout << "========== Dumping incorrect decision ========== " << endl;
		decision->Print();
	}
	delete file;
	return false;
}


/// Routine for checking the result of the ComplexTestConfig() config in TriggerConfig.C
bool CheckComplexTestConfig(const char* testName = "Complex config")
{
	AliHLTGlobalTriggerDecision* decision = NULL;
	bool result = false;
	
	AliHLTTriggerDomain domainAll("*******:***,-DAQRDOUT:TST,-DAQRDOUT:EMC");
	AliHLTTriggerDomain domainPHOS("CLUSTERS:PHOS,TRACKS:PHOS");
	AliHLTTriggerDomain domainTPC("CLUSTERS:TPC ,TRACKS:TPC ");
	domainTPC.Add(AliHLTReadoutList("TPC"));
	AliHLTTriggerDomain domainMUON("TRACKS:MUON");
	domainMUON.Add(AliHLTReadoutList("MUONTRK"));
	domainMUON.Add(AliHLTReadoutList("MUONTRG"));
	AliHLTTriggerDomain domainSSD("*******:SSD ");
	domainSSD.Add(AliHLTReadoutList("ITSSSD"));

	TFile* file = new TFile("testOutputFile.root", "READ");
	
	// Triggers in events (i.e. input triggers) and trigger classes in AliHLTScalars:
	// event 1: TPC MUON SSD, 0x2
	// event 2: TPC         , 0x2
	// event 3: MUON        , 0x1
	// event 4: SSD         , 0x2
	// event 5: TPC MUON    , 0x1
	// event 6: TPC SSD     , 0x2
	// event 7: MUON SSD    , 0x1
	// event 8: (empty)     , 0x0
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;1"));
	result = Check(testName, 1, decision, true, domainAll, "Pass through");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;2"));
	result = Check(testName, 2, decision, true, domainTPC, "Slow trigger");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;3"));
	result = Check(testName, 3, decision, true, domainMUON, "MUON trigger 2");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;4"));
	result = Check(testName, 4, decision, true, domainSSD | domainPHOS, "SSD trigger 2");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;5"));
	result = Check(testName, 5, decision, true, domainMUON, "MUON trigger 2");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;6"));
	result = Check(testName, 6, decision, true, domainSSD | domainPHOS, "SSD trigger 2");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;7"));
	result = Check(testName, 7, decision, true, domainSSD | domainMUON, "SSD trigger 1,MUON trigger 1");
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;8"));
	result = Check(testName, 8, decision, true, domainAll, "Pass through");
	if (! result) goto cleanup;
	
	delete file;
	return true;
	
cleanup:
	if (decision != NULL)
	{
		cout << "========== Dumping incorrect decision ========== " << endl;
		decision->Print();
	}
	delete file;
	return false;
}


typedef bool (*CheckFunctionType)(const char* testName);

/**
 * This will check the results of a global trigger run with a particular checking
 * routine and for different combinations of -cint and -debug flags passed to the
 * global trigger component.
 * It is important to check these flag combinations to make sure that everything
 * is functioning the same under all the different combinations as it should.
 * \param function  The checking routine to use.
 * \param version  The trigger menu configuration version to use in <i>RunTrigger</i>.
 * \param testName  The name of the test being run.
 * \param numOfEvents  The number of events to run the chain for.
 * \param customClass  Name of the custom class as passed to <i>RunTrigger</i>.
 * \param showOutput  If true then the output from the RunTrigger method is not suppressed.
 * \returns true if the different checks succeeded and false otherwise.
 */
bool CheckDifferentModes(
		CheckFunctionType function, int version, const char* testName,
		int numOfEvents = 8, const char* customClass = NULL,
		bool showOutput = false
	)
{
	TString name = testName;
	name += " in debug mode";
	cout << "#################### Running test: " << name.Data() << " ####################" << endl;
	CallRunTrigger(version, false, true, numOfEvents, customClass, showOutput);
	if (! function(testName)) return false;
	gSystem->Exec("rm -f testOutputFile.root");  // Cleanup output file for next test.
	
	name = testName;
	cout << "#################### Running test: " << name.Data() << " ####################" << endl;
	CallRunTrigger(version, false, false, numOfEvents, customClass, showOutput);
	if (! function(testName)) return false;
	gSystem->Exec("rm -f testOutputFile.root");  // Cleanup output file for next test.
	
	name = testName;
	name += " interpreted with CINT in debug mode";
	cout << "#################### Running test: " << name.Data() << " ####################" << endl;
	CallRunTrigger(version, true, true, numOfEvents, customClass, showOutput);
	if (! function(testName)) return false;
	gSystem->Exec("rm -f testOutputFile.root");  // Cleanup output file for next test.
	
	name = testName;
	name += " interpreted with CINT";
	cout << "#################### Running test: " << name.Data() << " ####################" << endl;
	CallRunTrigger(version, true, false, numOfEvents, customClass, showOutput);
	if (! function(testName)) return false;
	gSystem->Exec("rm -f testOutputFile.root");  // Cleanup output file for next test.
	
	return true;
}

/**
 * This routine is used to check if the global Trigger counters are correct.
 * \param testName  The name of the test being run.
 * \param eventNum  The number of the event being checked.
 * \param decision  The global trigger decision being checked.
 * \param expectedCounters  The expected counters.
 * \returns true if the decision is as expected.
 */
bool CheckCounters(
		const char* testName,
		int eventNum,
		AliHLTGlobalTriggerDecision* decision,
		const TArrayL64& expectedCounters
	)
{
	if (decision->Counters().GetSize() != expectedCounters.GetSize())
	{
		cerr << "ERROR (Test: " << testName
		     << "): The result does not have the required number of counters for event "
		     << eventNum << ". Got " << decision->Counters().GetSize() << " but expected "
		     << expectedCounters.GetSize() << "." << endl;
		return false;
	}
	for (Int_t i = 0; i < expectedCounters.GetSize(); ++i)
	{
		if (decision->Counters()[i] != expectedCounters[i])
		{
			cerr << "ERROR (Test: " << testName
			     << "): The result does not have the correct counter value for event "
			     << eventNum << ". Got a value " << decision->Counters()[i]
			     << " for counter " << i << ", but expected a value of "
			     << expectedCounters[i] << "." << endl;
			return false;
		}
	}
	return true;
}

/// Routine for checking the result of the SoftwareTriggersTestConfig() config in TriggerConfig.C
bool CheckSoftwareTriggerTestConfig(const char* testName = "Software trigger config")
{
	AliHLTGlobalTriggerDecision* decision = NULL;
	bool result = false;
	
	AliHLTTriggerDomain domainPHOS("*******:PHOS");
	AliHLTTriggerDomain domainSPD("*******:SPD");
	AliHLTTriggerDomain domainTPC("DAQRDOUT:TPC");
	AliHLTTriggerDomain domainMUON("TRACKS:MUON");
	domainMUON.Add(AliHLTReadoutList("MUONTRK MUONTRG"));

	TFile* file = new TFile("testOutputFile.root", "READ");
	TArrayL64 expectedCounters;
	expectedCounters.Set(6);
	
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;1"));
	result = Check(testName, 1, decision, true, AliHLTTriggerDomain(), "Start of data");
	if (! result) goto cleanup;
	expectedCounters[0] = 1; expectedCounters[5] = 1;
	result = CheckCounters(testName, 1, decision, expectedCounters);
	if (! result) goto cleanup;
	
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;2"));
	result = Check(testName, 2, decision, true, domainSPD, "Software trigger");
	if (! result) goto cleanup;
	expectedCounters[2] = 1; expectedCounters[5] = 2;
	result = CheckCounters(testName, 2, decision, expectedCounters);
	if (! result) goto cleanup;
	
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;3"));
	result = Check(testName, 3, decision, true, domainPHOS, "Calibration trigger");
	if (! result) goto cleanup;
	expectedCounters[3] = 1; expectedCounters[5] = 3;
	result = CheckCounters(testName, 3, decision, expectedCounters);
	if (! result) goto cleanup;
	
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;4"));
	result = Check(testName, 4, decision, true, domainMUON, "MUON trigger");
	if (! result) goto cleanup;
	expectedCounters[4] = 1; expectedCounters[5] = 4;
	result = CheckCounters(testName, 4, decision, expectedCounters);
	if (! result) goto cleanup;
	
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;5"));
	result = Check(testName, 5, decision, true, domainSPD|domainTPC, "Software trigger");
	if (! result) goto cleanup;
	expectedCounters[2] = 2; expectedCounters[5] = 5;
	result = CheckCounters(testName, 5, decision, expectedCounters);
	if (! result) goto cleanup;
	
	decision = dynamic_cast<AliHLTGlobalTriggerDecision*>(file->Get("HLTGlobalTrigger;6"));
	result = Check(testName, 6, decision, true, AliHLTTriggerDomain(), "End of data");
	if (! result) goto cleanup;
	expectedCounters[1] = 1; expectedCounters[5] = 6;
	result = CheckCounters(testName, 6, decision, expectedCounters);
	if (! result) goto cleanup;
	
	delete file;
	return true;
	
cleanup:
	if (decision != NULL)
	{
		cout << "========== Dumping incorrect decision ========== " << endl;
		decision->Print();
	}
	delete file;
	return false;
}

/**
 * This method performs the same task as for CheckDifferentModes, but trying to
 * test the behaviour of the global HLT trigger component with L0 software triggers.
 * \param version  The trigger menu configuration version to use in <i>RunTrigger</i>.
 * \param testName  The name of the test being run.
 * \param customClass  Name of the custom class as passed to <i>RunTrigger</i>.
 * \param showOutput  If true then the output from the RunTriggerSW method is not suppressed.
 * \returns true if the different checks succeeded and false otherwise.
 */
bool CheckDifferentSWTestModes(
		int version, const char* testName,
		const char* customClass = NULL, bool showOutput = false
	)
{
	TString name = testName;
	name += " in debug mode";
	cout << "#################### Running test: " << name.Data() << " ####################" << endl;
	CallRunTriggerSW(version, false, true, customClass, showOutput);
	if (! CheckSoftwareTriggerTestConfig(testName)) return false;
	gSystem->Exec("rm -f testOutputFile.root");  // Cleanup output file for next test.
	
	name = testName;
	cout << "#################### Running test: " << name.Data() << " ####################" << endl;
	CallRunTriggerSW(version, false, false, customClass, showOutput);
	if (! CheckSoftwareTriggerTestConfig(testName)) return false;
	gSystem->Exec("rm -f testOutputFile.root");  // Cleanup output file for next test.
	
	name = testName;
	name += " interpreted with CINT in debug mode";
	cout << "#################### Running test: " << name.Data() << " ####################" << endl;
	CallRunTriggerSW(version, true, true, customClass, showOutput);
	if (! CheckSoftwareTriggerTestConfig(testName)) return false;
	gSystem->Exec("rm -f testOutputFile.root");  // Cleanup output file for next test.
	
	name = testName;
	name += " interpreted with CINT";
	cout << "#################### Running test: " << name.Data() << " ####################" << endl;
	CallRunTriggerSW(version, true, false, customClass, showOutput);
	if (! CheckSoftwareTriggerTestConfig(testName)) return false;
	gSystem->Exec("rm -f testOutputFile.root");  // Cleanup output file for next test.
	
	return true;
}

/**
 * Runs several tests for the AliHLTGlobalTriggerComponent class.
 * We specifically test if the global trigger menu configuration is interpreted
 * correctly and the trigger logic generated correctly on the fly.
 * \param configVersion  The appropriate version number of the config being tested
 *     which is passed to TriggerConfig.C.
 * \param customClass  Name of the custom class as passed to <i>CheckDifferentModes</i>.
 * \returns true if the different checks succeeded and false otherwise.
 * \param numOfEvents  The number of events to run the chain for.
 * \returns true if all the tests succeeded and false otherwise.
 */
bool testGlobalTriggerComponent(int configVersion = -1, const char* customClass = NULL, int numOfEvents = 8)
{
	GenerateInputData();
	
	if (configVersion != -1)
	{
		CheckFunctionType function = NULL;
		switch (configVersion)
		{
		case 0: function = CheckPriorityGroupTestConfig; break;
		case 1: function = CheckSingleGroupTestConfig; break;
		case 2: function = CheckPrescalarTestConfig; break;
		case 3: function = CheckSymbolTestConfig; break;
		case 4: function = CheckComplexTestConfig; break;
		case 5: break;
		default:
			cerr << "ERROR: Invalid value for configVersion specified." << endl;
			return false;
		}
		bool result = false;
		if (configVersion != 5)
		{
			result = CheckDifferentModes(
					function,
					configVersion,
					Form("Config version %d", configVersion),
					numOfEvents,
					customClass,
					true
				);
		}
		else
		{
			result = CheckDifferentSWTestModes(
					configVersion,
					Form("Config version %d", configVersion),
					customClass,
					true
				);
		}
		return result;
	}
	
	if (! CheckDifferentModes(CheckPriorityGroupTestConfig, 0, "Priority group config", numOfEvents, customClass)) return false;
	if (! CheckDifferentModes(CheckSingleGroupTestConfig, 1, "Single group config", numOfEvents, customClass)) return false;
	if (! CheckDifferentModes(CheckPrescalarTestConfig, 2, "Prescalar config", numOfEvents, customClass)) return false;
	if (! CheckDifferentModes(CheckSymbolTestConfig, 3, "Symbol config", numOfEvents, customClass)) return false;
	if (! CheckDifferentModes(CheckComplexTestConfig, 4, "Complex config", numOfEvents, customClass)) return false;
	if (! CheckDifferentSWTestModes(5, "Software trigger config", customClass)) return false;
	
	// Cleanup all temporary files generated.
	gSystem->Exec("rm -f testOutputFile.root testInputFile*.root AliHLTGlobalTriggerImpl*");
	return true;
}


#ifndef __MAKECINT__

int main(int /*argc*/, const char** /*argv*/)
{
	bool resultOk = testGlobalTriggerComponent();
	if (not resultOk) return 1;
	return 0;
}

#endif // __MAKECINT__
 testGlobalTriggerComponent.C:1
 testGlobalTriggerComponent.C:2
 testGlobalTriggerComponent.C:3
 testGlobalTriggerComponent.C:4
 testGlobalTriggerComponent.C:5
 testGlobalTriggerComponent.C:6
 testGlobalTriggerComponent.C:7
 testGlobalTriggerComponent.C:8
 testGlobalTriggerComponent.C:9
 testGlobalTriggerComponent.C:10
 testGlobalTriggerComponent.C:11
 testGlobalTriggerComponent.C:12
 testGlobalTriggerComponent.C:13
 testGlobalTriggerComponent.C:14
 testGlobalTriggerComponent.C:15
 testGlobalTriggerComponent.C:16
 testGlobalTriggerComponent.C:17
 testGlobalTriggerComponent.C:18
 testGlobalTriggerComponent.C:19
 testGlobalTriggerComponent.C:20
 testGlobalTriggerComponent.C:21
 testGlobalTriggerComponent.C:22
 testGlobalTriggerComponent.C:23
 testGlobalTriggerComponent.C:24
 testGlobalTriggerComponent.C:25
 testGlobalTriggerComponent.C:26
 testGlobalTriggerComponent.C:27
 testGlobalTriggerComponent.C:28
 testGlobalTriggerComponent.C:29
 testGlobalTriggerComponent.C:30
 testGlobalTriggerComponent.C:31
 testGlobalTriggerComponent.C:32
 testGlobalTriggerComponent.C:33
 testGlobalTriggerComponent.C:34
 testGlobalTriggerComponent.C:35
 testGlobalTriggerComponent.C:36
 testGlobalTriggerComponent.C:37
 testGlobalTriggerComponent.C:38
 testGlobalTriggerComponent.C:39
 testGlobalTriggerComponent.C:40
 testGlobalTriggerComponent.C:41
 testGlobalTriggerComponent.C:42
 testGlobalTriggerComponent.C:43
 testGlobalTriggerComponent.C:44
 testGlobalTriggerComponent.C:45
 testGlobalTriggerComponent.C:46
 testGlobalTriggerComponent.C:47
 testGlobalTriggerComponent.C:48
 testGlobalTriggerComponent.C:49
 testGlobalTriggerComponent.C:50
 testGlobalTriggerComponent.C:51
 testGlobalTriggerComponent.C:52
 testGlobalTriggerComponent.C:53
 testGlobalTriggerComponent.C:54
 testGlobalTriggerComponent.C:55
 testGlobalTriggerComponent.C:56
 testGlobalTriggerComponent.C:57
 testGlobalTriggerComponent.C:58
 testGlobalTriggerComponent.C:59
 testGlobalTriggerComponent.C:60
 testGlobalTriggerComponent.C:61
 testGlobalTriggerComponent.C:62
 testGlobalTriggerComponent.C:63
 testGlobalTriggerComponent.C:64
 testGlobalTriggerComponent.C:65
 testGlobalTriggerComponent.C:66
 testGlobalTriggerComponent.C:67
 testGlobalTriggerComponent.C:68
 testGlobalTriggerComponent.C:69
 testGlobalTriggerComponent.C:70
 testGlobalTriggerComponent.C:71
 testGlobalTriggerComponent.C:72
 testGlobalTriggerComponent.C:73
 testGlobalTriggerComponent.C:74
 testGlobalTriggerComponent.C:75
 testGlobalTriggerComponent.C:76
 testGlobalTriggerComponent.C:77
 testGlobalTriggerComponent.C:78
 testGlobalTriggerComponent.C:79
 testGlobalTriggerComponent.C:80
 testGlobalTriggerComponent.C:81
 testGlobalTriggerComponent.C:82
 testGlobalTriggerComponent.C:83
 testGlobalTriggerComponent.C:84
 testGlobalTriggerComponent.C:85
 testGlobalTriggerComponent.C:86
 testGlobalTriggerComponent.C:87
 testGlobalTriggerComponent.C:88
 testGlobalTriggerComponent.C:89
 testGlobalTriggerComponent.C:90
 testGlobalTriggerComponent.C:91
 testGlobalTriggerComponent.C:92
 testGlobalTriggerComponent.C:93
 testGlobalTriggerComponent.C:94
 testGlobalTriggerComponent.C:95
 testGlobalTriggerComponent.C:96
 testGlobalTriggerComponent.C:97
 testGlobalTriggerComponent.C:98
 testGlobalTriggerComponent.C:99
 testGlobalTriggerComponent.C:100
 testGlobalTriggerComponent.C:101
 testGlobalTriggerComponent.C:102
 testGlobalTriggerComponent.C:103
 testGlobalTriggerComponent.C:104
 testGlobalTriggerComponent.C:105
 testGlobalTriggerComponent.C:106
 testGlobalTriggerComponent.C:107
 testGlobalTriggerComponent.C:108
 testGlobalTriggerComponent.C:109
 testGlobalTriggerComponent.C:110
 testGlobalTriggerComponent.C:111
 testGlobalTriggerComponent.C:112
 testGlobalTriggerComponent.C:113
 testGlobalTriggerComponent.C:114
 testGlobalTriggerComponent.C:115
 testGlobalTriggerComponent.C:116
 testGlobalTriggerComponent.C:117
 testGlobalTriggerComponent.C:118
 testGlobalTriggerComponent.C:119
 testGlobalTriggerComponent.C:120
 testGlobalTriggerComponent.C:121
 testGlobalTriggerComponent.C:122
 testGlobalTriggerComponent.C:123
 testGlobalTriggerComponent.C:124
 testGlobalTriggerComponent.C:125
 testGlobalTriggerComponent.C:126
 testGlobalTriggerComponent.C:127
 testGlobalTriggerComponent.C:128
 testGlobalTriggerComponent.C:129
 testGlobalTriggerComponent.C:130
 testGlobalTriggerComponent.C:131
 testGlobalTriggerComponent.C:132
 testGlobalTriggerComponent.C:133
 testGlobalTriggerComponent.C:134
 testGlobalTriggerComponent.C:135
 testGlobalTriggerComponent.C:136
 testGlobalTriggerComponent.C:137
 testGlobalTriggerComponent.C:138
 testGlobalTriggerComponent.C:139
 testGlobalTriggerComponent.C:140
 testGlobalTriggerComponent.C:141
 testGlobalTriggerComponent.C:142
 testGlobalTriggerComponent.C:143
 testGlobalTriggerComponent.C:144
 testGlobalTriggerComponent.C:145
 testGlobalTriggerComponent.C:146
 testGlobalTriggerComponent.C:147
 testGlobalTriggerComponent.C:148
 testGlobalTriggerComponent.C:149
 testGlobalTriggerComponent.C:150
 testGlobalTriggerComponent.C:151
 testGlobalTriggerComponent.C:152
 testGlobalTriggerComponent.C:153
 testGlobalTriggerComponent.C:154
 testGlobalTriggerComponent.C:155
 testGlobalTriggerComponent.C:156
 testGlobalTriggerComponent.C:157
 testGlobalTriggerComponent.C:158
 testGlobalTriggerComponent.C:159
 testGlobalTriggerComponent.C:160
 testGlobalTriggerComponent.C:161
 testGlobalTriggerComponent.C:162
 testGlobalTriggerComponent.C:163
 testGlobalTriggerComponent.C:164
 testGlobalTriggerComponent.C:165
 testGlobalTriggerComponent.C:166
 testGlobalTriggerComponent.C:167
 testGlobalTriggerComponent.C:168
 testGlobalTriggerComponent.C:169
 testGlobalTriggerComponent.C:170
 testGlobalTriggerComponent.C:171
 testGlobalTriggerComponent.C:172
 testGlobalTriggerComponent.C:173
 testGlobalTriggerComponent.C:174
 testGlobalTriggerComponent.C:175
 testGlobalTriggerComponent.C:176
 testGlobalTriggerComponent.C:177
 testGlobalTriggerComponent.C:178
 testGlobalTriggerComponent.C:179
 testGlobalTriggerComponent.C:180
 testGlobalTriggerComponent.C:181
 testGlobalTriggerComponent.C:182
 testGlobalTriggerComponent.C:183
 testGlobalTriggerComponent.C:184
 testGlobalTriggerComponent.C:185
 testGlobalTriggerComponent.C:186
 testGlobalTriggerComponent.C:187
 testGlobalTriggerComponent.C:188
 testGlobalTriggerComponent.C:189
 testGlobalTriggerComponent.C:190
 testGlobalTriggerComponent.C:191
 testGlobalTriggerComponent.C:192
 testGlobalTriggerComponent.C:193
 testGlobalTriggerComponent.C:194
 testGlobalTriggerComponent.C:195
 testGlobalTriggerComponent.C:196
 testGlobalTriggerComponent.C:197
 testGlobalTriggerComponent.C:198
 testGlobalTriggerComponent.C:199
 testGlobalTriggerComponent.C:200
 testGlobalTriggerComponent.C:201
 testGlobalTriggerComponent.C:202
 testGlobalTriggerComponent.C:203
 testGlobalTriggerComponent.C:204
 testGlobalTriggerComponent.C:205
 testGlobalTriggerComponent.C:206
 testGlobalTriggerComponent.C:207
 testGlobalTriggerComponent.C:208
 testGlobalTriggerComponent.C:209
 testGlobalTriggerComponent.C:210
 testGlobalTriggerComponent.C:211
 testGlobalTriggerComponent.C:212
 testGlobalTriggerComponent.C:213
 testGlobalTriggerComponent.C:214
 testGlobalTriggerComponent.C:215
 testGlobalTriggerComponent.C:216
 testGlobalTriggerComponent.C:217
 testGlobalTriggerComponent.C:218
 testGlobalTriggerComponent.C:219
 testGlobalTriggerComponent.C:220
 testGlobalTriggerComponent.C:221
 testGlobalTriggerComponent.C:222
 testGlobalTriggerComponent.C:223
 testGlobalTriggerComponent.C:224
 testGlobalTriggerComponent.C:225
 testGlobalTriggerComponent.C:226
 testGlobalTriggerComponent.C:227
 testGlobalTriggerComponent.C:228
 testGlobalTriggerComponent.C:229
 testGlobalTriggerComponent.C:230
 testGlobalTriggerComponent.C:231
 testGlobalTriggerComponent.C:232
 testGlobalTriggerComponent.C:233
 testGlobalTriggerComponent.C:234
 testGlobalTriggerComponent.C:235
 testGlobalTriggerComponent.C:236
 testGlobalTriggerComponent.C:237
 testGlobalTriggerComponent.C:238
 testGlobalTriggerComponent.C:239
 testGlobalTriggerComponent.C:240
 testGlobalTriggerComponent.C:241
 testGlobalTriggerComponent.C:242
 testGlobalTriggerComponent.C:243
 testGlobalTriggerComponent.C:244
 testGlobalTriggerComponent.C:245
 testGlobalTriggerComponent.C:246
 testGlobalTriggerComponent.C:247
 testGlobalTriggerComponent.C:248
 testGlobalTriggerComponent.C:249
 testGlobalTriggerComponent.C:250
 testGlobalTriggerComponent.C:251
 testGlobalTriggerComponent.C:252
 testGlobalTriggerComponent.C:253
 testGlobalTriggerComponent.C:254
 testGlobalTriggerComponent.C:255
 testGlobalTriggerComponent.C:256
 testGlobalTriggerComponent.C:257
 testGlobalTriggerComponent.C:258
 testGlobalTriggerComponent.C:259
 testGlobalTriggerComponent.C:260
 testGlobalTriggerComponent.C:261
 testGlobalTriggerComponent.C:262
 testGlobalTriggerComponent.C:263
 testGlobalTriggerComponent.C:264
 testGlobalTriggerComponent.C:265
 testGlobalTriggerComponent.C:266
 testGlobalTriggerComponent.C:267
 testGlobalTriggerComponent.C:268
 testGlobalTriggerComponent.C:269
 testGlobalTriggerComponent.C:270
 testGlobalTriggerComponent.C:271
 testGlobalTriggerComponent.C:272
 testGlobalTriggerComponent.C:273
 testGlobalTriggerComponent.C:274
 testGlobalTriggerComponent.C:275
 testGlobalTriggerComponent.C:276
 testGlobalTriggerComponent.C:277
 testGlobalTriggerComponent.C:278
 testGlobalTriggerComponent.C:279
 testGlobalTriggerComponent.C:280
 testGlobalTriggerComponent.C:281
 testGlobalTriggerComponent.C:282
 testGlobalTriggerComponent.C:283
 testGlobalTriggerComponent.C:284
 testGlobalTriggerComponent.C:285
 testGlobalTriggerComponent.C:286
 testGlobalTriggerComponent.C:287
 testGlobalTriggerComponent.C:288
 testGlobalTriggerComponent.C:289
 testGlobalTriggerComponent.C:290
 testGlobalTriggerComponent.C:291
 testGlobalTriggerComponent.C:292
 testGlobalTriggerComponent.C:293
 testGlobalTriggerComponent.C:294
 testGlobalTriggerComponent.C:295
 testGlobalTriggerComponent.C:296
 testGlobalTriggerComponent.C:297
 testGlobalTriggerComponent.C:298
 testGlobalTriggerComponent.C:299
 testGlobalTriggerComponent.C:300
 testGlobalTriggerComponent.C:301
 testGlobalTriggerComponent.C:302
 testGlobalTriggerComponent.C:303
 testGlobalTriggerComponent.C:304
 testGlobalTriggerComponent.C:305
 testGlobalTriggerComponent.C:306
 testGlobalTriggerComponent.C:307
 testGlobalTriggerComponent.C:308
 testGlobalTriggerComponent.C:309
 testGlobalTriggerComponent.C:310
 testGlobalTriggerComponent.C:311
 testGlobalTriggerComponent.C:312
 testGlobalTriggerComponent.C:313
 testGlobalTriggerComponent.C:314
 testGlobalTriggerComponent.C:315
 testGlobalTriggerComponent.C:316
 testGlobalTriggerComponent.C:317
 testGlobalTriggerComponent.C:318
 testGlobalTriggerComponent.C:319
 testGlobalTriggerComponent.C:320
 testGlobalTriggerComponent.C:321
 testGlobalTriggerComponent.C:322
 testGlobalTriggerComponent.C:323
 testGlobalTriggerComponent.C:324
 testGlobalTriggerComponent.C:325
 testGlobalTriggerComponent.C:326
 testGlobalTriggerComponent.C:327
 testGlobalTriggerComponent.C:328
 testGlobalTriggerComponent.C:329
 testGlobalTriggerComponent.C:330
 testGlobalTriggerComponent.C:331
 testGlobalTriggerComponent.C:332
 testGlobalTriggerComponent.C:333
 testGlobalTriggerComponent.C:334
 testGlobalTriggerComponent.C:335
 testGlobalTriggerComponent.C:336
 testGlobalTriggerComponent.C:337
 testGlobalTriggerComponent.C:338
 testGlobalTriggerComponent.C:339
 testGlobalTriggerComponent.C:340
 testGlobalTriggerComponent.C:341
 testGlobalTriggerComponent.C:342
 testGlobalTriggerComponent.C:343
 testGlobalTriggerComponent.C:344
 testGlobalTriggerComponent.C:345
 testGlobalTriggerComponent.C:346
 testGlobalTriggerComponent.C:347
 testGlobalTriggerComponent.C:348
 testGlobalTriggerComponent.C:349
 testGlobalTriggerComponent.C:350
 testGlobalTriggerComponent.C:351
 testGlobalTriggerComponent.C:352
 testGlobalTriggerComponent.C:353
 testGlobalTriggerComponent.C:354
 testGlobalTriggerComponent.C:355
 testGlobalTriggerComponent.C:356
 testGlobalTriggerComponent.C:357
 testGlobalTriggerComponent.C:358
 testGlobalTriggerComponent.C:359
 testGlobalTriggerComponent.C:360
 testGlobalTriggerComponent.C:361
 testGlobalTriggerComponent.C:362
 testGlobalTriggerComponent.C:363
 testGlobalTriggerComponent.C:364
 testGlobalTriggerComponent.C:365
 testGlobalTriggerComponent.C:366
 testGlobalTriggerComponent.C:367
 testGlobalTriggerComponent.C:368
 testGlobalTriggerComponent.C:369
 testGlobalTriggerComponent.C:370
 testGlobalTriggerComponent.C:371
 testGlobalTriggerComponent.C:372
 testGlobalTriggerComponent.C:373
 testGlobalTriggerComponent.C:374
 testGlobalTriggerComponent.C:375
 testGlobalTriggerComponent.C:376
 testGlobalTriggerComponent.C:377
 testGlobalTriggerComponent.C:378
 testGlobalTriggerComponent.C:379
 testGlobalTriggerComponent.C:380
 testGlobalTriggerComponent.C:381
 testGlobalTriggerComponent.C:382
 testGlobalTriggerComponent.C:383
 testGlobalTriggerComponent.C:384
 testGlobalTriggerComponent.C:385
 testGlobalTriggerComponent.C:386
 testGlobalTriggerComponent.C:387
 testGlobalTriggerComponent.C:388
 testGlobalTriggerComponent.C:389
 testGlobalTriggerComponent.C:390
 testGlobalTriggerComponent.C:391
 testGlobalTriggerComponent.C:392
 testGlobalTriggerComponent.C:393
 testGlobalTriggerComponent.C:394
 testGlobalTriggerComponent.C:395
 testGlobalTriggerComponent.C:396
 testGlobalTriggerComponent.C:397
 testGlobalTriggerComponent.C:398
 testGlobalTriggerComponent.C:399
 testGlobalTriggerComponent.C:400
 testGlobalTriggerComponent.C:401
 testGlobalTriggerComponent.C:402
 testGlobalTriggerComponent.C:403
 testGlobalTriggerComponent.C:404
 testGlobalTriggerComponent.C:405
 testGlobalTriggerComponent.C:406
 testGlobalTriggerComponent.C:407
 testGlobalTriggerComponent.C:408
 testGlobalTriggerComponent.C:409
 testGlobalTriggerComponent.C:410
 testGlobalTriggerComponent.C:411
 testGlobalTriggerComponent.C:412
 testGlobalTriggerComponent.C:413
 testGlobalTriggerComponent.C:414
 testGlobalTriggerComponent.C:415
 testGlobalTriggerComponent.C:416
 testGlobalTriggerComponent.C:417
 testGlobalTriggerComponent.C:418
 testGlobalTriggerComponent.C:419
 testGlobalTriggerComponent.C:420
 testGlobalTriggerComponent.C:421
 testGlobalTriggerComponent.C:422
 testGlobalTriggerComponent.C:423
 testGlobalTriggerComponent.C:424
 testGlobalTriggerComponent.C:425
 testGlobalTriggerComponent.C:426
 testGlobalTriggerComponent.C:427
 testGlobalTriggerComponent.C:428
 testGlobalTriggerComponent.C:429
 testGlobalTriggerComponent.C:430
 testGlobalTriggerComponent.C:431
 testGlobalTriggerComponent.C:432
 testGlobalTriggerComponent.C:433
 testGlobalTriggerComponent.C:434
 testGlobalTriggerComponent.C:435
 testGlobalTriggerComponent.C:436
 testGlobalTriggerComponent.C:437
 testGlobalTriggerComponent.C:438
 testGlobalTriggerComponent.C:439
 testGlobalTriggerComponent.C:440
 testGlobalTriggerComponent.C:441
 testGlobalTriggerComponent.C:442
 testGlobalTriggerComponent.C:443
 testGlobalTriggerComponent.C:444
 testGlobalTriggerComponent.C:445
 testGlobalTriggerComponent.C:446
 testGlobalTriggerComponent.C:447
 testGlobalTriggerComponent.C:448
 testGlobalTriggerComponent.C:449
 testGlobalTriggerComponent.C:450
 testGlobalTriggerComponent.C:451
 testGlobalTriggerComponent.C:452
 testGlobalTriggerComponent.C:453
 testGlobalTriggerComponent.C:454
 testGlobalTriggerComponent.C:455
 testGlobalTriggerComponent.C:456
 testGlobalTriggerComponent.C:457
 testGlobalTriggerComponent.C:458
 testGlobalTriggerComponent.C:459
 testGlobalTriggerComponent.C:460
 testGlobalTriggerComponent.C:461
 testGlobalTriggerComponent.C:462
 testGlobalTriggerComponent.C:463
 testGlobalTriggerComponent.C:464
 testGlobalTriggerComponent.C:465
 testGlobalTriggerComponent.C:466
 testGlobalTriggerComponent.C:467
 testGlobalTriggerComponent.C:468
 testGlobalTriggerComponent.C:469
 testGlobalTriggerComponent.C:470
 testGlobalTriggerComponent.C:471
 testGlobalTriggerComponent.C:472
 testGlobalTriggerComponent.C:473
 testGlobalTriggerComponent.C:474
 testGlobalTriggerComponent.C:475
 testGlobalTriggerComponent.C:476
 testGlobalTriggerComponent.C:477
 testGlobalTriggerComponent.C:478
 testGlobalTriggerComponent.C:479
 testGlobalTriggerComponent.C:480
 testGlobalTriggerComponent.C:481
 testGlobalTriggerComponent.C:482
 testGlobalTriggerComponent.C:483
 testGlobalTriggerComponent.C:484
 testGlobalTriggerComponent.C:485
 testGlobalTriggerComponent.C:486
 testGlobalTriggerComponent.C:487
 testGlobalTriggerComponent.C:488
 testGlobalTriggerComponent.C:489
 testGlobalTriggerComponent.C:490
 testGlobalTriggerComponent.C:491
 testGlobalTriggerComponent.C:492
 testGlobalTriggerComponent.C:493
 testGlobalTriggerComponent.C:494
 testGlobalTriggerComponent.C:495
 testGlobalTriggerComponent.C:496
 testGlobalTriggerComponent.C:497
 testGlobalTriggerComponent.C:498
 testGlobalTriggerComponent.C:499
 testGlobalTriggerComponent.C:500
 testGlobalTriggerComponent.C:501
 testGlobalTriggerComponent.C:502
 testGlobalTriggerComponent.C:503
 testGlobalTriggerComponent.C:504
 testGlobalTriggerComponent.C:505
 testGlobalTriggerComponent.C:506
 testGlobalTriggerComponent.C:507
 testGlobalTriggerComponent.C:508
 testGlobalTriggerComponent.C:509
 testGlobalTriggerComponent.C:510
 testGlobalTriggerComponent.C:511
 testGlobalTriggerComponent.C:512
 testGlobalTriggerComponent.C:513
 testGlobalTriggerComponent.C:514
 testGlobalTriggerComponent.C:515
 testGlobalTriggerComponent.C:516
 testGlobalTriggerComponent.C:517
 testGlobalTriggerComponent.C:518
 testGlobalTriggerComponent.C:519
 testGlobalTriggerComponent.C:520
 testGlobalTriggerComponent.C:521
 testGlobalTriggerComponent.C:522
 testGlobalTriggerComponent.C:523
 testGlobalTriggerComponent.C:524
 testGlobalTriggerComponent.C:525
 testGlobalTriggerComponent.C:526
 testGlobalTriggerComponent.C:527
 testGlobalTriggerComponent.C:528
 testGlobalTriggerComponent.C:529
 testGlobalTriggerComponent.C:530
 testGlobalTriggerComponent.C:531
 testGlobalTriggerComponent.C:532
 testGlobalTriggerComponent.C:533
 testGlobalTriggerComponent.C:534
 testGlobalTriggerComponent.C:535
 testGlobalTriggerComponent.C:536
 testGlobalTriggerComponent.C:537
 testGlobalTriggerComponent.C:538
 testGlobalTriggerComponent.C:539
 testGlobalTriggerComponent.C:540
 testGlobalTriggerComponent.C:541
 testGlobalTriggerComponent.C:542
 testGlobalTriggerComponent.C:543
 testGlobalTriggerComponent.C:544
 testGlobalTriggerComponent.C:545
 testGlobalTriggerComponent.C:546
 testGlobalTriggerComponent.C:547
 testGlobalTriggerComponent.C:548
 testGlobalTriggerComponent.C:549
 testGlobalTriggerComponent.C:550
 testGlobalTriggerComponent.C:551
 testGlobalTriggerComponent.C:552
 testGlobalTriggerComponent.C:553
 testGlobalTriggerComponent.C:554
 testGlobalTriggerComponent.C:555
 testGlobalTriggerComponent.C:556
 testGlobalTriggerComponent.C:557
 testGlobalTriggerComponent.C:558
 testGlobalTriggerComponent.C:559
 testGlobalTriggerComponent.C:560
 testGlobalTriggerComponent.C:561
 testGlobalTriggerComponent.C:562
 testGlobalTriggerComponent.C:563
 testGlobalTriggerComponent.C:564
 testGlobalTriggerComponent.C:565
 testGlobalTriggerComponent.C:566
 testGlobalTriggerComponent.C:567
 testGlobalTriggerComponent.C:568
 testGlobalTriggerComponent.C:569
 testGlobalTriggerComponent.C:570
 testGlobalTriggerComponent.C:571
 testGlobalTriggerComponent.C:572
 testGlobalTriggerComponent.C:573
 testGlobalTriggerComponent.C:574
 testGlobalTriggerComponent.C:575
 testGlobalTriggerComponent.C:576
 testGlobalTriggerComponent.C:577
 testGlobalTriggerComponent.C:578
 testGlobalTriggerComponent.C:579
 testGlobalTriggerComponent.C:580
 testGlobalTriggerComponent.C:581
 testGlobalTriggerComponent.C:582
 testGlobalTriggerComponent.C:583
 testGlobalTriggerComponent.C:584
 testGlobalTriggerComponent.C:585
 testGlobalTriggerComponent.C:586
 testGlobalTriggerComponent.C:587
 testGlobalTriggerComponent.C:588
 testGlobalTriggerComponent.C:589
 testGlobalTriggerComponent.C:590
 testGlobalTriggerComponent.C:591
 testGlobalTriggerComponent.C:592
 testGlobalTriggerComponent.C:593
 testGlobalTriggerComponent.C:594
 testGlobalTriggerComponent.C:595
 testGlobalTriggerComponent.C:596
 testGlobalTriggerComponent.C:597
 testGlobalTriggerComponent.C:598
 testGlobalTriggerComponent.C:599
 testGlobalTriggerComponent.C:600
 testGlobalTriggerComponent.C:601
 testGlobalTriggerComponent.C:602
 testGlobalTriggerComponent.C:603
 testGlobalTriggerComponent.C:604
 testGlobalTriggerComponent.C:605
 testGlobalTriggerComponent.C:606
 testGlobalTriggerComponent.C:607
 testGlobalTriggerComponent.C:608
 testGlobalTriggerComponent.C:609
 testGlobalTriggerComponent.C:610
 testGlobalTriggerComponent.C:611
 testGlobalTriggerComponent.C:612
 testGlobalTriggerComponent.C:613
 testGlobalTriggerComponent.C:614
 testGlobalTriggerComponent.C:615
 testGlobalTriggerComponent.C:616
 testGlobalTriggerComponent.C:617
 testGlobalTriggerComponent.C:618
 testGlobalTriggerComponent.C:619
 testGlobalTriggerComponent.C:620
 testGlobalTriggerComponent.C:621
 testGlobalTriggerComponent.C:622
 testGlobalTriggerComponent.C:623
 testGlobalTriggerComponent.C:624
 testGlobalTriggerComponent.C:625
 testGlobalTriggerComponent.C:626
 testGlobalTriggerComponent.C:627
 testGlobalTriggerComponent.C:628
 testGlobalTriggerComponent.C:629
 testGlobalTriggerComponent.C:630
 testGlobalTriggerComponent.C:631
 testGlobalTriggerComponent.C:632
 testGlobalTriggerComponent.C:633
 testGlobalTriggerComponent.C:634
 testGlobalTriggerComponent.C:635
 testGlobalTriggerComponent.C:636
 testGlobalTriggerComponent.C:637
 testGlobalTriggerComponent.C:638
 testGlobalTriggerComponent.C:639
 testGlobalTriggerComponent.C:640
 testGlobalTriggerComponent.C:641
 testGlobalTriggerComponent.C:642
 testGlobalTriggerComponent.C:643
 testGlobalTriggerComponent.C:644
 testGlobalTriggerComponent.C:645
 testGlobalTriggerComponent.C:646
 testGlobalTriggerComponent.C:647
 testGlobalTriggerComponent.C:648
 testGlobalTriggerComponent.C:649
 testGlobalTriggerComponent.C:650
 testGlobalTriggerComponent.C:651
 testGlobalTriggerComponent.C:652
 testGlobalTriggerComponent.C:653
 testGlobalTriggerComponent.C:654
 testGlobalTriggerComponent.C:655
 testGlobalTriggerComponent.C:656
 testGlobalTriggerComponent.C:657
 testGlobalTriggerComponent.C:658
 testGlobalTriggerComponent.C:659
 testGlobalTriggerComponent.C:660
 testGlobalTriggerComponent.C:661
 testGlobalTriggerComponent.C:662
 testGlobalTriggerComponent.C:663
 testGlobalTriggerComponent.C:664
 testGlobalTriggerComponent.C:665
 testGlobalTriggerComponent.C:666
 testGlobalTriggerComponent.C:667
 testGlobalTriggerComponent.C:668
 testGlobalTriggerComponent.C:669
 testGlobalTriggerComponent.C:670
 testGlobalTriggerComponent.C:671
 testGlobalTriggerComponent.C:672
 testGlobalTriggerComponent.C:673
 testGlobalTriggerComponent.C:674
 testGlobalTriggerComponent.C:675
 testGlobalTriggerComponent.C:676
 testGlobalTriggerComponent.C:677
 testGlobalTriggerComponent.C:678
 testGlobalTriggerComponent.C:679
 testGlobalTriggerComponent.C:680
 testGlobalTriggerComponent.C:681
 testGlobalTriggerComponent.C:682
 testGlobalTriggerComponent.C:683
 testGlobalTriggerComponent.C:684
 testGlobalTriggerComponent.C:685
 testGlobalTriggerComponent.C:686
 testGlobalTriggerComponent.C:687
 testGlobalTriggerComponent.C:688
 testGlobalTriggerComponent.C:689
 testGlobalTriggerComponent.C:690
 testGlobalTriggerComponent.C:691
 testGlobalTriggerComponent.C:692
 testGlobalTriggerComponent.C:693
 testGlobalTriggerComponent.C:694
 testGlobalTriggerComponent.C:695
 testGlobalTriggerComponent.C:696
 testGlobalTriggerComponent.C:697
 testGlobalTriggerComponent.C:698
 testGlobalTriggerComponent.C:699
 testGlobalTriggerComponent.C:700
 testGlobalTriggerComponent.C:701
 testGlobalTriggerComponent.C:702
 testGlobalTriggerComponent.C:703
 testGlobalTriggerComponent.C:704
 testGlobalTriggerComponent.C:705
 testGlobalTriggerComponent.C:706
 testGlobalTriggerComponent.C:707
 testGlobalTriggerComponent.C:708
 testGlobalTriggerComponent.C:709
 testGlobalTriggerComponent.C:710
 testGlobalTriggerComponent.C:711
 testGlobalTriggerComponent.C:712
 testGlobalTriggerComponent.C:713
 testGlobalTriggerComponent.C:714
 testGlobalTriggerComponent.C:715
 testGlobalTriggerComponent.C:716
 testGlobalTriggerComponent.C:717
 testGlobalTriggerComponent.C:718
 testGlobalTriggerComponent.C:719
 testGlobalTriggerComponent.C:720
 testGlobalTriggerComponent.C:721
 testGlobalTriggerComponent.C:722
 testGlobalTriggerComponent.C:723
 testGlobalTriggerComponent.C:724
 testGlobalTriggerComponent.C:725
 testGlobalTriggerComponent.C:726
 testGlobalTriggerComponent.C:727
 testGlobalTriggerComponent.C:728
 testGlobalTriggerComponent.C:729
 testGlobalTriggerComponent.C:730
 testGlobalTriggerComponent.C:731
 testGlobalTriggerComponent.C:732
 testGlobalTriggerComponent.C:733
 testGlobalTriggerComponent.C:734
 testGlobalTriggerComponent.C:735
 testGlobalTriggerComponent.C:736
 testGlobalTriggerComponent.C:737
 testGlobalTriggerComponent.C:738
 testGlobalTriggerComponent.C:739
 testGlobalTriggerComponent.C:740
 testGlobalTriggerComponent.C:741
 testGlobalTriggerComponent.C:742
 testGlobalTriggerComponent.C:743
 testGlobalTriggerComponent.C:744
 testGlobalTriggerComponent.C:745
 testGlobalTriggerComponent.C:746
 testGlobalTriggerComponent.C:747
 testGlobalTriggerComponent.C:748
 testGlobalTriggerComponent.C:749
 testGlobalTriggerComponent.C:750
 testGlobalTriggerComponent.C:751
 testGlobalTriggerComponent.C:752
 testGlobalTriggerComponent.C:753
 testGlobalTriggerComponent.C:754
 testGlobalTriggerComponent.C:755
 testGlobalTriggerComponent.C:756
 testGlobalTriggerComponent.C:757
 testGlobalTriggerComponent.C:758
 testGlobalTriggerComponent.C:759
 testGlobalTriggerComponent.C:760
 testGlobalTriggerComponent.C:761
 testGlobalTriggerComponent.C:762
 testGlobalTriggerComponent.C:763
 testGlobalTriggerComponent.C:764
 testGlobalTriggerComponent.C:765
 testGlobalTriggerComponent.C:766
 testGlobalTriggerComponent.C:767
 testGlobalTriggerComponent.C:768
 testGlobalTriggerComponent.C:769
 testGlobalTriggerComponent.C:770
 testGlobalTriggerComponent.C:771
 testGlobalTriggerComponent.C:772
 testGlobalTriggerComponent.C:773
 testGlobalTriggerComponent.C:774
 testGlobalTriggerComponent.C:775
 testGlobalTriggerComponent.C:776
 testGlobalTriggerComponent.C:777
 testGlobalTriggerComponent.C:778
 testGlobalTriggerComponent.C:779
 testGlobalTriggerComponent.C:780
 testGlobalTriggerComponent.C:781
 testGlobalTriggerComponent.C:782
 testGlobalTriggerComponent.C:783
 testGlobalTriggerComponent.C:784
 testGlobalTriggerComponent.C:785
 testGlobalTriggerComponent.C:786
 testGlobalTriggerComponent.C:787
 testGlobalTriggerComponent.C:788
 testGlobalTriggerComponent.C:789
 testGlobalTriggerComponent.C:790
 testGlobalTriggerComponent.C:791
 testGlobalTriggerComponent.C:792
 testGlobalTriggerComponent.C:793
 testGlobalTriggerComponent.C:794
 testGlobalTriggerComponent.C:795
 testGlobalTriggerComponent.C:796
 testGlobalTriggerComponent.C:797
 testGlobalTriggerComponent.C:798
 testGlobalTriggerComponent.C:799
 testGlobalTriggerComponent.C:800
 testGlobalTriggerComponent.C:801
 testGlobalTriggerComponent.C:802
 testGlobalTriggerComponent.C:803
 testGlobalTriggerComponent.C:804
 testGlobalTriggerComponent.C:805
 testGlobalTriggerComponent.C:806
 testGlobalTriggerComponent.C:807
 testGlobalTriggerComponent.C:808
 testGlobalTriggerComponent.C:809
 testGlobalTriggerComponent.C:810
 testGlobalTriggerComponent.C:811
 testGlobalTriggerComponent.C:812
 testGlobalTriggerComponent.C:813
 testGlobalTriggerComponent.C:814
 testGlobalTriggerComponent.C:815
 testGlobalTriggerComponent.C:816
 testGlobalTriggerComponent.C:817
 testGlobalTriggerComponent.C:818
 testGlobalTriggerComponent.C:819
 testGlobalTriggerComponent.C:820
 testGlobalTriggerComponent.C:821
 testGlobalTriggerComponent.C:822
 testGlobalTriggerComponent.C:823
 testGlobalTriggerComponent.C:824
 testGlobalTriggerComponent.C:825
 testGlobalTriggerComponent.C:826
 testGlobalTriggerComponent.C:827
 testGlobalTriggerComponent.C:828
 testGlobalTriggerComponent.C:829
 testGlobalTriggerComponent.C:830
 testGlobalTriggerComponent.C:831
 testGlobalTriggerComponent.C:832
 testGlobalTriggerComponent.C:833
 testGlobalTriggerComponent.C:834
 testGlobalTriggerComponent.C:835
 testGlobalTriggerComponent.C:836
 testGlobalTriggerComponent.C:837
 testGlobalTriggerComponent.C:838
 testGlobalTriggerComponent.C:839
 testGlobalTriggerComponent.C:840
 testGlobalTriggerComponent.C:841
 testGlobalTriggerComponent.C:842
 testGlobalTriggerComponent.C:843
 testGlobalTriggerComponent.C:844
 testGlobalTriggerComponent.C:845
 testGlobalTriggerComponent.C:846
 testGlobalTriggerComponent.C:847
 testGlobalTriggerComponent.C:848
 testGlobalTriggerComponent.C:849
 testGlobalTriggerComponent.C:850
 testGlobalTriggerComponent.C:851
 testGlobalTriggerComponent.C:852
 testGlobalTriggerComponent.C:853
 testGlobalTriggerComponent.C:854
 testGlobalTriggerComponent.C:855
 testGlobalTriggerComponent.C:856
 testGlobalTriggerComponent.C:857
 testGlobalTriggerComponent.C:858
 testGlobalTriggerComponent.C:859
 testGlobalTriggerComponent.C:860
 testGlobalTriggerComponent.C:861
 testGlobalTriggerComponent.C:862
 testGlobalTriggerComponent.C:863
 testGlobalTriggerComponent.C:864
 testGlobalTriggerComponent.C:865
 testGlobalTriggerComponent.C:866
 testGlobalTriggerComponent.C:867
 testGlobalTriggerComponent.C:868
 testGlobalTriggerComponent.C:869
 testGlobalTriggerComponent.C:870
 testGlobalTriggerComponent.C:871
 testGlobalTriggerComponent.C:872
 testGlobalTriggerComponent.C:873
 testGlobalTriggerComponent.C:874
 testGlobalTriggerComponent.C:875
 testGlobalTriggerComponent.C:876
 testGlobalTriggerComponent.C:877
 testGlobalTriggerComponent.C:878
 testGlobalTriggerComponent.C:879
 testGlobalTriggerComponent.C:880
 testGlobalTriggerComponent.C:881
 testGlobalTriggerComponent.C:882
 testGlobalTriggerComponent.C:883
 testGlobalTriggerComponent.C:884
 testGlobalTriggerComponent.C:885
 testGlobalTriggerComponent.C:886
 testGlobalTriggerComponent.C:887
 testGlobalTriggerComponent.C:888
 testGlobalTriggerComponent.C:889
 testGlobalTriggerComponent.C:890
 testGlobalTriggerComponent.C:891
 testGlobalTriggerComponent.C:892
 testGlobalTriggerComponent.C:893
 testGlobalTriggerComponent.C:894
 testGlobalTriggerComponent.C:895
 testGlobalTriggerComponent.C:896
 testGlobalTriggerComponent.C:897
 testGlobalTriggerComponent.C:898
 testGlobalTriggerComponent.C:899
 testGlobalTriggerComponent.C:900
 testGlobalTriggerComponent.C:901
 testGlobalTriggerComponent.C:902
 testGlobalTriggerComponent.C:903
 testGlobalTriggerComponent.C:904
 testGlobalTriggerComponent.C:905
 testGlobalTriggerComponent.C:906
 testGlobalTriggerComponent.C:907
 testGlobalTriggerComponent.C:908
 testGlobalTriggerComponent.C:909
 testGlobalTriggerComponent.C:910
 testGlobalTriggerComponent.C:911
 testGlobalTriggerComponent.C:912
 testGlobalTriggerComponent.C:913
 testGlobalTriggerComponent.C:914
 testGlobalTriggerComponent.C:915
 testGlobalTriggerComponent.C:916
 testGlobalTriggerComponent.C:917
 testGlobalTriggerComponent.C:918
 testGlobalTriggerComponent.C:919
 testGlobalTriggerComponent.C:920
 testGlobalTriggerComponent.C:921
 testGlobalTriggerComponent.C:922
 testGlobalTriggerComponent.C:923
 testGlobalTriggerComponent.C:924
 testGlobalTriggerComponent.C:925
 testGlobalTriggerComponent.C:926
 testGlobalTriggerComponent.C:927
 testGlobalTriggerComponent.C:928
 testGlobalTriggerComponent.C:929
 testGlobalTriggerComponent.C:930
 testGlobalTriggerComponent.C:931
 testGlobalTriggerComponent.C:932
 testGlobalTriggerComponent.C:933
 testGlobalTriggerComponent.C:934
 testGlobalTriggerComponent.C:935
 testGlobalTriggerComponent.C:936
 testGlobalTriggerComponent.C:937
 testGlobalTriggerComponent.C:938
 testGlobalTriggerComponent.C:939
 testGlobalTriggerComponent.C:940
 testGlobalTriggerComponent.C:941
 testGlobalTriggerComponent.C:942
 testGlobalTriggerComponent.C:943
 testGlobalTriggerComponent.C:944
 testGlobalTriggerComponent.C:945
 testGlobalTriggerComponent.C:946
 testGlobalTriggerComponent.C:947
 testGlobalTriggerComponent.C:948
 testGlobalTriggerComponent.C:949
 testGlobalTriggerComponent.C:950
 testGlobalTriggerComponent.C:951
 testGlobalTriggerComponent.C:952
 testGlobalTriggerComponent.C:953
 testGlobalTriggerComponent.C:954
 testGlobalTriggerComponent.C:955
 testGlobalTriggerComponent.C:956
 testGlobalTriggerComponent.C:957
 testGlobalTriggerComponent.C:958
 testGlobalTriggerComponent.C:959
 testGlobalTriggerComponent.C:960
 testGlobalTriggerComponent.C:961
 testGlobalTriggerComponent.C:962
 testGlobalTriggerComponent.C:963
 testGlobalTriggerComponent.C:964
 testGlobalTriggerComponent.C:965
 testGlobalTriggerComponent.C:966
 testGlobalTriggerComponent.C:967
 testGlobalTriggerComponent.C:968
 testGlobalTriggerComponent.C:969
 testGlobalTriggerComponent.C:970
 testGlobalTriggerComponent.C:971
 testGlobalTriggerComponent.C:972
 testGlobalTriggerComponent.C:973
 testGlobalTriggerComponent.C:974
 testGlobalTriggerComponent.C:975
 testGlobalTriggerComponent.C:976
 testGlobalTriggerComponent.C:977
 testGlobalTriggerComponent.C:978
 testGlobalTriggerComponent.C:979
 testGlobalTriggerComponent.C:980
 testGlobalTriggerComponent.C:981
 testGlobalTriggerComponent.C:982
 testGlobalTriggerComponent.C:983
 testGlobalTriggerComponent.C:984
 testGlobalTriggerComponent.C:985
 testGlobalTriggerComponent.C:986
 testGlobalTriggerComponent.C:987
 testGlobalTriggerComponent.C:988
 testGlobalTriggerComponent.C:989
 testGlobalTriggerComponent.C:990
 testGlobalTriggerComponent.C:991
 testGlobalTriggerComponent.C:992
 testGlobalTriggerComponent.C:993
 testGlobalTriggerComponent.C:994
 testGlobalTriggerComponent.C:995
 testGlobalTriggerComponent.C:996
 testGlobalTriggerComponent.C:997
 testGlobalTriggerComponent.C:998
 testGlobalTriggerComponent.C:999
 testGlobalTriggerComponent.C:1000
 testGlobalTriggerComponent.C:1001
 testGlobalTriggerComponent.C:1002
 testGlobalTriggerComponent.C:1003
 testGlobalTriggerComponent.C:1004
 testGlobalTriggerComponent.C:1005
 testGlobalTriggerComponent.C:1006
 testGlobalTriggerComponent.C:1007
 testGlobalTriggerComponent.C:1008
 testGlobalTriggerComponent.C:1009
 testGlobalTriggerComponent.C:1010
 testGlobalTriggerComponent.C:1011
 testGlobalTriggerComponent.C:1012
 testGlobalTriggerComponent.C:1013
 testGlobalTriggerComponent.C:1014
 testGlobalTriggerComponent.C:1015
 testGlobalTriggerComponent.C:1016
 testGlobalTriggerComponent.C:1017
 testGlobalTriggerComponent.C:1018
 testGlobalTriggerComponent.C:1019
 testGlobalTriggerComponent.C:1020
 testGlobalTriggerComponent.C:1021
 testGlobalTriggerComponent.C:1022
 testGlobalTriggerComponent.C:1023
 testGlobalTriggerComponent.C:1024
 testGlobalTriggerComponent.C:1025
 testGlobalTriggerComponent.C:1026