Main Page Class Hierarchy Compound List File List Compound Members File Members

# glevt_2_ewevent.c

Go to the documentation of this file.

    00001 /*
    00002  *   THIS FILE IS UNDER RCS - DO NOT MODIFY UNLESS YOU HAVE
    00003  *   CHECKED IT OUT USING THE COMMAND CHECKOUT.
    00004  *
    00005  *    $Id: glevt__2__ewevent_8c-source.html 2161 2006-05-19 16:55:03Z paulf $
    00006  *
    00007  *    Revision history:
    00008  *     $Log$
    00008  *     Revision 1.1  2006/05/19 16:55:02  paulf
    00008  *     first inclusion
    00008  *
    00009  *     Revision 1.3  2002/07/16 20:03:20  davidk
    00010  *     removed //comments
    00011  *
    00012  *     Revision 1.2  2002/07/16 19:48:12  davidk
    00013  *     Changed the code that parses the global event message, so
    00014  *     that it reads the message one line at a time, instead of a fixed
    00015  *     number of bytes (supposing a line) at a time.
    00016  *     By reading exactly 96 bytes for the first line, the code bombed
    00017  *     when reading the message as a text file on NT because of the
    00018  *     0x0d 0x0a (CR LF) 2 character EOL sequence.  The 2 char sequence
    00019  *     caused there to be 1 extra char on each line, and thus the parser
    00020  *     was off by 1 extra char(byte) each line.
    00021  *     The new code extracts one line per time from the message, no matter
    00022  *     the line's length, but then uses the same sscanf() parsing code
    00023  *     as before.
    00024  *
    00025  *     Revision 1.1  2002/06/28 21:06:22  lucky
    00026  *     Initial revision
    00027  *
    00028  *
    00029  *
    00030  */
    00031
    00032
    00033 /*
    00034  * glevt_2_ewevent.c :  Routines to produce and parse global solution
    00035  *   messages of type TYPE_EVENTGLOBAL
    00036  *
    00037  *
    00038  */
    00039
    00040 #include <stdio.h>
    00041 #include <stdlib.h>
    00042 #include <string.h>
    00043 #include <time.h>
    00044 #include <math.h>
    00045 #include <chron3.h>
    00046 #include <earthworm.h>
    00047 #include <rw_glevt.h>
    00048
    00049 /******************************************************************************
    00050  GlEvt2EWEvent() fills EWEvent structure from a string in GlobalEvent format
    00051 ******************************************************************************/
    00052 int     GlEvt2EWEvent (EWEventInfoStruct *pEWEvent, char *pGlEvt, int GlEvtLen)
    00053 {
    00054
    00055         char            line[256];
    00056         char            *tmpstr;
    00057         int                     i;
    00058         GlarcSum        Sum;
    00059         GlarcPhase      Phase;
    00060   char    *pCurrLine, *pEOL;
    00061   int     iLineNum=1;
    00062   int     iLineSize;
    00063
    00064
    00065
    00066
    00067         if ((pEWEvent == NULL) || (pGlEvt == NULL) || (GlEvtLen <= 0))
    00068         {
    00069                 logit ("", "Invalid arguments passed in.\n");
    00070                 return EW_FAILURE;
    00071         }
    00072
    00073
    00074   /* set iLineSize for later user */
    00075   iLineSize = sizeof(line);
    00076
    00077         /* First read the summary line */
    00078
    00079   pCurrLine = pGlEvt;
    00080   pEOL = strchr(pCurrLine,'\n');
    00081   if(!pEOL)
    00082   {
    00083     logit("","Error reading line %d from global event message\n",iLineNum);
    00084     return(EW_FAILURE);
    00085   }
    00086   *pEOL = (char)NULL;
    00087   strncpy(line,pCurrLine,iLineSize);
    00088   pCurrLine = pEOL + 1;
    00089   iLineNum++;
    00090
    00091 /*      strncpy (line, pGlEvt, 78);
    00092         line[78] = '\0';
    00093 */
    00094         if (read_glevt_sumcard (&Sum, line) != EW_SUCCESS)
    00095         {
    00096                 logit ("", "Call to read_glevt_sumcard failed.\n");
    00097                 return EW_FAILURE;
    00098         }
    00099
    00100         /* Initialize the Event structure */
    00101         if (InitEWEvent (pEWEvent) != EW_SUCCESS)
    00102         {
    00103                 logit ("", "Call to InitEWEvent failed.\n");
    00104                 return EW_FAILURE;
    00105         }
    00106
    00107
    00108         /*
    00109          * Set magnitude values to 0 as we don't have any info on it here
    00110          */
    00111         pEWEvent->iNumMags = 0;
    00112         pEWEvent->iPrefMag = -1;
    00113         pEWEvent->iMd = -1;
    00114         pEWEvent->iML = -1;
    00115
    00116         pEWEvent->iNumChans = Sum.nph;
    00117         pEWEvent->Event.idEvent = Sum.qid;
    00118         pEWEvent->PrefOrigin.tOrigin = Sum.ot;
    00119         pEWEvent->PrefOrigin.dLat = Sum.lat;
    00120         pEWEvent->PrefOrigin.dLon = Sum.lon;
    00121         pEWEvent->PrefOrigin.dDepth = Sum.z;
    00122         pEWEvent->PrefOrigin.dRms = Sum.rms;
    00123         pEWEvent->PrefOrigin.dDmin = (float) Sum.dmin;
    00124         pEWEvent->PrefOrigin.iGap = Sum.gap;
    00125
    00126         pEWEvent->PrefOrigin.iAssocRd = Sum.nph;
    00127         pEWEvent->PrefOrigin.iAssocPh = Sum.nph;
    00128         pEWEvent->PrefOrigin.iUsedRd = Sum.nph;
    00129         pEWEvent->PrefOrigin.iUsedPh = Sum.nph;
    00130
    00131         pEWEvent->PrefOrigin.BindToEvent = TRUE;
    00132         pEWEvent->PrefOrigin.SetPreferred = TRUE;
    00133
    00134
    00135         if (pEWEvent->iNumChans > pEWEvent->iNumAllocChans)
    00136         {
    00137                 free (pEWEvent->pChanInfo);
    00138
    00139                 if ((pEWEvent->pChanInfo = (EWChannelDataStruct *) malloc
    00140                                                 (pEWEvent->iNumChans * sizeof (EWChannelDataStruct))) == NULL)
    00141                 {
    00142                         logit ("", "Could not malloc %d channel info structs\n", pEWEvent->iNumChans);
    00143                         return EW_FAILURE;
    00144                 }
    00145
    00146                 pEWEvent->iNumAllocChans = pEWEvent->iNumChans;
    00147
    00148                 for (i = 0; i < pEWEvent->iNumAllocChans; i++)
    00149                 {
    00150                         InitEWChan(&pEWEvent->pChanInfo[i]);
    00151                 }
    00152         }
    00153
    00154
    00155         for (i = 0; i < pEWEvent->iNumChans; i++)
    00156         {
    00157
    00158     pEOL = strchr(pCurrLine,'\n');
    00159     if(!pEOL)
    00160     {
    00161       logit("","Error reading line %d from global event message\n",iLineNum);
    00162       return(EW_FAILURE);
    00163     }
    00164     *pEOL = (char)NULL;
    00165     strncpy(line,pCurrLine,iLineSize);
    00166     pCurrLine = pEOL + 1;
    00167     iLineNum++;
    00168
    00169
    00170
    00171
    00172                 if (read_glevt_phasecard (&Phase, line) != EW_SUCCESS)
    00173                 {
    00174                         logit ("", "Call to read_glevt_phasecard failed.\n");
    00175                         return EW_FAILURE;
    00176                 }
    00177
    00178                 strcpy (pEWEvent->pChanInfo[i].Station.Sta, Phase.sta);
    00179                 strcpy (pEWEvent->pChanInfo[i].Station.Comp, Phase.comp);
    00180                 strcpy (pEWEvent->pChanInfo[i].Station.Net, Phase.net);
    00181
    00182     /* the location should be null, not a single <SPACE> DK 071002 */
    00183                 strcpy (pEWEvent->pChanInfo[i].Station.Loc, "");
    00184
    00185
    00186                 /* Arrival pick info */
    00187                 pEWEvent->pChanInfo[i].iNumArrivals = 1;
    00188                 pEWEvent->pChanInfo[i].Arrivals[0].cMotion  = Phase.fm;
    00189
    00190                 if (Phase.wt == 3)
    00191                         pEWEvent->pChanInfo[i].Arrivals[0].dSigma  = 0.08;
    00192                 else if (Phase.wt == 2)
    00193                         pEWEvent->pChanInfo[i].Arrivals[0].dSigma  = 0.05;
    00194                 else if (Phase.wt == 1)
    00195                         pEWEvent->pChanInfo[i].Arrivals[0].dSigma  = 0.03;
    00196                 else if (Phase.wt == 0)
    00197                         pEWEvent->pChanInfo[i].Arrivals[0].dSigma  = 0.02;
    00198                 else
    00199                         pEWEvent->pChanInfo[i].Arrivals[0].dSigma  = 99.99;
    00200
    00201
    00202                 pEWEvent->pChanInfo[i].Arrivals[0].tCalcPhase  = Phase.at;
    00203                 strcpy (pEWEvent->pChanInfo[i].Arrivals[0].szCalcPhase, Phase.phase);
    00204                 pEWEvent->pChanInfo[i].Arrivals[0].tObsPhase  = Phase.at;
    00205                 strcpy (pEWEvent->pChanInfo[i].Arrivals[0].szObsPhase, Phase.phase);
    00206                 strcpy (pEWEvent->pChanInfo[i].Arrivals[0].szExtSource, Phase.pickAuthor);
    00207                 strcpy (pEWEvent->pChanInfo[i].Arrivals[0].szExternalPickID, Phase.ExtPickID);
    00208
    00209
    00210                 /* Amplitude information */
    00211                 pEWEvent->pChanInfo[i].iNumStaMags = 1;
    00212                 pEWEvent->pChanInfo[i].Stamags[0].StaMagUnion.PeakAmp.dAmp1 = (float) Phase.pAmp;
    00213                 pEWEvent->pChanInfo[i].Stamags[0].StaMagUnion.PeakAmp.tAmp1 = Phase.ampTime;
    00214                 pEWEvent->pChanInfo[i].Stamags[0].StaMagUnion.PeakAmp.dAmpPeriod1 = (float) Phase.period;
    00215
    00216                 pEWEvent->pChanInfo[i].Stamags[0].StaMagUnion.PeakAmp.dAmp2 = (float) MAG_NULL;
    00217                 pEWEvent->pChanInfo[i].Stamags[0].StaMagUnion.PeakAmp.tAmp2 = (float) MAG_NULL;
    00218                 pEWEvent->pChanInfo[i].Stamags[0].StaMagUnion.PeakAmp.dAmpPeriod2 = (float) MAG_NULL;
    00219
    00220
    00221                 tmpstr = tmpstr + 97;
    00222         }
    00223
    00224         return EW_SUCCESS;
    00225 }
    00226
    00227
    00228
    00229 /*********************************************************************************/
    00230 /* read_glevt_sumcard() reads the first line of a global arc message             */
    00231 /*                               Fills information in the GlarcSum structure                     */
    00232 /*********************************************************************************/
    00233 int     read_glevt_sumcard (GlarcSum *pSum, char *sumcard )
    00234 {
    00235         char    otime[16], lat[16], lon[16], depth[16], version[16];
    00236         char    nph[16], gap[16], dmin[16], rms[16], evtid[16];
    00237         int             narg;
    00238
    00239         if ((pSum == NULL) || (sumcard == NULL))
    00240         {
    00241                 logit ("", "Invalid arguments passed in.\n");
    00242                 return EW_FAILURE;
    00243         }
    00244
    00245         /* Here is what it should look like:
    00246
    00247                 20020603191112.39  52.4299 -120.0782  399.32   9    0     0  3.18       1139 1
    00248                 20020430185616.12 -12.1426 -112.8750  200.00  14    0     0  1.39         14 1
    00249                 01234567890123456789012345678901234567890123456789012345678901234567890123456789
    00250         */
    00251
    00252         narg =  sscanf (sumcard, "%s %s %s %s %s %s %s %s %s %s",
    00253                                                 otime, lat, lon, depth,  nph,
    00254                                                 gap, dmin, rms, evtid, version);
    00255
    00256         pSum->nph = atoi (nph);
    00257         pSum->qid = atoi (evtid);
    00258         epochsec17 (&pSum->ot, otime);
    00259         pSum->lat = (float) atof (lat);
    00260         pSum->lon = (float) atof (lon);
    00261         pSum->z = (float) atof (depth);
    00262         pSum->rms = (float) atof (rms);
    00263         pSum->dmin = atoi (dmin);
    00264         pSum->gap = atoi (gap);
    00265
    00266         return EW_SUCCESS;
    00267 }
    00268
    00269
    00270 /*********************************************************************************/
    00271 /* read_glevt_phasecard() reads the phase lines of a global arc message          */
    00272 /*                               Fills information in the GlarcPhase structure                   */
    00273 /*********************************************************************************/
    00274 int     read_glevt_phasecard (GlarcPhase *pPhase, char *phasecard )
    00275 {
    00276         char    atime[32], sta[16], comp[16], net[16], fmwt[16], label[16];
    00277         char    amp[16], period[16], amptime[32], author[32], pickID[32];
    00278         int             narg;
    00279
    00280         if ((pPhase == NULL) || (phasecard == NULL))
    00281         {
    00282                 logit ("", "Invalid arguments passed in.\n");
    00283                 return EW_FAILURE;
    00284         }
    00285
    00286
    00287         /* Here is what it should look like:
    00288
    00289                 CMN  VHZ NC U1 xxxxxxxxxP 19950831183134.90      275   0.2 20020531195801.29\n
    00290                 CMN  VHZ NC U1 xxxxxxxxxP 19950831183134.90 xxxxauthor ExtPckID      275   0.2 20020531195801.29\n
    00291                 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
    00292         */
    00293
    00294
    00295         narg =  sscanf (phasecard, "%s %s %s %s %s %s %s %s %s %s %s %s",
    00296                                                 sta, comp, net, fmwt, label, atime, author, pickID, amp, period, amptime);
    00297
    00298
    00299         strcpy (pPhase->sta, sta);
    00300         strcpy (pPhase->comp, comp);
    00301         strcpy (pPhase->net, net);
    00302         strcpy (pPhase->phase, label);
    00303         strcpy (pPhase->pickAuthor, author);
    00304         strcpy (pPhase->ExtPickID, pickID);
    00305         epochsec17 (&pPhase->at, atime);
    00306
    00307         epochsec17 (&pPhase->ampTime, amptime);
    00308         pPhase->pAmp = (long) atoi (amp);
    00309         pPhase->period = atof (period);
    00310
    00311         if (strlen (fmwt) == 2)
    00312         {
    00313                 pPhase->fm = fmwt[0];
    00314                 pPhase->wt = fmwt[1] - '0';
    00315         }
    00316         else
    00317         {
    00318                 pPhase->fm = ' ';
    00319                 pPhase->wt = fmwt[0] - '0';
    00320         }
    00321
    00322         return EW_SUCCESS;
    00323 }
    00324
    00325
    00326
    00327
    00328 /*******************************************************************************************/
    00329 /* write_glevt_phasecard() builds a character-string phase-card from GlarcPhase structure  */
    00330 /*******************************************************************************************/
    00331 int     write_glevt_phasecard (GlarcPhase *pPhs, char *phscard )
    00332 {
    00333         char   line[120];
    00334         char   timestr[18];
    00335         char   timestr2[18];
    00336
    00337         if ((pPhs == NULL) || (phscard == NULL))
    00338         {
    00339                 logit ("", "Invalid arguments passed in.\n");
    00340                 return EW_FAILURE;
    00341         }
    00342
    00343 /*----------------------------------------------------------------------
    00344 Sample format phase card
    00345 CMN  VHZ NC U1 xxxxxxxxxP 19950831183134.90      275   0.2 20020531195801.29\n
    00346 CMN  VHZ NC U1 xxxxxxxxxP 19950831183134.90 xxxxauthor ExtPckID      275   0.2 20020531195801.29\n
    00347 0123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
    00348
    00349 -------------------------------------------------------------------------*/
    00350
    00351 /***  Convert julian seconds character string  ***/
    00352                 date17( pPhs->at, timestr );
    00353
    00354                 if (pPhs->ampTime <= 0)
    00355                         strcpy (timestr2, "            -1.00");
    00356                 else
    00357                         date17( pPhs->ampTime, timestr2 );
    00358
    00359
    00360 /***  Write all info to an global phase card  ***/
    00361                 sprintf( line,     "%-5s ",      pPhs->sta);
    00362                 sprintf( line+5,   "%3s ",       pPhs->comp);
    00363                 sprintf( line+9,   "%2s ",       pPhs->net);
    00364                 sprintf( line+12,  "%c",         pPhs->fm);
    00365                 sprintf( line+13,  "%c ",        pPhs->wt);
    00366                 sprintf( line+15,  "%10s ",      pPhs->phase);
    00367                 sprintf( line+26,  "%17s ",      timestr);
    00368                 sprintf( line+44,  "%10s ",  pPhs->pickAuthor);
    00369                 sprintf( line+55,  "%8s ",   pPhs->ExtPickID);
    00370                 sprintf( line+64,  "%8d ",       pPhs->pAmp);
    00371                 sprintf( line+73,  "%5.1f ", pPhs->period);
    00372                 sprintf( line+79,  "%17s\n\0",   timestr2);
    00373
    00374                 strcpy( phscard, line );
    00375                 return (EW_SUCCESS);
    00376 }
    00377
    00378 /*********************************************************************************/
    00379 /* write_glevt_sumcard() builds a summary card for global arc message            */
    00380 /*                               from the RPT_HYP structure                                                                      */
    00381 /*********************************************************************************/
    00382 int     write_glevt_sumcard (GlarcSum *pSum, char *sumcard )
    00383 {
    00384                 char   line[109];
    00385                 char   timestr[18];
    00386
    00387         if ((pSum == NULL) || (sumcard == NULL))
    00388         {
    00389                 logit ("", "Invalid arguments passed in.\n");
    00390                 return EW_FAILURE;
    00391         }
    00392
    00393 /*----------------------------------------------------------------------------------------
    00394 Proposed Global hypocenter built below. Base format is Hypo71; event id from Glass
    00395   (78 chars, including newline):
    00396 0123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
    00397 20020501181423.40  54.4589 -108.6209  100.00  11    0     0  7.03         36 1
    00398 20020430185616.12 -12.1426 -112.8750  200.00  14    0     0  1.39         14 1
    00399 ------------------------------------------------------------------------------------------*/
    00400
    00401 /***  Convert julian seconds character string  ***/
    00402                 date17( pSum->ot, timestr );
    00403
    00404 /***  Write all info to an Earthworm hypocenter card  ***/
    00405                 sprintf( line,    "%17s ",       timestr          );
    00406                 sprintf( line+18, "%8.4f ",      pSum->lat        );
    00407                 sprintf( line+27, "%9.4f ",      pSum->lon        );
    00408                 sprintf( line+37, "%7.2f ",      pSum->z          );
    00409                 sprintf( line+45, "%3d ",        pSum->nph  );
    00410                 sprintf( line+49, "%4.0f ",      pSum->gap  );
    00411                 sprintf( line+54, "%5.0f ",      pSum->dmin );
    00412                 sprintf( line+60, "%5.2f ",      pSum->rms  );
    00413                 sprintf( line+66, "%10ld ",      pSum->qid   );
    00414                 sprintf( line+77, "1\n\0");
    00415
    00416                 strcpy( sumcard, line );
    00417
    00418                 return (EW_SUCCESS);
    00419 }
    00420
    00421
    00422