Skip to content
Snippets Groups Projects
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;
}