def testBasics(self): """Test basic functionality of Site """ for long in (54.3, -134.5): for lat in (-23.4, 12.3): for elev in (2789, 6543): site = coordConv.Site(long, lat, elev) self.assertEqual(long, site.meanLong) self.assertEqual(lat, site.meanLat) self.assertEqual(elev, site.elev) self.assertAlmostEqual(long, site.corrLong) self.assertAlmostEqual(lat, site.corrLat) site.setPoleWander(0, 0) self.assertAlmostEqual(long, site.corrLong) self.assertAlmostEqual(lat, site.corrLat) for xArcsec in (-0.3, 0, 0.3): x = xArcsec / 3600.0 for yArcsec in (-0.3, 0, 0.3): y = yArcsec / 3600.0 site.setPoleWander(x, y) # the following is an approximation given in the header of slaPolmo approxCorrLong = long + (x * coordConv.cosd(long) ) - (y * coordConv.sind(long)) approxCorrLat = lat + ( ((x * coordConv.sind(long)) + (y * coordConv.cosd(long))) * coordConv.tand(lat)) self.assertAlmostEqual(approxCorrLong, site.corrLong, 3) self.assertAlmostEqual(approxCorrLat, site.corrLat, 3) siteCopy = coordConv.Site(site) self.assertEqual(repr(site), repr(siteCopy))
def testRightTriangle(self): """ right triangle: B = 90, a and c vary but avoid poles tan C = tan c / sin a tan c = (tan a / sinA * sinb) with some tweaks to handle the other quadrants """ ang_B = 90.0 for side_aa in (1.0, 20.0, 45.0, 90, 110.0, 179.0): for side_cc in (1.0, 20.0, 45.0, 90.0, 110.0, 179.0): ang_A = atan2d(tand(side_aa), sind(side_cc)) ang_C = atan2d(tand(side_cc), sind(side_aa)) side_bb = atan2d(tand(side_aa), sind(ang_A) * cosd(side_cc)) # these tweaks handle other quadrants; they're based on what works, so are somewhat suspect if side_bb < 0: side_bb = -side_bb if ang_A < 0: ang_A = 180.0 + ang_A if ang_C < 0: ang_C = 180.0 + ang_C self.checkOne((side_aa, ang_B, side_cc), (ang_A, side_bb, ang_C))
def testTrig(self): """Test degrees-based trig functions """ for ang in (0, -1, 31.2, -235, 234324): angRad = ang * coordConv.RadPerDeg self.assertAlmostEqual(coordConv.sind(ang), math.sin(angRad)) self.assertAlmostEqual(coordConv.cosd(ang), math.cos(angRad)) self.assertAlmostEqual(coordConv.tand(ang), math.tan(angRad)) self.assertAlmostEqual(coordConv.atand(ang) * coordConv.RadPerDeg, math.atan(ang)) for ang2 in (0, 35, -364): self.assertAlmostEqual(coordConv.atan2d(ang, ang2) * coordConv.RadPerDeg, math.atan2(ang, ang2)) for val in (-1, -0.34, 0, 0.67, 1): self.assertAlmostEqual(coordConv.asind(val) * coordConv.RadPerDeg, math.asin(val)) self.assertAlmostEqual(coordConv.acosd(val) * coordConv.RadPerDeg, math.acos(val))