Source code for pyacs.sol.discontinuity

import datetime
import pyacs.lib.astrotime as AstroTime
import pyacs.lib.timeperiod as TimePeriod
import pyacs.sol.soln as Soln

[docs] class Discontinuities: """Reads an IGS Discontinuity file""" def __init__ (self): self.lsite={} self.lsite_offsets_dates={}
[docs] def read_igs_discontinuity(self, discontinuities_file): import pyacs.message.message as MESSAGE import pyacs.message.verbose_message as VERBOSE import pyacs.message.error as ERROR import pyacs.message.warning as WARNING import pyacs.message.debug_message as DEBUG fdiscon=open(discontinuities_file,'r') VERBOSE("Reading %s " % discontinuities_file) ok=False for line in fdiscon: # skip comment if len(line.strip()) < 2: continue if line[0:23] == '+SOLUTION/DISCONTINUITY':ok=True;continue if line[0:23] == '-SOLUTION/DISCONTINUITY':ok=False;break if not ok:continue #print line code=line[1:5] if not code in self.lsite:self.lsite[code]=Soln.Soln() try: pt=line[7:8] soln=int(line[9:13]) technique=line[14:15] str_date_start=line[16:28] str_date_end=line[29:41] type_discon=line[42:43] except: ERROR("Reading %s" % discontinuities_file) ERROR("Could not decipher %s" % line,exit=True) #print (":%s:%s:%04d:%s:%s:%s:%s:\n" % (code,pt,soln,technique,str_date_start,str_date_end,type_discon)) if type_discon=='V':continue # Start date if str_date_start == '00:000:00000' or str_date_start == '00:999:00000': year=1980;doy=1;sec=1; else: (yr,doy,sec)=list(map(int,str_date_start.split(':'))) if yr>80:year=1900+yr else:year=2000+yr if sec > 86399:sec=86399 (mday,month)=AstroTime.dayno2cal(doy,year) hour = sec // 3600 left = sec % 3600 minute = left // 60 second = left % 60 #print (code,year, month, mday,hour,minute,second) st_date=datetime.datetime(year, month, mday,hour,minute,second) if str_date_start != '00:000:00000': uts=24.0*hour+60.0*minute+second offset_date=AstroTime.dayno2decyear(doy,year,ut=AstroTime.uts2ut(uts)) if code in self.lsite_offsets_dates: if offset_date not in self.lsite_offsets_dates[code]: self.lsite_offsets_dates[code].append(offset_date) else: self.lsite_offsets_dates[code]=[offset_date] # End date if str_date_end == '00:000:00000': year=2100;doy=1;sec=1; else: (yr,doy,sec)=list(map(int,str_date_end.split(':'))) if yr>80:year=1900+yr else:year=2000+yr if sec > 86399:sec=86399 (mday,month)=AstroTime.dayno2cal(doy,year) hour=sec // 3600 left=sec % 3600 minute=left // 60 second=left % 60 #print (code,year, month, mday,hour,minute,second) end_date=datetime.datetime(year, month, mday,hour,minute,second) if str_date_end != '00:000:00000': uts=24.0*hour+60.0*minute+second offset_date=AstroTime.dayno2decyear(doy,year,ut=AstroTime.uts2ut(uts)) if code in self.lsite_offsets_dates: if offset_date not in self.lsite_offsets_dates[code]: self.lsite_offsets_dates[code].append(offset_date) else: self.lsite_offsets_dates[code]=[offset_date] period=TimePeriod.TimePeriod(start_time=st_date,end_time=end_date) #print code,soln,period self.lsite[code].append_period(soln,period)
[docs] def display(self, code=None): import pyacs.message.message as MESSAGE import pyacs.message.verbose_message as VERBOSE import pyacs.message.error as ERROR import pyacs.message.warning as WARNING import pyacs.message.debug_message as DEBUG if not code: for site in sorted (self.lsite.keys()): lsoln=self.lsite[site].periods for soln in sorted(lsoln.keys()): str=lsoln[soln].get_info() VERBOSE(("site:%s soln #%s %s" % (site,soln,str))) else: lsoln=self.lsite[code].periods #print lsoln for soln in sorted(lsoln.keys()): str=lsoln[soln].get_info() VERBOSE(("site:%s soln #%s %s" % (code,soln,str)))
[docs] def get_soln(self,code,date): """Return the soln code for the given site and date. Parameters ---------- code : str Site code. date : float Date in decimal year. Returns ------- str or int Soln code if found, else 0. """ if not code in self.lsite:return(0) else: lsoln=self.lsite[code].periods for soln in sorted(lsoln.keys()): period=lsoln[soln] if period.has_in(date):return(soln) return(0)