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

Revision 4204, 6.4 KB checked in by scott, 10 years ago (diff)

Proposed fix for Solaris build of ew_spectra_io

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