source: trunk/src/seismic_processing/glass/src/modules/Network/station.cpp @ 3212

Revision 3212, 7.8 KB checked in by paulf, 12 years ago (diff)

sync from hydra_proj circa Oct 2007

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#include <windows.h>
2#include <string.h>
3#include <math.h>
4#include <stdio.h>
5#include "comfile.h"
6#include "station.h"
7#include <Debug.h>
8extern "C" {
9#include "utility.h"
10}
11
12int __cdecl CompareStationSCNLs(const void *elem1, const void *elem2);
13
14int __cdecl CompareStationSCNLs(const void *elem1, const void *elem2)
15{
16  SCNL * p1;
17  SCNL * p2;
18  int rc;
19
20  p1 = &((STATION *) elem1)->Name;
21  p2 = &((STATION *) elem2)->Name;
22
23  if(!(rc = strncmp(p1->szSta, p2->szSta, sizeof(p1->szSta))))
24    if(!(rc = strncmp(p1->szNet, p2->szNet, sizeof(p1->szNet))))
25      if(!(rc = strncmp(p1->szLoc, p2->szLoc, sizeof(p1->szLoc))))
26        rc = strncmp(p1->szComp, p2->szComp, sizeof(p1->szComp));
27  return(rc);
28}
29
30
31// Class used for extracting information from DBMS.
32
33CStation::CStation() {
34        nSta = 0;
35}
36
37CStation::~CStation() {
38}
39
40//--------------------------------------------------------------------------Load
41// Load station list in earthworm format
42bool CStation::Load() {
43        return LoadHypoInverse("glass_station.lis");
44}
45
46//--------------------------------------------------------------------------Load
47// Load station list in hypoellipse format
48bool CStation::LoadHypoEllipse(const char *name) 
49{
50        STATION Station;
51        char crd[120];
52        char sta[20];
53        double dlat;
54        double dlon;
55        double delev;
56        double deg;
57        double dmn;
58        char c;
59        int i;
60        int n;
61
62        FILE *fs;
63 
64        if(!(fs=fopen(name, "r")))
65  {
66    CDebug::Log(DEBUG_MAJOR_ERROR,"CStation::Hypo():  ERROR! Could not load the station list (hypoellipse-format) from file(%s)!\n",
67                name);
68    exit(-1);
69                return false;
70  }
71        while(true) {
72                if(!fgets(crd, sizeof(crd)-1, fs))
73                        break;
74                n = 0;
75                for(i=0; i<20; i++) {
76                        if(crd[i] == ' ')
77                                break;
78                        sta[n++] = crd[i];
79                }
80                sta[n] = 0;
81                crd[17] = 0;
82                deg = atof(&crd[15]);
83                c = crd[25];
84                crd[25] = 0;
85                dmn = atof(&crd[18]);
86                dlat = deg + dmn/60.0;
87                if(c == 'S')
88                        dlat = -dlat;
89                crd[29] = 0;
90                deg = atof(&crd[26]);
91                c = crd[37];
92                crd[37] = 0;
93                dmn = atof(&crd[30]);
94                dlon = deg + dmn/60.0;
95                if(c == 'W')
96                        dlon = -dlon;
97                crd[42] = 0;
98                delev = atof(&crd[38]);
99                memset(&Station, 0, sizeof(Station));
100                strncpy(Station.Name.szSta, sta, sizeof(Station.Name.szSta) - 1);
101                Station.dLat = dlat;
102                Station.dLon = dlon;
103                Station.dElev = delev;
104
105                Put(&Station);
106  }  //end while(true)
107        fclose(fs);
108  fs=NULL;
109
110  SortStationList();
111
112        return true;
113}
114
115//--------------------------------------------------------------------------Load
116// Load station list in earthworm format
117bool CStation::LoadHypoInverse(const char *name) 
118{
119
120
121  /* Column positions of various fields from hypoinv_sta.format file */
122#define STA_POS 1
123#define NET_POS 7
124#define CHAN_POS 11
125#define LATD_POS 16
126#define LATM_POS 19
127#define NS_POS   26
128#define LOND_POS 27
129#define LONM_POS 31
130#define EW_POS   38
131#define ELEV_POS 39
132#define PERD_POS 43
133#define LOC_POS 81
134#define QUAL_POS 84
135#define STA_LEN 5
136#define NET_LEN 2
137#define CHAN_LEN 3
138#define LOC_LEN 2
139#define LATD_LEN 2
140#define LATM_LEN 7
141#define LOND_LEN 3
142#define LONM_LEN 7
143#define ELEV_LEN 4
144#define PERD_LEN 3
145#define QUAL_LEN 5
146 
147#define LINE_BUFFER_SIZE 200
148#define NULL_LOC_CODE "--"
149 
150 
151  FILE * fs;
152  STATION Station;
153  char pBuffer[LINE_BUFFER_SIZE];
154  int i,done=0,retval;
155  char szTemp[20];
156  char flag;
157  char *pTempChr;
158
159//  DebugBreak();
160 
161  if(!(fs=fopen(name, "r")))
162  {
163    CDebug::Log(DEBUG_MAJOR_ERROR,"CStation::Load():  ERROR! Could not load the station list (hypoinverse-format) from file(%s)!\n",
164      name);
165    exit(-1);
166    return false;
167  }
168 
169  for(i=0; ; i++)
170  {
171    memset(&Station,0,sizeof(Station));
172    retval=(int)fgets(pBuffer,LINE_BUFFER_SIZE,fs);
173   
174    if (retval == 0)
175    {
176      if(feof(fs))
177      {
178        break;
179      }
180      else
181      {
182        logit("et","Error %d occured while reading from line %d of file %s\n",
183              ferror(fs),i+1, name);
184        return false;
185      }
186    }
187   
188    if(strlen(pBuffer) < PERD_POS)
189      continue;
190   
191    strncpy(Station.Name.szSta,&pBuffer[STA_POS-1],STA_LEN);
192    Station.Name.szSta[STA_LEN]=0;
193
194    /* ignore lines that start with # */
195    if(Station.Name.szSta[0] == '#')
196      continue;
197
198    strncpy(Station.Name.szNet,&pBuffer[NET_POS-1],NET_LEN);
199    Station.Name.szNet[NET_LEN]=0;
200    strncpy(Station.Name.szComp,&pBuffer[CHAN_POS-1],CHAN_LEN);
201    Station.Name.szComp[CHAN_LEN]=0;
202
203    if(strlen(pBuffer) < (LOC_POS + LOC_LEN - 1))
204    {
205      strncpy(Station.Name.szLoc, NULL_LOC_CODE, LOC_LEN);
206      Station.Name.szComp[LOC_LEN]=0;
207    }
208    strncpy(Station.Name.szLoc,&pBuffer[LOC_POS-1],LOC_LEN);
209    Station.Name.szLoc[LOC_LEN]=0;
210   
211    /* Fix station code */
212    if ((pTempChr = strchr (Station.Name.szSta, ' ')) != NULL)
213      *pTempChr = '\0';
214   
215    /* Fix component code */
216    if ((pTempChr = strchr (Station.Name.szComp, ' ')) != NULL)
217      *pTempChr = '\0';
218   
219    /* Fix network code */
220    if ((pTempChr = strchr (Station.Name.szNet, ' ')) != NULL)
221      *pTempChr = '\0';
222   
223    /* Fix location code */
224    if ((pTempChr = strchr (Station.Name.szLoc, ' ')) != NULL)
225      *pTempChr = '\0';
226    if(Station.Name.szLoc[0] == 0x00)
227    strncpy(Station.Name.szLoc,NULL_LOC_CODE,LOC_LEN);
228    Station.Name.szLoc[LOC_LEN]=0;
229
230    /* Latitude: degrees converted from degrees + minutes */
231    /*  flag: 'N','n',' ' for North (+) latitude; 'S','s' for South (-) */
232    strncpy(szTemp,&pBuffer[LATD_POS-1],LATD_LEN);
233    szTemp[LATD_LEN]=0;
234    Station.dLat = (float) atof(szTemp);
235    strncpy(szTemp,&pBuffer[LATM_POS-1],LATM_LEN);
236    szTemp[LATM_LEN]=0;
237    Station.dLat += (float)(atof(szTemp)/60.0);
238    flag = pBuffer[NS_POS-1]; 
239    if( flag=='S' || flag=='s' ) Station.dLat *= -1.0;
240       
241    /* Longitude: degrees converted from degrees + minutes */
242    /*  flag: 'W','w',' ' for West (-) longitude; 'E','e' for East (+) */
243    strncpy(szTemp,&pBuffer[LOND_POS-1],LOND_LEN);
244    szTemp[LOND_LEN]=0;
245    Station.dLon = (float) atof(szTemp);
246    strncpy(szTemp,&pBuffer[LONM_POS-1],LONM_LEN);
247    szTemp[LONM_LEN]=0;
248    Station.dLon += (float)(atof(szTemp)/60.0);
249    flag = pBuffer[EW_POS-1]; 
250    if( flag==' ' || flag=='W' || flag=='w' ) Station.dLon *= -1.0;
251   
252    /* Elevation: meters */
253    strncpy(szTemp,&pBuffer[ELEV_POS-1],ELEV_LEN);
254    szTemp[ELEV_LEN]=0;
255    Station.dElev=(float)atof(szTemp);
256   
257    /* Station: quality */
258    strncpy(szTemp,&pBuffer[QUAL_POS-1],QUAL_LEN);
259    szTemp[QUAL_LEN]=0;
260    Station.dQual=atof(szTemp);
261   
262    if(Station.dQual > MIN_STATION_QUAL_THRESHOLD)
263    {
264      /* Add it to list */
265                  if(!Put(&Station))
266      {
267        CDebug::Log(DEBUG_MINOR_ERROR,"CStation::Load():  ERROR adding station (%s %s %s %s) at line %d of file %s!\n",
268                    Station.Name.szSta, Station.Name.szComp, Station.Name.szNet, Station.Name.szLoc, i+1, name);
269      }
270    }
271
272  }  //end for(each line in file)
273 
274 
275  fclose(fs);
276  fs=NULL;
277
278  SortStationList();
279  return true;
280}  // CStation::LoadHypoInverse()
281
282
283bool CStation::Put(const STATION * pStation)
284{
285
286        if(nSta < MAXSTA) 
287  {
288    memcpy(&Sta[nSta], pStation, sizeof(STATION));
289                nSta++;
290                return true;
291        }
292        return false;
293}
294
295const STATION * CStation::Get(const SCNL *name)
296{
297  int i;
298  STATION Station;
299  STATION * pSta;
300
301  memset(&Station, 0, sizeof(Station));
302  memcpy(&Station.Name, name, sizeof(SCNL));
303
304  pSta = (STATION *)bsearch(&Station, Sta, nSta, sizeof(STATION), CompareStationSCNLs);
305  return(pSta);
306  /************** replaced by bsearch call *****************************
307        for(i=0; i<nSta; i++) {
308                if(CompareStationSCNLs(&Station, &Sta[i]) > 0)
309      continue;
310   
311    if(CompareStationSCNLs(&Station, &Sta[i]) == 0)
312      return(&Sta[i]);
313    else
314      return(NULL);
315  }
316  return(NULL);
317  **********************************************************/
318}
319
320
321bool CStation::GetList(STATION ** pStaList, int* pnLen)
322{
323  *pStaList = Sta;
324  *pnLen = nSta;
325  return(true);
326}
327
328void CStation::SortStationList()
329{
330  qsort((void *)Sta, nSta, sizeof(STATION), CompareStationSCNLs);
331}
332
Note: See TracBrowser for help on using the repository browser.