-
JanThorbecke authoredJanThorbecke authored
getFileInfo.c 5.58 KiB
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <math.h>
#include "segy.h"
#define MAX(x,y) ((x) > (y) ? (x) : (y))
#define MIN(x,y) ((x) < (y) ? (x) : (y))
#define NINT(x) ((int)((x)>0.0?(x)+0.5:(x)-0.5))
/**
* gets sizes, sampling and min/max values of a SU file
*
* AUTHOR:
* Jan Thorbecke (janth@xs4all.nl)
* The Netherlands
**/
void vmess(char *fmt, ...);
void verr(char *fmt, ...);
int optncr(int n);
int getFileInfo(char *filename, int *n1, int *n2, int *ngath, float *d1, float *d2, float *f1, float *f2, float *xmin, float *xmax, float *sclsxgx, int *nxm)
{
FILE *fp;
size_t nread, data_sz;
off_t bytes, ret, trace_sz, ntraces;
int sx_shot, gx_start, gx_end, itrace, one_shot, igath, end_of_file, fldr_shot;
int verbose=1;
float scl, *trace, dxsrc, dxrcv, offset;
segy hdr;
if (filename == NULL) { /* read from input pipe */
*n1=0;
*n2=0;
return -1; /* Input pipe */
}
else fp = fopen( filename, "r" );
if (fp == NULL) verr("File %s does not exist or cannot be opened", filename);
nread = fread( &hdr, 1, TRCBYTES, fp );
assert(nread == TRCBYTES);
ret = fseeko( fp, 0, SEEK_END );
if (ret<0) perror("fseeko");
bytes = ftello( fp );
*n1 = hdr.ns;
if ( (hdr.trid == 1) && (hdr.dt != 0) ) {
*d1 = ((float) hdr.dt)*1.e-6;
*f1 = ((float) hdr.delrt)/1000.;
}
else {
*d1 = hdr.d1;
*f1 = hdr.f1;
}
*f2 = hdr.f2;
data_sz = sizeof(float)*(*n1);
trace_sz = sizeof(float)*(*n1)+TRCBYTES;
ntraces = (int) (bytes/trace_sz);
// fprintf(stderr,"data_sz %ld trace_sz %lld bytes = %lld\n", data_sz, trace_sz, bytes);
if (hdr.scalco < 0) scl = 1.0/fabs((float)hdr.scalco);
else if (hdr.scalco == 0) scl = 1.0;
else scl = hdr.scalco;
*sclsxgx = scl;
/* check to find out number of traces in shot gather */
one_shot = 1;
itrace = 0;
fldr_shot = hdr.fldr;
sx_shot = hdr.sx;
gx_start = hdr.gx;
trace = (float *)malloc(hdr.ns*sizeof(float));
fseeko( fp, TRCBYTES, SEEK_SET );
while (one_shot) {
nread = fread( trace, sizeof(float), hdr.ns, fp );
assert (nread == hdr.ns);
itrace++;
gx_end = hdr.gx;
nread = fread( &hdr, 1, TRCBYTES, fp );
if (nread==0) break;
if ((sx_shot != hdr.sx) || (fldr_shot != hdr.fldr) ) break;
}
if (itrace>1) {
dxrcv = (float)(gx_end - gx_start)/(float)(itrace-1);
*n2 = itrace;
*d2 = fabs(dxrcv)*scl;
if (NINT(dxrcv*1e3) != NINT(fabs(hdr.d2)*1e3)) {
if (dxrcv != 0) *d2 = fabs(dxrcv)*scl;
else *d2 = hdr.d2;
}
}
else {
*n2 = MAX(hdr.trwf, 1);
*d2 = hdr.d2;
dxrcv = hdr.d2;
}
/* check if the total number of traces (ntraces) is correct */
/* expensive way to find out how many gathers there are */
// fprintf(stderr, "ngath = %d dxrcv=%f d2=%f scl=%f \n", *ngath, dxrcv, *d2, scl);
if (*ngath == 0) {
*n2 = 0;
end_of_file = 0;
one_shot = 1;
igath = 0;
fseeko( fp, 0, SEEK_SET );
offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
*xmax = offset;
*xmin = offset;
dxrcv = *d2;
while (!end_of_file) {
itrace = 0;
nread = fread( &hdr, 1, TRCBYTES, fp );
if (nread != TRCBYTES) { break; }
fldr_shot = hdr.fldr;
sx_shot = hdr.sx;
gx_start = hdr.gx;
gx_end = hdr.gx;
itrace = 0;
while (one_shot) {
fseeko( fp, data_sz, SEEK_CUR );
itrace++;
if (hdr.gx != gx_end) dxrcv = MIN(dxrcv,abs(hdr.gx-gx_end));
gx_end = hdr.gx;
offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
*xmax = MAX(*xmax,offset);
*xmin = MIN(*xmin,offset);
nread = fread( &hdr, 1, TRCBYTES, fp );
if (nread != TRCBYTES) {
one_shot = 0;
end_of_file = 1;
break;
}
if ((sx_shot != hdr.sx) || (fldr_shot != hdr.fldr) ) break;
}
if (itrace>1) {
dxrcv = (float)abs(gx_end - gx_start)/((float)(itrace-1));
dxsrc = (float)(hdr.sx - sx_shot)*scl;
*n2 = MAX(*n2,itrace);
}
if (verbose>1) {
fprintf(stderr," . Scanning shot %d (%d) with %d traces dxrcv=%.2f dxsrc=%.2f %d %d\n",sx_shot,igath,itrace,dxrcv*scl,dxsrc,gx_end,gx_start);
}
if (itrace != 0) { /* end of shot record */
fseeko( fp, -TRCBYTES, SEEK_CUR );
igath++;
}
else {
end_of_file = 1;
}
}
*ngath = igath;
*d2 = dxrcv*scl;
}
else {
/* read last trace header */
fseeko( fp, -trace_sz, SEEK_END );
nread = fread( &hdr, 1, TRCBYTES, fp );
offset = (NINT((hdr.gx-hdr.sx)*scl*100)/100.0);
*xmax = MAX(*xmax,offset);
*xmin = MIN(*xmin,offset);
*xmin = MIN(sx_shot,hdr.sx*scl);
*ngath = ntraces/(*n2);
}
// *nxm = NINT((*xmax-*xmin)/dxrcv)+1;
*nxm = (int)ntraces;
fclose( fp );
free(trace);
return 0;
}
int disp_fileinfo(char *file, int n1, int n2, float f1, float f2, float d1, float d2, segy *hdrs)
{
vmess("file %s contains", file);
vmess("*** n1 = %d n2 = %d ntftt=%d", n1, n2, optncr(n1));
vmess("*** d1 = %.5f d2 = %.5f", d1, d2);
vmess("*** f1 = %.5f f2 = %.5f", f1, f2);
vmess("*** fldr = %d sx = %d", hdrs[0].fldr, hdrs[0].sx);
return 0;
}