ROOT logo
/**************************************************************************
 * This file is property of and copyright by the ALICE HLT Project        * 
 * All rights reserved.                                                   *
 *                                                                        *
 * Primary Authors:                                                       *
 *   Artur Szostak <artursz@iafrica.com>                                  *
 *                                                                        *
 * Permission to use, copy, modify and distribute this software and its   *
 * documentation strictly for non-commercial purposes is hereby granted   *
 * without fee, provided that the above copyright notice appears in all   *
 * copies and that both the copyright notice and this permission notice   *
 * appear in the supporting documentation. The authors make no claims     *
 * about the suitability of this software for any purpose. It is          * 
 * provided "as is" without express or implied warranty.                  *
 **************************************************************************/

// Simple macro to generate N-tuple for performance analysis.
// This macro must be compiled and run like so from within the aliroot command
// prompt:
//   root [0] gSystem->Load("libAliHLTMUON.so");
//   root [0] .x MakeHitsTable.C+

#include "TVector3.h"
#include "TSystem.h"
#include "TROOT.h"
#include "TParticle.h"
#include "TArrayF.h"
#include "TStopwatch.h"
#include "TNtuple.h"
#include "TFile.h"
#include "TError.h"

#include "AliCDBManager.h"
#include "AliLoader.h"
#include "AliRunLoader.h"
#include "AliStack.h"
#include "AliRun.h"
#include "AliMUON.h"
#include "AliMUONMCDataInterface.h"
#include "AliMUONHit.h"
#include "AliHLTMUONEvent.h"
#include "AliHLTMUONRootifierComponent.h"
#include "AliHLTMUONMansoTrack.h"

#include <cstdlib>
#include <vector>
#include <iostream>
using std::cout;
using std::cerr;
using std::endl;


