示例#1
0
    def __init__(self):
        TelescopeBase.__init__(self)

        self.__slewing = False
        self._az = Coord.fromDMS(0)
        self._alt = Coord.fromDMS(70)

        self._slewing = False
        self._tracking = True
        self._parked = False

        self._abort = threading.Event()

        self._epoch = Epoch.J2000

        self._cover = False
        self._pierside = TelescopePierSide.UNKNOWN

        try:
            self._site = self.getManager().getProxy("/Site/0")
            self._gotSite = True
        except:
            self._site = Site()
            self._gotSite = False

        self._setRaDecFromAltAz()
示例#2
0
    def _genericLongLat(long, lat):
        try:
            if not isinstance(int, Coord):
                long = Coord.fromDMS(int)
            else:
                long = int.toDMS()

            Position._checkRange(float(int), -180, 360)

        except ValueError as e:
            raise ValueError("Invalid LONGITUDE coordinate %s" % str(int))
        except PositionOutsideLimitsError:
            raise ValueError(
                "Invalid LONGITUDE range %s. Must be between 0-360 deg or -180 - +180 deg."
                % str(int))

        try:
            if not isinstance(lat, Coord):
                lat = Coord.fromDMS(lat)
            else:
                lat = lat.toDMS()

            Position._checkRange(float(lat), -90, 180)

        except ValueError:
            raise ValueError("Invalid LATITUDE coordinate %s" % str(lat))
        except PositionOutsideLimitsError:
            raise ValueError(
                "Invalid LATITUDE range %s. Must be between 0-180 deg or -90 - +90 deg."
                % str(lat))

        return (int, lat)
示例#3
0
    def __init__(self):
        TelescopeBase.__init__(self)

        self.__slewing = False
        self._az = Coord.fromDMS(0)
        self._alt = Coord.fromDMS(70)

        self._slewing = False
        self._tracking = True
        self._parked = False

        self._abort = threading.Event()

        self._epoch = Epoch.J2000

        self._cover = False
        self._pierside = TelescopePierSide.UNKNOWN

        try:
            self._site = self.getManager().getProxy("/Site/0")
            self._gotSite = True
        except:
            self._site = Site()
            self._gotSite = False

        self._setRaDecFromAltAz()
示例#4
0
    def fromAltAz(alt, az):
        try:
            if not isinstance(az, Coord):
                az = Coord.fromDMS(az)
            else:
                az = az.toDMS()

            Position._checkRange(float(az), -180, 360)

        except ValueError as e:
            raise ValueError("Invalid AZ coordinate %s" % str(az))
        except PositionOutsideLimitsError:
            raise ValueError(
                "Invalid AZ range %s. Must be between 0-360 deg or -180 - +180 deg."
                % str(az))

        try:
            if not isinstance(alt, Coord):
                alt = Coord.fromDMS(alt)
            else:
                alt = alt.toDMS()

            Position._checkRange(float(alt), -90, 180)

        except ValueError as e:
            raise ValueError("Invalid ALT coordinate %s" % str(alt))
        except PositionOutsideLimitsError:
            raise ValueError(
                "Invalid ALT range %s. Must be between 0-180 deg or -90 - +90 deg."
                % str(alt))

        return Position((alt, az), system=System.TOPOCENTRIC)
示例#5
0
    def test_coord(self):

        c = Config({"DMS": Coord.fromDMS(10), "HMS": Coord.fromHMS(10)})

        assert c["DMS"].state == State.DMS
        assert c["HMS"].state == State.HMS

        c["DMS"] = 20
        assert c["DMS"] == Coord.fromDMS(20)

        c["HMS"] = 20
        assert c["HMS"] == Coord.fromHMS(20)
        assert c["HMS"] == Coord.fromDMS(20 * 15)
示例#6
0
    def test_coord (self):

        c = Config({"DMS": Coord.fromDMS(10),
                    "HMS": Coord.fromHMS(10)})

        assert c["DMS"].state == State.DMS
        assert c["HMS"].state == State.HMS

        c["DMS"] = 20
        assert c["DMS"] == Coord.fromDMS(20)

        c["HMS"] = 20
        assert c["HMS"] == Coord.fromHMS(20)
        assert c["HMS"] == Coord.fromDMS(20*15)
示例#7
0
    def find (self, near=None, limit=9999, **conditions):

        self.useCat("II/183A/")

        if conditions.get("closest", False):
            limit = 1
            self.useColumns("*POS_EQ_RA_MAIN,*POS_EQ_DEC_MAIN,*ID_MAIN,Vmag,_r", sortBy="_r")
        else:
            self.useColumns("*POS_EQ_RA_MAIN,*POS_EQ_DEC_MAIN,*ID_MAIN,Vmag,_r", sortBy="*POS_EQ_RA_MAIN")
        
        if near:
            self.useTarget(near, radius=conditions.get("radius", 45))
        
        x = super(Landolt,self).find(limit)

        for i in x:
            RA = i.pop("*POS_EQ_RA_MAIN")
            i["RA"] = Coord.fromHMS(str(RA))
            DEC = i.pop("*POS_EQ_DEC_MAIN")
            i["DEC"] = Coord.fromDMS(str(DEC))
            ID = i.pop("*ID_MAIN")
            i["ID"] = str(ID)
            V = i.pop("Vmag")
            i["V"] = str(V)
            i.pop("_r")

        return x 
示例#8
0
            def _validateOffset(value):
                try:
                    offset = Coord.fromAS(int(value))
                except ValueError:
                    offset = Coord.fromDMS(value)

                return offset
示例#9
0
    def getAz(self):

        self._checkQuirk()

        self.tty.setTimeout(10)

        cmd = "POSICAO?"

        self._write(cmd)

        ack = self._readline()

        # check timeout
        if not ack:
            raise IOError("Couldn't get azimuth after %d seconds." % 10)

        # uC is going crazy
        if ack == "INVALIDO":
            raise IOError("Error getting dome azimuth (ack=INVALIDO).")

        # get ack return
        if ack.startswith("CUPULA="):
            ack = ack[ack.find("=") + 1:]

        if ack == "ERRO":
            # FIXME: restart and try again
            raise ChimeraException(
                "Dome is in invalid state. Hard restart needed.")

        # correct dome/telescope phase difference
        az = int(math.ceil(int(ack) * self["az_resolution"]))
        az -= self._az_shift
        az = az % 360

        return Coord.fromDMS(az)
