├── PW_stations.png ├── G0-converted.xlsx ├── .spyproject ├── codestyle.ini ├── encoding.ini ├── vcs.ini └── workspace.ini ├── Figures ├── Hyper-parameters_nested_RF.png └── ML_scores_models_nested_CV_doy_pressure_pwv_pwv+pressure_pwv+pressure+doy_5_neg_1.png ├── ERA5_geopotential_height_500hPa_mm_1996-2019_israel.nc ├── soi_post_script.sh ├── soi_drdump_script.sh ├── soi_run_script.sh ├── soi_rinex_download_script.sh ├── soi_edit30hr_script.sh ├── post_tela.py ├── cell_links.py ├── .gitignore ├── LICENSE.md ├── rinex_download.sh ├── shell_scripts.py ├── era5_cds.py ├── crontab_backup.txt ├── move_older_T02_to_historic_script.py ├── save_gnss_pw_emd.py ├── stations_approx_loc.txt ├── get_dryz_from_debug_tree_script.py ├── my_trees ├── gde_noclockprep.tree ├── ISROcnldVMF1 │ └── ISROcnldVMF1_0.tree ├── noOcnld │ └── noOcnld_0.tree ├── ISROcnldGPT2 │ └── ISROcnldGPT2_0.tree ├── ISROcnldWAAS │ └── ISROcnldWAAS_0.tree ├── ISROcnldNEILL │ └── ISROcnldNEILL_0.tree ├── elmin │ └── elmin_0.tree └── AXISOcnld │ └── AXISOcnld_0.tree ├── PW_paths.py ├── sst_script.py ├── SOI-APN_stations_2020-02-12.csv ├── israeli_gnss_coords.txt ├── email_notification_script.py ├── earthquakes_procedures.py ├── fitting_routines.py ├── README.md ├── etkes_ftp.py ├── get_rinex_station.py ├── aeronet_analysis.py ├── rinex_header_reader.py ├── L137_model_levels_1976_climate.txt ├── copy_gipsyx_post_from_geo.py ├── read_trop.py └── stations └── sitelog_instr.txt /PW_stations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZiskinZiv/PW_from_GPS/HEAD/PW_stations.png -------------------------------------------------------------------------------- /G0-converted.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZiskinZiv/PW_from_GPS/HEAD/G0-converted.xlsx -------------------------------------------------------------------------------- /.spyproject/codestyle.ini: -------------------------------------------------------------------------------- 1 | [codestyle] 2 | indentation = True 3 | 4 | [main] 5 | version = 0.1.0 6 | 7 | -------------------------------------------------------------------------------- /.spyproject/encoding.ini: -------------------------------------------------------------------------------- 1 | [encoding] 2 | text_encoding = utf-8 3 | 4 | [main] 5 | version = 0.1.0 6 | 7 | -------------------------------------------------------------------------------- /.spyproject/vcs.ini: -------------------------------------------------------------------------------- 1 | [vcs] 2 | use_version_control = False 3 | version_control_system = 4 | 5 | [main] 6 | version = 0.1.0 7 | 8 | -------------------------------------------------------------------------------- /Figures/Hyper-parameters_nested_RF.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZiskinZiv/PW_from_GPS/HEAD/Figures/Hyper-parameters_nested_RF.png -------------------------------------------------------------------------------- /ERA5_geopotential_height_500hPa_mm_1996-2019_israel.nc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZiskinZiv/PW_from_GPS/HEAD/ERA5_geopotential_height_500hPa_mm_1996-2019_israel.nc -------------------------------------------------------------------------------- /Figures/ML_scores_models_nested_CV_doy_pressure_pwv_pwv+pressure_pwv+pressure+doy_5_neg_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ZiskinZiv/PW_from_GPS/HEAD/Figures/ML_scores_models_nested_CV_doy_pressure_pwv_pwv+pressure_pwv+pressure+doy_5_neg_1.png -------------------------------------------------------------------------------- /soi_post_script.sh: -------------------------------------------------------------------------------- 1 | source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh 2 | /home/ziskin/anaconda3/bin/python3 /home/ziskin/Python_Projects/PW_from_GPS/generate_pw_shell_script.py --task post --station soin 3 | source /home/ziskin/gipsyx_pw_script.sh 4 | -------------------------------------------------------------------------------- /soi_drdump_script.sh: -------------------------------------------------------------------------------- 1 | source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh 2 | /home/ziskin/anaconda3/bin/python3 /home/ziskin/Python_Projects/PW_from_GPS/generate_pw_shell_script.py --task drdump --station soin 3 | source /home/ziskin/gipsyx_pw_script.sh 4 | -------------------------------------------------------------------------------- /soi_run_script.sh: -------------------------------------------------------------------------------- 1 | source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh 2 | /home/ziskin/anaconda3/bin/python3 /home/ziskin/Python_Projects/PW_from_GPS/generate_pw_shell_script.py --task run --station soin --last_n_weeks 5 3 | source /home/ziskin/gipsyx_pw_script.sh 4 | -------------------------------------------------------------------------------- /soi_rinex_download_script.sh: -------------------------------------------------------------------------------- 1 | source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh 2 | /home/ziskin/anaconda3/bin/python3 /home/ziskin/Python_Projects/PW_from_GPS/generate_pw_shell_script.py --task rinex_download --station soin 3 | source /home/ziskin/gipsyx_pw_script.sh 4 | -------------------------------------------------------------------------------- /soi_edit30hr_script.sh: -------------------------------------------------------------------------------- 1 | source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh 2 | /home/ziskin/anaconda3/bin/python3 /home/ziskin/Python_Projects/PW_from_GPS/generate_pw_shell_script.py --task edit30hr --station soin --last_n_weeks 5 3 | source /home/ziskin/gipsyx_pw_script.sh 4 | -------------------------------------------------------------------------------- /.spyproject/workspace.ini: -------------------------------------------------------------------------------- 1 | [workspace] 2 | restore_data_on_startup = True 3 | save_data_on_exit = True 4 | save_history = True 5 | save_non_project_files = False 6 | 7 | [main] 8 | version = 0.1.0 9 | recent_files = ['/home/shlomi/Python_Projects/PW_from_GPS/read_trop.py', '/home/shlomi/Python_Projects/PW_from_GPS/PW_stations.py'] 10 | 11 | -------------------------------------------------------------------------------- /post_tela.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Wed Sep 11 17:40:34 2019 5 | 6 | @author: shlomi 7 | """ 8 | 9 | from gipsyx_post_proc import post_procces_gipsyx_all_years 10 | from pathlib import Path 11 | tela = Path('/home/ziskin/Work_Files/PW_yuval/gipsyx_results/tela_all') 12 | post_procces_gipsyx_all_years(tela) -------------------------------------------------------------------------------- /cell_links.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Thu May 6 09:20:37 2021 5 | 6 | @author: shlomi 7 | """ 8 | 9 | from PW_paths import work_yuval 10 | cell_path = work_yuval / 'cell_links' 11 | 12 | def read_links_metadata(path=cell_path): 13 | import pandas as pd 14 | file = 'CML_TA.csv' 15 | df = pd.read_csv(path/file, header=0, index_col=False) 16 | return df 17 | 18 | 19 | def read_link_humidity(path=cell_path): 20 | from aux_gps import path_glob 21 | import pandas as pd 22 | import xarray as xr 23 | files = sorted(path_glob(path, 'table*.csv')) 24 | da_list = [] 25 | for i, file in enumerate(files): 26 | df = pd.read_csv(file, index_col='Time') 27 | df.index = pd.to_datetime(df.index) 28 | da = df.to_xarray().to_array('var') 29 | da.name = str(i) 30 | da_list.append(da) 31 | ds = xr.merge(da_list) 32 | return ds 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | 47 | # Translations 48 | *.mo 49 | *.pot 50 | 51 | # Django stuff: 52 | *.log 53 | 54 | # Sphinx documentation 55 | docs/_build/ 56 | 57 | # PyBuilder 58 | target/ 59 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2019 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /rinex_download.sh: -------------------------------------------------------------------------------- 1 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station t &>nohup_t_download.txt& 2 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station e &>nohup_e_download.txt& 3 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station l &>nohup_l_download.txt& 4 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station a &>nohup_a_download.txt& 5 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station 1 &>nohup_1_download.txt& 6 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station 4 &>nohup_4_download.txt& 7 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station 9 &>nohup_9_download.txt& 8 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station 0 &>nohup_0_download.txt& 9 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station . &>nohup_._download.txt& 10 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station 1 &>nohup_1_download.txt& 11 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station 9 &>nohup_9_download.txt& 12 | nohup python -u single_download.py --path ~/Work_Files/PW_yuval/rinex_from_garner/ --mode rinex --station d &>nohup_d_download.txt& 13 | -------------------------------------------------------------------------------- /shell_scripts.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Tue Apr 2 16:12:31 2019 5 | 6 | @author: shlomi 7 | """ 8 | # shell script to run gipsy: 9 | #download clock and orbit: 10 | # goa_prod_ftp.pl -d 2017-01-28 -s flinnR -hr 11 | 12 | # content of run.sh: 13 | #!/bin/csh -f 14 | 15 | #The following environment variables were active: 16 | #setenv GOA /opt/goa-6.4 17 | 18 | #You may need the following source command to set your PATH if you have changed it 19 | #source /opt/goa-6.4/rc_gipsy.csh 20 | #( gd2p.pl \ 21 | # # -e "-a 10 -LC -PC -F -ca2p_override -r 'JAVAD TRE_G3TH DELTA'" \ 22 | # -e "-a 10 -LC -PC -F" \ 23 | # # -orb_clk "flinnR_nf /root/hrmnforyuval/jplorb" \ 24 | # -orb_clk "flinnR /home/shlomi/Desktop/DATA/Work_Files/PW_yuval" \ 25 | # -no_del_shad \ 26 | # -arp \ 27 | # # -AntCal /root/work/2108/antcal/HRMN_antex.xyz \ 28 | # -amb_res 1 \ 29 | # -add_ocnld \ 30 | # # -trop_map VMF1GRID \ 31 | # -trop_map GPT2 \ 32 | # #-vmf1dir /root/VMF1GRID \ 33 | # -tides WahrK1 PolTid FreqDepLove OctTid \ 34 | # -trop_z_rw 5e-8 \ 35 | # -wetzgrad 5e-9 \ 36 | # -w_elmin 7 \ 37 | # -post_wind 2.5e-3 2.5e-5 \ 38 | # -pb_min_slip 10e-5 \ 39 | # -flag_qm \ 40 | # -flag_brks_qm \ 41 | # -edtpnt_max 10 \ 42 | # -type s \ 43 | # -r 300 \ 44 | # -stacov \ 45 | # -sta_info sta_info \ 46 | # -p 4470.2581511 3084.5897721 3332.9527759 \ 47 | # -i /home/shlomi/Desktop/DATA/Work_Files/PW_yuval/alon0280.17o \ 48 | # -n ALON \ 49 | # -d 2017-01-28 \ 50 | # # -tdp_in /root/hrmnforyuval/9/trop/tdp \ 51 | # > gd2p.log ) |& sed '/^Skipping namelist/d' > gd2p.err 52 | -------------------------------------------------------------------------------- /era5_cds.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Tue Jun 18 11:21:11 2019 5 | 6 | @author: ziskin 7 | """ 8 | 9 | import cdsapi 10 | import numpy as np 11 | c = cdsapi.Client() 12 | decade = np.arange(1979, 2019, 10) 13 | for dec in decade: 14 | years = [str(x) for x in np.arange(dec, dec + 10).tolist()] 15 | print('downloading years {} to {}'.format(years[0], years[-1])) 16 | c.retrieve( 17 | 'reanalysis-era5-single-levels', 18 | { 19 | 'product_type':'reanalysis', 20 | 'format':'netcdf', 21 | 'variable':'total_cloud_cover', 22 | 'year':years, 23 | 'month':[ 24 | '01','02','03', 25 | '04','05','06', 26 | '07','08','09', 27 | '10','11','12' 28 | ], 29 | 'day':[ 30 | '01','02','03', 31 | '04','05','06', 32 | '07','08','09', 33 | '10','11','12', 34 | '13','14','15', 35 | '16','17','18', 36 | '19','20','21', 37 | '22','23','24', 38 | '25','26','27', 39 | '28','29','30', 40 | '31' 41 | ], 42 | 'time':[ 43 | '00:00','01:00','02:00', 44 | '03:00','04:00','05:00', 45 | '06:00','07:00','08:00', 46 | '09:00','10:00','11:00', 47 | '12:00','13:00','14:00', 48 | '15:00','16:00','17:00', 49 | '18:00','19:00','20:00', 50 | '21:00','22:00','23:00' 51 | ], 52 | 'grid':[0.25, 0.25], 53 | 'area':[34, 34, 29, 36] 54 | }, 55 | 'Total_cloud_cover_israel_' + years[0] + '-' + years[-1] + '.nc') 56 | -------------------------------------------------------------------------------- /crontab_backup.txt: -------------------------------------------------------------------------------- 1 | SHELL=/bin/bash 2 | BASH_ENV=~/.bashrc_conda 3 | PWCORE=/home/ziskin/Python_Projects/PW_from_GPS 4 | PWORK=/home/ziskin/Work_Files/PW_yuval/GNSS_stations 5 | AXIS=/home/ziskin/Work_Files/PW_yuval/axis 6 | 27 6 * * * source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh; $GCORE/bin/update_GipsyX_files.py -u 7 | 7 * * * * nohup /home/ziskin/anaconda3/bin/python3 -u /home/ziskin/Python_Projects/PW_from_GPS/axis_gps_rinex_process.py --savepath /home/ziskin/Work_Files/PW_yuval/axis/ --mode last_doy &>nohup_axis_rinex_last_doy.txt& 8 | 9 * * * * source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh; source /home/ziskin/Python_Projects/PW_from_GPS/gipsyx_axis_script_1_of_3.sh 9 | 13 * * * * source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh; source /home/ziskin/Python_Projects/PW_from_GPS/gipsyx_axis_script_2_of_3.sh 10 | 17 * * * * source /home/ziskin/GipsyX-1.1/rc_GipsyX.sh; source /home/ziskin/Python_Projects/PW_from_GPS/gipsyx_axis_script_3_of_3.sh 11 | 20 * * * * nohup /home/ziskin/anaconda3/bin/python3 -u /home/ziskin/Python_Projects/PW_from_GPS/ims_stations_download.py --savepath /home/ziskin/Work_Files/PW_yuval/IMS_T/10mins/real-time/ --window 30 &>nohup_ims_download_real_time.txt& 12 | 25 1 1,15 * * source /home/ziskin/soi_rinex_download_script.sh 13 | 28 1 1,15 * * source /home/ziskin/soi_drdump_script.sh 14 | 34 1 1,15 * * source /home/ziskin/soi_edit30hr_script.sh 15 | 37 1 1,15 * * source /home/ziskin/soi_run_script.sh 16 | 45 1 1,15 * * source /home/ziskin/soi_post_script.sh 17 | 54 1 1,15 * * nohup /home/ziskin/anaconda3/bin/python3 -u /home/ziskin/Python_Projects/PW_from_GPS/ims_download_all_script.py --savepath /home/ziskin/Work_Files/PW_yuval/IMS_T/10mins --channel TD --last_2_months --dem_path --mda_path --gis_path --pw_path &>nohup_ims_download_pwv_soi.txt& 18 | 5 8 * * * nohup /home/ziskin/anaconda3/bin/python3 -u /home/ziskin/Python_Projec 19 | ts/PW_from_GPS/email_notification_script.py &>nohup_email_noti.txt& 20 | -------------------------------------------------------------------------------- /move_older_T02_to_historic_script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Sun Dec 26 19:52:22 2021 5 | Not finished script! 6 | @author: shlomi 7 | """ 8 | 9 | import click 10 | from loguru import logger 11 | from pathlib import Path 12 | 13 | upload_path = Path('/home/axis-gps') 14 | historic_path = Path('/home/axis-gps/historic/Axis-Gps/T02') 15 | 16 | 17 | @click.command() 18 | @click.option('--months', '-m', help='the number of months old T02 to look for', 19 | type=click.Int, default=3) 20 | 21 | 22 | def main_program(*args, **kwargs): 23 | months = kwargs['months'] 24 | move_old_T02_to_historic_folder(months) 25 | return 26 | 27 | 28 | def move_old_T02_to_historic_folder(months, upload_path=upload_path, historic_path=historic_path): 29 | import subprocess 30 | import pandas as pd 31 | import calendar 32 | datetime = pd.Timestamp.today() - pd.Timedelta(months*30, unit='d') 33 | month = datetime.month 34 | month = calendar.month_abbr[month] 35 | year = str(datetime.year)[2:] 36 | year_path = historic_path / 'RefData.{}'.format(year) 37 | # create the year path anyway: 38 | if not year_path: 39 | year_path.mkdir(parents=True, exist_ok=True) 40 | mnth_path = year_path/'Month.{}'.format(month) 41 | if not mnth_path.is_dir(): 42 | # if the historic folder does not exists then move the uploaded 43 | # folder to the historic path 44 | # make sure that the uploded folder exists: 45 | curr_month_path = upload_path/'Month.{}'.format(month) 46 | if not curr_month_path.is_dir(): 47 | logger.warning('{} was not found, either already moved or not existant, quitting...') 48 | return 49 | else: 50 | cmd = 'mv {} {}'.format(curr_month_path, year_path) 51 | subprocess.call(cmd, shell=True) 52 | 53 | 54 | return 55 | if __name__ == '__main__': 56 | main_program() 57 | -------------------------------------------------------------------------------- /save_gnss_pw_emd.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Tue May 28 10:52:06 2019 5 | 6 | @author: ziskin 7 | """ 8 | 9 | 10 | if __name__ == '__main__': 11 | from PW_paths import work_yuval 12 | import xarray as xr 13 | import pandas as pd 14 | from aux_gps import configure_logger 15 | from PyEMD import EMD 16 | logger = configure_logger(name='emd_saver') 17 | samples = ['monthly', 'hourly', '3hourly', 'daily', 'weekly', None] 18 | logger.info('Starting to calculate IMFs for GNSS PW:') 19 | for sample in samples: 20 | if sample is None: 21 | GNSS_pw = xr.open_dataset(work_yuval / 'GNSS_PW.nc') 22 | logger.info('proccessing 5 min sample rate.') 23 | else: 24 | GNSS_pw = xr.open_dataset(work_yuval / 'GNSS_{}_PW.nc'.format(sample)) 25 | logger.info('proccessing {} sample rate.'.format(sample)) 26 | only_pw = [x for x in GNSS_pw if 'error' not in x] 27 | da_list = [] 28 | for pw in GNSS_pw[only_pw].data_vars.values(): 29 | logger.info('calculating EMD for {} station.'.format(pw.name)) 30 | emd = EMD() 31 | imfs = emd(pw.dropna('time').values) 32 | da = xr.DataArray(imfs, dims=['mode', 'time']) 33 | da['mode'] = range(imfs.shape[0]) 34 | da.name = pw.name 35 | da['time'] = pw.dropna('time').time 36 | da.attrs['freq'] = pd.infer_freq(pw.time.values) 37 | da_list.append(da) 38 | ds = xr.merge(da_list) 39 | if sample is None: 40 | filename = 'GNSS_PW_IMFs.nc' 41 | else: 42 | filename = 'GNSS_{}_PW_IMFs.nc'.format(sample) 43 | logger.info('saving {} to {}'.format(filename, work_yuval)) 44 | comp = dict(zlib=True, complevel=9) # best compression 45 | encoding = {var: comp for var in ds} 46 | ds.to_netcdf(work_yuval / filename, 'w', encoding=encoding) 47 | logger.info('Done!') -------------------------------------------------------------------------------- /stations_approx_loc.txt: -------------------------------------------------------------------------------- 1 | X Y Z name 2 | alon 4470258.120436 3084589.778108 3332952.817425 Waste treatment facility, Ashkelon 3 | bshm 4395951.623905 3080706.989548 3433497.924246 Binyamin Shmuter Memorial site 4 | csar 4417211.533933 3080364.688296 3406244.186371 Ceasarya 5 | drag 4432980.744826 3149432.017687 3322110.370053 Metzoki dragot 6 | dsea 4460124.378127 3165994.215033 3269214.921550 Ded-Sea Manufactories 7 | elat 4555028.834959 3180067.208428 3123164.306052 Eilat 8 | elro 4336218.423351 3124003.724411 3471463.142131 Kibutz el-rom 9 | gilb 4389487.001870 3121346.173781 3405662.437160 Maale Gilboa 10 | hrmn 4329864.200425 3121125.294167 3483734.383770 Mount Hermon 11 | jslm 4435438.272332 3129141.727871 3339300.990160 Jerusalem 12 | kabr 4377283.201190 3081551.530607 3456136.768346 Kibutz Kabri 13 | katz 4349389.382124 3124004.653290 3453705.263879 Katzrin 14 | klhv 4472219.714401 3116004.107276 3302011.114415 Kibutz Lahav 15 | krom 4336313.800000 3123942.300000 3471405.800000 Kibutz El-Rom 16 | kslm 4510613.892423 3075093.464086 3287445.128609 Kibutz Kerem Shalom 17 | lhav 4472247.497525 3115975.003483 3301983.517201 Kibutz Lahav 18 | mrav 4390571.288225 3122710.096554 3402861.216923 Kibbutz Merav 19 | nizn 4519380.125052 3097205.426135 3255034.014518 Nizana 20 | nrif 4525066.992512 3172729.902888 3174290.263706 Kibutz Neve Harif 21 | nzrt 4379258.231123 3104297.580524 3433926.507312 Beit Rimon 22 | ramo 4514721.990374 3133507.748810 3228024.596679 Mitzpe Ramon 23 | slom 4510551.088511 3075023.305920 3287611.341381 Kibutz Cerem Shalom 24 | spir 4490231.316167 3165626.621933 3229108.746324 SAPIR 25 | tela 4443535.566781 3086140.781854 3366854.095172 Tel Aviv 26 | yosh 4419045.250520 3118410.759015 3370569.949204 Ariel 27 | yrcm 4487075.989637 3133519.864069 3265358.009375 Yerucham -------------------------------------------------------------------------------- /get_dryz_from_debug_tree_script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Sun Dec 20 12:53:24 2020 5 | 6 | @author: ziskin 7 | """ 8 | from PW_paths import work_yuval 9 | 10 | def get_dryz_from_one_file(file): 11 | from aux_gps import line_and_num_for_phrase_in_file 12 | import re 13 | i, line = line_and_num_for_phrase_in_file('DryZ', file) 14 | zhd = re.findall("\d+\.\d+", line)[0] 15 | return float(zhd) 16 | 17 | 18 | def get_dryz_from_one_station(gnss_path, station='dsea'): 19 | from aux_gps import path_glob 20 | from aux_gps import get_timedate_and_station_code_from_rinex 21 | import xarray as xr 22 | files = sorted(path_glob(gnss_path / station / 'rinex/30hr/results/', 23 | '{}*_debug.tree'.format(station))) 24 | dt_list = [] 25 | zhd_list = [] 26 | for file in files: 27 | rfn = file.as_posix().split('/')[-1][0:12] 28 | dt = get_timedate_and_station_code_from_rinex(rfn, just_dt=True) 29 | # print('datetime {}'.format(dt.strftime('%Y-%m-%d'))) 30 | dt_list.append(dt) 31 | zhd = get_dryz_from_one_file(file) 32 | zhd_list.append(zhd) 33 | zhd_da = xr.DataArray(zhd_list, dims=['time']) 34 | zhd_da['time'] = dt_list 35 | zhd_da *= 100 36 | zhd_da.name = station 37 | zhd_da.attrs['units'] = 'cm' 38 | zhd_da.attrs['long_name'] = 'Zenith Hydrostatic Delay' 39 | zhd_da = zhd_da.sortby('time') 40 | return zhd_da 41 | 42 | 43 | def get_dryz_from_all_stations(gnss_path, savepath): 44 | from aux_gps import save_ncfile 45 | from aux_gps import path_glob 46 | import xarray as xr 47 | pathes = path_glob(gnss_path, '*/') 48 | stations = [x.as_posix().split('/')[-1] for x in pathes] 49 | ds_list = [] 50 | for station in stations: 51 | print('obtaining ZHD from station {}'.format(station)) 52 | try: 53 | zhd = get_dryz_from_one_station(gnss_path, station=station) 54 | ds_list.append(zhd) 55 | except FileNotFoundError: 56 | continue 57 | ds = xr.merge(ds_list) 58 | filename = 'ZHD_GNSS.nc' 59 | save_ncfile(ds, savepath, filename) 60 | return ds 61 | 62 | gnss_path = work_yuval / 'GNSS_stations' 63 | savepath = work_yuval 64 | 65 | -------------------------------------------------------------------------------- /my_trees/gde_noclockprep.tree: -------------------------------------------------------------------------------- 1 | # Basic Editing for station data 2 | 3 | # Only these variables need be defined to edit in nominal mode 4 | # Currently geared to 30-sec rinex data with 300-sec output, ground arcs 5 | 6 | DATAFILE == Alon1150.21o.dr.gz 7 | FORMAT_IN == datarecord 8 | FORMAT_OUT == datarecord 9 | OUTPUT == Alon1150_edited.21o.dr.gz 10 | STATION_NAME == ALON 11 | RECEIVER_TYPE == 2 12 | LATITUDE == 33.043071593700446 13 | GLOBAL_DATA_RATE == 300 14 | 15 | 16 | Self 17 | Metadata Off # Use "On" to output originating file and line number 18 | # make output station specific for parallel processing users 19 | File `echo $STATION_NAME | awk '{print $1".gde.debug.tree"}'` 20 | 21 | Stations 22 | $STATION_NAME 23 | ReceiverType $RECEIVER_TYPE 24 | Latitude $LATITUDE 25 | 26 | Global 27 | Mode PostProcess 28 | Input 29 | Type File 30 | Format $FORMAT_IN 31 | Name $DATAFILE 32 | Receiver $STATION_NAME # only applies if Format rinex 33 | Output 34 | Type File 35 | Format $FORMAT_OUT 36 | Name $OUTPUT 37 | OutputLCPC Yes 38 | 39 | ClockPrep Off 40 | 41 | P1-C1 On # Correct bias between C1C and C1[PW] if possible write an 42 | # additional C1P = C1C + Bias 43 | Strict No 44 | 45 | Statistics 46 | Interval 30 47 | Output `echo $STATION_NAME | awk '{print $1".gde.stats 2"}'` 48 | ArcMinLength 20 49 | Debug 50 | PostProcess `echo $STATION_NAME | awk '{print $1".gde.debug 0"}'` 51 | 52 | PostProcess 53 | CodeType ALL 54 | ShortArc 55 | MinPnts On 56 | Value 3 57 | MinSpan On 58 | Value 1200.0 59 | 60 | PreEdit 61 | MaxPhase On 62 | Value 1.5e16 63 | PreRange On 64 | Min 1.5e7 65 | Max 6.0e7 # 60,000 km for GEO/IGSO 66 | 67 | TurboEdit On 68 | WideLaneNinja On 69 | NwSigma 4 70 | IonoMaxGap 1800 71 | IonoNPerOrder 100 72 | IonoMaxPoly 10 73 | IonoResJump 15 74 | 75 | SanityCheck On 76 | SanNinja On 77 | SanOutage 300 78 | SanMinPt 10 79 | SanRMS -0.12 80 | 81 | DecimateSmooth On 82 | Interval $GLOBAL_DATA_RATE 83 | Tolerance 1e-11 84 | -------------------------------------------------------------------------------- /PW_paths.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Thu Jul 19 10:51:10 2018 5 | 6 | @author: shlomi 7 | """ 8 | import platform 9 | from pathlib import Path 10 | path = Path().cwd() 11 | if platform.system() == 'Linux': 12 | if platform.node() == 'ziskin-XPS-8700': 13 | work_path = Path('/home/ziskin/Work_Files/') 14 | work_yuval = work_path / 'PW_yuval' 15 | work_chaim = work_path / 'Chaim_Stratosphere_Data' 16 | home_path = Path('/home/ziskin') 17 | cwd = Path().cwd() 18 | geo_path = Path('/home/ziskin/geo_ariel_home/') 19 | adams_path = Path('/home/ziskin/adams_home/') 20 | data11_path = Path('/home/ziskin/data11/') 21 | savefig_path = Path('/home/ziskin/Pictures') 22 | elif platform.node() == 'shlomipc': 23 | work_path = Path('/mnt/DATA/Work_Files/') 24 | work_yuval = work_path / 'PW_yuval' 25 | work_chaim = work_path / 'Chaim_Stratosphere_Data' 26 | cwd = Path().cwd() 27 | home_path = Path('/home/shlomi') 28 | geo_path = Path('/home/shlomi/geo_ariel_home/') 29 | adams_path = Path('/home/shlomi/adams_home/') 30 | data11_path = Path('/home/shlomi/data11/') 31 | savefig_path = Path('/home/shlomi/Pictures') 32 | elif platform.node() == 'geophysics1.yosh.ac.il': 33 | work_path = Path('/home/ziskin/Work_Files/') 34 | work_yuval = work_path / 'PW_yuval' 35 | work_chaim = work_path / 'Chaim_Stratosphere_Data' 36 | cwd = Path().cwd() 37 | geo_path = Path('/home/ziskin/') 38 | savefig_path = Path('/home/ziskin/Pictures') 39 | elif platform.node() == 'mn03': 40 | work_path = Path('/home/ziskin/') 41 | work_yuval = work_path / 'PW_yuval' 42 | # work_chaim = work_path / 'Chaim_Stratosphere_Data' 43 | cwd = Path().cwd() 44 | # geo_path = Path('/home/ziskin/geo_ariel_home/') 45 | # adams_path = Path('/home/ziskin/adams_home/') 46 | # data11_path = Path('/home/ziskin/data11/') 47 | savefig_path = Path('/home/ziskin/Pictures') 48 | # geo_path = Path('/home/ziskin/geo_ariel_home/') 49 | # adams_path = Path('/home/ziskin/adams_home/') 50 | # data11_path = Path('/home/ziskin/data11/') 51 | else: 52 | work_path = Path('/home/ziskin/Work_Files/') 53 | work_yuval = work_path / 'PW_yuval' 54 | work_chaim = work_path / 'Chaim_Stratosphere_Data' 55 | cwd = Path().cwd() 56 | elif platform.system() == 'Darwin': 57 | if platform.node() == 'Venus': 58 | work_path = Path('/Users/shlomi/Documents/') 59 | work_yuval = work_path / 'PW_yuval' 60 | work_chaim = work_path / 'Chaim_Stratosphere_Data' 61 | cwd = Path().cwd() 62 | home_path = Path('/Users/shlomi') 63 | geo_path = Path('/Users/shlomi/geo_ariel_home/') 64 | adams_path = Path('/Users/shlomi/adams_home/') 65 | data11_path = Path('/Users/shlomi/data11/') 66 | savefig_path = Path('/Users/shlomi/Pictures') 67 | -------------------------------------------------------------------------------- /sst_script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Sat Feb 13 13:48:45 2021 5 | 6 | @author: shlomi 7 | """ 8 | from PW_paths import work_yuval 9 | from aux_gps import move_or_copy_files_from_doy_dir_structure_to_single_path 10 | from aux_gps import path_glob 11 | import xarray as xr 12 | import numpy as np 13 | sst_path = work_yuval / 'SST/allData/ghrsst/data/GDS2/L4/GLOB/NCEI/AVHRR_OI/v2' 14 | movepath = work_yuval/'SST/allData' 15 | savepath = work_yuval/'SST' 16 | 17 | 18 | def save_yearly(movepath, savepath, years, name=None): 19 | from dask.diagnostics import ProgressBar 20 | ps = path_glob(movepath, '*.nc') 21 | for year in years: 22 | print('saving year {}...'.format(year)) 23 | # for sea level : 24 | ps_year = [x for x in ps if str(year) in x.as_posix().split('/')[-1].split('_')[-2][0:4]] 25 | # for ssts: 26 | # ps_year = [x for x in ps if str(year) in x.as_posix().split('/')[-1][0:4]] 27 | # ds = xr.open_mfdataset(ps_year) 28 | print(len(ps_year)) 29 | ds_list = [xr.open_dataset(x) for x in ps_year] 30 | ds = xr.concat(ds_list, 'time') 31 | ds = ds.sortby('time') 32 | # years, datasets = zip(*ds.groupby("time.year")) 33 | if name is None: 34 | filename = '{}-'.format(year) + '-'.join(ps[0].as_posix().split('/')[-1].split('-')[1:]) 35 | else: 36 | filename = '{}-'.format(year) + '-' + name + '.nc' 37 | filepath = savepath / filename 38 | delayed = ds.to_netcdf(filepath, compute=False) 39 | with ProgressBar(): 40 | results = delayed.compute() 41 | print('Done!') 42 | return 43 | # # now builds the filenames: 44 | # filepaths = [] 45 | # for year in years: 46 | # filename = '{}-'.format(year) + '-'.join(ps[0].as_posix().split('/')[-1].split('-')[1:]) 47 | # filepath = savepath / filename 48 | # filepaths.append(filepath) 49 | 50 | # xr.save_mfdataset(datasets, filepaths) 51 | 52 | 53 | def save_subset(savepath, subset='med1'): 54 | from dask.diagnostics import ProgressBar 55 | ps = path_glob(savepath, '*.nc') 56 | print(len(ps)) 57 | ds_list = [xr.open_dataset(x, chunks={'time': 10})[['analysed_sst', 'analysis_error']] for x in ps] 58 | ds = xr.concat(ds_list, 'time') 59 | ds = ds.sortby('time') 60 | if subset == 'med1': 61 | print('subsetting to med1') 62 | # ssts: 63 | lat_slice = [30, 50] 64 | lon_slice = [-20, 45] 65 | # sla: 66 | lat_slice = [31, 32] 67 | lon_slice = [34, 35] 68 | ds = ds.sel(lat=slice(*lat_slice), lon=slice(*lon_slice)) 69 | yrmin = ds['time'].dt.year.min().item() 70 | yrmax = ds['time'].dt.year.max().item() 71 | filename = '{}-{}_{}-'.format(subset, yrmin, yrmax) + \ 72 | '-'.join(ps[0].as_posix().split('/')[-1].split('-')[1:]) 73 | delayed = ds.to_netcdf(savepath / filename, compute=False) 74 | with ProgressBar(): 75 | results = delayed.compute() 76 | return ds 77 | 78 | # years = move_or_copy_files_from_doy_dir_structure_to_single_path(yearly_path=sst_path, movepath=movepath, opr='copy') 79 | # print('opening copied files and saving to {}'.format(movepath)) 80 | # years = np.arange(2000, 2021) 81 | # save_yearly(movepath, savepath, years) 82 | # save_subset(savepath, subset='med1') 83 | 84 | 85 | -------------------------------------------------------------------------------- /SOI-APN_stations_2020-02-12.csv: -------------------------------------------------------------------------------- 1 | name,lat,lon,alt,X,Y,Z,ant_type,ant_dome,bpa,receiver 2 | alon,31.707935944444444,34.60664498888889,55.671,4470258.15108772,3084589.7721419055,3332952.7759195906,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 3 | bshm,32.77898464444444,35.02298350277778,225.046,4395951.480639085,3080707.0548841003,3433498.0008577756,TRM59800.00,SCIS,0.0,Javad Delta 3N v3.7.6 4 | csar,32.48825408888889,34.890185430555555,36.589,4417211.533561279,3080364.6968236463,3406244.1748013473,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 5 | drag,31.593200463888888,35.392070302777775,31.81,4432980.662050432,3149432.093004649,3322110.440953717,ASH700936D_M,SNOW,0.0,Javad Delta 3N v3.7.6 6 | dsea,31.036914052777778,35.36882331388889,-360.809,4460124.376989793,3165994.217056594,3269214.8960958077,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 7 | elat,29.509279183333334,34.92060017777778,29.521,4555028.65092289,3180067.341871843,3123164.4310245127,LEIAT504GG,SCIS,0.0,Javad Delta 3N v3.7.6 8 | hrmn,33.30830870277777,35.78544788611111,2091.712,4329864.3319688225,3121125.214946868,3483734.2609948977,ASH701945C_M,SNOW,0.0,Javad Delta 3N v3.7.6 9 | jslm,31.771153277777778,35.202452175000005,790.336,4435438.210196498,3129141.7741092267,3339301.0201774277,ASH701945B_M,SNOW,0.0,Javad Delta 3N v3.7.6 10 | kabr,33.022815691666665,35.14505816944445,103.385,4377283.066700595,3081551.5959242904,3456136.8526914804,ASH701945C_M,SNOW,0.0,Javad Delta 3N v3.7.6 11 | katz,32.99524616111111,35.68828363333333,346.966,4349389.177982922,3124004.7300859476,3453705.4110100893,LEIAT504GG,LEIS,0.0,Javad Delta 3N v3.7.6 12 | klhv,31.378061936111113,34.86672518611111,498.041,4472219.808150053,3116004.067963962,3302011.0232053907,ASH701945D_M,SNOW,0.0,Javad Delta 3N v3.7.6 13 | krom,33.18137022222222,35.76951592222222,1086.456,4336313.7623996455,3123942.261308272,3471405.788785012,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 14 | kslm,31.226472949999998,34.28405784722222,104.725,4510613.891560179,3075093.4643310537,3287445.1296040365,LEIAT504GG,NONE,0.0,Javad Delta 3N v3.7.6 15 | mrav,32.44992071666666,35.42161253888889,415.607,4390571.455721114,3122709.9933106923,3402861.0479295207,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 16 | nizn,30.88431661111111,34.42347903333333,274.071,4519380.314603296,3097205.300201258,3255033.818312915,LEIAT504GG,LEIS,0.0,Javad Delta 3N v3.7.6 17 | nrif,30.038418136111112,35.03604118333333,457.522,4525067.003288906,3172729.9132195404,3174290.239295075,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 18 | nzrt,32.78249554722222,35.33144588611111,411.674,4379258.31709677,3104297.5311275003,3433926.4172549415,ASH700936E,SNOW,0.0,Javad Delta 3N v3.7.6 19 | ramo,30.59760525833333,34.76313941111111,886.814,4514721.852732087,3133507.8418025197,3228024.67770671,ASH701945B_M,SNOW,0.003,Javad Delta 3N v3.7.6 20 | spir,30.613630733333334,35.18395005833333,12.078,4490231.486617328,3165626.5066177594,3229108.564593677,JAVRINGANT_DM,JVDM,0.0,Javad Delta 3N v3.7.6 21 | tela,32.06799568888889,34.780897055555556,58.341,4443535.384275448,3086140.891111281,3366854.205045269,TRM29659.00,SCIS,0.0,Septentrio POLARX4 22 | yosh,32.10383323333333,35.20967046944445,714.412,4419045.3413258465,3118410.713244082,3370569.8601045636,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 23 | yrcm,30.99156893611111,34.92826804722222,516.062,4487075.999135332,3133519.860147474,3265357.973220746,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 24 | hama,32.73802787777778,35.65447565,372.923,4363828.960745586,3130474.612259285,3429758.1085123406,JAVRINGANT_DM,SCIS,0.0,Javad Delta 3N v3.7.6 25 | tmar,31.151862580555555,35.36504949722222,-351.396,4454972.379057631,3161895.8390421765,3280132.457265759,LEIAT504,LEIS,0.0,Javad Delta 3N v3.7.6 26 | -------------------------------------------------------------------------------- /israeli_gnss_coords.txt: -------------------------------------------------------------------------------- 1 | lat lon alt X Y Z name 2 | alon 31.707936361586658 34.60664522757809 55.67376941226348 4470258.120167495 3084589.778295793 3332952.816725086 "Waste treatment facility, Ashkelon" 3 | bshm 32.778983669537965 35.022982054278906 225.0728954614451 4395951.624977954 3080706.9903219505 3433497.924514195 "Binyamin Shmuter Memorial site" 4 | csar 32.488254208680374 34.890185349376296 36.59256263175122 4417211.534537785 3080364.6882025753 3406244.187920344 "Ceasarya " 5 | drag 31.59319980777998 35.39206914740886 31.79392293118868 4432980.7454645345 3149432.017755823 3322110.3705639243 "Metzoki dragot " 6 | dsea 31.0369142563338 35.368823285157845 -360.79573698163153 4460124.378356319 3165994.214663136 3269214.922270288 "Ded-Sea Manufactories " 7 | elat 29.50927786737548 34.92059795992651 29.523559775203466 4555028.834758331 3180067.207956583 3123164.3053408335 "Eilat " 8 | elro 33.18200735323659 35.77064801295103 1083.1730655767738 4336218.423617411 3124003.724471654 3471463.142559945 "Kibutz el-rom " 9 | gilb 32.47933606872282 35.416476122964966 506.8027512766421 4389487.0024930565 3121346.1737616654 3405662.436380359 "Maale Gilboa " 10 | hrmn 33.30830993005229 35.78544940160602 2091.727635373419 4329864.199357617 3121125.293391009 3483734.383375135 "Mount Hermon " 11 | jslm 31.77115290944373 35.202451400852674 790.337261237231 4435438.270925675 3129141.727196404 3339300.986115108 "Jerusalem " 12 | kabr 33.022814698911276 35.145056767915804 103.39918030526322 4377283.200865858 3081551.5302352756 3456136.7681029434 "Kibutz Kabri " 13 | katz 32.995244446987485 35.688281693948284 346.98679337509134 4349389.381978543 3124004.6534359236 3453705.262881762 "Katzrin " 14 | klhv 31.37806290071231 34.86672608713719 498.040110695202 4472219.712830857 3116004.1060220823 3302011.114059035 "Kibutz Lahav " 15 | lhav 31.377821493070464 34.86630812740052 488.9304569100278 4472247.497801675 3115975.003791993 3301983.517288395 "Kibutz Lahav " 16 | mrav 32.44992237277624 35.42161446484558 415.6318010555222 4390571.287500598 3122710.095909232 3402861.216225198 "Kibbutz Merav " 17 | nizn 30.884318517488815 34.42348123886598 274.0988791247598 4519380.125620898 3097205.4263623 3255034.014017531 "Nizana " 18 | nrif 30.03841839589694 35.036041156938374 457.52230235722135 4525066.993160494 3172729.903008647 3174290.264378418 "Kibutz Neve Harif " 19 | nzrt 32.78249644091317 35.33144684584301 411.68609081141307 4379258.22960843 3104297.5793247083 3433926.507132602 "Beit Rimon " 20 | ramo 30.59760435239421 34.763137796889694 886.8235785154836 4514721.9897904415 3133507.7484611585 3228024.5961196134 "Mitzpe Ramon " 21 | slom 31.228182277071276 34.28382072724028 112.72903096451034 4510551.089271103 3075023.306147949 3287611.342770256 "Kibutz Cerem Shalom " 22 | spir 30.613632472676816 35.18395206271621 12.104968687752262 4490231.31458613 3165626.620491785 3229108.7442799928 "SAPIR " 23 | tela 32.06799442407667 34.780895001184255 58.357228233392654 4443535.567386307 3086140.7821080373 3366854.0948075787 "Tel Aviv " 24 | yosh 32.10383414883237 35.20967141891651 714.4166100049384 4419045.248753283 3118410.7576145525 3370569.9485591254 "Ariel " 25 | yrcm 30.99156924168473 34.92826813898487 516.0756075304591 4487075.989377127 3133519.86402387 3265358.0092721 "Yerucham " 26 | krom 33.18137022222222 35.76951592222222 1086.456 4336313.7623996455 3123942.261308272 3471405.788785012 27 | kslm 31.22647295 34.28405784722222 104.725 4510613.891560179 3075093.4643310537 3287445.1296040365 28 | hama 32.73802787777778 35.65447565 372.923 4363828.960745586 3130474.612259285 3429758.1085123406 29 | tmar 31.151862580555555 35.36504949722222 -351.396 4454972.379057631 3161895.8390421765 3280132.457265759 30 | -------------------------------------------------------------------------------- /email_notification_script.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Sun Dec 26 19:52:22 2021 5 | 6 | @author: shlomi 7 | """ 8 | 9 | import click 10 | from loguru import logger 11 | from pathlib import Path 12 | 13 | cwd=Path().cwd() 14 | main_path = Path('/home/ziskin') 15 | 16 | 17 | @click.command() 18 | @click.option('--path', '-s', help='a full path to where the credential file is and the T02 report', 19 | type=click.Path(exists=True), default=main_path) 20 | 21 | 22 | def main_program(*args, **kwargs): 23 | from pathlib import Path 24 | path = Path(kwargs['path']) 25 | email_alert_when_no_T02_files(path) 26 | return 27 | 28 | 29 | def format_df_to_string_with_breaks(df): 30 | df = df.reset_index() 31 | li = [] 32 | li.append([x for x in df.columns]) 33 | for i, row in df.iterrows(): 34 | li.append(row.tolist()) 35 | big_str = '\n'.join('{}' for _ in range(len(li))).format(*li) 36 | return big_str 37 | 38 | 39 | def email_alert_when_no_T02_files(path=cwd): 40 | """run this file daily and check last 6 hours of 'T02_file_count.csv', 41 | if all empty (0) then send an email to Yuval""" 42 | import pandas as pd 43 | df = pd.read_csv(path / 'T02_file_count.csv') 44 | if df.empty: 45 | logger.warning('No files for at least the last 24 hours!') 46 | msg = 'No T02 files for at least the last 24 hours from AXIS' 47 | else: 48 | df.set_index('dt', inplace=True) 49 | if df.iloc[-6:]['no_files'].all(): 50 | logger.warning('No files for the last 6 hours!') 51 | big_str = format_df_to_string_with_breaks(df) 52 | msg = 'No T02 files for the last 6 hours from AXIS, see report below!' 53 | msg ='\n'.join([msg,big_str]) 54 | else: 55 | return df 56 | # sender_email, passwd = read_gmail_creds(path) 57 | # rec_mails = ['shlomiziskin@gmail.com', 'yuvalr@ariel.ac.il', 'vlf.gps@gmail.com'] 58 | rec_mails = ['shlomiziskin@gmail.com', 'yuvalr@ariel.ac.il'] 59 | # rec_mails = ['shlomiziskin@gmail.com'] 60 | subject = 'Geophysics1: AXIS TO2 lack of data' 61 | for rec_mail in rec_mails: 62 | send_gmail_using_shell(rec_mail, subject, msg) 63 | # else: 64 | # logger.info('No total lack of AXIS T02 files detected in the last 6 hours.') 65 | return df 66 | 67 | 68 | def read_gmail_creds(path=cwd, filename='.ariel.geophysics1.txt'): 69 | with open(path/filename) as f: 70 | mylist = f.read().splitlines()[0] 71 | email = mylist.split(',')[0] 72 | passwd = mylist.split(',')[1] 73 | # print(email, passwd) 74 | return email, passwd 75 | 76 | 77 | # def send_gmail(sender_email, receiver_email, passwd, subject='', msg=''): 78 | # import smtplib, ssl 79 | # from email.mime.text import MIMEText 80 | # from email.mime.multipart import MIMEMultipart 81 | # # port = 465 # For SSL 82 | # port = 465 83 | # smtp_server = "smtp.gmail.com" 84 | # # sender_email = sender_mail # Enter your address 85 | # # receiver_email = rec_email # Enter receiver address 86 | # # password = input("Type your password and press enter: ") 87 | # # message = """\ 88 | # # Subject: Hi there 89 | # # 90 | # # This message is sent from Python.""" 91 | # message = MIMEMultipart("alternative") 92 | # message["Subject"] = subject 93 | # message["From"] = sender_email 94 | # message["To"] = receiver_email 95 | # part1 = MIMEText(msg, "plain") 96 | # message.attach(part1) 97 | # context = ssl.create_default_context() 98 | # with smtplib.SMTP_SSL(smtp_server, port, context=context) as server: 99 | # # server.ehlo() # Can be omitted 100 | # # server.starttls(context=context) 101 | # # server.ehlo() # Can be omitted 102 | # server.login(sender_email, passwd) 103 | # server.sendmail(sender_email, receiver_email, message.as_string()) 104 | # logger.info('email sent to {} from {}.'.format(receiver_email, sender_email)) 105 | # return 106 | 107 | 108 | def send_gmail_using_shell(receiver_email, subject='', msg=''): 109 | import subprocess 110 | command = 'echo "{}" | mail -s "{}" {}'.format(msg, subject, receiver_email) 111 | subprocess.call(command, shell=True) 112 | logger.info('email sent to {}.'.format(receiver_email)) 113 | return 114 | 115 | if __name__ == '__main__': 116 | main_program() 117 | -------------------------------------------------------------------------------- /earthquakes_procedures.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Tue Jul 7 17:11:38 2020 5 | 6 | @author: shlomi 7 | """ 8 | 9 | from pathlib import Path 10 | from PW_paths import work_yuval 11 | cwd = Path().cwd() 12 | gis_path = work_yuval /'gis' 13 | rc = { 14 | 'font.family': 'serif', 15 | 'xtick.labelsize': 'medium', 16 | 'ytick.labelsize': 'medium'} 17 | # TODO: Build mask = (e.index > st) & (e.index <= ed) for dates, choose dates: 18 | # st=df.index[0]-np.timedelta64(1,'M') month each date or half month 19 | 20 | 21 | def filter_distance_of_earthquake_events(edf, sta_pos, tol_distance=50, plot=False): 22 | """given a station position (lat, lon), search the erathquake database for 23 | data with the tolarnace distance of tol_distance km around the sta_pos""" 24 | from shapely.geometry import Point 25 | from pyproj import Proj 26 | import geopandas as gpd 27 | import contextily as ctx 28 | import matplotlib.ticker as ticker 29 | from PW_from_gps_figures import lon_formatter 30 | from PW_from_gps_figures import lat_formatter 31 | # use Israel new network in meters for distance calculation: 32 | isr_proj = Proj(init='EPSG:2039') 33 | # convert the lat/lon point in sta_pos to shapely point with projection: 34 | p = Point(sta_pos[0], sta_pos[1]) 35 | p_proj_point = Point(isr_proj(p.y, p.x)) 36 | # create a geodataframe init in WGS84: 37 | gdf = gpd.GeoDataFrame(edf, geometry=gpd.points_from_xy(edf.lon, edf.lat), 38 | crs={'init': 'epsg:4326'}) 39 | # convert to Israel new network: 40 | gdf = gdf.to_crs({'init': 'epsg:2039'}) 41 | # calculate distance to station position in km: 42 | gdf['distance'] = gdf.geometry.distance(p_proj_point) / 1000.0 # in km 43 | # filter close earthquake sources: 44 | gdf = gdf[gdf['distance'] <= tol_distance] 45 | if gdf.empty: 46 | raise KeyError('No Earthquakes in the range of {} found'.format(tol_distance)) 47 | # convert back to WGS84: 48 | gdf = gdf.to_crs({'init': 'epsg:4326'}) 49 | if plot: 50 | ax = gdf.plot(column='Md', legend=True) 51 | d = {'geometry': [Point(sta_pos[1], sta_pos[0])]} 52 | station = gpd.GeoDataFrame(d, crs="EPSG:4326") 53 | station.plot(ax=ax, marker='s', color='k') 54 | ctx.add_basemap(ax, 55 | url=ctx.sources.ST_TERRAIN_BACKGROUND, 56 | crs='epsg:4326') 57 | ax.xaxis.set_major_locator(ticker.MaxNLocator(5)) 58 | ax.yaxis.set_major_formatter(lat_formatter) 59 | ax.xaxis.set_major_formatter(lon_formatter) 60 | ax.tick_params(top=True, bottom=True, left=True, right=True, 61 | direction='out', labelsize=10) 62 | return gdf 63 | 64 | 65 | def filter_times_of_earthquake_events(edf, bp_dt, tol=15): 66 | """given a breakpoint datetime, search the erathquake database for data 67 | with the tolarnace of tol days around the bp_dt""" 68 | import numpy as np 69 | start = bp_dt - np.timedelta64(tol, 'D') 70 | end = bp_dt + np.timedelta64(tol, 'D') 71 | mask = (edf.index >= start) & (edf.index <= end) 72 | df = edf[mask] 73 | return df 74 | 75 | 76 | def read_GNSS_station_position_velocity(path=cwd, station='ALON', 77 | return_pos=False): 78 | import pandas as pd 79 | df = pd.read_fwf(path / 'GNSS_pos_vel_all.txt') 80 | cols = [x for x in df.columns] 81 | cols[0] = 'station' 82 | cols[1] = 'pos_vel' 83 | df.columns = cols 84 | df = df[df['station'] == station] 85 | if return_pos: 86 | pos = df[df['pos_vel'] == 'POS'][['N', 'E']].values.squeeze() 87 | return pos 88 | else: 89 | return df 90 | 91 | 92 | def read_GNSS_station_breakpoints(path=cwd, station='ALON'): 93 | from aux_gps import decimal_year_to_datetime 94 | import pandas as pd 95 | df = pd.read_fwf(path / 'GNSS_breakpoints_all.txt') 96 | cols = [x for x in df.columns] 97 | cols[0] = 'station' 98 | cols[1] = 'time' 99 | df.columns = cols 100 | df = df[df['station'] == station] 101 | df['time'] = df['time'].apply(decimal_year_to_datetime) 102 | df = df.set_index('time') 103 | return df 104 | 105 | 106 | def read_earthquakes_IL(path=cwd): 107 | import pandas as pd 108 | df = pd.read_csv(cwd / 'earthquake_IL_1996-2020.csv') 109 | df = df.set_index('DateTime') 110 | df.index.name = 'time' 111 | df.index = pd.to_datetime(df.index) 112 | df = df.drop('epiid', axis=1) 113 | cols = [x for x in df.columns] 114 | cols = ['lat' if x == 'Lat' else x for x in cols] 115 | cols = ['lon' if x == 'Long' else x for x in cols] 116 | df.columns = cols 117 | df = df.sort_index() 118 | return df 119 | -------------------------------------------------------------------------------- /fitting_routines.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Tue Jan 5 11:33:06 2021 5 | 6 | @author: shlomi 7 | """ 8 | import numpy as np 9 | import scipy as sp 10 | import scipy.stats as stats 11 | import matplotlib.pyplot as plt 12 | 13 | 14 | def fit_poly_model_xr(x, y, degree=1, plot='manual', ax=None, color='k', 15 | return_just_p=False, logfit=False, fit_label=None): 16 | import numpy as np 17 | import matplotlib.pyplot as plt 18 | p, cov = np.polyfit(x, y, degree, cov=True) 19 | if ax is None: 20 | ax = plt.gca() 21 | if return_just_p: 22 | return p 23 | y_model = np.polyval(p, x) 24 | # Statistics 25 | n = y.size # number of observations 26 | m = p.size # number of parameters 27 | dof = n - m # degrees of freedom 28 | # used for CI and PI bands 29 | t = stats.t.ppf(0.975, n - m) 30 | 31 | # Estimates of Error in Data/Model 32 | resid = y - y_model 33 | # chi-squared; estimates error in data 34 | chi2 = np.sum((resid / y_model)**2) 35 | # reduced chi-squared; measures goodness of fit 36 | chi2_red = chi2 / dof 37 | # standard deviation of the error 38 | s_err = np.sqrt(np.sum(resid**2) / dof) 39 | # Fit 40 | if fit_label is None: 41 | fit_label = 'Fit: {:.2f}'.format(p[0]) 42 | # fit_label = 'Fit: {:.2f} mm/km'.format(p[0] * -1000) 43 | if logfit: 44 | ax.plot(x, np.exp(y_model), ls="-", color=color, 45 | linewidth=1.5, alpha=0.8, label=fit_label) 46 | else: 47 | ax.plot(x, y_model, ls="-", color=color, 48 | linewidth=1.5, alpha=0.8, label=fit_label) 49 | 50 | x2 = np.linspace(np.min(x), np.max(x), 100) 51 | y2 = np.polyval(p, x2) 52 | 53 | # Confidence Interval (select one) 54 | if plot is not None: 55 | if plot == 'manual': 56 | ax = plot_ci_manual(t, s_err, n, x, x2, y2, ax=ax, logfit=logfit, color=color) 57 | elif plot == 'boot': 58 | ax = plot_ci_bootstrap(x, y, resid, ax=ax) 59 | 60 | # Prediction Interval 61 | # pi = t * s_err * np.sqrt(1 + 1/n + (x2 - np.mean(x))**2 / np.sum((x - np.mean(x))**2)) 62 | # ax.fill_between(x2, y2 + pi, y2 - pi, color="k", linestyle="--") 63 | # ax.plot(x2, y2 - pi, "--", color="0.5", label="95% Prediction Limits") 64 | # ax.plot(x2, y2 + pi, "--", color="0.5") 65 | return p 66 | 67 | 68 | def plot_ci_manual(t, s_err, n, x, x2, y2, logfit=False, ax=None, color='k'): 69 | """Return an axes of confidence bands using a simple approach. 70 | 71 | Notes 72 | ----- 73 | .. math:: \left| \: \hat{\mu}_{y|x0} - \mu_{y|x0} \: \right| \; \leq \; T_{n-2}^{.975} \; \hat{\sigma} \; \sqrt{\frac{1}{n}+\frac{(x_0-\bar{x})^2}{\sum_{i=1}^n{(x_i-\bar{x})^2}}} 74 | .. math:: \hat{\sigma} = \sqrt{\sum_{i=1}^n{\frac{(y_i-\hat{y})^2}{n-2}}} 75 | 76 | References 77 | ---------- 78 | .. [1] M. Duarte. "Curve fitting," Jupyter Notebook. 79 | http://nbviewer.ipython.org/github/demotu/BMC/blob/master/notebooks/CurveFitting.ipynb 80 | 81 | """ 82 | if ax is None: 83 | ax = plt.gca() 84 | 85 | ci = t * s_err * np.sqrt(1/n + (x2 - np.mean(x)) **2 / np.sum((x - np.mean(x))**2)) 86 | if logfit: 87 | ax.fill_between(x2, np.exp(y2 + ci), np.exp(y2 - ci), color="#b9cfe7", edgecolor=None, alpha=0.6) 88 | else: 89 | ax.fill_between(x2, y2 + ci, y2 - ci, color="#b9cfe7", edgecolor=None, alpha=0.6) 90 | 91 | return ax 92 | 93 | 94 | def plot_ci_bootstrap(xs, ys, resid, nboot=500, ax=None): 95 | """Return an axes of confidence bands using a bootstrap approach. 96 | 97 | Notes 98 | ----- 99 | The bootstrap approach iteratively resampling residuals. 100 | It plots `nboot` number of straight lines and outlines the shape of a band. 101 | The density of overlapping lines indicates improved confidence. 102 | 103 | Returns 104 | ------- 105 | ax : axes 106 | - Cluster of lines 107 | - Upper and Lower bounds (high and low) (optional) Note: sensitive to outliers 108 | 109 | References 110 | ---------- 111 | .. [1] J. Stults. "Visualizing Confidence Intervals", Various Consequences. 112 | http://www.variousconsequences.com/2010/02/visualizing-confidence-intervals.html 113 | 114 | """ 115 | if ax is None: 116 | ax = plt.gca() 117 | 118 | bootindex = sp.random.randint 119 | 120 | for _ in range(nboot): 121 | resamp_resid = resid[bootindex(0, len(resid) - 1, len(resid))] 122 | # Make coeffs of for polys 123 | pc = np.polyfit(xs, ys + resamp_resid, 1) 124 | # Plot bootstrap cluster 125 | ax.plot(xs, np.polyval(pc, xs), "b-", 126 | linewidth=2, alpha=3.0 / float(nboot)) 127 | 128 | return ax 129 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## GNSS derived Precipitable Water Vapor (PWV) analysis and ML tools 2 | This repository is used mainly to extract and analyze the PWV that is derived from the Global Navigation Satellite System (GNSS) radio signals received at ground stations. 3 | 4 | Three major projects have come to fruition from using this repository (so far:-): 5 | 6 | ### 1) Binary classification on GPS derived PWV data for predicting flash floods in the Eastern Mediteranean 7 | #### Project description 8 | In the Eastern Mediteranean (EM) area (e.g., Israel), flash floods are mainly the result of heavy rainfall events which in turn can be detected by the rise of the water vapor content in the air. GPS ground based receivers can constantely monitor the water vapor amount in the air above the receiver, thus potentially become a flash floods warning system. Here we use the Precipitable Water Vapor (PWV) derived from 9 GPS ground based stations in the arid part of the EM region in order to predict flash floods. Our approach includes using three types of Machine Learning (ML) models in a binary classification task which predicts whether or not a flash flood will occurgiven 24 hours of PWV data. We train our models on 107 unique flash flood events and vigorously test them using a nested crossvalidation technique. The models are further improved by adding more features (e.g., surface pressure measurements). 9 | This project is yet to be published, however this is a tentative title: 10 | >Flash floods prediction using precipitable water vapor derived from tropospheric path delays over the Eastern Mediterranean - to be published soon" 11 | 12 | 13 | 14 | #### Example for multi-scorer, multi-model testing score visualization with nested cross validation as uncertainty 15 | ![](Figures/ML_scores_models_nested_CV_doy_pressure_pwv_pwv+pressure_pwv+pressure+doy_5_neg_1.png?raw=true "RF") 16 | Mean test scores for the SVM, RF and MLP classifiers (row) and for each scorer (column). The feature groups consist of day of year (purple), surface pressure (brown), PWV (blue), PWV and surface pressure (orange) and all three together (green). The mean scores are indicated to the upper left of each bar and the standard deviation of 5 data splits is represented by the error bar length. 17 | 18 | #### Example for Hyper-parameter tuning visualization using grid search and 2 schemes of data splits 19 | ![](Figures/Hyper-parameters_nested_RF.png?raw=true "RF") 20 | A panel showing the optimal hyper parameters that were found using grid search cross validation for the RF classifier. Each set of hyper parameters were found for each outer split (row) and for each scorer (column). Moreover, the hyper parameters are also optimized when considering 4 and 5 inner folds(top and bottom panels respectively). Each hyper parameter name is denoted in the title of each top panel and its values are indicated in the accompanied colorbar. 21 | 22 | ### 2) Diurnal climatology analysis on GPS derived PWV data to predict flash floods in the Eastern Mediteranean: 23 | 24 | #### Project description 25 | In this project we take the long term PWV times series with a 5-min resolution and study its diurnal cycle using various tools (e.g., harmonic analysis). 26 | You can read about it in the paper published: 27 | >Ziv, S. Z., Yair, Y., Alpert, P., Uzan, L., & Reuveni, Y. (2021). The diurnal variability of precipitable water vapor derived from GPS tropospheric path delays over the Eastern Mediterranean. Atmospheric Research, 249, 105307. 28 | 29 | BibTex entry: 30 | ``` 31 | @article{ziv2021diurnal, 32 | title={The diurnal variability of precipitable water vapor derived from GPS tropospheric path delays over the Eastern Mediterranean}, 33 | author={Ziv, Shlomi Ziskin and Yair, Yoav and Alpert, Pinhas and Uzan, Leenes and Reuveni, Yuval}, 34 | journal={Atmospheric Research}, 35 | volume={249}, 36 | pages={105307}, 37 | year={2021}, 38 | publisher={Elsevier} 39 | } 40 | ``` 41 | 42 | ### 3) Long-term climatology analysis on GPS derived PWV in the Eastern Mediteranean: 43 | 44 | #### Project description 45 | In this project we take the long term PWV times series, averaged to monthly means, and study their long term trends and inter-annual variations. 46 | You can read about it in the paper published: 47 | >S. Ziskin Ziv, P. Alpert, and Y. Reuveni, “Long term variability and trends of precipitable water vapor derived from GPS tropospheric path delays over the Eastern Mediterranean, International Journal of Climatology. 48 | 49 | BiBTex entry: 50 | ``` 51 | @article{ziskinlong, 52 | title={Long term variability and trends of precipitable water vapor derived from GPS tropospheric path delays over the Eastern Mediterranean}, 53 | author={Ziskin Ziv, Shlomi and Alpert, Pinhas and Reuveni, Yuval}, 54 | journal={International Journal of Climatology}, 55 | publisher={Wiley Online Library} 56 | } 57 | ``` 58 | ## License 59 | The code is free for use under the MIT license and if it helps you in an academic publication, i'd be happy if you cite the relevant aforementioned works in your paper. 60 | 61 | ## Authors 62 | * **Shlomi Ziskin Ziv** - *shlomiziskin@gmail.com* 63 | 64 | -------------------------------------------------------------------------------- /etkes_ftp.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Fri Oct 28 13:03:47 2022 5 | 6 | @author: shlomi 7 | """ 8 | # import ftplib 9 | # import subprocess 10 | from pathlib import Path 11 | import click 12 | from loguru import logger 13 | 14 | savepath = Path('/mnt/DATA/Work_Files/PW_yuval/Etkes') 15 | # ftp = ftplib.FTP("ftp.etkes.com") 16 | # ftp.login("Uni", "Uni") 17 | 18 | # ftp.dir() 19 | 20 | 21 | @click.command() 22 | @click.option('--savepath', '-sa', help='a full path to download the files, e.g., /home/ziskin/Work_Files/PW_yuval/IMS_T/10mins.', 23 | type=click.Path(exists=True), default=savepath) 24 | @click.option('--station', '-sta', help='an Etkes station to start from the download, e.g., Arav', 25 | type=str, default='AFUL') 26 | 27 | 28 | def main_program(*args, **kwargs): 29 | from pathlib import Path 30 | savepath = Path(kwargs['savepath']) 31 | station = kwargs['station'] 32 | main_dir_loop(savepath, station) 33 | return 34 | 35 | 36 | def login_ftp(addr='ftp.etkes.com',user='Uni', password='Uni', cwd=None): 37 | import ftplib 38 | ftp = ftplib.FTP(addr) 39 | ftp.login(user, password) 40 | if cwd is not None: 41 | ftp.cwd('{}'.format(cwd)) 42 | logger.info('CWD is now {}.'.format(ftp.pwd())) 43 | return ftp 44 | 45 | 46 | def getDirnamesFilenamesFromFTP(ftp, switch_to=None): 47 | import pandas as pd 48 | if switch_to is not None: 49 | ftp.cwd('{}'.format(switch_to)) 50 | logger.info('CWD is now {}.'.format(ftp.pwd())) 51 | ls = [] 52 | ftp.retrlines('MLSD', ls.append) 53 | d=pd.DataFrame(ls) 54 | d = d[0].str.split(";", n = 4, expand = True) 55 | ddf = d[d[1]=='type=dir'][4].str.strip().to_frame('name') 56 | ddf['type'] = 'dir' 57 | fdf = d[d[1]=='type=file'][4].str.strip().to_frame('name') 58 | fdf['type'] = 'file' 59 | df = pd.concat([ddf, fdf], axis=0) 60 | return df 61 | 62 | 63 | def selectDirsOrFiles(df, pick='dir'): 64 | df = df[df['type']==pick] 65 | return df['name'].unique() 66 | 67 | 68 | def main_dir_loop(savepath, station): 69 | import pandas as pd 70 | ftp = login_ftp() 71 | start = pd.Timestamp.now() 72 | station_dirs = getDirnamesFilenamesFromFTP(ftp) 73 | station_dirs = selectDirsOrFiles(station_dirs, 'dir') 74 | if station is not None: 75 | print(station, type(station)) 76 | ind = station_dirs.tolist().index(station) 77 | station_dirs = station_dirs[ind:] 78 | logger.info('Starting from station {}.'.format(station)) 79 | for station in station_dirs: 80 | # print(ftp.pwd()) 81 | years = getDirnamesFilenamesFromFTP(ftp, switch_to=station) 82 | years = selectDirsOrFiles(years, 'dir') 83 | station_savepath = savepath / station 84 | try: 85 | station_savepath.mkdir() 86 | except FileExistsError: 87 | logger.info( 88 | '{} already exists, using that folder.'.format(station_savepath)) 89 | for year in years: 90 | station_year_savepath = station_savepath / year 91 | try: 92 | station_year_savepath.mkdir() 93 | except FileExistsError: 94 | logger.info( 95 | '{} already exists, using that folder.'.format(station_year_savepath)) 96 | # print(ftp.pwd()) 97 | months = getDirnamesFilenamesFromFTP(ftp, switch_to=year) 98 | months = selectDirsOrFiles(months, 'dir') 99 | for month in months: 100 | # print(ftp.pwd()) 101 | days = getDirnamesFilenamesFromFTP(ftp, switch_to=month) 102 | days = selectDirsOrFiles(days, 'dir') 103 | for day in days: 104 | file = getDirnamesFilenamesFromFTP(ftp, switch_to=day) 105 | try: 106 | file = selectDirsOrFiles(file, 'file')[0] 107 | except IndexError: 108 | logger.warning('Files not Found in {}, skipping...'.format(ftp.pwd())) 109 | ftp.cwd('..') 110 | check_time = pd.Timestamp.now() 111 | if (check_time - start).total_seconds() > 27: 112 | logger.warning('reestablishing FTP connection.') 113 | cwd = ftp.pwd() 114 | ftp = login_ftp(cwd=cwd) 115 | start = pd.Timestamp.now() 116 | continue 117 | local_filename = station_year_savepath/file 118 | if local_filename.is_file(): 119 | logger.warning('{} already exists, skipping...'.format(local_filename)) 120 | ftp.cwd('..') 121 | check_time = pd.Timestamp.now() 122 | if (check_time - start).total_seconds() > 27: 123 | logger.warning('reestablishing FTP connection.') 124 | cwd = ftp.pwd() 125 | ftp = login_ftp(cwd=cwd) 126 | start = pd.Timestamp.now() 127 | continue 128 | with open(local_filename, "wb") as f: 129 | ftp.retrbinary(f"RETR {file}", f.write) 130 | # command = 'wget -q -P {}'.format(savepath)\ 131 | # + ' ftp://ftp.etkes.com/{}'.format(ftp.pwd())\ 132 | # + '/{}'.format(file)\ 133 | # + ' --ftp-user="Uni" --ftp-password="Uni"' 134 | logger.info('{} was copied to {}.'.format(file, station_year_savepath)) 135 | start = pd.Timestamp.now() 136 | # subprocess.run(command, shell=True, check=True) 137 | ftp.cwd('..') 138 | ftp.cwd('..') 139 | ftp.cwd('..') 140 | ftp.cwd('..') 141 | 142 | 143 | 144 | if __name__ == '__main__': 145 | main_program() 146 | # wget ftp://ftp.etkes.com//ARAV/2021/10/14/arav2870.rnx.zip --ftp-user="Uni" --ftp-password="Uni" 147 | # command = 'wget -q -P {}'.format(savepath)\ 148 | # + ' http://anonymous:shlomiziskin%40gmail.com@garner.ucsd.edu'\ 149 | # + '/pub/rinex/{}/{}/{}'.format(year, dayofyear, filename) 150 | # try: 151 | # subprocess.run(command, shell=True, check=True) 152 | # logger.info('Downloaded {} to {}.'.format(filename, savepath)) 153 | -------------------------------------------------------------------------------- /get_rinex_station.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Tue May 28 10:52:06 2019 5 | 6 | @author: ziskin 7 | """ 8 | 9 | 10 | class Watcher: 11 | """ A simple class, set to watch its variable. """ 12 | def __init__(self, value, length): 13 | self.variable = value 14 | self.length = length 15 | 16 | def set_value(self, new_value, length): 17 | if len(new_value) != length or not new_value.isdigit(): 18 | raise ValueError('value length is not {} or it is not a digit'.format(self.length)) 19 | if self.variable != new_value: 20 | # self.pre_change() 21 | self.variable = new_value 22 | return self.variable 23 | 24 | 25 | # def pre_change(self): 26 | # do stuff before variable is about to be changed 27 | # pass 28 | 29 | # def post_change(self): 30 | # do stuff right after variable has changed 31 | # print(self.variable) 32 | 33 | 34 | def get_rinex_all_years(rinex_path, station_path, station='tela'): 35 | """copy all station rinex files to a single directory so it can be 36 | proccessed by gipsy""" 37 | import os 38 | import shutil 39 | print('Creating {}/{}'.format(station_path, station)) 40 | savepath = station_path / station 41 | # year = Watcher('1991', 4) 42 | day = Watcher('001', 3) 43 | new_year = Watcher('1991', 4) 44 | cnt = 0 45 | if not os.path.exists(savepath): 46 | try: 47 | os.makedirs(savepath) 48 | except OSError: 49 | print("Creation of the directory %s failed" % savepath) 50 | else: 51 | print("Successfully created the directory %s" % savepath) 52 | else: 53 | print('Folder {} already exists.'.format(savepath)) 54 | 55 | for path in rinex_path.rglob('*'): 56 | spath = path.as_posix() 57 | filename = spath.split('/')[-1].split('.')[0] 58 | my_file = spath.split('/')[-1] 59 | if filename.isdigit(): 60 | continue 61 | 62 | year = spath.split('/')[-3] 63 | try: 64 | nyear = new_year.set_value(year, 4) 65 | except ValueError: 66 | continue 67 | if nyear is not None: 68 | print('scanning {} in year {}....'.format(station, nyear)) 69 | if len(year) != 4 or not year.isdigit(): 70 | continue 71 | try: 72 | new_day = day.set_value(spath.split('/')[-2], 3) 73 | except ValueError: 74 | continue 75 | # day = spath.split('/')[-2] 76 | # if len(day) != 3 or not day.isdigit(): 77 | # continue 78 | if station in filename: 79 | to_file = savepath / my_file 80 | shutil.copy(path, to_file) 81 | print('Copied {} to {}'.format(my_file, savepath)) 82 | cnt += 1 83 | else: 84 | # if new_day is not None: 85 | # print('{} not found in year {}, day {}'.format(station, year, new_day)) 86 | continue 87 | print('Total {} were copied.'.format(cnt)) 88 | return 89 | 90 | 91 | def check_python_version(min_major=3, min_minor=6): 92 | import sys 93 | major = sys.version_info[0] 94 | minor = sys.version_info[1] 95 | print('detecting python varsion: {}.{}'.format(major, minor)) 96 | if major < min_major or minor < min_minor: 97 | raise ValueError('Python version needs to be at least {}.{} to run this script...'.format(min_major, min_minor)) 98 | return 99 | 100 | 101 | def check_path(path): 102 | import os 103 | path = str(path) 104 | if not os.path.exists(path): 105 | raise argparse.ArgumentTypeError(path + ' does not exist...') 106 | return path 107 | 108 | 109 | def check_station_name(name): 110 | # import os 111 | if isinstance(name, list): 112 | name = [str(x).lower() for x in name] 113 | for nm in name: 114 | if len(nm) != 4: 115 | raise argparse.ArgumentTypeError('{} should be 4 letters...'.format(nm)) 116 | return name 117 | else: 118 | name = str(name).lower() 119 | if len(name) != 4: 120 | raise argparse.ArgumentTypeError(name + ' should be 4 letters...') 121 | return name 122 | 123 | if __name__ == '__main__': 124 | import argparse 125 | import sys 126 | from pathlib import Path 127 | check_python_version(min_major=3, min_minor=6) 128 | parser = argparse.ArgumentParser(description='a command line tool for ' + 129 | 'extracting a single station rinex files' + 130 | ' and copy them to a single directory to' + 131 | ' be proccesed by gipsy') 132 | optional = parser._action_groups.pop() 133 | required = parser.add_argument_group('required arguments') 134 | # remove this line: optional = parser... 135 | required.add_argument('--path', help="a full path to read station rinex" + 136 | " files, e.g., /home/ziskin/garner/", type=check_path) 137 | required.add_argument('--station', help="GPS station name four lowercase letters,", 138 | type=check_station_name) 139 | required.add_argument('--savepath', help="a full savepath to save station rinex" + 140 | " files, e.g., /home/ziskin/garner/ WITHOUT station name", type=check_path) 141 | #optional.add_argument('--station', nargs='+', 142 | # help='GPS station name, 4 UPPERCASE letters', 143 | # type=check_station_name) 144 | # metavar=str(cds.start_year) + ' to ' + str(cds.end_year)) 145 | # optional.add_argument('--half', help='a spescific six months to download,\ 146 | # e.g, 1 or 2', type=int, choices=[1, 2], 147 | # metavar='1 or 2') 148 | parser._action_groups.append(optional) # added this line 149 | args = parser.parse_args() 150 | # print(parser.format_help()) 151 | # # print(vars(args)) 152 | if args.path is None or args.savepath is None: 153 | print('path or savepath is a required argument, run with -h...') 154 | sys.exit() 155 | # elif args.field is None: 156 | # print('field is a required argument, run with -h...') 157 | # sys.exit() 158 | if args.station is not None: 159 | path = Path(args.path) 160 | savepath = Path(args.savepath) 161 | get_rinex_all_years(path, savepath, args.station) 162 | else: 163 | raise ValueError('need to specify station!') 164 | -------------------------------------------------------------------------------- /aeronet_analysis.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Tue Feb 25 11:42:55 2020 5 | 6 | @author: ziskin 7 | """ 8 | 9 | from PW_paths import work_yuval 10 | from matplotlib import rcParams 11 | import seaborn as sns 12 | aero_path = work_yuval / 'AERONET' 13 | gis_path = work_yuval / 'gis' 14 | 15 | rc = { 16 | 'font.family': 'serif', 17 | 'xtick.labelsize': 'medium', 18 | 'ytick.labelsize': 'medium'} 19 | for key, val in rc.items(): 20 | rcParams[key] = val 21 | sns.set(rc=rc, style='white') 22 | 23 | 24 | def prepare_station_to_pw_comparison(path=aero_path, gis_path=gis_path, 25 | station='boker', mm_anoms=False): 26 | from aux_gps import keep_iqr 27 | from aux_gps import anomalize_xr 28 | ds_dict = load_all_station(path=aero_path, gis_path=gis_path) 29 | try: 30 | da = ds_dict[station]['WV(cm)_935nm-AOD'] 31 | except KeyError as e: 32 | print('station {} has no {} field'.format(station, e)) 33 | return 34 | da = keep_iqr(da) 35 | # convert to mm: 36 | da = da * 10 37 | da.name = station 38 | if mm_anoms: 39 | da_mm = da.resample(time='MS').mean() 40 | da_mm_anoms = anomalize_xr(da_mm, freq='MS') 41 | da = da_mm_anoms 42 | da.attrs['data_source'] = 'AERONET' 43 | da.attrs['data_field'] = 'WV(cm)_935nm-AOD' 44 | da.attrs['units'] = 'mm' 45 | return da 46 | 47 | 48 | def load_all_station(path=aero_path, gis_path=gis_path): 49 | from aux_gps import path_glob 50 | import xarray as xr 51 | files = path_glob(aero_path, '*.nc') 52 | dsl = [xr.open_dataset(file) for file in files] 53 | names = [x.attrs['new_name'] for x in dsl] 54 | ds_dict = dict(zip(names, dsl)) 55 | return ds_dict 56 | 57 | 58 | def read_all_stations(path=aero_path, savepath=aero_path, glob='*.lev20'): 59 | from aux_gps import path_glob 60 | files = path_glob(path, glob) 61 | for file in files: 62 | print('reading {}...'.format(file.as_posix().split('/')[-1])) 63 | read_one_station(file, savepath) 64 | print('Done!') 65 | return 66 | 67 | 68 | def read_one_station(filepath, savepath=None): 69 | import pandas as pd 70 | kind = filepath.as_posix().split('.')[-1] 71 | df = pd.read_csv(filepath, header=6, na_values=-999) 72 | # create datetime index: 73 | df['dt'] = df['Date(dd:mm:yyyy)'].astype(str) + ' ' + \ 74 | df['Time(hh:mm:ss)'].astype(str) 75 | df['dt'] = pd.to_datetime(df['dt'], format='%d:%m:%Y %H:%M:%S') 76 | df = df.set_index(df['dt']) 77 | # exctract meta data: 78 | meta = {} 79 | meta['AERONET_Site_Name'] = df['AERONET_Site_Name'][0] 80 | meta['lat'] = df['Site_Latitude(Degrees)'][0] 81 | meta['lon'] = df['Site_Longitude(Degrees)'][0] 82 | meta['alt'] = df['Site_Elevation(m)'][0] 83 | # cols to keep: 84 | to_keep = [x for x in df.columns if 'AOD' in x] 85 | to_keep += [x for x in df.columns if 'Angstrom' in x] 86 | more_fields = ['Precipitable_Water(cm)', 'Solar_Zenith_Angle(Degrees)', 87 | 'Optical_Air_Mass', 'Sensor_Temperature(Degrees_C)', 88 | 'Ozone(Dobson)', 'NO2(Dobson)', 'Pressure(hPa)'] 89 | for field in more_fields: 90 | to_keep += [x for x in df.columns if field == x] 91 | to_keep = [x for x in to_keep if 'Empty' not in x] 92 | to_keep = [x for x in to_keep if 'Exact' not in x] 93 | df = df[to_keep].astype(float) 94 | df.index.name = 'time' 95 | ds = df.to_xarray() 96 | for key, val in meta.items(): 97 | ds.attrs[key] = val 98 | new_names = {'Dead_Sea': 'dsea', 'Eilat': 'elat', 'Migal': 'migal', 99 | 'KITcube_Masada': 'masada', 'Weizmann_Institute': 'rehovot', 100 | 'Technion_Haifa_IL': 'haifa', 'Nes_Ziona': 'ziona', 101 | 'SEDE_BOKER': 'boker'} 102 | ds.attrs['new_name'] = new_names.get(ds.attrs['AERONET_Site_Name']) 103 | if savepath is not None: 104 | max_year = ds['time'].max().dt.year.item() 105 | min_year = ds['time'].min().dt.year.item() 106 | filename = 'AERONET_{}_{}_{}-{}.nc'.format( 107 | meta['AERONET_Site_Name'], kind, min_year, max_year) 108 | comp = dict(zlib=True, complevel=9) # best compression 109 | encoding = {var: comp for var in ds.data_vars} 110 | ds.to_netcdf(savepath / filename, 'w', encoding=encoding) 111 | print('saved {} to {}.'.format(filename, savepath)) 112 | return ds 113 | 114 | 115 | def produce_geo_aeronet(path=aero_path, gis_path=gis_path): 116 | from aux_gps import path_glob 117 | import pandas as pd 118 | import geopandas as gpd 119 | import xarray as xr 120 | files = path_glob(aero_path, '*.nc') 121 | dsl = [xr.open_dataset(file) for file in files] 122 | attrs = [x.attrs for x in dsl] 123 | df = pd.DataFrame(attrs) 124 | df.columns = ['old_name', 'lat', 'lon', 'alt', 'name'] 125 | df = df.set_index(df['name']) 126 | df = df[['lat', 'lon', 'alt']] 127 | isr = gpd.read_file(gis_path / 'Israel_and_Yosh.shp') 128 | isr.crs = {'init': 'epsg:4326'} 129 | aeronet = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.lon, 130 | df.lat), 131 | crs=isr.crs) 132 | return aeronet 133 | 134 | 135 | def plot_stations_and_gps(path=aero_path, gis_path=gis_path): 136 | from PW_from_gps_figures import plot_israel_map 137 | from PW_stations import produce_geo_gnss_solved_stations 138 | from aux_gps import geo_annotate 139 | ax = plot_israel_map(gis_path=gis_path) 140 | aero = produce_geo_aeronet(path=path, gis_path=gis_path) 141 | aero.plot(ax=ax, color='blue', edgecolor='black', marker='^') 142 | geo_annotate(ax, aero.lon, aero.lat, 143 | aero.index, xytext=(4, -6), fmt=None, 144 | c='k', fw='bold', fs=None, colorupdown=False) 145 | gps = produce_geo_gnss_solved_stations(path=gis_path, plot=False) 146 | gps.plot(ax=ax, color='green', edgecolor='black', marker='s') 147 | gps_stations = [x for x in gps.index] 148 | to_plot_offset = ['mrav', 'klhv'] 149 | [gps_stations.remove(x) for x in to_plot_offset] 150 | gps_normal_anno = gps.loc[gps_stations, :] 151 | gps_offset_anno = gps.loc[to_plot_offset, :] 152 | geo_annotate(ax, gps_normal_anno.lon, gps_normal_anno.lat, 153 | gps_normal_anno.index, xytext=(3, 3), fmt=None, 154 | c='k', fw='bold', fs=None, colorupdown=False) 155 | geo_annotate(ax, gps_offset_anno.lon, gps_offset_anno.lat, 156 | gps_offset_anno.index, xytext=(4, -6), fmt=None, 157 | c='k', fw='bold', fs=None, colorupdown=False) 158 | return 159 | 160 | -------------------------------------------------------------------------------- /rinex_header_reader.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Wed Oct 23 10:15:13 2019 5 | 6 | @author: shlomi 7 | """ 8 | 9 | # 10 | #def produce_log_report(df, station, savepath): 11 | # import logging 12 | # from pathlib import Path 13 | # logger = logging.getLogger('rinex_hdr_reader') 14 | # filename = '{}_log.txt'.format(station) 15 | # logger.info('saving raw log file ({}) to {}'.format(filename, savepath)) 16 | # df.to_csv(Path(savepath) / filename, sep=' ') 17 | # return 18 | 19 | 20 | def save_header_dataframe(df, savename, savepath): 21 | import logging 22 | from pathlib import Path 23 | logger = logging.getLogger('rinex_hdr_reader') 24 | if savename is not None: 25 | filename = '{}_rnxheaders.csv'.format(savename) 26 | else: 27 | filename = 'generic_rnxheaders.csv' 28 | logger.info('saving raw log file ({}) to {}'.format(filename, savepath)) 29 | df.to_csv(Path(savepath) / filename, sep=',') 30 | return 31 | 32 | 33 | def read_all_rinex_file_headers(rinexpath): 34 | from aux_gps import path_glob 35 | import pandas as pd 36 | import logging 37 | logger = logging.getLogger('rinex_hdr_reader') 38 | di_list = [] 39 | files = path_glob(rinexpath, '*.Z') 40 | logger.info('staring to read rnx files headers.') 41 | logger.info('proccessing {}'.format(rinexpath)) 42 | cnt = 0 43 | total = len(files) 44 | for rfn in sorted(files): 45 | filename = rfn.as_posix().split('/')[-1][0:12] 46 | logger.info('reading rnx header of {} ({}/{})'.format(filename, cnt, 47 | total)) 48 | try: 49 | dic = read_one_rinex_file(rfn) 50 | di_list.append(dic) 51 | except ValueError: 52 | logger.error('error parsing rnx header of {}'.format(filename)) 53 | continue 54 | except OSError: 55 | logger.error('error parsing rnx header of {}'.format(filename)) 56 | continue 57 | cnt += 1 58 | df = pd.DataFrame(di_list) 59 | logger.info('done reading {} rnx files.'.format(cnt)) 60 | return df 61 | 62 | 63 | #def read_all_rinex_headers(rinexpath, dates): 64 | # import pandas as pd 65 | # from aux_gps import path_glob 66 | # from aux_gps import slice_task_date_range 67 | # import logging 68 | # logger = logging.getLogger('rinex_hdr_reader') 69 | # ant_list = [] 70 | # rec_list = [] 71 | # name_list = [] 72 | # aserial_list = [] 73 | # rinex_list = [] 74 | # dts = [] 75 | # logger.info('staring to read rnx files headers.') 76 | # logger.info('proccessing {}'.format(rinexpath)) 77 | # cnt = 0 78 | # files = path_glob(rinexpath) 79 | # if dates is not None: 80 | # files = slice_task_date_range(files, dates, 'rinex header reader') 81 | # total = len(files) 82 | # for rfn in sorted(files): 83 | # filename = rfn.as_posix().split('/')[-1][0:12] 84 | # try: 85 | # dic = read_one_rnx_file(rfn) 86 | # except ValueError: 87 | # logger.error('error parsing rnx header of {}'.format(filename)) 88 | # continue 89 | # rinex_list.append(filename) 90 | # ant_list.append(dic['ant']) 91 | # aserial_list.append(dic['ant_serial']) 92 | # rec_list.append(dic['rec']) 93 | # name_list.append(dic['name']) 94 | # dts.append(dic['dt']) 95 | # logger.info('reading rnx header of {} ({}/{})'.format(filename, cnt, 96 | # total)) 97 | # cnt += 1 98 | ## if len(set(name_list)) > 1: 99 | ## raise Exception('path {} includes more than one station!'.format(rinexpath)) 100 | # station = list(set(name_list))[0] 101 | # df = pd.DataFrame(rinex_list, index=dts, columns=['rfn']) 102 | # df['name'] = name_list 103 | # df['ant'] = ant_list 104 | # df['ant_seriel'] = aserial_list 105 | # df['rec'] = rec_list 106 | # df.sort_index(inplace=True) 107 | # logger.info('done reading {} rnx files for station {}.'.format(cnt, station)) 108 | # return df, station 109 | 110 | 111 | def read_one_rinex_file(rinex_file): 112 | from gcore.RinexHeader import RinexHeader 113 | header = RinexHeader(rinex_file) 114 | di = vars(header)['headerInfo'] 115 | return di 116 | 117 | #def read_one_rnx_file(rfn_with_path): 118 | # import georinex as gr 119 | # import pandas as pd 120 | # from pandas.errors import OutOfBoundsDatetime 121 | # from aux_gps import get_timedate_and_station_code_from_rinex 122 | # 123 | # def parse_field(field): 124 | # field_new = [x.split(' ') for x in field] 125 | # flat = [item for sublist in field_new for item in sublist] 126 | # return [x for x in flat if len(x) > 1] 127 | # hdr = gr.rinexheader(rfn_with_path) 128 | # header = {} 129 | # ant = [val for key, val in hdr.items() if 'ANT' in key] 130 | # try: 131 | # header['ant'] = parse_field(ant)[1] 132 | # except IndexError: 133 | # header['ant'] = parse_field(ant) 134 | # try: 135 | # header['ant_serial'] = parse_field(ant)[0] 136 | # except IndexError: 137 | # header['ant_serial'] = parse_field(ant) 138 | # rec = [val for key, val in hdr.items() if 'REC' in key] 139 | # try: 140 | # rec = ' '.join(parse_field(rec)[1:3]) 141 | # except IndexError: 142 | # rec = parse_field(rec) 143 | # header['rec'] = rec 144 | # name = [val for key, val in hdr.items() if 'NAME' in key] 145 | # try: 146 | # header['name'] = parse_field(name)[0] 147 | # except IndexError: 148 | # header['name'] = parse_field(name) 149 | # try: 150 | # dts = pd.to_datetime(hdr['t0']) 151 | # except OutOfBoundsDatetime: 152 | # rfn = rfn_with_path.as_posix().split('/')[-1][0:12] 153 | # dts = get_timedate_and_station_code_from_rinex(rfn, True) 154 | # except KeyError: 155 | # rfn = rfn_with_path.as_posix().split('/')[-1][0:12] 156 | # dts = get_timedate_and_station_code_from_rinex(rfn, True) 157 | # header['dt'] = dts 158 | # return header 159 | 160 | 161 | def check_path(path): 162 | import os 163 | path = str(path) 164 | if not os.path.exists(path): 165 | raise argparse.ArgumentTypeError(path + ' does not exist...') 166 | return path 167 | 168 | 169 | if __name__ == '__main__': 170 | import argparse 171 | import sys, os 172 | from aux_gps import configure_logger 173 | logger = configure_logger(name='rinex_hdr_reader') 174 | sys.path.insert(0, "{}/lib/python{}.{}".format(os.environ['GCOREBUILD'], \ 175 | sys.version_info[0], sys.version_info[1])) 176 | parser = argparse.ArgumentParser(description='a command line tool for ' + 177 | 'reading rnx file headers for one station' + 178 | 'and produce a log file.') 179 | optional = parser._action_groups.pop() 180 | required = parser.add_argument_group('required arguments') 181 | # remove this line: optional = parser... 182 | required.add_argument('--rinexpath', help="a main path to the rinex files." + 183 | " files, e.g., /home/ziskin/rinex/", type=check_path) 184 | required.add_argument('--savepath', help="a path to save the log report." + 185 | " files, e.g., /home/ziskin/", type=check_path) 186 | optional.add_argument('--savename', help="a name for the save file",type=str) 187 | # optional.add_argument('--daterange', help='add specific date range, can be one day', 188 | # type=str, nargs=2) 189 | # parser._action_groups.append(optional) # added this line 190 | args = parser.parse_args() 191 | # print(parser.format_help()) 192 | # # print(vars(args)) 193 | if args.rinexpath is None: 194 | print('rinexpath is a required argument, run with -h...') 195 | sys.exit() 196 | if args.savepath is None: 197 | print('savepath is a required argument, run with -h...') 198 | sys.exit() 199 | # df, station = read_all_rinex_headers(args.rinexpath, args.daterange) 200 | df = read_all_rinex_file_headers(args.rinexpath) 201 | save_header_dataframe(df, args.savename, args.savepath) 202 | # produce_log_report(df, station, args.savepath) 203 | -------------------------------------------------------------------------------- /L137_model_levels_1976_climate.txt: -------------------------------------------------------------------------------- 1 | 0 0.000000 0.000000 0.000000 - - - - - 2 | 1 2.000365 0.000000 0.0200 0.0100 79301.79 80301.65 198.05 0.000018 3 | 2 3.102241 0.000000 0.0310 0.0255 73721.58 74584.91 209.21 0.000042 4 | 3 4.666084 0.000000 0.0467 0.0388 71115.75 71918.79 214.42 0.000063 5 | 4 6.827977 0.000000 0.0683 0.0575 68618.43 69365.77 221.32 0.000090 6 | 5 9.746966 0.000000 0.0975 0.0829 66210.99 66906.53 228.06 0.000127 7 | 6 13.605424 0.000000 0.1361 0.1168 63890.03 64537.43 234.56 0.000173 8 | 7 18.608931 0.000000 0.1861 0.1611 61651.77 62254.39 240.83 0.000233 9 | 8 24.985718 0.000000 0.2499 0.2180 59492.50 60053.46 246.87 0.000308 10 | 9 32.985710 0.000000 0.3299 0.2899 57408.61 57930.78 252.71 0.000400 11 | 10 42.879242 0.000000 0.4288 0.3793 55396.62 55882.68 258.34 0.000512 12 | 11 54.955463 0.000000 0.5496 0.4892 53453.20 53905.62 263.78 0.000646 13 | 12 69.520576 0.000000 0.6952 0.6224 51575.15 51996.21 269.04 0.000806 14 | 13 86.895882 0.000000 0.8690 0.7821 49767.41 50159.36 270.65 0.001007 15 | 14 107.415741 0.000000 1.0742 0.9716 48048.70 48413.94 270.65 0.001251 16 | 15 131.425507 0.000000 1.3143 1.1942 46416.22 46756.98 269.02 0.001546 17 | 16 159.279404 0.000000 1.5928 1.4535 44881.17 45199.69 264.72 0.001913 18 | 17 191.338562 0.000000 1.9134 1.7531 43440.23 43738.55 260.68 0.002343 19 | 18 227.968948 0.000000 2.2797 2.0965 42085.00 42364.93 256.89 0.002843 20 | 19 269.539581 0.000000 2.6954 2.4875 40808.05 41071.20 253.31 0.003421 21 | 20 316.420746 0.000000 3.1642 2.9298 39602.76 39850.56 249.94 0.004084 22 | 21 368.982361 0.000000 3.6898 3.4270 38463.25 38696.94 246.75 0.004838 23 | 22 427.592499 0.000000 4.2759 3.9829 37384.22 37604.95 243.73 0.005693 24 | 23 492.616028 0.000000 4.9262 4.6010 36360.94 36569.72 240.86 0.006655 25 | 24 564.413452 0.000000 5.6441 5.2851 35389.15 35586.89 238.14 0.007731 26 | 25 643.339905 0.000000 6.4334 6.0388 34465.00 34652.52 235.55 0.008931 27 | 26 729.744141 0.000000 7.2974 6.8654 33585.02 33763.05 233.09 0.010261 28 | 27 823.967834 0.000000 8.2397 7.7686 32746.04 32915.27 230.74 0.011729 29 | 28 926.344910 0.000000 9.2634 8.7516 31945.53 32106.57 228.60 0.013337 30 | 29 1037.201172 0.000000 10.3720 9.8177 31177.59 31330.96 227.83 0.015012 31 | 30 1156.853638 0.000000 11.5685 10.9703 30438.54 30584.71 227.09 0.016829 32 | 31 1285.610352 0.000000 12.8561 12.2123 29726.69 29866.09 226.38 0.018793 33 | 32 1423.770142 0.000000 14.2377 13.5469 29040.48 29173.50 225.69 0.020910 34 | 33 1571.622925 0.000000 15.7162 14.9770 28378.46 28505.47 225.03 0.023186 35 | 34 1729.448975 0.000000 17.2945 16.5054 27739.29 27860.64 224.39 0.025624 36 | 35 1897.519287 0.000000 18.9752 18.1348 27121.74 27237.73 223.77 0.028232 37 | 36 2076.095947 0.000000 20.7610 19.8681 26524.63 26635.56 223.17 0.031013 38 | 37 2265.431641 0.000000 22.6543 21.7076 25946.90 26053.04 222.60 0.033972 39 | 38 2465.770508 0.000000 24.6577 23.6560 25387.55 25489.15 222.04 0.037115 40 | 39 2677.348145 0.000000 26.7735 25.7156 24845.63 24942.93 221.50 0.040445 41 | 40 2900.391357 0.000000 29.0039 27.8887 24320.28 24413.50 220.97 0.043967 42 | 41 3135.119385 0.000000 31.3512 30.1776 23810.67 23900.02 220.46 0.047685 43 | 42 3381.743652 0.000000 33.8174 32.5843 23316.04 23401.71 219.97 0.051604 44 | 43 3640.468262 0.000000 36.4047 35.1111 22835.68 22917.85 219.49 0.055727 45 | 44 3911.490479 0.000000 39.1149 37.7598 22368.91 22447.75 219.02 0.060059 46 | 45 4194.930664 0.000000 41.9493 40.5321 21915.16 21990.82 218.57 0.064602 47 | 46 4490.817383 0.000000 44.9082 43.4287 21473.98 21546.62 218.12 0.069359 48 | 47 4799.149414 0.000000 47.9915 46.4498 21045.00 21114.77 217.70 0.074330 49 | 48 5119.895020 0.000000 51.1990 49.5952 20627.87 20694.90 217.28 0.079516 50 | 49 5452.990723 0.000000 54.5299 52.8644 20222.24 20286.66 216.87 0.084916 51 | 50 5798.344727 0.000000 57.9834 56.2567 19827.95 19889.88 216.65 0.090458 52 | 51 6156.074219 0.000000 61.5607 59.7721 19443.55 19503.09 216.65 0.096110 53 | 52 6526.946777 0.000000 65.2695 63.4151 19068.35 19125.61 216.65 0.101968 54 | 53 6911.870605 0.000000 69.1187 67.1941 18701.27 18756.34 216.65 0.108045 55 | 54 7311.869141 0.000000 73.1187 71.1187 18341.27 18394.25 216.65 0.114355 56 | 55 7727.412109 0.000007 77.2810 75.1999 17987.41 18038.35 216.65 0.120917 57 | 56 8159.354004 0.000024 81.6182 79.4496 17638.78 17687.77 216.65 0.127751 58 | 57 8608.525391 0.000059 86.1450 83.8816 17294.53 17341.62 216.65 0.134877 59 | 58 9076.400391 0.000112 90.8774 88.5112 16953.83 16999.08 216.65 0.142321 60 | 59 9562.682617 0.000199 95.8280 93.3527 16616.09 16659.55 216.65 0.150106 61 | 60 10065.978516 0.000340 101.0047 98.4164 16281.10 16322.83 216.65 0.158248 62 | 61 10584.631836 0.000562 106.4153 103.7100 15948.85 15988.88 216.65 0.166760 63 | 62 11116.662109 0.000890 112.0681 109.2417 15619.30 15657.70 216.65 0.175655 64 | 63 11660.067383 0.001353 117.9714 115.0198 15292.44 15329.24 216.65 0.184946 65 | 64 12211.547852 0.001992 124.1337 121.0526 14968.24 15003.50 216.65 0.194646 66 | 65 12766.873047 0.002857 130.5637 127.3487 14646.68 14680.44 216.65 0.204770 67 | 66 13324.668945 0.003971 137.2703 133.9170 14327.75 14360.05 216.65 0.215331 68 | 67 13881.331055 0.005378 144.2624 140.7663 14011.41 14042.30 216.65 0.226345 69 | 68 14432.139648 0.007133 151.5493 147.9058 13697.65 13727.18 216.65 0.237825 70 | 69 14975.615234 0.009261 159.1403 155.3448 13386.45 13414.65 216.65 0.249786 71 | 70 15508.256836 0.011806 167.0450 163.0927 13077.79 13104.70 216.65 0.262244 72 | 71 16026.115234 0.014816 175.2731 171.1591 12771.64 12797.30 216.65 0.275215 73 | 72 16527.322266 0.018318 183.8344 179.5537 12467.99 12492.44 216.65 0.288713 74 | 73 17008.789063 0.022355 192.7389 188.2867 12166.81 12190.10 216.65 0.302755 75 | 74 17467.613281 0.026964 201.9969 197.3679 11868.08 11890.24 216.65 0.317357 76 | 75 17901.621094 0.032176 211.6186 206.8078 11571.79 11592.86 216.65 0.332536 77 | 76 18308.433594 0.038026 221.6146 216.6166 11277.92 11297.93 216.65 0.348308 78 | 77 18685.718750 0.044548 231.9954 226.8050 10986.70 11005.69 216.74 0.364545 79 | 78 19031.289063 0.051773 242.7719 237.3837 10696.22 10714.22 218.62 0.378253 80 | 79 19343.511719 0.059728 253.9549 248.3634 10405.61 10422.64 220.51 0.392358 81 | 80 19620.042969 0.068448 265.5556 259.7553 10114.89 10130.98 222.40 0.406868 82 | 81 19859.390625 0.077958 277.5852 271.5704 9824.08 9839.26 224.29 0.421790 83 | 82 20059.931641 0.088286 290.0548 283.8200 9533.20 9547.49 226.18 0.437130 84 | 83 20219.664063 0.099462 302.9762 296.5155 9242.26 9255.70 228.08 0.452897 85 | 84 20337.863281 0.111505 316.3607 309.6684 8951.30 8963.90 229.97 0.469097 86 | 85 20412.308594 0.124448 330.2202 323.2904 8660.32 8672.11 231.86 0.485737 87 | 86 20442.078125 0.138313 344.5663 337.3932 8369.35 8380.36 233.75 0.502825 88 | 87 20425.718750 0.153125 359.4111 351.9887 8078.41 8088.67 235.64 0.520367 89 | 88 20361.816406 0.168910 374.7666 367.0889 7787.51 7797.04 237.53 0.538370 90 | 89 20249.511719 0.185689 390.6450 382.7058 7496.68 7505.51 239.42 0.556842 91 | 90 20087.085938 0.203491 407.0583 398.8516 7205.93 7214.09 241.31 0.575790 92 | 91 19874.025391 0.222333 424.0190 415.5387 6915.29 6922.80 243.20 0.595219 93 | 92 19608.572266 0.242244 441.5395 432.7792 6624.76 6631.66 245.09 0.615138 94 | 93 19290.226563 0.263242 459.6321 450.5858 6334.38 6340.68 246.98 0.635553 95 | 94 18917.460938 0.285354 478.3096 468.9708 6044.15 6049.89 248.86 0.656471 96 | 95 18489.707031 0.308598 497.5845 487.9470 5754.10 5759.30 250.75 0.677899 97 | 96 18006.925781 0.332939 517.4198 507.5021 5464.60 5469.30 252.63 0.699815 98 | 97 17471.839844 0.358254 537.7195 527.5696 5176.77 5180.98 254.50 0.722139 99 | 98 16888.687500 0.384363 558.3430 548.0312 4892.26 4896.02 256.35 0.744735 100 | 99 16262.046875 0.411125 579.1926 568.7678 4612.58 4615.92 258.17 0.767472 101 | 100 15596.695313 0.438391 600.1668 589.6797 4338.77 4341.73 259.95 0.790242 102 | 101 14898.453125 0.466003 621.1624 610.6646 4071.80 4074.41 261.68 0.812937 103 | 102 14173.324219 0.493800 642.0764 631.6194 3812.53 3814.82 263.37 0.835453 104 | 103 13427.769531 0.521619 662.8084 652.4424 3561.70 3563.69 265.00 0.857686 105 | 104 12668.257813 0.549301 683.2620 673.0352 3319.94 3321.67 266.57 0.879541 106 | 105 11901.339844 0.576692 703.3467 693.3043 3087.75 3089.25 268.08 0.900929 107 | 106 11133.304688 0.603648 722.9795 713.1631 2865.54 2866.83 269.52 0.921768 108 | 107 10370.175781 0.630036 742.0855 732.5325 2653.58 2654.69 270.90 0.941988 109 | 108 9617.515625 0.655736 760.5996 751.3426 2452.04 2452.99 272.21 0.961527 110 | 109 8880.453125 0.680643 778.4661 769.5329 2260.99 2261.80 273.45 0.980334 111 | 110 8163.375000 0.704669 795.6396 787.0528 2080.41 2081.09 274.63 0.998368 112 | 111 7470.343750 0.727739 812.0847 803.8622 1910.19 1910.76 275.73 1.015598 113 | 112 6804.421875 0.749797 827.7756 819.9302 1750.14 1750.63 276.77 1.032005 114 | 113 6168.531250 0.770798 842.6959 835.2358 1600.04 1600.44 277.75 1.047576 115 | 114 5564.382813 0.790717 856.8376 849.7668 1459.58 1459.91 278.66 1.062310 116 | 115 4993.796875 0.809536 870.2004 863.5190 1328.43 1328.70 279.52 1.076209 117 | 116 4457.375000 0.827256 882.7910 876.4957 1206.21 1206.44 280.31 1.089286 118 | 117 3955.960938 0.843881 894.6222 888.7066 1092.54 1092.73 281.05 1.101558 119 | 118 3489.234375 0.859432 905.7116 900.1669 987.00 987.15 281.73 1.113047 120 | 119 3057.265625 0.873929 916.0815 910.8965 889.17 889.29 282.37 1.123777 121 | 120 2659.140625 0.887408 925.7571 920.9193 798.62 798.72 282.96 1.133779 122 | 121 2294.242188 0.899900 934.7666 930.2618 714.94 715.02 283.50 1.143084 123 | 122 1961.500000 0.911448 943.1399 938.9532 637.70 637.76 284.00 1.151724 124 | 123 1659.476563 0.922096 950.9082 947.0240 566.49 566.54 284.47 1.159733 125 | 124 1387.546875 0.931881 958.1037 954.5059 500.91 500.95 284.89 1.167147 126 | 125 1143.250000 0.940860 964.7584 961.4311 440.58 440.61 285.29 1.173999 127 | 126 926.507813 0.949064 970.9046 967.8315 385.14 385.16 285.65 1.180323 128 | 127 734.992188 0.956550 976.5737 973.7392 334.22 334.24 285.98 1.186154 129 | 128 568.062500 0.963352 981.7968 979.1852 287.51 287.52 286.28 1.191523 130 | 129 424.414063 0.969513 986.6036 984.2002 244.68 244.69 286.56 1.196462 131 | 130 302.476563 0.975078 991.0230 988.8133 205.44 205.44 286.81 1.201001 132 | 131 202.484375 0.980072 995.0824 993.0527 169.50 169.51 287.05 1.205168 133 | 132 122.101563 0.984542 998.8081 996.9452 136.62 136.62 287.26 1.208992 134 | 133 62.781250 0.988500 1002.2250 1000.5165 106.54 106.54 287.46 1.212498 135 | 134 22.835938 0.991984 1005.3562 1003.7906 79.04 79.04 287.64 1.215710 136 | 135 3.757813 0.995003 1008.2239 1006.7900 53.92 53.92 287.80 1.218650 137 | 136 0.000000 0.997630 1010.8487 1009.5363 30.96 30.96 287.95 1.221341 138 | 137 0.000000 1.000000 1013.2500 1012.0494 10.00 10.00 288.09 1.223803 139 | -------------------------------------------------------------------------------- /copy_gipsyx_post_from_geo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Sun Oct 27 08:37:02 2019 5 | 6 | @author: shlomi 7 | """ 8 | 9 | 10 | def progress_percentage(perc, width=None): 11 | # This will only work for python 3.3+ due to use of 12 | # os.get_terminal_size the print function etc. 13 | 14 | FULL_BLOCK = '█' 15 | # this is a gradient of incompleteness 16 | INCOMPLETE_BLOCK_GRAD = ['░', '▒', '▓'] 17 | 18 | assert(isinstance(perc, float)) 19 | assert(0. <= perc <= 100.) 20 | # if width unset use full terminal 21 | if width is None: 22 | width = os.get_terminal_size().columns 23 | # progress bar is block_widget separator perc_widget : ####### 30% 24 | max_perc_widget = '[100.00%]' # 100% is max 25 | separator = ' ' 26 | blocks_widget_width = width - len(separator) - len(max_perc_widget) 27 | assert(blocks_widget_width >= 10) # not very meaningful if not 28 | perc_per_block = 100.0/blocks_widget_width 29 | # epsilon is the sensitivity of rendering a gradient block 30 | epsilon = 1e-6 31 | # number of blocks that should be represented as complete 32 | full_blocks = int((perc + epsilon)/perc_per_block) 33 | # the rest are "incomplete" 34 | empty_blocks = blocks_widget_width - full_blocks 35 | 36 | # build blocks widget 37 | blocks_widget = ([FULL_BLOCK] * full_blocks) 38 | blocks_widget.extend([INCOMPLETE_BLOCK_GRAD[0]] * empty_blocks) 39 | # marginal case - remainder due to how granular our blocks are 40 | remainder = perc - full_blocks*perc_per_block 41 | # epsilon needed for rounding errors (check would be != 0.) 42 | # based on reminder modify first empty block shading 43 | # depending on remainder 44 | if remainder > epsilon: 45 | grad_index = int((len(INCOMPLETE_BLOCK_GRAD) * remainder)/perc_per_block) 46 | blocks_widget[full_blocks] = INCOMPLETE_BLOCK_GRAD[grad_index] 47 | 48 | # build perc widget 49 | str_perc = '%.2f' % perc 50 | # -1 because the percentage sign is not included 51 | perc_widget = '[%s%%]' % str_perc.ljust(len(max_perc_widget) - 3) 52 | 53 | # form progressbar 54 | progress_bar = '%s%s%s' % (''.join(blocks_widget), separator, perc_widget) 55 | # return progressbar as string 56 | return ''.join(progress_bar) 57 | 58 | 59 | def copy_progress(copied, total): 60 | print('\r' + progress_percentage(100*copied/total, width=30), end='') 61 | 62 | 63 | def copyfile(src, dst, *, follow_symlinks=True): 64 | """Copy data from src to dst. 65 | 66 | If follow_symlinks is not set and src is a symbolic link, a new 67 | symlink will be created instead of copying the file it points to. 68 | 69 | """ 70 | if shutil._samefile(src, dst): 71 | raise shutil.SameFileError("{!r} and {!r} are the same file".format(src, dst)) 72 | 73 | for fn in [src, dst]: 74 | try: 75 | st = os.stat(fn) 76 | except OSError: 77 | # File most likely does not exist 78 | pass 79 | else: 80 | # XXX What about other special files? (sockets, devices...) 81 | if shutil.stat.S_ISFIFO(st.st_mode): 82 | raise shutil.SpecialFileError("`%s` is a named pipe" % fn) 83 | 84 | if not follow_symlinks and os.path.islink(src): 85 | os.symlink(os.readlink(src), dst) 86 | else: 87 | size = os.stat(src).st_size 88 | with open(src, 'rb') as fsrc: 89 | with open(dst, 'wb') as fdst: 90 | copyfileobj(fsrc, fdst, callback=copy_progress, total=size) 91 | return dst 92 | 93 | 94 | def copyfileobj(fsrc, fdst, callback, total, length=16*1024): 95 | copied = 0 96 | while True: 97 | buf = fsrc.read(length) 98 | if not buf: 99 | break 100 | fdst.write(buf) 101 | copied += len(buf) 102 | callback(copied, total=total) 103 | 104 | 105 | def copy_with_progress(src, dst, *, follow_symlinks=True): 106 | if os.path.isdir(dst): 107 | dst = os.path.join(dst, os.path.basename(src)) 108 | print('{} is being copied to {}'.format(src, dst)) 109 | copyfile(src, dst, follow_symlinks=follow_symlinks) 110 | shutil.copymode(src, dst) 111 | print('\n') 112 | return 113 | 114 | 115 | def copy_post_from_geo(remote_path, station, days): 116 | from aux_gps import path_glob 117 | from aux_gps import get_datetimes_of_files 118 | if station is not None: 119 | for curr_sta in station: 120 | src_rigid_path = remote_path / curr_sta / 'gipsyx_solutions' 121 | try: 122 | filepaths = path_glob(src_rigid_path, '*PPP*.nc') 123 | except FileNotFoundError: 124 | print('{} final solution not found in {}'.format(curr_sta, 125 | src_rigid_path)) 126 | continue 127 | for filepath in filepaths: 128 | filename = filepath.as_posix().split('/')[-1] 129 | print(filename) 130 | src_path = src_rigid_path / filename 131 | dst_path = workpath / curr_sta / 'gipsyx_solutions' 132 | dst_path.mkdir(parents=True, exist_ok=True) 133 | copy_with_progress(src_path, dst_path) 134 | try: 135 | filepaths = path_glob(src_rigid_path, '*PWV*.nc') 136 | except FileNotFoundError: 137 | print('{} final solution not found in {}'.format(curr_sta, 138 | src_rigid_path)) 139 | continue 140 | for filepath in filepaths: 141 | filename = filepath.as_posix().split('/')[-1] 142 | print(filename) 143 | src_path = src_rigid_path / filename 144 | dst_path = workpath / curr_sta / 'gipsyx_solutions' 145 | dst_path.mkdir(parents=True, exist_ok=True) 146 | copy_with_progress(src_path, dst_path) 147 | else: 148 | df = get_datetimes_of_files(remote_path, '*.nc', col_name='files') 149 | df_pred = get_datetimes_of_files(remote_path, '*_flood_prediction*.csv', col_name='files') 150 | df = pd.concat([df, df_pred]) 151 | df = df.sort_index(ascending=False) 152 | start = df.index[0] - pd.Timedelta(days, unit='d') 153 | end = df.index[0] 154 | df = df.loc[end:start] 155 | for dt, row in df.iterrows(): 156 | src_path = row['files'] 157 | filename = src_path.as_posix().split('/')[-1] 158 | dst_path = workpath 159 | dst_path.mkdir(parents=True, exist_ok=True) 160 | if (dst_path / filename).is_file(): 161 | print('{} already exists, skipping...'.format(filename)) 162 | continue 163 | copy_with_progress(src_path, dst_path) 164 | 165 | print('Done Copying GipsyX results!') 166 | return 167 | 168 | 169 | def check_python_version(min_major=3, min_minor=6): 170 | import sys 171 | major = sys.version_info[0] 172 | minor = sys.version_info[1] 173 | print('detecting python varsion: {}.{}'.format(major, minor)) 174 | if major < min_major or minor < min_minor: 175 | raise ValueError('Python version needs to be at least {}.{} to run this script...'.format(min_major, min_minor)) 176 | return 177 | 178 | 179 | def check_path(path): 180 | import os 181 | path = str(path) 182 | if not os.path.exists(path): 183 | raise argparse.ArgumentTypeError('{} does not exist...'.format(path)) 184 | return path 185 | 186 | 187 | def check_station_name(name): 188 | # import os 189 | if isinstance(name, list): 190 | name = [str(x).lower() for x in name] 191 | for nm in name: 192 | if len(nm) != 4: 193 | raise argparse.ArgumentTypeError('{} should be 4 letters...'.format(nm)) 194 | return name 195 | else: 196 | name = str(name).lower() 197 | if len(name) != 4: 198 | raise argparse.ArgumentTypeError(name + ' should be 4 letters...') 199 | return name 200 | 201 | 202 | if __name__ == '__main__': 203 | import argparse 204 | import sys 205 | from pathlib import Path 206 | from aux_gps import get_var 207 | from aux_gps import path_glob 208 | import pandas as pd 209 | from PW_paths import geo_path 210 | from PW_paths import work_yuval 211 | global pwpath 212 | global workpath 213 | import os 214 | import shutil 215 | # main directive: 216 | # write a script called run_gipsyx_script.sh with: 217 | # cd to the workpath / station and run nohup with the usual args 218 | check_python_version(min_major=3, min_minor=6) 219 | parser = argparse.ArgumentParser(description='a command line tool for ' + 220 | 'copying post proccessed gipsyx nc files' + 221 | 'to home directory structure') 222 | optional = parser._action_groups.pop() 223 | required = parser.add_argument_group('required arguments') 224 | # remove this line: optional = parser... 225 | required.add_argument('--station', help="GPS station name four lowercase letters,", 226 | nargs='+', type=check_station_name) 227 | optional.add_argument('--axis_days', help='number of last days of axis real time products', type=int) 228 | parser._action_groups.append(optional) # added this line 229 | args = parser.parse_args() 230 | pwpath = Path(get_var('PWCORE')) 231 | workpath = Path(get_var('PWORK')) 232 | if pwpath is None: 233 | raise ValueError('Put source code folder at $PWCORE') 234 | # get all the names of israeli gnss stations: 235 | isr_stations = pd.read_csv(pwpath / 'israeli_gnss_coords.txt', 236 | delim_whitespace=True) 237 | isr_stations = isr_stations.index.tolist() 238 | if workpath is None: 239 | raise ValueError('Put source code folder at $PWORK') 240 | # get the names of the stations in workpath: 241 | stations = path_glob(workpath, '*') 242 | stations = [x.as_posix().split('/')[-1] for x in stations if x.is_dir()] 243 | if args.station is None: 244 | print('station is a required argument, run with -h...') 245 | sys.exit() 246 | if args.station == ['soin']: 247 | args.station = isr_stations 248 | remote_path = geo_path / 'Work_Files/PW_yuval/GNSS_stations' 249 | elif args.station == ['axis']: 250 | args.station = None 251 | remote_path = geo_path / 'Work_Files/PW_yuval/axis' 252 | workpath = work_yuval / 'axis' 253 | if args.axis_days is None: 254 | args.axis_days = 1 255 | else: 256 | remote_path = geo_path / 'Work_Files/PW_yuval/GNSS_stations' 257 | # use ISR stations db for israeli stations and ocean loading also: 258 | # if all(a in isr_stations for a in args.station): 259 | copy_post_from_geo(remote_path, args.station, args.axis_days) 260 | -------------------------------------------------------------------------------- /read_trop.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | """ 4 | Created on Mon Apr 15 12:20:17 2019 5 | 6 | @author: shlomi 7 | """ 8 | 9 | 10 | def untar_file(path): 11 | """untar Z file to dir""" 12 | import subprocess 13 | import glob 14 | from subprocess import CalledProcessError 15 | # cmd = [path + 'tar -xvf *.Z'] 16 | # subprocess.call(cmd, shell=True) 17 | try: 18 | subprocess.run(['tar', '-xvf'] + glob.glob(path + '/*.Z') + ['-C'] + [path], 19 | stdout=subprocess.PIPE, check=True) 20 | except CalledProcessError: 21 | subprocess.run(['tar', '-xvf'] + glob.glob(path + '/*.gz') + ['-C'] + [path], 22 | stdout=subprocess.PIPE, check=True) 23 | return 24 | 25 | 26 | def delete_all_files_in_dir(path, extension='trop'): 27 | """delete all trop files in dir after reading them to pandas""" 28 | import glob 29 | import subprocess 30 | subprocess.run(['rm', '-f'] + glob.glob(path + '/*.' + extension), 31 | stdout=subprocess.PIPE, check=True) 32 | return 33 | 34 | 35 | def read_one_station(path, station): 36 | """read one station file (e.g., HART.trop) to dataframe""" 37 | import pandas as pd 38 | import datetime 39 | import xarray as xr 40 | # print('proccessing station: {}'.format(station)) 41 | st = pd.read_csv(path + station + '.trop', comment='#', skiprows=1, 42 | delim_whitespace=True, header=None, 43 | names=['time_tag', 'apriori', 'estimated', 'sigma', 44 | 'parameter']) 45 | # check for empty files: 46 | if st.empty: 47 | print('{}.trop is an empty file... skipping'.format(station)) 48 | return None 49 | else: 50 | # change time_tag to proper datetime index: 51 | st['time'] = datetime.datetime(2000, 1, 1, 12, 0) + pd.to_timedelta(st['time_tag'], unit='s') 52 | st.drop('time_tag', axis=1, inplace=True) 53 | st = st.pivot(index='time', columns='parameter') 54 | # rename cols: 55 | new_cols = ['_'.join([x[1], x[0]]) for x in st.columns] 56 | st.columns = new_cols 57 | # drop all cols but WET: 58 | to_drop = [x for x in st.columns if not x.startswith('WET')] 59 | st.drop(to_drop, axis=1, inplace=True) 60 | # change units to cm: 61 | st = st * 100 62 | # rename and drop more: 63 | cols = ['to_drop', 'zwd', 'sigma'] 64 | st.columns = cols 65 | st.drop('to_drop', axis=1, inplace=True) 66 | stxr = xr.DataArray(st, dims=['time', 'zwd']) 67 | stxr['zwd'] = ['value', 'sigma'] 68 | stxr.name = station 69 | return stxr 70 | 71 | 72 | def read_all_stations_in_day(path, verbose=False): 73 | """read all the stations in a day (directory)""" 74 | import xarray as xr 75 | import glob 76 | names = glob.glob(path + '/*.trop') 77 | station_names = [x.split('/')[-1].split('.')[0] for x in names] 78 | da_list = [] 79 | for station in station_names: 80 | if verbose: 81 | print('reading station {}'.format(station)) 82 | one_station = read_one_station(path + '/', station) 83 | if one_station is not None: 84 | da_list.append(one_station) 85 | ds = xr.merge(da_list) 86 | return ds 87 | 88 | 89 | def untar_read_delete_day(path): 90 | """untar file in directory, read all the station files to datasets 91 | and delete the remaining files""" 92 | untar_file(path) 93 | day = path.split('/')[-1] 94 | year = path.split('/')[-2] 95 | print('reading day {}, in year {}'.format(day, year)) 96 | ds = read_all_stations_in_day(path) 97 | delete_all_files_in_dir(path) 98 | return ds 99 | 100 | 101 | def read_entire_year(base_year_path, save_path=None): 102 | """read all year all stations, return concateneted dataset""" 103 | import os 104 | # import xarray as xr 105 | paths = sorted([x[0] for x in os.walk(base_year_path)]) 106 | paths.pop(0) 107 | # ds_list = [] 108 | # ds = xr.Dataset() 109 | first_ds = untar_read_delete_day(paths[0]) 110 | for path in paths[1:]: 111 | # ds = ds.merge(untar_read_delete_day(path)) 112 | next_ds = untar_read_delete_day(path) 113 | ds = first_ds.combine_first(next_ds) 114 | # ds_list.append(untar_read_delete_day(path)) 115 | first_ds = ds 116 | if save_path is not None: 117 | print('saving file to {}'.format(save_path)) 118 | year = paths[0].split('/')[-2] 119 | comp = dict(zlib=True, complevel=9) # best compression 120 | encoding = {var: comp for var in first_ds.data_vars} 121 | first_ds.to_netcdf(save_path + 'garner_trop_all_stations_' + year + 122 | '.nc', 'w', encoding=encoding) 123 | print('Done!') 124 | # ds = xr.concat(ds_list, 'time') 125 | return first_ds 126 | 127 | 128 | def assemble_stations(path, filenames='garner_trop_all_stations', 129 | station_name=None, save_path=None): 130 | """pick a GPS station in UPPERCASE (four letters) and return a timeseries 131 | for all the epochs""" 132 | import xarray as xr 133 | 134 | def read_one_file_at_atime(path, filenames, station_name): 135 | import glob 136 | st_list = [] 137 | for data_file in sorted(glob.glob(path + filenames + '*.nc')): 138 | print('opening {}'.format(data_file.split('/')[-1])) 139 | data = xr.open_dataset(data_file) 140 | try: 141 | print('reading station {}'.format(station_name)) 142 | station = data[station_name] 143 | st_list.append(station) 144 | except KeyError: 145 | print('The station {} does not exists in file {}'.format(station_name, data_file.split('/')[-1])) 146 | continue 147 | if st_list: 148 | station_con = xr.concat(st_list, 'time') 149 | return station_con 150 | return None 151 | 152 | def read_one_station(data, station_name): 153 | station_name = str(station_name) 154 | try: 155 | station = all_data[station_name] 156 | except KeyError: 157 | print('The station {} does not exists...'.format(station_name)) 158 | return None 159 | return station 160 | 161 | if station_name is not None: 162 | # print('Opening all stations...') 163 | # all_data = xr.open_mfdataset(path + filenames + '*.nc', parallel=True) 164 | if isinstance(station_name, list): 165 | print('Running stations: {}'.format(', '.join(station_name))) 166 | for name in station_name: 167 | # station = read_one_station(all_data, name) 168 | station = read_one_file_at_atime(path, filenames, name) 169 | if station is not None and save_path is not None: 170 | print('saving file to {}'.format(save_path)) 171 | comp = dict(zlib=True, complevel=9) # best compression 172 | encoding = {var: comp for var in station.to_dataset().data_vars} 173 | station.to_netcdf(save_path + 'garner_trop_' + name 174 | + '.nc', 'w', encoding=encoding) 175 | print('Done!') 176 | # return station 177 | else: 178 | # station = read_one_station(all_data, station_name) 179 | station = read_one_file_at_atime(path, filenames, station_name) 180 | if station is not None and save_path is not None: 181 | print('saving file to {}'.format(save_path)) 182 | comp = dict(zlib=True, complevel=9) # best compression 183 | encoding = {var: comp for var in station.to_dataset().data_vars} 184 | station.to_netcdf(save_path + 'garner_trop_' + station_name 185 | + '.nc', 'w', encoding=encoding) 186 | print('Done!') 187 | return station 188 | else: 189 | raise KeyError('pls pick a station...') 190 | return station 191 | 192 | 193 | def check_path(path): 194 | import os 195 | path = str(path) 196 | if not os.path.exists(path): 197 | raise argparse.ArgumentTypeError(path + ' does not exist...') 198 | return path 199 | 200 | 201 | def check_station_name(name): 202 | # import os 203 | if isinstance(name, list): 204 | name = [str(x).upper() for x in name] 205 | for nm in name: 206 | if len(nm) != 4: 207 | raise argparse.ArgumentTypeError('{} should be 4 letters...'.format(nm)) 208 | return name 209 | else: 210 | name = str(name).upper() 211 | if len(name) != 4: 212 | raise argparse.ArgumentTypeError(name + ' should be 4 letters...') 213 | return name 214 | 215 | 216 | if __name__ == '__main__': 217 | import argparse 218 | import sys 219 | import numpy as np 220 | start_year = 2011 221 | end_year = 2019 222 | parser = argparse.ArgumentParser(description='a command line tool for combining gipsy-tpdl files') 223 | optional = parser._action_groups.pop() 224 | required = parser.add_argument_group('required arguments') 225 | # remove this line: optional = parser... 226 | required.add_argument('--path', help="a full path to read years and save nc files,\ 227 | e.g., /data11/ziskin/", type=check_path) 228 | required.add_argument('--mode', help="mode to operate, e.g., read_years, get_station,", 229 | type=str, choices=['read_years', 'get_station']) 230 | optional.add_argument('--station', nargs='+', 231 | help='GPS station name, 4 UPPERCASE letters', 232 | type=check_station_name) 233 | # metavar=str(cds.start_year) + ' to ' + str(cds.end_year)) 234 | # optional.add_argument('--half', help='a spescific six months to download,\ 235 | # e.g, 1 or 2', type=int, choices=[1, 2], 236 | # metavar='1 or 2') 237 | parser._action_groups.append(optional) # added this line 238 | args = parser.parse_args() 239 | # print(parser.format_help()) 240 | # # print(vars(args)) 241 | if args.path is None: 242 | print('path is a required argument, run with -h...') 243 | sys.exit() 244 | # elif args.field is None: 245 | # print('field is a required argument, run with -h...') 246 | # sys.exit() 247 | if args.mode == 'read_years': 248 | years = np.arange(start_year, end_year + 1).astype('str') 249 | for year in years: 250 | year_path = args.path + '/' + year 251 | read_entire_year(year_path, save_path=args.path + '/') 252 | elif args.mode == 'get_station': 253 | if args.station is not None: 254 | assemble_stations(args.path, filenames='garner_trop_all_stations', 255 | station_name=args.station, save_path=args.path) 256 | else: 257 | raise ValueError('need to specify station!') 258 | # command to wget all files and all dirs from http site: 259 | # nohup wget -r --user=anonymous --password='shlomiziskin@gmail.com' 260 | # -e robots=off --no-parent -nH --cut-dirs=2 --reject="index.html*" -U mozilla 261 | # http://garner.ucsd.edu/pub/solutions/gipsy/trop > nohup_wget.out& 262 | -------------------------------------------------------------------------------- /stations/sitelog_instr.txt: -------------------------------------------------------------------------------- 1 | Instructions for filling out IGS site logs 2 | Nov 2018 3 | 4 | See log form at ftp://igs.org/pub/station/general/blank.log 5 | 6 | General 7 | ======= 8 | 9 | Please prepare site logs in plain ASCII. 10 | 11 | Line length is limited to 80 characters. 12 | 13 | When ready, submit site logs by sending as a plain text 14 | email message to support@igs.org. Site logs are usually 15 | handled by the CB within about one business day. 16 | 17 | Date and time formats within the site log follow the basic format 18 | "CCYY-MM-DDThh:mmZ" from ISO 8061; see 19 | http://www.iso.ch/iso/en/prods-services/popstds/datesandtime.html 20 | As a summary, CC=2 digit century 21 | YY=2 digit year 22 | MM=2 digit month 23 | DD=2 digit day of month 24 | T=date/time separator 25 | hh=2 digit hour 26 | mm=2 digit minutes of hour 27 | Z=UTC indicator 28 | /=separator when begin & end times are given 29 | 30 | A date without a time is specified like "2003-07-30", not "2003-07-30Thh:mmZ" 31 | 32 | Latitude/Longitude formats are aligned to ISO 6709: 33 | Lat: +/-DDMMSS.SS 34 | Long: +/-DDDMMSS.SS 35 | A + or - sign is required. Leading zeroes must be used as appropriate 36 | to maintain the DDMMSS and DDDMMSS format. 37 | 38 | Valid latitude range is -90 degrees to +90 degrees. 39 | Valid longitude range is from -180 degrees to (infinitesmally less than) +180 40 | degrees. 41 | 42 | "etc" indicates you may enter any relevant answer, not just a choice 43 | ofthe suggestions shown. 44 | 45 | "F7.4," "A4" and so on indicate the FORTRAN-style format which the 46 | response should have. 47 | Example 12345.7 = F7.1 48 | ABCD = A4 49 | 50 | Blocks which have a "N.x" definition (namely sections 3-10) should 51 | always have the complete historic set of information; when a change is 52 | made, the previous information is left (for example in section 3.1) 53 | and the new information is placed in a new block numbered 3.2. Please 54 | leave the .x sections uncompleted to remind yourself of the format 55 | when the next change occurs. 56 | 57 | Please remove the response hints such as "(F7.4 N/S)" as you fill out 58 | the log (except in the .x sections and Date Removed fields for 59 | currently installed equipment, which you will not alter). If an 60 | answer in an optional field is unknown, try to learn the answer for 61 | the next log update. 62 | 63 | If you have any questions not answered here, please feel free to 64 | contact the IGS Central Bureau:support@igs.org 65 | 66 | Special Instructions by section 67 | ================================ 68 | 69 | 0. Form 70 | ----------- 71 | 72 | If Update: 73 | Previous Site Log : (ssss_CCYYMMDD.log) 74 | If the site already has a log at the IGS Central Bureau, enter 75 | the filename currently found under 76 | ftp://igs.org/pub/station/log/ 77 | ssss = 4 character site name 78 | 79 | If Update: 80 | Modified/Added Sections : (n.n,n.n,...) 81 | Enter the sections which have changed from the previous version 82 | of the log. Example: 3.2, 4.2 83 | 84 | 1. Site Identification of the GNSS Monument 85 | --------------------------------------------- 86 | 87 | IERS DOMES Number : (A9) 88 | This is strictly required. See 89 | http://itrf.ensg.ign.fr/domes_request.php to obtain one. 90 | 91 | Monument Description : (PILLAR/BRASS PLATE/STEEL MAST/FICTIVE/etc) 92 | Enter one or more elements as necessary to describe the monument. 93 | 94 | Additional Information : (multiple lines) 95 | Suggestions: electrical isolation 96 | 97 | 2. Site Location Information 98 | ----------------------------- 99 | 100 | Approximate Position (ITRF) 101 | This should be to a one meter precision. 102 | The elevation may be given to more decimal places than F7.1. 7.1 is a 103 | minimum for the SINEX format. 104 | 105 | 3. GNSS Receiver Information 106 | -------------------------------------- 107 | 108 | Receiver Type : (A20, from rcvr_ant.tab; see instructions) 109 | Please find your receiver in 110 | ftp://igs.org/pub/station/general/rcvr_ant.tab and use 111 | the official name, taking care to get capital letters, hyphens, 112 | etc. exactly correct. If you do not find a listing for your 113 | receiver, please notify the IGS Central Bureau 114 | (support@igs.org). 115 | 116 | Satellite System : (GPS+GLO+GAL+BDS+QZSS+SBAS) 117 | Indicates what the receiver is currently tracking with the installed firmware. 118 | Acronyms can be found in the rcvr_ant.tab standard. 119 | 120 | Serial Number : (A20) 121 | Keep the 5 significant characters of the serial number field in 122 | SINEX in mind: do not enter "S/N 12345" instead of "12345" since 123 | valuable information will be lost. 124 | 125 | Firmware Version : (A11) 126 | Keep the 11 significant characters of the field in SINEX in mind. 127 | 128 | Elevation Cutoff Setting : (deg) 129 | Please respond with the tracking cutoff as set in the receiver, 130 | regardless of terrain or obstructions in the area. 131 | 132 | Temperature Stabiliz. : (none or tolerance in degrees C.) 133 | This refers to the temperature of the room in which the receiver 134 | is housed. 135 | 136 | Date Removed : (CCYY-MM-DDThh:mmZ) 137 | In the block for the receiver currently in operation, leave this 138 | line as is to remind yourself of the format when the next receiver 139 | change is made. 140 | 141 | 4. GNSS Antenna Information 142 | --------------------------------------- 143 | 144 | Antenna Type : (A20 from rcvr_ant.tab; see instructions) 145 | Please find your antenna in 146 | ftp://igs.org/pub/station/general/rcvr_ant.tab and 147 | use the official name, taking care to get capital letters, hyphens, 148 | etc. exactly correct. If you do not find a listing for your 149 | antenna, please notify the IGS Central Bureau 150 | (support@igs.org). Please do not use antenna names from a 151 | "Previously valid" section. Choose the corresponding new antenna 152 | name instead. The radome code from rcvr_ant.tab must be indicated 153 | in columns 17-20 of the Antenna Type, use "NONE" if no radome is 154 | installed. 155 | 156 | The antenna+radome pair must have an entry in 157 | ftp://igs.org/pub/station/general/igs08.atx with zenith- 158 | and azimuth-dependent calibration values down to the horizon. If not, 159 | notify the CB. 160 | 161 | Serial Number : (A20) 162 | Keep the 5 significant characters of the serial number field in 163 | SINEX in mind: do not enter "S/N 12345" instead of "12345" since 164 | valuable information will be lost. 165 | 166 | Antenna Reference Point : (BPA/BCR/XXX from "antenna.gra"; see instructions) 167 | Locate your antenna in the file 168 | ftp://igs.org/pub/station/general/antenna.gra 169 | Indicate the three-letter abbreviation for the point which is 170 | indicated equivalent to ARP for your antenna. Contact the Central 171 | Bureau (support@igs.org) if your antenna does not appear. 172 | 173 | Marker->ARP Up Ecc. (m) : (F8.4) 174 | This is the antenna height measured to an accuracy of 1mm 175 | and defined as the vertical distance of the ARP from the marker 176 | described in section 1. 177 | 178 | Marker->ARP North Ecc(m) : (F8.4) 179 | Marker->ARP East Ecc(m) : (F8.4) 180 | These must be filled in if nonzero. 181 | 182 | Alignment from True N : (deg; + is clockwise/east) 183 | The positive direction is clockwise, so that due east 184 | would be equivalent to a response of "+90" 185 | 186 | Antenna Radome Type : (A4 from rcvr_ant.tab; see instructions) 187 | Place a Radome code from 188 | ftp://igs.org/pub/station/general/rcvr_ant.tab here. 189 | "NONE" indicates there is no external radome. If an antenna has 190 | a cover which is integral and not ordinarily removable by the 191 | user, it is considered part of the antenna and "NONE" is to 192 | be used for the radome code. The radome code used here has to be 193 | the same as the one in the columns 17-20 of the Antenna Type 194 | 195 | Date Removed : (CCYY-MM-DDThh:mmZ) 196 | In the block for the antenna currently in operation, leave this 197 | line as is to remind yourself of the format when the next antenna 198 | change is made. 199 | 200 | 5. Surveyed Local Ties 201 | ------------------------------------------------------------- 202 | Local ties to other markers on the site should be determined in ITRF 203 | coordinates to 1mm precision in all 3 dimensions. Offsets are given 204 | in geocentric Cartesian coordinates (ITRF). 205 | 206 | 8. Meteorological Instrumentation 207 | ------------------------------------------------------------- 208 | Height Diff to Ant : (m) 209 | Positive numbers indicate meteorological instrument is ABOVE GPS antenna. 210 | 211 | 12. Responsible Agency (if different from 11.) 212 | ------------------------------------------------------------- 213 | The primary contacts listed here should always be the first choice for 214 | questions about operation of the site. This person will receive 215 | automated emails regarding site log or RINEX errors and should be 216 | someone who can answer questions about the configuration and data 217 | delivery for this site. 218 | 219 | 13. More Information 220 | ------------------------------------------------------------- 221 | Primary Data Center : 222 | Secondary Data Center : 223 | Please list the DC where the station's data ordinarily goes first as 224 | "Primary." Use "Secondary" either for a second location where 225 | the station's data always goes, or would go in the case of a 226 | long-term failure with the Primary DC. 227 | 228 | Select primary and secondary data centers via centers.html and enter 229 | the abbreviation of the DC name. A geographically- 230 | or functionally- related center is generally preferred. The secondary DC 231 | is where data would be sent if the primary were unavailable for an extended 232 | period. The switchover does not need to be automated, but data transfer 233 | procedures should be verified. 234 | 235 | URL for More Information : 236 | This will be linked on the igscb's page for this site. It is 237 | not necessary to include "http://". 238 | 239 | Photos are mandatory. Send all available photos of antenna, radome, 240 | placement and all relevant photos to the CB. Contact the CB if you have photos 241 | which cannot be hosted on a site web page. 242 | 243 | 244 | Additional Information: 245 | Anything you feel is important. Some possibilities to consider are: 246 | - Elevation mask table indicating physical mask effects such as 247 | AZ ELEV AZ ELEV AZ ELEV AZ ELEV 248 | 10 8 20 12 30 10 40 8 249 | 50 5 60 12 70 8 80 8 250 | 90 5 100 5 110 5 120 5 251 | 130 5 140 5 150 8 160 8 252 | 170 5 180 3 190 5 200 8 253 | 210 8 220 8 230 5 240 5 254 | 250 5 260 8 270 10 280 12 255 | 290 12 300 12 310 12 320 8 256 | 330 5 340 5 350 8 360 8 257 | (This could also be kept at your local www site and referred to 258 | by URL in the log). 259 | 260 | 261 | 262 | 263 | 264 | 265 | -------------------------------------------------------------------------------- /my_trees/ISROcnldVMF1/ISROcnldVMF1_0.tree: -------------------------------------------------------------------------------- 1 | # 2 | # I think it will work for an arbitrary set of stations as well as one, maybe add a ref clock 3 | # for differential. Data types will need to be adjusted for multi-GNSS applications. For multi-GNSS, note 4 | # commented out DataLinkSpecs, ConstellationBias for stations, GPS data types (P-code); without changes 5 | # currently compatible with rinex2. 6 | 7 | 8 | Self 9 | Metadata On # Use "On" to output originating file and line number 10 | File debug.tree 11 | 12 | # The following variables are defined by gd2e configuration at gd2e runtime 13 | 14 | GEOPFILE == 15 | GNSSORB_POS == 16 | GNSS_WLPB == # Default is to bias fix, set 'AmbRes Off' below to not ambiguity resolve 17 | GNSS_ANT_OFF_PCM == 18 | #GNSS_SHADOW == # uncomment this line if your orb/clks have real shadow files ( almost all do ) for faster runs, 19 | # It will be set to /GNSS.shad 20 | # Useful if you have set Satellite.NAME.State.SatelliteTimeSeries.ShadowFinder On, and want to use e.g.: 21 | # Global.Input.ShadowHistory.File $GNSS_SHADOW 22 | GNSSXYZ_FILE == 23 | GNSSLIST == 24 | XYZFILE_STATIONS == 25 | STATIONLIST == 26 | GLOBAL_EPOCH == 27 | FILTER_STOP == 28 | DATARECORD_FILE == dataRecordFile # still not sure if we should have a fixed name 29 | STA_DB == # $GOA_VAR/sta_info/IGb08_sta_db_newfmt remove new format sometime 30 | OCEANLOAD == On # Default is On unless '-rnxFile' is used. 31 | StationCovOnOff == # Default Off, unless -gdCov -runType PPP 32 | 33 | # Names that change with each iteration, smooth_n_i.tdp|pos _n_i where n 34 | # is the number of the tree and i is the number of the subiteration, 35 | # both start numbering at 0 , final iteration is smoothFinal.tdp|pos 36 | # File for TDP_INPUT will be the previous iterations output after iteration 0 37 | SMOOTHPOS == 38 | SMOOTHTDP == 39 | TDP_INPUT == 40 | 41 | 42 | # The following variables maybe adjusted by the user, in the run area 43 | GLOBAL_DATA_RATE == 300 # maybe not this one since we have to decide on high rate clocks 44 | # but it might make sense for others 45 | 46 | 47 | # Users may adjust other models below, trop, tides, ...? Needs more documentation, can sphinx 48 | # grab snippets of documentation like doxygen? 49 | 50 | 51 | Global 52 | Logging 53 | Alert cerr 54 | Warn cout 55 | Event cout 56 | 57 | Filter 58 | Start $GLOBAL_EPOCH 59 | Stop $FILTER_STOP 60 | 61 | MeasGather 62 | DecimateSmoothInterval $GLOBAL_DATA_RATE 63 | HonorEditorFlags On 64 | 65 | Type DATARECORD 66 | FileName $DATARECORD_FILE 67 | 68 | DataTypes 69 | PostSmoothEditGlobals # Options global to EditPoint across all DataLinkSpecs. 70 | MaxIteration 5 71 | 72 | IonoFreeL_1P_2P 73 | DataLinkSpec_LC_GPS 74 | PostSmoothEdit 2e5 2e4 0.125 0.1 0.05 .025 75 | ElDepWeight SqrtSin 76 | #ElMin 7 77 | SignalPath 78 | Platforms .* GPS.* 79 | DataBias 80 | StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 81 | UseItOrLoseItInterval 3600 82 | 83 | IonoFreeC_1P_2P 84 | DataLinkSpec_PC_GPS 85 | SignalPath 86 | Platforms .* GPS.* 87 | PostSmoothEdit 2e5 2e4 12.5 10 5 2.5 88 | ElDepWeight SqrtSin 89 | #ElMin 7 90 | 91 | # IonoFreeL_2I_7I 92 | # DataLinkSpec_LC_BDS 93 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 94 | # SignalPath 95 | # Platforms .* C.* 96 | # DataBias 97 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 98 | # UseItOrLoseItInterval 3600 99 | 100 | # IonoFreeC_2I_7I 101 | # DataLinkSpec_PC_BDS 102 | # PostSmoothEdit 2e5 2e4 25 20 10 5 103 | # SignalPath 104 | # Platforms .* C.* 105 | 106 | # IonoFreeL_1C_7Q 107 | # DataLinkSpec_LC_GAL 108 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 109 | # SignalPath 110 | # Platforms .* E.* 111 | # DataBias 112 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 113 | # UseItOrLoseItInterval 3600 114 | 115 | # IonoFreeC_1C_7Q 116 | # DataLinkSpec_PC_GAL 117 | # PostSmoothEdit 2e5 2e4 25 20 10 5 118 | # SignalPath 119 | # Platforms .* E.* 120 | 121 | # IonoFreeL_1C_2P 122 | # DataLinkSpec_LC_GLO 123 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 124 | # SignalPath 125 | # Platforms .* R.* 126 | # DataBias 127 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 128 | # UseItOrLoseItInterval 3600 129 | 130 | # IonoFreeC_1P_2P 131 | # DataLinkSpec_PC_GLO 132 | # PostSmoothEdit 2e5 2e4 25 20 10 5 133 | # SignalPath 134 | # Platforms .* R.* 135 | # DataBias 136 | # StochasticAdj 1.0e4 3.40e-4 DATADRIVEN RANDOMWALK # psig ~0.1m every 24 hours 137 | # UseItOrLoseItInterval 3600 138 | # DataBiasReference GLONASS 139 | 140 | FilterConfig 141 | Parallel 142 | NumThreads 1 143 | SmootherFormalError 144 | SigmaRegex ^\. # compute FormalError for everything but DataBias 145 | SmootherCovariance 146 | Station $StationCovOnOff 147 | CalculationMethod InverseSriRows # with many stations in the same run this may not be efficient 148 | SmootherPostProcess 149 | Smoother On 150 | TdpFile $SMOOTHTDP 151 | CovarianceFilename smoothFinal.cov 152 | TerminalEpochOnly On 153 | FilterParametersAddRemove 154 | LinkBias Off 155 | 156 | EarthOrientation 157 | GeopTable $GEOPFILE 158 | 159 | Input 160 | TimeDepParms 161 | NameFilter 162 | Satellite\.[A-Z]\w*.*\.Clk\.Bias # only read satellite clocks from tdp 163 | Degree 0 164 | Strict On 165 | MaxDx 1.0e-6 166 | MaxFormalError 0.12 # 12cm is the cutoff we use when making GIPSY products 167 | Station\..*\.Trop.* 168 | File 169 | Path $TDP_INPUT 170 | BufferTime 3600 171 | MaxExtrap 0 172 | 173 | Output 174 | Residual 175 | Prefit 176 | File prefitResiduals.out 177 | Postfit 178 | File postfitResiduals.out 179 | TimeDepParms 180 | NameFilter ^\. # output everything starting with a . so no DataBias_ (phase bias params) 181 | EstimatedOnly Off # output the input so we can interate 182 | File filter.tdp 183 | 184 | AmbRes On 185 | 186 | OutputConstraintsFile constraints.txt 187 | 188 | StatsFile ambres.stats 189 | 190 | Mode inSmoother 191 | 192 | SettingsForGround 193 | SmootherIterations 1 194 | MinOverlap 3600.0 195 | 196 | WidelaneMaxDistanceToNearestInt 0.3 197 | WidelaneInflation 0.1 198 | BackgroundLevel 0.5 199 | WidelaneConfidence 0.750 200 | WidelaneMaxSigma 1.0 201 | 202 | NarrowlaneMaxDistanceToNearestInt 0.2 203 | NarrowlaneInflation 1.5 204 | NarrowlaneConfidence 0.99 205 | NarrowlaneMaxSigma 0.1 206 | InputWlpb 207 | File $GNSS_WLPB 208 | Priority 0 209 | 210 | GlobalNarrowLaneSigmaFactor 6.0 211 | UseNLOverlapSigmas 212 | ComputeAllNLSigmas 213 | 214 | 215 | #------------------------------------------------------------------------------------ 216 | 217 | # Station info: 218 | 219 | # Solve for constant position 220 | GRN_STATION_CLK_WHITE == 221 | State 222 | Pos 223 | ConstantAdj 10.0 224 | Clk 225 | Model On 226 | Bias 0.0 227 | StochasticAdj 3.0e8 3.0e8 $GLOBAL_DATA_RATE WHITENOISE 228 | # ConstellationBias 229 | # Beidou 0.0 230 | # Regex ^C\d+ 231 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 232 | # ConstellationBias 233 | # Galileo 0.0 234 | # Regex ^E\d+ 235 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 236 | Trop 237 | Model On 238 | Mapping VMF1 239 | WetZ 0.1 240 | StochasticAdj 0.5 5e-5 $GLOBAL_DATA_RATE RANDOMWALK 241 | GradEast 0.0 242 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 243 | GradNorth 0.0 244 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 245 | Tides 246 | All On 247 | OceanLoad $OCEANLOAD 248 | OceanLoad On 249 | OceanLoadFile $GOA_VAR/sta_info/ocnld_coeff_ISR_stations 250 | Antennas 251 | Antenna1 252 | XyzFile $XYZFILE_STATIONS 253 | 254 | Station `cat $STATIONLIST` 255 | Station `staDb2TreeIn.py -s $STATIONLIST -y2kSecs $GLOBAL_EPOCH -d $STA_DB` 256 | # Need to put the station xyz file in staDb2TreeIn.py giving it optional antex file list and or stick it in gd2e 257 | 258 | #------------------------------------------------------------------------------------ 259 | 260 | # Satellite info 261 | GPS_Common_Settings == 262 | State 263 | SatelliteTimeSeries 264 | Strict On # Do not interpolate over unequal time steps in input orbit 265 | # Use extreme care if you change this especially if processing data 266 | # that span multiple 30-hour (JPL products) or 24-hour (IGS products) 267 | BufferTime 10800 268 | InterpOrder 11 269 | ShadowFinder On 270 | PosGOAQuaternions Off 271 | PosGOAFile $GNSSORB_POS 272 | Clk 273 | Model On 274 | Bias 0.0 275 | Antennas 276 | Antenna1 277 | XyzFile $GNSSXYZ_FILE 278 | 279 | GPS_BlockI_Model == 280 | AttitudeModel gpsBlockI 281 | 282 | GPS_BlockII_Model == 283 | AttitudeModel gpsBlockII 284 | 285 | GPS_BlockIIA_Model == 286 | AttitudeModel gpsBlockII 287 | 288 | GPS_BlockIIR_Model == 289 | AttitudeModel gpsBlockIIR 290 | 291 | GPS_BlockIIF_Model == 292 | AttitudeModel gpsBlockIIF 293 | 294 | GPS_BlockIII_Model == 295 | AttitudeModel gpsBlockIIF 296 | 297 | BDS_IGSO_MEO == # IGSO/MEO 298 | State 299 | SatelliteTimeSeries 300 | Strict On # Do not interpolate over unequal time steps in input orbit 301 | BufferTime 10800 302 | InterpOrder 11 303 | ShadowFinder On 304 | PosGOAQuaternions Off 305 | PosGOAFile $GNSSORB_POS 306 | Clk 307 | Model On 308 | Bias 0.0 309 | #Antennas # Currently no cal for BDS, but expected in the future 310 | # Antenna1 311 | # XyzFile $GNSSXYZ_FILE 312 | Models 313 | AttitudeModel yawNormal 314 | 315 | BDS_GEO == # GEO 316 | State 317 | SatelliteTimeSeries 318 | Strict On # Do not interpolate over unequal time steps in input orbit 319 | BufferTime 10800 320 | InterpOrder 11 321 | ShadowFinder On 322 | PosGOAQuaternions Off 323 | PosGOAFile $GNSSORB_POS 324 | Clk 325 | Model On 326 | Bias 0.0 327 | #Antennas # Currently no cal for BDS, but expected in the future 328 | # Antenna1 329 | # XyzFile $GNSSXYZ_FILE 330 | Models 331 | AttitudeModel orbitNormal 332 | GLONASS_Common_Settings == 333 | State 334 | SatelliteTimeSeries 335 | Strict On # Do not interpolate over unequal time steps in input orbit 336 | BufferTime 10800 337 | InterpOrder 11 338 | ShadowFinder On 339 | PosGOAQuaternions Off 340 | PosGOAFile $GNSSORB_POS 341 | Clk 342 | Model On 343 | Bias 0.0 344 | #Antennas # Currently no way to use cal for GLO, but expected in the future 345 | # Antenna1 346 | # XyzFile $GNSSXYZ_FILE 347 | 348 | GLO_M_Model == 349 | AttitudeModel glonassM 350 | 351 | GLO_K1_Model == 352 | AttitudeModel glonassM 353 | 354 | GALILEO_Common_Settings == 355 | State 356 | SatelliteTimeSeries 357 | Strict On # Do not interpolate over unequal time steps in input orbit 358 | BufferTime 10800 359 | InterpOrder 11 360 | ShadowFinder On 361 | PosGOAQuaternions Off 362 | PosGOAFile $GNSSORB_POS 363 | Clk 364 | Model On 365 | Bias 0.0 366 | #Antennas # Currently no cal for GAL, but expected in the future 367 | # Antenna1 368 | # XyzFile $GNSSXYZ_FILE 369 | 370 | GAL_IOV_Model == 371 | AttitudeModel galileoIOV 372 | 373 | GAL_FOC_Model == 374 | AttitudeModel galileoIOV # needs revising 375 | 376 | 377 | Satellite `cat $GNSSLIST` 378 | 379 | Satellite `pcm.py -file $GNSS_ANT_OFF_PCM -epoch $GLOBAL_EPOCH -sat $GNSSLIST -param Antenna1` 380 | 381 | Common 382 | YawBiasFile $GOA_VAR/etc/yawBiasTable.pcm 383 | YawRateFile $GOA_VAR/etc/nominalYawRates.pcm 384 | TimeDepParms .Global.Input.TimeDepParms 385 | BufferTime 108000 # has to span distance between two shadows in legacy GOA 386 | MaxExtrap 108000 # again due to legacy GOA 387 | 388 | #---------------------------------------------------------------------------------------------- 389 | -------------------------------------------------------------------------------- /my_trees/noOcnld/noOcnld_0.tree: -------------------------------------------------------------------------------- 1 | # 2 | # I think it will work for an arbitrary set of stations as well as one, maybe add a ref clock 3 | # for differential. Data types will need to be adjusted for multi-GNSS applications. For multi-GNSS, note 4 | # commented out DataLinkSpecs, ConstellationBias for stations, GPS data types (P-code); without changes 5 | # currently compatible with rinex2. 6 | 7 | 8 | Self 9 | Metadata On # Use "On" to output originating file and line number 10 | File debug.tree 11 | 12 | # The following variables are defined by gd2e configuration at gd2e runtime 13 | 14 | GEOPFILE == 15 | GNSSORB_POS == 16 | GNSS_WLPB == # Default is to bias fix, set 'AmbRes Off' below to not ambiguity resolve 17 | GNSS_ANT_OFF_PCM == 18 | #GNSS_SHADOW == # uncomment this line if your orb/clks have real shadow files ( almost all do ) for faster runs, 19 | # It will be set to /GNSS.shad 20 | # Useful if you have set Satellite.NAME.State.SatelliteTimeSeries.ShadowFinder On, and want to use e.g.: 21 | # Global.Input.ShadowHistory.File $GNSS_SHADOW 22 | GNSSXYZ_FILE == 23 | GNSSLIST == 24 | XYZFILE_STATIONS == 25 | STATIONLIST == 26 | GLOBAL_EPOCH == 27 | FILTER_STOP == 28 | DATARECORD_FILE == dataRecordFile # still not sure if we should have a fixed name 29 | STA_DB == # $GOA_VAR/sta_info/IGb08_sta_db_newfmt remove new format sometime 30 | OCEANLOAD == Off # Default is On unless '-rnxFile' is used. 31 | StationCovOnOff == # Default Off, unless -gdCov -runType PPP 32 | 33 | # Names that change with each iteration, smooth_n_i.tdp|pos _n_i where n 34 | # is the number of the tree and i is the number of the subiteration, 35 | # both start numbering at 0 , final iteration is smoothFinal.tdp|pos 36 | # File for TDP_INPUT will be the previous iterations output after iteration 0 37 | SMOOTHPOS == 38 | SMOOTHTDP == 39 | TDP_INPUT == 40 | 41 | 42 | # The following variables maybe adjusted by the user, in the run area 43 | GLOBAL_DATA_RATE == 300 # maybe not this one since we have to decide on high rate clocks 44 | # but it might make sense for others 45 | 46 | 47 | # Users may adjust other models below, trop, tides, ...? Needs more documentation, can sphinx 48 | # grab snippets of documentation like doxygen? 49 | 50 | 51 | Global 52 | Logging 53 | Alert cerr 54 | Warn cout 55 | Event cout 56 | 57 | Filter 58 | Start $GLOBAL_EPOCH 59 | Stop $FILTER_STOP 60 | 61 | MeasGather 62 | DecimateSmoothInterval $GLOBAL_DATA_RATE 63 | HonorEditorFlags On 64 | 65 | Type DATARECORD 66 | FileName $DATARECORD_FILE 67 | 68 | DataTypes 69 | PostSmoothEditGlobals # Options global to EditPoint across all DataLinkSpecs. 70 | MaxIteration 5 71 | 72 | IonoFreeL_1P_2P 73 | DataLinkSpec_LC_GPS 74 | PostSmoothEdit 2e5 2e4 0.125 0.1 0.05 .025 75 | ElDepWeight SqrtSin 76 | #ElMin 7 77 | SignalPath 78 | Platforms .* GPS.* 79 | DataBias 80 | StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 81 | UseItOrLoseItInterval 3600 82 | 83 | IonoFreeC_1P_2P 84 | DataLinkSpec_PC_GPS 85 | SignalPath 86 | Platforms .* GPS.* 87 | PostSmoothEdit 2e5 2e4 12.5 10 5 2.5 88 | ElDepWeight SqrtSin 89 | #ElMin 7 90 | 91 | # IonoFreeL_2I_7I 92 | # DataLinkSpec_LC_BDS 93 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 94 | # SignalPath 95 | # Platforms .* C.* 96 | # DataBias 97 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 98 | # UseItOrLoseItInterval 3600 99 | 100 | # IonoFreeC_2I_7I 101 | # DataLinkSpec_PC_BDS 102 | # PostSmoothEdit 2e5 2e4 25 20 10 5 103 | # SignalPath 104 | # Platforms .* C.* 105 | 106 | # IonoFreeL_1C_7Q 107 | # DataLinkSpec_LC_GAL 108 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 109 | # SignalPath 110 | # Platforms .* E.* 111 | # DataBias 112 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 113 | # UseItOrLoseItInterval 3600 114 | 115 | # IonoFreeC_1C_7Q 116 | # DataLinkSpec_PC_GAL 117 | # PostSmoothEdit 2e5 2e4 25 20 10 5 118 | # SignalPath 119 | # Platforms .* E.* 120 | 121 | # IonoFreeL_1C_2P 122 | # DataLinkSpec_LC_GLO 123 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 124 | # SignalPath 125 | # Platforms .* R.* 126 | # DataBias 127 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 128 | # UseItOrLoseItInterval 3600 129 | 130 | # IonoFreeC_1P_2P 131 | # DataLinkSpec_PC_GLO 132 | # PostSmoothEdit 2e5 2e4 25 20 10 5 133 | # SignalPath 134 | # Platforms .* R.* 135 | # DataBias 136 | # StochasticAdj 1.0e4 3.40e-4 DATADRIVEN RANDOMWALK # psig ~0.1m every 24 hours 137 | # UseItOrLoseItInterval 3600 138 | # DataBiasReference GLONASS 139 | 140 | FilterConfig 141 | Parallel 142 | NumThreads 1 143 | SmootherFormalError 144 | SigmaRegex ^\. # compute FormalError for everything but DataBias 145 | SmootherCovariance 146 | Station $StationCovOnOff 147 | CalculationMethod InverseSriRows # with many stations in the same run this may not be efficient 148 | SmootherPostProcess 149 | Smoother On 150 | TdpFile $SMOOTHTDP 151 | CovarianceFilename smoothFinal.cov 152 | TerminalEpochOnly On 153 | FilterParametersAddRemove 154 | LinkBias Off 155 | 156 | EarthOrientation 157 | GeopTable $GEOPFILE 158 | 159 | Input 160 | TimeDepParms 161 | NameFilter 162 | Satellite\.[A-Z]\w*.*\.Clk\.Bias # only read satellite clocks from tdp 163 | Degree 0 164 | Strict On 165 | MaxDx 1.0e-6 166 | MaxFormalError 0.12 # 12cm is the cutoff we use when making GIPSY products 167 | Station\..*\.Trop.* 168 | File 169 | Path $TDP_INPUT 170 | BufferTime 3600 171 | MaxExtrap 0 172 | 173 | Output 174 | Residual 175 | Prefit 176 | File prefitResiduals.out 177 | Postfit 178 | File postfitResiduals.out 179 | TimeDepParms 180 | NameFilter ^\. # output everything starting with a . so no DataBias_ (phase bias params) 181 | EstimatedOnly Off # output the input so we can interate 182 | File filter.tdp 183 | 184 | AmbRes On 185 | 186 | OutputConstraintsFile constraints.txt 187 | 188 | StatsFile ambres.stats 189 | 190 | Mode inSmoother 191 | 192 | SettingsForGround 193 | SmootherIterations 1 194 | MinOverlap 3600.0 195 | 196 | WidelaneMaxDistanceToNearestInt 0.3 197 | WidelaneInflation 0.1 198 | BackgroundLevel 0.5 199 | WidelaneConfidence 0.750 200 | WidelaneMaxSigma 1.0 201 | 202 | NarrowlaneMaxDistanceToNearestInt 0.2 203 | NarrowlaneInflation 1.5 204 | NarrowlaneConfidence 0.99 205 | NarrowlaneMaxSigma 0.1 206 | InputWlpb 207 | File $GNSS_WLPB 208 | Priority 0 209 | 210 | GlobalNarrowLaneSigmaFactor 6.0 211 | UseNLOverlapSigmas 212 | ComputeAllNLSigmas 213 | 214 | 215 | #------------------------------------------------------------------------------------ 216 | 217 | # Station info: 218 | 219 | # Solve for constant position 220 | GRN_STATION_CLK_WHITE == 221 | State 222 | Pos 223 | ConstantAdj 10.0 224 | Clk 225 | Model On 226 | Bias 0.0 227 | StochasticAdj 3.0e8 3.0e8 $GLOBAL_DATA_RATE WHITENOISE 228 | # ConstellationBias 229 | # Beidou 0.0 230 | # Regex ^C\d+ 231 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 232 | # ConstellationBias 233 | # Galileo 0.0 234 | # Regex ^E\d+ 235 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 236 | Trop 237 | Model On 238 | Mapping GMF 239 | WetZ 0.1 240 | StochasticAdj 0.5 5e-5 $GLOBAL_DATA_RATE RANDOMWALK 241 | GradEast 0.0 242 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 243 | GradNorth 0.0 244 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 245 | Tides 246 | All On 247 | # OceanLoad $OCEANLOAD 248 | OceanLoad Off 249 | OceanLoadFile $GOA_VAR/sta_info/ocnld_coeff_cm_got48ac_wtpxo8ofunc_qlflinn 250 | Antennas 251 | Antenna1 252 | XyzFile $XYZFILE_STATIONS 253 | 254 | Station `cat $STATIONLIST` 255 | Station `staDb2TreeIn.py -s $STATIONLIST -y2kSecs $GLOBAL_EPOCH -d $STA_DB` 256 | # Need to put the station xyz file in staDb2TreeIn.py giving it optional antex file list and or stick it in gd2e 257 | 258 | #------------------------------------------------------------------------------------ 259 | 260 | # Satellite info 261 | GPS_Common_Settings == 262 | State 263 | SatelliteTimeSeries 264 | Strict On # Do not interpolate over unequal time steps in input orbit 265 | # Use extreme care if you change this especially if processing data 266 | # that span multiple 30-hour (JPL products) or 24-hour (IGS products) 267 | BufferTime 10800 268 | InterpOrder 11 269 | ShadowFinder On 270 | PosGOAQuaternions Off 271 | PosGOAFile $GNSSORB_POS 272 | Clk 273 | Model On 274 | Bias 0.0 275 | Antennas 276 | Antenna1 277 | XyzFile $GNSSXYZ_FILE 278 | 279 | GPS_BlockI_Model == 280 | AttitudeModel gpsBlockI 281 | 282 | GPS_BlockII_Model == 283 | AttitudeModel gpsBlockII 284 | 285 | GPS_BlockIIA_Model == 286 | AttitudeModel gpsBlockII 287 | 288 | GPS_BlockIIR_Model == 289 | AttitudeModel gpsBlockIIR 290 | 291 | GPS_BlockIIF_Model == 292 | AttitudeModel gpsBlockIIF 293 | 294 | GPS_BlockIII_Model == 295 | AttitudeModel gpsBlockIIF 296 | 297 | BDS_IGSO_MEO == # IGSO/MEO 298 | State 299 | SatelliteTimeSeries 300 | Strict On # Do not interpolate over unequal time steps in input orbit 301 | BufferTime 10800 302 | InterpOrder 11 303 | ShadowFinder On 304 | PosGOAQuaternions Off 305 | PosGOAFile $GNSSORB_POS 306 | Clk 307 | Model On 308 | Bias 0.0 309 | #Antennas # Currently no cal for BDS, but expected in the future 310 | # Antenna1 311 | # XyzFile $GNSSXYZ_FILE 312 | Models 313 | AttitudeModel yawNormal 314 | 315 | BDS_GEO == # GEO 316 | State 317 | SatelliteTimeSeries 318 | Strict On # Do not interpolate over unequal time steps in input orbit 319 | BufferTime 10800 320 | InterpOrder 11 321 | ShadowFinder On 322 | PosGOAQuaternions Off 323 | PosGOAFile $GNSSORB_POS 324 | Clk 325 | Model On 326 | Bias 0.0 327 | #Antennas # Currently no cal for BDS, but expected in the future 328 | # Antenna1 329 | # XyzFile $GNSSXYZ_FILE 330 | Models 331 | AttitudeModel orbitNormal 332 | GLONASS_Common_Settings == 333 | State 334 | SatelliteTimeSeries 335 | Strict On # Do not interpolate over unequal time steps in input orbit 336 | BufferTime 10800 337 | InterpOrder 11 338 | ShadowFinder On 339 | PosGOAQuaternions Off 340 | PosGOAFile $GNSSORB_POS 341 | Clk 342 | Model On 343 | Bias 0.0 344 | #Antennas # Currently no way to use cal for GLO, but expected in the future 345 | # Antenna1 346 | # XyzFile $GNSSXYZ_FILE 347 | 348 | GLO_M_Model == 349 | AttitudeModel glonassM 350 | 351 | GLO_K1_Model == 352 | AttitudeModel glonassM 353 | 354 | GALILEO_Common_Settings == 355 | State 356 | SatelliteTimeSeries 357 | Strict On # Do not interpolate over unequal time steps in input orbit 358 | BufferTime 10800 359 | InterpOrder 11 360 | ShadowFinder On 361 | PosGOAQuaternions Off 362 | PosGOAFile $GNSSORB_POS 363 | Clk 364 | Model On 365 | Bias 0.0 366 | #Antennas # Currently no cal for GAL, but expected in the future 367 | # Antenna1 368 | # XyzFile $GNSSXYZ_FILE 369 | 370 | GAL_IOV_Model == 371 | AttitudeModel galileoIOV 372 | 373 | GAL_FOC_Model == 374 | AttitudeModel galileoIOV # needs revising 375 | 376 | 377 | Satellite `cat $GNSSLIST` 378 | 379 | Satellite `pcm.py -file $GNSS_ANT_OFF_PCM -epoch $GLOBAL_EPOCH -sat $GNSSLIST -param Antenna1` 380 | 381 | Common 382 | YawBiasFile $GOA_VAR/etc/yawBiasTable.pcm 383 | YawRateFile $GOA_VAR/etc/nominalYawRates.pcm 384 | TimeDepParms .Global.Input.TimeDepParms 385 | BufferTime 108000 # has to span distance between two shadows in legacy GOA 386 | MaxExtrap 108000 # again due to legacy GOA 387 | 388 | #---------------------------------------------------------------------------------------------- 389 | -------------------------------------------------------------------------------- /my_trees/ISROcnldGPT2/ISROcnldGPT2_0.tree: -------------------------------------------------------------------------------- 1 | # 2 | # I think it will work for an arbitrary set of stations as well as one, maybe add a ref clock 3 | # for differential. Data types will need to be adjusted for multi-GNSS applications. For multi-GNSS, note 4 | # commented out DataLinkSpecs, ConstellationBias for stations, GPS data types (P-code); without changes 5 | # currently compatible with rinex2. 6 | 7 | 8 | Self 9 | Metadata On # Use "On" to output originating file and line number 10 | File debug.tree 11 | 12 | # The following variables are defined by gd2e configuration at gd2e runtime 13 | 14 | GEOPFILE == 15 | GNSSORB_POS == 16 | GNSS_WLPB == # Default is to bias fix, set 'AmbRes Off' below to not ambiguity resolve 17 | GNSS_ANT_OFF_PCM == 18 | #GNSS_SHADOW == # uncomment this line if your orb/clks have real shadow files ( almost all do ) for faster runs, 19 | # It will be set to /GNSS.shad 20 | # Useful if you have set Satellite.NAME.State.SatelliteTimeSeries.ShadowFinder On, and want to use e.g.: 21 | # Global.Input.ShadowHistory.File $GNSS_SHADOW 22 | GNSSXYZ_FILE == 23 | GNSSLIST == 24 | XYZFILE_STATIONS == 25 | STATIONLIST == 26 | GLOBAL_EPOCH == 27 | FILTER_STOP == 28 | DATARECORD_FILE == dataRecordFile # still not sure if we should have a fixed name 29 | STA_DB == # $GOA_VAR/sta_info/IGb08_sta_db_newfmt remove new format sometime 30 | OCEANLOAD == On # Default is On unless '-rnxFile' is used. 31 | StationCovOnOff == # Default Off, unless -gdCov -runType PPP 32 | 33 | # Names that change with each iteration, smooth_n_i.tdp|pos _n_i where n 34 | # is the number of the tree and i is the number of the subiteration, 35 | # both start numbering at 0 , final iteration is smoothFinal.tdp|pos 36 | # File for TDP_INPUT will be the previous iterations output after iteration 0 37 | SMOOTHPOS == 38 | SMOOTHTDP == 39 | TDP_INPUT == 40 | 41 | 42 | # The following variables maybe adjusted by the user, in the run area 43 | GLOBAL_DATA_RATE == 300 # maybe not this one since we have to decide on high rate clocks 44 | # but it might make sense for others 45 | 46 | 47 | # Users may adjust other models below, trop, tides, ...? Needs more documentation, can sphinx 48 | # grab snippets of documentation like doxygen? 49 | 50 | 51 | Global 52 | Logging 53 | Alert cerr 54 | Warn cout 55 | Event cout 56 | 57 | Filter 58 | Start $GLOBAL_EPOCH 59 | Stop $FILTER_STOP 60 | 61 | MeasGather 62 | DecimateSmoothInterval $GLOBAL_DATA_RATE 63 | HonorEditorFlags On 64 | 65 | Type DATARECORD 66 | FileName $DATARECORD_FILE 67 | 68 | DataTypes 69 | PostSmoothEditGlobals # Options global to EditPoint across all DataLinkSpecs. 70 | MaxIteration 5 71 | 72 | IonoFreeL_1P_2P 73 | DataLinkSpec_LC_GPS 74 | PostSmoothEdit 2e5 2e4 0.125 0.1 0.05 .025 75 | ElDepWeight SqrtSin 76 | #ElMin 7 77 | SignalPath 78 | Platforms .* GPS.* 79 | DataBias 80 | StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 81 | UseItOrLoseItInterval 3600 82 | 83 | IonoFreeC_1P_2P 84 | DataLinkSpec_PC_GPS 85 | SignalPath 86 | Platforms .* GPS.* 87 | PostSmoothEdit 2e5 2e4 12.5 10 5 2.5 88 | ElDepWeight SqrtSin 89 | #ElMin 7 90 | 91 | # IonoFreeL_2I_7I 92 | # DataLinkSpec_LC_BDS 93 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 94 | # SignalPath 95 | # Platforms .* C.* 96 | # DataBias 97 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 98 | # UseItOrLoseItInterval 3600 99 | 100 | # IonoFreeC_2I_7I 101 | # DataLinkSpec_PC_BDS 102 | # PostSmoothEdit 2e5 2e4 25 20 10 5 103 | # SignalPath 104 | # Platforms .* C.* 105 | 106 | # IonoFreeL_1C_7Q 107 | # DataLinkSpec_LC_GAL 108 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 109 | # SignalPath 110 | # Platforms .* E.* 111 | # DataBias 112 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 113 | # UseItOrLoseItInterval 3600 114 | 115 | # IonoFreeC_1C_7Q 116 | # DataLinkSpec_PC_GAL 117 | # PostSmoothEdit 2e5 2e4 25 20 10 5 118 | # SignalPath 119 | # Platforms .* E.* 120 | 121 | # IonoFreeL_1C_2P 122 | # DataLinkSpec_LC_GLO 123 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 124 | # SignalPath 125 | # Platforms .* R.* 126 | # DataBias 127 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 128 | # UseItOrLoseItInterval 3600 129 | 130 | # IonoFreeC_1P_2P 131 | # DataLinkSpec_PC_GLO 132 | # PostSmoothEdit 2e5 2e4 25 20 10 5 133 | # SignalPath 134 | # Platforms .* R.* 135 | # DataBias 136 | # StochasticAdj 1.0e4 3.40e-4 DATADRIVEN RANDOMWALK # psig ~0.1m every 24 hours 137 | # UseItOrLoseItInterval 3600 138 | # DataBiasReference GLONASS 139 | 140 | FilterConfig 141 | Parallel 142 | NumThreads 1 143 | SmootherFormalError 144 | SigmaRegex ^\. # compute FormalError for everything but DataBias 145 | SmootherCovariance 146 | Station $StationCovOnOff 147 | CalculationMethod InverseSriRows # with many stations in the same run this may not be efficient 148 | SmootherPostProcess 149 | Smoother On 150 | TdpFile $SMOOTHTDP 151 | CovarianceFilename smoothFinal.cov 152 | TerminalEpochOnly On 153 | FilterParametersAddRemove 154 | LinkBias Off 155 | 156 | EarthOrientation 157 | GeopTable $GEOPFILE 158 | 159 | Input 160 | TimeDepParms 161 | NameFilter 162 | Satellite\.[A-Z]\w*.*\.Clk\.Bias # only read satellite clocks from tdp 163 | Degree 0 164 | Strict On 165 | MaxDx 1.0e-6 166 | MaxFormalError 0.12 # 12cm is the cutoff we use when making GIPSY products 167 | Station\..*\.Trop.* 168 | File 169 | Path $TDP_INPUT 170 | BufferTime 3600 171 | MaxExtrap 0 172 | 173 | Output 174 | Residual 175 | Prefit 176 | File prefitResiduals.out 177 | Postfit 178 | File postfitResiduals.out 179 | TimeDepParms 180 | NameFilter ^\. # output everything starting with a . so no DataBias_ (phase bias params) 181 | EstimatedOnly Off # output the input so we can interate 182 | File filter.tdp 183 | 184 | AmbRes On 185 | 186 | OutputConstraintsFile constraints.txt 187 | 188 | StatsFile ambres.stats 189 | 190 | Mode inSmoother 191 | 192 | SettingsForGround 193 | SmootherIterations 1 194 | MinOverlap 3600.0 195 | 196 | WidelaneMaxDistanceToNearestInt 0.3 197 | WidelaneInflation 0.1 198 | BackgroundLevel 0.5 199 | WidelaneConfidence 0.750 200 | WidelaneMaxSigma 1.0 201 | 202 | NarrowlaneMaxDistanceToNearestInt 0.2 203 | NarrowlaneInflation 1.5 204 | NarrowlaneConfidence 0.99 205 | NarrowlaneMaxSigma 0.1 206 | InputWlpb 207 | File $GNSS_WLPB 208 | Priority 0 209 | 210 | GlobalNarrowLaneSigmaFactor 6.0 211 | UseNLOverlapSigmas 212 | ComputeAllNLSigmas 213 | 214 | 215 | #------------------------------------------------------------------------------------ 216 | 217 | # Station info: 218 | Station 219 | VMF1dataDir 2.5x2/VMF1/STD_OP/ 220 | # Solve for constant position 221 | GRN_STATION_CLK_WHITE == 222 | State 223 | Pos 224 | ConstantAdj 10.0 225 | Clk 226 | Model On 227 | Bias 0.0 228 | StochasticAdj 3.0e8 3.0e8 $GLOBAL_DATA_RATE WHITENOISE 229 | # ConstellationBias 230 | # Beidou 0.0 231 | # Regex ^C\d+ 232 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 233 | # ConstellationBias 234 | # Galileo 0.0 235 | # Regex ^E\d+ 236 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 237 | Trop 238 | Model On 239 | Mapping GPT2 240 | WetZ 0.1 241 | StochasticAdj 0.5 5e-5 $GLOBAL_DATA_RATE RANDOMWALK 242 | GradEast 0.0 243 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 244 | GradNorth 0.0 245 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 246 | Tides 247 | All On 248 | OceanLoad $OCEANLOAD 249 | OceanLoad On 250 | OceanLoadFile $GOA_VAR/sta_info/ocnld_coeff_ISR_stations 251 | Antennas 252 | Antenna1 253 | XyzFile $XYZFILE_STATIONS 254 | 255 | Station `cat $STATIONLIST` 256 | Station `staDb2TreeIn.py -s $STATIONLIST -y2kSecs $GLOBAL_EPOCH -d $STA_DB` 257 | # Need to put the station xyz file in staDb2TreeIn.py giving it optional antex file list and or stick it in gd2e 258 | 259 | #------------------------------------------------------------------------------------ 260 | 261 | # Satellite info 262 | GPS_Common_Settings == 263 | State 264 | SatelliteTimeSeries 265 | Strict On # Do not interpolate over unequal time steps in input orbit 266 | # Use extreme care if you change this especially if processing data 267 | # that span multiple 30-hour (JPL products) or 24-hour (IGS products) 268 | BufferTime 10800 269 | InterpOrder 11 270 | ShadowFinder On 271 | PosGOAQuaternions Off 272 | PosGOAFile $GNSSORB_POS 273 | Clk 274 | Model On 275 | Bias 0.0 276 | Antennas 277 | Antenna1 278 | XyzFile $GNSSXYZ_FILE 279 | 280 | GPS_BlockI_Model == 281 | AttitudeModel gpsBlockI 282 | 283 | GPS_BlockII_Model == 284 | AttitudeModel gpsBlockII 285 | 286 | GPS_BlockIIA_Model == 287 | AttitudeModel gpsBlockII 288 | 289 | GPS_BlockIIR_Model == 290 | AttitudeModel gpsBlockIIR 291 | 292 | GPS_BlockIIF_Model == 293 | AttitudeModel gpsBlockIIF 294 | 295 | GPS_BlockIII_Model == 296 | AttitudeModel gpsBlockIIF 297 | 298 | BDS_IGSO_MEO == # IGSO/MEO 299 | State 300 | SatelliteTimeSeries 301 | Strict On # Do not interpolate over unequal time steps in input orbit 302 | BufferTime 10800 303 | InterpOrder 11 304 | ShadowFinder On 305 | PosGOAQuaternions Off 306 | PosGOAFile $GNSSORB_POS 307 | Clk 308 | Model On 309 | Bias 0.0 310 | #Antennas # Currently no cal for BDS, but expected in the future 311 | # Antenna1 312 | # XyzFile $GNSSXYZ_FILE 313 | Models 314 | AttitudeModel yawNormal 315 | 316 | BDS_GEO == # GEO 317 | State 318 | SatelliteTimeSeries 319 | Strict On # Do not interpolate over unequal time steps in input orbit 320 | BufferTime 10800 321 | InterpOrder 11 322 | ShadowFinder On 323 | PosGOAQuaternions Off 324 | PosGOAFile $GNSSORB_POS 325 | Clk 326 | Model On 327 | Bias 0.0 328 | #Antennas # Currently no cal for BDS, but expected in the future 329 | # Antenna1 330 | # XyzFile $GNSSXYZ_FILE 331 | Models 332 | AttitudeModel orbitNormal 333 | GLONASS_Common_Settings == 334 | State 335 | SatelliteTimeSeries 336 | Strict On # Do not interpolate over unequal time steps in input orbit 337 | BufferTime 10800 338 | InterpOrder 11 339 | ShadowFinder On 340 | PosGOAQuaternions Off 341 | PosGOAFile $GNSSORB_POS 342 | Clk 343 | Model On 344 | Bias 0.0 345 | #Antennas # Currently no way to use cal for GLO, but expected in the future 346 | # Antenna1 347 | # XyzFile $GNSSXYZ_FILE 348 | 349 | GLO_M_Model == 350 | AttitudeModel glonassM 351 | 352 | GLO_K1_Model == 353 | AttitudeModel glonassM 354 | 355 | GALILEO_Common_Settings == 356 | State 357 | SatelliteTimeSeries 358 | Strict On # Do not interpolate over unequal time steps in input orbit 359 | BufferTime 10800 360 | InterpOrder 11 361 | ShadowFinder On 362 | PosGOAQuaternions Off 363 | PosGOAFile $GNSSORB_POS 364 | Clk 365 | Model On 366 | Bias 0.0 367 | #Antennas # Currently no cal for GAL, but expected in the future 368 | # Antenna1 369 | # XyzFile $GNSSXYZ_FILE 370 | 371 | GAL_IOV_Model == 372 | AttitudeModel galileoIOV 373 | 374 | GAL_FOC_Model == 375 | AttitudeModel galileoIOV # needs revising 376 | 377 | 378 | Satellite `cat $GNSSLIST` 379 | 380 | Satellite `pcm.py -file $GNSS_ANT_OFF_PCM -epoch $GLOBAL_EPOCH -sat $GNSSLIST -param Antenna1` 381 | 382 | Common 383 | YawBiasFile $GOA_VAR/etc/yawBiasTable.pcm 384 | YawRateFile $GOA_VAR/etc/nominalYawRates.pcm 385 | TimeDepParms .Global.Input.TimeDepParms 386 | BufferTime 108000 # has to span distance between two shadows in legacy GOA 387 | MaxExtrap 108000 # again due to legacy GOA 388 | 389 | #---------------------------------------------------------------------------------------------- 390 | -------------------------------------------------------------------------------- /my_trees/ISROcnldWAAS/ISROcnldWAAS_0.tree: -------------------------------------------------------------------------------- 1 | # 2 | # I think it will work for an arbitrary set of stations as well as one, maybe add a ref clock 3 | # for differential. Data types will need to be adjusted for multi-GNSS applications. For multi-GNSS, note 4 | # commented out DataLinkSpecs, ConstellationBias for stations, GPS data types (P-code); without changes 5 | # currently compatible with rinex2. 6 | 7 | 8 | Self 9 | Metadata On # Use "On" to output originating file and line number 10 | File debug.tree 11 | 12 | # The following variables are defined by gd2e configuration at gd2e runtime 13 | 14 | GEOPFILE == 15 | GNSSORB_POS == 16 | GNSS_WLPB == # Default is to bias fix, set 'AmbRes Off' below to not ambiguity resolve 17 | GNSS_ANT_OFF_PCM == 18 | #GNSS_SHADOW == # uncomment this line if your orb/clks have real shadow files ( almost all do ) for faster runs, 19 | # It will be set to /GNSS.shad 20 | # Useful if you have set Satellite.NAME.State.SatelliteTimeSeries.ShadowFinder On, and want to use e.g.: 21 | # Global.Input.ShadowHistory.File $GNSS_SHADOW 22 | GNSSXYZ_FILE == 23 | GNSSLIST == 24 | XYZFILE_STATIONS == 25 | STATIONLIST == 26 | GLOBAL_EPOCH == 27 | FILTER_STOP == 28 | DATARECORD_FILE == dataRecordFile # still not sure if we should have a fixed name 29 | STA_DB == # $GOA_VAR/sta_info/IGb08_sta_db_newfmt remove new format sometime 30 | OCEANLOAD == On # Default is On unless '-rnxFile' is used. 31 | StationCovOnOff == # Default Off, unless -gdCov -runType PPP 32 | 33 | # Names that change with each iteration, smooth_n_i.tdp|pos _n_i where n 34 | # is the number of the tree and i is the number of the subiteration, 35 | # both start numbering at 0 , final iteration is smoothFinal.tdp|pos 36 | # File for TDP_INPUT will be the previous iterations output after iteration 0 37 | SMOOTHPOS == 38 | SMOOTHTDP == 39 | TDP_INPUT == 40 | 41 | 42 | # The following variables maybe adjusted by the user, in the run area 43 | GLOBAL_DATA_RATE == 300 # maybe not this one since we have to decide on high rate clocks 44 | # but it might make sense for others 45 | 46 | 47 | # Users may adjust other models below, trop, tides, ...? Needs more documentation, can sphinx 48 | # grab snippets of documentation like doxygen? 49 | 50 | 51 | Global 52 | Logging 53 | Alert cerr 54 | Warn cout 55 | Event cout 56 | 57 | Filter 58 | Start $GLOBAL_EPOCH 59 | Stop $FILTER_STOP 60 | 61 | MeasGather 62 | DecimateSmoothInterval $GLOBAL_DATA_RATE 63 | HonorEditorFlags On 64 | 65 | Type DATARECORD 66 | FileName $DATARECORD_FILE 67 | 68 | DataTypes 69 | PostSmoothEditGlobals # Options global to EditPoint across all DataLinkSpecs. 70 | MaxIteration 5 71 | 72 | IonoFreeL_1P_2P 73 | DataLinkSpec_LC_GPS 74 | PostSmoothEdit 2e5 2e4 0.125 0.1 0.05 .025 75 | ElDepWeight SqrtSin 76 | #ElMin 7 77 | SignalPath 78 | Platforms .* GPS.* 79 | DataBias 80 | StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 81 | UseItOrLoseItInterval 3600 82 | 83 | IonoFreeC_1P_2P 84 | DataLinkSpec_PC_GPS 85 | SignalPath 86 | Platforms .* GPS.* 87 | PostSmoothEdit 2e5 2e4 12.5 10 5 2.5 88 | ElDepWeight SqrtSin 89 | #ElMin 7 90 | 91 | # IonoFreeL_2I_7I 92 | # DataLinkSpec_LC_BDS 93 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 94 | # SignalPath 95 | # Platforms .* C.* 96 | # DataBias 97 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 98 | # UseItOrLoseItInterval 3600 99 | 100 | # IonoFreeC_2I_7I 101 | # DataLinkSpec_PC_BDS 102 | # PostSmoothEdit 2e5 2e4 25 20 10 5 103 | # SignalPath 104 | # Platforms .* C.* 105 | 106 | # IonoFreeL_1C_7Q 107 | # DataLinkSpec_LC_GAL 108 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 109 | # SignalPath 110 | # Platforms .* E.* 111 | # DataBias 112 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 113 | # UseItOrLoseItInterval 3600 114 | 115 | # IonoFreeC_1C_7Q 116 | # DataLinkSpec_PC_GAL 117 | # PostSmoothEdit 2e5 2e4 25 20 10 5 118 | # SignalPath 119 | # Platforms .* E.* 120 | 121 | # IonoFreeL_1C_2P 122 | # DataLinkSpec_LC_GLO 123 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 124 | # SignalPath 125 | # Platforms .* R.* 126 | # DataBias 127 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 128 | # UseItOrLoseItInterval 3600 129 | 130 | # IonoFreeC_1P_2P 131 | # DataLinkSpec_PC_GLO 132 | # PostSmoothEdit 2e5 2e4 25 20 10 5 133 | # SignalPath 134 | # Platforms .* R.* 135 | # DataBias 136 | # StochasticAdj 1.0e4 3.40e-4 DATADRIVEN RANDOMWALK # psig ~0.1m every 24 hours 137 | # UseItOrLoseItInterval 3600 138 | # DataBiasReference GLONASS 139 | 140 | FilterConfig 141 | Parallel 142 | NumThreads 1 143 | SmootherFormalError 144 | SigmaRegex ^\. # compute FormalError for everything but DataBias 145 | SmootherCovariance 146 | Station $StationCovOnOff 147 | CalculationMethod InverseSriRows # with many stations in the same run this may not be efficient 148 | SmootherPostProcess 149 | Smoother On 150 | TdpFile $SMOOTHTDP 151 | CovarianceFilename smoothFinal.cov 152 | TerminalEpochOnly On 153 | FilterParametersAddRemove 154 | LinkBias Off 155 | 156 | EarthOrientation 157 | GeopTable $GEOPFILE 158 | 159 | Input 160 | TimeDepParms 161 | NameFilter 162 | Satellite\.[A-Z]\w*.*\.Clk\.Bias # only read satellite clocks from tdp 163 | Degree 0 164 | Strict On 165 | MaxDx 1.0e-6 166 | MaxFormalError 0.12 # 12cm is the cutoff we use when making GIPSY products 167 | Station\..*\.Trop.* 168 | File 169 | Path $TDP_INPUT 170 | BufferTime 3600 171 | MaxExtrap 0 172 | 173 | Output 174 | Residual 175 | Prefit 176 | File prefitResiduals.out 177 | Postfit 178 | File postfitResiduals.out 179 | TimeDepParms 180 | NameFilter ^\. # output everything starting with a . so no DataBias_ (phase bias params) 181 | EstimatedOnly Off # output the input so we can interate 182 | File filter.tdp 183 | 184 | AmbRes On 185 | 186 | OutputConstraintsFile constraints.txt 187 | 188 | StatsFile ambres.stats 189 | 190 | Mode inSmoother 191 | 192 | SettingsForGround 193 | SmootherIterations 1 194 | MinOverlap 3600.0 195 | 196 | WidelaneMaxDistanceToNearestInt 0.3 197 | WidelaneInflation 0.1 198 | BackgroundLevel 0.5 199 | WidelaneConfidence 0.750 200 | WidelaneMaxSigma 1.0 201 | 202 | NarrowlaneMaxDistanceToNearestInt 0.2 203 | NarrowlaneInflation 1.5 204 | NarrowlaneConfidence 0.99 205 | NarrowlaneMaxSigma 0.1 206 | InputWlpb 207 | File $GNSS_WLPB 208 | Priority 0 209 | 210 | GlobalNarrowLaneSigmaFactor 6.0 211 | UseNLOverlapSigmas 212 | ComputeAllNLSigmas 213 | 214 | 215 | #------------------------------------------------------------------------------------ 216 | 217 | # Station info: 218 | Station 219 | VMF1dataDir 2.5x2/VMF1/STD_OP/ 220 | # Solve for constant position 221 | GRN_STATION_CLK_WHITE == 222 | State 223 | Pos 224 | ConstantAdj 10.0 225 | Clk 226 | Model On 227 | Bias 0.0 228 | StochasticAdj 3.0e8 3.0e8 $GLOBAL_DATA_RATE WHITENOISE 229 | # ConstellationBias 230 | # Beidou 0.0 231 | # Regex ^C\d+ 232 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 233 | # ConstellationBias 234 | # Galileo 0.0 235 | # Regex ^E\d+ 236 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 237 | Trop 238 | Model On 239 | Mapping WAAS 240 | WetZ 0.1 241 | StochasticAdj 0.5 5e-5 $GLOBAL_DATA_RATE RANDOMWALK 242 | GradEast 0.0 243 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 244 | GradNorth 0.0 245 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 246 | Tides 247 | All On 248 | OceanLoad $OCEANLOAD 249 | OceanLoad On 250 | OceanLoadFile $GOA_VAR/sta_info/ocnld_coeff_ISR_stations 251 | Antennas 252 | Antenna1 253 | XyzFile $XYZFILE_STATIONS 254 | 255 | Station `cat $STATIONLIST` 256 | Station `staDb2TreeIn.py -s $STATIONLIST -y2kSecs $GLOBAL_EPOCH -d $STA_DB` 257 | # Need to put the station xyz file in staDb2TreeIn.py giving it optional antex file list and or stick it in gd2e 258 | 259 | #------------------------------------------------------------------------------------ 260 | 261 | # Satellite info 262 | GPS_Common_Settings == 263 | State 264 | SatelliteTimeSeries 265 | Strict On # Do not interpolate over unequal time steps in input orbit 266 | # Use extreme care if you change this especially if processing data 267 | # that span multiple 30-hour (JPL products) or 24-hour (IGS products) 268 | BufferTime 10800 269 | InterpOrder 11 270 | ShadowFinder On 271 | PosGOAQuaternions Off 272 | PosGOAFile $GNSSORB_POS 273 | Clk 274 | Model On 275 | Bias 0.0 276 | Antennas 277 | Antenna1 278 | XyzFile $GNSSXYZ_FILE 279 | 280 | GPS_BlockI_Model == 281 | AttitudeModel gpsBlockI 282 | 283 | GPS_BlockII_Model == 284 | AttitudeModel gpsBlockII 285 | 286 | GPS_BlockIIA_Model == 287 | AttitudeModel gpsBlockII 288 | 289 | GPS_BlockIIR_Model == 290 | AttitudeModel gpsBlockIIR 291 | 292 | GPS_BlockIIF_Model == 293 | AttitudeModel gpsBlockIIF 294 | 295 | GPS_BlockIII_Model == 296 | AttitudeModel gpsBlockIIF 297 | 298 | BDS_IGSO_MEO == # IGSO/MEO 299 | State 300 | SatelliteTimeSeries 301 | Strict On # Do not interpolate over unequal time steps in input orbit 302 | BufferTime 10800 303 | InterpOrder 11 304 | ShadowFinder On 305 | PosGOAQuaternions Off 306 | PosGOAFile $GNSSORB_POS 307 | Clk 308 | Model On 309 | Bias 0.0 310 | #Antennas # Currently no cal for BDS, but expected in the future 311 | # Antenna1 312 | # XyzFile $GNSSXYZ_FILE 313 | Models 314 | AttitudeModel yawNormal 315 | 316 | BDS_GEO == # GEO 317 | State 318 | SatelliteTimeSeries 319 | Strict On # Do not interpolate over unequal time steps in input orbit 320 | BufferTime 10800 321 | InterpOrder 11 322 | ShadowFinder On 323 | PosGOAQuaternions Off 324 | PosGOAFile $GNSSORB_POS 325 | Clk 326 | Model On 327 | Bias 0.0 328 | #Antennas # Currently no cal for BDS, but expected in the future 329 | # Antenna1 330 | # XyzFile $GNSSXYZ_FILE 331 | Models 332 | AttitudeModel orbitNormal 333 | GLONASS_Common_Settings == 334 | State 335 | SatelliteTimeSeries 336 | Strict On # Do not interpolate over unequal time steps in input orbit 337 | BufferTime 10800 338 | InterpOrder 11 339 | ShadowFinder On 340 | PosGOAQuaternions Off 341 | PosGOAFile $GNSSORB_POS 342 | Clk 343 | Model On 344 | Bias 0.0 345 | #Antennas # Currently no way to use cal for GLO, but expected in the future 346 | # Antenna1 347 | # XyzFile $GNSSXYZ_FILE 348 | 349 | GLO_M_Model == 350 | AttitudeModel glonassM 351 | 352 | GLO_K1_Model == 353 | AttitudeModel glonassM 354 | 355 | GALILEO_Common_Settings == 356 | State 357 | SatelliteTimeSeries 358 | Strict On # Do not interpolate over unequal time steps in input orbit 359 | BufferTime 10800 360 | InterpOrder 11 361 | ShadowFinder On 362 | PosGOAQuaternions Off 363 | PosGOAFile $GNSSORB_POS 364 | Clk 365 | Model On 366 | Bias 0.0 367 | #Antennas # Currently no cal for GAL, but expected in the future 368 | # Antenna1 369 | # XyzFile $GNSSXYZ_FILE 370 | 371 | GAL_IOV_Model == 372 | AttitudeModel galileoIOV 373 | 374 | GAL_FOC_Model == 375 | AttitudeModel galileoIOV # needs revising 376 | 377 | 378 | Satellite `cat $GNSSLIST` 379 | 380 | Satellite `pcm.py -file $GNSS_ANT_OFF_PCM -epoch $GLOBAL_EPOCH -sat $GNSSLIST -param Antenna1` 381 | 382 | Common 383 | YawBiasFile $GOA_VAR/etc/yawBiasTable.pcm 384 | YawRateFile $GOA_VAR/etc/nominalYawRates.pcm 385 | TimeDepParms .Global.Input.TimeDepParms 386 | BufferTime 108000 # has to span distance between two shadows in legacy GOA 387 | MaxExtrap 108000 # again due to legacy GOA 388 | 389 | #---------------------------------------------------------------------------------------------- 390 | -------------------------------------------------------------------------------- /my_trees/ISROcnldNEILL/ISROcnldNEILL_0.tree: -------------------------------------------------------------------------------- 1 | # 2 | # I think it will work for an arbitrary set of stations as well as one, maybe add a ref clock 3 | # for differential. Data types will need to be adjusted for multi-GNSS applications. For multi-GNSS, note 4 | # commented out DataLinkSpecs, ConstellationBias for stations, GPS data types (P-code); without changes 5 | # currently compatible with rinex2. 6 | 7 | 8 | Self 9 | Metadata On # Use "On" to output originating file and line number 10 | File debug.tree 11 | 12 | # The following variables are defined by gd2e configuration at gd2e runtime 13 | 14 | GEOPFILE == 15 | GNSSORB_POS == 16 | GNSS_WLPB == # Default is to bias fix, set 'AmbRes Off' below to not ambiguity resolve 17 | GNSS_ANT_OFF_PCM == 18 | #GNSS_SHADOW == # uncomment this line if your orb/clks have real shadow files ( almost all do ) for faster runs, 19 | # It will be set to /GNSS.shad 20 | # Useful if you have set Satellite.NAME.State.SatelliteTimeSeries.ShadowFinder On, and want to use e.g.: 21 | # Global.Input.ShadowHistory.File $GNSS_SHADOW 22 | GNSSXYZ_FILE == 23 | GNSSLIST == 24 | XYZFILE_STATIONS == 25 | STATIONLIST == 26 | GLOBAL_EPOCH == 27 | FILTER_STOP == 28 | DATARECORD_FILE == dataRecordFile # still not sure if we should have a fixed name 29 | STA_DB == # $GOA_VAR/sta_info/IGb08_sta_db_newfmt remove new format sometime 30 | OCEANLOAD == On # Default is On unless '-rnxFile' is used. 31 | StationCovOnOff == # Default Off, unless -gdCov -runType PPP 32 | 33 | # Names that change with each iteration, smooth_n_i.tdp|pos _n_i where n 34 | # is the number of the tree and i is the number of the subiteration, 35 | # both start numbering at 0 , final iteration is smoothFinal.tdp|pos 36 | # File for TDP_INPUT will be the previous iterations output after iteration 0 37 | SMOOTHPOS == 38 | SMOOTHTDP == 39 | TDP_INPUT == 40 | 41 | 42 | # The following variables maybe adjusted by the user, in the run area 43 | GLOBAL_DATA_RATE == 300 # maybe not this one since we have to decide on high rate clocks 44 | # but it might make sense for others 45 | 46 | 47 | # Users may adjust other models below, trop, tides, ...? Needs more documentation, can sphinx 48 | # grab snippets of documentation like doxygen? 49 | 50 | 51 | Global 52 | Logging 53 | Alert cerr 54 | Warn cout 55 | Event cout 56 | 57 | Filter 58 | Start $GLOBAL_EPOCH 59 | Stop $FILTER_STOP 60 | 61 | MeasGather 62 | DecimateSmoothInterval $GLOBAL_DATA_RATE 63 | HonorEditorFlags On 64 | 65 | Type DATARECORD 66 | FileName $DATARECORD_FILE 67 | 68 | DataTypes 69 | PostSmoothEditGlobals # Options global to EditPoint across all DataLinkSpecs. 70 | MaxIteration 5 71 | 72 | IonoFreeL_1P_2P 73 | DataLinkSpec_LC_GPS 74 | PostSmoothEdit 2e5 2e4 0.125 0.1 0.05 .025 75 | ElDepWeight SqrtSin 76 | #ElMin 7 77 | SignalPath 78 | Platforms .* GPS.* 79 | DataBias 80 | StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 81 | UseItOrLoseItInterval 3600 82 | 83 | IonoFreeC_1P_2P 84 | DataLinkSpec_PC_GPS 85 | SignalPath 86 | Platforms .* GPS.* 87 | PostSmoothEdit 2e5 2e4 12.5 10 5 2.5 88 | ElDepWeight SqrtSin 89 | #ElMin 7 90 | 91 | # IonoFreeL_2I_7I 92 | # DataLinkSpec_LC_BDS 93 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 94 | # SignalPath 95 | # Platforms .* C.* 96 | # DataBias 97 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 98 | # UseItOrLoseItInterval 3600 99 | 100 | # IonoFreeC_2I_7I 101 | # DataLinkSpec_PC_BDS 102 | # PostSmoothEdit 2e5 2e4 25 20 10 5 103 | # SignalPath 104 | # Platforms .* C.* 105 | 106 | # IonoFreeL_1C_7Q 107 | # DataLinkSpec_LC_GAL 108 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 109 | # SignalPath 110 | # Platforms .* E.* 111 | # DataBias 112 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 113 | # UseItOrLoseItInterval 3600 114 | 115 | # IonoFreeC_1C_7Q 116 | # DataLinkSpec_PC_GAL 117 | # PostSmoothEdit 2e5 2e4 25 20 10 5 118 | # SignalPath 119 | # Platforms .* E.* 120 | 121 | # IonoFreeL_1C_2P 122 | # DataLinkSpec_LC_GLO 123 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 124 | # SignalPath 125 | # Platforms .* R.* 126 | # DataBias 127 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 128 | # UseItOrLoseItInterval 3600 129 | 130 | # IonoFreeC_1P_2P 131 | # DataLinkSpec_PC_GLO 132 | # PostSmoothEdit 2e5 2e4 25 20 10 5 133 | # SignalPath 134 | # Platforms .* R.* 135 | # DataBias 136 | # StochasticAdj 1.0e4 3.40e-4 DATADRIVEN RANDOMWALK # psig ~0.1m every 24 hours 137 | # UseItOrLoseItInterval 3600 138 | # DataBiasReference GLONASS 139 | 140 | FilterConfig 141 | Parallel 142 | NumThreads 1 143 | SmootherFormalError 144 | SigmaRegex ^\. # compute FormalError for everything but DataBias 145 | SmootherCovariance 146 | Station $StationCovOnOff 147 | CalculationMethod InverseSriRows # with many stations in the same run this may not be efficient 148 | SmootherPostProcess 149 | Smoother On 150 | TdpFile $SMOOTHTDP 151 | CovarianceFilename smoothFinal.cov 152 | TerminalEpochOnly On 153 | FilterParametersAddRemove 154 | LinkBias Off 155 | 156 | EarthOrientation 157 | GeopTable $GEOPFILE 158 | 159 | Input 160 | TimeDepParms 161 | NameFilter 162 | Satellite\.[A-Z]\w*.*\.Clk\.Bias # only read satellite clocks from tdp 163 | Degree 0 164 | Strict On 165 | MaxDx 1.0e-6 166 | MaxFormalError 0.12 # 12cm is the cutoff we use when making GIPSY products 167 | Station\..*\.Trop.* 168 | File 169 | Path $TDP_INPUT 170 | BufferTime 3600 171 | MaxExtrap 0 172 | 173 | Output 174 | Residual 175 | Prefit 176 | File prefitResiduals.out 177 | Postfit 178 | File postfitResiduals.out 179 | TimeDepParms 180 | NameFilter ^\. # output everything starting with a . so no DataBias_ (phase bias params) 181 | EstimatedOnly Off # output the input so we can interate 182 | File filter.tdp 183 | 184 | AmbRes On 185 | 186 | OutputConstraintsFile constraints.txt 187 | 188 | StatsFile ambres.stats 189 | 190 | Mode inSmoother 191 | 192 | SettingsForGround 193 | SmootherIterations 1 194 | MinOverlap 3600.0 195 | 196 | WidelaneMaxDistanceToNearestInt 0.3 197 | WidelaneInflation 0.1 198 | BackgroundLevel 0.5 199 | WidelaneConfidence 0.750 200 | WidelaneMaxSigma 1.0 201 | 202 | NarrowlaneMaxDistanceToNearestInt 0.2 203 | NarrowlaneInflation 1.5 204 | NarrowlaneConfidence 0.99 205 | NarrowlaneMaxSigma 0.1 206 | InputWlpb 207 | File $GNSS_WLPB 208 | Priority 0 209 | 210 | GlobalNarrowLaneSigmaFactor 6.0 211 | UseNLOverlapSigmas 212 | ComputeAllNLSigmas 213 | 214 | 215 | #------------------------------------------------------------------------------------ 216 | 217 | # Station info: 218 | Station 219 | VMF1dataDir 2.5x2/VMF1/STD_OP/ 220 | # Solve for constant position 221 | GRN_STATION_CLK_WHITE == 222 | State 223 | Pos 224 | ConstantAdj 10.0 225 | Clk 226 | Model On 227 | Bias 0.0 228 | StochasticAdj 3.0e8 3.0e8 $GLOBAL_DATA_RATE WHITENOISE 229 | # ConstellationBias 230 | # Beidou 0.0 231 | # Regex ^C\d+ 232 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 233 | # ConstellationBias 234 | # Galileo 0.0 235 | # Regex ^E\d+ 236 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 237 | Trop 238 | Model On 239 | Mapping NIELL 240 | WetZ 0.1 241 | StochasticAdj 0.5 5e-5 $GLOBAL_DATA_RATE RANDOMWALK 242 | GradEast 0.0 243 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 244 | GradNorth 0.0 245 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 246 | Tides 247 | All On 248 | OceanLoad $OCEANLOAD 249 | OceanLoad On 250 | OceanLoadFile $GOA_VAR/sta_info/ocnld_coeff_ISR_stations 251 | Antennas 252 | Antenna1 253 | XyzFile $XYZFILE_STATIONS 254 | 255 | Station `cat $STATIONLIST` 256 | Station `staDb2TreeIn.py -s $STATIONLIST -y2kSecs $GLOBAL_EPOCH -d $STA_DB` 257 | # Need to put the station xyz file in staDb2TreeIn.py giving it optional antex file list and or stick it in gd2e 258 | 259 | #------------------------------------------------------------------------------------ 260 | 261 | # Satellite info 262 | GPS_Common_Settings == 263 | State 264 | SatelliteTimeSeries 265 | Strict On # Do not interpolate over unequal time steps in input orbit 266 | # Use extreme care if you change this especially if processing data 267 | # that span multiple 30-hour (JPL products) or 24-hour (IGS products) 268 | BufferTime 10800 269 | InterpOrder 11 270 | ShadowFinder On 271 | PosGOAQuaternions Off 272 | PosGOAFile $GNSSORB_POS 273 | Clk 274 | Model On 275 | Bias 0.0 276 | Antennas 277 | Antenna1 278 | XyzFile $GNSSXYZ_FILE 279 | 280 | GPS_BlockI_Model == 281 | AttitudeModel gpsBlockI 282 | 283 | GPS_BlockII_Model == 284 | AttitudeModel gpsBlockII 285 | 286 | GPS_BlockIIA_Model == 287 | AttitudeModel gpsBlockII 288 | 289 | GPS_BlockIIR_Model == 290 | AttitudeModel gpsBlockIIR 291 | 292 | GPS_BlockIIF_Model == 293 | AttitudeModel gpsBlockIIF 294 | 295 | GPS_BlockIII_Model == 296 | AttitudeModel gpsBlockIIF 297 | 298 | BDS_IGSO_MEO == # IGSO/MEO 299 | State 300 | SatelliteTimeSeries 301 | Strict On # Do not interpolate over unequal time steps in input orbit 302 | BufferTime 10800 303 | InterpOrder 11 304 | ShadowFinder On 305 | PosGOAQuaternions Off 306 | PosGOAFile $GNSSORB_POS 307 | Clk 308 | Model On 309 | Bias 0.0 310 | #Antennas # Currently no cal for BDS, but expected in the future 311 | # Antenna1 312 | # XyzFile $GNSSXYZ_FILE 313 | Models 314 | AttitudeModel yawNormal 315 | 316 | BDS_GEO == # GEO 317 | State 318 | SatelliteTimeSeries 319 | Strict On # Do not interpolate over unequal time steps in input orbit 320 | BufferTime 10800 321 | InterpOrder 11 322 | ShadowFinder On 323 | PosGOAQuaternions Off 324 | PosGOAFile $GNSSORB_POS 325 | Clk 326 | Model On 327 | Bias 0.0 328 | #Antennas # Currently no cal for BDS, but expected in the future 329 | # Antenna1 330 | # XyzFile $GNSSXYZ_FILE 331 | Models 332 | AttitudeModel orbitNormal 333 | GLONASS_Common_Settings == 334 | State 335 | SatelliteTimeSeries 336 | Strict On # Do not interpolate over unequal time steps in input orbit 337 | BufferTime 10800 338 | InterpOrder 11 339 | ShadowFinder On 340 | PosGOAQuaternions Off 341 | PosGOAFile $GNSSORB_POS 342 | Clk 343 | Model On 344 | Bias 0.0 345 | #Antennas # Currently no way to use cal for GLO, but expected in the future 346 | # Antenna1 347 | # XyzFile $GNSSXYZ_FILE 348 | 349 | GLO_M_Model == 350 | AttitudeModel glonassM 351 | 352 | GLO_K1_Model == 353 | AttitudeModel glonassM 354 | 355 | GALILEO_Common_Settings == 356 | State 357 | SatelliteTimeSeries 358 | Strict On # Do not interpolate over unequal time steps in input orbit 359 | BufferTime 10800 360 | InterpOrder 11 361 | ShadowFinder On 362 | PosGOAQuaternions Off 363 | PosGOAFile $GNSSORB_POS 364 | Clk 365 | Model On 366 | Bias 0.0 367 | #Antennas # Currently no cal for GAL, but expected in the future 368 | # Antenna1 369 | # XyzFile $GNSSXYZ_FILE 370 | 371 | GAL_IOV_Model == 372 | AttitudeModel galileoIOV 373 | 374 | GAL_FOC_Model == 375 | AttitudeModel galileoIOV # needs revising 376 | 377 | 378 | Satellite `cat $GNSSLIST` 379 | 380 | Satellite `pcm.py -file $GNSS_ANT_OFF_PCM -epoch $GLOBAL_EPOCH -sat $GNSSLIST -param Antenna1` 381 | 382 | Common 383 | YawBiasFile $GOA_VAR/etc/yawBiasTable.pcm 384 | YawRateFile $GOA_VAR/etc/nominalYawRates.pcm 385 | TimeDepParms .Global.Input.TimeDepParms 386 | BufferTime 108000 # has to span distance between two shadows in legacy GOA 387 | MaxExtrap 108000 # again due to legacy GOA 388 | 389 | #---------------------------------------------------------------------------------------------- 390 | -------------------------------------------------------------------------------- /my_trees/elmin/elmin_0.tree: -------------------------------------------------------------------------------- 1 | # 2 | # I think it will work for an arbitrary set of stations as well as one, maybe add a ref clock 3 | # for differential. Data types will need to be adjusted for multi-GNSS applications. For multi-GNSS, note 4 | # commented out DataLinkSpecs, ConstellationBias for stations, GPS data types (P-code); without changes 5 | # currently compatible with rinex2. 6 | 7 | 8 | Self 9 | Metadata On # Use "On" to output originating file and line number 10 | File debug.tree 11 | 12 | # The following variables are defined by gd2e configuration at gd2e runtime 13 | 14 | GEOPFILE == GNSSinitValues/GNSS.eo 15 | GNSSORB_POS == GNSSinitValues/GNSS.pos 16 | GNSS_WLPB == GNSSinitValues/GNSS.wlpb 17 | GNSS_ANT_OFF_PCM == GNSSinitValues/GNSS.pcm 18 | #GNSS_SHADOW == # uncomment this line if your orb/clks have real shadow files ( almost all do ) for faster runs, 19 | # It will be set to /GNSS.shad 20 | # Useful if you have set Satellite.NAME.State.SatelliteTimeSeries.ShadowFinder On, and want to use e.g.: 21 | # Global.Input.ShadowHistory.File $GNSS_SHADOW 22 | GNSSXYZ_FILE == /home/ziskin/goa-var/etc/antenna_cals_xmit/igs14_1958.xyz 23 | GNSSLIST == gnssList.txt 24 | XYZFILE_STATIONS == allStations.xyz 25 | STATIONLIST == stations.txt 26 | GLOBAL_EPOCH == -107524500 # 1996-08-05 00:05:00.000000 27 | FILTER_STOP == -107438700 # 1996-08-05 23:55:00.000000 28 | DATARECORD_FILE == /home/ziskin/Work_Files/PW_yuval/TELA_data.dr.gz 29 | STA_DB == /home/ziskin/Work_Files/PW_yuval/TELA.staDb 30 | OCEANLOAD == On 31 | StationCovOnOff == Off 32 | 33 | # Names that change with each iteration, smooth_n_i.tdp|pos _n_i where n 34 | # is the number of the tree and i is the number of the subiteration, 35 | # both start numbering at 0 , final iteration is smoothFinal.tdp|pos 36 | # File for TDP_INPUT will be the previous iterations output after iteration 0 37 | SMOOTHPOS == smooth0_0.pos 38 | SMOOTHTDP == smooth0_0.tdp 39 | TDP_INPUT == GNSSinitValues/GNSS.tdp 40 | 41 | 42 | # The following variables maybe adjusted by the user, in the run area 43 | GLOBAL_DATA_RATE == 300 # maybe not this one since we have to decide on high rate clocks 44 | # but it might make sense for others 45 | 46 | 47 | # Users may adjust other models below, trop, tides, ...? Needs more documentation, can sphinx 48 | # grab snippets of documentation like doxygen? 49 | 50 | 51 | Global 52 | Logging 53 | Alert cerr 54 | Warn cout 55 | Event cout 56 | 57 | Filter 58 | Start $GLOBAL_EPOCH 59 | Stop $FILTER_STOP 60 | 61 | MeasGather 62 | DecimateSmoothInterval $GLOBAL_DATA_RATE 63 | HonorEditorFlags On 64 | 65 | Type DATARECORD 66 | FileName $DATARECORD_FILE 67 | 68 | DataTypes 69 | PostSmoothEditGlobals # Options global to EditPoint across all DataLinkSpecs. 70 | MaxIteration 5 71 | 72 | IonoFreeL_1P_2P 73 | DataLinkSpec_LC_GPS 74 | PostSmoothEdit 2e5 2e4 0.125 0.1 0.05 .025 75 | ElDepWeight SqrtSin 76 | # ElMin 7 77 | ElMin 15 78 | SignalPath 79 | Platforms .* GPS.* 80 | DataBias 81 | StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 82 | UseItOrLoseItInterval 3600 83 | 84 | IonoFreeC_1P_2P 85 | DataLinkSpec_PC_GPS 86 | SignalPath 87 | Platforms .* GPS.* 88 | PostSmoothEdit 2e5 2e4 12.5 10 5 2.5 89 | ElDepWeight SqrtSin 90 | # ElMin 7 91 | ElMin 15 92 | # IonoFreeL_2I_7I 93 | # DataLinkSpec_LC_BDS 94 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 95 | # SignalPath 96 | # Platforms .* C.* 97 | # DataBias 98 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 99 | # UseItOrLoseItInterval 3600 100 | 101 | # IonoFreeC_2I_7I 102 | # DataLinkSpec_PC_BDS 103 | # PostSmoothEdit 2e5 2e4 25 20 10 5 104 | # SignalPath 105 | # Platforms .* C.* 106 | 107 | # IonoFreeL_1C_7Q 108 | # DataLinkSpec_LC_GAL 109 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 110 | # SignalPath 111 | # Platforms .* E.* 112 | # DataBias 113 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 114 | # UseItOrLoseItInterval 3600 115 | 116 | # IonoFreeC_1C_7Q 117 | # DataLinkSpec_PC_GAL 118 | # PostSmoothEdit 2e5 2e4 25 20 10 5 119 | # SignalPath 120 | # Platforms .* E.* 121 | 122 | # IonoFreeL_1C_2P 123 | # DataLinkSpec_LC_GLO 124 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 125 | # SignalPath 126 | # Platforms .* R.* 127 | # DataBias 128 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 129 | # UseItOrLoseItInterval 3600 130 | 131 | # IonoFreeC_1P_2P 132 | # DataLinkSpec_PC_GLO 133 | # PostSmoothEdit 2e5 2e4 25 20 10 5 134 | # SignalPath 135 | # Platforms .* R.* 136 | # DataBias 137 | # StochasticAdj 1.0e4 3.40e-4 DATADRIVEN RANDOMWALK # psig ~0.1m every 24 hours 138 | # UseItOrLoseItInterval 3600 139 | # DataBiasReference GLONASS 140 | 141 | FilterConfig 142 | Parallel 143 | NumThreads 1 144 | SmootherFormalError 145 | SigmaRegex ^\. # compute FormalError for everything but DataBias 146 | SmootherCovariance 147 | Station $StationCovOnOff 148 | CalculationMethod InverseSriRows # with many stations in the same run this may not be efficient 149 | SmootherPostProcess 150 | Smoother On 151 | TdpFile $SMOOTHTDP 152 | CovarianceFilename smoothFinal.cov 153 | TerminalEpochOnly On 154 | FilterParametersAddRemove 155 | LinkBias Off 156 | 157 | EarthOrientation 158 | GeopTable $GEOPFILE 159 | 160 | Input 161 | TimeDepParms 162 | NameFilter 163 | Satellite\.[A-Z]\w*.*\.Clk\.Bias # only read satellite clocks from tdp 164 | Degree 0 165 | Strict On 166 | MaxDx 1.0e-6 167 | MaxFormalError 0.12 # 12cm is the cutoff we use when making GIPSY products 168 | Station\..*\.Trop.* 169 | File 170 | Path $TDP_INPUT 171 | BufferTime 3600 172 | MaxExtrap 0 173 | 174 | Output 175 | Residual 176 | Prefit 177 | File prefitResiduals.out 178 | Postfit 179 | File postfitResiduals.out 180 | TimeDepParms 181 | NameFilter ^\. # output everything starting with a . so no DataBias_ (phase bias params) 182 | EstimatedOnly Off # output the input so we can interate 183 | File filter.tdp 184 | 185 | AmbRes On 186 | 187 | OutputConstraintsFile constraints.txt 188 | 189 | StatsFile ambres.stats 190 | 191 | Mode inSmoother 192 | 193 | SettingsForGround 194 | SmootherIterations 1 195 | MinOverlap 3600.0 196 | 197 | WidelaneMaxDistanceToNearestInt 0.3 198 | WidelaneInflation 0.1 199 | BackgroundLevel 0.5 200 | WidelaneConfidence 0.750 201 | WidelaneMaxSigma 1.0 202 | 203 | NarrowlaneMaxDistanceToNearestInt 0.2 204 | NarrowlaneInflation 1.5 205 | NarrowlaneConfidence 0.99 206 | NarrowlaneMaxSigma 0.1 207 | InputWlpb 208 | File $GNSS_WLPB 209 | Priority 0 210 | 211 | GlobalNarrowLaneSigmaFactor 6.0 212 | UseNLOverlapSigmas 213 | ComputeAllNLSigmas 214 | 215 | 216 | #------------------------------------------------------------------------------------ 217 | 218 | # Station info: 219 | 220 | # Solve for constant position 221 | GRN_STATION_CLK_WHITE == 222 | State 223 | Pos 224 | ConstantAdj 10.0 225 | Clk 226 | Model On 227 | Bias 0.0 228 | StochasticAdj 3.0e8 3.0e8 $GLOBAL_DATA_RATE WHITENOISE 229 | # ConstellationBias 230 | # Beidou 0.0 231 | # Regex ^C\d+ 232 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 233 | # ConstellationBias 234 | # Galileo 0.0 235 | # Regex ^E\d+ 236 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 237 | Trop 238 | Model On 239 | Mapping GMF 240 | WetZ 0.1 241 | StochasticAdj 0.5 5e-5 $GLOBAL_DATA_RATE RANDOMWALK 242 | GradEast 0.0 243 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 244 | GradNorth 0.0 245 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 246 | Tides 247 | All On 248 | OceanLoad $OCEANLOAD 249 | OceanLoadFile $GOA_VAR/sta_info/ocnld_coeff_cm_got48ac_wtpxo8ofunc_qlflinn 250 | Antennas 251 | Antenna1 252 | XyzFile $XYZFILE_STATIONS 253 | 254 | Station `cat $STATIONLIST` 255 | Station `staDb2TreeIn.py -s $STATIONLIST -y2kSecs $GLOBAL_EPOCH -d $STA_DB` 256 | # Need to put the station xyz file in staDb2TreeIn.py giving it optional antex file list and or stick it in gd2e 257 | 258 | #------------------------------------------------------------------------------------ 259 | 260 | # Satellite info 261 | GPS_Common_Settings == 262 | State 263 | SatelliteTimeSeries 264 | Strict On # Do not interpolate over unequal time steps in input orbit 265 | # Use extreme care if you change this especially if processing data 266 | # that span multiple 30-hour (JPL products) or 24-hour (IGS products) 267 | BufferTime 10800 268 | InterpOrder 11 269 | ShadowFinder On 270 | PosGOAQuaternions Off 271 | PosGOAFile $GNSSORB_POS 272 | Clk 273 | Model On 274 | Bias 0.0 275 | Antennas 276 | Antenna1 277 | XyzFile $GNSSXYZ_FILE 278 | 279 | GPS_BlockI_Model == 280 | AttitudeModel gpsBlockI 281 | 282 | GPS_BlockII_Model == 283 | AttitudeModel gpsBlockII 284 | 285 | GPS_BlockIIA_Model == 286 | AttitudeModel gpsBlockII 287 | 288 | GPS_BlockIIR_Model == 289 | AttitudeModel gpsBlockIIR 290 | 291 | GPS_BlockIIF_Model == 292 | AttitudeModel gpsBlockIIF 293 | 294 | GPS_BlockIII_Model == 295 | AttitudeModel gpsBlockIIF 296 | 297 | BDS_IGSO_MEO == # IGSO/MEO 298 | State 299 | SatelliteTimeSeries 300 | Strict On # Do not interpolate over unequal time steps in input orbit 301 | BufferTime 10800 302 | InterpOrder 11 303 | ShadowFinder On 304 | PosGOAQuaternions Off 305 | PosGOAFile $GNSSORB_POS 306 | Clk 307 | Model On 308 | Bias 0.0 309 | #Antennas # Currently no cal for BDS, but expected in the future 310 | # Antenna1 311 | # XyzFile $GNSSXYZ_FILE 312 | Models 313 | AttitudeModel yawNormal 314 | 315 | BDS_GEO == # GEO 316 | State 317 | SatelliteTimeSeries 318 | Strict On # Do not interpolate over unequal time steps in input orbit 319 | BufferTime 10800 320 | InterpOrder 11 321 | ShadowFinder On 322 | PosGOAQuaternions Off 323 | PosGOAFile $GNSSORB_POS 324 | Clk 325 | Model On 326 | Bias 0.0 327 | #Antennas # Currently no cal for BDS, but expected in the future 328 | # Antenna1 329 | # XyzFile $GNSSXYZ_FILE 330 | Models 331 | AttitudeModel orbitNormal 332 | GLONASS_Common_Settings == 333 | State 334 | SatelliteTimeSeries 335 | Strict On # Do not interpolate over unequal time steps in input orbit 336 | BufferTime 10800 337 | InterpOrder 11 338 | ShadowFinder On 339 | PosGOAQuaternions Off 340 | PosGOAFile $GNSSORB_POS 341 | Clk 342 | Model On 343 | Bias 0.0 344 | #Antennas # Currently no way to use cal for GLO, but expected in the future 345 | # Antenna1 346 | # XyzFile $GNSSXYZ_FILE 347 | 348 | GLO_M_Model == 349 | AttitudeModel glonassM 350 | 351 | GLO_K1_Model == 352 | AttitudeModel glonassM 353 | 354 | GALILEO_Common_Settings == 355 | State 356 | SatelliteTimeSeries 357 | Strict On # Do not interpolate over unequal time steps in input orbit 358 | BufferTime 10800 359 | InterpOrder 11 360 | ShadowFinder On 361 | PosGOAQuaternions Off 362 | PosGOAFile $GNSSORB_POS 363 | Clk 364 | Model On 365 | Bias 0.0 366 | #Antennas # Currently no cal for GAL, but expected in the future 367 | # Antenna1 368 | # XyzFile $GNSSXYZ_FILE 369 | 370 | GAL_IOV_Model == 371 | AttitudeModel galileoIOV 372 | 373 | GAL_FOC_Model == 374 | AttitudeModel galileoIOV # needs revising 375 | 376 | 377 | Satellite `cat $GNSSLIST` 378 | 379 | Satellite `pcm.py -file $GNSS_ANT_OFF_PCM -epoch $GLOBAL_EPOCH -sat $GNSSLIST -param Antenna1` 380 | 381 | Common 382 | YawBiasFile $GOA_VAR/etc/yawBiasTable.pcm 383 | YawRateFile $GOA_VAR/etc/nominalYawRates.pcm 384 | TimeDepParms .Global.Input.TimeDepParms 385 | BufferTime 108000 # has to span distance between two shadows in legacy GOA 386 | MaxExtrap 108000 # again due to legacy GOA 387 | 388 | #---------------------------------------------------------------------------------------------- 389 | -------------------------------------------------------------------------------- /my_trees/AXISOcnld/AXISOcnld_0.tree: -------------------------------------------------------------------------------- 1 | # This is the parameter tree for NASA's JPL Gipsy-X software used in: 2 | # Ziv, S. Z., Yair, Y., Alpert, P., Uzan, L., & Reuveni, Y. (2021). 3 | # The diurnal variability of precipitable water vapor derived from GPS tropospheric path delays over the Eastern Mediterranean. 4 | # Atmospheric Research, 249, 105307. 5 | # it includes minimum elevation cutoff angle of 15 degs (elmin parameter), GMF tropospheric mapping function (mapping parameter) and ocean loading for all stations (different file) 6 | 7 | Self 8 | Metadata On # Use "On" to output originating file and line number 9 | File debug.tree 10 | 11 | # The following variables are defined by gd2e configuration at gd2e runtime 12 | 13 | GEOPFILE == 14 | GNSSORB_POS == 15 | GNSS_WLPB == # Default is to bias fix, set 'AmbRes Off' below to not ambiguity resolve 16 | GNSS_ANT_OFF_PCM == 17 | #GNSS_SHADOW == # uncomment this line if your orb/clks have real shadow files ( almost all do ) for faster runs, 18 | # It will be set to /GNSS.shad 19 | # Useful if you have set Satellite.NAME.State.SatelliteTimeSeries.ShadowFinder On, and want to use e.g.: 20 | # Global.Input.ShadowHistory.File $GNSS_SHADOW 21 | GNSSXYZ_FILE == 22 | GNSSLIST == 23 | XYZFILE_STATIONS == 24 | STATIONLIST == 25 | GLOBAL_EPOCH == 26 | FILTER_STOP == 27 | DATARECORD_FILE == dataRecordFile # still not sure if we should have a fixed name 28 | STA_DB == # $GOA_VAR/sta_info/IGb08_sta_db_newfmt remove new format sometime 29 | OCEANLOAD == On # Default is On unless '-rnxFile' is used. 30 | StationCovOnOff == # Default Off, unless -gdCov -runType PPP 31 | 32 | # Names that change with each iteration, smooth_n_i.tdp|pos _n_i where n 33 | # is the number of the tree and i is the number of the subiteration, 34 | # both start numbering at 0 , final iteration is smoothFinal.tdp|pos 35 | # File for TDP_INPUT will be the previous iterations output after iteration 0 36 | SMOOTHPOS == 37 | SMOOTHTDP == 38 | TDP_INPUT == 39 | 40 | 41 | # The following variables maybe adjusted by the user, in the run area 42 | GLOBAL_DATA_RATE == 300 # maybe not this one since we have to decide on high rate clocks 43 | # but it might make sense for others 44 | 45 | 46 | # Users may adjust other models below, trop, tides, ...? Needs more documentation, can sphinx 47 | # grab snippets of documentation like doxygen? 48 | 49 | 50 | Global 51 | Logging 52 | Alert cerr 53 | Warn cout 54 | Event cout 55 | 56 | Filter 57 | Start $GLOBAL_EPOCH 58 | Stop $FILTER_STOP 59 | 60 | MeasGather 61 | DecimateSmoothInterval $GLOBAL_DATA_RATE 62 | HonorEditorFlags On 63 | 64 | Type DATARECORD 65 | FileName $DATARECORD_FILE 66 | 67 | DataTypes 68 | PostSmoothEditGlobals # Options global to EditPoint across all DataLinkSpecs. 69 | MaxIteration 5 70 | 71 | IonoFreeL_1P_2P 72 | DataLinkSpec_LC_GPS 73 | PostSmoothEdit 2e5 2e4 0.125 0.1 0.05 .025 74 | ElDepWeight SqrtSin 75 | #ElMin 7 76 | SignalPath 77 | Platforms .* GPS.* 78 | DataBias 79 | StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 80 | UseItOrLoseItInterval 3600 81 | 82 | IonoFreeC_1P_2P 83 | DataLinkSpec_PC_GPS 84 | SignalPath 85 | Platforms .* GPS.* 86 | PostSmoothEdit 2e5 2e4 12.5 10 5 2.5 87 | ElDepWeight SqrtSin 88 | #ElMin 7 89 | 90 | # IonoFreeL_2I_7I 91 | # DataLinkSpec_LC_BDS 92 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 93 | # SignalPath 94 | # Platforms .* C.* 95 | # DataBias 96 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 97 | # UseItOrLoseItInterval 3600 98 | 99 | # IonoFreeC_2I_7I 100 | # DataLinkSpec_PC_BDS 101 | # PostSmoothEdit 2e5 2e4 25 20 10 5 102 | # SignalPath 103 | # Platforms .* C.* 104 | 105 | # IonoFreeL_1C_7Q 106 | # DataLinkSpec_LC_GAL 107 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 108 | # SignalPath 109 | # Platforms .* E.* 110 | # DataBias 111 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 112 | # UseItOrLoseItInterval 3600 113 | 114 | # IonoFreeC_1C_7Q 115 | # DataLinkSpec_PC_GAL 116 | # PostSmoothEdit 2e5 2e4 25 20 10 5 117 | # SignalPath 118 | # Platforms .* E.* 119 | 120 | # IonoFreeL_1C_2P 121 | # DataLinkSpec_LC_GLO 122 | # PostSmoothEdit 2e5 2e4 0.25 0.2 0.1 .05 123 | # SignalPath 124 | # Platforms .* R.* 125 | # DataBias 126 | # StochasticAdj 3.0e8 3.0e8 DATADRIVEN WHITENOISE 127 | # UseItOrLoseItInterval 3600 128 | 129 | # IonoFreeC_1P_2P 130 | # DataLinkSpec_PC_GLO 131 | # PostSmoothEdit 2e5 2e4 25 20 10 5 132 | # SignalPath 133 | # Platforms .* R.* 134 | # DataBias 135 | # StochasticAdj 1.0e4 3.40e-4 DATADRIVEN RANDOMWALK # psig ~0.1m every 24 hours 136 | # UseItOrLoseItInterval 3600 137 | # DataBiasReference GLONASS 138 | 139 | FilterConfig 140 | Parallel 141 | NumThreads 1 142 | SmootherFormalError 143 | SigmaRegex ^\. # compute FormalError for everything but DataBias 144 | SmootherCovariance 145 | Station $StationCovOnOff 146 | CalculationMethod InverseSriRows # with many stations in the same run this may not be efficient 147 | SmootherPostProcess 148 | Smoother On 149 | TdpFile $SMOOTHTDP 150 | CovarianceFilename smoothFinal.cov 151 | TerminalEpochOnly On 152 | FilterParametersAddRemove 153 | LinkBias Off 154 | 155 | EarthOrientation 156 | GeopTable $GEOPFILE 157 | 158 | Input 159 | TimeDepParms 160 | NameFilter 161 | Satellite\.[A-Z]\w*.*\.Clk\.Bias # only read satellite clocks from tdp 162 | Degree 0 163 | Strict On 164 | MaxDx 1.0e-6 165 | MaxFormalError 0.12 # 12cm is the cutoff we use when making GIPSY products 166 | Station\..*\.Trop.* 167 | File 168 | Path $TDP_INPUT 169 | BufferTime 3600 170 | MaxExtrap 0 171 | 172 | Output 173 | Residual 174 | Prefit 175 | File prefitResiduals.out 176 | Postfit 177 | File postfitResiduals.out 178 | TimeDepParms 179 | NameFilter ^\. # output everything starting with a . so no DataBias_ (phase bias params) 180 | EstimatedOnly Off # output the input so we can interate 181 | File filter.tdp 182 | 183 | AmbRes On 184 | 185 | OutputConstraintsFile constraints.txt 186 | 187 | StatsFile ambres.stats 188 | 189 | Mode inSmoother 190 | 191 | SettingsForGround 192 | SmootherIterations 1 193 | MinOverlap 3600.0 194 | 195 | WidelaneMaxDistanceToNearestInt 0.3 196 | WidelaneInflation 0.1 197 | BackgroundLevel 0.5 198 | WidelaneConfidence 0.750 199 | WidelaneMaxSigma 1.0 200 | 201 | NarrowlaneMaxDistanceToNearestInt 0.2 202 | NarrowlaneInflation 1.5 203 | NarrowlaneConfidence 0.99 204 | NarrowlaneMaxSigma 0.1 205 | InputWlpb 206 | File $GNSS_WLPB 207 | Priority 0 208 | 209 | GlobalNarrowLaneSigmaFactor 6.0 210 | UseNLOverlapSigmas 211 | ComputeAllNLSigmas 212 | 213 | 214 | #------------------------------------------------------------------------------------ 215 | 216 | # Station info: 217 | 218 | # Solve for constant position 219 | GRN_STATION_CLK_WHITE == 220 | State 221 | Pos 222 | ConstantAdj 10.0 223 | Clk 224 | Model On 225 | Bias 0.0 226 | StochasticAdj 3.0e8 3.0e8 $GLOBAL_DATA_RATE WHITENOISE 227 | # ConstellationBias 228 | # Beidou 0.0 229 | # Regex ^C\d+ 230 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 231 | # ConstellationBias 232 | # Galileo 0.0 233 | # Regex ^E\d+ 234 | # StochasticAdj 100 0.0017 $GLOBAL_DATA_RATE RANDOMWALK 235 | Trop 236 | Model On 237 | Mapping GMF 238 | WetZ 0.1 239 | StochasticAdj 0.5 5e-5 $GLOBAL_DATA_RATE RANDOMWALK 240 | GradEast 0.0 241 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 242 | GradNorth 0.0 243 | StochasticAdj 1.0 5e-6 $GLOBAL_DATA_RATE RANDOMWALK 244 | Tides 245 | All On 246 | OceanLoad $OCEANLOAD 247 | OceanLoad On 248 | OceanLoadFile $GOA_VAR/sta_info/ocnld_coeff_AXIS_stations 249 | Antennas 250 | Antenna1 251 | XyzFile $XYZFILE_STATIONS 252 | 253 | Station `cat $STATIONLIST` 254 | Station `staDb2TreeIn.py -s $STATIONLIST -y2kSecs $GLOBAL_EPOCH -d $STA_DB` 255 | # Need to put the station xyz file in staDb2TreeIn.py giving it optional antex file list and or stick it in gd2e 256 | 257 | #------------------------------------------------------------------------------------ 258 | 259 | # Satellite info 260 | GPS_Common_Settings == 261 | State 262 | SatelliteTimeSeries 263 | Strict On # Do not interpolate over unequal time steps in input orbit 264 | # Use extreme care if you change this especially if processing data 265 | # that span multiple 30-hour (JPL products) or 24-hour (IGS products) 266 | BufferTime 10800 267 | InterpOrder 11 268 | ShadowFinder On 269 | PosGOAQuaternions Off 270 | PosGOAFile $GNSSORB_POS 271 | Clk 272 | Model On 273 | Bias 0.0 274 | Antennas 275 | Antenna1 276 | XyzFile $GNSSXYZ_FILE 277 | 278 | GPS_BlockI_Model == 279 | AttitudeModel gpsBlockI 280 | 281 | GPS_BlockII_Model == 282 | AttitudeModel gpsBlockII 283 | 284 | GPS_BlockIIA_Model == 285 | AttitudeModel gpsBlockII 286 | 287 | GPS_BlockIIR_Model == 288 | AttitudeModel gpsBlockIIR 289 | 290 | GPS_BlockIIF_Model == 291 | AttitudeModel gpsBlockIIF 292 | 293 | GPS_BlockIII_Model == 294 | AttitudeModel gpsBlockIIF 295 | 296 | BDS_IGSO_MEO == # IGSO/MEO 297 | State 298 | SatelliteTimeSeries 299 | Strict On # Do not interpolate over unequal time steps in input orbit 300 | BufferTime 10800 301 | InterpOrder 11 302 | ShadowFinder On 303 | PosGOAQuaternions Off 304 | PosGOAFile $GNSSORB_POS 305 | Clk 306 | Model On 307 | Bias 0.0 308 | #Antennas # Currently no cal for BDS, but expected in the future 309 | # Antenna1 310 | # XyzFile $GNSSXYZ_FILE 311 | Models 312 | AttitudeModel yawNormal 313 | 314 | BDS_GEO == # GEO 315 | State 316 | SatelliteTimeSeries 317 | Strict On # Do not interpolate over unequal time steps in input orbit 318 | BufferTime 10800 319 | InterpOrder 11 320 | ShadowFinder On 321 | PosGOAQuaternions Off 322 | PosGOAFile $GNSSORB_POS 323 | Clk 324 | Model On 325 | Bias 0.0 326 | #Antennas # Currently no cal for BDS, but expected in the future 327 | # Antenna1 328 | # XyzFile $GNSSXYZ_FILE 329 | Models 330 | AttitudeModel orbitNormal 331 | GLONASS_Common_Settings == 332 | State 333 | SatelliteTimeSeries 334 | Strict On # Do not interpolate over unequal time steps in input orbit 335 | BufferTime 10800 336 | InterpOrder 11 337 | ShadowFinder On 338 | PosGOAQuaternions Off 339 | PosGOAFile $GNSSORB_POS 340 | Clk 341 | Model On 342 | Bias 0.0 343 | #Antennas # Currently no way to use cal for GLO, but expected in the future 344 | # Antenna1 345 | # XyzFile $GNSSXYZ_FILE 346 | 347 | GLO_M_Model == 348 | AttitudeModel glonassM 349 | 350 | GLO_K1_Model == 351 | AttitudeModel glonassM 352 | 353 | GALILEO_Common_Settings == 354 | State 355 | SatelliteTimeSeries 356 | Strict On # Do not interpolate over unequal time steps in input orbit 357 | BufferTime 10800 358 | InterpOrder 11 359 | ShadowFinder On 360 | PosGOAQuaternions Off 361 | PosGOAFile $GNSSORB_POS 362 | Clk 363 | Model On 364 | Bias 0.0 365 | #Antennas # Currently no cal for GAL, but expected in the future 366 | # Antenna1 367 | # XyzFile $GNSSXYZ_FILE 368 | 369 | GAL_IOV_Model == 370 | AttitudeModel galileoIOV 371 | 372 | GAL_FOC_Model == 373 | AttitudeModel galileoIOV # needs revising 374 | 375 | 376 | Satellite `cat $GNSSLIST` 377 | 378 | Satellite `pcm.py -file $GNSS_ANT_OFF_PCM -epoch $GLOBAL_EPOCH -sat $GNSSLIST -param Antenna1` 379 | 380 | Common 381 | YawBiasFile $GOA_VAR/etc/yawBiasTable.pcm 382 | YawRateFile $GOA_VAR/etc/nominalYawRates.pcm 383 | TimeDepParms .Global.Input.TimeDepParms 384 | BufferTime 108000 # has to span distance between two shadows in legacy GOA 385 | MaxExtrap 108000 # again due to legacy GOA 386 | 387 | #---------------------------------------------------------------------------------------------- 388 | --------------------------------------------------------------------------------