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   4 Dec 2008
 *
 * This macro is used to test the behaviour of the AliHLTTriggerDomain class.
 * We specifically check that the AliHLTTriggerDomain operators behave correctly
 * as set operations.
 */

#if defined(__CINT__) && (! defined(__MAKECINT__))
#error This macro must be compiled. Try running as testTriggerDomain.C++
#endif

#include "Riostream.h"
#include "TSystem.h"
#include "TClassTable.h"
#include "TRandom3.h"
#include "TObjArray.h"
#include "AliHLTTriggerDomain.h"
#include "AliHLTDomainEntry.h"

const int N = 6;
const char* datatype[N] = {"*******", "AAAAAAAA", "BBBBBBBB", "CCCCCCCC", "DDDDDDDD", "EEEEEEEE"};
const char* origin[N] = {"***", "xxxx", "yyyy", "zzzz", "wwww", "uuuu"};
int spec[N] = {0, 0x11111111, 0x22222222, 0x33333333, 0x44444444, 0x55555555};

/**
 * Randomly builds a trigger domain from the various data types, origins and specifications.
 * \param [out] domain  The new constructed domain is filled into this output variable.
 * \param [in]  opcount The number of Add / Remove operations to apply to the domain.
 */
void BuildTriggerDomain(AliHLTTriggerDomain& domain, int opcount = 100)
{
	domain.Clear();
	for (int i = 0; i < opcount; i++)
	{
		// Make sure not to use the last data type, origin or specification in
		// the respective lists because we want to use them later to test the
		// matching against wild card values.
		int itype = gRandom->Integer(N-1);
		int iorigin = gRandom->Integer(N-1);
		int ispec = gRandom->Integer(N-1);
		if (gRandom->Integer(2) == 0)
		{
			if (spec[ispec] == 0)
				domain.Add(datatype[itype], origin[iorigin]);
			else
				domain.Add(datatype[itype], origin[iorigin], spec[ispec]);
		}
		else
		{
			if (spec[ispec] == 0)
				domain.Remove(datatype[itype], origin[iorigin]);
			else
				domain.Remove(datatype[itype], origin[iorigin], spec[ispec]);
		}
	}
}

/**
 * Returns the string representation of the data type.
 */
const char* TypeToString(const AliHLTComponentDataType& type)
{
	static char str[kAliHLTComponentDataTypefIDsize+1];
	for (int i = 0; i < kAliHLTComponentDataTypefIDsize; i++)
	{
		str[i] = type.fID[i];
	}
	return str;
}

/**
 * Returns the string representation of the data origin.
 */
const char* OriginToString(const AliHLTComponentDataType& type)
{
	static char str[kAliHLTComponentDataTypefOriginSize+1];
	for (int i = 0; i < kAliHLTComponentDataTypefOriginSize; i++)
	{
		str[i] = type.fOrigin[i];
	}
	return str;
}

/**
 * Checks to see if the domain is correctly constructed compared to the list of entries
 * that were applied to the domain.
 * \param [out] entryList The list of entries that were used to construct the domain.
 * \param [in]  domain    The trigger domain to check.
 */