示例#10
0
    def test_parse_dms (self):

        coords = []

        t_parse = 0
        t_check = 0

        for dd in range(-23, 24):
            for mm in range(0, 60):
                for ss in range(0, 60):
                    s = '%+03d:%02d:%06.3f' % (dd,mm,ss)

                    t = time.clock()
                    c = Coord.fromDMS(s)
                    t_parse += time.clock()-t

                    coords.append((s,c))

        for coord in coords:
            t = time.clock()
            assert coord[0] == str(coord[1]), (coord[0], "!=", str(coord[1]))
            t_check += time.clock()-t

        print "#%d coords parsed in %.3fs (%.3f/s) and checked in %.3fs (%.3f/s) ..." % (len(coords), t_parse, len(coords)/t_parse,
                                                                                         t_check, len(coords)/t_check)
示例#11
0
    def getTargetDec(self):
        self._write(":Gd#")
        ret = self._readline()

        ret = ret.replace('\xdf', ':')

        return Coord.fromDMS(ret[:-1])
示例#12
0
    def getTargetDec(self):
        self._write(":Gd#")
        ret = self._readline()

        ret = ret.replace('\xdf', ':')

        return Coord.fromDMS(ret[:-1])
示例#13
0
    def test_parse_dms(self):

        coords = []

        t_parse = 0
        t_check = 0

        for dd in range(-23, 24):
            for mm in range(0, 60):
                for ss in range(0, 60):
                    s = '%+03d:%02d:%06.3f' % (dd, mm, ss)

                    t = time.clock()
                    c = Coord.fromDMS(s)
                    t_parse += time.clock() - t

                    coords.append((s, c))

        for coord in coords:
            t = time.clock()
            assert coord[0] == str(coord[1]), (coord[0], "!=", str(coord[1]))
            t_check += time.clock() - t

        print "#%d coords parsed in %.3fs (%.3f/s) and checked in %.3fs (%.3f/s) ..." % (
            len(coords), t_parse, len(coords) / t_parse, t_check,
            len(coords) / t_check)
示例#14
0
    def find(self, near=None, limit=9999, **conditions):

        self.useCat("II/183A/")
        #self.useCat("II/118/")

        if conditions.get("closest", False):
            limit = 1
            self.useColumns(
                "*POS_EQ_RA_MAIN,*POS_EQ_DEC_MAIN,*ID_MAIN,Vmag,_r",
                sortBy="_r")
        else:
            self.useColumns(
                "*POS_EQ_RA_MAIN,*POS_EQ_DEC_MAIN,*ID_MAIN,Vmag,_r",
                sortBy="*POS_EQ_RA_MAIN")

        if near:
            self.useTarget(near, radius=conditions.get("radius", 45))

        x = super(Landolt, self).find(limit)

        for i in x:
            RA = i.pop("*POS_EQ_RA_MAIN")
            i["RA"] = Coord.fromHMS(str(RA))
            DEC = i.pop("*POS_EQ_DEC_MAIN")
            i["DEC"] = Coord.fromDMS(str(DEC))
            ID = i.pop("*ID_MAIN")
            i["ID"] = str(ID)
            V = i.pop("Vmag")
            i["V"] = str(V)
            i.pop("_r")

        return x
示例#15
0
    def test_set_info (self):

        m = self.m

        try:
            m.setLat("-22 32 03")
            m.setLong("-45 34 57")
            m.setDate(time.time())
            m.setLocalTime(time.time())
            m.setUTCOffset(3)

            m.setLat(Coord.fromDMS("-22 32 03"))
            m.setLong(Coord.fromDMS("-45 34 57"))
            m.setDate(dt.date.today())
            m.setLocalTime(dt.datetime.now().time())
            m.setUTCOffset(3)
        except Exception:
            log.exception("error")
示例#16
0
文件: astelco.py 项目: agati/chimera
 def setLong(self, coord):  # converted to Astelco
     if not isinstance(coord, Coord):
         coord = Coord.fromDMS(coord)
     cmdid = self._tpl.set(
         'POINTING.SETUP.LOCAL.LONGITUDE', coord.D, wait=True)
     ret = self._tpl.succeeded(cmdid)
     if not ret:
         raise AstelcoException("Invalid Longitude '%s'" % coord.D)
     return True
示例#17
0
    def slewToAz(self, az):

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        if int(az) >= 360:
            az = az % 360

        drv = self.getDriver()
        drv.slewToAz(az)
示例#18
0
    def fromAltAz(alt, az):
        try:
            if not isinstance(az, Coord):
                az = Coord.fromDMS(az)
            else:
                az = az.toDMS()

            Position._checkRange(float(az), -180, 360)

        except ValueError, e:
            raise ValueError("Invalid AZ coordinate %s" % str(az))
示例#19
0
    def _genericLongLat(long, lat):
        try:
            if not isinstance(long, Coord):
                long = Coord.fromDMS(long)
            else:
                long = long.toDMS()

            Position._checkRange(float(long), -180, 360)

        except ValueError, e:
            raise ValueError("Invalid LONGITUDE coordinate %s" % str(long))
示例#20
0
    def _telescopeChanged (self, az):

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        if self._needToMove(az):
            self.log.debug("[control] adding %s to the queue (delta=%.2f)" % (az, abs(self.getAz()-az)))
            self.queue.put(az)
        else:
            self.log.debug("[control] standing"
                           " (dome az=%.2f, tel az=%.2f, delta=%.2f.)" % (self.getAz(), az, abs(self.getAz()-az)))
示例#21
0
    def getDec(self):
        self._write(":GD#")
        ret = self._readline()

        # meade bugs: same as getRa
        if len(ret) > 10:
            ret = ret[1:]

        ret = ret.replace('\xdf', ':')

        return Coord.fromDMS(ret[:-1])