void MakeTriggerTable(
		Int_t firstEvent = 0,
		Int_t lastEvent = -1,
		const char* L0outputfile = "output.root",
		Float_t maxSigma = 4., // 4 standard deviations
		Float_t sigmaXtrg = 0.5,  // 5 mm resolution
		Float_t sigmaYtrg = 0.5,  // 5 mm resolution
		Float_t sigmaZtrg = 0.02  // 2 microns resolution
	)
{
	// Setup the CDB default storage and run number if nothing was set.
	AliCDBManager* cdbManager = AliCDBManager::Instance();
	if (cdbManager == NULL)
	{
		cerr << "ERROR: Global CDB manager object does not exist." << endl;
		return;
	}
	if (cdbManager->GetDefaultStorage() == NULL)
	{
		cdbManager->SetDefaultStorage("local://$ALICE_ROOT/OCDB");
	}
	if (cdbManager->GetRun() == -1)
	{
		cdbManager->SetRun(0);
	}
	
	gSystem->Load("libAliHLTMUON.so");
	// Must pree load libAliHLTMUON.so before loading this macro and running it in compiled mode.

	TString fieldnames = "event:isprimary:pdgcode:sign:px:py:pz";
	for (Int_t i = 11; i <= 14; i++)
	{
		fieldnames += ":x";
		fieldnames += i;
		fieldnames += ":y";
		fieldnames += i;
		fieldnames += ":z";
		fieldnames += i;
	}
	fieldnames += ":L0sign:L0px:L0py:L0pz:L0fit";
	for (Int_t i = 11; i <= 14; i++)
	{
		fieldnames += ":L0x";
		fieldnames += i;
		fieldnames += ":L0y";
		fieldnames += i;
		fieldnames += ":L0z";
		fieldnames += i;
	}
	TNtuple* table = new TNtuple("triggertable", "Table of triggers.", fieldnames);
	
	TFile L0file(L0outputfile, "READ");

	AliMUONMCDataInterface data;
	AliStack* stack;
	
	Int_t nEvents = data.NumberOfEvents();
	if (lastEvent < 0) lastEvent = nEvents-1;
	for (Int_t event = firstEvent; event <= lastEvent; event++)
	{
		cout << "Processing event: " << event;
		
		char buf[1024];
		char* str = &buf[0];
		sprintf(str, "AliHLTMUONEvent;%d", event+1);
		AliHLTMUONEvent* L0event = dynamic_cast<AliHLTMUONEvent*>( L0file.Get(str) );
		if (L0event == NULL)
		{
			cout << endl;
			cerr << "ERROR: Could not find " << str << " in " << L0outputfile << endl;
			continue;
		}
		
		data.GetEvent(event);
		
		stack = data.Stack(event);
		if (stack == NULL)
		{
			cout << endl;
			cerr << "ERROR: Stack is NULL" << endl;
			continue;
		}
		
		Int_t trackcount = data.NumberOfParticles();
		cout << "\ttrackcount = " << trackcount << endl;
		
		TArrayF isPrimary(trackcount);
		TArrayF pdgcode(trackcount);
		TArrayF sign(trackcount);
		TArrayF px(trackcount);
		TArrayF py(trackcount);
		TArrayF pz(trackcount);
		TArrayF L0sign(trackcount);
		TArrayF L0px(trackcount);
		TArrayF L0py(trackcount);
		TArrayF L0pz(trackcount);
		TArrayF L0fit(trackcount);
		
		//cout << "Fill particle data" << endl;
		for (Int_t i = 0; i < trackcount; i++)
		{
			TParticle* p = data.Particle(i);
			isPrimary[i] = stack->IsPhysicalPrimary(i) ? 1 : 0;
			pdgcode[i] = p->GetPdgCode();
			if (p->GetPDG() != NULL)
			{
				Double_t charge = p->GetPDG()->Charge();
				if (charge > 0)
					sign[i] = 1;
				else if (charge < 0)
					sign[i] = -1;
				else
					sign[i] = 0;
			}
			else
			{
				sign[i] = 0;
				cerr << "ERROR: Could not get the PDG information." << endl;
			}
			px[i] = p->Px();
			py[i] = p->Py();
			pz[i] = p->Pz();
			L0sign[i] = 0;
			L0px[i] = 0;
			L0py[i] = 0;
			L0pz[i] = 0;
			L0fit[i] = -1;
		}
		
		TArrayF hitX[4];
		TArrayF hitY[4];
		TArrayF hitZ[4];
		TArrayF L0hitX[4];
		TArrayF L0hitY[4];
		TArrayF L0hitZ[4];
		for (Int_t i = 0; i < 4; i++)
		{
			hitX[i].Set(trackcount);
			hitY[i].Set(trackcount);
			hitZ[i].Set(trackcount);
			L0hitX[i].Set(trackcount);
			L0hitY[i].Set(trackcount);
			L0hitZ[i].Set(trackcount);
			for (Int_t j = 0; j < trackcount; j++)
			{
				hitX[i][j] = 0;
				hitY[i][j] = 0;
				hitZ[i][j] = 0;
				L0hitX[i][j] = 0;
				L0hitY[i][j] = 0;
				L0hitZ[i][j] = 0;
			}
		}

		//cout << "Fill hits" << endl;
		for (Int_t i = 0; i < data.NumberOfTracks(); i++)
		for (Int_t j = 0; j < data.NumberOfHits(i); j++)
		{
			AliMUONHit* hit = data.Hit(i, j);
			Int_t chamber = hit->Chamber() - 1;
			if (chamber < 0 || chamber >= 14)
			{
				cerr << "ERROR: Chamber number " << chamber << " is out of range." << endl;
				continue;
			}
			
			//cout << "hit->Track() = " << hit->Track() << endl;
			if (hit->Track() < 0 || hit->Track() >= trackcount)
			{
				cerr << "ERROR: Track number " << hit->Track() << " is out of range. [0.."
					<< trackcount << ")" << endl;
				continue;
			}
			Int_t particleindex = hit->Track();

			if (chamber >= 10)
			{
				hitX[chamber-10][particleindex] = hit->X();
				hitY[chamber-10][particleindex] = hit->Y();
				hitZ[chamber-10][particleindex] = hit->Z();
			}
		} // hits loop
		
		// Ok now go through the L0 information for this event and correlate
		// the L0 trigger records to the kine data.
		// This is done as follows: take a trigger record. Then for each kine track
		// calculate the distance between each hit of the kine track and corresponding
		// L0 trigger track fragment hit.
		// Then sum up the distances and divide by the number of hits matched.
		// This gives us a fit quality /Chi2 type parameter. The kine track that
		// has the smallest sum of differences is then chosen as the kine track
		// correlating to the current L0 trigger record being processed.
		for (Int_t i = 0; i < L0event->Array().GetEntriesFast(); i++)
		{
			if (L0event->Array().At(i)->IsA() != AliHLTMUONTriggerRecord::Class())
				continue;
			AliHLTMUONTriggerRecord* trigrec = static_cast<AliHLTMUONTriggerRecord*>(L0event->Array().At(i));
			
			// Find the best fitting kine track.
			Double_t bestFitQuality = 1e30;
			Int_t bestFitTrack = -1;
			for (Int_t kinetrack = 0; kinetrack < trackcount; kinetrack++)
			{
				Double_t sumOfDiffs = 0;
				Double_t hitsMatched = 0;
				for (Int_t j = 11; j <= 14; j++)
				{
					const TVector3& hit = trigrec->Hit(j);
					if (hit == TVector3(0,0,0)) continue;
					TVector3 hV(hitX[j-11][kinetrack], hitY[j-11][kinetrack], hitZ[j-11][kinetrack]);
					if (hV == TVector3(0,0,0)) continue;
					TVector3 diff = hV - hit;
					Double_t diffX = diff.X() / sigmaXtrg;
					Double_t diffY = diff.Y() / sigmaYtrg;
					Double_t diffZ = diff.Z() / sigmaZtrg;
					if (diffX > maxSigma) continue;
					if (diffY > maxSigma) continue;
					if (diffZ > maxSigma) continue;
					sumOfDiffs += diffX*diffX + diffY*diffY + diffZ*diffZ;
					hitsMatched++;
				}
				
				// Now check the fit quality.
				if (hitsMatched <= 0) continue;
				Double_t fitQuality = sumOfDiffs / hitsMatched;
				if (fitQuality < bestFitQuality)
				{
					bestFitQuality = fitQuality;
					bestFitTrack = kinetrack;
				}
			}
			
			if (bestFitTrack < 0)
			{
				// No track was matched so we need to add a fake track record.
				Float_t args[7+4*3+5+4*3];
				args[0] = event;
				args[1] = -1;
				args[2] = 0;
				args[3] = 0;
				args[4] = 0;
				args[5] = 0;
				args[6] = 0;
				for (Int_t j = 0; j < 4; j++)
				{			
					args[7+j*3+0] = 0;
					args[7+j*3+1] = 0;
					args[7+j*3+2] = 0;
				}
				args[7+4*3+0] = trigrec->Sign();
				args[7+4*3+1] = trigrec->Px();
				args[7+4*3+2] = trigrec->Py();
				args[7+4*3+3] = trigrec->Pz();
				args[7+4*3+4] = -1;
				for (Int_t j = 0; j < 4; j++)
				{
					const TVector3& hit = trigrec->Hit(j+11);
					args[7+4*3+5+j*3+0] = hit.X();
					args[7+4*3+5+j*3+1] = hit.Y();
					args[7+4*3+5+j*3+2] = hit.Z();
				}
				table->Fill(args);
			}
			else
			{
				// Fill the details about the L0 track to the best fitting track info.
				L0sign[bestFitTrack] = trigrec->Sign();
				L0px[bestFitTrack] = trigrec->Px();
				L0py[bestFitTrack] = trigrec->Py();
				L0pz[bestFitTrack] = trigrec->Pz();
				L0fit[bestFitTrack] = bestFitQuality;
				for (Int_t j = 11; j <= 14; j++)
				{
					const TVector3& hit = trigrec->Hit(j);
					if (hit == TVector3(0,0,0)) continue;
					L0hitX[j-11][bestFitTrack] = hit.X();
					L0hitY[j-11][bestFitTrack] = hit.Y();
					L0hitZ[j-11][bestFitTrack] = hit.Z();
				}
			}
		}
		
		//cout << "Fill table" << endl;
		for (Int_t i = 0; i < trackcount; i++)
		{
			Float_t args[7+4*3+5+4*3];
			args[0] = event;
			args[1] = isPrimary[i];
			args[2] = pdgcode[i];
			args[3] = sign[i];
			args[4] = px[i];
			args[5] = py[i];
			args[6] = pz[i];
			for (Int_t j = 0; j < 4; j++)
			{			
				args[7+j*3+0] = hitX[j][i];
				args[7+j*3+1] = hitY[j][i];
				args[7+j*3+2] = hitZ[j][i];
			}
			args[7+4*3+0] = L0sign[i];
			args[7+4*3+1] = L0px[i];
			args[7+4*3+2] = L0py[i];
			args[7+4*3+3] = L0pz[i];
			args[7+4*3+4] = L0fit[i];
			for (Int_t j = 0; j < 4; j++)
			{			
				args[7+4*3+5+j*3+0] = L0hitX[j][i];
				args[7+4*3+5+j*3+1] = L0hitY[j][i];
				args[7+4*3+5+j*3+2] = L0hitZ[j][i];
			}
			table->Fill(args);
		}
		
	} // event loop

	TFile file("triggertable.root", "RECREATE");
	file.cd();
	table->Write(table->GetName(), TObject::kOverwrite);

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