int add_trace (Dbptr db, double tstart, double tend, Trace *trace, Trace **traceo) { Trace *tr, *trn; trn = read_trace (db, tstart, tend); if (trn == NULL) { fprintf (stderr, "add_trace: read_trace() error.\n"); return (0); } if (trn->raw_data == NULL) { SCV_free_trace (trn); *traceo = trace; return (1); } if (trace == NULL) { *traceo = trn; return (1); } for (tr=trace; tr->next!=NULL; tr=tr->next); tr->next = trn; trn->prev = tr; *traceo = trace; return (1); }
int main(int argc, char **argv) { char *sift_expr, *wfdir, *format, *dbin, *dbout, *chan_maps; double calper; int overwrite=0; int ndec_stages; char **dec_stages; Tbl *chan_in_tbl, *chan_out_tbl; Dbptr dbi, dbo; Dbvalue dbv; Response *resp; Tbl *ncoefs, *coefs, *dec_fac; int dec_factor; int nwi, n, i, j, nchans; char string[512]; char expr[1024]; Dbptr dbwfi; char dbbase[1024]; char dir[128]; char dfile[128]; char fnamei[1024]; char fnameo[1024]; char wfdir1[512]; char wfdir2[512]; double time, tref; /* Get command line args */ if (!getargs(argc, argv, &sift_expr, &calper, &wfdir, &format, &dbin, &dbout, &chan_maps, &ndec_stages, &dec_stages)) { usage(); exit (1); } if (calper >= 0.0) { fprintf (stderr, "dbdec: -c option not operational.\n"); usage(); exit (1); } /* Parse channel maps and wfdir */ if (!parse_chan_maps(chan_maps, &chan_in_tbl, &chan_out_tbl)) { fprintf (stderr, "dbdec: Unable to parse channel maps, '%s'\n", chan_maps); usage(); exit (1); } if (!parse_wfdir(wfdir, wfdir1, wfdir2)) { fprintf (stderr, "dbdec: Unable to parse wfdir, '%s'\n", wfdir); usage(); exit (1); } /* Open and read decimation stage files */ if (!read_dec_files(ndec_stages, dec_stages, &resp, &dec_factor, &ncoefs, &coefs, &dec_fac)) { fprintf (stderr, "dbdec: Unable to read decimation stage(s).\n"); usage(); exit (1); } printf ("Total decimation factor = %d\n", dec_factor); /* Open the input database */ if (dbopen (dbin, "r+", &dbi) == dbINVALID) { elog_clear_register(1); fprintf (stderr, "dbdec: Unable to open input database '%s'.\n", dbin); exit (1); } dbi = dblookup (dbi, 0, "wfdisc", 0, 0); dbquery (dbi, dbRECORD_COUNT, &nwi); if (nwi < 1) { fprintf (stderr, "dbdec: No wfdisc rows for input database '%s'.\n", dbin); exit (1); } /* Compose a subset expression for the input channel mappings */ nchans = maxtbl (chan_in_tbl); for (i=0; i<nchans; i++) { sprintf (string, "chan == \"%s\"", gettbl(chan_in_tbl, i)); if (i == 0) { strcpy (expr, "("); strcat (expr, string); } else { strcat (expr, " || "); strcat (expr, string); } } strcat (expr, ")"); if (sift_expr) { strcat (expr, " && ("); strcat (expr, sift_expr); strcat (expr, ")"); } /* Subset the input wfdisc table */ dbwfi = dblookup (dbi, 0, "wfdisc", 0, 0); dbwfi = dbsubset (dbwfi, expr, 0); dbquery (dbwfi, dbRECORD_COUNT, &n); if (n < 1) { fprintf (stderr, "dbdec: No input channels for database '%s'.\n", dbin); exit (1); } printf ("Processing %d out of %d waveform segments.\n", n, nwi); /* Open the output database */ if (dbopen (dbout, "r+", &dbo) == dbINVALID) { elog_clear_register(1); fprintf (stderr, "dbdec: Unable to open output database '%s'.\n", dbout); exit (1); } dbo = dblookup (dbo, 0, "wfdisc", 0, 0); dbquery (dbo, dbTABLE_DIRNAME, &dbv); strcpy (dbbase, dbv.t); /* Make a pass through the input wfdiscs to look for wf file conflicts */ if (!overwrite) { printf ("Looking for waveform file conflicts..."); fflush (stdout); } tref = 1.e30; for (dbwfi.record=0; dbwfi.record<n; dbwfi.record++) { if (!overwrite && (!strcmp(wfdir1,wfdir2)) ){ if (!makeoutfname (dbwfi, wfdir1, wfdir2, dbbase, dir, dfile, fnameo)) { fprintf (stderr, "dbdec: makeoutfname() error.\n"); exit (1); } if (zaccess(fnameo, F_OK) != -1) { fprintf (stderr, "\ndbdec(Warning): wf file conflict for '%s'.\n", fnameo); fprintf(stderr,"Will append but may waste space\n"); } } dbgetv (dbwfi, 0, "time", &time, 0); if (time < tref) tref = time; } if (!overwrite) { printf ("OK\n"); } tref = (double)((int)tref); /* Loop through and do the decimation */ for (dbwfi.record=0; dbwfi.record<n; dbwfi.record++) { Trace *trace=NULL; /* Read in trace and convert to float */ SCV_free_trace (trace); trace = NULL; trace = read_trace (dbwfi); if (trace == NULL) { fprintf (stderr, "dbdec: read_trace() error.\n"); continue; } /* Decimate float trace */ if (!decimate_trace (trace, ncoefs, coefs, dec_fac, tref)) { fprintf (stderr, "dbdec: decimate_trace() error.\n"); exit (1); } /* Convert trace to output units and put back in data gaps */ trace = convert_trace (trace, format); if (trace == NULL) { fprintf (stderr, "dbdec: convert_trace() error.\n"); exit (1); } /* Write out decimated trace and wfdisc */ makeoutfname (dbwfi, wfdir1, wfdir2, dbbase, dir, dfile, fnameo); if (!write_trace (dbwfi, dbo, dir, dfile, fnameo, chan_in_tbl, chan_out_tbl, trace, overwrite)) { fprintf (stderr, "dbdec: write_trace() error.\n"); exit (1); } } /* Fix up the output sensor, sitechan, etc. tables */ if (!fixup_tables (dbi, dbo, chan_in_tbl, chan_out_tbl, calper, resp, dec_factor)) { fprintf (stderr, "dbdec: fixup_tables() error.\n"); exit (1); } /* Normal exit */ exit (0); }