test_tropmodel.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 import unittest, sys, os
4 sys.path.insert(0, os.path.abspath(".."))
5 from gnsstk.test_utils import args,run_unit_tests
6 import gnsstk
7 
8 class TestTropModelsExist(unittest.TestCase):
10  tropMissing = 'Trop Model is missing'
11 
12  self.assertTrue(hasattr(gnsstk, 'GCATTropModel'), tropMissing)
13  self.assertTrue(hasattr(gnsstk, 'GGHeightTropModel'), tropMissing)
14  self.assertTrue(hasattr(gnsstk, 'GGTropModel'), tropMissing)
15  self.assertTrue(hasattr(gnsstk, 'MOPSTropModel'), tropMissing)
16  self.assertTrue(hasattr(gnsstk, 'NBTropModel'), tropMissing)
17  self.assertTrue(hasattr(gnsstk, 'NeillTropModel'), tropMissing)
18  self.assertTrue(hasattr(gnsstk, 'SaasTropModel'), tropMissing)
19  self.assertTrue(hasattr(gnsstk, 'SimpleTropModel'), tropMissing)
20  self.assertTrue(hasattr(gnsstk, 'ZeroTropModel'), tropMissing)
21 
22 
23 class TestTropModelsValid(unittest.TestCase):
25  trop_list = ['GCAT', 'GG', 'GGHeight', 'MOPS', 'NB', 'Saas', 'Simple', 'Zero']
26  for tropName in trop_list:
27 
28  # check if the reference file exists in gnsstk/data/TropModel_*.exp
29  self.fname = os.path.join(os.path.dirname(__file__), '../../data/TropModel_'+tropName+'.exp')
30  self.assertTrue(os.path.exists(self.fname), 'data path not found')
31 
32  # check that the data matches between the current run and the test file
33  trop_data, pt_dryz, pt_wetz = self.run_test(tropName)
34  data_list, dry_zenith, wet_zenith = self.read_data(tropName)
35  self.assertEqual(trop_data, data_list)
36  self.assertEqual(pt_dryz, dry_zenith)
37  self.assertEqual(pt_wetz, wet_zenith)
38 
39 
40  def setup_trop(self, tropName):
41  # from Tropdump.cpp
42 
43  # set up the trop model from the input string
44  if tropName == "Simple" : pTrop = gnsstk.SimpleTropModel()
45  elif tropName == "Zero" : pTrop = gnsstk.ZeroTropModel()
46  elif tropName == "Saas" : pTrop = gnsstk.SaasTropModel()
47  elif tropName == "NB" : pTrop = gnsstk.NBTropModel()
48  elif tropName == "GG" : pTrop = gnsstk.GGTropModel()
49  elif tropName == "GGHeight": pTrop = gnsstk.GGHeightTropModel()
50  #elif tropName == "Neill" : pTrop = gnsstk.NeillTropModel() # doesn't have a matching output file
51  #elif tropName == "Global" : pTrop = gnsstk.GlobalTropModel() # doesn't have a swig wrapper
52  elif tropName == "GCAT" : pTrop = gnsstk.GCATTropModel()
53  elif tropName == "MOPS" : pTrop = gnsstk.MOPSTropModel()
54  else:
55  print(" Warning - unknown trop model: " + tropName+ "; use Simple")
56  tropName = "Simple"
57  pTrop = gnsstk.SimpleTropModel()
58 
59  return pTrop
60 
61 
62  def set_defaults(self, pTrop):
63  # from Tropdump.cpp
64  # trop model and weather
65  # tropstr = "Global,20,1013,50" # use tropName instead
66  Temp = 20.0
67  Press = 1013.
68  Humid = 50.
69  elevmin = 3.0
70  elevmax = 90.0
71  delev = 1.5
72  # position
73  #refPosstr = "-740376.5046,-5457019.3545,3207315.7299" # ARL:UT, in ECEF
74  refPosstr_x = -740376.5046
75  refPosstr_y = -5457019.3545
76  refPosstr_z = 3207315.7299
77  #timestr = "2017,103,0.0"
78  doy = 103
79 
80  # set up weather
81  pTrop.setWeather(Temp,Press,Humid)
82 
83  # set up position
84  refPos = gnsstk.Position()
85  refPos.setECEF(refPosstr_x, refPosstr_y, refPosstr_z)
86  pTrop.setReceiverHeight(refPos.getHeight())
87  pTrop.setReceiverLatitude(refPos.getGeodeticLatitude())
88  pTrop.setReceiverLongitude(refPos.getLongitude())
89 
90  # set up doy
91  pTrop.setDayOfYear(doy)
92 
93  return pTrop, elevmin, elevmax, delev
94 
95 
96  def run_test(self, tropName):
97 
98  pTrop = self.setup_trop(tropName)
99  pTrop, elevmin, elevmax, delev = self.set_defaults(pTrop)
100 
101  header = ["Name", "elev", "drymap", "drytotal", "wetmap", "wettotal", "total(m)"]
102 
103  trop_data = []
104 
105  elev = elevmin
106  while elev <= elevmax:
107  pt_name = pTrop.name()
108  pt_elev = '{:2.2f}'.format(elev)
109  pt_drym = '{:2.4f}'.format(pTrop.dry_mapping_function(elev))
110  pt_dryt = '{:2.4f}'.format(pTrop.dry_zenith_delay()*pTrop.dry_mapping_function(elev))
111  pt_wetm = '{:2.4f}'.format(pTrop.wet_mapping_function(elev))
112  pt_wett = '{:2.4f}'.format(pTrop.wet_zenith_delay()*pTrop.wet_mapping_function(elev))
113  pt_totm = '{:2.4f}'.format(pTrop.correction(elev))
114 
115  pt_data = [pt_name, pt_elev, pt_drym, pt_dryt, pt_wetm, pt_wett, pt_totm]
116  data_dict = dict(zip(header, pt_data))
117  trop_data.append(data_dict)
118 
119  elev += delev
120 
121  pt_dryz = '{:2.4f}'.format(pTrop.dry_zenith_delay())
122  pt_wetz = '{:2.4f}'.format(pTrop.wet_zenith_delay())
123 
124  return trop_data, pt_dryz, pt_wetz
125 
126 
127  def read_data(self, tropName):
128 
129  data_list = []
130  header = ["Name", "elev", "drymap", "drytotal", "wetmap", "wettotal", "total(m)"]
131  dry_zenith = float('nan')
132  wet_zenith = float('nan')
133 
134  with open(self.fname, 'r') as datafile:
135  data = datafile.readlines()
136  for dline in data:
137  line = dline.split()
138  if line[0] != tropName: continue
139  if 'zenith' in dline:
140  dry_zenith = line[8]
141  wet_zenith = line[11]
142  continue
143  data_dict = dict(zip(header, line))
144  data_list.append(data_dict)
145  return data_list, dry_zenith, wet_zenith
146 
147 
148 if __name__ == '__main__':
tests.test_tropmodel.TestTropModelsValid.set_defaults
def set_defaults(self, pTrop)
Definition: test_tropmodel.py:62
gnsstk::NBTropModel
Definition: NBTropModel.hpp:86
gnsstk::GCATTropModel
Definition: GCATTropModel.hpp:85
tests.test_tropmodel.TestTropModelsExist
Definition: test_tropmodel.py:8
gnsstk::GGTropModel
Definition: GGTropModel.hpp:53
tests.test_tropmodel.TestTropModelsValid.fname
fname
Definition: test_tropmodel.py:29
tests.test_tropmodel.TestTropModelsValid.run_test
def run_test(self, tropName)
Definition: test_tropmodel.py:96
gnsstk::MOPSTropModel
Definition: MOPSTropModel.hpp:81
tests.test_tropmodel.TestTropModelsValid.read_data
def read_data(self, tropName)
Definition: test_tropmodel.py:127
tests.test_tropmodel.TestTropModelsValid.test_TropModelsValid
def test_TropModelsValid(self)
Definition: test_tropmodel.py:24
tests.test_tropmodel.TestTropModelsValid.setup_trop
def setup_trop(self, tropName)
Definition: test_tropmodel.py:40
tests.test_tropmodel.TestTropModelsExist.test_TropModelsExist
def test_TropModelsExist(self)
Definition: test_tropmodel.py:9
gnsstk::Position
Definition: Position.hpp:136
gnsstk::SimpleTropModel
A simple Black model of the troposphere. temp is in Kelvin.
Definition: SimpleTropModel.hpp:48
tests.test_tropmodel.TestTropModelsValid
Definition: test_tropmodel.py:23
gnsstk::SaasTropModel
Definition: SaasTropModel.hpp:80
test_utils.run_unit_tests
def run_unit_tests()
Definition: test_utils.py:51
gnsstk::ZeroTropModel
The 'zero' trop model, meaning it always returns zero.
Definition: TropModel.hpp:289
gnsstk::GGHeightTropModel
Definition: GGHeightTropModel.hpp:77


gnsstk
Author(s):
autogenerated on Wed Oct 25 2023 02:40:41