/************************************************************************/ /* Populate_RdSEED: Populates response from a rdseed output file. */ /************************************************************************/ /* Author: Stephane Zuzlewski UC Berkeley Seismological Laboratory stephane@seismo.berkeley.edu Purpose: Populates all stages from a rdseed output style file (s option) into the IR schema. Modification History: Date Ver Who What --------------------------------------------------------------------- 2002/11/25 1.0 SMZ Initial coding (Stages 1 & 0). 2002/12/11 1.0 SMZ Added digitizer stage (2). 2003/08/25 1.1 SMZ Supports coalesced time spans. 2005/02/07 2.0 SMZ Now Reads all stages. 2005/04/18 2.1 SMZ Solved bug with no units. 2005/10/17 2.2 SMZ Station gets deleted before populated. 2006/02/23 2.3 SMZ Corrected bug with memory leak. 2007/02/27 2.4 SMZ Database connection string can now be specified in an environment variable. 2007/07/30 2.5 SMZ Corrected bug when deleting station. 2008/11/20 2.6 SMZ Increased Station name to 60 characters. 2010/03/25 2.7 SMZ Implemented workaround for blockette 54 when used in digitizer stage with one digital coefficient. 2010/09/20 2.8 SMZ Prints out Warning message when Stage 0 is missing. 2013/11/20 2.9 SMZ Now handles blockette 59. 2013/12/09 3.0 SMZ Now handles blockette 51. 2014/05/19 3.1 SMZ Now handles oddities from IRIS converter (no instrument, no storage format). 2014/07/14 3.2 SMZ Fixed bug with B052F07 field. 2014/07/17 3.3 SMZ Now uses strtok_r() to parse lines. 2014/08/29 3.4 SMZ Fixed bug with deletion. 2014/09/23 3.5 SMZ Fixed bug with B051/B059 blockettes due to tabs used by rdseed. 2014/10/30 3.6 SMZ Added support for polynomial responses. 2014/11/13 3.7 SMZ Added support for multiple blockette 50 for a given site. 2015/05/28 3.8 SMZ Rdseed adds one extra space at the end of each B059F05 line. Added support for it. 2015/09/25 3.9 SMZ Added fix from TMD where comments are too long. 2016/07/18 4.0 SMZ Ignore channels with no response. 2017/03/30 4.1 SMZ Handles duplicate comments. 2017/07/11 4.2 SMZ Handles multiple B050 blockettes for a given station. 2020/02/05 4.3 SMZ Fixed sequence from pnseq to poseq. 2023/08/02 4.4 SMZ Ignore blank lines in rdseed output. */ /************************************************************************/ #ifndef lint static char sccsid[] = "%W% %G% %U%"; #endif #include #include #include #include EXEC ORACLE OPTION (ORACA=YES); #define CONNECT_STRING "user/password@dbname" #define NOMOREROWS 1403 #define VERSION "4.4" #define info stdout /* Blockette 50 Information */ typedef struct { char net[9]; char sta[7]; double lat; double lon; double elev; char staname[61]; int net_id; int word_32; int word_16; char ondate[20]; char offdate[20]; } Station_Data; /* Blockette 52 Information */ typedef struct { char net[8]; char sta[7]; char seedchan[4]; char location[3]; int inid; char remark[31]; int unit_signal; int unit_calib; double lat; double lon; double elev; double edepth; double azimuth; double dip; int format_id; int record_length; double samprate; double clock_drift; char flags[28]; char ondate[20]; char offdate[20]; } Channel_Data; /* Blockette 51 Information */ typedef struct { char net[8]; char sta[7]; char ondate[20]; char offdate[20]; int comment_id; int comment_level; } Station_Comment; /* Blockette 59 Information */ typedef struct { char net[8]; char sta[7]; char seedchan[4]; char location[3]; char ondate[20]; char offdate[20]; int comment_id; int comment_level; } Channel_Comment; /* Blockette 30 Information */ typedef struct { char name[255]; int family; int nb_keys; char key[255][255]; } Format_Data; /* Blockette 53 Information */ typedef struct { double r_value; double r_error; double i_value; double i_error; } PZ; typedef struct { int unit_in; int unit_out; double AO; double AF; int nb_poles; int nb_zeros; PZ poles[64]; PZ zeros[64]; } PZ_Data; /* Blockette 62 Information */ typedef struct { double coeff; double error; } PN; typedef struct { int unit_in; int unit_out; char approx_type; char freq_units; double low_freq; double high_freq; double low_approx; double high_approx; double abs_error; int nb_coeffs; PN coeffs[64]; } PN_Data; /* Blockette 58 Information */ typedef struct { double sensitivity; double frequency; } Gain_Data; /* Blockette 54(44) & 61(41) Information */ typedef struct { double value; double error; } DC; typedef struct { int unit_in; int unit_out; char symmetry; int nb_nums; int nb_denoms; DC nums[1024]; DC denoms[1024]; } DC_Data; /* Blockette 57 Information */ typedef struct { double samprate; int factor; int offset; double delay; double correction; } DM_Data; /* Overall Response Information */ typedef struct { int pz; int pn; int gain; int dc; int dm; } Response_Data; char *syntax[] = { "%s version " VERSION " -- Populates instrument response from a rdseed output file (rdseed -s).", "%s [-h] [-v] [-p] ", " where:", " -h Help - prints syntax message.", " -v Verbose mode.", " -p Population mode.", "", " Environment variable DB_CONNECT --> Overwrites default database connection string.", NULL }; /************************************************************************/ EXEC SQL INCLUDE sqlca.h; EXEC SQL BEGIN DECLARE SECTION; char user_pwd[80]; int DBstagenb; int id; int inttmp; int objnb; char stmp[255]; char stmp2[255]; short ind; char net[9]; char sta[7]; double lat; double lon; double elev; char staname[61]; int net_id; int word_32; int word_16; char ondate[20]; char offdate[20]; char seedchan[4]; char location[3]; int inid; char remark[31]; int unit_signal; int unit_calib; double edepth; double azimuth; double dip; int format_id; int record_length; double samprate; double clock_drift; char flags[28]; int comment_id; int comment_level; int com_count; int pz_key; int unit_in; int unit_out; double AO; double AF; int pn_key; char approx_type; double low_approx; double high_approx; double abs_error; double coeff; double r_value; double r_error; double i_value; double i_error; double sensitivity; double frequency; int dm_key; int factor; int offset; double delay; double correction; int key; int nb_key; int dic_key; double fir_coeff; double fir_error; char symmetry; EXEC SQL END DECLARE SECTION; EXEC SQL DECLARE sql_stmt STATEMENT; /************************************************************************/ /* External variables and symbols. */ /************************************************************************/ char *cmdname; /* program name from command line. */ long SQLCODE; void sql_error(); /* Handles unrecoverable errors */ /************************************************************************/ /* print_syntax: */ /* Print the syntax description of program. */ /************************************************************************/ int print_syntax (char *cmd, /* program name. */ char *syntax[], /* syntax array. */ FILE *fp) /* FILE ptr for output. */ { int i; for (i=0; syntax[i] != NULL; i++) { fprintf (fp, syntax[i], cmd); fprintf (fp, "\n"); } return (0); } /************************************************************************/ /* main: main program. */ /************************************************************************/ main (int argc, char *argv[]) { int FlagV = 0; /* Verbose Flag */ int FlagP = 0; /* Population Flag */ int FlagD = 0; /* Deletion Flag */ FILE *frdseed; /* RDSEED File Descriptor */ char nrdseed[255]; /* RDSEED File Name */ char line[256]; /* Current Line */ char line2[256]; /* Copy of Current Line */ char header[32]; /* Blockette Header */ Station_Data sdata; /* Station Information */ Channel_Data cdata; /* Channel Information */ Station_Comment scomment; /* Station Comment */ Channel_Comment ccomment; /* Channel Comment */ Format_Data fdata; /* Format Information */ PZ_Data pzdata[16]; /* Poles & Zeros Information */ PN_Data pndata[16]; /* Polynomial Information */ Gain_Data gdata[32]; /* Gain Information */ DC_Data dcdata[32]; /* Coefficients Information */ DM_Data dmdata[32]; /* Decimation Information */ Response_Data respdata[32]; /* Response Information */ int nb_respdata = 0; /* Number of Stages */ int Stage_Nb = 0; /* Current Stage Number */ int i, k; /* Loop Variables */ int PopulateNow = 0; /* Population Flag */ int DeleteNow = 0; /* Deletion Flag */ char connect_string[255]; /* DB Connection String */ char tmp[32]; /* Temporary Buffer */ char *token; /* Used for strtok_r() */ char *lasts; /* Used for strtok_r() */ char *search = " "; /* Used for strtok_r() */ char old_net[9]; /* Old Network Code */ char old_sta[7]; /* Old Station Code */ /* Variables needed for getopt. */ extern char *optarg; extern int optind, opterr; int c; char *p; oraca.orastxtf = ORASTFERR; cmdname = ((p = strrchr(*argv,'/')) != NULL) ? ++p : *argv; /* Parse command line options. */ while ( (c = getopt(argc,argv,"hvpi")) != -1) switch (c) { case '?': case 'h': print_syntax(cmdname,syntax,info); exit(0); break; case 'v': FlagV = 1; break; case 'p': FlagP = 1; break; case 'i': FlagD = 1; break; default: fprintf (info, "Unknown option: -%c\n", c); exit(1); } /* Skip over all options and their arguments. */ argv = &(argv[optind]); argc -= optind; if (argc != 1) { print_syntax(cmdname,syntax,info); exit(0); } else strcpy (nrdseed, argv[0]); strcpy (old_net, ""); strcpy (old_sta, ""); /* Connect to ORACLE. */ strcpy (connect_string, CONNECT_STRING); if ((p = (char *) getenv ("DB_CONNECT")) != NULL) strcpy (connect_string, p); EXEC SQL WHENEVER SQLERROR DO sql_error(); strcpy (user_pwd, connect_string); EXEC SQL CONNECT :user_pwd; /* Opening RDSEED file */ if (FlagV) printf ("\n Processing file %s ...\n", nrdseed); if ((frdseed = fopen (nrdseed, "rt")) == NULL) { printf ("\n Error: couldn't open file %s.\n", nrdseed); exit (-1); } /* Reading RDSEED file */ fgets (line, 255, frdseed); while (!feof (frdseed)) { if (line[0] == 'B') sscanf (line, "%s", header); else strcpy (header, "#"); /**************************************/ /* Blockette 50 - Station Information */ /**************************************/ if (!strcmp (header, "B050F03")) { sscanf (line, "%*s %*s %*s %s", sdata.sta); if (FlagV) printf ("\n\n%s\t%s", header, sdata.sta); } else if (!strcmp (header, "B050F04")) { sscanf (line, "%*s %*s %lf", &sdata.lat); if (FlagV) printf ("\n%s\t%f", header, sdata.lat); } else if (!strcmp (header, "B050F05")) { sscanf (line, "%*s %*s %lf", &sdata.lon); if (FlagV) printf ("\n%s\t%f", header, sdata.lon); } else if (!strcmp (header, "B050F06")) { sscanf (line, "%*s %*s %lf", &sdata.elev); if (FlagV) printf ("\n%s\t%f", header, sdata.elev); } else if (!strcmp (header, "B050F09")) { strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (sdata.staname, line2+(token-line)); sdata.staname[strlen (sdata.staname) - 1] = '\0'; if (FlagV) printf ("\n%s\t%s", header, sdata.staname); } else if (!strcmp (header, "B050F10")) { char owner[255]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (owner, line2+(token-line)); owner[strlen (owner) - 1] = '\0'; if (FlagV) printf ("\n%s\t%s", header, owner); if (FlagP) { id = (-1); strcpy (stmp, owner); EXEC SQL SELECT id INTO :id:ind FROM D_Abbreviation WHERE description = :stmp; if ((id == (-1)) || (ind < 0)) { EXEC SQL SELECT abbseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Abbreviation (id, description) VALUES (:id, :stmp); sdata.net_id = id; } else { sdata.net_id = id; } if (FlagV) printf ("\n%s\tnet_id = %d", "DB", sdata.net_id); } } else if (!strcmp (header, "B050F11")) { sscanf (line, "%*s %*s %*s %*s %d", &sdata.word_32); if (FlagV) printf ("\n%s\t%d", header, sdata.word_32); } else if (!strcmp (header, "B050F12")) { sscanf (line, "%*s %*s %*s %*s %d", &sdata.word_16); if (FlagV) printf ("\n%s\t%d", header, sdata.word_16); } else if (!strcmp (header, "B050F13")) { sscanf (line, "%*s %*s %*s %s", tmp); if (!strcmp (tmp, "(null)")) strcpy (sdata.ondate, "3000/01/01 00:00:00"); else { tmp[17] = '\0'; EXEC SQL SELECT TO_CHAR(TO_DATE(:tmp,'yyyy,ddd,hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') INTO :ondate FROM DUAL; strcpy (sdata.ondate,ondate); } if (FlagV) printf ("\n%s\t%s", header, sdata.ondate); } else if (!strcmp (header, "B050F14")) { sscanf (line, "%*s %*s %*s %s", tmp); if (!strcmp (tmp, "(null)")) strcpy (sdata.offdate, "3000/01/01 00:00:00"); else { tmp[17] = '\0'; EXEC SQL SELECT TO_CHAR(TO_DATE(:tmp,'yyyy,ddd,hh24:mi:ss'),'yyyy/mm/dd hh24:mi:ss') INTO :offdate FROM DUAL; strcpy (sdata.offdate,offdate); } if (FlagV) printf ("\n%s\t%s", header, sdata.offdate); } else if (!strcmp (header, "B050F16")) { sscanf (line, "%*s %*s %*s %s", sdata.net); if (FlagV) printf ("\n%s\t%s", header, sdata.net); if ((strcmp (sdata.net, old_net)) || (strcmp (sdata.sta, old_sta))) /* New Station */ { DeleteNow = 0; if ((FlagD == 0) && (FlagP)) { strcpy (net, sdata.net); strcpy (sta, sdata.sta); EXEC SQL DELETE FROM Station_Data WHERE sta = :sta AND net = :net; EXEC SQL DELETE FROM Station_Comment WHERE sta = :sta AND net = :net; } } strcpy (old_net, sdata.net); strcpy (old_sta, sdata.sta); if (FlagP) { /* Populating Station Information */ strcpy (net, sdata.net); strcpy (sta, sdata.sta); lat = sdata.lat; lon = sdata.lon; elev = sdata.elev; strcpy (staname, sdata.staname); net_id = sdata.net_id; word_32 = sdata.word_32; word_16 = sdata.word_16; strcpy (ondate, sdata.ondate); strcpy (offdate, sdata.offdate); EXEC SQL INSERT INTO Station_Data (net, sta, ondate, lat, lon, elev, staname, net_id, word_32, word_16, offdate, lddate) VALUES (:net, :sta, :ondate, :lat, :lon, :elev, :staname, :net_id, :word_32, :word_16, :offdate, SYSDATE); if (FlagV) printf ("\n%s\t%s.%s\t%s\t%s Station Populated", "DB", net, sta, ondate, offdate); } } /**************************************/ /* Blockette 52 - Channel Information */ /**************************************/ else if (!strcmp (header, "B052F04")) { /* Testing if last channel had a Stage 0 */ if (Stage_Nb != 0) { printf ("\nError: Stage 0 missing [%s.%s.%s.%s].\n", sdata.net, sdata.sta, cdata.seedchan, cdata.location); } Stage_Nb = -1; sscanf (line, "%*s %*s %s", cdata.seedchan); if (FlagV) printf ("\n\n%s\t%s", header, cdata.seedchan); /* Resetting Response information */ nb_respdata = 0; for (i=0;i<32;i++) { respdata[i].pz = 0; respdata[i].pn = 0; respdata[i].dc = 0; respdata[i].dm = 0; respdata[i].gain = 0; } cdata.format_id = -1; } else if (!strcmp (header, "B052F03")) { strcpy (cdata.location, ""); sscanf (line, "%*s %*s %s", cdata.location); if (strlen (cdata.location) == 0) strcpy (cdata.location, " "); if (FlagV) printf ("\n%s\t%s", header, cdata.location); } else if (!strcmp (header, "B052F06")) { char inst_type[255]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (inst_type, line2+(token-line)); inst_type[strlen (inst_type) - 1] = '\0'; /* Unknown Instrument */ if (!strcmp (inst_type, "No Abbreviation Referenced")) strcpy (inst_type, "Unknown"); if (FlagV) printf ("\n%s\t%s", header, inst_type); if (FlagP) { id = (-1); strcpy (stmp, inst_type); EXEC SQL SELECT id INTO :id:ind FROM D_Abbreviation WHERE description = :stmp; if ((id == (-1)) || (ind < 0)) { EXEC SQL SELECT abbseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Abbreviation (id, description) VALUES (:id, :stmp); cdata.inid = id; } else { cdata.inid = id; } if (FlagV) printf ("\n%s\tinid = %d", "DB", cdata.inid); } } else if (!strcmp (header, "B052F07")) { strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (cdata.remark, line2+(token-line)); cdata.remark[strlen (cdata.remark) - 1] = '\0'; if (FlagV) printf ("\n%s\t%s", header, cdata.remark); } else if (!strcmp (header, "B052F08")) { char sig_name[127]; char sig_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (sig_name, token); strcpy (sig_desc, line2+(token-line) + strlen (sig_name) + 3); sig_desc[strlen (sig_desc) - 1] = '\0'; /* No Unit */ if (!strcmp (sig_name, "No")) { strcpy (sig_name, "NULL"); strcpy (sig_desc, "NULL"); } if (FlagV) printf ("\n%s\t%s [%s]", header, sig_name, sig_desc); if (FlagP) { id = (-1); strcpy (stmp, sig_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, sig_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); cdata.unit_signal = id; } else { cdata.unit_signal = id; } if (FlagV) printf ("\n%s\tunit_signal = %d", "DB", cdata.unit_signal); } } else if (!strcmp (header, "B052F09")) { char cal_name[127]; char cal_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (cal_name, token); strcpy (cal_desc, line2+(token-line) + strlen (cal_name) + 3); cal_desc[strlen (cal_desc) - 1] = '\0'; /* No Unit */ if (!strcmp (cal_name, "No")) { strcpy (cal_name, "NULL"); strcpy (cal_desc, "NULL"); } if (FlagV) printf ("\n%s\t%s [%s]", header, cal_name, cal_desc); if (FlagP) { id = (-1); strcpy (stmp, cal_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, cal_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); cdata.unit_calib = id; } else { cdata.unit_calib = id; } if (FlagV) printf ("\n%s\tunit_calib = %d", "DB", cdata.unit_calib); } } else if (!strcmp (header, "B052F10")) { sscanf (line, "%*s %*s %lf", &cdata.lat); if (FlagV) printf ("\n%s\t%f", header, cdata.lat); } else if (!strcmp (header, "B052F11")) { sscanf (line, "%*s %*s %lf", &cdata.lon); if (FlagV) printf ("\n%s\t%f", header, cdata.lon); } else if (!strcmp (header, "B052F12")) { sscanf (line, "%*s %*s %lf", &cdata.elev); if (FlagV) printf ("\n%s\t%f", header, cdata.elev); } else if (!strcmp (header, "B052F13")) { sscanf (line, "%*s %*s %*s %lf", &cdata.edepth); if (FlagV) printf ("\n%s\t%f", header, cdata.edepth); } else if (!strcmp (header, "B052F14")) { sscanf (line, "%*s %*s %lf", &cdata.azimuth); if (FlagV) printf ("\n%s\t%f", header, cdata.azimuth); } else if (!strcmp (header, "B052F15")) { sscanf (line, "%*s %*s %lf", &cdata.dip); if (FlagV) printf ("\n%s\t%f", header, cdata.dip); } /* Blockette 30 - Data Format Dictionary */ else if (!strcmp (header, "B030F03")) { strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (fdata.name, line2+(token-line)); fdata.name[strlen (fdata.name) - 1] = '\0'; if (FlagV) printf ("\n%s\t%s", header, fdata.name); } else if (!strcmp (header, "B030F05")) { sscanf (line, "%*s %*s %*s %d", &fdata.family); if (FlagV) printf ("\n%s\t%d", header, fdata.family); } else if (!strcmp (header, "B030F06")) { int i; sscanf (line, "%*s %*s %*s %*s %d", &fdata.nb_keys); if (FlagV) printf ("\n%s\t%d", header, fdata.nb_keys); for (i=0;i nb_respdata) nb_respdata = Stage_Nb; } else if (!strcmp (header, "B053F05")) { char in_name[127]; char in_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (in_name, token); strcpy (in_desc, line2+(token-line) + strlen (in_name) + 3); in_desc[strlen (in_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, in_name, in_desc); if (FlagP) { id = (-1); strcpy (stmp, in_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, in_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); pzdata[Stage_Nb].unit_in = id; } else { pzdata[Stage_Nb].unit_in = id; } if (FlagV) printf ("\n%s\tunit_in = %d", "DB", pzdata[Stage_Nb].unit_in); } } else if (!strcmp (header, "B053F06")) { char out_name[127]; char out_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (out_name, token); strcpy (out_desc, line2+(token-line) + strlen (out_name) + 3); out_desc[strlen (out_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, out_name, out_desc); if (FlagP) { id = (-1); strcpy (stmp, out_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, out_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); pzdata[Stage_Nb].unit_out = id; } else { pzdata[Stage_Nb].unit_out = id; } if (FlagV) printf ("\n%s\tunit_out = %d", "DB", pzdata[Stage_Nb].unit_out); } } else if (!strcmp (header, "B053F07")) { sscanf (line, "%*s %*s %*s %*s %lf", &pzdata[Stage_Nb].AO); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, pzdata[Stage_Nb].AO); } else if (!strcmp (header, "B053F08")) { sscanf (line, "%*s %*s %*s %lf", &pzdata[Stage_Nb].AF); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, pzdata[Stage_Nb].AF); } else if (!strcmp (header, "B053F09")) { sscanf (line, "%*s %*s %*s %*s %d", &pzdata[Stage_Nb].nb_zeros); if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, pzdata[Stage_Nb].nb_zeros); } else if (!strcmp (header, "B053F14")) { sscanf (line, "%*s %*s %*s %*s %d", &pzdata[Stage_Nb].nb_poles); if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, pzdata[Stage_Nb].nb_poles); } else if (!strcmp (header, "B053F10-13")) { int z_nb; sscanf (line, "%*s %d", &z_nb); sscanf (line, "%*s %*s %lf %lf %lf %lf", &pzdata[Stage_Nb].zeros[z_nb].r_value, &pzdata[Stage_Nb].zeros[z_nb].i_value, &pzdata[Stage_Nb].zeros[z_nb].r_error, &pzdata[Stage_Nb].zeros[z_nb].i_error); if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f\t%f\t%f", header, Stage_Nb, z_nb, pzdata[Stage_Nb].zeros[z_nb].r_value, pzdata[Stage_Nb].zeros[z_nb].i_value, pzdata[Stage_Nb].zeros[z_nb].r_error, pzdata[Stage_Nb].zeros[z_nb].i_error); } else if (!strcmp (header, "B053F15-18")) { int p_nb; sscanf (line, "%*s %d", &p_nb); sscanf (line, "%*s %*s %lf %lf %lf %lf", &pzdata[Stage_Nb].poles[p_nb].r_value, &pzdata[Stage_Nb].poles[p_nb].i_value, &pzdata[Stage_Nb].poles[p_nb].r_error, &pzdata[Stage_Nb].poles[p_nb].i_error); if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f\t%f\t%f", header, Stage_Nb, p_nb, pzdata[Stage_Nb].poles[p_nb].r_value, pzdata[Stage_Nb].poles[p_nb].i_value, pzdata[Stage_Nb].poles[p_nb].r_error, pzdata[Stage_Nb].poles[p_nb].i_error); } /****************************************************/ /* Blockette 62 - Response (Polynomial) Information */ /****************************************************/ else if (!strcmp (header, "B062F04")) { sscanf (line, "%*s %*s %*s %*s %d", &Stage_Nb); if (FlagV) printf ("\n\n%s[%d]\t%d", header, Stage_Nb, Stage_Nb); respdata[Stage_Nb].pn = 1; if (Stage_Nb > nb_respdata) nb_respdata = Stage_Nb; } else if (!strcmp (header, "B062F05")) { char in_name[127]; char in_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (in_name, token); strcpy (in_desc, line2+(token-line) + strlen (in_name) + 3); in_desc[strlen (in_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, in_name, in_desc); if (FlagP) { id = (-1); strcpy (stmp, in_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, in_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); pndata[Stage_Nb].unit_in = id; } else { pndata[Stage_Nb].unit_in = id; } if (FlagV) printf ("\n%s\tunit_in = %d", "DB", pndata[Stage_Nb].unit_in); } } else if (!strcmp (header, "B062F06")) { char out_name[127]; char out_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (out_name, token); strcpy (out_desc, line2+(token-line) + strlen (out_name) + 3); out_desc[strlen (out_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, out_name, out_desc); if (FlagP) { id = (-1); strcpy (stmp, out_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, out_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); pndata[Stage_Nb].unit_out = id; } else { pndata[Stage_Nb].unit_out = id; } if (FlagV) printf ("\n%s\tunit_out = %d", "DB", pndata[Stage_Nb].unit_out); } } else if (!strcmp (header, "B062F07")) { sscanf (line, "%*s %*s %*s %*s %c", &pndata[Stage_Nb].approx_type); if (FlagV) printf ("\n%s[%d]\t%c", header, Stage_Nb, pndata[Stage_Nb].approx_type); } else if (!strcmp (header, "B062F08")) { sscanf (line, "%*s %*s %*s %*s %c", &pndata[Stage_Nb].freq_units); if (FlagV) printf ("\n%s[%d]\t%c", header, Stage_Nb, pndata[Stage_Nb].freq_units); } else if (!strcmp (header, "B062F09")) { sscanf (line, "%*s %*s %*s %*s %*s %lf", &pndata[Stage_Nb].low_freq); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, pndata[Stage_Nb].low_freq); } else if (!strcmp (header, "B062F10")) { sscanf (line, "%*s %*s %*s %*s %*s %lf", &pndata[Stage_Nb].high_freq); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, pndata[Stage_Nb].high_freq); } else if (!strcmp (header, "B062F11")) { sscanf (line, "%*s %*s %*s %*s %*s %lf", &pndata[Stage_Nb].low_approx); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, pndata[Stage_Nb].low_approx); } else if (!strcmp (header, "B062F12")) { sscanf (line, "%*s %*s %*s %*s %*s %lf", &pndata[Stage_Nb].high_approx); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, pndata[Stage_Nb].high_approx); } else if (!strcmp (header, "B062F13")) { sscanf (line, "%*s %*s %*s %*s %lf", &pndata[Stage_Nb].abs_error); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, pndata[Stage_Nb].abs_error); } else if (!strcmp (header, "B062F14")) { sscanf (line, "%*s %*s %*s %*s %d", &pndata[Stage_Nb].nb_coeffs); if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, pndata[Stage_Nb].nb_coeffs); } else if (!strcmp (header, "B062F15-16")) { int c_nb; sscanf (line, "%*s %d", &c_nb); sscanf (line, "%*s %*s %lf %lf", &pndata[Stage_Nb].coeffs[c_nb].coeff, &pndata[Stage_Nb].coeffs[c_nb].error); if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f", header, Stage_Nb, c_nb, pndata[Stage_Nb].coeffs[c_nb].coeff, pndata[Stage_Nb].coeffs[c_nb].error); if ((Stage_Nb == 0) && (FlagP) && (c_nb == pndata[Stage_Nb].nb_coeffs-1)) PopulateNow = 1; if ((Stage_Nb == 0) && (FlagV) && (c_nb == pndata[Stage_Nb].nb_coeffs-1)) { printf ("\n\nResponse:"); for (k=0;k<=nb_respdata;k++) printf ("\nStage %2d - PZ: %d - PN: %d - DC: %d - DM: %d - Gain: %d", k, respdata[k].pz, respdata[k].pn, respdata[k].dc, respdata[k].dm, respdata[k].gain); } } /******************************************************/ /* Blockette 54 - Response (Coefficients) Information */ /******************************************************/ else if (!strcmp (header, "B054F04")) { sscanf (line, "%*s %*s %*s %*s %d", &Stage_Nb); if (FlagV) printf ("\n\n%s[%d]\t%d", header, Stage_Nb, Stage_Nb); dcdata[Stage_Nb].symmetry = 'A'; respdata[Stage_Nb].dc = 1; if (Stage_Nb > nb_respdata) nb_respdata = Stage_Nb; } else if (!strcmp (header, "B054F05")) { char in_name[127]; char in_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (in_name, token); strcpy (in_desc, line2+(token-line) + strlen (in_name) + 3); in_desc[strlen (in_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, in_name, in_desc); if (FlagP) { id = (-1); strcpy (stmp, in_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, in_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); dcdata[Stage_Nb].unit_in = id; } else { dcdata[Stage_Nb].unit_in = id; } if (FlagV) printf ("\n%s\tunit_in = %d", "DB", dcdata[Stage_Nb].unit_in); } } else if (!strcmp (header, "B054F06")) { char out_name[127]; char out_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (out_name, token); strcpy (out_desc, line2+(token-line) + strlen (out_name) + 3); out_desc[strlen (out_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, out_name, out_desc); if (FlagP) { id = (-1); strcpy (stmp, out_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, out_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); dcdata[Stage_Nb].unit_out = id; } else { dcdata[Stage_Nb].unit_out = id; } if (FlagV) printf ("\n%s\tunit_out = %d", "DB", dcdata[Stage_Nb].unit_out); } } else if (!strcmp (header, "B054F07")) { sscanf (line, "%*s %*s %*s %*s %d", &dcdata[Stage_Nb].nb_nums); if (dcdata[Stage_Nb].nb_nums == 1) dcdata[Stage_Nb].nb_nums = 0; if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, dcdata[Stage_Nb].nb_nums); } else if (!strcmp (header, "B054F10")) { sscanf (line, "%*s %*s %*s %*s %d", &dcdata[Stage_Nb].nb_denoms); if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, dcdata[Stage_Nb].nb_denoms); } else if (!strcmp (header, "B054F08-09")) { int n_nb; sscanf (line, "%*s %d", &n_nb); sscanf (line, "%*s %*s %lf %lf", &dcdata[Stage_Nb].nums[n_nb].value, &dcdata[Stage_Nb].nums[n_nb].error); if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f", header, Stage_Nb, n_nb, dcdata[Stage_Nb].nums[n_nb].value, dcdata[Stage_Nb].nums[n_nb].error); } else if (!strcmp (header, "B054F11-12")) { int d_nb; sscanf (line, "%*s %d", &d_nb); sscanf (line, "%*s %*s %lf %lf", &dcdata[Stage_Nb].denoms[d_nb].value, &dcdata[Stage_Nb].denoms[d_nb].error); if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f", header, Stage_Nb, d_nb, dcdata[Stage_Nb].denoms[d_nb].value, dcdata[Stage_Nb].denoms[d_nb].error); } /*******************************/ /* Blockette 61 - FIR Response */ /*******************************/ else if (!strcmp (header, "B061F03")) { sscanf (line, "%*s %*s %*s %*s %d", &Stage_Nb); if (FlagV) printf ("\n\n%s[%d]\t%d", header, Stage_Nb, Stage_Nb); respdata[Stage_Nb].dc = 1; if (Stage_Nb > nb_respdata) nb_respdata = Stage_Nb; } else if (!strcmp (header, "B061F05")) { sscanf (line, "%*s %*s %*s %c", &dcdata[Stage_Nb].symmetry); if (FlagV) printf ("\n%s[%d]\t%c", header, Stage_Nb, dcdata[Stage_Nb].symmetry); } else if (!strcmp (header, "B061F06")) { char in_name[127]; char in_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (in_name, token); strcpy (in_desc, line2+(token-line) + strlen (in_name) + 3); in_desc[strlen (in_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, in_name, in_desc); if (FlagP) { id = (-1); strcpy (stmp, in_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, in_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); dcdata[Stage_Nb].unit_in = id; } else { dcdata[Stage_Nb].unit_in = id; } if (FlagV) printf ("\n%s\tunit_in = %d", "DB", dcdata[Stage_Nb].unit_in); } } else if (!strcmp (header, "B061F07")) { char out_name[127]; char out_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (out_name, token); strcpy (out_desc, line2+(token-line) + strlen (out_name) + 3); out_desc[strlen (out_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, out_name, out_desc); if (FlagP) { id = (-1); strcpy (stmp, out_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, out_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); dcdata[Stage_Nb].unit_out = id; } else { dcdata[Stage_Nb].unit_out = id; } if (FlagV) printf ("\n%s\tunit_out = %d", "DB", dcdata[Stage_Nb].unit_out); } } else if (!strcmp (header, "B061F08")) { sscanf (line, "%*s %*s %*s %*s %d", &dcdata[Stage_Nb].nb_nums); dcdata[Stage_Nb].nb_denoms = 0; if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, dcdata[Stage_Nb].nb_nums); } else if (!strcmp (header, "B061F09")) { int n_nb; sscanf (line, "%*s %d", &n_nb); sscanf (line, "%*s %*s %lf", &dcdata[Stage_Nb].nums[n_nb].value); dcdata[Stage_Nb].nums[n_nb].error = 0.; if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f", header, Stage_Nb, n_nb, dcdata[Stage_Nb].nums[n_nb].value, dcdata[Stage_Nb].nums[n_nb].error); } /*****************************************/ /* Blockette 60 - Response Reference */ /*****************************************/ else if (!strcmp (header, "B060F04")) { sscanf (line, "%*s %*s %*s %d", &Stage_Nb); if (FlagV) printf ("\n\n%s[%d]\t%d", header, Stage_Nb, Stage_Nb); } /*********************************/ /* Blockette 41 - FIR Dictionary */ /*********************************/ else if (!strcmp (header, "B041F05")) { sscanf (line, "%*s %*s %*s %c", &dcdata[Stage_Nb].symmetry); if (FlagV) printf ("\n%s[%d]\t%c", header, Stage_Nb, dcdata[Stage_Nb].symmetry); respdata[Stage_Nb].dc = 1; if (Stage_Nb > nb_respdata) nb_respdata = Stage_Nb; } else if (!strcmp (header, "B041F06")) { char in_name[127]; char in_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (in_name, token); strcpy (in_desc, line2+(token-line) + strlen (in_name) + 3); in_desc[strlen (in_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, in_name, in_desc); if (FlagP) { id = (-1); strcpy (stmp, in_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, in_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); dcdata[Stage_Nb].unit_in = id; } else { dcdata[Stage_Nb].unit_in = id; } if (FlagV) printf ("\n%s\tunit_in = %d", "DB", dcdata[Stage_Nb].unit_in); } } else if (!strcmp (header, "B041F07")) { char out_name[127]; char out_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (out_name, token); strcpy (out_desc, line2+(token-line) + strlen (out_name) + 3); out_desc[strlen (out_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, out_name, out_desc); if (FlagP) { id = (-1); strcpy (stmp, out_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, out_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); dcdata[Stage_Nb].unit_out = id; } else { dcdata[Stage_Nb].unit_out = id; } if (FlagV) printf ("\n%s\tunit_out = %d", "DB", dcdata[Stage_Nb].unit_out); } } else if (!strcmp (header, "B041F08")) { sscanf (line, "%*s %*s %*s %*s %d", &dcdata[Stage_Nb].nb_nums); dcdata[Stage_Nb].nb_denoms = 0; if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, dcdata[Stage_Nb].nb_nums); } else if (!strcmp (header, "B041F09")) { int n_nb; sscanf (line, "%*s %d", &n_nb); sscanf (line, "%*s %*s %lf", &dcdata[Stage_Nb].nums[n_nb].value); dcdata[Stage_Nb].nums[n_nb].error = 0.; if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f", header, Stage_Nb, n_nb, dcdata[Stage_Nb].nums[n_nb].value, dcdata[Stage_Nb].nums[n_nb].error); } /*****************************************************/ /* Blockette 44 - Response (Coefficients) Dictionary */ /*****************************************************/ else if (!strcmp (header, "B044F06")) { char in_name[127]; char in_desc[127]; dcdata[Stage_Nb].symmetry = 'A'; respdata[Stage_Nb].dc = 1; if (Stage_Nb > nb_respdata) nb_respdata = Stage_Nb; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (in_name, token); strcpy (in_desc, line2+(token-line) + strlen (in_name) + 3); in_desc[strlen (in_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, in_name, in_desc); if (FlagP) { id = (-1); strcpy (stmp, in_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, in_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); dcdata[Stage_Nb].unit_in = id; } else { dcdata[Stage_Nb].unit_in = id; } if (FlagV) printf ("\n%s\tunit_in = %d", "DB", dcdata[Stage_Nb].unit_in); } } else if (!strcmp (header, "B044F07")) { char out_name[127]; char out_desc[127]; strcpy (line2, line); token = strtok_r(line, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); token = strtok_r(NULL, search, &lasts); strcpy (out_name, token); strcpy (out_desc, line2+(token-line) + strlen (out_name) + 3); out_desc[strlen (out_desc) - 1] = '\0'; if (FlagV) printf ("\n%s[%d]\t%s [%s]", header, Stage_Nb, out_name, out_desc); if (FlagP) { id = (-1); strcpy (stmp, out_name); EXEC SQL SELECT id INTO :id:ind FROM D_Unit WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { strcpy (stmp2, out_desc); EXEC SQL SELECT uniseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Unit (id, name, description) VALUES (:id, :stmp, :stmp2); dcdata[Stage_Nb].unit_out = id; } else { dcdata[Stage_Nb].unit_out = id; } if (FlagV) printf ("\n%s\tunit_out = %d", "DB", dcdata[Stage_Nb].unit_out); } } else if (!strcmp (header, "B044F08")) { sscanf (line, "%*s %*s %*s %*s %d", &dcdata[Stage_Nb].nb_nums); if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, dcdata[Stage_Nb].nb_nums); } else if (!strcmp (header, "B044F11")) { sscanf (line, "%*s %*s %*s %*s %d", &dcdata[Stage_Nb].nb_denoms); if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, dcdata[Stage_Nb].nb_denoms); } else if (!strcmp (header, "B044F09-10")) { int n_nb; sscanf (line, "%*s %d", &n_nb); sscanf (line, "%*s %*s %lf %lf", &dcdata[Stage_Nb].nums[n_nb].value, &dcdata[Stage_Nb].nums[n_nb].error); if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f", header, Stage_Nb, n_nb, dcdata[Stage_Nb].nums[n_nb].value, dcdata[Stage_Nb].nums[n_nb].error); } else if (!strcmp (header, "B044F12-13")) { int d_nb; sscanf (line, "%*s %d", &d_nb); sscanf (line, "%*s %*s %lf %lf", &dcdata[Stage_Nb].denoms[d_nb].value, &dcdata[Stage_Nb].denoms[d_nb].error); if (FlagV) printf ("\n%s[%d]\t%d\t%f\t%f", header, Stage_Nb, d_nb, dcdata[Stage_Nb].denoms[d_nb].value, dcdata[Stage_Nb].denoms[d_nb].error); } /*****************************************/ /* Blockette 57 - Decimation Information */ /*****************************************/ else if (!strcmp (header, "B057F03")) { sscanf (line, "%*s %*s %*s %*s %d", &Stage_Nb); if (FlagV) printf ("\n\n%s[%d]\t%d", header, Stage_Nb, Stage_Nb); respdata[Stage_Nb].dm = 1; if (Stage_Nb > nb_respdata) nb_respdata = Stage_Nb; } else if (!strcmp (header, "B057F04")) { sscanf (line, "%*s %*s %*s %*s %lf", &dmdata[Stage_Nb].samprate); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, dmdata[Stage_Nb].samprate); } else if (!strcmp (header, "B057F05")) { sscanf (line, "%*s %*s %*s %d", &dmdata[Stage_Nb].factor); if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, dmdata[Stage_Nb].factor); } else if (!strcmp (header, "B057F06")) { sscanf (line, "%*s %*s %*s %d", &dmdata[Stage_Nb].offset); if (FlagV) printf ("\n%s[%d]\t%d", header, Stage_Nb, dmdata[Stage_Nb].offset); } else if (!strcmp (header, "B057F07")) { sscanf (line, "%*s %*s %*s %*s %lf", &dmdata[Stage_Nb].delay); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, dmdata[Stage_Nb].delay); } else if (!strcmp (header, "B057F08")) { sscanf (line, "%*s %*s %*s %*s %lf", &dmdata[Stage_Nb].correction); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, dmdata[Stage_Nb].correction); } /***********************************/ /* Blockette 58 - Gain Information */ /***********************************/ else if (!strcmp (header, "B058F03")) { sscanf (line, "%*s %*s %*s %*s %d", &Stage_Nb); if (FlagV) printf ("\n\n%s[%d]\t%d", header, Stage_Nb, Stage_Nb); respdata[Stage_Nb].gain = 1; if (Stage_Nb > nb_respdata) nb_respdata = Stage_Nb; } else if (!strcmp (header, "B058F04")) { sscanf (line, "%*s %*s %lf", &gdata[Stage_Nb].sensitivity); if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, gdata[Stage_Nb].sensitivity); } else if (!strcmp (header, "B058F05")) { sscanf (line, "%*s %*s %*s %*s %lf", &gdata[Stage_Nb].frequency); if (gdata[Stage_Nb].frequency < 0) gdata[Stage_Nb].frequency = (-1.)/gdata[Stage_Nb].frequency; if (FlagV) printf ("\n%s[%d]\t%f", header, Stage_Nb, gdata[Stage_Nb].frequency); if ((Stage_Nb == 0) && (FlagP)) PopulateNow = 1; if ((Stage_Nb == 0) && (FlagV)) { printf ("\n\nResponse:"); for (k=0;k<=nb_respdata;k++) printf ("\nStage %2d - PZ: %d - PN: %d - DC: %d - DM: %d - Gain: %d", k, respdata[k].pz, respdata[k].pn, respdata[k].dc, respdata[k].dm, respdata[k].gain); } } /* Populating Database */ if (PopulateNow == 1) { /* Delete Station Information? */ strcpy (net, sdata.net); strcpy (sta, sdata.sta); if ((FlagD == 0) && (DeleteNow == 0)) { DeleteNow = 1; /* Deleting Channel */ EXEC SQL DELETE FROM Channel_Data WHERE sta = :sta AND net = :net; EXEC SQL DELETE FROM Channel_Comment WHERE sta = :sta AND net = :net; EXEC SQL DELETE FROM Polynomial WHERE sta = :sta AND net = :net; EXEC SQL DELETE FROM PN WHERE key IN (SELECT pn_key FROM Polynomial WHERE sta = :sta AND net = :net); EXEC SQL DELETE FROM PN_Data WHERE key IN (SELECT pn_key FROM Polynomial WHERE sta = :sta AND net = :net); EXEC SQL DELETE FROM Coefficients WHERE sta = :sta AND net = :net; EXEC SQL DELETE FROM DM WHERE key IN (SELECT dm_key FROM Decimation WHERE sta = :sta AND net = :net); EXEC SQL DELETE FROM Decimation WHERE sta = :sta AND net = :net; EXEC SQL DELETE FROM PZ WHERE key IN (SELECT pz_key FROM Poles_Zeros WHERE sta = :sta AND net = :net); EXEC SQL DELETE FROM PZ_Data WHERE key IN (SELECT pz_key FROM Poles_Zeros WHERE sta = :sta AND net = :net); EXEC SQL DELETE FROM Poles_Zeros WHERE sta = :sta AND net = :net; EXEC SQL DELETE FROM Sensitivity WHERE sta = :sta AND net = :net; /*EXEC SQL COMMIT;*/ } /* Populating Channel Information */ lat = cdata.lat; lon = cdata.lon; elev = cdata.elev; strcpy (seedchan, cdata.seedchan); strcpy (location, cdata.location); inid = cdata.inid; strcpy (remark, cdata.remark); unit_signal = cdata.unit_signal; unit_calib = cdata.unit_calib; edepth = cdata.edepth; azimuth = cdata.azimuth; dip = cdata.dip; format_id = cdata.format_id; /* Unknown storage format */ if (FlagP && (format_id == (-1))) { id = (-1); strcpy (stmp, "Unknown"); EXEC SQL SELECT id INTO :id:ind FROM D_Format WHERE name = :stmp; if ((id == (-1)) || (ind < 0)) { EXEC SQL SELECT forseq.NEXTVAL INTO :id FROM DUAL; EXEC SQL INSERT INTO D_Format (id, name, family, ms_id) VALUES (:id, :stmp, 0, 0); format_id = id; } else { format_id = id; } if (FlagV) printf ("\n%s\tformat_id = %d", "DB", format_id); } record_length = cdata.record_length; samprate = cdata.samprate; clock_drift = cdata.clock_drift; strcpy (flags, cdata.flags); strcpy (ondate, cdata.ondate); strcpy (offdate, cdata.offdate); EXEC SQL INSERT INTO Channel_Data (net, sta, seedchan, location, ondate, channel, channelsrc, inid, remark, unit_signal, unit_calib, lat, lon, elev, edepth, azimuth, dip, format_id, record_length, samprate, clock_drift, flags, offdate, lddate) VALUES (:net, :sta, :seedchan, :location, :ondate, :seedchan, 'SEED', :inid, :remark, :unit_signal, :unit_calib, :lat, :lon, :elev, :edepth, :azimuth, :dip, :format_id, :record_length, :samprate, :clock_drift, :flags, :offdate, SYSDATE); /* Populating Stages */ for (k=0;k <= nb_respdata;k++) { DBstagenb = k; /* Populating Gain */ if (respdata[k].gain == 1) { sensitivity = gdata[k].sensitivity; frequency = gdata[k].frequency; EXEC SQL INSERT INTO Sensitivity (net, sta, seedchan, location, ondate, stage_seq, channel, channelsrc, offdate, sensitivity, frequency, lddate) VALUES (:net, :sta, :seedchan, :location, :ondate, :DBstagenb, :seedchan, 'SEED', :offdate, :sensitivity, :frequency, SYSDATE); } /* Populating Decimation */ if (respdata[k].dm == 1) { samprate = dmdata[k].samprate; factor = dmdata[k].factor; offset = dmdata[k].offset; delay = dmdata[k].delay; correction = dmdata[k].correction; EXEC SQL SELECT dmseq.NEXTVAL INTO :dm_key FROM DUAL; EXEC SQL INSERT INTO Decimation (net, sta, seedchan, location, ondate, stage_seq, channel, channelsrc, offdate, dm_key, lddate) VALUES (:net, :sta, :seedchan, :location, :ondate, :DBstagenb, :seedchan, 'SEED', :offdate, :dm_key, SYSDATE); EXEC SQL INSERT INTO DM (key, name, samprate, factor, offset, delay, correction, lddate) VALUES (:dm_key, NULL, :samprate, :factor, :offset, :delay, :correction, SYSDATE); } /* Populating Poles & Zeroes */ if (respdata[k].pz == 1) { unit_in = pzdata[k].unit_in; unit_out = pzdata[k].unit_out; AO = pzdata[k].AO; AF = pzdata[k].AF; EXEC SQL SELECT pzseq.NEXTVAL INTO :pz_key FROM DUAL; EXEC SQL INSERT INTO Poles_Zeros (net, sta, seedchan, location, ondate, stage_seq, channel, channelsrc, offdate, pz_key, tf_type, unit_in, unit_out, AO, AF, lddate) VALUES (:net, :sta, :seedchan, :location, :ondate, :DBstagenb, :seedchan, 'SEED', :offdate, :pz_key, 'A', :unit_in, :unit_out, :AO, :AF, SYSDATE); EXEC SQL INSERT INTO PZ (key, name, lddate) VALUES (:pz_key, NULL, SYSDATE); for (i=0;i < pzdata[k].nb_zeros;i++) { objnb = i + 1; r_value = pzdata[k].zeros[i].r_value; r_error = pzdata[k].zeros[i].r_error; i_value = pzdata[k].zeros[i].i_value; i_error = pzdata[k].zeros[i].i_error; EXEC SQL INSERT INTO PZ_Data (key, row_key, type, r_value, r_error, i_value, i_error) VALUES (:pz_key, :objnb, 'Z', :r_value, :r_error, :i_value, :i_error); } for (i=0;i < pzdata[k].nb_poles;i++) { objnb = i + pzdata[k].nb_zeros + 1; r_value = pzdata[k].poles[i].r_value; r_error = pzdata[k].poles[i].r_error; i_value = pzdata[k].poles[i].i_value; i_error = pzdata[k].poles[i].i_error; EXEC SQL INSERT INTO PZ_Data (key, row_key, type, r_value, r_error, i_value, i_error) VALUES (:pz_key, :objnb, 'P', :r_value, :r_error, :i_value, :i_error); } } /* Populating Polynomial */ if (respdata[k].pn == 1) { unit_in = pndata[k].unit_in; unit_out = pndata[k].unit_out; approx_type = pndata[k].approx_type; low_approx = pndata[k].low_approx; high_approx = pndata[k].high_approx; abs_error = pndata[k].abs_error; EXEC SQL SELECT poseq.NEXTVAL INTO :pn_key FROM DUAL; EXEC SQL INSERT INTO Polynomial (net, sta, seedchan, location, ondate, stage_seq, channel, channelsrc, offdate, pn_key, tf_type, unit_in, unit_out, lddate) VALUES (:net, :sta, :seedchan, :location, :ondate, :DBstagenb, :seedchan, 'SEED', :offdate, :pn_key, 'P', :unit_in, :unit_out, SYSDATE); EXEC SQL INSERT INTO PN (key, name, poly_type, lower_bound, upper_bound, max_error, lddate) VALUES (:pn_key, NULL, :approx_type, :low_approx, :high_approx, :abs_error, SYSDATE); for (i=0;i < pndata[k].nb_coeffs;i++) { objnb = i + 1; coeff = pndata[k].coeffs[i].coeff; EXEC SQL INSERT INTO PN_Data (key, row_key, pn_value) VALUES (:pn_key, :objnb, :coeff); } } /* Populating Filter Coefficients */ if (respdata[k].dc == 1) { int total_nbcoeff = 0; int FlagKey = 0; unit_in = dcdata[k].unit_in; unit_out = dcdata[k].unit_out; /* Check if filter is already in database */ dic_key = 0; total_nbcoeff = dcdata[k].nb_nums + dcdata[k].nb_denoms; if (total_nbcoeff > 0) { EXEC SQL DECLARE c_fir CURSOR FOR SELECT DISTINCT key, count(*) FROM DC_Data GROUP BY KEY; EXEC SQL OPEN c_fir; EXEC SQL FETCH c_fir INTO :key, :nb_key; while (sqlca.sqlcode != NOMOREROWS) { /* Comparing Number of Coefficients */ if (nb_key == total_nbcoeff) { FlagKey = 1; /* Comparing Coefficients */ for (i=0; i < dcdata[k].nb_nums;i++) { objnb = i + 1; EXEC SQL SELECT coefficient INTO :fir_coeff:ind FROM DC_Data WHERE key = :key AND row_key = :objnb AND type = 'N'; if ((int)(fir_coeff*10000) != (int)(dcdata[k].nums[i].value*10000)) { if (FlagV == 1) printf ("\nDifferent:[%30.20lf][%30.20lf]", fir_coeff, dcdata[k].nums[i].value); FlagKey = 0; break; } } for (i=0; i < dcdata[k].nb_denoms;i++) { objnb = i + dcdata[k].nb_nums + 1; EXEC SQL SELECT coefficient INTO :fir_coeff:ind FROM DC_Data WHERE key = :key AND row_key = :objnb AND type = 'D'; if (fir_coeff != dcdata[k].denoms[i].value) { FlagKey = 0; break; } } } if (FlagKey == 1) { dic_key = key; break; } EXEC SQL FETCH c_fir INTO :key, :nb_key; } EXEC SQL CLOSE c_fir; if (dic_key == 0) /* Filter not yet in database */ { switch (dcdata[k].symmetry) { case 'C': symmetry = 'E'; break; case 'B': symmetry = 'O'; break; case 'A': symmetry = 'N'; break; default: symmetry = 'N'; } EXEC SQL INSERT INTO Coefficients (net, sta, seedchan, channel, channelsrc, location, ondate, offdate, stage_seq, dc_key, unit_in, unit_out, tf_type, lddate) VALUES (:net, :sta, :seedchan, :seedchan, 'SEED', :location, :ondate, :offdate, :DBstagenb, dcseq.NEXTVAL, :unit_in, :unit_out, 'D', SYSDATE); EXEC SQL INSERT INTO DC (key, name, symmetry, storage, lddate) VALUES (dcseq.CURRVAL, NULL, :symmetry, 'F', SYSDATE); if (dcdata[k].nb_nums > 0) { for (i=0;i < dcdata[k].nb_nums;i++) { objnb = i + 1; fir_coeff = dcdata[k].nums[i].value; fir_error = dcdata[k].nums[i].error; EXEC SQL INSERT INTO DC_Data (key, row_key, type, coefficient, error) VALUES (dcseq.CURRVAL, :objnb, 'N', :fir_coeff, :fir_error); } } if (dcdata[k].nb_denoms > 0) { for (i=0;i < dcdata[k].nb_denoms;i++) { objnb = i + dcdata[k].nb_nums + 1; fir_coeff = dcdata[k].denoms[i].value; fir_error = dcdata[k].denoms[i].error; EXEC SQL INSERT INTO DC_Data (key, row_key, type, coefficient, error) VALUES (dcseq.CURRVAL, :objnb, 'D', :fir_coeff, :fir_error); } } } else /* Filter already in database */ { EXEC SQL INSERT INTO Coefficients (net, sta, seedchan, channel, channelsrc, location, ondate, offdate, stage_seq, dc_key, unit_in, unit_out, tf_type, lddate) VALUES (:net, :sta, :seedchan, :seedchan, 'SEED', :location, :ondate, :offdate, :DBstagenb, :dic_key, :unit_in, :unit_out, 'D', SYSDATE); } } else /* Digitizer Stage */ { EXEC SQL INSERT INTO Coefficients (net, sta, seedchan, channel, channelsrc, location, ondate, offdate, stage_seq, dc_key, unit_in, unit_out, tf_type, lddate) VALUES (:net, :sta, :seedchan, :seedchan, 'SEED', :location, :ondate, :offdate, :DBstagenb, NULL, :unit_in, :unit_out, 'D', SYSDATE); } } } EXEC SQL COMMIT; PopulateNow = 0; if (FlagV) printf ("\n%s\t%s.%s.%s.%s\t%s\t%s Populated", "DB", net, sta, seedchan, location, ondate, offdate); } fgets (line, 255, frdseed); } /* Closing RDSEED file */ fclose (frdseed); /* Disconnect from the database. */ EXEC SQL COMMIT WORK RELEASE; printf ("\n"); exit(0); } /************************************************************************/ /* sql_error: */ /* Handle errors. Exit on any error. */ /************************************************************************/ void sql_error() { char msg[512]; size_t buf_len, msg_len; EXEC SQL WHENEVER SQLERROR CONTINUE; buf_len = sizeof(msg); sqlglm(msg, &buf_len, &msg_len); sqlca.sqlerrm.sqlerrmc[sqlca.sqlerrm.sqlerrml] = '\0'; oraca.orastxt.orastxtc[oraca.orastxt.orastxtl] = '\0'; oraca.orasfnm.orasfnmc[oraca.orasfnm.orasfnml] = '\0'; printf("\n\n%s", sqlca.sqlerrm.sqlerrmc); printf("in \"%s\"\n", oraca.orastxt.orastxtc); printf("on line %d of %s.\n\n", oraca.oraslnr, oraca.orasfnm.orasfnmc); EXEC SQL ROLLBACK WORK RELEASE; exit(1); }