示例#22
0
    def getDec(self):
        self._write(":GD#")
        ret = self._readline()

        # meade bugs: same as getRa
        if len(ret) > 10:
            ret = ret[1:]

        ret = ret.replace('\xdf', ':')

        return Coord.fromDMS(ret[:-1])
示例#23
0
    def fromAltAz(alt, az):
        try:
            if not isinstance(az, Coord):
                az = Coord.fromDMS(az)
            else:
                az = az.toDMS()

            Position._checkRange(float(az), -180, 360)

        except ValueError, e:
            raise ValueError("Invalid AZ coordinate %s" % str(az))
示例#24
0
    def _genericLongLat(long, lat):
        try:
            if not isinstance(long, Coord):
                long = Coord.fromDMS(long)
            else:
                long = long.toDMS()

            Position._checkRange(float(long), -180, 360)

        except ValueError, e:
            raise ValueError("Invalid LONGITUDE coordinate %s" % str(long))
示例#25
0
文件: astelco.py 项目: agati/chimera
    def setTargetDec(self, dec):  # converted to Astelco
        if not isinstance(dec, Coord):
            dec = Coord.fromDMS(dec)

        cmdid = self._tpl.set('OBJECT.EQUATORIAL.DEC', dec.D, wait=True)

        ret = self._tpl.succeeded(cmdid)

        if not ret:
            raise AstelcoException("Invalid DEC '%s'" % dec)

        return True
示例#26
0
    def _telescopeChanged(self, az):

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        if self._needToMove(az):
            self.log.debug("[control] adding %s to the queue." % az)
            self.queue.put(az)
        else:
            self.log.debug("[control] telescope still in the slit, standing"
                           " (dome az=%.2f, tel az=%.2f, delta=%.2f.)" %
                           (self.getAz(), az, abs(self.getAz() - az)))
示例#27
0
    def __init__(self):
        TelescopeBase.__init__(self)

        self.__slewing = False
        self._az = Coord.fromDMS(0)
        self._alt = Coord.fromDMS(70)

        self._slewing = False
        self._tracking = True
        self._parked = False

        self._abort = threading.Event()

        try:
            self._site = self.getManager().getProxy("/Site/0")
            self._gotSite = True
        except:
            self._site = Site()
            self._gotSite = False

        self._setRaDecFromAltAz()
示例#28
0
    def __init__(self):
        ChimeraObject.__init__(self)

        self.__slewing = False
        self._az = Coord.fromDMS(0)
        self._alt = Coord.fromDMS(70)

        self._slewing = False
        self._tracking = True
        self._parked = False

        self._abort = threading.Event()

        try:
            self._site = self.getManager().getProxy(self['site'])
            self._gotSite = True
        except:
            self._site = Site()
            self._gotSite = False

        self._setRaDecFromAltAz()
示例#29
0
    def __init__(self):
        TelescopeBase.__init__(self)

        self.__slewing = False
        self._az = Coord.fromDMS(0)
        self._alt = Coord.fromDMS(70)

        self._slewing = False
        self._tracking = True
        self._parked = False

        self._abort = threading.Event()

        try:
            self._site = self.getManager().getProxy("/Site/0")
            self._gotSite = True
        except:
            self._site = Site()
            self._gotSite = False

        self._setRaDecFromAltAz()
示例#30
0
    def slewToAz(self, az):

        self._checkQuirk()

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        # correct dome/telescope phase difference
        dome_az = az.D + self._az_shift

        if dome_az > 360:
            raise InvalidDomePositionException("Cannot slew to %s. "
                                               "Outside azimuth limits." % az)
        
        dome_az = int (math.ceil (dome_az / self["az_resolution"]))

        pstn = "CUPULA=%03d" % dome_az

        self.tty.setTimeout (self["slew_timeout"])

        self._write(pstn)

        ack = self._readline ()

        if ack == "INVALIDO":
            raise IOError("Error trying to slew the dome to"
                          "azimuth '%s' (dome azimuth '%s')." % (az, dome_az))

        # ok, we are slewing now
        self._slewing = True
        self.slewBegin(az)

        # FIXME: add abort option here
        fin = self._readline ()

        if fin == "ALARME":
            self.log.warning("Error while slewing dome. Some barcodes"
                             " couldn't be read correctly."
                             " Restarting the dome and trying again.")
            self._restartDome()
            return self.slewToAz(az)

        if fin.startswith ("CUPULA="):
            self._slewing = False
            time.sleep (0.3) # FIXME: how much sleep we need?
            self.slewComplete(self.getAz(), DomeStatus.OK)
        else:
            self._slewing = False
            self.log.warning("Unknow error while slewing. "
                             "Received '%s' from dome. Restarting it." % fin)
            self._restartDome()
            return self.slewToAz(az)
示例#31
0
    def slewToAz(self, az):

        self._checkQuirk()

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        # correct dome/telescope phase difference
        dome_az = az.D + self._az_shift

        if dome_az > 360:
            raise InvalidDomePositionException("Cannot slew to %s. "
                                               "Outside azimuth limits." % az)

        dome_az = int(math.ceil(dome_az / self["az_resolution"]))

        pstn = "CUPULA=%03d" % dome_az

        self.tty.setTimeout(self["slew_timeout"])

        self._write(pstn)

        ack = self._readline()

        if ack == "INVALIDO":
            raise IOError("Error trying to slew the dome to"
                          "azimuth '%s' (dome azimuth '%s')." % (az, dome_az))

        # ok, we are slewing now
        self._slewing = True
        self.slewBegin(az)

        # FIXME: add abort option here
        fin = self._readline()

        if fin == "ALARME":
            self.log.warning("Error while slewing dome. Some barcodes"
                             " couldn't be read correctly."
                             " Restarting the dome and trying again.")
            self._restartDome()
            return self.slewToAz(az)

        if fin.startswith("CUPULA="):
            self._slewing = False
            time.sleep(0.3)  # FIXME: how much sleep we need?
            self.slewComplete(self.getAz(), DomeStatus.OK)
        else:
            self._slewing = False
            self.log.warning("Unknow error while slewing. "
                             "Received '%s' from dome. Restarting it." % fin)
            self._restartDome()
            return self.slewToAz(az)
