mapdiff.c

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 }

Generated on Mon Nov 24 10:05:12 2008 for M3 by  doxygen 1.5.3-20071008