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   testMuonSpectroTrigger.C
 * @author Artur Szostak <artursz@iafrica.com>
 * @date   11 Nov 2008
 *
 * This macro is used to test the AliHLTMuonSpectroTriggerComponent class.
 * A basic test is run with the AliHLTSystem framework to check that the dHLT
 * decision is interpreted correctly and the summary statistics generated properly.
 */

#if defined(__CINT__) && (! defined(__MAKECINT__))
#error This macro must be compiled. Try running as testMuonSpectroTrigger.C++, but remember to load the libAliHLTTrigger.so and libAliHLTMUON.so libraries 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 "AliHLTMuonSpectroScalars.h"
#include "AliHLTMUONDataBlockWriter.h"
#include "AliHLTMUONUtils.h"
#include "AliHLTSystem.h"
#include "AliHLTConfiguration.h"
#include "Riostream.h"
#include <stdio.h>
#endif

/**
 * Writes the indicated buffer to the given file name.
 * \returns true if the file was written correctly and false otherwise.
 */
bool WriteFile(const char* filename, void* buffer, unsigned int size)
{
	FILE* file = fopen(filename, "w");
	if (file == NULL)
	{
		cerr << "ERROR: Could not create file: " << filename << endl;
		return false;
	}
	fwrite(buffer, size, 1, file);
	fclose(file);
	return true;
}

/**
 * Generates some sample input data and writes it into 6 files named
 * testSinglesDecisionInputFile1.dat ... testSinglesDecisionInputFile3.dat and
 * testPairsDecisionInputFile1.dat ... testPairsDecisionInputFile3.dat
 */
