1#!/usr/bin/env python
2"""
3An example of generating new rinex file (both v2,11 and v3.02.
4First an existing v2.11 file is read in just so we don't have
5to make up all the data that goes into the new files.
6"""
7
8import gpstk
9
10ifn = gpstk.getPathData() + '/test_input_rinex2_obs_RinexObsFile.06o'
11header, data = gpstk.readRinex3Obs(ifn, strict=True)
12
13new_header = gpstk.Rinex3ObsHeader()
14
15new_header.fileType = header.fileType
16
17new_header.fileProgram = header.fileProgram
18new_header.date = header.date
19new_header.fileAgency = header.fileAgency
20new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validRunBy
21
22new_header.markerName = header.markerName
23new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validMarkerName
24
25new_header.observer = header.observer
26new_header.agency = header.agency
27new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validObserver
28
29new_header.recNo = header.recNo
30new_header.recType = header.recType
31new_header.recVers = header.recVers
32new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validReceiver
33
34new_header.antNo = header.antNo
35new_header.antType = header.antType
36new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validAntennaType
37
38newAntPosition = gpstk.Triple(header.antennaPosition[0],header.antennaPosition[1],header.antennaPosition[2])
39new_header.antennaPosition = newAntPosition
40new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validAntennaPosition
41
42newAntDelta = gpstk.Triple(header.antennaDeltaHEN[0],header.antennaDeltaHEN[1],header.antennaDeltaHEN[2])
43new_header.antennaDeltaHEN = newAntDelta
44new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validAntennaDeltaHEN
45
46for rinObsType in header.mapObsTypes:
47    #print "Found obs-type:{}".format(rinObsType)
48    newObsIds = []
49    for rinObsId in header.mapObsTypes[rinObsType]:
50        #print "Found obs-id:{}".format(str(rinObsId))
51        #print " --type={} code={} band={}".format(rinObsId.type, rinObsId.code, rinObsId.band)
52        newObsId = gpstk.RinexObsID(str(rinObsId))
53        newObsIds.append(newObsId)
54    new_header.mapObsTypes[rinObsType] = tuple(newObsIds)
55new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validNumObs
56
57for rin_obs_id in header.R2ObsTypes:
58    #print "Found obs-id:{}".format(rin_obs_id)
59    new_header.R2ObsTypes.append(rin_obs_id)
60new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validNumObs
61
62# This creates a new CivilTime object that we can populate
63new_header.firstObs = gpstk.CivilTime()
64new_header.firstObs.year = header.firstObs.year
65new_header.firstObs.month = header.firstObs.month
66new_header.firstObs.day = header.firstObs.day
67new_header.firstObs.hour = header.firstObs.hour
68new_header.firstObs.minute = header.firstObs.minute
69new_header.firstObs.second = header.firstObs.second
70new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validFirstTime
71
72new_header.markerNumber = header.markerNumber
73new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validMarkerNumber
74
75new_header.interval = header.interval
76new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validInterval
77
78
79for comment in header.commentList:
80    new_header.commentList.append(comment)
81new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validComment
82new_header.validEoH = True
83
84# As of Sep 2016, the following aren't working correctly so force
85# these to be set. Since the input to this program is RINEX v2.11,
86# what should happen is that the Rinex3ObsHeader should fill in default values
87# for the SystemPhaseShift and not require the two glonass since there is no
88# glonass data in the source
89new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validSystemPhaseShift
90new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validGlonassSlotFreqNo
91new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validGlonassCodPhsBias
92
93print new_header
94
95new_data = []
96# Now we loop through all the epochs and process the data for each one
97for d in data:
98
99    # This creates a new CommonTime object with the system set to GPS.
100    timec = gpstk.CommonTime(gpstk.TimeSystem(gpstk.TimeSystem.GPS))
101    # This creates a new CommonTime object with the system set to GPS.
102    mjd = int(d.time.getDays())
103    sod = float(d.time.getSecondOfDay())
104    timec.set(mjd, sod, gpstk.TimeSystem(gpstk.TimeSystem.GPS))
105
106    # Assign values to a new Rinex Obs Data object
107    nd = gpstk.Rinex3ObsData()
108    nd.time = timec
109    nd.auxHeader = d.auxHeader
110    nd.clockOffset = d.clockOffset
111    nd.epochFlag= d.epochFlag
112    nd.numSVs = d.numSVs
113
114    for satkey in d.obs.keys():
115        newSatKey = gpstk.RinexSatID(satkey.toString())
116        satObss = d.obs[newSatKey]
117        # satObss is a tuple of  RinexDatum
118        newSatObss = []
119        for satObs in satObss:
120            #print "{} {} {} {}".format(satkey.toString(), satObs.data, satObs.lli, satObs.ssi)
121            newSatObs = gpstk.RinexDatum()
122            newSatObs.data = satObs.data
123            newSatObs.lli = satObs.lli
124            newSatObs.ssi = satObs.ssi
125            newSatObss.append(newSatObs)
126
127        nd.obs[newSatKey] = tuple(newSatObss)
128
129    #print "O{}".format(d)
130    #print "S{}".format(nd)
131    new_data.append(nd)
132
133new_header.version = 3.02
134new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validVersion
135ofn = "example6_v302.o"
136gpstk.writeRinex3Obs(ofn, new_header, new_data)
137print "Wrote output file: {}".format(ofn)
138
139# The following doesn't work because the v2 translation map needs to be filled in from
140# the v3 translation tables
141new_header.version = 2.11
142new_header.valid = new_header.valid | gpstk.Rinex3ObsHeader.validVersion
143ofn = "example6_v211.o"
144gpstk.writeRinex3Obs(ofn, new_header, new_data)
145print "Wrote output file: {}".format(ofn)
146