Commit 621321d4 authored by Marco Buttu's avatar Marco Buttu
Browse files

Added galactic parallactic correction

parent 752de876
Loading
Loading
Loading
Loading
+51 −0
Original line number Diff line number Diff line
@@ -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
+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()
+3 −3
Original line number Diff line number Diff line
@@ -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>
+3 −3
Original line number Diff line number Diff line
@@ -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>
+3 −3
Original line number Diff line number Diff line
@@ -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