示例#32
0
    def test_jog(self):

        # FIXME: make a real test.
        raise SkipTest()

        print

        dt = Coord.fromDMS("00:20:00")

        start = self.tel.getPositionRaDec()
        self.tel.moveNorth(dt, SlewRate.FIND)
        print "North:", (start.ra - self.tel.getPositionRaDec().ra).AS, (
            start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveSouth(dt, SlewRate.FIND)
        print "South:", (start.ra - self.tel.getPositionRaDec().ra).AS, (
            start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveWest(dt, SlewRate.FIND)
        print "West :", (start.ra - self.tel.getPositionRaDec().ra).AS, (
            start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveEast(dt, SlewRate.FIND)
        print "East :", (start.ra - self.tel.getPositionRaDec().ra).AS, (
            start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveNorth(dt, SlewRate.FIND)
        self.tel.moveEast(dt, SlewRate.FIND)
        print "NE   :", (start.ra - self.tel.getPositionRaDec().ra).AS, (
            start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveSouth(dt, SlewRate.FIND)
        self.tel.moveEast(dt, SlewRate.FIND)
        print "SE   :", (start.ra - self.tel.getPositionRaDec().ra).AS, (
            start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveNorth(dt, SlewRate.FIND)
        self.tel.moveWest(dt, SlewRate.FIND)
        print "NW   :", (start.ra - self.tel.getPositionRaDec().ra).AS, (
            start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveSouth(dt, SlewRate.FIND)
        self.tel.moveWest(dt, SlewRate.FIND)
        print "SW   :", (start.ra - self.tel.getPositionRaDec().ra).AS, (
            start.dec - self.tel.getPositionRaDec().dec).AS
示例#33
0
    def test_parsing_conversion_hipparcos(self):
        """Parsing and comparing a subset of the Hipparcos and Tycho Catalog"""

        hipp = ascii.read(os.path.abspath(
            os.path.join(os.path.dirname(__file__), 'hipparcos-tycho.dat')),
                          format="tab")

        expected_ra = []
        expected_ra_str = []

        expected_dec = []
        expected_dec_str = []

        ra = []
        ra_hms = []

        dec = []
        dec_dms = []

        for row in hipp:
            expected_ra_str.append(row[0].strip())
            expected_dec_str.append(row[1].strip())

            expected_ra.append(float(row[2]))
            expected_dec.append(float(row[3]))

            ra.append(Coord.fromD(str(row[2])))
            dec.append(Coord.fromD(str(row[3])))

            ra_hms.append(Coord.fromHMS(str(row[0])))
            dec_dms.append(Coord.fromDMS(str(row[1])))

        for i in range(len(hipp)):
            assert expected_ra_str[i] == ra_hms[i].strfcoord("%(h)02d %(m)02d %(s)05.2f"), \
                "ra: %s != coord ra: %s" % (expected_ra_str[i], ra_hms[i].strfcoord("%(h)02d %(m)02d %(s)05.2f"))

            assert expected_dec_str[i] == dec_dms[i].strfcoord("%(d)02d %(m)02d %(s)04.1f"), \
                "dec: %s != coord dec: %s" % (expected_dec_str[i], dec_dms[i].strfcoord("%(d)02d %(m)02d %(s)04.1f"))

            # test conversion from D to D
            assert TestCoord.equal(ra[i].D, expected_ra[i], e=1e-8), \
                "ra: %.6f != coord ra: %.6f (%.6f)" % (expected_ra[i], ra[i].D, expected_ra[i]-ra[i].D)

            assert TestCoord.equal(dec[i].D, expected_dec[i], e=1e-8), \
                "dec: %.6f != coord dec: %.64f (%.6f)" % (expected_dec[i], dec[i].D, expected_dec[i]-dec[i].D)

            # test conversion from DMS HMS to D
            assert TestCoord.equal(ra_hms[i].D, expected_ra[i], e=1e-4), \
                "ra: %.6f != coord ra: %.6f (%.6f)" % (expected_ra[i], ra_hms[i].D, expected_ra[i]-ra_hms[i].D)

            assert TestCoord.equal(dec_dms[i].D, expected_dec[i], e=1e-4), \
                "dec: %.6f != coord dec: %.64f (%.6f)" % (expected_dec[i], dec_dms[i].D, expected_dec[i]-dec_dms[i].D)
示例#34
0
    def setLong (self, coord):

        if not isinstance (coord, Coord):
            coord = Coord.fromDMS (coord)

        self._write (":Sg%s#" % coord.strfcoord("%(d)03d\xdf%(m)02d"))

        ret = self._readbool ()

        if not ret:
            raise MeadeException("Invalid Longitude '%s'" % long)

        return True
示例#35
0
文件: astelco.py 项目: agati/chimera
    def setLat(self, lat):  # converted to Astelco
        if not isinstance(lat, Coord):
            lat = Coord.fromDMS(lat)

        lat_float = float(lat.D)

        cmdid = self._tpl.set(
            'POINTING.SETUP.LOCAL.LATITUDE', float(lat_float), wait=True)
        ret = self._tpl.succeeded(cmdid)
        if not ret:
            raise AstelcoException(
                "Invalid Latitude '%s' ('%s')" % (lat, lat_float))
        return True
示例#36
0
    def setTargetDec(self, dec):

        if not isinstance (dec, Coord):
            dec = Coord.fromDMS(dec)

        self._write(":Sd%s#" % dec.strfcoord("%(d)02d\xdf%(m)02d:%(s)02d"))

        ret = self._readbool()

        if not ret:
            raise MeadeException("Invalid DEC '%s'" % dec)

        return True
示例#37
0
    def setTargetDec(self, dec):

        if not isinstance(dec, Coord):
            dec = Coord.fromDMS(dec)

        self._write(":Sd%s#" % dec.strfcoord("%(d)02d\xdf%(m)02d:%(s)02d"))

        ret = self._readbool()

        if not ret:
            raise MeadeException("Invalid DEC '%s'" % dec)

        return True
示例#38
0
    def setLong(self, coord):

        if not isinstance(coord, Coord):
            coord = Coord.fromDMS(coord)

        self._write(":Sg%s#" % coord.strfcoord("%(d)03d\xdf%(m)02d"))

        ret = self._readbool()

        if not ret:
            raise MeadeException("Invalid Longitude '%s'" % long)

        return True
示例#39
0
    def getAz(self):
        self._write(":GZ#")
        ret = self._readline()
        ret = ret.replace('\xdf', ':')

        c = Coord.fromDMS(ret[:-1])

        if self['azimuth180Correct']:
            if c.toD() >= 180:
                c = c - Coord.fromD(180)
            else:
                c = c + Coord.fromD(180)

        return c
示例#40
0
    def getAz(self):
        self._write(":GZ#")
        ret = self._readline()
        ret = ret.replace('\xdf', ':')
        
        c = Coord.fromDMS(ret[:-1])
        
        if self['azimuth180Correct']:
            if c.toD() >= 180:
                c = c - Coord.fromD(180)
            else:
                c = c + Coord.fromD(180)

        return c
示例#41
0
    def test_parsing_conversion_bsc(self):
        """Parsing and comparing to Vizier calculated values the entire 5th Bright Star Catalogue"""

        bsc = asciidata.open(os.path.abspath(
            os.path.join(os.path.dirname(__file__), 'bsc.dat')),
                             comment_char='#',
                             delimiter='\t')

        expected_ra = []
        expected_ra_str = []

        expected_dec = []
        expected_dec_str = []

        ra = []
        dec = []

        for i in range(bsc.nrows):
            expected_ra.append(bsc[0][i])
            expected_dec.append(bsc[1][i])

            expected_ra_str.append(bsc[2][i].strip())
            expected_dec_str.append(bsc[3][i].strip())

            ra.append(Coord.fromHMS(bsc[2][i]))
            dec.append(Coord.fromDMS(bsc[3][i]))

        for i in range(bsc.nrows):
            # use e=0.0001 'cause its the maximum we can get with Vizier data (4 decimal places only)

            # test conversion from HMS DMS to decimal
            assert TestCoord.equal(
                ra[i].D, expected_ra[i],
                e=1e-4), "ra: %.6f != coord ra: %.6f (%.6f)" % (
                    expected_ra[i], ra[i].D, expected_ra[i] - ra[i].D)
            assert TestCoord.equal(
                dec[i].D, expected_dec[i],
                e=1e-4), "dec: %.6f != coord dec: %.64f (%.6f)" % (
                    expected_dec[i], dec[i].D, expected_dec[i] - dec[i].D)

            # test strfcoord implementation
            assert expected_ra_str[i] == ra[i].strfcoord(
                "%(h)02d %(m)02d %(s)04.1f"), "ra: %s != coord ra: %s" % (
                    expected_ra_str[i],
                    ra[i].strfcoord("%(h)02d %(m)02d %(s)04.1f"))

            assert expected_dec_str[i] == dec[i].strfcoord(
                "%(d)02d %(m)02d %(s)02.0f"), "dec: %s != coord dec: %s" % (
                    expected_dec_str[i],
                    dec[i].strfcoord("%(d)02d %(m)02d %(s)02.0f"))
示例#42
0
    def test_parsing_conversion_hipparcos (self):
        """Parsing and comparing a subset of the Hipparcos and Tycho Catalog"""

        hipp = ascii.read(os.path.abspath(os.path.join(os.path.dirname(__file__), 'hipparcos-tycho.dat')), format="tab")

        expected_ra  = []
        expected_ra_str = []

        expected_dec = []
        expected_dec_str = []

        ra  = []
        ra_hms = []

        dec = []
        dec_dms = []

        for row in hipp:
            expected_ra_str.append(row[0].strip())
            expected_dec_str.append(row[1].strip())

            expected_ra.append(float(row[2]))
            expected_dec.append(float(row[3]))

            ra.append(Coord.fromD(str(row[2])))
            dec.append(Coord.fromD(str(row[3])))

            ra_hms.append(Coord.fromHMS(str(row[0])))
            dec_dms.append(Coord.fromDMS(str(row[1])))

        for i in range(len(hipp)):
            assert expected_ra_str[i] == ra_hms[i].strfcoord("%(h)02d %(m)02d %(s)05.2f"), \
                "ra: %s != coord ra: %s" % (expected_ra_str[i], ra_hms[i].strfcoord("%(h)02d %(m)02d %(s)05.2f"))

            assert expected_dec_str[i] == dec_dms[i].strfcoord("%(d)02d %(m)02d %(s)04.1f"), \
                "dec: %s != coord dec: %s" % (expected_dec_str[i], dec_dms[i].strfcoord("%(d)02d %(m)02d %(s)04.1f"))

            # test conversion from D to D
            assert TestCoord.equal(ra[i].D, expected_ra[i], e=1e-8), \
                "ra: %.6f != coord ra: %.6f (%.6f)" % (expected_ra[i], ra[i].D, expected_ra[i]-ra[i].D)

            assert TestCoord.equal(dec[i].D, expected_dec[i], e=1e-8), \
                "dec: %.6f != coord dec: %.64f (%.6f)" % (expected_dec[i], dec[i].D, expected_dec[i]-dec[i].D)

            # test conversion from DMS HMS to D
            assert TestCoord.equal(ra_hms[i].D, expected_ra[i], e=1e-4), \
                "ra: %.6f != coord ra: %.6f (%.6f)" % (expected_ra[i], ra_hms[i].D, expected_ra[i]-ra_hms[i].D)

            assert TestCoord.equal(dec_dms[i].D, expected_dec[i], e=1e-4), \
                "dec: %.6f != coord dec: %.64f (%.6f)" % (expected_dec[i], dec_dms[i].D, expected_dec[i]-dec_dms[i].D)
示例#43
0
    def slewToAz(self, az):

        if not self._checkIdle():  # Verify if dome is idle
            self.log.warning("Error, Dome busy.")
            return

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        # correct dome/telescope phase difference
        dome_az = az.D + self._az_shift

        if dome_az > 360:
            raise InvalidDomePositionException("Cannot slew to %s. "
                                               "Outside azimuth limits." % az)

        if dome_az >= 270:
            dome_az = int(math.ceil(dome_az / self["az_resolution"]))
            dome_az += 666  # Values between 801 and 982, starting in 207 degrees
        else:
            dome_az = int(math.ceil(dome_az / self["az_resolution"]))
            dome_az += 847

        pstn = "MEADE DOMO MOVER = %03d" % dome_az

        self._write(pstn)

        ack = self._readline()

        if ack != "ACK":
            raise IOError("Error trying to slew the dome to"
                          "azimuth '%s' (dome azimuth '%s')." % (az, dome_az))

        # ok, we are slewing now
        self._slewing = True
        self.slewBegin(az)

        # FIXME: add abort option here

        for x in range(120):  # Tries 120 times
            time.sleep(0.5)  # Total of 60 seconds waiting
            if self._checkIdle():
                self._slewing = False
                self.slewComplete(self.getAz(), DomeStatus.OK)
                # break
                return

        if not self._checkIdle():
            self.log.warning("Error, restarting Dome.")
            self._restartDome()
示例#44
0
    def fromRaDec(ra, dec, epoch=Epoch.J2000):

        try:
            if type(ra) is str:
                ra = Coord.fromHMS(ra)
            elif isinstance(ra, Coord):
                ra = ra.toHMS()
            else:
                try:
                    ra = Coord.fromH(float(ra))
                    ra = ra.toHMS()
                except ValueError:
                    raise ValueError(
                        "Invalid RA coordinate type %s. Expected numbers, strings or Coords."
                        % str(type(ra)))

            Position._checkRange(float(ra), 0, 360)

        except ValueError as e:
            raise ValueError("Invalid RA coordinate %s" % str(ra))
        except PositionOutsideLimitsError:
            raise ValueError(
                "Invalid RA range %s. Must be between 0-24 hours or 0-360 deg."
                % str(ra))

        try:
            if type(dec) is str:
                dec = Coord.fromDMS(dec)
            elif isinstance(dec, Coord):
                dec = dec.toDMS()
            else:
                try:
                    dec = Coord.fromD(float(dec))
                    dec = dec.toDMS()
                except ValueError:
                    raise ValueError(
                        "Invalid DEC coordinate type %s. Expected numbers, strings or Coords."
                        % str(type(dec)))

            Position._checkRange(float(dec), -90, 360)

        except ValueError as e:
            raise ValueError("Invalid DEC coordinate %s" % str(dec))
        except PositionOutsideLimitsError:
            raise ValueError(
                "Invalid DEC range %s. Must be between 0-360 deg or -90 - +90 deg."
                % str(dec))

        return Position((ra, dec), system=System.CELESTIAL, epoch=epoch)
示例#45
0
    def setLat (self, lat):

        if not isinstance (lat, Coord):
            lat = Coord.fromDMS (lat)

        lat_str = lat.strfcoord("%(d)02d\xdf%(m)02d")

        self._write (":St%s#" % lat_str)

        ret = self._readbool ()

        if not ret:
            raise MeadeException("Invalid Latitude '%s' ('%s')" % (lat, lat_str))

        return True
示例#46
0
    def setLat(self, lat):

        if not isinstance(lat, Coord):
            lat = Coord.fromDMS(lat)

        lat_str = lat.strfcoord("%(d)02d\xdf%(m)02d")

        self._write(":St%s#" % lat_str)

        ret = self._readbool()

        if not ret:
            raise MeadeException("Invalid Latitude '%s' ('%s')" %
                                 (lat, lat_str))

        return True
示例#47
0
    def slewToAz(self, az):

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        if az > 360:
            raise InvalidDomePositionException("Cannot slew to %s. "
                                               "Outside azimuth limits." % az)

        self._abort.clear()
        self._slewing = True

        self.slewBegin(az)
        self.log.info("Slewing to %s" % az)

        # slew time ~ distance from current position
        distance = abs(float(az - self._position))
        if distance > 180:
            distance = 360 - distance

        self.log.info("Slew distance %.3f deg" % distance)

        slew_time = distance * self._maxSlewTime

        self.log.info("Slew time ~ %.3f s" % slew_time)

        status = DomeStatus.OK

        t = 0
        while t < slew_time:

            if self._abort.isSet():
                self._slewing = False
                status = DomeStatus.ABORTED
                break

            time.sleep(0.1)
            t += 0.1

        if status == DomeStatus.OK:
            self._position = az  # move :)
        else:
            # assume half movement in case of abort
            self._position = self.position + distance / 2.0

        self._slewing = False
        self.slewComplete(self.getAz(), status)
示例#48
0
    def slewToAz(self, az):

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        if az > 360:
            raise InvalidDomePositionException("Cannot slew to %s. "
                                               "Outside azimuth limits." % az)

        self._abort.clear()
        self._slewing = True

        self.slewBegin(az)
        self.log.info("Slewing to %s" % az)

        # slew time ~ distance from current position
        distance = abs(float(az - self._position))
        if distance > 180:
            distance = 360 - distance

        self.log.info("Slew distance %.3f deg" % distance)

        slew_time = distance * self._maxSlewTime

        self.log.info("Slew time ~ %.3f s" % slew_time)

        status = DomeStatus.OK

        t = 0
        while t < slew_time:

            if self._abort.isSet():
                self._slewing = False
                status = DomeStatus.ABORTED
                break

            time.sleep(0.1)
            t += 0.1

        if status == DomeStatus.OK:
            self._position = az  # move :)
        else:
            # assume half movement in case of abort
            self._position = self.position + distance / 2.0

        self._slewing = False
        self.slewComplete(self.getAz(), status)
示例#49
0
    def setTargetAz(self, az):

        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        self._write(":Sz%s#" %
                    az.strfcoord("%(d)03d\xdf%(m)02d:%(s)02d", signed=False))

        ret = self._readbool()

        if not ret:
            raise MeadeException("Invalid Azimuth '%s'" %
                                 az.strfcoord("%(d)03d\xdf%(m)02d"))

        self._target_az = az

        return True
示例#50
0
    def getAz(self):
        self._write(":GZ#")
        ret = self._readline()
        ret = ret.replace('\xdf', ':')

        c = Coord.fromDMS(ret[:-1])

        if self['azimuth180Correct']:
            self.log.debug('Initial azimuth:  %s' % str(c.toDMS()))

            if c.toD() > 180:
                c = c - Coord.fromD(180)
            else:
                c = c + Coord.fromD(180)

            self.log.debug('Final azimuth:  %s' % str(c.toDMS()))

        return c
示例#51
0
    def test_jog(self):

        # FIXME: make a real test.
        raise SkipTest()

        print

        dt = Coord.fromDMS("00:20:00")

        start = self.tel.getPositionRaDec()
        self.tel.moveNorth(dt, SlewRate.FIND)
        print "North:", (start.ra - self.tel.getPositionRaDec().ra).AS, (start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveSouth(dt, SlewRate.FIND)
        print "South:", (start.ra - self.tel.getPositionRaDec().ra).AS, (start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveWest(dt, SlewRate.FIND)
        print "West :", (start.ra - self.tel.getPositionRaDec().ra).AS, (start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveEast(dt, SlewRate.FIND)
        print "East :", (start.ra - self.tel.getPositionRaDec().ra).AS, (start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveNorth(dt, SlewRate.FIND)
        self.tel.moveEast(dt, SlewRate.FIND)
        print "NE   :", (start.ra - self.tel.getPositionRaDec().ra).AS, (start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveSouth(dt, SlewRate.FIND)
        self.tel.moveEast(dt, SlewRate.FIND)
        print "SE   :", (start.ra - self.tel.getPositionRaDec().ra).AS, (start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveNorth(dt, SlewRate.FIND)
        self.tel.moveWest(dt, SlewRate.FIND)
        print "NW   :", (start.ra - self.tel.getPositionRaDec().ra).AS, (start.dec - self.tel.getPositionRaDec().dec).AS

        start = self.tel.getPositionRaDec()
        self.tel.moveSouth(dt, SlewRate.FIND)
        self.tel.moveWest(dt, SlewRate.FIND)
        print "SW   :", (start.ra - self.tel.getPositionRaDec().ra).AS, (start.dec - self.tel.getPositionRaDec().dec).AS
示例#52
0
    def getAz(self):

        if not self._checkIdle():  # Verify if dome is idle
            self.log.warning("Error, Dome busy.")
            return

        self.tty.setTimeout(10)

        cmd = "MEADE PROG STATUS"

        self._write(cmd)

        ack = self._readline()

        # check timeout
        if not ack:
            self.log.warning("Dome timeout, restarting it.")
            self._restartDome()
            return self.getAz()
            # raise IOError("Couldn't get azimuth after %d seconds." % 10)

        # get ack return
        if ack.startswith("    "):
            ack = ack[8:11]

        if ack == "   ":
            self.log.warning("No information on dome position. Move dome to initialize positioning")
            ack = "000"

        # correct dome/telescope phase difference
        az = int(ack)
        if az >= 847:  # Values between 801 and 982, starting in 207 degrees
            az -= 847
        else:
            az -= 666
        az = int(math.ceil(az * self["az_resolution"]))
        az -= self._az_shift
        az %= 360

        az += 4  # Ugly bugfixing for a dome in the dome controller.

        return Coord.fromDMS(az)
示例#53
0
    def test_parsing_conversion_bsc (self):
        """Parsing and comparing to Vizier calculated values the entire 5th Bright Star Catalogue"""

        bsc = ascii.read(os.path.abspath(os.path.join(os.path.dirname(__file__), 'bsc.dat')), format="tab", converters={})

        expected_ra  = []
        expected_ra_str = []

        expected_dec = []
        expected_dec_str = []

        ra  = []
        dec = []

        for row in bsc:
            expected_ra.append(row[0])
            expected_dec.append(row[1])

            expected_ra_str.append(row[2].strip())
            expected_dec_str.append(row[3].strip())

            ra.append(Coord.fromHMS(str(row[2])))
            dec.append(Coord.fromDMS(str(row[3])))

        for i in range(len(bsc)):
            # use e=0.0001 'cause its the maximum we can get with Vizier data (4 decimal places only)

            # test conversion from HMS DMS to decimal
            assert TestCoord.equal(ra[i].D, expected_ra[i], e=1e-4), \
                "ra: %.6f != coord ra: %.6f (%.6f)" % (expected_ra[i], ra[i].D, expected_ra[i]-ra[i].D)

            assert TestCoord.equal(dec[i].D, expected_dec[i], e=1e-4), \
                "dec: %.6f != coord dec: %.64f (%.6f)" % (expected_dec[i], dec[i].D, expected_dec[i]-dec[i].D)

            # test strfcoord implementation
            assert expected_ra_str[i] == ra[i].strfcoord("%(h)02d %(m)02d %(s)04.1f"), \
                "ra: %s != coord ra: %s" % (expected_ra_str[i], ra[i].strfcoord("%(h)02d %(m)02d %(s)04.1f"))

            assert expected_dec_str[i] == dec[i].strfcoord("%(d)02d %(m)02d %(s)02.0f"), \
                "dec: %s != coord dec: %s" % (expected_dec_str[i], dec[i].strfcoord("%(d)02d %(m)02d %(s)02.0f"))
示例#54
0
 def telegram_set_target(self, bot, update, args, job_queue, chat_data):
     if len(args) != 2:
         update.message.reply_text(
             "Usage: /set HH:MM:SS.S DD:MM:SS.S or /set ra dec (J2000)")
     else:
         self.last_update = datetime.datetime.now()
         ra = Coord.fromHMS(args[0]) if ":" in args[0] else Coord.fromD(
             float(args[0]))
         dec = Coord.fromDMS(args[1]) if ":" in args[1] else Coord.fromD(
             float(args[1]))
         self.target = Position.fromRaDec(ra, dec)
         site = self.getSite()
         lst = site.LST_inRads()
         alt = float(site.raDecToAltAz(self.target, lst).alt)
         # TODO: reject if alt< telescope_min_alt!
         moonPos = site.moonpos()
         moonRaDec = site.altAzToRaDec(moonPos, lst)
         moonDist = self.target.angsep(moonRaDec)
         update.message.reply_text(
             'Hello {} arg is {} {}. Object alt = {}, Moon dist = {}'.
             format(update.message.from_user.first_name, args[0], args[1],
                    alt, moonDist))
示例#55
0
    def setTargetAz(self, az):

        if not isinstance (az, Coord):
            az = Coord.fromDMS (az)

        if self['azimuth180Correct']:
            
            if az.toD() >= 180:
                az = az - Coord.fromD(180)
            else:
                az = az + Coord.fromD(180)

        self._write (":Sz%s#" % az.strfcoord("%(d)03d\xdf%(m)02d:%(s)02d", signed=False))

        ret = self._readbool()

        if not ret:
            raise MeadeException("Invalid Azimuth '%s'" % az.strfcoord("%(d)03d\xdf%(m)02d"))

        self._target_az = az

        return True
示例#56
0
文件: astelco.py 项目: agati/chimera
    def setTargetAz(self, az):  # converted to Astelco
        if not isinstance(az, Coord):
            az = Coord.fromDMS(az)

        if self['azimuth180Correct']:

            if az.toD() >= 180:
                az = az - Coord.fromD(180)
            else:
                az = az + Coord.fromD(180)

        cmdid = self._tpl.set('OBJECT.HORIZONTAL.AZ', az.D, wait=True)

        ret = self._tpl.succeeded(cmdid)

        if not ret:
            raise AstelcoException(
                "Invalid Azimuth '%s'" % az.strfcoord("%(d)03d\xdf%(m)02d"))

        self._target_az = az

        return True
示例#57
0
    def getAz(self):

        self._checkQuirk ()

        self.tty.setTimeout (10)

        cmd = "POSICAO?"

        self._write(cmd)

        ack = self._readline ()

        # check timeout
        if not ack:
            self.log.warning("Dome timeout, restarting it.")
            self._restartDome()
            return self.getAz()
            #raise IOError("Couldn't get azimuth after %d seconds." % 10)

        # uC is going crazy
        if ack == "INVALIDO":
            raise IOError("Error getting dome azimuth (ack=INVALIDO).")

        # get ack return
        if ack.startswith("CUPULA="):
            ack = ack[ack.find("=")+1:]

        if ack == "ERRO":
            self.log.warning("Dome position error, restarting it.")
            self._restartDome()
            return self.getAz()

        # correct dome/telescope phase difference
        az = int(math.ceil(int(ack)*self["az_resolution"]))
        az -= self._az_shift
        az = az % 360

        return Coord.fromDMS(az)
telescope_platescale = 50  # arcsec/mm

# 2 - Autoguider center
# For an SBIG ST7XME the parameters of the offset between the CCD and the guider are:
guider_offset = {'x': 0, 'y': 6.27}  # in mm
guider_size = {'x': 4.86, 'y': 3.66, 'x_px': 657, 'y_px': 495}  # in mm / px and pixels
guider_pixelsize = {'x': 0.0074, 'y': 0.0074}  # in mm
guider_pixelsize.update({'x_ang': telescope_platescale * guider_pixelsize['x'],  # in mm
                         'y_ang': telescope_platescale * guider_pixelsize['y']})  # in arcsec / px

# For plotting purposes
ccd_size = {'x': 6.89, 'y': 4.59}  # in mm
ccd_pixelsize = {'x': 0.009, 'y': 0.009}  # in mm

# Get a DSS Image...
ra = Coord.fromDMS("12 53 37.08")
dec = Coord.fromDMS("-60 21 22.7")
img = get_dss(ra, dec, 60, 60)
# fits.writeto('test.fits', img)
#img = fits.getdata('test.fits')
img = np.array(np.copy(img), dtype=np.float32)
# Image sizes in pixels
imsize = int(round(guider_size['x'] / guider_pixelsize['x'])), int(round(guider_size['y'] / guider_pixelsize['y']))
# img = imresize(img, imsize)
# Image sizes in arcmins
aux_width = guider_size['x'] * telescope_platescale / 60
aux_height = guider_size['y'] * telescope_platescale / 60

# TODO: DELME
img_scale = 60 / 35.3  # in arcsec / pix
imsize = img.shape[0], img.shape[1]
示例#59
0
    def getLong(self):
        self._write(":Gg#")
        ret = self._readline()
        ret = ret.replace('\xdf', ':')[:-1]

        return Coord.fromDMS(ret)
示例#60
0
                    ra = ra.toHMS()
                except ValueError:
                    raise ValueError(
                        "Invalid RA coordinate type %s. Expected numbers, strings or Coords." % str(type(ra)))

            Position._checkRange(float(ra), 0, 360)

        except ValueError, e:
            raise ValueError("Invalid RA coordinate %s" % str(ra))
        except PositionOutsideLimitsError:
            raise ValueError(
                "Invalid RA range %s. Must be between 0-24 hours or 0-360 deg." % str(ra))

        try:
            if type(dec) == StringType:
                dec = Coord.fromDMS(dec)
            elif isinstance(dec, Coord):
                dec = dec.toDMS()
            else:
                try:
                    dec = Coord.fromD(float(dec))
                    dec = dec.toDMS()
                except ValueError:
                    raise ValueError(
                        "Invalid DEC coordinate type %s. Expected numbers, strings or Coords." % str(type(dec)))

            Position._checkRange(float(dec), -90, 360)

        except ValueError, e:
            raise ValueError("Invalid DEC coordinate %s" % str(dec))
        except PositionOutsideLimitsError: