Viewing contents of file '../idllib/contrib/buie/gpsproc.pro'
;+
; NAME: 
;   gpsproc
; PURPOSE: 
;   Process and average a single day GPS record.
; DESCRIPTION:
; CATEGORY:
;   Miscellaneous
; CALLING SEQUENCE:
; INPUTS:
; OPTIONAL INPUT PARAMETERS:
; KEYWORD INPUT PARAMETERS:
; OUTPUTS:
; KEYWORD OUTPUT PARAMETERS:
; COMMON BLOCKS:
; SIDE EFFECTS:
; RESTRICTIONS:
; PROCEDURE:
; MODIFICATION HISTORY:
;   94/08/15 - Written by Marc W. Buie, Lowell Observatory
;-
pro gpsproc,file,title=title

on_ioerror,bad

if not exists(file) then begin
   print,'GPSPROC: File ',file,' not found.  Skipping.'
endif else begin

   openr,unit,file,/get_lun

   line=''

;Read through and count the number of lines.
   nobs=0
   while(not eof(unit)) do begin
      readf,unit,line,format='(a1)'
      nobs=nobs+1
   endwhile

   bl=strarr(30)
   for i=0,29 do bl[i]=' '

   ;Rewind file.
   point_lun,unit,0

   jd    = dblarr(nobs)
   tqual = intarr(nobs)
   nsats = intarr(nobs)
   lat   = dblarr(nobs)
   lon   = dblarr(nobs)
   alt   = fltarr(nobs)

   jd0  = 0.0d0
   lat0 = 0.0d0
   lon0 = 0.0d0

   for i=0,nobs-1 do begin
      readf,unit,jd0,tqual0,nsats0,lat0,lon0,alt0, $
         format='(f13.5,2(1x,i1),2(1x,f11.8),1x,f6.1)'
      jd[i]    = jd0
      tqual[i] = tqual0
      nsats[i] = nsats0
      lat[i]   = lat0
      lon[i]   = lon0
      alt[i]   = alt0
   endfor
   free_lun,unit

   jd0 = double(long(jd[0] - 0.5d0))+0.5d0
   caldatm,jd0,year,mon,day,hr,mn,sc

   time = float(jd - jd0)*24.0d0
   meanerr,lat,lat*0+1,meanlat,latsigm,latsig
   meanerr,lon,lon*0+1,meanlon,lonsigm,lonsig
   meanerr,alt,alt*0+1,meanalt,altsigm,altsig

   dlat = (lat - meanlat)*180.0d0/!dpi*3600.0d0
   dlon = (lon - meanlon)*180.0d0/!dpi*3600.0d0
   dalt =  alt - meanalt

   bins = 0.1
   hislat=float(histogram(dlat,binsize=bins))/n_elements(dlat)*100
   xlat=findgen(n_elements(hislat))*bins+min(dlat)
   hislon=float(histogram(dlon,binsize=bins))/n_elements(dlon)*100
   xlon=findgen(n_elements(hislon))*bins+min(dlon)
   bins = 10.0
   hisalt=float(histogram(dalt,binsize=bins))/n_elements(dalt)*100
   xalt=findgen(n_elements(hisalt))*bins+min(dalt)

;   p_multi=!p.multi

   dx1=0.08  ; left, left border
   dx2=0.00  ; left, right border
   dy1=0.00  ; left, bottom border
   dy2=0.00  ; left, top border
   top=0.04
   plot,time,dlat,ytit='Latitude offset (")',xr=[0,24], $
      position=[0.0+dx1,0.75+dy1-top,0.75-dx2,1.0-dy2-top],xticknam=bl
   plot,time,dlon,ytit='Longitude offset (")',xr=[0,24], $
      position=[0.0+dx1,0.5+dy1-top,0.75-dx2,0.75-dy2-top],/noerase,xticknam=bl
   plot,time,dalt,ytit='Altitude offset (m)',xr=[0,24], $
      position=[0.0+dx1,0.25+dy1-top,0.75-dx2,0.5-dy2-top],/noerase,xticknam=bl
   plot,time,nsats,yr=[0,6.5],xtit='UT hours',ytit='# sat & Q', $
      xr=[0,24],position=[0.0+dx1,0.0+dy1+0.12-top,0.75-dx2,0.25-dy2-top], $
      /noerase, yminor=1
   oplot,time,tqual,psym=3

   dx1=0.0   ; left, left border
   dx2=0.01  ; left, right border
   plot,hislat,xlat,psym=10,/noerase,yticknam=bl,yr=minmax(dlat), $
      position=[0.75+dx1,0.75+dy1-top,1.0-dx2,1.0-dy2-top],xticknam=bl
   plot,hislon,xlon,psym=10,/noerase,yticknam=bl,yr=minmax(dlon), $
      position=[0.75+dx1,0.5+dy1-top,1.0-dx2,0.75-dy2-top],xticknam=bl
   plot,hisalt,xalt,psym=10,/noerase,yticknam=bl,yr=minmax(dalt), $
      position=[0.75+dx1,0.25+dy1-top,1.0-dx2,0.5-dy2-top],xticknam=bl

   meanlat = meanlat * 180.0d0 / !dpi
   latsig  = latsig  * 180.0d0 / !dpi
   meanlon = meanlon * 180.0d0 / !dpi
   lonsig  = lonsig  * 180.0d0 / !dpi

   if Keyword_set(title) then xyouts,0.755,0.18,/normal,title

	if meanlat ge 0. then sign='+' else sign=' -'
	mlatd=fix(abs(meanlat))
	tmp=(abs(meanlat)-mlatd)*60.0
	mlatm=fix(tmp)
	mlats=(tmp-mlatm)*60.0
	xyouts,0.755,0.16,/normal,charsize=0.75,'Lat '+sign+ $
      string(mlatd,format='(i2.2)')+':'+ $
      string(mlatm,format='(i2.2)')+':'+ $
      string(mlats,format='(f6.3)')+' +/- '+ $
	   string(latsig*3600,format='(f3.1)')+'" '+ $
      string(latsig/360.0*2*!pi*6378.164*1000.0,format='(f4.1)')+' m'

	if meanlon ge 0. then sign='W' else sign='E'
	mlond=fix(abs(meanlon))
	tmp=(abs(meanlon)-mlond)*60.0
	mlonm=fix(tmp)
	mlons=(tmp-mlonm)*60.0
	xyouts,0.755,0.14,/normal,charsize=0.75,'Lon '+sign+ $
      string(mlond,format='(i3.3)')+':'+ $
      string(mlonm,format='(i2.2)')+':'+ $
      string(mlons,format='(f6.3)')+' +/- '+ $
	   string(lonsig*3600,format='(f3.1)')+'" '+ $
      string(lonsig/360.0*2*!pi*6378.164*1000.0,format='(f4.1)')+' m'

	xyouts,0.755,0.12,/normal,charsize=0.75,'Alt '+ $
      string(meanalt,format='(f7.1)')+' m'+ $
	   string(altsig,format='(f7.1)')+' m'

   xyouts,0.755,0.10,/normal,charsize=0.75,'# obs '+ $
      string(n_elements(dalt),format='(i3)')+ $
      string(fix(float(n_elements(dalt))/720.0*100),format='(i3)')+ $
      '% possible'

   jdstr,jd0,110,str
   xyouts,0.755,0.06,/normal,str

;   !p.multi=p_multi

endelse

return

bad:

print,'bad i/o'
free_lun,unit

end