Loading Common/Servers/DewarPositioner/src/DewarPositioner/posgenerator.py +51 −0 Original line number Diff line number Diff line Loading @@ -52,12 +52,63 @@ class PosGenerator(object): logger.logNotice('%s: %s' %(raeson, ex.message)) raise PosGeneratorError(raeson) def galactic_parallactic(self, source, siteInfo): """Return the galactic parallactic angle""" try: latitude = siteInfo['latitude'] except (KeyError, TypeError), ex: raise PosGeneratorError('cannot get the latitude: %s' %ex.message) except Exception, ex: raeson = 'unexpected exception getting the site latitude' logger.logNotice(raeson) raise PosGeneratorError(raeson) last_zerodiv_time = datetime.datetime.now() while True: try: t = getTimeStamp().value + 1*10*6 # 100 ms in the future coordinates = source.getApparentCoordinates(t) # Values in radians az, el, ra, dec = coordinates[:4] p = PosGenerator.getParallacticAngle(latitude, az, el) pg = PosGenerator.getGalacticParallacticAngle(ra, dec) yield p + pg last_zerodiv_time = datetime.datetime.now() except ZeroDivisionError: logger.logWarning('zero division error computing the galactic parallactic angle') zerodiv_time = datetime.datetime.now() - last_zerodiv_time if zerodiv_time.seconds >= self.zdtimeout: raeson = 'zero division for more than %ds' %self.zdtimeout logger.logError(raeson) raise PosGeneratorError(raeson) else: time.sleep(0.5) continue except GeneratorExit: # Required in Python 2.5: # http://www.algorithm.co.il/blogs/programming/generatorexit-another-reason-to-upgrade-to-python-2-6/ raise except Exception, ex: raeson = 'cannot get the %s (az, el) values' %source._get_name() logger.logNotice('%s: %s' %(raeson, ex.message)) raise PosGeneratorError(raeson) @staticmethod def getParallacticAngle(latitude, az, el): """Arguments in radians""" p = atan2(-sin(az), tan(latitude)*cos(el) - sin(el)*cos(az)) return degrees(p) @staticmethod def getGalacticParallacticAngle(ra, dec): """Arguments in radians""" # North celestial pole coordinates in equatorial celestial frame (j200) # ncp = ('12 51 26.28', '27 07 41.7') # ra0 = ephem.hours(ncp[0]) # dec0 = ephem.degrees(ncp[1]) ra0 = 3.3660332687500043 dec0 = 0.47347728280415174 gp = atan2(sin(ra-ra0), cos(dec)*tan(dec0) - sin(dec)*cos(ra-ra0)) return degrees(gp) class PosGeneratorError(Exception): pass Loading Common/Servers/DewarPositioner/test/pyunit/posgen/test_galactic_parallactic.py 0 → 100644 +53 −0 Original line number Diff line number Diff line import unittest2 import mocker from math import sin, cos, tan, atan, radians, degrees, pi, atan2 from DewarPositioner.posgenerator import PosGenerator, PosGeneratorError class PosGeneratorGalacticParallacticTest(unittest2.TestCase): def setUp(self): self.m = mocker.Mocker() self.source = self.m.mock() self.posgen = PosGenerator(zdtimeout=2) def tearDown(self): self.m.restore() self.m.verify() def test_ra_dec_values(self): """Raise a PosGeneratorError if cannot get the (ra, dec) values""" source = self.m.mock() mocker.expect(source.getApparentCoordinates(mocker.ANY)).result((None, None)) mocker.expect(source._get_name()).result('mocker') self.m.replay() gen = self.posgen.galactic_parallactic(source, siteInfo={'latitude': 39}) self.assertRaises(PosGeneratorError, gen.next) def test_right_behavior(self): """Generate 3 positions and do not stop in case of isolated zero div""" azimuths = (45, 45, 90, 45) elevations = (45, 45, 0, 45) # The value 0 will cause a zero division ra, dec = (2.0, 0.5) ra0 = 3.3660332687500043 # Radians dec0 = 0.47347728280415174 # Radians latitude = 0 source = self.m.mock() for (az, el) in zip(azimuths, elevations): mocker.expect( source.getApparentCoordinates(mocker.ANY) ).result((radians(az), radians(el), ra, dec) + (None,)*3) self.m.count(1) self.m.replay() gen = self.posgen.galactic_parallactic(source, siteInfo={'latitude': latitude}) latitude = radians(latitude) for azd, eld in zip(azimuths, elevations): az = radians(azd) el = radians(eld) p = atan2(-sin(az), (tan(latitude)*cos(el) - sin(el)*cos(az))) gp = atan2(sin(ra-ra0), cos(dec)*tan(dec0) - sin(dec)*cos(ra-ra0)) self.assertAlmostEqual(degrees(p + gp), gen.next(), delta=0.01) if __name__ == '__main__': unittest2.main() SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/BSC/UpdatingPosition/UpdatingPosition.xml +3 −3 Original line number Diff line number Diff line Loading @@ -54,19 +54,19 @@ <UpdatingRecord> <axisCode>MNG_GAL_LON</axisCode> <initialPosition>-19.2</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>MNG_GAL_LAT</axisCode> <initialPosition>-49.2</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>JUST_FOR_TEST</axisCode> <initialPosition>-9.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> </DewarPositionerUpdatingTable> SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/BSC_OPT/UpdatingPosition/UpdatingPosition.xml +3 −3 Original line number Diff line number Diff line Loading @@ -54,19 +54,19 @@ <UpdatingRecord> <axisCode>MNG_GAL_LON</axisCode> <initialPosition>-19.2</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>MNG_GAL_LAT</axisCode> <initialPosition>-49.2</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>JUST_FOR_TEST</axisCode> <initialPosition>-9.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> </DewarPositionerUpdatingTable> SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/CUSTOM/UpdatingPosition/UpdatingPosition.xml +3 −3 Original line number Diff line number Diff line Loading @@ -54,19 +54,19 @@ <UpdatingRecord> <axisCode>MNG_GAL_LON</axisCode> <initialPosition>0.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>MNG_GAL_LAT</axisCode> <initialPosition>0.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>JUST_FOR_TEST</axisCode> <initialPosition>0.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> </DewarPositionerUpdatingTable> Loading
Common/Servers/DewarPositioner/src/DewarPositioner/posgenerator.py +51 −0 Original line number Diff line number Diff line Loading @@ -52,12 +52,63 @@ class PosGenerator(object): logger.logNotice('%s: %s' %(raeson, ex.message)) raise PosGeneratorError(raeson) def galactic_parallactic(self, source, siteInfo): """Return the galactic parallactic angle""" try: latitude = siteInfo['latitude'] except (KeyError, TypeError), ex: raise PosGeneratorError('cannot get the latitude: %s' %ex.message) except Exception, ex: raeson = 'unexpected exception getting the site latitude' logger.logNotice(raeson) raise PosGeneratorError(raeson) last_zerodiv_time = datetime.datetime.now() while True: try: t = getTimeStamp().value + 1*10*6 # 100 ms in the future coordinates = source.getApparentCoordinates(t) # Values in radians az, el, ra, dec = coordinates[:4] p = PosGenerator.getParallacticAngle(latitude, az, el) pg = PosGenerator.getGalacticParallacticAngle(ra, dec) yield p + pg last_zerodiv_time = datetime.datetime.now() except ZeroDivisionError: logger.logWarning('zero division error computing the galactic parallactic angle') zerodiv_time = datetime.datetime.now() - last_zerodiv_time if zerodiv_time.seconds >= self.zdtimeout: raeson = 'zero division for more than %ds' %self.zdtimeout logger.logError(raeson) raise PosGeneratorError(raeson) else: time.sleep(0.5) continue except GeneratorExit: # Required in Python 2.5: # http://www.algorithm.co.il/blogs/programming/generatorexit-another-reason-to-upgrade-to-python-2-6/ raise except Exception, ex: raeson = 'cannot get the %s (az, el) values' %source._get_name() logger.logNotice('%s: %s' %(raeson, ex.message)) raise PosGeneratorError(raeson) @staticmethod def getParallacticAngle(latitude, az, el): """Arguments in radians""" p = atan2(-sin(az), tan(latitude)*cos(el) - sin(el)*cos(az)) return degrees(p) @staticmethod def getGalacticParallacticAngle(ra, dec): """Arguments in radians""" # North celestial pole coordinates in equatorial celestial frame (j200) # ncp = ('12 51 26.28', '27 07 41.7') # ra0 = ephem.hours(ncp[0]) # dec0 = ephem.degrees(ncp[1]) ra0 = 3.3660332687500043 dec0 = 0.47347728280415174 gp = atan2(sin(ra-ra0), cos(dec)*tan(dec0) - sin(dec)*cos(ra-ra0)) return degrees(gp) class PosGeneratorError(Exception): pass Loading
Common/Servers/DewarPositioner/test/pyunit/posgen/test_galactic_parallactic.py 0 → 100644 +53 −0 Original line number Diff line number Diff line import unittest2 import mocker from math import sin, cos, tan, atan, radians, degrees, pi, atan2 from DewarPositioner.posgenerator import PosGenerator, PosGeneratorError class PosGeneratorGalacticParallacticTest(unittest2.TestCase): def setUp(self): self.m = mocker.Mocker() self.source = self.m.mock() self.posgen = PosGenerator(zdtimeout=2) def tearDown(self): self.m.restore() self.m.verify() def test_ra_dec_values(self): """Raise a PosGeneratorError if cannot get the (ra, dec) values""" source = self.m.mock() mocker.expect(source.getApparentCoordinates(mocker.ANY)).result((None, None)) mocker.expect(source._get_name()).result('mocker') self.m.replay() gen = self.posgen.galactic_parallactic(source, siteInfo={'latitude': 39}) self.assertRaises(PosGeneratorError, gen.next) def test_right_behavior(self): """Generate 3 positions and do not stop in case of isolated zero div""" azimuths = (45, 45, 90, 45) elevations = (45, 45, 0, 45) # The value 0 will cause a zero division ra, dec = (2.0, 0.5) ra0 = 3.3660332687500043 # Radians dec0 = 0.47347728280415174 # Radians latitude = 0 source = self.m.mock() for (az, el) in zip(azimuths, elevations): mocker.expect( source.getApparentCoordinates(mocker.ANY) ).result((radians(az), radians(el), ra, dec) + (None,)*3) self.m.count(1) self.m.replay() gen = self.posgen.galactic_parallactic(source, siteInfo={'latitude': latitude}) latitude = radians(latitude) for azd, eld in zip(azimuths, elevations): az = radians(azd) el = radians(eld) p = atan2(-sin(az), (tan(latitude)*cos(el) - sin(el)*cos(az))) gp = atan2(sin(ra-ra0), cos(dec)*tan(dec0) - sin(dec)*cos(ra-ra0)) self.assertAlmostEqual(degrees(p + gp), gen.next(), delta=0.01) if __name__ == '__main__': unittest2.main()
SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/BSC/UpdatingPosition/UpdatingPosition.xml +3 −3 Original line number Diff line number Diff line Loading @@ -54,19 +54,19 @@ <UpdatingRecord> <axisCode>MNG_GAL_LON</axisCode> <initialPosition>-19.2</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>MNG_GAL_LAT</axisCode> <initialPosition>-49.2</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>JUST_FOR_TEST</axisCode> <initialPosition>-9.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> </DewarPositionerUpdatingTable>
SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/BSC_OPT/UpdatingPosition/UpdatingPosition.xml +3 −3 Original line number Diff line number Diff line Loading @@ -54,19 +54,19 @@ <UpdatingRecord> <axisCode>MNG_GAL_LON</axisCode> <initialPosition>-19.2</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>MNG_GAL_LAT</axisCode> <initialPosition>-49.2</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>JUST_FOR_TEST</axisCode> <initialPosition>-9.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> </DewarPositionerUpdatingTable>
SRT/Configuration/CDB/alma/DataBlock/DewarPositioner/KKG/CUSTOM/UpdatingPosition/UpdatingPosition.xml +3 −3 Original line number Diff line number Diff line Loading @@ -54,19 +54,19 @@ <UpdatingRecord> <axisCode>MNG_GAL_LON</axisCode> <initialPosition>0.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>MNG_GAL_LAT</axisCode> <initialPosition>0.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> <UpdatingRecord> <axisCode>JUST_FOR_TEST</axisCode> <initialPosition>0.0</initialPosition> <functionName>gpa</functionName> <functionName>galactic_parallactic(</functionName> </UpdatingRecord> </DewarPositionerUpdatingTable>