void GenerateInputData()
{
	if (gClassTable->GetID("AliHLTMuonSpectroTriggerComponent") < 0)
	{
		gSystem->Load("libAliHLTUtil.so");
		gSystem->Load("libAliHLTTRD.so");
		gSystem->Load("libAliHLTTrigger.so");
	}
	
	// Allocate two 1 MByte buffers, this will be more than enough space.
	unsigned int bufferSize = 1024*1024;
	void* buffer1 = new char[bufferSize];
	void* buffer2 = new char[bufferSize];
	
	AliHLTMUONSinglesDecisionBlockWriter singlesBlock(buffer1, bufferSize);
	singlesBlock.InitCommonHeader();
	AliHLTMUONSinglesDecisionBlockStruct& singlesHeader = singlesBlock.BlockHeader();
	singlesHeader.fNlowPt = 2;
	singlesHeader.fNhighPt = 1;
	singlesBlock.SetNumberOfEntries(3);
	AliHLTMUONTrackDecisionStruct& track1 = singlesBlock[0];
	track1.fTrackId = 1;
	track1.fTriggerBits = AliHLTMUONUtils::PackTrackDecisionBits(false, false);
	track1.fPt = 0.9;
	AliHLTMUONTrackDecisionStruct& track2 = singlesBlock[1];
	track2.fTrackId = 2;
	track2.fTriggerBits = AliHLTMUONUtils::PackTrackDecisionBits(false, true);
	track2.fPt = 1.8;
	AliHLTMUONTrackDecisionStruct& track3 = singlesBlock[2];
	track3.fTrackId = 3;
	track3.fTriggerBits = AliHLTMUONUtils::PackTrackDecisionBits(true, true);
	track3.fPt = 3.1;
 
	AliHLTMUONPairsDecisionBlockWriter pairsBlock(buffer2, bufferSize);
	pairsBlock.InitCommonHeader();
	AliHLTMUONPairsDecisionBlockStruct& pairsHeader = pairsBlock.BlockHeader();
	pairsHeader.fNunlikeAnyPt = 1;
	pairsHeader.fNunlikeLowPt = 1;
	pairsHeader.fNunlikeHighPt = 1;
	pairsHeader.fNlikeAnyPt = 2;
	pairsHeader.fNlikeLowPt = 2;
	pairsHeader.fNlikeHighPt = 1;
	pairsHeader.fNmassAny = 1;
	pairsHeader.fNmassLow = 1;
	pairsHeader.fNmassHigh = 0;
	pairsBlock.SetNumberOfEntries(3);
	AliHLTMUONPairDecisionStruct& pair1 = pairsBlock[0];
	pair1.fTrackAId = 1;
	pair1.fTrackBId = 2;
	pair1.fTriggerBits = AliHLTMUONUtils::PackPairDecisionBits(false, false, false, 0, 1);
	pair1.fInvMass = 0.1;
	AliHLTMUONPairDecisionStruct& pair2 = pairsBlock[1];
	pair2.fTrackAId = 1;
	pair2.fTrackBId = 3;
	pair2.fTriggerBits = AliHLTMUONUtils::PackPairDecisionBits(false, true, true, 1, 1);
	pair2.fInvMass = 3.1;
	AliHLTMUONPairDecisionStruct& pair3 = pairsBlock[2];
	pair3.fTrackAId = 2;
	pair3.fTrackBId = 3;
	pair3.fTriggerBits = AliHLTMUONUtils::PackPairDecisionBits(true, true, false, 1, 2);
	pair3.fInvMass = 10.1;
	
	if (! WriteFile("testSinglesDecisionInputFile1.dat", buffer1, singlesBlock.BytesUsed())) return;
	if (! WriteFile("testPairsDecisionInputFile1.dat", buffer2, pairsBlock.BytesUsed())) return;
	
	singlesHeader.fNlowPt = 2;
	singlesHeader.fNhighPt = 1;
	singlesBlock.SetNumberOfEntries(2);
	track1.fTrackId = 4;
	track1.fTriggerBits = AliHLTMUONUtils::PackTrackDecisionBits(false, true);
	track1.fPt = 1.2;
	track2.fTrackId = 5;
	track2.fTriggerBits = AliHLTMUONUtils::PackTrackDecisionBits(true, true);
	track2.fPt = 2.3;
 
	pairsHeader.fNunlikeAnyPt = 1;
	pairsHeader.fNunlikeLowPt = 1;
	pairsHeader.fNunlikeHighPt = 1;
	pairsHeader.fNlikeAnyPt = 0;
	pairsHeader.fNlikeLowPt = 0;
	pairsHeader.fNlikeHighPt = 0;
	pairsHeader.fNmassAny = 1;
	pairsHeader.fNmassLow = 1;
	pairsHeader.fNmassHigh = 1;
	pairsBlock.SetNumberOfEntries(1);
	pair1.fTrackAId = 4;
	pair1.fTrackBId = 5;
	pair1.fTriggerBits = AliHLTMUONUtils::PackPairDecisionBits(true, true, true, 1, 2);
	pair1.fInvMass = 9.7;
	
	if (! WriteFile("testSinglesDecisionInputFile2.dat", buffer1, singlesBlock.BytesUsed())) return;
	if (! WriteFile("testPairsDecisionInputFile2.dat", buffer2, pairsBlock.BytesUsed())) return;
	
	singlesHeader.fNlowPt = 0;
	singlesHeader.fNhighPt = 0;
	singlesBlock.SetNumberOfEntries(1);
	track1.fTrackId = 6;
	track1.fTriggerBits = AliHLTMUONUtils::PackTrackDecisionBits(false, false);
	track1.fPt = 0.6;
 
	pairsHeader.fNunlikeAnyPt = 0;
	pairsHeader.fNunlikeLowPt = 0;
	pairsHeader.fNunlikeHighPt = 0;
	pairsHeader.fNlikeAnyPt = 0;
	pairsHeader.fNlikeLowPt = 0;
	pairsHeader.fNlikeHighPt = 0;
	pairsHeader.fNmassAny = 0;
	pairsHeader.fNmassLow = 0;
	pairsHeader.fNmassHigh = 0;
	pairsBlock.SetNumberOfEntries(0);
	
	if (! WriteFile("testSinglesDecisionInputFile3.dat", buffer1, singlesBlock.BytesUsed())) return;
	if (! WriteFile("testPairsDecisionInputFile3.dat", buffer2, pairsBlock.BytesUsed())) return;
}

/**
 * Runs a small test chain for the muon spectrometer trigger component.
 * \param debug  If true then full logging is turned on.
 * \param numOfEvents  The number of events to run the chain for.
 */
