#include <stdio.h>#include <string.h>#include <ctype.h>#include <math.h>#include <time.h>#include <stdlib.h>#include "mar300_header.h"
Go to the source code of this file.
Functions | |
| MAR300_HEADER | Getmar300Header (FILE *) |
| MAR300_HEADER | Setmar300Header (void) |
| int | Putmar300Header (int, int, MAR300_HEADER) |
| MAR300_HEADER Getmar300Header | ( | FILE * | fp | ) |
Definition at line 35 of file mar300_header.c.
References buf, MAR300_HEADER::centre_x, MAR300_HEADER::centre_y, MAR300_HEADER::counts_end, MAR300_HEADER::counts_start, MAR300_HEADER::distance, MAR300_HEADER::exptime_sec, MAR300_HEADER::exptime_units, ftmp, MAR300_HEADER::high_pixels, MAR300_HEADER::high_records, i, j, MAR300_HEADER::lambda, MAR300_HEADER::lrecl, MAR300_HEADER::max_rec, MAR300_HEADER::multiplier, MAR300_HEADER::omega, MAR300_HEADER::p_l, MAR300_HEADER::p_r, MAR300_HEADER::p_x, MAR300_HEADER::p_y, MAR300_HEADER::phi_end, MAR300_HEADER::phi_start, MAR300_HEADER::pixels_x, MAR300_HEADER::pixels_y, MAR300_HEADER::prog_time, MAR300_HEADER::r_max, MAR300_HEADER::r_min, str, and swaplong().
{
MAR300_HEADER h;
int i,j, io,ntok=0;
char str[64], buf[64], *key, *token[20], q[64];
float ftmp,fh[15];
if ( fp == NULL ) return( h );
/*
* Read 10*int and 15*float and 24*char
*/
fseek( fp, 0, SEEK_SET );
io = fread( &h, sizeof( MAR300_HEADER ), 1, fp );
if ( io==1 ) io = sizeof( MAR300_HEADER );
io += fread( str, sizeof( char ), 16, fp );
if ( !strstr( str, "MAR" ) ) {
if ( io < 140 ) {
fprintf( stderr, "ERROR: only %d out of 140 bytes read from image header!!!\n",io );
}
io = 588;
goto SWAP;
}
else {
/* New style header: take all information from strings */
fseek( fp, sizeof(MAR300_HEADER)+16, SEEK_SET );
j = ftell( fp );
for ( i = 0; i< 28; i++ ) {
io += fread( str, sizeof( char ), 16, fp );
j += 16;
fseek( fp, j, SEEK_SET );
str[16]='\0';
if ( i == 3 ) sscanf( str, "%d", &h.pixels_x);
else if ( i == 4 ) sscanf( str, "%d", &h.pixels_y);
else if ( i == 5 ) sscanf( str, "%d", &h.lrecl);
else if ( i == 6 ) sscanf( str, "%d", &h.max_rec);
else if ( i == 7 ) sscanf( str, "%d", &h.high_pixels);
else if ( i == 8 ) sscanf( str, "%d", &h.high_records);
else if ( i == 9 ) sscanf( str, "%d", &h.counts_start);
else if ( i == 10 ) sscanf( str, "%d", &h.counts_end);
else if ( i == 11 ) sscanf( str, "%d", &h.exptime_sec);
else if ( i == 12 ) sscanf( str, "%d", &h.exptime_units);
else if ( i == 13 ) sscanf( str, "%f", &h.prog_time);
else if ( i == 14 ) sscanf( str, "%f", &h.r_max);
else if ( i == 15 ) sscanf( str, "%f", &h.r_min);
else if ( i == 16 ) sscanf( str, "%f", &h.p_r);
else if ( i == 17 ) sscanf( str, "%f", &h.p_l);
else if ( i == 18 ) sscanf( str, "%f", &h.p_x);
else if ( i == 19 ) sscanf( str, "%f", &h.p_y);
else if ( i == 20 ) sscanf( str, "%f", &h.centre_x);
else if ( i == 21 ) sscanf( str, "%f", &h.centre_y);
else if ( i == 22 ) sscanf( str, "%f", &h.lambda);
else if ( i == 23 ) sscanf( str, "%f", &h.distance);
else if ( i == 24 ) sscanf( str, "%f", &h.phi_start);
else if ( i == 25 ) sscanf( str, "%f", &h.phi_end);
else if ( i == 26 ) sscanf( str, "%f", &h.omega);
else if ( i == 27 ) sscanf( str, "%f", &h.multiplier);
}
}
SWAP:
if ( h.pixels_x < 100 || h.pixels_x > 5000 ) {
swaplong( &h, 10*sizeof(int) );
if ( h.pixels_x < 100 || h.pixels_x > 5000 ) {
fprintf( stderr, "ERROR: something wrong with image header!!!\n");
h.pixels_x = h.pixels_y = 0;
return( h );
}
fseek( fp, 40, SEEK_SET );
fread( fh, sizeof(float), 15, fp );
swaplong( fh, 15*sizeof(float) );
/*
for ( i=0;i<32; i++ ) {
q[0] = '\0';
if ( fh[10] & (int)( pow(2,i) ) )
strcat( q, "0" );
else
strcat( q, "1" );
printf("%s (0x%x)\n",q,fh[10]);
}
*/
sprintf( str, "%1.3f",fh[10] );
ftmp = (float)atof( str );
#if ( LINUX || linux || VMS )
ftmp = fh[10];
#endif
#if ( __sgi || LINUX || linux )
if ( ftmp <= 1.0 || ftmp > 2000. ) {
swaplong( fh, 15*sizeof(float) );
swapvms( fh, 15 );
}
#endif
#ifdef VMS
if ( fh[ 9] < 0.001 || fh[9] > 100. ) {
for ( i=0; i<15; i++ ) fh[i] = 0.0;
fh[3] = fh[4] = fh[5] = fh[6] = 0.15;
}
#endif
h.prog_time = fh[0];
h.r_max = fh[1];
h.r_min = fh[2];
h.p_r = fh[3];
h.p_l = fh[4];
h.p_x = fh[5];
h.p_y = fh[6];
h.centre_x = fh[7];
h.centre_y = fh[8];
h.lambda = fh[9];
h.distance = fh[10];
h.phi_start = fh[11];
h.phi_end = fh[12];
h.omega = fh[13];
h.multiplier = fh[14];
}
if ( io < 588 )
fprintf( stderr, "ERROR: only %d out of 588 bytes read from image header!!!\n",io );
fseek( fp, 2*h.pixels_x, SEEK_SET );
return( h );
}
| int Putmar300Header | ( | int | fd, |
| int | serial, | ||
| MAR300_HEADER | h | ||
| ) |
Definition at line 212 of file mar300_header.c.
References MAR300_HEADER::centre_x, MAR300_HEADER::centre_y, MAR300_HEADER::counts_end, MAR300_HEADER::counts_start, MAR300_HEADER::date, MAR300_HEADER::distance, MAR300_HEADER::exptime_sec, MAR300_HEADER::exptime_units, MAR300_HEADER::high_pixels, MAR300_HEADER::high_records, i, MAR300_HEADER::lambda, MAR300_HEADER::lrecl, MAR300_HEADER::max_rec, MAR300_HEADER::multiplier, now, MAR300_HEADER::omega, MAR300_HEADER::p_l, MAR300_HEADER::p_r, MAR300_HEADER::p_x, MAR300_HEADER::p_y, MAR300_HEADER::phi_end, MAR300_HEADER::phi_start, MAR300_HEADER::pixels_x, MAR300_HEADER::pixels_y, MAR300_HEADER::prog_time, MAR300_HEADER::r_max, MAR300_HEADER::r_min, and str.
Referenced by MarXF::output_header().
{
int i;
int io=0;
char c=' ',str[32];
time_t now;
if ( fd < 0 )return(0);
/*
* Rewind file
*/
i = lseek( fd, 0, SEEK_SET );
if ( strlen( h.date ) < 5 ) {
time( &now );
sprintf( str,"%s", (char *)ctime( &now ) );
for ( i=24; i<32; i++ )
str[i]='\0';
strncpy( h.date, str, 24 );
}
/*
* Write image header (10xint+15*float+date)
*/
io = write( fd, &h, sizeof( h ) );
/*
* New header additions, all items are 16 byte strings.
* 1.) MARCONTROL + Version no.
* 2.) Scanner serial no.
* 3.) Computer architecture
* 4.) Sum of xray units
* 5-...) Repeat normal header (i.e. 10 ints and 15 floats).
*/
str[15] = '\0';
sprintf( str, "MARCONTROL 1.0 ");
io += write( fd, str, 16 );
sprintf( str, "%16d", serial);
io += write( fd, str, 16 );
#if ( LINUX || linux )
sprintf( str, "LINUX " );
#elif ( __sgi )
sprintf( str, "SGI " );
#elif ( __osf__ )
sprintf( str, "DEC UNIX " );
#elif ( __hpux )
sprintf( str, "HPUX " );
#elif ( __ALPHA )
sprintf( str, "ALPHA " );
#else
sprintf( str, "UNKNOWN " );
#endif
io += write( fd, str, 16 );
sprintf( str, "%16.3f", (float)h.exptime_units );
io += write( fd, str, 16 );
str[16] = '\0';
/* 10 x integer as string */
sprintf( str, "%16d", h.pixels_x );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.pixels_y );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.lrecl );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.max_rec );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.high_pixels );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.high_records );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.counts_start );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.counts_end );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.exptime_sec );
io += write( fd, str, 16 );
sprintf( str, "%16d", h.exptime_units );
io += write( fd, str, 16 );
/* 15 x integer as string */
sprintf( str, "%16.3f", h.prog_time );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.r_max );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.r_min );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.p_r );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.p_l );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.p_x );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.p_y );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.centre_x );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.centre_y );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.lambda );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.distance );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.phi_start );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.phi_end );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.omega );
io += write( fd, str, 16 );
sprintf( str, "%16.3f", h.multiplier );
io += write( fd, str, 16 );
/*
* Fill remaining bytes of record with blanks
*/
FILL:
while ( lseek( fd, 0, SEEK_CUR ) < (2*h.pixels_x) )
if ( write( fd, &c, 1) < 1 )
break;
else
io++;
if ( io < 2*h.pixels_x )
return 0;
return 1;
}
| MAR300_HEADER Setmar300Header | ( | void | ) |
Definition at line 170 of file mar300_header.c.
References MAR300_HEADER::centre_x, MAR300_HEADER::centre_y, MAR300_HEADER::counts_end, MAR300_HEADER::counts_start, MAR300_HEADER::date, MAR300_HEADER::distance, MAR300_HEADER::exptime_sec, MAR300_HEADER::exptime_units, MAR300_HEADER::high_pixels, MAR300_HEADER::high_records, MAR300_HEADER::lambda, MAR300_HEADER::lrecl, MAR300_HEADER::max_rec, MAR300_HEADER::multiplier, now, MAR300_HEADER::omega, MAR300_HEADER::p_l, MAR300_HEADER::p_r, MAR300_HEADER::p_x, MAR300_HEADER::p_y, MAR300_HEADER::phi_end, MAR300_HEADER::phi_start, MAR300_HEADER::pixels_x, MAR300_HEADER::prog_time, MAR300_HEADER::r_max, and MAR300_HEADER::r_min.
{
MAR300_HEADER h;
time_t now;
h.pixels_x = 1200;
h.pixels_x = 1200;
h.lrecl = 1200;
h.max_rec = 1200;
h.high_pixels = 0;
h.high_records = 0;
h.counts_start = 0;
h.counts_end = 0;
h.exptime_sec = 0;
h.exptime_units = 0;
h.prog_time = 0.0;
h.r_max = 90.0;
h.r_min = 0.0;
h.p_x = 0.15;
h.p_y = 0.15;
h.p_l = 0.15;
h.p_r = 0.15;
h.centre_x = 90.;
h.centre_y = 90.;
h.lambda = 1.541789;
h.distance = 70.0;
h.phi_start = 0.0;
h.phi_end = 0.0;
h.omega = 0.0;
h.multiplier = 4.0;
time( &now );
sprintf( h.date, "%s", (char *)ctime( &now ) );
return( h );
}
1.7.3