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