ROOT logo
/**
 * >> Testing Macro to compare FlatESDEvents from output files <<
 **
 * Primary Authors : Steffen Weber
 *
 * Usage:
 *  aliroot -b -l -q LoadLibs.C CompareFlatESDs.C++
 *
 **************************************************************************/

#if !defined(__CINT__) || defined(__MAKECINT__)
#include "AliESDEvent.h"
#include "AliESD.h"
#include "AliESDfriend.h"
#include <TFile.h>
#include <TTree.h>
#include <TSystem.h>
#include "./AliFlatESDEvent.h"
#include "./AliFlatESDTrack.h"
#include "./AliFlatTPCCluster.h"
#include "./AliFlatExternalTrackParam.h"
#include "Riostream.h"
#include "THnSparse.h"
#endif   
Double_t printDiff(string name, double val1, double val2);
Double_t printDiff(string name, TString val1, TString val2);
void CompareFlatESDs(const char* filename1="outFlatESD1.dat",const char* filename2="outFlatESD2.dat", Bool_t verbose=kFALSE) {
  // Create output histograms
  
  
  TString outputFilename = "$PWD/compare.root";
  
	cout<< "creating histograms"<<endl;
	THnSparse * hDiff;
	const	Int_t nDim = 12;
	
		Int_t bins[nDim] = {2};
		Double_t mins[nDim] = {0};
		Double_t maxs[nDim] = {1};
		hDiff = new THnSparseD("Differences","Differences",nDim,bins,mins,maxs);
	
  

  ifstream is1(filename1, std::ifstream::binary | std::ifstream::in);
  ifstream is2(filename2, std::ifstream::binary | std::ifstream::in);
  if (is1 && is2 ){
    is1.seekg (0, is1.end);
    int length1 = is1.tellg();
    is1.seekg (0, is1.beg);
    char * buffer1 = new char [length1];
    
    std::cout << "Reading " << length1 << " characters... ";
    
    is1.read (buffer1,length1);
    if (is1)
      std::cout << "all characters read successfully." << endl;
    else
      std::cout << "error: only " << is1.gcount() << " could be read";
    is1.close();
	
	
    is2.seekg (0, is2.end);
    int length2 = is2.tellg();
    is2.seekg (0, is2.beg);
    char * buffer2 = new char [length2];
    
    std::cout << "Reading " << length2 << " characters... ";
    
    is2.read (buffer2,length2);
    if (is2)
      std::cout << "all characters read successfully." << endl;
    else
      std::cout << "error: only " << is2.gcount() << " could be read";
    is2.close();
    
	
	
    // ...buffer contains the entire file...
    
    char *curr1 = buffer1;
    char *endBuff1 = buffer1+length1;
	
    char *curr2 = buffer2;
    char *endBuff2 = buffer2+length2;
	
    int iEvent = 0;
	static const int nExt = 4;
    
	while( curr1 < endBuff1  && curr2 < endBuff2 ){
//cout<<" curr1 endBuff1 curr2 endBuff2 "<< static_cast<void*> (curr1)<<" "<<static_cast<void*> (endBuff1)<<" "<<static_cast<void*> (curr2)<<" "<<static_cast<void*> (endBuff2)<<endl;

      AliFlatESDEvent *flatEsd1 = reinterpret_cast<AliFlatESDEvent *>(curr1);
      AliFlatESDEvent *flatEsd2 = reinterpret_cast<AliFlatESDEvent *>(curr2);
	  
	  flatEsd1->Reinitialize();
	  flatEsd2->Reinitialize();
	  
      cout<<endl<<"________________________________________________________________________"<<endl;
      cout<<endl<<"Reading event "<<iEvent<<":\t file1 | file 2\t|\t abs. diff\t|\t rel. diff"<<endl;
		
		Double_t diffs[nDim] ={
			printDiff("GetMagneticField",		flatEsd1->GetMagneticField(),		flatEsd2->GetMagneticField()),
			printDiff("GetPeriodNumber",		flatEsd1->GetPeriodNumber(),		flatEsd2->GetPeriodNumber()),
			printDiff("GetRunNumber",				flatEsd1->GetRunNumber(),				flatEsd2->GetRunNumber()),
			printDiff("GetOrbitNumber",			flatEsd1->GetOrbitNumber(),			flatEsd2->GetOrbitNumber()),
			printDiff("GetBunchCrossNumber",flatEsd1->GetBunchCrossNumber(),flatEsd2->GetBunchCrossNumber()),
			printDiff("GetTriggerMask",			flatEsd1->GetTriggerMask(),			flatEsd2->GetTriggerMask()),
			printDiff("GetTriggerMaskNext50",flatEsd1->GetTriggerMaskNext50(),			flatEsd2->GetTriggerMaskNext50()),
			printDiff("GetFiredTriggerClasses",			flatEsd1->GetFiredTriggerClasses(),			flatEsd2->GetFiredTriggerClasses()),
			printDiff("GetNumberOfTracks",	flatEsd1->GetNumberOfTracks(),	flatEsd2->GetNumberOfTracks()),
			printDiff("GetNumberOfV0s",			flatEsd1->GetNumberOfV0s(),			flatEsd2->GetNumberOfV0s()),
			printDiff("GetTimeStamp",			flatEsd1->GetTimeStamp(),			flatEsd2->GetTimeStamp()),
			printDiff("GetEventSpecie",			flatEsd1->GetEventSpecie(),			flatEsd2->GetEventSpecie())
	
		};

		hDiff->Fill(diffs);
	  
	  
	  /*
	  
	  if( (Bool_t) flatEsd1->GetFlatPrimaryVertexTracks() != (Bool_t) flatEsd2->GetFlatPrimaryVertexTracks()  ){
		cout<<"\t\tDIFFERENCE!: "<<endl;
		diff[2] =1;
	}


	  cout<<"vtx tracks:\t"<<(Bool_t) flatEsd1->GetFlatPrimaryVertexTracks()<< " | " <<	(Bool_t) flatEsd2->GetFlatPrimaryVertexTracks()<<endl;	  
	  //hVtxTr->Fill( (Bool_t) flatEsd1->GetFlatPrimaryVertexTracks(), (Bool_t) flatEsd2->GetFlatPrimaryVertexTracks());

	 
	  
	  if( (Bool_t) flatEsd1->GetFlatPrimaryVertexSPD() != (Bool_t) flatEsd2->GetFlatPrimaryVertexSPD()  ){
		cout<<"\t\tDIFFERENCE!: "<<endl;
		diff[3] =1;
	}
      cout<<"vtx SPD:\t"<<(Bool_t) flatEsd1->GetFlatPrimaryVertexSPD() << " | " << (Bool_t) flatEsd2->GetFlatPrimaryVertexSPD()<<endl;
	  //hVtxSPD->Fill( (Bool_t) flatEsd1->GetFlatPrimaryVertexSPD(), (Bool_t) flatEsd2->GetFlatPrimaryVertexSPD());

	  
	  
  if((Bool_t)flatEsd1->GetFlatPrimaryVertexTracks() && (Bool_t)flatEsd2->GetFlatPrimaryVertexTracks()  ){
 		cout<<endl<<"vtx tracks -> X,Y,Z:\t"
			<< flatEsd1->GetFlatPrimaryVertexTracks()->GetX()
			<<","<< flatEsd1->GetFlatPrimaryVertexTracks()->GetY()
			<<","<< flatEsd1->GetFlatPrimaryVertexTracks()->GetZ()
			<<" | " <<flatEsd2->GetFlatPrimaryVertexTracks()->GetX()
			<<","<< flatEsd2->GetFlatPrimaryVertexTracks()->GetY()
			<<","<< flatEsd2->GetFlatPrimaryVertexTracks()->GetZ()<<endl;	  
		}
	  */
	  
	  // compare tracks
if(verbose){
	  AliFlatESDTrack *track1 = const_cast<AliFlatESDTrack*> (flatEsd1->GetTracks());
	  AliFlatESDTrack *track2 = const_cast<AliFlatESDTrack*> (flatEsd2->GetTracks());
    for (Int_t idxTrack = 0; idxTrack < flatEsd1->GetNumberOfTracks() && track1 && track2; ++idxTrack) { 

		//track2->Reinitialize();
		const AliFlatExternalTrackParam* ext[2][nExt] ={
			{
				track1->GetFlatTrackParamRefitted(),
				track1->GetFlatTrackParamIp(),
				track1->GetFlatTrackParamTPCInner(),
				track1->GetFlatTrackParamOp(),
		//		track1->GetFlatTrackParamCp(),
		//		track1->GetFlatTrackParamITSOut()
			},
			{
				track2->GetFlatTrackParamRefitted(),
				track2->GetFlatTrackParamIp(),
				track2->GetFlatTrackParamTPCInner(),
				track2->GetFlatTrackParamOp(),
			//	track2->GetFlatTrackParamCp(),
			//	track2->GetFlatTrackParamITSOut()
			}
		};
	
     	//Printf("  TEST: FlatTrack1 %d > FlatExternalTrackParam1 > %p %p %p %p", idxTrack, exp11, exp21, exp31, exp41);
     	//Printf("  TEST: FlatTrack2 %d > FlatExternalTrackParam2 > %p %p %p %p", idxTrack, exp12, exp22, exp32, exp42);


	for(int iExt=0; iExt<nExt; ++iExt){
if(!ext[0][iExt] && !ext[1][iExt]) continue;	
		if(!ext[0][iExt] && ext[1][iExt]){
		//	cout<<"DIFFERENCE!: ";
	 		cout<<" ext"<<iExt<<" not set in "<<filename1<<endl;
		}	
		if(ext[0][iExt] && !ext[1][iExt]){
		//	cout<<"DIFFERENCE!: ";
	 		cout<<" ext"<<iExt<<" not set in "<<filename2<<endl;
		}


		if( (!ext[0][iExt] || !ext[1][iExt])|| ext[0][iExt]->GetAlpha() != ext[1][iExt]->GetAlpha() ) {
			cout<<"\t\tDIFFERENCE!: "<<endl;
	 		//cout<<" alpha"<<iExt<<" :"  << (ext[0][iExt] ? ext[0][iExt]->GetAlpha() : -99.)  << "\t\t" << (ext[1][iExt] ?  ext[1][iExt]->GetAlpha(): -99.)<<endl;
		}	cout<<" alpha"<<iExt<<" :\t"  << (ext[0][iExt] ? ext[0][iExt]->GetAlpha() : -99.)  << " | " << (ext[1][iExt] ?  ext[1][iExt]->GetAlpha(): -99.)<<endl;
			

		if( (!ext[0][iExt] || !ext[1][iExt])||ext[0][iExt]->GetX() != ext[1][iExt]->GetX() ) {
			cout<<"\t\tDIFFERENCE!: "<<endl;
	 		//cout<<" GetX"<<iExt<<" :"  << (ext[0][iExt] ? ext[0][iExt]->GetX(): -99.)  << " | " << (ext[1][iExt] ?  ext[1][iExt]->GetX(): -99.)<<endl;
		}	
cout<<" GetX"<<iExt<<" :\t"  << (ext[0][iExt] ? ext[0][iExt]->GetX(): -99.)  << " | " << (ext[1][iExt] ?  ext[1][iExt]->GetX(): -99.)<<endl;


		if( (!ext[0][iExt] || !ext[1][iExt])||ext[0][iExt]->GetSigned1Pt() !=  ext[0][iExt]->GetSigned1Pt() ) {
			cout<<"\t\tDIFFERENCE!: "<<endl;
	 		//cout<<" 1/pt"<<iExt<<" :"  <<  (ext[0][iExt] ? ext[0][iExt]->GetSigned1Pt(): -99.)  << " | " << (ext[1][iExt] ?  ext[1][iExt]->GetSigned1Pt(): -99.)<<endl;
		}	
	cout<<" 1/pt"<<iExt<<" :\t"  <<  (ext[0][iExt] ? ext[0][iExt]->GetSigned1Pt(): -99.)  << " | " << (ext[1][iExt] ?  ext[1][iExt]->GetSigned1Pt(): -99.)<<endl;
			

}
	
	  
	  /*
	if( track1->GetNumberOfTPCClusters() != track2->GetNumberOfTPCClusters() ){
		cout<<"DIFFERENCE!: ";
		cout<<" nTPCclusters: "<<track1->GetNumberOfTPCClusters()<< " | " <<track2->GetNumberOfTPCClusters()<< endl;
		diff[4]=1;
	}  
	if( track1->GetNumberOfITSClusters() != track2->GetNumberOfITSClusters() ){
		cout<<"DIFFERENCE!: ";
	 	cout<<" nITSclusters: "<<track1->GetNumberOfITSClusters()<< " | " <<track2->GetNumberOfITSClusters()<< endl;
		diff[4]=1;
	}
*/
	  
#if 0

// compare clusters
	if( verbose &&  track1->GetNumberOfTPCClusters() == track2->GetNumberOfTPCClusters()){
		for (Int_t idxCluster = 0; idxCluster < track1->GetNumberOfTPCClusters(); ++idxCluster){
			AliFlatTPCCluster * cl1 = track1->GetTPCCluster(idxCluster);
			AliFlatTPCCluster * cl2 = track2->GetTPCCluster(idxCluster);
/*
			if( cl1->GetX()&& cl2->GetX() && cl1->GetX() != cl2->GetX() ){
				cout<<"DIFFERENCE!: ";
			 	cout<<" cluster: "<<idxCluster<<" GetX :"<<cl1->GetX()<< " | " <<cl2->GetX()<< endl;
				diff=kTRUE;
			}
			 	cout<<" cluster: "<<idxCluster<<" GetX :"<<cl1->GetX()<< " | " <<cl2->GetX()<< endl;
			 	cout<<" cluster: "<<idxCluster<<" GetY :"<<cl1->GetY()<< " | " <<cl2->GetY()<< endl;

			if( cl1 && cl2 && cl1->GetY() != cl2->GetY() ){
				cout<<"DIFFERENCE!: ";
			 	cout<<" cluster: "<<idxCluster<<" GetY :"<<cl1->GetY()<< " | " <<cl2->GetY()<< endl;
				diff=kTRUE;
			}
			if( cl1->GetZ()&& cl2->GetZ() && cl1->GetZ() != cl2->GetZ() ){
				cout<<"DIFFERENCE!: ";
			 	cout<<" cluster: "<<idxCluster<<" GetZ :"<<cl1->GetZ()<< " | " <<cl2->GetZ()<< endl;
				diff=kTRUE;
			}
*/
			if( cl1->GetPadRow()&& cl2->GetPadRow() && cl1->GetPadRow() != cl2->GetPadRow() ){
				cout<<"DIFFERENCE!: ";
			 	cout<<" cluster: "<<idxCluster<<" GetPadRow :"<<cl1->GetPadRow()<< " | " <<cl2->GetPadRow()<< endl;
				diff[5]=1;
			}

		}
	  }
	  
#endif
      track1 = const_cast<AliFlatESDTrack*> (track1->GetNextTrack());
      track2 = const_cast<AliFlatESDTrack*> (track2->GetNextTrack());
	  
	  
	  }
}
	  
	  /*
	//   hStat->Fill(0);	  
	  Bool_t diffs=kFALSE;
	  for(int iDiff=0; iDiff<5;++iDiff){
		if(diff[iDiff]){
	//		hStat->Fill(iDiff+2);
			diffs = kTRUE;
		}
	}
	if(!diffs) hStat->Fill(1);	  
*/

      curr1=curr1+ flatEsd1->GetSize();
      curr2=curr2+ flatEsd2->GetSize();
      iEvent++;
    }

    delete[] buffer1;
    delete[] buffer2;
  }
  else {
    cout << "File could not be read" << endl;
  }


	TList histosList;
	histosList.Add(hDiff);
  histosList.SaveAs(outputFilename);

  return;
}

