source: trunk/src/libsrc/util/ew_spectra_io.c @ 4194

Revision 4194, 6.2 KB checked in by scott, 10 years ago (diff)

Ewspectra, compute_spectra & sniffspectra

Line 
1/******************************************************************************
2 *
3 *      File:                   ew_spectra_io.c
4 *
5 *      Function:               Definitions for writing spectra data to a file or a ring
6 *
7 *      Author(s):              Scott Hunter, ISTI
8 *
9 *      Source:                 Started anew.
10 *
11 *      Notes:                 
12 *
13 *      Change History:
14 *                      4/26/11 Started source
15 *     
16 *****************************************************************************/
17
18#include <stdlib.h>
19#include <math.h>
20#include <string.h>
21#include "ew_spectra_io.h"
22
23/***********************************************************************
24 * EWSConvertTime ()                                                   *
25 ***********************************************************************/
26int EWSConvertTime (char *pStart, double *start)
27{
28    char                strDate[30];
29    struct tm   tmDate;
30   
31    if (pStart == NULL) {
32        logit ("e", "Invalid parameters passed to EWSConvertTime.\n");
33        return EW_FAILURE;
34    }
35   
36    strncpy (strDate, pStart, 14);
37    strDate[14] = '\0';
38        tmDate.tm_sec   = atoi( strDate+12 );
39        strDate[12] = '\0';
40        tmDate.tm_min   = atoi( strDate+10 );
41        strDate[10] = '\0';
42        tmDate.tm_hour  = atoi( strDate+8 );
43        strDate[ 8] = '\0';
44        tmDate.tm_mday  = atoi( strDate+6 );
45        strDate[ 6] = '\0';
46        tmDate.tm_mon   = atoi( strDate+4 )-1;
47        strDate[ 4] = '\0';
48        tmDate.tm_year  = atoi( strDate ) - 1900;
49    tmDate.tm_wday = tmDate.tm_yday = tmDate.tm_isdst = tmDate.tm_gmtoff = 0;
50    tmDate.tm_zone = "GMT";
51
52    *start = (double)timegm( &tmDate );
53   
54    return EW_SUCCESS;
55}
56
57/***********************************************************************
58 * EWSUnConvertTime ()                                                 *
59 ***********************************************************************/
60int EWSUnConvertTime (char *pStart, double start)
61{
62    char                strDate[30];
63    struct tm   tmDate;
64    time_t              start_time;
65   
66    if (pStart == NULL) {
67        logit ("e", "Invalid parameters passed to EWSUnConvertTime.\n");
68        return EW_FAILURE;
69    }
70   
71    start_time = (int)start;
72    gmtime_r( &start_time, &tmDate );
73    sprintf( pStart, "%04d%02d%02d%02d%02d%02d", 
74        tmDate.tm_year+1900, tmDate.tm_mon+1, tmDate.tm_mday,
75        tmDate.tm_hour, tmDate.tm_min, tmDate.tm_sec );
76    pStart[14] = 0;
77   
78    return EW_SUCCESS;
79}
80
81
82/***********************************************************************
83 * write_spectra_to_ring ()                                            *
84 ***********************************************************************/
85int write_spectra_to_ring( EW_SPECTRA_HEADER *ewsh, double *data,
86                char* Argv0, SHM_INFO *region, MSG_LOGO *logo )
87 {
88        double ndata = ewsh->nsamp;
89        int bufsize = sizeof(EW_SPECTRA_HEADER) + sizeof(double) * (ndata+2);
90        char *buffer = malloc( bufsize );
91        if ( buffer == NULL ) {
92                logit("e", "%s: Failed to allocate memory for writing spectra to ring\n", Argv0 );
93                return 1;
94        }
95       
96        memcpy( buffer, ewsh, sizeof(EW_SPECTRA_HEADER) );
97        memcpy( buffer+sizeof(EW_SPECTRA_HEADER), data, bufsize-sizeof(EW_SPECTRA_HEADER) );
98        GetType( "TYPE_SPECTRA_DATA", &(logo->type) );
99        if( tport_putmsg( region, logo, bufsize, buffer ) != PUT_OK ) {
100                logit("et", "%s:  Error writing spectra to ring.\n",
101                          Argv0 );
102                return 1;
103        }
104        free( buffer );
105        return 0;
106 }
107 
108static void fill_EWSH_from_EWTS( EW_TIME_SERIES *ewspec, EW_SPECTRA_HEADER *ewsh )
109{
110        memcpy( ewsh->sta,  ewspec->trh2x.sta,  TRACE2_STA_LEN );
111        memcpy( ewsh->net,  ewspec->trh2x.net,  TRACE2_NET_LEN );
112        memcpy( ewsh->chan, ewspec->trh2x.chan, TRACE2_CHAN_LEN );
113        memcpy( ewsh->loc,  ewspec->trh2x.loc,  TRACE2_LOC_LEN );
114        ewsh->delta_frequency = 1.0/ewspec->trh2x.samprate;
115        ewsh->nsamp = ewspec->dataCount;
116        ewsh->starttime = ewspec->trh2x.starttime;
117#if defined (_SPARC)
118        strcpy( ewsh->units, ewspec->dataType == EWTS_TYPE_COMPLEX ? "C" : "A" );
119#elif defined (_INTEL)
120        strcpy( ewsh->units, ewspec->dataType == EWTS_TYPE_COMPLEX ? "c" : "a" );
121#else
122#error "_INTEL or _SPARC must be set before compiling"
123#endif
124}
125
126
127 /***********************************************************************
128 * write_EWTS_as_spectra_to_ring ()                                     *
129 ************************************************************************/
130int write_EWTS_as_spectra_to_ring( EW_TIME_SERIES *ewspec, char* Argv0, SHM_INFO *region, MSG_LOGO *logo )
131{
132        EW_SPECTRA_HEADER ewsh;
133        fill_EWSH_from_EWTS( ewspec, &ewsh );
134        return write_spectra_to_ring( &ewsh, ewspec->data, Argv0, region, logo );
135}
136 
137/***********************************************************************
138 * strcat_header ()                                                    *
139 ***********************************************************************/
140static char *strcat_header( EW_SPECTRA_HEADER *ewsh, char *data ) 
141{       
142        char date[100];
143        EWSUnConvertTime( date, ewsh->starttime );     
144        sprintf( data, "nsamp=%15d\tdelta_freq=%15.3lf starttime=%s\n", 
145                ewsh->nsamp, ewsh->delta_frequency, date );
146        data += strlen(data);
147        return data;
148}
149
150/***********************************************************************
151 * write_pectra_to_file ()                                             *
152 ***********************************************************************/
153int write_spectra_to_file( EW_SPECTRA_HEADER *ewsh, double *data,
154        char* Argv0, FILE *fp )
155{
156        double delta = ewsh->delta_frequency;
157        double nyquist= 1.0/(2.0*delta);
158        double ndata = ewsh->nsamp;
159        double scale = nyquist/ndata;
160        char buffer[200], *bufPos;
161        int i;
162       
163        bufPos = strcat_header( ewsh, buffer );
164        *bufPos = 0;
165        if ( tolower(ewsh->units[0])=='c' )
166                fprintf( fp, "%s%15s\t%15s\t%15s\n", buffer, "Frequency", "Real", "Imaginary" );
167        else if ( tolower(ewsh->units[0])=='a' )
168                fprintf( fp, "%s%15s\t%15s\t%15s\n", buffer, "Frequency", "Amplitude", "Phase" );
169        else {
170                logit( "e", "%s: invalid type or spectra for writing ('%s')\n", ewsh->units );
171                return 1;
172        }
173        for ( i=0; i<=ndata*2; i+=2 )
174          fprintf( fp, "%15.3lf\t%15.3lf\t%15.3lf\n", i*scale/2, data[i], data[i+1] );
175        fflush( fp );
176        return 0;
177 }
178 
179/***********************************************************************
180 * write_EWTS_as_spectra_to_file ()                                    *
181 ***********************************************************************/
182int write_EWTS_as_spectra_to_file( EW_TIME_SERIES *ewspec, char* Argv0, FILE *fp )
183{
184        EW_SPECTRA_HEADER ewsh;
185        fill_EWSH_from_EWTS( ewspec, &ewsh );
186        return write_spectra_to_file( &ewsh, ewspec->data, Argv0, fp );
187}
188       
Note: See TracBrowser for help on using the repository browser.