void RunTrigger(bool debug = false, int numOfEvents = 3)
{
	AliHLTSystem sys;
	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 DECIDSIN MUON ";
	for (int i = 1; i <= 3; i++)
	{
		if (i > 1) cmdline += " -nextevent";
		cmdline += Form(" -datafile testSinglesDecisionInputFile%d.dat", i);
	}
	AliHLTConfiguration pub1("pub1", "FilePublisher", NULL, cmdline.Data());
	
	cmdline = "-datatype DECIDPAR MUON ";
	for (int i = 1; i <= 3; i++)
	{
		if (i > 1) cmdline += " -nextevent";
		cmdline += Form(" -datafile testPairsDecisionInputFile%d.dat", i);
	}
	AliHLTConfiguration pub2("pub2", "FilePublisher", NULL, cmdline.Data());
	
	AliHLTConfiguration proc("proc", "MuonSpectroTrigger", "pub1 pub2", "-makestats -triggerdimuons");
	AliHLTConfiguration sink("sink", "ROOTFileWriter", "proc", "-datafile testMuonTriggerOutputFile.root -concatenate-events");
	
	sys.BuildTaskList("sink");
	sys.Run(numOfEvents);
}


/**
 * Checks that a particular decision and summary object are as expected and prints
 * error messages if there are any problems with the results.
 * \param eventNum  The number of the event being checked.
 * \param decision  The trigger decision being checked.
 * \param scalars  The scalars object being checked.
 * \param expectedResult  The expected global trigger result.
 * \param expectedDomain  The expected resulting trigger domain.
 * \param expectedDescription  The expected resulting trigger description.
 * \param expectedScalars  The expected resulting scalars.
 * \returns true if the decision and scalars are as expected.
 */
bool Check(
		int eventNum,
		AliHLTTriggerDecision* decision,
		AliHLTMuonSpectroScalars* scalars,
		bool expectedResult,
		AliHLTTriggerDomain expectedDomain,
		TString expectedDescription,
		AliHLTMuonSpectroScalars& expectedScalars
	)
{
	if (decision == NULL)
	{
		cerr << "ERROR: No decision found where expected for event "
		     << eventNum << "." << endl;
		return false;
	}
	if (decision->Result() != expectedResult)
	{
		cerr << "ERROR: 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: 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: The description does not match the expected value for event "
		     << eventNum << ". Got '" << decision->Description() << "' but expected '"
		     << expectedDescription << "'." << endl;
		return false;
	}
	if (*scalars != expectedScalars)
	{
		cerr << "ERROR: The scalars summary object does not match the expected one for event "
		     << eventNum << ". Expected the following scalar values:" << endl;
		expectedScalars.Print();
		return false;
	}
	return true;
}


