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   testTriggerCounterComponent.C
 * @author Artur Szostak <artursz@iafrica.com>
 * @date   5 Nov 2010
 *
 * This macro is used to test the AliHLTTriggerCounterComponent class.
 * Tests are run with component within the AliHLTSystem framework to check that
 * the trigger counters are generated correctly by the component.
 */

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "TSystem.h"
#include "TFile.h"
#include "AliLog.h"
#include "AliHLTTriggerCounters.h"
#include "AliHLTTriggerDecision.h"
#include "AliHLTGlobalTriggerDecision.h"
#include "AliHLTSystem.h"
#include "AliHLTConfiguration.h"
#include "AliHLTCTPData.h"
#include "Riostream.h"
#endif

/**
 * Generates some sample input data and writes it into 9 files named
 * testInputFileTriggerCounter1.root ... testInputFileTriggerCounter9.root
 */
void GenerateInputData()
{
	AliHLTTriggerDecision td1(true, "TRIGGER-A", AliHLTTriggerDomain("TRACKS:TPC"));
	AliHLTTriggerDecision td1f(false, "TRIGGER-A", AliHLTTriggerDomain());
	AliHLTTriggerDecision td2(true, "TRIGGER-B", AliHLTTriggerDomain("CLUSTERS:TPC"));
	AliHLTTriggerDecision td2f(false, "TRIGGER-B", AliHLTTriggerDomain());
	AliHLTTriggerDecision td3(true, "TRIGGER-C", AliHLTTriggerDomain("*******:***"));
	AliHLTTriggerDecision td3f(false, "TRIGGER-C", AliHLTTriggerDomain());
	AliHLTGlobalTriggerDecision gd1(true, AliHLTTriggerDomain("TRACKS:TPC"), "TRIGGER-A");
	AliHLTGlobalTriggerDecision gd2(true, AliHLTTriggerDomain("CLUSTERS:TPC"), "TRIGGER-B");
	AliHLTGlobalTriggerDecision gd3(true, AliHLTTriggerDomain("*******:***"), "TRIGGER-B,TRIGGER-C");
	
	AliHLTCTPData ctp("CTP_TRIGGER_CLASS=00:CINTA:17,01:CINTB:00-01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17,02:CMUB:00-10-11-17");
	gd1.AddInputObjectRef(&ctp);
	gd2.AddInputObjectRef(&ctp);
	gd3.AddInputObjectRef(&ctp);
	
	TFile* file = new TFile("testInputFileTriggerCounter1.root", "RECREATE");
	ctp.Increment(int(0));
	gd1.Write("HLTGlobalTrigger");
	td1.Write("Trigger");
	delete file;
	
	file = new TFile("testInputFileTriggerCounter2.root", "RECREATE");
	ctp.Increment(int(1));
	gd2.Write("HLTGlobalTrigger");
	td1f.Write("Trigger");
	td2.Write("Trigger");
	td3f.Write("Trigger");
	delete file;
	
	file = new TFile("testInputFileTriggerCounter3.root", "RECREATE");
	ctp.Increment(int(2));
	gd3.Write("HLTGlobalTrigger");
	td1f.Write("Trigger");
	td2.Write("Trigger");
	td3.Write("Trigger");
	delete file;
	
	gd1.AddTriggerInput(td1);
	gd2.AddTriggerInput(td1f);
	gd2.AddTriggerInput(td2);
	gd2.AddTriggerInput(td3f);
	gd3.AddTriggerInput(td1f);
	gd3.AddTriggerInput(td2);
	gd3.AddTriggerInput(td3);
	
	file = new TFile("testInputFileTriggerCounter4.root", "RECREATE");
	ctp.Increment(int(0));
	gd1.Write("HLTGlobalTrigger");
	td1.Write("Trigger");
	delete file;
	
	file = new TFile("testInputFileTriggerCounter5.root", "RECREATE");
	ctp.Increment(int(1));
	gd2.Write("HLTGlobalTrigger");
	td1f.Write("Trigger");
	td2.Write("Trigger");
	delete file;
	
	file = new TFile("testInputFileTriggerCounter6.root", "RECREATE");
	ctp.Increment(int(2));
	gd3.Write("HLTGlobalTrigger");
	td1f.Write("Trigger");
	td2.Write("Trigger");
	td3.Write("Trigger");
	delete file;
	
	file = new TFile("testInputFileTriggerCounter7.root", "RECREATE");
	ctp.Increment(int(0));
	gd1.Write("HLTGlobalTrigger");
	delete file;
	
	file = new TFile("testInputFileTriggerCounter8.root", "RECREATE");
	ctp.Increment(int(1));
	gd2.Write("HLTGlobalTrigger");
	delete file;
	
	file = new TFile("testInputFileTriggerCounter9.root", "RECREATE");
	ctp.Increment(int(2));
	gd3.Write("HLTGlobalTrigger");
	delete file;
}

