def navorbits(navfile, obstimes, observationdata, obslist, prntoidx, gpssatlist, snrfile, s1exist, s2exist, s5exist, up, East, North, emin, emax, recv, dec_rate, log): """ This is for GPS only files ! navfile is nav broadcast ephemeris in RINEX format inputs are rinex info, obstimes, observationdata,prntoidx,gpssatlist various bits about SNR existence snrfile is output name log is for screen outputs - now going to a file """ log.write('reading the ephemeris data \n') ephemdata = g.myreadnav(navfile) if len(ephemdata) == 0: log.write("Empty ephemeris or the file does not exist \n") return # change variable name to save typing a = obstimes if True: log.write('Opening output file for the SNR data \n') fout = open(snrfile, 'w+') K = len(obstimes) log.write('Number of epochs in the RINEX file {0:6.0f} \n '.format(K)) log.write('Decimation rate {0:3.0f} \n'.format(dec_rate)) for i in range(0, K): if np.remainder(i, 1000) == 0: log.write('Epoch {0:6.0f} \n'.format(i)) # sod is seconds of the day sod = 3600 * a[i].hour + 60 * a[i].minute + a[i].second if dec_rate > 0: rem = sod % dec_rate else: rem = 0 if (rem == 0): gweek, gpss = g.kgpsweek(a[i].year, a[i].month, a[i].day, a[i].hour, a[i].minute, a[i].second) for sat in gpssatlist: s1, s2, s5 = readSNRval(s1exist, s2exist, s5exist, observationdata, prntoidx, sat, i) if (s1 > 0): closest = g.myfindephem(gweek, gpss, ephemdata, sat) if len(closest) > 0: satv = satorb_prop(gweek, gpss, sat, recv, closest) r = np.subtract( satv, recv) # satellite minus receiver vector eleA = g.elev_angle(up, r) * 180 / np.pi azimA = g.azimuth_angle(r, East, North) if (eleA >= emin) and (eleA <= emax): fout.write( "{0:3.0f} {1:10.4f} {2:10.4f} {3:10.0f} {4:7.2f} {5:7.2f} {6:7.2f} {7:7.2f} {8:7.2f} \n" .format(sat, eleA, azimA, sod, 0, 0, s1, s2, s5)) fout.close() else: log.write( 'There was some kind of problem with your file, exiting ...\n') print('There was some kind of problem with your file, exiting ...')
def testing_sp3(gpstime, sp3, systemsatlists, obsdata, obstypes, prntoidx, year, month, day, emin, emax, outputfile, up, East, North, recv, dec_rate, log): """ inputs are gpstime( numpy array with week and sow) sp3 is what has been read from the sp3 file columsn are satNu, week, sow, x, y, z (in meters) log is for comments """ checkD = False if dec_rate > 0: checkD = True log.write('You are decimating \n') # epoch at the beginning of the day of your RINEX file gweek0, gpssec0 = g.kgpsweek(year, month, day, 0, 0, 0) ll = 'quadratic' # will store in this variable, then sort it before writing out to a file saveit = np.empty(shape=[0, 11]) fout = open(outputfile, 'w+') NsatT = 0 # make a dictionary for constellation name sname = {} sname['G'] = 'GPS' sname['R'] = 'GLONASS' sname['E'] = 'GALILEO' sname['C'] = 'BEIDOU' for con in ['G', 'E', 'R', 'C']: if con in obstypes: satL = len(systemsatlists[con][:]) satS = 'Processing ' + sname[con] with Bar(satS, max=satL, fill='@', suffix='%(percent)d%%') as bar: log.write( 'Good news - found data for constellation {0:s} \n'.format( con)) obslist = obstypes[con][:] satlist = systemsatlists[con][:] for prn in satlist: bar.next() addon = g.findConstell( con) # 100,200,or 300 for R,E, and C log.write( 'Constellation {0:1s} Satellite {1:2.0f} Addon {2:3.0f} \n' .format(con, prn, addon)) # window out the data for this satellite m = sp3[:, 0] == prn + addon x = sp3[m, 3] if len(x) > 0: sp3_week = sp3[m, 1] sp3_sec = sp3[m, 2] x = sp3[m, 3] y = sp3[m, 4] z = sp3[m, 5] # fit the orbits for this satellite t = sp3_sec iX = interp1d(t, x, ll, bounds_error=False, fill_value='extrapolate') iY = interp1d(t, y, ll, bounds_error=False, fill_value='extrapolate') iZ = interp1d(t, z, ll, bounds_error=False, fill_value='extrapolate') # get the S1 data for this satellite if 'S1' in obslist: s1 = obsdata[con]['S1'][:, prntoidx[con][prn]] # indices when there are no data for this satellite ij = np.isnan(s1) # indices when there are data in the RINEX file - this way you do not compute # orbits unless there are data. not_ij = np.logical_not(ij) Tp = gpstime[ not_ij, 1] # only use the seconds of the week for now s1 = s1[not_ij] #print(s1.shape) emp = np.zeros(shape=[len(s1), 1], dtype=float) # get the rest of the SNR data in a function s2, s5, s6, s7, s8 = extract_snr( prn, con, obslist, obsdata, prntoidx, not_ij, emp) # make sure there are no nan values in s2 or s5 nepochs = len(Tp) for ij in range(0, nepochs): TT = 0 # default value if checkD: TT = Tp[ij] % dec_rate # get the modulus if TT == 0: SatOrb = satorb_prop_sp3( iX, iY, iZ, recv, Tp, ij) r = np.subtract(SatOrb, recv) azimA = g.azimuth_angle(r, East, North) eleA = g.elev_angle(up, r) * 180 / np.pi if (eleA >= emin) and (eleA <= emax): fout.write( "{0:3.0f} {1:10.4f} {2:10.4f} {3:10.0f} {4:7.2f} {5:7.2f} {6:7.2f} {7:7.2f} {8:7.2f} {9:7.2f} {10:7.2f} \n" .format(prn + addon, eleA, azimA, Tp[ij] - gpssec0, 0, float(s6[ij]), s1[ij], float(s2[ij]), float(s5[ij]), float(s6[ij]), float(s7[ij]))) else: log.write( 'This satellite is not in the orbit file. {0:3.0f} \n' .format(prn)) else: log.write('No data for constellation {0:1s} \n'.format(con)) log.write('write SNR data to file \n') fout.close()
def test_sp3(gpstime, sp3, systemsatlists, obsdata, obstypes, prntoidx, year, month, day, emin, emax, outputfile, up, East, North, recv, dec_rate): """ inputs are gpstime( numpy array with week and sow) sp3 is what has been read from the sp3 file columsn are satNu, week, sow, x, y, z (in meters) """ checkD = False if dec_rate > 0: checkD = True print('decimating') # epoch at the beginning of the day of your RINEX file gweek0, gpssec0 = g.kgpsweek(year, month, day, 0, 0, 0) ll = 'quadratic' # will store in this variable, then sort it before writing out to a file saveit = np.empty(shape=[0, 11]) fout = open(outputfile, 'w+') for con in ['G', 'E', 'R', 'C']: if con in obstypes: print('good news - found data for constellation ', con) obslist = obstypes[con][:] satlist = systemsatlists[con][:] print(satlist) for prn in satlist: addon = g.findConstell(con) # 100,200,or 300 for R,E, and C print('Constellation ', con, ' satellite ', prn, addon) # window out the data for this satellite m = sp3[:, 0] == prn + addon x = sp3[m, 3] if len(x) > 0: sp3_week = sp3[m, 1] sp3_sec = sp3[m, 2] x = sp3[m, 3] y = sp3[m, 4] z = sp3[m, 5] # fit the orbits for this satellite t = sp3_sec iX = interp1d(t, x, ll, bounds_error=False, fill_value='extrapolate') iY = interp1d(t, y, ll, bounds_error=False, fill_value='extrapolate') iZ = interp1d(t, z, ll, bounds_error=False, fill_value='extrapolate') # get the S1 data for this satellite if 'S1' in obslist: s1 = obsdata[con]['S1'][:, prntoidx[con][prn]] # indices when there are no data for this satellite ij = np.isnan(s1) # indices when there are data in the RINEX file - this way you do not compute # orbits unless there are data. not_ij = np.logical_not(ij) Tp = gpstime[not_ij, 1] # only use the seconds of the week for now s1 = s1[not_ij] #print(s1.shape) emp = np.zeros(shape=[len(s1), 1], dtype=float) # get the rest of the SNR data in a function s2, s5, s6, s7, s8 = extract_snr(prn, con, obslist, obsdata, prntoidx, not_ij, emp) # make sure there are no nan values in s2 or s5 nepochs = len(Tp) for ij in range(0, nepochs): TT = 0 # default value if checkD: TT = Tp[ij] % dec_rate # get the modulus if TT == 0: SatOrb = satorb_prop_sp3(iX, iY, iZ, recv, Tp, ij) r = np.subtract(SatOrb, recv) azimA = g.azimuth_angle(r, East, North) eleA = g.elev_angle(up, r) * 180 / np.pi if (eleA >= emin) and (eleA <= emax): fout.write( "{0:3.0f} {1:10.4f} {2:10.4f} {3:10.0f} {4:7.2f} {5:7.2f} {6:7.2f} {7:7.2f} {8:7.2f} {9:7.2f} {10:7.2f} \n" .format(prn + addon, eleA, azimA, Tp[ij] - gpssec0, 0, float(s6[ij]), s1[ij], float(s2[ij]), float(s5[ij]), float(s6[ij]), float(s7[ij]))) else: print('this satellite is not in the orbit file.', prn) else: print('no data for constellation ', con) # print('sort by time') # tried saving to variable but it was very slow #ne = np.array([prn,eleA,azimA,Tp[ij],0,0,s1[ij],s2[ij],s5[ij],0,0]) #saveit = np.vstack((saveit,ne)) #i = np.argsort(saveit[:,3]) # apply that sort to variable with shorter name #s = saveit[i,:] print('write to file') fout.close()