Double_t printDiff(string name, double val1, double val2){
	double relDiff = ( val1 != 0 || val2!=0 ) ? fabs(val1-val2)/(fabs(val1) + fabs(val2)): 0;
	cout<<name<<":\t"<<val1<<" | " << val2 <<"\t|\t"<<(val1-val2)<<"\t|\t"<<relDiff<<endl;
	return relDiff > 1e-6 ? 1:0;
}
Double_t printDiff(string name, TString val1, TString val2){
	cout<<name<<":"<<endl<<"\t"<<val1<<endl<<"\t"<< val2 <<endl;
	return val1.EqualTo(val2) ?0:1;
}
 CompareFlatESDs.C:1
 CompareFlatESDs.C:2
 CompareFlatESDs.C:3
 CompareFlatESDs.C:4
 CompareFlatESDs.C:5
 CompareFlatESDs.C:6
 CompareFlatESDs.C:7
 CompareFlatESDs.C:8
 CompareFlatESDs.C:9
 CompareFlatESDs.C:10
 CompareFlatESDs.C:11
 CompareFlatESDs.C:12
 CompareFlatESDs.C:13
 CompareFlatESDs.C:14
 CompareFlatESDs.C:15
 CompareFlatESDs.C:16
 CompareFlatESDs.C:17
 CompareFlatESDs.C:18
 CompareFlatESDs.C:19
 CompareFlatESDs.C:20
 CompareFlatESDs.C:21
 CompareFlatESDs.C:22
 CompareFlatESDs.C:23
 CompareFlatESDs.C:24
 CompareFlatESDs.C:25
 CompareFlatESDs.C:26
 CompareFlatESDs.C:27
 CompareFlatESDs.C:28
 CompareFlatESDs.C:29
 CompareFlatESDs.C:30
 CompareFlatESDs.C:31
 CompareFlatESDs.C:32
 CompareFlatESDs.C:33
 CompareFlatESDs.C:34
 CompareFlatESDs.C:35
 CompareFlatESDs.C:36
 CompareFlatESDs.C:37
 CompareFlatESDs.C:38
 CompareFlatESDs.C:39
 CompareFlatESDs.C:40
 CompareFlatESDs.C:41
 CompareFlatESDs.C:42
 CompareFlatESDs.C:43
 CompareFlatESDs.C:44
 CompareFlatESDs.C:45
 CompareFlatESDs.C:46
 CompareFlatESDs.C:47
 CompareFlatESDs.C:48
 CompareFlatESDs.C:49
 CompareFlatESDs.C:50
 CompareFlatESDs.C:51
 CompareFlatESDs.C:52
 CompareFlatESDs.C:53
 CompareFlatESDs.C:54
 CompareFlatESDs.C:55
 CompareFlatESDs.C:56
 CompareFlatESDs.C:57
 CompareFlatESDs.C:58
 CompareFlatESDs.C:59
 CompareFlatESDs.C:60
 CompareFlatESDs.C:61
 CompareFlatESDs.C:62
 CompareFlatESDs.C:63
 CompareFlatESDs.C:64
 CompareFlatESDs.C:65
 CompareFlatESDs.C:66
 CompareFlatESDs.C:67
 CompareFlatESDs.C:68
 CompareFlatESDs.C:69
 CompareFlatESDs.C:70
 CompareFlatESDs.C:71
 CompareFlatESDs.C:72
 CompareFlatESDs.C:73
 CompareFlatESDs.C:74
 CompareFlatESDs.C:75
 CompareFlatESDs.C:76
 CompareFlatESDs.C:77
 CompareFlatESDs.C:78
 CompareFlatESDs.C:79
 CompareFlatESDs.C:80
 CompareFlatESDs.C:81
 CompareFlatESDs.C:82
 CompareFlatESDs.C:83
 CompareFlatESDs.C:84
 CompareFlatESDs.C:85
 CompareFlatESDs.C:86
 CompareFlatESDs.C:87
 CompareFlatESDs.C:88
 CompareFlatESDs.C:89
 CompareFlatESDs.C:90
 CompareFlatESDs.C:91
 CompareFlatESDs.C:92
 CompareFlatESDs.C:93
 CompareFlatESDs.C:94
 CompareFlatESDs.C:95
 CompareFlatESDs.C:96
 CompareFlatESDs.C:97
 CompareFlatESDs.C:98
 CompareFlatESDs.C:99
 CompareFlatESDs.C:100
 CompareFlatESDs.C:101
 CompareFlatESDs.C:102
 CompareFlatESDs.C:103
 CompareFlatESDs.C:104
 CompareFlatESDs.C:105
 CompareFlatESDs.C:106
 CompareFlatESDs.C:107
 CompareFlatESDs.C:108
 CompareFlatESDs.C:109
 CompareFlatESDs.C:110
 CompareFlatESDs.C:111
 CompareFlatESDs.C:112
 CompareFlatESDs.C:113
 CompareFlatESDs.C:114
 CompareFlatESDs.C:115
 CompareFlatESDs.C:116
 CompareFlatESDs.C:117
 CompareFlatESDs.C:118
 CompareFlatESDs.C:119
 CompareFlatESDs.C:120
 CompareFlatESDs.C:121
 CompareFlatESDs.C:122
 CompareFlatESDs.C:123
 CompareFlatESDs.C:124
 CompareFlatESDs.C:125
 CompareFlatESDs.C:126
 CompareFlatESDs.C:127
 CompareFlatESDs.C:128
 CompareFlatESDs.C:129
 CompareFlatESDs.C:130
 CompareFlatESDs.C:131
 CompareFlatESDs.C:132
 CompareFlatESDs.C:133
 CompareFlatESDs.C:134
 CompareFlatESDs.C:135
 CompareFlatESDs.C:136
 CompareFlatESDs.C:137
 CompareFlatESDs.C:138
 CompareFlatESDs.C:139
 CompareFlatESDs.C:140
 CompareFlatESDs.C:141
 CompareFlatESDs.C:142
 CompareFlatESDs.C:143
 CompareFlatESDs.C:144
 CompareFlatESDs.C:145
 CompareFlatESDs.C:146
 CompareFlatESDs.C:147
 CompareFlatESDs.C:148
 CompareFlatESDs.C:149
 CompareFlatESDs.C:150
 CompareFlatESDs.C:151
 CompareFlatESDs.C:152
 CompareFlatESDs.C:153
 CompareFlatESDs.C:154
 CompareFlatESDs.C:155
 CompareFlatESDs.C:156
 CompareFlatESDs.C:157
 CompareFlatESDs.C:158
 CompareFlatESDs.C:159
 CompareFlatESDs.C:160
 CompareFlatESDs.C:161
 CompareFlatESDs.C:162
 CompareFlatESDs.C:163
 CompareFlatESDs.C:164
 CompareFlatESDs.C:165
 CompareFlatESDs.C:166
 CompareFlatESDs.C:167
 CompareFlatESDs.C:168
 CompareFlatESDs.C:169
 CompareFlatESDs.C:170
 CompareFlatESDs.C:171
 CompareFlatESDs.C:172
 CompareFlatESDs.C:173
 CompareFlatESDs.C:174
 CompareFlatESDs.C:175
 CompareFlatESDs.C:176
 CompareFlatESDs.C:177
 CompareFlatESDs.C:178
 CompareFlatESDs.C:179
 CompareFlatESDs.C:180
 CompareFlatESDs.C:181
 CompareFlatESDs.C:182
 CompareFlatESDs.C:183
 CompareFlatESDs.C:184
 CompareFlatESDs.C:185
 CompareFlatESDs.C:186
 CompareFlatESDs.C:187
 CompareFlatESDs.C:188
 CompareFlatESDs.C:189
 CompareFlatESDs.C:190
 CompareFlatESDs.C:191
 CompareFlatESDs.C:192
 CompareFlatESDs.C:193
 CompareFlatESDs.C:194
 CompareFlatESDs.C:195
 CompareFlatESDs.C:196
 CompareFlatESDs.C:197
 CompareFlatESDs.C:198
 CompareFlatESDs.C:199
 CompareFlatESDs.C:200
 CompareFlatESDs.C:201
 CompareFlatESDs.C:202
 CompareFlatESDs.C:203
 CompareFlatESDs.C:204
 CompareFlatESDs.C:205
 CompareFlatESDs.C:206
 CompareFlatESDs.C:207
 CompareFlatESDs.C:208
 CompareFlatESDs.C:209
 CompareFlatESDs.C:210
 CompareFlatESDs.C:211
 CompareFlatESDs.C:212
 CompareFlatESDs.C:213
 CompareFlatESDs.C:214
 CompareFlatESDs.C:215
 CompareFlatESDs.C:216
 CompareFlatESDs.C:217
 CompareFlatESDs.C:218
 CompareFlatESDs.C:219
 CompareFlatESDs.C:220
 CompareFlatESDs.C:221
 CompareFlatESDs.C:222
 CompareFlatESDs.C:223
 CompareFlatESDs.C:224
 CompareFlatESDs.C:225
 CompareFlatESDs.C:226
 CompareFlatESDs.C:227
 CompareFlatESDs.C:228
 CompareFlatESDs.C:229
 CompareFlatESDs.C:230
 CompareFlatESDs.C:231
 CompareFlatESDs.C:232
 CompareFlatESDs.C:233
 CompareFlatESDs.C:234
 CompareFlatESDs.C:235
 CompareFlatESDs.C:236
 CompareFlatESDs.C:237
 CompareFlatESDs.C:238
 CompareFlatESDs.C:239
 CompareFlatESDs.C:240
 CompareFlatESDs.C:241
 CompareFlatESDs.C:242
 CompareFlatESDs.C:243
 CompareFlatESDs.C:244
 CompareFlatESDs.C:245
 CompareFlatESDs.C:246
 CompareFlatESDs.C:247
 CompareFlatESDs.C:248
 CompareFlatESDs.C:249
 CompareFlatESDs.C:250
 CompareFlatESDs.C:251
 CompareFlatESDs.C:252
 CompareFlatESDs.C:253
 CompareFlatESDs.C:254
 CompareFlatESDs.C:255
 CompareFlatESDs.C:256
 CompareFlatESDs.C:257
 CompareFlatESDs.C:258
 CompareFlatESDs.C:259
 CompareFlatESDs.C:260
 CompareFlatESDs.C:261
 CompareFlatESDs.C:262
 CompareFlatESDs.C:263
 CompareFlatESDs.C:264
 CompareFlatESDs.C:265
 CompareFlatESDs.C:266
 CompareFlatESDs.C:267
 CompareFlatESDs.C:268
 CompareFlatESDs.C:269
 CompareFlatESDs.C:270
 CompareFlatESDs.C:271
 CompareFlatESDs.C:272
 CompareFlatESDs.C:273
 CompareFlatESDs.C:274
 CompareFlatESDs.C:275
 CompareFlatESDs.C:276
 CompareFlatESDs.C:277
 CompareFlatESDs.C:278
 CompareFlatESDs.C:279
 CompareFlatESDs.C:280
 CompareFlatESDs.C:281
 CompareFlatESDs.C:282
 CompareFlatESDs.C:283
 CompareFlatESDs.C:284
 CompareFlatESDs.C:285
 CompareFlatESDs.C:286
 CompareFlatESDs.C:287
 CompareFlatESDs.C:288
 CompareFlatESDs.C:289
 CompareFlatESDs.C:290
 CompareFlatESDs.C:291
 CompareFlatESDs.C:292
 CompareFlatESDs.C:293
 CompareFlatESDs.C:294
 CompareFlatESDs.C:295
 CompareFlatESDs.C:296
 CompareFlatESDs.C:297
 CompareFlatESDs.C:298
 CompareFlatESDs.C:299
 CompareFlatESDs.C:300
 CompareFlatESDs.C:301
 CompareFlatESDs.C:302
 CompareFlatESDs.C:303
 CompareFlatESDs.C:304
 CompareFlatESDs.C:305
 CompareFlatESDs.C:306
 CompareFlatESDs.C:307
 CompareFlatESDs.C:308
 CompareFlatESDs.C:309
 CompareFlatESDs.C:310
 CompareFlatESDs.C:311
 CompareFlatESDs.C:312
 CompareFlatESDs.C:313
 CompareFlatESDs.C:314
 CompareFlatESDs.C:315
 CompareFlatESDs.C:316