00001 #include <stdlib.h>
00002 #include <stdio.h>
00003 #include <math.h>
00004
00005 #include "M3.h"
00006 #include "M3_system.h"
00007
00008 int main( int argc, char **argv)
00009 {
00010 FILE *f1, *f2, *f3;
00011 M3_MapEl *buffer1;
00012 M3_MapEl *buffer2;
00013 M3_Interval interval, bufferInterval;
00014 int64_t numReads = 32, n, loopCount;
00015 int32_t header1[2];
00016 int32_t header2[2];
00017 int64_t bufferLength, i, j;
00018 double norm = 0;
00019 double mean = 0;
00020 static int64_t diskBufferSize = -1;
00021 char *tempPtr;
00022
00023 if( diskBufferSize == -1 )
00024 {
00025 tempPtr = getenv("M3_DISK_BUFFER_SIZE");
00026 if( tempPtr )
00027 diskBufferSize = strtoll( tempPtr, NULL, 10);
00028 else
00029 diskBufferSize = M3_DISK_BUFFER_SIZE;
00030 }
00031
00032 if( argc < 4 )
00033 {
00034 fprintf(stderr, "Usage: %s map1 map2 diffMap [relDiffMap]\n\n", argv[0] );
00035 return 1;
00036 }
00037
00038 f1 = fopen( argv[1], "r");
00039 M3_ErrorCheck( -1, argv[1], (f1?1:0), M3_EFLAG_FOPEN_READ );
00040 f2 = fopen( argv[2], "r");
00041 M3_ErrorCheck( -1, argv[1], (f2?1:0), M3_EFLAG_FOPEN_READ );
00042
00043 fread( header1, sizeof(int), 2, f1);
00044 fread( header2, sizeof(int), 2, f2);
00045
00046 if( header1[0] != header2[0] ||
00047 header1[1] != header2[1] )
00048 {
00049 fprintf(stderr, "ERORR: File headers do not match.\n");
00050 return(1);
00051 }
00052
00053 buffer1 = malloc(diskBufferSize);
00054 buffer2 = malloc(diskBufferSize);
00055 M3_ErrorCheck(-1, "main()", (buffer1 && buffer2), M3_EFLAG_MALLOC_FSTRING );
00056
00057
00058 f3 = fopen( argv[3], "w");
00059 fwrite(header1, sizeof(int), 2, f3);
00060 M3_ErrorCheck(-1, argv[3], (f3?1:0), M3_EFLAG_FOPEN_READ );
00061
00062 if( argc > 4 )
00063 loopCount = 2;
00064 else
00065 loopCount = 1;
00066
00067 while( loopCount )
00068 {
00069 if( loopCount == 2 )
00070 f3 = fopen( argv[4], "w");
00071 else
00072 f3 = fopen( argv[3], "w");
00073 M3_ErrorCheck(-1, argv[3], (f3?1:0), M3_EFLAG_FOPEN_READ );
00074
00075 fwrite(header1, sizeof(int), 2, f3);
00076
00077 interval.firstSample = 0;
00078 interval.lastSample = header1[1]-1;
00079
00080 M3_bufferIntervalStart( interval, diskBufferSize, sizeof(M3_MapEl), &bufferLength, &numReads );
00081 for( i = 0; i < numReads; i++ )
00082 {
00083 M3_bufferIntervalStep( interval, bufferLength, i, &bufferInterval );
00084 n = bufferInterval.lastSample - bufferInterval.firstSample;
00085
00086 fread(buffer1, sizeof(M3_MapEl), n, f1);
00087 fread(buffer2, sizeof(M3_MapEl), n, f2);
00088
00089 for( j = 0; j < n; j++ )
00090 {
00091 if( buffer1[j].pixel != buffer2[j].pixel )
00092 {
00093 fprintf( stderr, "ERROR: Observed pixels do not match.\n");
00094 return(1);
00095 }
00096 if( loopCount == 2 )
00097 buffer1[j].value = 2.0*(buffer1[j].value - buffer2[j].value)/(buffer1[j].value + buffer2[j].value);
00098 else
00099 buffer1[j].value -= buffer2[j].value;
00100
00101 norm += buffer1[j].value*buffer1[j].value;
00102 mean += buffer1[j].value;
00103 }
00104
00105 fwrite(buffer1, sizeof(M3_MapEl), n, f3);
00106 }
00107 norm = sqrt((norm - mean*mean/header1[1])/(header1[1]-1));
00108 mean = mean/header1[1];
00109
00110 if( loopCount == 2 )
00111 fprintf(stdout, "Relative difference:\n");
00112 else
00113 fprintf(stdout, "Absolute difference:\n");
00114 fprintf( stdout, " rms = %e, mean = %e\n", norm, mean);
00115
00116 fclose(f3);
00117 fseek(f1, SEEK_SET, 2*sizeof(int));
00118 fseek(f2, SEEK_SET, 2*sizeof(int));
00119 loopCount--;
00120 }
00121
00122 fclose(f2);
00123 fclose(f1);
00124
00125 free(buffer1);
00126 free(buffer2);
00127
00128 }