/**
 * Runs a small chain with the HLTTriggerCounter component to generate output that
 * can be checked.
 * \param debug  If true then full debug logging is enabled.
 * \param numOfEvents  The number of events to run the chain for.
 */
void RunTriggerCounter(bool debug = false, int numOfEvents = 9)
{
	AliHLTSystem sys;
	sys.ScanOptions("ECS=CTP_TRIGGER_CLASS=00:CINTA:17,01:CINTB:00-01-02-03-04-05-06-07-08-09-10-11-12-13-14-15-16-17,02:CMUB:00-10-11-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 GLOBTRIG 'HLT ' -objectname HLTGlobalTrigger ";
	for (int i = 1; i <= 9; i++)
	{
		if (i > 1) cmdline += " -nextevent";
		cmdline += Form(" -datafile testInputFileTriggerCounter%d.root", i);
	}
	AliHLTConfiguration pub1("pub1", "ROOTFilePublisher", NULL, cmdline.Data());
	cmdline = "-datatype TRIG_DEC 'HLT ' -objectname Trigger ";
	for (int i = 1; i <= 9; i++)
	{
		if (i > 1) cmdline += " -nextevent";
		cmdline += Form(" -datafile testInputFileTriggerCounter%d.root", i);
	}
	AliHLTConfiguration pub2("pub2", "ROOTFilePublisher", NULL, cmdline.Data());
	AliHLTConfiguration proc("proc", "HLTTriggerCounter", "pub1 pub2", "-skipcdb -config InitialCounterConfig.C");
	AliHLTConfiguration sink("sink", "ROOTFileWriter", "proc", "-datafile testOutputFileTriggerCounter.root -concatenate-events");
	sys.BuildTaskList("sink");
	AliHLTUInt64_t trigMask[9] = {0x1, 0x2, 0x4, 0x1, 0x2, 0x4, 0x1, 0x2, 0x4};
	for (int i = 0; i < 9 && i < numOfEvents; i++)
	{
		sys.Run(
			1,  // number of events
			(i == 8 ? 1 : 0),  // Stop chain at end of run.
			trigMask[i], // Active CTP trigger mask.
			0,   // Time stamp.
			0    // Event type.
		);
	}
}

/**
 * Checks that the input and output counters have the expected values or not.
 * If they do not an appropriate error message is printed.
 * \param eventNum  The number of the event being checked.
 * \param inputCounters  The input counters to check.
 * \param outputCounters  The output counters to check.
 * \param expectedInputCounters  The expected input counter values to check against.
 * \param expectedOutputCounters  The expected output counter values to check against.
 * \param expectedDescription  The expected resulting trigger description.
 * \returns true if the counters are correct and false otherwise.
 */
bool CheckCounters(
		int eventNum,
		AliHLTTriggerCounters* inputCounters,
		AliHLTTriggerCounters* outputCounters,
		AliHLTTriggerCounters& expectedInputCounters,
		AliHLTTriggerCounters& expectedOutputCounters
	)
{
	if (inputCounters == NULL)
	{
		cerr << "ERROR: No trigger input counters were found for event "
		     << eventNum << "." << endl;
		return false;
	}
	if (outputCounters == NULL)
	{
		cerr << "ERROR: No trigger output counters were found for event "
		     << eventNum << "." << endl;
		return false;
	}
	// Copy over the Rates because these might not be identical since they are a
	// run time parameter. The counter value and name must be identical however.
	for (UInt_t i = 0; i < inputCounters->NumberOfCounters() && i < expectedInputCounters.NumberOfCounters(); ++i)
	{
		expectedInputCounters.GetCounterN(i).Rate( inputCounters->GetCounterN(i).Rate() );
	}
	for (UInt_t i = 0; i < outputCounters->NumberOfCounters() && i < expectedOutputCounters.NumberOfCounters(); ++i)
	{
		expectedOutputCounters.GetCounterN(i).Rate( outputCounters->GetCounterN(i).Rate() );
	}
	bool inputCountersAsExpected = (inputCounters->NumberOfCounters() == expectedInputCounters.NumberOfCounters());
	bool outputCountersAsExpected = (outputCounters->NumberOfCounters() == expectedOutputCounters.NumberOfCounters());
	for (UInt_t i = 0; i < inputCounters->NumberOfCounters() && i < expectedInputCounters.NumberOfCounters(); ++i)
	{
		if (strcmp(expectedInputCounters.GetCounterN(i).Name(), inputCounters->GetCounterN(i).Name()) != 0)
		{
			inputCountersAsExpected = false;
			break;
		}
		if (expectedInputCounters.GetCounterN(i).Counter() != inputCounters->GetCounterN(i).Counter())
		{
			inputCountersAsExpected = false;
			break;
		}
	}
	for (UInt_t i = 0; i < outputCounters->NumberOfCounters() && i < expectedOutputCounters.NumberOfCounters(); ++i)
	{
		if (strcmp(expectedOutputCounters.GetCounterN(i).Name(), outputCounters->GetCounterN(i).Name()) != 0)
		{
			outputCountersAsExpected = false;
			break;
		}
		if (expectedOutputCounters.GetCounterN(i).Counter() != outputCounters->GetCounterN(i).Counter())
		{
			outputCountersAsExpected = false;
			break;
		}
	}
	if (! inputCountersAsExpected)
	{
		cerr << "ERROR: The trigger input counters do not match the expected set of counters for event "
		     << eventNum << "." << endl;
		cout << "Found the following input counters: " << endl;  // using cout since Print() goes there.
		inputCounters->Print();
		cout << "But expected the following input counters: " << endl;
		expectedInputCounters.Print();
		return false;
	}
	if (! outputCountersAsExpected)
	{
		cerr << "ERROR: The trigger output counters do not match the expected set of counters for event "
		     << eventNum << "." << endl;
		cout << "Found the following output counters: " << endl;  // using cout since Print() goes there.
		outputCounters->Print();
		cout << "But expected the following output counters: " << endl;
		expectedOutputCounters.Print();
		return false;
	}
	return true;
}


/// Routine for checking the results file generated by the RunTriggerCounter routine.
bool CheckTriggerCounterOutput()
{
	AliHLTTriggerCounters expectedInputCounters[11];
	AliHLTTriggerCounters expectedOutputCounters[11];
	
	// Start-of-run event (should contain no values)
	expectedInputCounters[0].Add("CINTA", "", 0, 0);
	expectedInputCounters[0].Add("CINTB", "", 0, 0);
	expectedInputCounters[0].Add("CMUB", "", 0, 0);
	expectedOutputCounters[0].Add("TRIGGER-A", "", 0, 0);
	
	// Data events
	expectedInputCounters[1].Add("CINTA", "", 0, 1);
	expectedInputCounters[1].Add("CINTB", "", 0, 0);
	expectedInputCounters[1].Add("CMUB", "", 0, 0);
	expectedInputCounters[1].Add("TRIGGER-A", "", 0, 1);
	expectedOutputCounters[1].Add("TRIGGER-A", "", 0, 1);
	
	expectedInputCounters[2].Add("CINTA", "", 0, 1);
	expectedInputCounters[2].Add("CINTB", "", 0, 1);
	expectedInputCounters[2].Add("CMUB", "", 0, 0);
	expectedInputCounters[2].Add("TRIGGER-A", "", 0, 1);
	expectedInputCounters[2].Add("TRIGGER-B", "", 0, 1);
	expectedOutputCounters[2].Add("TRIGGER-A", "", 0, 1);
	expectedOutputCounters[2].Add("TRIGGER-B", "", 0, 1);
	
	expectedInputCounters[3].Add("CINTA", "", 0, 1);
	expectedInputCounters[3].Add("CINTB", "", 0, 1);
	expectedInputCounters[3].Add("CMUB", "", 0, 1);
	expectedInputCounters[3].Add("TRIGGER-A", "", 0, 1);
	expectedInputCounters[3].Add("TRIGGER-B", "", 0, 2);
	expectedInputCounters[3].Add("TRIGGER-C", "", 0, 1);
	expectedOutputCounters[3].Add("TRIGGER-A", "", 0, 1);
	expectedOutputCounters[3].Add("TRIGGER-B", "", 0, 2);
	expectedOutputCounters[3].Add("TRIGGER-C", "", 0, 1);
	
	expectedInputCounters[4].Add("CINTA", "", 0, 2);
	expectedInputCounters[4].Add("CINTB", "", 0, 1);
	expectedInputCounters[4].Add("CMUB", "", 0, 1);
	expectedInputCounters[4].Add("TRIGGER-A", "", 0, 2);
	expectedInputCounters[4].Add("TRIGGER-B", "", 0, 2);
	expectedInputCounters[4].Add("TRIGGER-C", "", 0, 1);
	expectedOutputCounters[4].Add("TRIGGER-A", "", 0, 2);
	expectedOutputCounters[4].Add("TRIGGER-B", "", 0, 2);
	expectedOutputCounters[4].Add("TRIGGER-C", "", 0, 1);
	
	expectedInputCounters[5].Add("CINTA", "", 0, 2);
	expectedInputCounters[5].Add("CINTB", "", 0, 2);
	expectedInputCounters[5].Add("CMUB", "", 0, 1);
	expectedInputCounters[5].Add("TRIGGER-A", "", 0, 2);
	expectedInputCounters[5].Add("TRIGGER-B", "", 0, 3);
	expectedInputCounters[5].Add("TRIGGER-C", "", 0, 1);
	expectedOutputCounters[5].Add("TRIGGER-A", "", 0, 2);
	expectedOutputCounters[5].Add("TRIGGER-B", "", 0, 3);
	expectedOutputCounters[5].Add("TRIGGER-C", "", 0, 1);
	
	expectedInputCounters[6].Add("CINTA", "", 0, 2);
	expectedInputCounters[6].Add("CINTB", "", 0, 2);
	expectedInputCounters[6].Add("CMUB", "", 0, 2);
	expectedInputCounters[6].Add("TRIGGER-A", "", 0, 2);
	expectedInputCounters[6].Add("TRIGGER-B", "", 0, 4);
	expectedInputCounters[6].Add("TRIGGER-C", "", 0, 2);
	expectedOutputCounters[6].Add("TRIGGER-A", "", 0, 2);
	expectedOutputCounters[6].Add("TRIGGER-B", "", 0, 4);
	expectedOutputCounters[6].Add("TRIGGER-C", "", 0, 2);
	
	expectedInputCounters[7].Add("CINTA", "", 0, 3);
	expectedInputCounters[7].Add("CINTB", "", 0, 2);
	expectedInputCounters[7].Add("CMUB", "", 0, 2);
	expectedInputCounters[7].Add("TRIGGER-A", "", 0, 3);
	expectedInputCounters[7].Add("TRIGGER-B", "", 0, 4);
	expectedInputCounters[7].Add("TRIGGER-C", "", 0, 2);
	expectedOutputCounters[7].Add("TRIGGER-A", "", 0, 3);
	expectedOutputCounters[7].Add("TRIGGER-B", "", 0, 4);
	expectedOutputCounters[7].Add("TRIGGER-C", "", 0, 2);
	
	expectedInputCounters[8].Add("CINTA", "", 0, 3);
	expectedInputCounters[8].Add("CINTB", "", 0, 3);
	expectedInputCounters[8].Add("CMUB", "", 0, 2);
	expectedInputCounters[8].Add("TRIGGER-A", "", 0, 3);
	expectedInputCounters[8].Add("TRIGGER-B", "", 0, 5);
	expectedInputCounters[8].Add("TRIGGER-C", "", 0, 2);
	expectedOutputCounters[8].Add("TRIGGER-A", "", 0, 3);
	expectedOutputCounters[8].Add("TRIGGER-B", "", 0, 5);
	expectedOutputCounters[8].Add("TRIGGER-C", "", 0, 2);
	
	expectedInputCounters[9].Add("CINTA", "", 0, 3);
	expectedInputCounters[9].Add("CINTB", "", 0, 3);
	expectedInputCounters[9].Add("CMUB", "", 0, 3);
	expectedInputCounters[9].Add("TRIGGER-A", "", 0, 3);
	expectedInputCounters[9].Add("TRIGGER-B", "", 0, 6);
	expectedInputCounters[9].Add("TRIGGER-C", "", 0, 3);
	expectedOutputCounters[9].Add("TRIGGER-A", "", 0, 3);
	expectedOutputCounters[9].Add("TRIGGER-B", "", 0, 6);
	expectedOutputCounters[9].Add("TRIGGER-C", "", 0, 3);
	
	// End-of-run event
	expectedInputCounters[10].Add("CINTA", "", 0, 3);
	expectedInputCounters[10].Add("CINTB", "", 0, 3);
	expectedInputCounters[10].Add("CMUB", "", 0, 3);
	expectedInputCounters[10].Add("TRIGGER-A", "", 0, 3);
	expectedInputCounters[10].Add("TRIGGER-B", "", 0, 6);
	expectedInputCounters[10].Add("TRIGGER-C", "", 0, 3);
	expectedOutputCounters[10].Add("TRIGGER-A", "", 0, 3);
	expectedOutputCounters[10].Add("TRIGGER-B", "", 0, 6);
	expectedOutputCounters[10].Add("TRIGGER-C", "", 0, 3);
	
	TFile* file = new TFile("testOutputFileTriggerCounter.root", "READ");
	for (int i = 0; i < 11; ++i)
	{
		AliHLTTriggerCounters* inputCounters = dynamic_cast<AliHLTTriggerCounters*>( file->Get(Form("AliHLTTriggerCounters;%d", i*2+1)) );
		AliHLTTriggerCounters* outputCounters = dynamic_cast<AliHLTTriggerCounters*>( file->Get(Form("AliHLTTriggerCounters;%d", i*2+2)) );
		if (! CheckCounters(i-1, inputCounters, outputCounters, expectedInputCounters[i], expectedOutputCounters[i]))
		{
			delete file;
			return false;
		}
	}
	delete file;
	return true;
}

/**
 * Runs several tests for the AliHLTTriggerCounterComponent class.
 * We specifically test if the generated counters are correctly generated.
 * \param debug  If true then full debug logging is enabled.
 * \param numOfEvents  The number of events to run the chain over.
 * \returns true if all the tests succeeded and false otherwise.
 */
bool testTriggerCounterComponent(bool debug = false, int numOfEvents = 9)
{
	GenerateInputData();
	RunTriggerCounter(debug, numOfEvents);
	if (! CheckTriggerCounterOutput()) return false;
	// Cleanup all temporary files generated.
	gSystem->Exec("rm -f testOutputFileTriggerCounter.root testInputFileTriggerCounter*.root");
	return true;
}


#ifndef __MAKECINT__

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

#endif // __MAKECINT__
 testTriggerCounterComponent.C:1
 testTriggerCounterComponent.C:2
 testTriggerCounterComponent.C:3
 testTriggerCounterComponent.C:4
 testTriggerCounterComponent.C:5
 testTriggerCounterComponent.C:6
 testTriggerCounterComponent.C:7
 testTriggerCounterComponent.C:8
 testTriggerCounterComponent.C:9
 testTriggerCounterComponent.C:10
 testTriggerCounterComponent.C:11
 testTriggerCounterComponent.C:12
 testTriggerCounterComponent.C:13
 testTriggerCounterComponent.C:14
 testTriggerCounterComponent.C:15
 testTriggerCounterComponent.C:16
 testTriggerCounterComponent.C:17
 testTriggerCounterComponent.C:18
 testTriggerCounterComponent.C:19
 testTriggerCounterComponent.C:20
 testTriggerCounterComponent.C:21
 testTriggerCounterComponent.C:22
 testTriggerCounterComponent.C:23
 testTriggerCounterComponent.C:24
 testTriggerCounterComponent.C:25
 testTriggerCounterComponent.C:26
 testTriggerCounterComponent.C:27
 testTriggerCounterComponent.C:28
 testTriggerCounterComponent.C:29
 testTriggerCounterComponent.C:30
 testTriggerCounterComponent.C:31
 testTriggerCounterComponent.C:32
 testTriggerCounterComponent.C:33
 testTriggerCounterComponent.C:34
 testTriggerCounterComponent.C:35
 testTriggerCounterComponent.C:36
 testTriggerCounterComponent.C:37
 testTriggerCounterComponent.C:38
 testTriggerCounterComponent.C:39
 testTriggerCounterComponent.C:40
 testTriggerCounterComponent.C:41
 testTriggerCounterComponent.C:42
 testTriggerCounterComponent.C:43
 testTriggerCounterComponent.C:44
 testTriggerCounterComponent.C:45
 testTriggerCounterComponent.C:46
 testTriggerCounterComponent.C:47
 testTriggerCounterComponent.C:48
 testTriggerCounterComponent.C:49
 testTriggerCounterComponent.C:50
 testTriggerCounterComponent.C:51
 testTriggerCounterComponent.C:52
 testTriggerCounterComponent.C:53
 testTriggerCounterComponent.C:54
 testTriggerCounterComponent.C:55
 testTriggerCounterComponent.C:56
 testTriggerCounterComponent.C:57
 testTriggerCounterComponent.C:58
 testTriggerCounterComponent.C:59
 testTriggerCounterComponent.C:60
 testTriggerCounterComponent.C:61
 testTriggerCounterComponent.C:62
 testTriggerCounterComponent.C:63
 testTriggerCounterComponent.C:64
 testTriggerCounterComponent.C:65
 testTriggerCounterComponent.C:66
 testTriggerCounterComponent.C:67
 testTriggerCounterComponent.C:68
 testTriggerCounterComponent.C:69
 testTriggerCounterComponent.C:70
 testTriggerCounterComponent.C:71
 testTriggerCounterComponent.C:72
 testTriggerCounterComponent.C:73
 testTriggerCounterComponent.C:74
 testTriggerCounterComponent.C:75
 testTriggerCounterComponent.C:76
 testTriggerCounterComponent.C:77
 testTriggerCounterComponent.C:78
 testTriggerCounterComponent.C:79
 testTriggerCounterComponent.C:80
 testTriggerCounterComponent.C:81
 testTriggerCounterComponent.C:82
 testTriggerCounterComponent.C:83
 testTriggerCounterComponent.C:84
 testTriggerCounterComponent.C:85
 testTriggerCounterComponent.C:86
 testTriggerCounterComponent.C:87
 testTriggerCounterComponent.C:88
 testTriggerCounterComponent.C:89
 testTriggerCounterComponent.C:90
 testTriggerCounterComponent.C:91
 testTriggerCounterComponent.C:92
 testTriggerCounterComponent.C:93
 testTriggerCounterComponent.C:94
 testTriggerCounterComponent.C:95
 testTriggerCounterComponent.C:96
 testTriggerCounterComponent.C:97
 testTriggerCounterComponent.C:98
 testTriggerCounterComponent.C:99
 testTriggerCounterComponent.C:100
 testTriggerCounterComponent.C:101
 testTriggerCounterComponent.C:102
 testTriggerCounterComponent.C:103
 testTriggerCounterComponent.C:104
 testTriggerCounterComponent.C:105
 testTriggerCounterComponent.C:106
 testTriggerCounterComponent.C:107
 testTriggerCounterComponent.C:108
 testTriggerCounterComponent.C:109
 testTriggerCounterComponent.C:110
 testTriggerCounterComponent.C:111
 testTriggerCounterComponent.C:112
 testTriggerCounterComponent.C:113
 testTriggerCounterComponent.C:114
 testTriggerCounterComponent.C:115
 testTriggerCounterComponent.C:116
 testTriggerCounterComponent.C:117
 testTriggerCounterComponent.C:118
 testTriggerCounterComponent.C:119
 testTriggerCounterComponent.C:120
 testTriggerCounterComponent.C:121
 testTriggerCounterComponent.C:122
 testTriggerCounterComponent.C:123
 testTriggerCounterComponent.C:124
 testTriggerCounterComponent.C:125
 testTriggerCounterComponent.C:126
 testTriggerCounterComponent.C:127
 testTriggerCounterComponent.C:128
 testTriggerCounterComponent.C:129
 testTriggerCounterComponent.C:130
 testTriggerCounterComponent.C:131
 testTriggerCounterComponent.C:132
 testTriggerCounterComponent.C:133
 testTriggerCounterComponent.C:134
 testTriggerCounterComponent.C:135
 testTriggerCounterComponent.C:136
 testTriggerCounterComponent.C:137
 testTriggerCounterComponent.C:138
 testTriggerCounterComponent.C:139
 testTriggerCounterComponent.C:140
 testTriggerCounterComponent.C:141
 testTriggerCounterComponent.C:142
 testTriggerCounterComponent.C:143
 testTriggerCounterComponent.C:144
 testTriggerCounterComponent.C:145
 testTriggerCounterComponent.C:146
 testTriggerCounterComponent.C:147
 testTriggerCounterComponent.C:148
 testTriggerCounterComponent.C:149
 testTriggerCounterComponent.C:150
 testTriggerCounterComponent.C:151
 testTriggerCounterComponent.C:152
 testTriggerCounterComponent.C:153
 testTriggerCounterComponent.C:154
 testTriggerCounterComponent.C:155
 testTriggerCounterComponent.C:156
 testTriggerCounterComponent.C:157
 testTriggerCounterComponent.C:158
 testTriggerCounterComponent.C:159
 testTriggerCounterComponent.C:160
 testTriggerCounterComponent.C:161
 testTriggerCounterComponent.C:162
 testTriggerCounterComponent.C:163
 testTriggerCounterComponent.C:164
 testTriggerCounterComponent.C:165
 testTriggerCounterComponent.C:166
 testTriggerCounterComponent.C:167
 testTriggerCounterComponent.C:168
 testTriggerCounterComponent.C:169
 testTriggerCounterComponent.C:170
 testTriggerCounterComponent.C:171
 testTriggerCounterComponent.C:172
 testTriggerCounterComponent.C:173
 testTriggerCounterComponent.C:174
 testTriggerCounterComponent.C:175
 testTriggerCounterComponent.C:176
 testTriggerCounterComponent.C:177
 testTriggerCounterComponent.C:178
 testTriggerCounterComponent.C:179
 testTriggerCounterComponent.C:180
 testTriggerCounterComponent.C:181
 testTriggerCounterComponent.C:182
 testTriggerCounterComponent.C:183
 testTriggerCounterComponent.C:184
 testTriggerCounterComponent.C:185
 testTriggerCounterComponent.C:186
 testTriggerCounterComponent.C:187
 testTriggerCounterComponent.C:188
 testTriggerCounterComponent.C:189
 testTriggerCounterComponent.C:190
 testTriggerCounterComponent.C:191
 testTriggerCounterComponent.C:192
 testTriggerCounterComponent.C:193
 testTriggerCounterComponent.C:194
 testTriggerCounterComponent.C:195
 testTriggerCounterComponent.C:196
 testTriggerCounterComponent.C:197
 testTriggerCounterComponent.C:198
 testTriggerCounterComponent.C:199
 testTriggerCounterComponent.C:200
 testTriggerCounterComponent.C:201
 testTriggerCounterComponent.C:202
 testTriggerCounterComponent.C:203
 testTriggerCounterComponent.C:204
 testTriggerCounterComponent.C:205
 testTriggerCounterComponent.C:206
 testTriggerCounterComponent.C:207
 testTriggerCounterComponent.C:208
 testTriggerCounterComponent.C:209
 testTriggerCounterComponent.C:210
 testTriggerCounterComponent.C:211
 testTriggerCounterComponent.C:212
 testTriggerCounterComponent.C:213
 testTriggerCounterComponent.C:214
 testTriggerCounterComponent.C:215
 testTriggerCounterComponent.C:216
 testTriggerCounterComponent.C:217
 testTriggerCounterComponent.C:218
 testTriggerCounterComponent.C:219
 testTriggerCounterComponent.C:220
 testTriggerCounterComponent.C:221
 testTriggerCounterComponent.C:222
 testTriggerCounterComponent.C:223
 testTriggerCounterComponent.C:224
 testTriggerCounterComponent.C:225
 testTriggerCounterComponent.C:226
 testTriggerCounterComponent.C:227
 testTriggerCounterComponent.C:228
 testTriggerCounterComponent.C:229
 testTriggerCounterComponent.C:230
 testTriggerCounterComponent.C:231
 testTriggerCounterComponent.C:232
 testTriggerCounterComponent.C:233
 testTriggerCounterComponent.C:234
 testTriggerCounterComponent.C:235
 testTriggerCounterComponent.C:236
 testTriggerCounterComponent.C:237
 testTriggerCounterComponent.C:238
 testTriggerCounterComponent.C:239
 testTriggerCounterComponent.C:240
 testTriggerCounterComponent.C:241
 testTriggerCounterComponent.C:242
 testTriggerCounterComponent.C:243
 testTriggerCounterComponent.C:244
 testTriggerCounterComponent.C:245
 testTriggerCounterComponent.C:246
 testTriggerCounterComponent.C:247
 testTriggerCounterComponent.C:248
 testTriggerCounterComponent.C:249
 testTriggerCounterComponent.C:250
 testTriggerCounterComponent.C:251
 testTriggerCounterComponent.C:252
 testTriggerCounterComponent.C:253
 testTriggerCounterComponent.C:254
 testTriggerCounterComponent.C:255
 testTriggerCounterComponent.C:256
 testTriggerCounterComponent.C:257
 testTriggerCounterComponent.C:258
 testTriggerCounterComponent.C:259
 testTriggerCounterComponent.C:260
 testTriggerCounterComponent.C:261
 testTriggerCounterComponent.C:262
 testTriggerCounterComponent.C:263
 testTriggerCounterComponent.C:264
 testTriggerCounterComponent.C:265
 testTriggerCounterComponent.C:266
 testTriggerCounterComponent.C:267
 testTriggerCounterComponent.C:268
 testTriggerCounterComponent.C:269
 testTriggerCounterComponent.C:270
 testTriggerCounterComponent.C:271
 testTriggerCounterComponent.C:272
 testTriggerCounterComponent.C:273
 testTriggerCounterComponent.C:274
 testTriggerCounterComponent.C:275
 testTriggerCounterComponent.C:276
 testTriggerCounterComponent.C:277
 testTriggerCounterComponent.C:278
 testTriggerCounterComponent.C:279
 testTriggerCounterComponent.C:280
 testTriggerCounterComponent.C:281
 testTriggerCounterComponent.C:282
 testTriggerCounterComponent.C:283
 testTriggerCounterComponent.C:284
 testTriggerCounterComponent.C:285
 testTriggerCounterComponent.C:286
 testTriggerCounterComponent.C:287
 testTriggerCounterComponent.C:288
 testTriggerCounterComponent.C:289
 testTriggerCounterComponent.C:290
 testTriggerCounterComponent.C:291
 testTriggerCounterComponent.C:292
 testTriggerCounterComponent.C:293
 testTriggerCounterComponent.C:294
 testTriggerCounterComponent.C:295
 testTriggerCounterComponent.C:296
 testTriggerCounterComponent.C:297
 testTriggerCounterComponent.C:298
 testTriggerCounterComponent.C:299
 testTriggerCounterComponent.C:300
 testTriggerCounterComponent.C:301
 testTriggerCounterComponent.C:302
 testTriggerCounterComponent.C:303
 testTriggerCounterComponent.C:304
 testTriggerCounterComponent.C:305
 testTriggerCounterComponent.C:306
 testTriggerCounterComponent.C:307
 testTriggerCounterComponent.C:308
 testTriggerCounterComponent.C:309
 testTriggerCounterComponent.C:310
 testTriggerCounterComponent.C:311
 testTriggerCounterComponent.C:312
 testTriggerCounterComponent.C:313
 testTriggerCounterComponent.C:314
 testTriggerCounterComponent.C:315
 testTriggerCounterComponent.C:316
 testTriggerCounterComponent.C:317
 testTriggerCounterComponent.C:318
 testTriggerCounterComponent.C:319
 testTriggerCounterComponent.C:320
 testTriggerCounterComponent.C:321
 testTriggerCounterComponent.C:322
 testTriggerCounterComponent.C:323
 testTriggerCounterComponent.C:324
 testTriggerCounterComponent.C:325
 testTriggerCounterComponent.C:326
 testTriggerCounterComponent.C:327
 testTriggerCounterComponent.C:328
 testTriggerCounterComponent.C:329
 testTriggerCounterComponent.C:330
 testTriggerCounterComponent.C:331
 testTriggerCounterComponent.C:332
 testTriggerCounterComponent.C:333
 testTriggerCounterComponent.C:334
 testTriggerCounterComponent.C:335
 testTriggerCounterComponent.C:336
 testTriggerCounterComponent.C:337
 testTriggerCounterComponent.C:338
 testTriggerCounterComponent.C:339
 testTriggerCounterComponent.C:340
 testTriggerCounterComponent.C:341
 testTriggerCounterComponent.C:342
 testTriggerCounterComponent.C:343
 testTriggerCounterComponent.C:344
 testTriggerCounterComponent.C:345
 testTriggerCounterComponent.C:346
 testTriggerCounterComponent.C:347
 testTriggerCounterComponent.C:348
 testTriggerCounterComponent.C:349
 testTriggerCounterComponent.C:350
 testTriggerCounterComponent.C:351
 testTriggerCounterComponent.C:352
 testTriggerCounterComponent.C:353
 testTriggerCounterComponent.C:354
 testTriggerCounterComponent.C:355
 testTriggerCounterComponent.C:356
 testTriggerCounterComponent.C:357
 testTriggerCounterComponent.C:358
 testTriggerCounterComponent.C:359
 testTriggerCounterComponent.C:360
 testTriggerCounterComponent.C:361
 testTriggerCounterComponent.C:362
 testTriggerCounterComponent.C:363
 testTriggerCounterComponent.C:364
 testTriggerCounterComponent.C:365
 testTriggerCounterComponent.C:366
 testTriggerCounterComponent.C:367
 testTriggerCounterComponent.C:368
 testTriggerCounterComponent.C:369
 testTriggerCounterComponent.C:370
 testTriggerCounterComponent.C:371
 testTriggerCounterComponent.C:372
 testTriggerCounterComponent.C:373
 testTriggerCounterComponent.C:374
 testTriggerCounterComponent.C:375
 testTriggerCounterComponent.C:376
 testTriggerCounterComponent.C:377
 testTriggerCounterComponent.C:378
 testTriggerCounterComponent.C:379
 testTriggerCounterComponent.C:380
 testTriggerCounterComponent.C:381
 testTriggerCounterComponent.C:382
 testTriggerCounterComponent.C:383
 testTriggerCounterComponent.C:384
 testTriggerCounterComponent.C:385
 testTriggerCounterComponent.C:386
 testTriggerCounterComponent.C:387
 testTriggerCounterComponent.C:388
 testTriggerCounterComponent.C:389
 testTriggerCounterComponent.C:390
 testTriggerCounterComponent.C:391
 testTriggerCounterComponent.C:392
 testTriggerCounterComponent.C:393
 testTriggerCounterComponent.C:394
 testTriggerCounterComponent.C:395
 testTriggerCounterComponent.C:396
 testTriggerCounterComponent.C:397
 testTriggerCounterComponent.C:398
 testTriggerCounterComponent.C:399
 testTriggerCounterComponent.C:400
 testTriggerCounterComponent.C:401
 testTriggerCounterComponent.C:402
 testTriggerCounterComponent.C:403
 testTriggerCounterComponent.C:404
 testTriggerCounterComponent.C:405
 testTriggerCounterComponent.C:406
 testTriggerCounterComponent.C:407
 testTriggerCounterComponent.C:408
 testTriggerCounterComponent.C:409
 testTriggerCounterComponent.C:410
 testTriggerCounterComponent.C:411
 testTriggerCounterComponent.C:412
 testTriggerCounterComponent.C:413
 testTriggerCounterComponent.C:414
 testTriggerCounterComponent.C:415
 testTriggerCounterComponent.C:416
 testTriggerCounterComponent.C:417
 testTriggerCounterComponent.C:418
 testTriggerCounterComponent.C:419
 testTriggerCounterComponent.C:420
 testTriggerCounterComponent.C:421
 testTriggerCounterComponent.C:422