bool DomainOK(const TObjArray& entryList, const AliHLTTriggerDomain& domain)
{
	for (int i = 1; i < N; i++)
	for (int j = 1; j < N; j++)
	for (int k = 1; k < N; k++)
	{
		AliHLTDomainEntry entry(datatype[i], origin[j], spec[k]);
		AliHLTComponentBlockData block;
		block.fDataType = entry;
		block.fSpecification = spec[k];
		
		bool result = false;
		bool result2 = false;
		for (int n = 0; n < entryList.GetEntriesFast(); n++)
		{
			const AliHLTDomainEntry* rule = static_cast<const AliHLTDomainEntry*>( entryList[n] );
			if (*rule == entry) result = rule->Inclusive();
			if (*rule == &block) result2 = rule->Inclusive();
		}
		
		bool containsResult = domain.Contains(entry);
		bool includeResult = domain.IncludeInReadout(&block);
		if (containsResult != result or includeResult != result2)
		{
			cout << "FAILED DomainOK test!" << endl;
			cout << "==============================================================================" << endl;
			cout << "Dump of how AliHLTTriggerDomain was built:" << endl;
			cout << "  AliHLTTriggerDomain domain;" << endl;
			for (int n = 0; n < entryList.GetEntriesFast(); n++)
			{
				const AliHLTDomainEntry* rule = static_cast<const AliHLTDomainEntry*>( entryList[n] );
				const char* opstr = (rule->Exclusive() ? "Remove" : "Add");
				if (rule->IsValidSpecification())
				{
					cout << "  domain." << opstr << "(\"" << TypeToString(rule->DataType())
						<< "\", \"" << OriginToString(rule->DataType())
						<< "\", 0x" << hex << rule->Specification() << dec
						<< ");" << endl;
				}
				else
				{
					cout << "  domain." << opstr << "(\"" << TypeToString(rule->DataType())
						<< "\", \"" << OriginToString(rule->DataType())
						<< "\");" << endl;
				}
			}
			cout << "==============================================================================" << endl;
			cout << "Dump of the trigger domain contents:" << endl;
			domain.Print();
			cout << "==============================================================================" << endl;
		}
		if (containsResult != result)
		{
			cout << "Failed for entry = ";
			entry.Print();
			cout << "Result of domain.Contains(entry) == " << containsResult << endl;
			cout << " Expected domain.Contains(entry) == " << result << endl;
			return false;
		}
		if (includeResult != result2)
		{
			cout << "Failed for block: type = " << TypeToString(block.fDataType)
				<< ", origin = " << OriginToString(block.fDataType)
				<< ", specification = " << hex << block.fSpecification << dec;
			cout << "Result of domain.IncludeInReadout(&block) == " << includeResult << endl;
			cout << " Expected domain.IncludeInReadout(&block) == " << result2 << endl;
			return false;
		}
	}
	
	return true;
}

/**
 * Randomly builds a trigger domain and tests the Add / Remove operations of the
 * AliHLTTriggerDomain class.
 * \param [in] opcount The number of Add / Remove operations to use to build the domain.
 */
bool AddRemoveOK(int opcount = 100)
{
	TObjArray entryList;
	entryList.SetOwner(kTRUE);
	AliHLTTriggerDomain domain;
	
	for (int i = 0; i < opcount; i++)
	{
		// Make sure not to use the last data type, origin or specification in
		// the respective lists because we want to use them later to test the
		// matching against wild card values.
		int itype = gRandom->Integer(N-1);
		int iorigin = gRandom->Integer(N-1);
		int ispec = gRandom->Integer(N-1);
		if (gRandom->Integer(2) == 0)
		{
			if (spec[ispec] == 0)
			{
				entryList.Add(new AliHLTDomainEntry(kFALSE, datatype[itype], origin[iorigin]));
				domain.Add(datatype[itype], origin[iorigin]);
			}
			else
			{
				entryList.Add(new AliHLTDomainEntry(kFALSE, datatype[itype], origin[iorigin], spec[ispec]));
				domain.Add(datatype[itype], origin[iorigin], spec[ispec]);
			}
		}
		else
		{
			if (spec[ispec] == 0)
			{
				entryList.Add(new AliHLTDomainEntry(kTRUE, datatype[itype], origin[iorigin]));
				domain.Remove(datatype[itype], origin[iorigin]);
			}
			else
			{
				entryList.Add(new AliHLTDomainEntry(kTRUE, datatype[itype], origin[iorigin], spec[ispec]));
				domain.Remove(datatype[itype], origin[iorigin], spec[ispec]);
			}
		}
	}
	
	if (not DomainOK(entryList, domain)) return false;
	
	return true;
}


#define DefOperation(name, expr, logicExpr) \
	class name \
	{ \
	public: \
		static const char* Name() \
		{ \
			return #name; \
		} \
		static const char* Expression() \
		{ \
			return #expr; \
		} \
		static AliHLTTriggerDomain Apply(const AliHLTTriggerDomain& a, const AliHLTTriggerDomain& b) \
		{ \
			return expr; \
		} \
		static bool ExpectedResult(bool a, const bool b) \
		{ \
			return logicExpr; \
		} \
	};


DefOperation( OpComplement, ~a,    !a       );
DefOperation( OpUnion,      a | b, a | b    );
DefOperation( OpIntersect,  a & b, a & b    );
DefOperation( OpXor,        a ^ b, a ^ b    );
DefOperation( OpDifference,      a - b, a & (!b) );