/// Routine for checking the results of the chain run in RunTrigger.
bool CheckResults()
{
	AliHLTTriggerDecision* decision = NULL;
	AliHLTMuonSpectroScalars* scalars = NULL;
	bool result = false;
	
	AliHLTTriggerDomain domainMUON("*******:MUON");
	//domainMUON.Add(AliHLTReadoutList("MUONTRK"));
	
	AliHLTMuonSpectroScalars emptyScalars;
	
	AliHLTMuonSpectroScalars scalarsEvent1;
	scalarsEvent1.Add("NTracks", "", 3);
	scalarsEvent1.Add("NLowPt", "", 2);
	scalarsEvent1.Add("NHighPt", "", 1);
	scalarsEvent1.Add("MinPt", "", 0.9f);
	scalarsEvent1.Add("MaxPt", "", 3.1f);
	scalarsEvent1.Add("NLikeAny", "", 2);
	scalarsEvent1.Add("NLikeLow", "", 2);
	scalarsEvent1.Add("NLikeHigh", "", 1);
	scalarsEvent1.Add("NUnlikeAny", "", 1);
	scalarsEvent1.Add("NUnlikeLow", "", 1);
	scalarsEvent1.Add("NUnlikeHigh", "", 1);
	scalarsEvent1.Add("NLowMass", "", 1);
	scalarsEvent1.Add("NHighMass", "", 0);
	scalarsEvent1.Add("MinMass", "", 0.1f);
	scalarsEvent1.Add("MaxMass", "", 10.1f);
	
	AliHLTMuonSpectroScalars scalarsEvent2;
	scalarsEvent2.Add("NTracks", "", 2);
	scalarsEvent2.Add("NLowPt", "", 2);
	scalarsEvent2.Add("NHighPt", "", 1);
	scalarsEvent2.Add("MinPt", "", 1.2f);
	scalarsEvent2.Add("MaxPt", "", 2.3f);
	scalarsEvent2.Add("NLikeAny", "", 0);
	scalarsEvent2.Add("NLikeLow", "", 0);
	scalarsEvent2.Add("NLikeHigh", "", 0);
	scalarsEvent2.Add("NUnlikeAny", "", 1);
	scalarsEvent2.Add("NUnlikeLow", "", 1);
	scalarsEvent2.Add("NUnlikeHigh", "", 1);
	scalarsEvent2.Add("NLowMass", "", 1);
	scalarsEvent2.Add("NHighMass", "", 1);
	scalarsEvent2.Add("MinMass", "", 9.7f);
	scalarsEvent2.Add("MaxMass", "", 9.7f);
	
	AliHLTMuonSpectroScalars scalarsEvent3;
	scalarsEvent3.Add("NTracks", "", 1);
	scalarsEvent3.Add("NLowPt", "", 0);
	scalarsEvent3.Add("NHighPt", "", 0);
	scalarsEvent3.Add("MinPt", "", 0.6f);
	scalarsEvent3.Add("MaxPt", "", 0.6f);
	scalarsEvent3.Add("NLikeAny", "", 0);
	scalarsEvent3.Add("NLikeLow", "", 0);
	scalarsEvent3.Add("NLikeHigh", "", 0);
	scalarsEvent3.Add("NUnlikeAny", "", 0);
	scalarsEvent3.Add("NUnlikeLow", "", 0);
	scalarsEvent3.Add("NUnlikeHigh", "", 0);
	scalarsEvent3.Add("NLowMass", "", 0);
	scalarsEvent3.Add("NHighMass", "", 0);
	scalarsEvent3.Add("MinMass", "", -1);
	scalarsEvent3.Add("MaxMass", "", -1);

	TFile* file = new TFile("testMuonTriggerOutputFile.root", "READ");
	
	// First event is the Start-Of-Run
	decision = dynamic_cast<AliHLTTriggerDecision*>(file->Get("MuonSpectroTrigger;1"));
	scalars = dynamic_cast<AliHLTMuonSpectroScalars*>(file->Get("AliHLTMuonSpectroScalars;1"));
	result = Check(0, decision, scalars, false, AliHLTTriggerDomain(), "Not triggered", emptyScalars);
	if (! result) goto cleanup;
	// Now we have the 3 data events:
	decision = dynamic_cast<AliHLTTriggerDecision*>(file->Get("MuonSpectroTrigger;2"));
	scalars = dynamic_cast<AliHLTMuonSpectroScalars*>(file->Get("AliHLTMuonSpectroScalars;2"));
	result = Check(1, decision, scalars, true, domainMUON, "Dimuon in muon spectrometer", scalarsEvent1);
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTTriggerDecision*>(file->Get("MuonSpectroTrigger;3"));
	scalars = dynamic_cast<AliHLTMuonSpectroScalars*>(file->Get("AliHLTMuonSpectroScalars;3"));
	result = Check(2, decision, scalars, true, domainMUON, "Dimuon in muon spectrometer", scalarsEvent2);
	if (! result) goto cleanup;
	decision = dynamic_cast<AliHLTTriggerDecision*>(file->Get("MuonSpectroTrigger;4"));
	scalars = dynamic_cast<AliHLTMuonSpectroScalars*>(file->Get("AliHLTMuonSpectroScalars;4"));
	result = Check(3, decision, scalars, false, AliHLTTriggerDomain(), "Not triggered", scalarsEvent3);
	if (! result) goto cleanup;
	// and finally the End-Of-Run event.
	decision = dynamic_cast<AliHLTTriggerDecision*>(file->Get("MuonSpectroTrigger;5"));
	scalars = dynamic_cast<AliHLTMuonSpectroScalars*>(file->Get("AliHLTMuonSpectroScalars;5"));
	result = Check(4, decision, scalars, false, AliHLTTriggerDomain(), "Not triggered", emptyScalars);
	if (! result) goto cleanup;
	
	delete file;
	return true;
	
cleanup:
	if (decision != NULL)
	{
		cout << "========== Dumping received decision result ========== " << endl;
		decision->Print();
		cout << "=========== Dumping received scalars result ========== " << endl;
		scalars->Print();
	}
	delete file;
	return false;
}


/**
 * Runs the unit test for the AliHLTMuonSpectroTriggerComponent class.
 * \param debug  If specified then the HLT chain is run with full logging enabled.
 * \returns true if the class passed the test and false otherwise.
 */
bool testMuonSpectroTrigger(bool debug = false)
{
	GenerateInputData();
	RunTrigger(debug);
	if (! CheckResults()) return false;
	
	// Cleanup all temporary files generated.
	gSystem->Exec("rm -f testMuonTriggerOutputFile.root test*DecisionInputFile*.dat");
	return true;
}


#ifndef __MAKECINT__

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

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