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 "TMath.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 MakeTrackTable(
		Int_t firstEvent = 0,
		Int_t lastEvent = -1,
		const char* dHLToutputfile = "output.root",
		Float_t maxSigma = 4., // 4 standard deviations
		Float_t sigmaX = 0.1,  // 1 mm resolution
		Float_t sigmaY = 0.01, // 100 micron resolution
		Float_t sigmaZ = 0.02,  // 200 microns resolution
		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:hastrack:cantrigger:pdgcode:sign:px:py:pz";
	for (Int_t i = 0; i <= 14; i++)
	{
		fieldnames += ":x";
		fieldnames += i;
		fieldnames += ":y";
		fieldnames += i;
		fieldnames += ":z";
		fieldnames += i;
	}
	fieldnames += ":dHLTsign:dHLTpx:dHLTpy:dHLTpz:dHLTfit";
	for (Int_t i = 1; i <= 14; i++)
	{
		fieldnames += ":dHLTx";
		fieldnames += i;
		fieldnames += ":dHLTy";
		fieldnames += i;
		fieldnames += ":dHLTz";
		fieldnames += i;
	}
	TNtuple* table = new TNtuple("tracktable", "Table of tracks.", fieldnames);
	
	TFile dHLTfile(dHLToutputfile, "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* dHLTevent = dynamic_cast<AliHLTMUONEvent*>( dHLTfile.Get(str) );
		if (dHLTevent == NULL)
		{
			cout << endl;
			cerr << "ERROR: Could not find " << str << " in " << dHLToutputfile << 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 hasTrack(trackcount);
		TArrayI hitsInTrigger(trackcount);
		TArrayF pdgcode(trackcount);
		TArrayF sign(trackcount);
		TArrayF px(trackcount);
		TArrayF py(trackcount);
		TArrayF pz(trackcount);
		TArrayF vx(trackcount);
		TArrayF vy(trackcount);
		TArrayF vz(trackcount);
		TArrayF dHLTsign(trackcount);
		TArrayF dHLTpx(trackcount);
		TArrayF dHLTpy(trackcount);
		TArrayF dHLTpz(trackcount);
		TArrayF dHLTfit(trackcount);
		
		//cout << "Fill particle data" << endl;
		for (Int_t i = 0; i < trackcount; i++)
		{
			TParticle* p = data.Particle(i);
			//isPrimary[i] = (i < stack->GetNprimary()) ? 1 : 0;
			isPrimary[i] = stack->IsPhysicalPrimary(i) ? 1 : 0;
			hasTrack[i] = 0;
			hitsInTrigger[i] = 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();
			vx[i] = p->Vx();
			vy[i] = p->Vy();
			vz[i] = p->Vz();
			dHLTsign[i] = 0;
			dHLTpx[i] = 0;
			dHLTpy[i] = 0;
			dHLTpz[i] = 0;
			dHLTfit[i] = -1;
		}
		
		TArrayF hitX[14];
		TArrayF hitY[14];
		TArrayF hitZ[14];
		TArrayF dHLThitX[14];
		TArrayF dHLThitY[14];
		TArrayF dHLThitZ[14];
		for (Int_t i = 0; i < 14; i++)
		{
			hitX[i].Set(trackcount);
			hitY[i].Set(trackcount);
			hitZ[i].Set(trackcount);
			dHLThitX[i].Set(trackcount);
			dHLThitY[i].Set(trackcount);
			dHLThitZ[i].Set(trackcount);
			for (Int_t j = 0; j < trackcount; j++)
			{
				hitX[i][j] = 0;
				hitY[i][j] = 0;
				hitZ[i][j] = 0;
				dHLThitX[i][j] = 0;
				dHLThitY[i][j] = 0;
				dHLThitZ[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();

			hitX[chamber][particleindex] = hit->X();
			hitY[chamber][particleindex] = hit->Y();
			hitZ[chamber][particleindex] = hit->Z();
					
			if (chamber == 0)
			{
				hasTrack[particleindex] = 1;
			}
			if (chamber >= 10)
			{
				hitsInTrigger[particleindex]++;
			}
		} // hits loop
		
		// Ok now go through the dHLT information for this event and correlate
		// the dHLT tracks to the kine data.
		// This is done as follows: take a dHLT track. Then for each kine track calculate
		// the distance between each hit of the kine track and corresponding dHLT track.
		// 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 dHLT track being processed.
		for (Int_t i = 0; i < dHLTevent->Array().GetEntriesFast(); i++)
		{
			if (dHLTevent->Array().At(i)->IsA() != AliHLTMUONMansoTrack::Class())
				continue;
			AliHLTMUONMansoTrack* mtrack = static_cast<AliHLTMUONMansoTrack*>(dHLTevent->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 = 7; j <= 10; j++)
				{
					const AliHLTMUONRecHit* hit = mtrack->Hit(j);
					if (hit == NULL) continue;
					if (hitX[j-1][kinetrack] == 0 && hitY[j-1][kinetrack] == 0 && hitZ[j-1][kinetrack] == 0)
						continue;
					
					TVector3 hV(hitX[j-1][kinetrack], hitY[j-1][kinetrack], hitZ[j-1][kinetrack]);
					TVector3 diff = hV - hit->Coordinate();
					Double_t diffX = diff.X() / sigmaX;
					Double_t diffY = diff.Y() / sigmaY;
					Double_t diffZ = diff.Z() / sigmaZ;
					if (diffX > maxSigma) continue;
					if (diffY > maxSigma) continue;
					if (diffZ > maxSigma) continue;
					sumOfDiffs += diffX*diffX + diffY*diffY + diffZ*diffZ;
					hitsMatched++;
				}
				if (mtrack->TriggerRecord() != NULL)
				{
					for (Int_t j = 11; j <= 14; j++)
					{
						const TVector3& hit = mtrack->TriggerRecord()->Hit(j);
						if (hit == TVector3(0,0,0)) continue;
						if (hitX[j-1][kinetrack] == 0 && hitY[j-1][kinetrack] == 0 && hitZ[j-1][kinetrack] == 0)
							continue;
						
						TVector3 hV(hitX[j-1][kinetrack], hitY[j-1][kinetrack], hitZ[j-1][kinetrack]);
						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 = TMath::Sqrt(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[12+14*3+5+14*3];
				args[0] = event;
				args[1] = -1;
				args[2] = 0;
				args[3] = 0;
				args[4] = 0;
				args[5] = 0;
				args[6] = 0;
				args[7] = 0;
				args[8] = 0;
				args[9] = 0;
				args[10] = 0;
				args[11] = 0;
				for (Int_t j = 0; j < 14; j++)
				{			
					args[12+j*3+0] = 0;
					args[12+j*3+1] = 0;
					args[12+j*3+2] = 0;
				}
				args[12+14*3+0] = mtrack->Sign();
				args[12+14*3+1] = mtrack->Px();
				args[12+14*3+2] = mtrack->Py();
				args[12+14*3+3] = mtrack->Pz();
				args[12+14*3+4] = -1;
				for (Int_t j = 0; j < 14; j++)
				{			
					args[12+14*3+5+j*3+0] = 0;
					args[12+14*3+5+j*3+1] = 0;
					args[12+14*3+5+j*3+2] = 0;
				}
				for (Int_t j = 6; j < 10; j++)
				{
					const AliHLTMUONRecHit* hit = mtrack->Hit(j+1);
					if (hit == NULL) continue;
					args[12+14*3+5+j*3+0] = hit->X();
					args[12+14*3+5+j*3+1] = hit->Y();
					args[12+14*3+5+j*3+2] = hit->Z();
				}
				if (mtrack->TriggerRecord() != NULL)
				{
					for (Int_t j = 10; j < 14; j++)
					{
						const TVector3& hit = mtrack->TriggerRecord()->Hit(j+1);
						args[12+14*3+5+j*3+0] = hit.X();
						args[12+14*3+5+j*3+1] = hit.Y();
						args[12+14*3+5+j*3+2] = hit.Z();
					}
				}
				table->Fill(args);
			}
			else
			{
				// Fill the details about the dHLT track to the best fitting track info.
				dHLTsign[bestFitTrack] = mtrack->Sign();
				dHLTpx[bestFitTrack] = mtrack->Px();
				dHLTpy[bestFitTrack] = mtrack->Py();
				dHLTpz[bestFitTrack] = mtrack->Pz();
				dHLTfit[bestFitTrack] = bestFitQuality;
				for (Int_t j = 7; j <= 10; j++)
				{
					const AliHLTMUONRecHit* hit = mtrack->Hit(j);
					if (hit == NULL) continue;
					dHLThitX[j-1][bestFitTrack] = hit->X();
					dHLThitY[j-1][bestFitTrack] = hit->Y();
					dHLThitZ[j-1][bestFitTrack] = hit->Z();
				}
				if (mtrack->TriggerRecord() != NULL)
				{
					for (Int_t j = 11; j <= 14; j++)
					{
						const TVector3& hit = mtrack->TriggerRecord()->Hit(j);
						if (hit == TVector3(0,0,0)) continue;
						dHLThitX[j-1][bestFitTrack] = hit.X();
						dHLThitY[j-1][bestFitTrack] = hit.Y();
						dHLThitZ[j-1][bestFitTrack] = hit.Z();
					}
				}
			}
		}
		
		//cout << "Fill table" << endl;
		for (Int_t i = 0; i < trackcount; i++)
		{
			Float_t args[12+14*3+5+14*3];
			args[0] = event;
			args[1] = isPrimary[i];
			args[2] = hasTrack[i];
			args[3] = (hitsInTrigger[i] > 2) ? 1 : 0;
			args[4] = pdgcode[i];
			args[5] = sign[i];
			args[6] = px[i];
			args[7] = py[i];
			args[8] = pz[i];
			args[9] = vx[i];
			args[10] = vy[i];
			args[11] = vz[i];
			for (Int_t j = 0; j < 14; j++)
			{			
				args[12+j*3+0] = hitX[j][i];
				args[12+j*3+1] = hitY[j][i];
				args[12+j*3+2] = hitZ[j][i];
			}
			args[12+14*3+0] = dHLTsign[i];
			args[12+14*3+1] = dHLTpx[i];
			args[12+14*3+2] = dHLTpy[i];
			args[12+14*3+3] = dHLTpz[i];
			args[12+14*3+4] = dHLTfit[i];
			for (Int_t j = 0; j < 14; j++)
			{			
				args[12+14*3+5+j*3+0] = dHLThitX[j][i];
				args[12+14*3+5+j*3+1] = dHLThitY[j][i];
				args[12+14*3+5+j*3+2] = dHLThitZ[j][i];
			}
			table->Fill(args);
		}
		
	} // event loop

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

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