/**
 * Randomly builds two trigger domains and tests a overloaded operator of the
 * AliHLTTriggerDomain class.
 * \param [in] opcount The number of Add / Remove operations to use to build the domains.
 */
template <class Op>
bool OperatorOK(int opcount = 100)
{
	AliHLTTriggerDomain d1;
	BuildTriggerDomain(d1, opcount);
	AliHLTTriggerDomain d2;
	BuildTriggerDomain(d2, opcount);
	AliHLTTriggerDomain d3 = Op::Apply(d1, d2);
	
	for (int i = 1; i < N; i++)
	for (int j = 1; j < N; j++)
	for (int k = 1; k < N; k++)
	{
		AliHLTDomainEntry entry(datatype[i], origin[j], spec[k]);
		bool d1Result = d1.Contains(entry);
		bool d2Result = d2.Contains(entry);
		bool d3Result = d3.Contains(entry);
		bool d3ExpectedResult = Op::ExpectedResult(d1Result, d2Result);
		if (d3Result != d3ExpectedResult)
		{
			cout << "FAILED OperatorOK<" << Op::Name() << "> test!" << endl;
			cout << "==============================================================================" << endl;
			cout << "Dump of the trigger domain a contents:" << endl;
			d1.Print();
			cout << "==============================================================================" << endl;
			cout << "Dump of the trigger domain b contents:" << endl;
			d2.Print();
			cout << "==============================================================================" << endl;
			cout << "Dump of the trigger domain c = " << Op::Expression() << " contents:" << endl;
			d3.Print();
			cout << "==============================================================================" << endl;
			cout << "Failed for entry = ";
			entry.Print();
			cout << "Result of c.Contains(entry) == " << d3Result << endl;
			cout << " Expected c.Contains(entry) == " << d3ExpectedResult << endl;
			return false;
		}
	}
	
	return true;
}


#define DefEqualExprCheck(name, expr1, expr2) \
	class name \
	{ \
	public: \
		static const char* Name() \
		{ \
			return #name; \
		} \
		static const char* Expr1() \
		{ \
			return #expr1; \
		} \
		static const char* Expr2() \
		{ \
			return #expr2; \
		} \
		static AliHLTTriggerDomain Apply1(const AliHLTTriggerDomain& a, const AliHLTTriggerDomain& b) \
		{ \
			return expr1; \
		} \
		static AliHLTTriggerDomain Apply2(const AliHLTTriggerDomain& a, const AliHLTTriggerDomain& b) \
		{ \
			return expr2; \
		} \
	};


DefEqualExprCheck( XorExprCheck1,  a ^ b, (a | b) - (a & b)             );
DefEqualExprCheck( XorExprCheck2,  a ^ b, (a - (a & b)) | (b - (a & b)) );
DefEqualExprCheck( MinusExprCheck1, a - b, a & (a ^ b)                  );
DefEqualExprCheck( MinusExprCheck2, a - b, a & ~(a & b)                 );

/**
 * Randomly builds two trigger domains and tests two expressions applied to the
 * domains that should be equivalent.
 * \param [in] opcount The number of Add / Remove operations to use to build the domains.
 */
template <class Expr>
bool EquivalentExpressionsOK(int opcount = 100)
{
	AliHLTTriggerDomain d1;
	BuildTriggerDomain(d1, opcount);
	AliHLTTriggerDomain d2;
	BuildTriggerDomain(d2, opcount);
	AliHLTTriggerDomain d3 = Expr::Apply1(d1, d2);
	AliHLTTriggerDomain d4 = Expr::Apply2(d1, d2);
	
	for (int i = 1; i < N; i++)
	for (int j = 1; j < N; j++)
	for (int k = 1; k < N; k++)
	{
		AliHLTDomainEntry entry(datatype[i], origin[j], spec[k]);
		bool d3Result = d3.Contains(entry);
		bool d4Result = d4.Contains(entry);
		if (d3Result != d4Result)
		{
			cout << "FAILED EquivalentExpressionsOK<" << Expr::Name() << "> test!" << endl;
			cout << "==============================================================================" << endl;
			cout << "Dump of the trigger domain a contents:" << endl;
			d1.Print();
			cout << "==============================================================================" << endl;
			cout << "Dump of the trigger domain b contents:" << endl;
			d2.Print();
			cout << "==============================================================================" << endl;
			cout << "Dump of the trigger domain c = " << Expr::Expr1() << " contents:" << endl;
			d3.Print();
			cout << "==============================================================================" << endl;
			cout << "Dump of the trigger domain d = " << Expr::Expr2() << " contents:" << endl;
			d3.Print();
			cout << "==============================================================================" << endl;
			cout << "Failed for entry = ";
			entry.Print();
			cout << "Result of c.Contains(entry) == " << d3Result << endl;
			cout << "Result of d.Contains(entry) == " << d4Result << endl;
			cout << "But the results should be the same." << endl;
			return false;
		}
	}
	
	return true;
}


