def gnssir_guts(station, year, doy, snr_type, extension, lsp): """ my attempt to separate the inputs to the code and the guts of the code inputs are station name, year, day of year (integers) snr_type is an integer (99, 66, etc). lsp is a json """ # make sure environment variables exist. set to current directory if not g.check_environ_variables() e1 = lsp['e1'] e2 = lsp['e2'] minH = lsp['minH'] maxH = lsp['maxH'] ediff = lsp['ediff'] NReg = lsp['NReg'] PkNoise = lsp['PkNoise'] azval = lsp['azval'] naz = int(len(azval) / 2) freqs = lsp['freqs'] reqAmp = lsp['reqAmp'] plot_screen = lsp['plt_screen'] onesat = lsp['onesat'] screenstats = lsp['screenstats'] azval = lsp['azval'] d = g.doy2ymd(year, doy) month = d.month day = d.day dmjd, fracS = g.mjd(year, month, day, 0, 0, 0) xdir = os.environ['REFL_CODE'] ann = g.make_nav_dirs(year) # make sure directories are there for orbits g.result_directories(station, year, extension) # make directories for the LSP results # this defines the minimum number of points in an arc. This depends entirely on the sampling # rate for the receiver, so you should not assume this value is relevant to your case. minNumPts = 20 p, T, irefr = set_refraction_params(station, dmjd, lsp) # only doing one day at a time for now - but have started defining the needed inputs for using it twoDays = False obsfile2 = '' # dummy value for name of file for the day before, when we get to that fname, resultExist = g.LSPresult_name(station, year, doy, extension) if (resultExist): print('Results already exist on disk') if (lsp['overwriteResults'] == False) & (resultExist == True): allGood = 0 print( '>>>>> The result file exists for this day and you have selected the do not overwrite option' ) sys.exit() print('go ahead and access SNR data - first define SNR filename') obsfile, obsfileCmp, snre = g.define_and_xz_snr(station, year, doy, snr_type) print(obsfile, 'snrexistence', snre, ' and ', snr_type) if (not snre) and (not lsp['seekRinex']): print( 'SNR file does not exist and you have set the seekRinex variable to False' ) print('Use rinex2snr.py to make SNR files') sys.exit() if (not snre) and lsp['seekRinex']: print('SNR file does not exist. I will try to make a GPS only file.') rate = 'low' dec_rate = 0 orbtype = 'nav' g.quick_rinex_snrC(year, doy, station, snr_type, orbtype, rate, dec_rate) allGood, sat, ele, azi, t, edot, s1, s2, s5, s6, s7, s8, snrE = snr.read_snr_multiday( obsfile, obsfile2, twoDays) snr.compress_snr_files(lsp['wantCompression'], obsfile, obsfile2, twoDays) # SNR exists - go ahead if (allGood == 1): ele = apply_refraction_corr(lsp, ele, p, T) fout, frej = g.open_outputfile(station, year, doy, extension) # main loop a given list of frequencies total_arcs = 0 ct = 0 for f in freqs: if plot_screen: fig, (ax1, ax2) = plt.subplots(2, 1) rj = 0 gj = 0 print('**** looking at frequency ', f, ' ReqAmp', reqAmp[ct], ' doy ', doy, 'YYYY/MM/DD', year, month, day) # get the list of satellites for this frequency if onesat == None: satlist = g.find_satlist(f, snrE) else: satlist = onesat if (int(satlist[0]) < 100) and (f > 100): print('wrong satellite name for this frequency') for satNu in satlist: #if screenstats: print('Satellite', satNu) for a in range(naz): az1 = azval[(a * 2)] az2 = azval[(a * 2 + 1)] x, y, Nv, cf, UTCtime, avgAzim, avgEdot, Edot2, delT = g.window_data( s1, s2, s5, s6, s7, s8, sat, ele, azi, t, edot, f, az1, az2, e1, e2, satNu, lsp['polyV'], lsp['pele'], screenstats) MJD = g.getMJD(year, month, day, UTCtime) if Nv > minNumPts: maxF, maxAmp, eminObs, emaxObs, riseSet, px, pz = g.strip_compute( x, y, cf, maxH, lsp['desiredP'], lsp['polyV'], minH) nij = pz[(px > NReg[0]) & (px < NReg[1])] Noise = 0 if (len(nij) > 0): Noise = np.mean(nij) iAzim = int(avgAzim) okPk = True if abs(maxF - minH) < 0.10: # peak too close to min value okPk = False print( 'found a peak too close to the edge of the restricted RH region' ) if okPk & (delT < lsp['delTmax']) & ( eminObs < (e1 + ediff)) & (emaxObs > (e2 - ediff)) & ( maxAmp > reqAmp[ct]) & (maxAmp / Noise > PkNoise): fout.write( " {0:4.0f} {1:3.0f} {2:6.3f} {3:3.0f} {4:6.3f} {5:6.2f} {6:6.2f} {7:6.2f} {8:6.2f} {9:4.0f} {10:3.0f} {11:2.0f} {12:8.5f} {13:6.2f} {14:7.2f} {15:12.6f} {16:1.0f} \n" .format(year, doy, maxF, satNu, UTCtime, avgAzim, maxAmp, eminObs, emaxObs, Nv, f, riseSet, Edot2, maxAmp / Noise, delT, MJD, irefr)) gj += 1 if screenstats: T = g.nicerTime(UTCtime) print( 'SUCCESS Azimuth {0:3.0f} Sat {1:3.0f} RH {2:7.3f} m PkNoise {3:4.1f} Amp {4:4.1f} Fr{5:3.0f} UTC {6:5s} DT {7:3.0f} ' .format(iAzim, satNu, maxF, maxAmp / Noise, maxAmp, f, T, round(delT))) if plot_screen: local_update_plot(x, y, px, pz, ax1, ax2) else: rj += 1 if screenstats: print( 'FAILED QC for Azimuth {0:.1f} Satellite {1:2.0f} UTC {2:5.2f}' .format(iAzim, satNu, UTCtime)) g.write_QC_fails(delT, lsp['delTmax'], eminObs, emaxObs, e1, e2, ediff, maxAmp, Noise, PkNoise, reqAmp[ct]) print( '=================================================================================' ) print(' Frequency ', f, ' good arcs:', gj, ' rejected arcs:', rj) print( '=================================================================================' ) total_arcs = gj + total_arcs # close the output files ct += 1 #'Yes' if fruit == 'Apple' else 'No' if plot_screen: plot2screen(station, f, ax1, ax2, lsp['pltname']) fout.close()
def conv2snr(year, doy, station, option, orbtype, receiverrate, dec_rate, archive, fortran): """ inputs: year and day of year (integers) and station name option is for the snr creation ??? integer or character? orbtype can be nav or sp3. if the former, then gpsSNR is used. if the later, then gnssSNR what are receiverrate and dec_rate defaults? this assumes you follow my definitions for where things go, i.e. REFL_CODE and ORBITS it currently checks Unavco, SOPAC, and SONEL. I should add CDDIS author: kristine m. larson 19may20, added decimation 19sep12, I got tired of code crashing for files > 20 observables. I am thus using teqc 20apr15, xz compression added but also try to streamline it. 20jul10, added arvchive setting. default is 'all' """ # define directory for the conversion executables print('receiver rate:', receiverrate) print('decimation rate: ', dec_rate) print('archive: ', archive) print('use fortran: ', fortran) print('orbtype: ', orbtype) exedir = os.environ['EXE'] snrname_full, snrname_compressed, snre = g.define_and_xz_snr( station, year, doy, option) if (snre == True): print('snrfile already exists:', snrname_full) else: print('the snrfile does not exist ', snrname_full) d = g.doy2ymd(year, doy) month = d.month day = d.day # new function to do the whole orbit thing foundit, f, orbdir, snrexe = g.get_orbits_setexe( year, month, day, orbtype, fortran) # if you have the orbit file, you can get the rinex file if foundit: # now you can look for a rinex file rinexfile, rinexfiled = g.rinex_name(station, year, month, day) # This goes to find the rinex file. I am changing it to allow # an archive preference g.go_get_rinex_flex(station, year, month, day, receiverrate, archive) # define booleans oexist = os.path.isfile(orbdir + '/' + f) == True rexist = os.path.isfile(rinexfile) == True exc = exedir + '/teqc' texist = os.path.isfile(exc) == True if rexist: if texist and fortran: # only do this for the older version print( 'teqc executable exists, will use to eliminate unnecessary observables' ) foutname = 'tmp.' + rinexfile fout = open(foutname, 'w') subprocess.call([ exc, '-O.obs', 'S1+S2+S5+S6+S7+S8', '-n_GLONASS', '27', rinexfile ], stdout=fout) fout.close() # store it in the original rinex filename subprocess.call(['rm', '-f', rinexfile]) subprocess.call(['mv', '-f', foutname, rinexfile]) # decimate this new rinex file if (rexist and dec_rate > 0): print('decimate using teqc ', dec_rate, ' seconds') rinexout = rinexfile + '.tmp' cdec = str(dec_rate) fout = open(rinexout, 'w') subprocess.call([exc, '-O.dec', cdec, rinexfile], stdout=fout) fout.close() # needed? status = subprocess.call( ['mv', '-f', rinexout, rinexfile]) # orbits and rinexfile exist if (oexist and rexist): snrname = g.snr_name(station, year, month, day, option) orbfile = orbdir + '/' + f if fortran: print('Using fortran for translation') try: subprocess.call( [snrexe, rinexfile, snrname, orbfile, str(option)]) status = subprocess.call(['rm', '-f', rinexfile]) status = subprocess.call(['xz', orbfile]) except: print('no success making SNR file') else: print('Do not use fortran to make ', snrname) print('decimating will be done here instead of using teqc') rnx2snr(rinexfile, orbfile, snrname, option, year, month, day, dec_rate) # remove the rinex file subprocess.call(['rm', '-f', rinexfile]) # check to make sure the conversion worked if os.path.isfile(snrname): # make sure it exists and is non-zero size before moving it if (os.stat(snrname).st_size == 0): print( 'you created a zero file size which could mean a lot of things' ) print( 'bad exe, bad snr option, do not really have the orbit file' ) status = subprocess.call(['rm', '-f', snrname]) else: print( 'a SNR file was created and it is non-zero in length' ) print(snrname_full) g.store_snrfile(snrname, year, station) else: print( 'Either the rinex file or orbit file does not exist, so there is nothing to convert' ) return True
def conv2snr(year, doy, station, option, orbtype, receiverrate, dec_rate, archive, fortran, translator): """ inputs: year and day of year (integers) and station name option is for the snr creation ??? integer or character? orbtype can be nav or sp3. if the former, then gpsSNR is used. if the later, then gnssSNR what are receiverrate and dec_rate defaults? this assumes you follow my definitions for where things go, i.e. REFL_CODE and ORBITS it currently checks Unavco, SOPAC, and SONEL. I should add CDDIS author: kristine m. larson 19may20, added decimation 19sep12, I got tired of code crashing for files > 20 observables. I am thus using teqc 20apr15, xz compression added but also try to streamline it. 20jul10, added arvchive setting. default is 'all' """ # define directory for the conversion executables if not os.path.isdir('logs'): subprocess.call(['mkdir', 'logs']) logname = 'logs/' + station + '.txt' log = open(logname, 'w+') log.write("Receiver rate: {0:5s} \n".format(receiverrate)) log.write("Decimation rate: {0:3.0f} \n".format(dec_rate)) log.write("Archive: {0:10s} \n".format(archive)) log.write("Orbits : {0:10s} \n".format(orbtype)) exedir = os.environ['EXE'] snrname_full, snrname_compressed, snre = g.define_and_xz_snr( station, year, doy, option) if (snre == True): log.write( "The snrfile already exists: {0:50s} \n".format(snrname_full)) print("The snrfile already exists: ", snrname_full) else: log.write( "The snrfile does not exist: {0:50s} \n".format(snrname_full)) d = g.doy2ymd(year, doy) month = d.month day = d.day # new function to do the whole orbit thing foundit, f, orbdir, snrexe = g.get_orbits_setexe( year, month, day, orbtype, fortran) # if you have the orbit file, you can get the rinex file if foundit: # now you can look for a rinex file rinexfile, rinexfiled = g.rinex_name(station, year, month, day) # This goes to find the rinex file. I am changing it to allow # an archive preference g.go_get_rinex_flex(station, year, month, day, receiverrate, archive) # define booleans for various files oexist = os.path.isfile(orbdir + '/' + f) == True rexist = os.path.isfile(rinexfile) == True exc = exedir + '/teqc' texist = os.path.isfile(exc) == True if rexist: # decimate using teqc if (texist) and (fortran) and (dec_rate > 0): log.write( "Decimating using teqc: {0:3.0f} seconds \n".format( dec_rate)) log.write( 'Unfortunately teqc removes Beidou data. Eventually I will remove this. \n' ) rinexout = rinexfile + '.tmp' cdec = str(dec_rate) fout = open(rinexout, 'w') subprocess.call([exc, '-O.dec', cdec, rinexfile], stdout=fout) fout.close() # needed? status = subprocess.call(['mv', '-f', rinexout, rinexfile]) # if orbits and rinexfile exist if (oexist) and (rexist): snrname = g.snr_name(station, year, month, day, option) orbfile = orbdir + '/' + f #print('translator',translator) if translator == 'hybrid': g.make_snrdir(year, station) # make sure output directory exists in1 = g.binary(rinexfile) in2 = g.binary( snrname) # this file is made locally and moved later in3 = g.binary(orbfile) in4 = g.binary(str(option)) if (dec_rate > 0): decr = str(dec_rate) else: decr = '0' in5 = g.binary( decr) # decimation can be used in hybrid option log.write( 'SNR file {0:50s} \n will use hybrid of python and fortran to make \n' .format(snrname)) gpssnr.foo(in1, in2, in3, in4, in5) else: if (translator == 'fortran'): t1 = time.time() try: #subprocess.call([snrexe, rinexfile, snrname, orbfile, str(option)]) log.write( 'Using standalone fortran for translation - separate log is used for stdout \n' ) flogname = 'logs/' + station + '_fortran.txt' flog = open(flogname, 'w+') a = subprocess.run([ snrexe, rinexfile, snrname, orbfile, str(option) ], capture_output=True, text=True) ddd = a.stdout flog.write(ddd) flog.close() status = subprocess.call(['rm', '-f', rinexfile]) status = subprocess.call(['xz', orbfile]) except: log.write( 'Problem with making SNR file, check fortran specific log {0:50s} \n' .format(flogname)) t2 = time.time() # print(' Exec time:', '{0:4.2f}'.format(t2-t1) ) # this is for people that want to use slow python code else: log.write( 'SNR file {0:50s} \n will use python to make \n'. format(snrname)) log.write( 'Decimating will be done here instead of using teqc \n' ) t1 = time.time() rnx2snr(rinexfile, orbfile, snrname, option, year, month, day, dec_rate, log) t2 = time.time() # print(' Exec time:', '{0:4.2f}'.format(t2-t1) ) # remove the rinex file subprocess.call(['rm', '-f', rinexfile]) if os.path.isfile(snrname): # make sure it exists and is non-zero size before moving it if (os.stat(snrname).st_size == 0): log.write( 'you created a zero file size which could mean a lot of things \n' ) log.write( 'bad exe, bad snr option, do not really have the orbit file \n' ) status = subprocess.call(['rm', '-f', snrname]) else: log.write('A SNR file was created: {0:50s} \n'.format( snrname_full)) print('\n') print('SUCCESS: SNR file was created:', snrname_full) g.store_snrfile(snrname, year, station) else: print('No SNR file was created') else: print( 'Either the RINEX file or orbit file does not exist, so there is nothing to convert' ) log.write( 'Either the RINEX file or orbit file does not exist, so there is nothing to convert \n' ) else: print('The orbit file you requested does not exist.') # close the log file log.close() return True
def conv2snr(year, doy, station, option, orbtype,receiverrate,dec_rate,archive,fortran): """ inputs: year and day of year (integers) and station name option is for the snr creation ??? integer or character? orbtype can be nav or sp3. if the former, then gpsSNR is used. if the later, then gnssSNR what are receiverrate and dec_rate defaults? this assumes you follow my definitions for where things go, i.e. REFL_CODE and ORBITS it currently checks Unavco, SOPAC, and SONEL. I should add CDDIS author: kristine m. larson 19may20, added decimation 19sep12, I got tired of code crashing for files > 20 observables. I am thus using teqc 20apr15, xz compression added but also try to streamline it. 20jul10, added arvchive setting. default is 'all' """ # define directory for the conversion executables if not os.path.isdir('logs'): subprocess.call(['mkdir', 'logs']) logname = 'logs/' + station + '.txt' log = open(logname, 'w+') log.write("Receiver rate: {0:5s} \n".format(receiverrate)) log.write("Decimation rate: {0:3.0f} \n".format(dec_rate)) log.write("Archive: {0:10s} \n".format(archive)) if fortran: log.write("Use Fortran: {0:4s} \n".format('True')) else: log.write("Use Fortran: {0:5s} \n".format('False')) log.write("Orbits : {0:10s} \n".format(orbtype)) exedir = os.environ['EXE'] snrname_full, snrname_compressed, snre = g.define_and_xz_snr(station,year,doy,option) if (snre == True): log.write("The snrfile already exists: {0:50s} \n".format(snrname_full)) else: log.write("The snrfile does not exist: {0:50s} \n".format(snrname_full)) d = g.doy2ymd(year,doy); month = d.month; day = d.day # new function to do the whole orbit thing foundit, f, orbdir, snrexe = g.get_orbits_setexe(year,month,day,orbtype,fortran) # if you have the orbit file, you can get the rinex file if foundit: # now you can look for a rinex file rinexfile,rinexfiled = g.rinex_name(station, year, month, day) # This goes to find the rinex file. I am changing it to allow # an archive preference g.go_get_rinex_flex(station,year,month,day,receiverrate,archive) # define booleans oexist = os.path.isfile(orbdir + '/' + f) == True rexist = os.path.isfile(rinexfile) == True exc = exedir + '/teqc' texist = os.path.isfile(exc) == True if rexist: if texist and fortran: # only do this for the older version #print('teqc executable exists, will use to eliminate unnecessary observables') #foutname = 'tmp.' + rinexfile #fout = open(foutname,'w') #subprocess.call([exc, '-O.obs','S1+S2+S5+S6+S7+S8', '-n_GLONASS', '27', rinexfile],stdout=fout) #fout.close() log.write('This option deprecated - no longer use teqc for reducing observables \n') # store it in the original rinex filename #subprocess.call(['rm','-f',rinexfile]) #subprocess.call(['mv','-f',foutname, rinexfile]) # decimate this new rinex file if (rexist and dec_rate > 0): log.write("Decimating using teqc: {0:3.0f} seconds \n".format(dec_rate)) log.write('Unfortunately teqc removes Beidou data. Eventually I will remove this. \n') rinexout = rinexfile + '.tmp'; cdec = str(dec_rate) fout = open(rinexout,'w') subprocess.call([exc, '-O.dec', cdec, rinexfile],stdout=fout) fout.close() # needed? status = subprocess.call(['mv','-f', rinexout, rinexfile]) # orbits and rinexfile exist if (oexist and rexist): snrname = g.snr_name(station, year,month,day,option) orbfile = orbdir + '/' + f if fortran: try: #subprocess.call([snrexe, rinexfile, snrname, orbfile, str(option)]) log.write('Using fortran for translation - separate log is used for stdout \n') flogname = 'logs/' + station + '_fortran.txt' flog = open(flogname, 'w+') a=subprocess.run([snrexe, rinexfile, snrname, orbfile, str(option)],capture_output=True,text=True) ddd = a.stdout; flog.write(ddd); flog.close() status = subprocess.call(['rm','-f', rinexfile ]) status = subprocess.call(['xz', orbfile]) except: log.write('Problem with making SNR file, check log {0:50s} \n'.format(flogname)) else: log.write('SNR file {0:50s} \n will not use fortran to make \n'.format( snrname)) log.write('Decimating will be done here instead of using teqc \n') rnx2snr(rinexfile, orbfile,snrname,option,year,month,day,dec_rate,log) # remove the rinex file subprocess.call(['rm', '-f',rinexfile]) if os.path.isfile(snrname): # make sure it exists and is non-zero size before moving it if (os.stat(snrname).st_size == 0): log.write('you created a zero file size which could mean a lot of things \n') log.write('bad exe, bad snr option, do not really have the orbit file \n') status = subprocess.call(['rm','-f', snrname ]) else: log.write('A SNR file was created: {0:50s} \n'.format(snrname_full)) print('\n') print('A SNR file was created:', snrname_full) g.store_snrfile(snrname,year,station) else: print('Either the RINEX file or orbit file does not exist, so there is nothing to convert') log.write('Either the RINEX file or orbit file does not exist, so there is nothing to convert \n') # close the log file log.close() return True