#define DefTest(name, routine, description) \
	class name \
	{ \
	public: \
		static bool Run(int opcount) \
		{ \
			return routine(opcount); \
		} \
		static const char* Description() \
		{ \
			return description; \
		} \
	}

// Declarations of the different tests.
DefTest(AddRemoveTest,           AddRemoveOK,              "AliHLTTriggerDomain::Add and AliHLTTriggerDomain::Remove");
DefTest(ComplementOperationTest, OperatorOK<OpComplement>, "operator ~a");
DefTest(UnionOperationTest,      OperatorOK<OpUnion>,      "operator a | b");
DefTest(IntersectOperationTest,  OperatorOK<OpIntersect>,  "operator a & b");
DefTest(XorOperationTest,        OperatorOK<OpXor>,        "operator a ^ b");
DefTest(DifferenceOperationTest, OperatorOK<OpDifference>, "operator a - b");
DefTest(XorExpressionTest1,   EquivalentExpressionsOK<XorExprCheck1>,   "expression a ^ b == (a | b) - (a & b)");
DefTest(XorExpressionTest2,   EquivalentExpressionsOK<XorExprCheck2>,   "expression a ^ b == (a - (a & b)) | (b - (a & b))");
DefTest(MinusExpressionTest1, EquivalentExpressionsOK<MinusExprCheck1>, "expression a - b == a & (a ^ b)");
DefTest(MinusExpressionTest2, EquivalentExpressionsOK<MinusExprCheck2>, "expression a - b == a & ~(a & b)");

/**
 * Routine to run an individual test.
 * \param print  Should information be printed showing the progress of testing.
 * \param numOfTests  The number of test iterations to run.
 */
template <class Test>
bool Run(bool print = true, int numOfTests = 100)
{
	if (print) cout << "Testing " << Test::Description() << " ..." << endl;
	for (int i = 0; i < numOfTests; i++)
	{
		if (not Test::Run(10)) return false;
		if (not Test::Run(100)) return false;
		if (not Test::Run(1000)) return false;
		if (print and ((i+1) % (numOfTests / 10) == 0))
		{
			cout << "  Completed " << ((i+1) * 100 / numOfTests) << "%" << endl;
		}
	}
	return true;
}

/**
 * This is the top level testing method which calls individual tests.
 * \param print  Should information be printed showing the progress of testing.
 * \param numOfTests  The number of test iterations to run.
 * \param seed  The random number seed to use.
 */
bool testTriggerDomain(bool print = true, int numOfTests = 100, int seed = 0)
{
	if (gClassTable->GetID("AliHLTDomainEntry") < 0)
	{
		gSystem->Load("libAliHLTTrigger.so");
	}
	
	gRandom->SetSeed(seed);
	
	if (not Run<AddRemoveTest>(print, numOfTests)) return false;
	if (not Run<ComplementOperationTest>(print, numOfTests)) return false;
	if (not Run<UnionOperationTest>(print, numOfTests)) return false;
	if (not Run<IntersectOperationTest>(print, numOfTests)) return false;
	if (not Run<XorOperationTest>(print, numOfTests)) return false;
	if (not Run<DifferenceOperationTest>(print, numOfTests)) return false;
	if (not Run<XorExpressionTest1>(print, numOfTests)) return false;
	if (not Run<XorExpressionTest2>(print, numOfTests)) return false;
	if (not Run<MinusExpressionTest1>(print, numOfTests)) return false;
	if (not Run<MinusExpressionTest2>(print, numOfTests)) return false;
	
	return true;
}

#ifndef __MAKECINT__

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

#endif // __MAKECINT__

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