示例#1
0
    def syncWithTel(self):
        self.syncBegin()

        self.log.debug('[sync] Check if dome is in sync with telescope')

        if self.getMode() == Mode.Track:
            self.log.warning('Dome is in track mode... Slew is completely controled by AsTelOS...'
                             'Waiting for dome to reach expected position')

            start_time = time.time()

            tpl = self.getTPL()
            ref_altitude = Coord.fromD(0.)
            target_az = Coord.fromD(tpl.getobject('POSITION.INSTRUMENTAL.DOME[0].TARGETPOS'))
            target_position = Position.fromAltAz(ref_altitude,
                                                 target_az)
            while True:
                current_az = self.getAz()
                current_position = Position.fromAltAz(ref_altitude,
                                                      current_az)
                self.log.debug('Current az: %s | Target az: %s' % (current_az.toDMS(), target_az.toDMS()))
                if time.time() > (start_time + self._maxSlewTime):
                    if abs(target_position.angsep(current_position).D) < tpl.getobject(
                            'POINTING.SETUP.DOME.MAX_DEVIATION') * 4.0:
                        self.log.warning("[sync] Dome too far from target position!")
                        break
                    else:
                        self.syncComplete()
                        raise AstelcoDomeException("Dome synchronization timed-out")
                elif abs(target_position.angsep(current_position).D) < tpl.getobject(
                        'POINTING.SETUP.DOME.MAX_DEVIATION') * 2.0:
                    break

        self.syncComplete()
        self.log.debug('[sync] Dome in sync')
示例#2
0
    def _moveScope(self, tracking=False, pierSide=None):
        """
        Moves the scope, usually to zenith
        """
        tel = self._getTel()
        site = self._getSite()
        self.log.debug('Moving scope to alt %s az %s.' % (self["flat_alt"], self["flat_az"]))
        if tel.getPositionAltAz().angsep(
                Position.fromAltAz(Coord.fromD(self["flat_alt"]), Coord.fromD(self["flat_az"]))).D < self[
            "flat_position_max"]:

            self.log.debug(
                'Telescope is less than {} degrees from flat position. Not moving!'.format(self["flat_position_max"]))
            if tracking and not tel.isTracking():
                tel.startTracking()
            elif not tracking and tel.isTracking():
                tel.stopTracking()
            if pierSide is not None and tel.features(TelescopePier):
                self.log.debug("Setting telescope pier side to %s." % tel.getPierSide().__str__().lower())
                tel.setSideOfPier(self['pier_side'])

            return

        try:
            self.log.debug("Skyflat Slewing scope to alt {} az {}".format(self["flat_alt"], self["flat_az"]))
            tel.slewToRaDec(Position.altAzToRaDec(Position.fromAltAz(Coord.fromD(self["flat_alt"]),
                                                                     Coord.fromD(self["flat_az"])),
                                                  site['latitude'], site.LST()))
            if tracking:
                self._startTracking()
            else:
                self._stopTracking()
        except:
            self.log.debug("Error moving the telescope")
示例#3
0
    def slew(self):

        slewFunction = None
        target = None
        
        currentPage = self.module.view.slewOptions.get_current_page()

        if currentPage == 0:
            raHour = self.module.view.raHourSpin.get_value()
            raMinute = self.module.view.raMinuteSpin.get_value()
            raSec = self.module.view.raSecSpin.get_value()
        
            decDegree = self.module.view.decDegreeSpin.get_value()
            decMinute = self.module.view.decMinuteSpin.get_value()
            decSec = self.module.view.decSecSpin.get_value()
        
            ra = "%2d:%2d:%2d" %(raHour, raMinute, raSec)
            dec = "%2d:%2d:%2d" %(decDegree, decMinute, decSec)

            epochStr = str(self.module.view.epochCombo.child.get_text()).lower()

            if epochStr == "j2000":
                epoch = Epoch.J2000
            elif epochStr == "b1950":
                epoch = Epoch.B1950
            elif epochStr == "now":
                epoch = Epoch.Now
            else:
                # FIXME
                epoch = epochStr
        	
            target = Position.fromRaDec(ra, dec, epoch=epoch)
            slewFunction = self.telescope.slewToRaDec

        elif currentPage == 1:

            altDegree = self.module.view.altDegreeSpin.get_value()
            altMinute = self.module.view.altMinuteSpin.get_value()
            altSec = self.module.view.altSecSpin.get_value()
        
            azDegree = self.module.view.azDegreeSpin.get_value()
            azMinute = self.module.view.azMinuteSpin.get_value()
            azSec = self.module.view.azSecSpin.get_value()
            
            alt = "%2d:%2d:%2d" %(altDegree, altMinute, altSec)
            az = "%2d:%2d:%2d" %(azDegree, azMinute, azSec)
        
            target = Position.fromAltAz(alt, az)
            slewFunction = self.telescope.slewToAltAz

        elif currentPage == 2:
            target =  str(self.module.view.objectNameCombo.child.get_text())
            slewFunction = self.telescope.slewToObject
        
        self.module.view.slewBeginUi()
        
        try:
            slewFunction(target)
        except ObjectNotFoundException, e:
            self.module.view.showError("Object %s was not found on our catalogs." % target)
示例#4
0
    def slewToAltAz(self, position):

        if not isinstance(position, Position):
            position = Position.fromAltAz(*position)

        self.slewBegin(self._getSite().altAzToRaDec(position))

        alt_steps = position.alt - self.getAlt()
        alt_steps = float(alt_steps / 10.0)

        az_steps = position.az - self.getAz()
        az_steps = float(az_steps / 10.0)

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

        status = TelescopeStatus.OK
        t = 0
        while t < 5:

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

            self._alt += alt_steps
            self._az += az_steps
            self._setRaDecFromAltAz()

            time.sleep(0.5)
            t += 0.5

        self._slewing = False

        self.slewComplete(self.getPositionRaDec(), status)
示例#5
0
    def slewToAltAz(self, position):

        if not isinstance(position, Position):
            position = Position.fromAltAz(*position)

        self.slewBegin(self._getSite().altAzToRaDec(position))

        alt_steps = position.alt - self.getAlt()
        alt_steps = float(alt_steps/10.0)

        az_steps = position.az - self.getAz()
        az_steps = float(az_steps/10.0)

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

        status = TelescopeStatus.OK
        t = 0
        while t < 5:

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

            self._alt  += alt_steps
            self._az += az_steps
            self._setRaDecFromAltAz()
            
            time.sleep(0.5)
            t += 0.5
        
        self._slewing = False
            
        self.slewComplete(self.getPositionRaDec(), status)
示例#6
0
    def getTargetAltAz(self):
        drv = self.getDriver()

        ret = drv.getTargetAltAz()

        if not isinstance(ret, Position):
            ret = Position.fromAltAz(*ret)
        return ret
示例#7
0
class TelescopePark(Telescope):
    """Telescope with park/unpark support.
    """

    __config__ = {"default_park_position": Position.fromAltAz(90, 180)}

    def park(self):
        """Park the telescope on the actual saved park position
        (L{setParkPosition}) or on the default position if none
        setted.

        When parked, the telescope will not track objects and may be
        turned off (if the scope was able to).

        @return: Nothing.
        @rtype: None
        """

    def unpark(self):
        """Wake up the telescope of the last park operation.

        @return: Nothing.
        @rtype: None
        """

    def isParked(self):
        """Ask if the telescope is at park position.

        @return: True if the telescope is parked, False otherwise.
        @rtype: bool
        """

    def setParkPosition(self, position):
        """Defines where the scope will park when asked to.

        @param position: local coordinates to park the scope
        @type  position: L{Position}

        @return: Nothing.
        @rtype: None
        """

    def getParkPosition(self):
        """Get the Current park position.

        @return: Current park position.
        @rtype: L{Position}
        """

    @event
    def parkComplete(self):
        """Indicates that the scope has parked successfuly.
        """

    @event
    def unparkComplete(self):
        """Indicates that the scope has unparked (waked up)
示例#8
0
 def _moveScope(self):
     """
     Moves the scope, usually to zenith
     """
     tel = self._getTel()
     try:
         self.log.debug("Skyflat Slewing scope to zenith")
         tel.slewToAltAz(Position.fromAltAz(90, 270))
     except:
         self.log.debug("Error moving the telescope")
示例#9
0
    def slewToAltAz(self, position):
        # FIXME: validate limits?

        if not isinstance(position, Position):
            position = Position.fromAltAz(*position)

        drv = self.getDriver()

        try:
            drv.slewToAltAz(position)
        except Exception, e:
            self.log.exception("Apollo 13 is out of control!")
示例#10
0
    def chimera_handler(self, payload, root):
        t0 = time.time()
        # Check if it is a real GRB
        ra, dec = float(
            root.find(
                "./WhereWhen/ObsDataLocation/ObservationLocation/AstroCoords/Position2D/Value2/C1"
            ).text
        ), float(
            root.find(
                "./WhereWhen/ObsDataLocation/ObservationLocation/AstroCoords/Position2D/Value2/C2"
            ).text)
        packet_type = int(
            root.find("./What/Param[@name='Packet_Type']").attrib['value'])

        site = self.getSite()
        ephem_site = site.getEphemSite(site.ut())
        grb = ephem.FixedBody()
        grb._ra, grb._dec = ra, dec
        grb.compute(ephem_site)
        # Conditions to pull the observation trigger
        # TODO: implement min_moon_distance -> Position(coord.fromD(grb.alt), coord.fromD(grb.az)) - site.moonpos()
        # In[8]: a = Position.fromAltAz(Coord.fromD(10), Coord.fromD(10))
        #
        # In[9]: b = Position.fromAltAz(Coord.fromD(10), Coord.fromD(20))
        #
        # In[11]: a.angsep(b).D
        # Out[11]: 10.0
        moondist = Position.fromAltAz(Coord.fromD(float(grb.alt)),
                                      Coord.fromD(float(grb.az))).angsep(
                                          site.moonpos())
        if moondist > self['obs-min_moondist']:
            self.log.debug("Moon is OK! Moon distance = %.2f deg" % moondist)
        else:
            self.log.debug("Moon is NOT OK! Moon distance = %.2f deg" %
                           moondist)

        # TODO: check if Test_Notice != True (for INTEGRAL)
        if grb.alt >= self['obs-min_alt'] and packet_type in range(
                1000):  # self['obs-packets']:
            gal_coord = ephem.Galactic(grb)
            ebv = get_SFD_dust([gal_coord.long], [gal_coord.lat],
                               dustmap=self.dust_file,
                               interpolate=False)
            if ebv < self['obs-ebv_max']:
                self.log.debug('Total analysis time: %6.3f secs' %
                               (time.time() - t0))
                self.trigger_observation(ra, dec)
        else:
            self.log.debug(
                "Reject alert type %i. ALT = %.2f, RA = %.2f DEC = %.2f. Config: %d, %s"
                % (packet_type, grb.alt, ra, dec, self['obs-min_alt'],
                   str(self['obs-packets'])))
示例#11
0
 def test_altAzRaDec(self):
     
     altAz = Position.fromAltAz('20:30:40', '222:11:00')
     lat = Coord.fromD(0)
     o = ephem.Observer()
     o.lat = '0:0:0'
     o.long = '0:0:0'
     o.date = dt.now(tz.tzutc())
     lst = float(o.sidereal_time())
     raDec = Position.altAzToRaDec(altAz, lat, lst)
     
     altAz2 = Position.raDecToAltAz(raDec, lat, lst)
     assert equal(altAz.alt.toR(),altAz2.alt.toR()) & equal(altAz.az.toR(),altAz2.az.toR())
示例#12
0
 def test_altAzRaDec(self):
     
     altAz = Position.fromAltAz('20:30:40', '222:11:00')
     lat = Coord.fromD(0)
     o = ephem.Observer()
     o.lat = '0:0:0'
     o.long = '0:0:0'
     o.date = dt.now(tz.tzutc())
     lst = float(o.sidereal_time())
     raDec = Position.altAzToRaDec(altAz, lat, lst)
     
     altAz2 = Position.raDecToAltAz(raDec, lat, lst)
     assert equal(altAz.alt.toR(),altAz2.alt.toR()) & equal(altAz.az.toR(),altAz2.az.toR())
示例#13
0
 def _watchTrackingStopped(self, position, status):
     self.setFlag("telescope",InstrumentOperationFlag.READY)
     self.broadCast('Telescope tracking stopped with status %s.' % status)
     if status == TelescopeStatus.OBJECT_TOO_LOW:
         # Todo: Make this an action on the checklist database, so user can configure what to do
         robobs = self.getRobObs()
         sched = self.getSched()
         robobs.stop()
         sched.stop()
         tel = self.getTel()
         from chimera.util.position import Position
         from chimera.util.coord import Coord
         park_position = Position.fromAltAz(Coord.fromD(80),Coord.fromD(89))
         tel.slewToAltAz(park_position)
         robobs.reset_scheduler()
         robobs.start()
         robobs.wake()
示例#14
0
    def _moveScope(self, pierSide=None):
        """
        Moves the scope, usually to zenith
        """
        tel = self._getTel()

        if pierSide is not None and tel.features(TelescopePier):
            self.log.debug("Setting telescope pier side to %s." % tel.getPierSide().__str__().lower())
            tel.setSideOfPier(self['pier_side'])
        else:
            self.log.warning("Telescope does not support pier side.")

        try:
            self.log.debug("Slewing scope to alt {} az {}".format(self["flat_alt"], self["flat_az"]))

            tel.slewToAltAz(Position.fromAltAz(Coord.fromD(self["flat_alt"]),
                                               Coord.fromD(self["flat_az"])))
            if tel.isTracking():
                tel.stopTracking()

        except:
            self.log.debug("Error moving the telescope")
示例#15
0
import numpy as np
from chimera.util.coord import Coord
from chimera.util.position import Position

import chimera_lna


class DomeLookupTable(object):
    def __init__(self):
        self._table = np.loadtxt('%s/data/dome_model.csv' % os.path.dirname(chimera_lna.__file__), delimiter=',')
        self._coordinates = [[Position.fromAltAz(Coord.fromR(v[0]), Coord.fromR(v[1])), v[2]] for v in self._table]

    def get_tag_altaz(self, position, ret_distance=False):
        """
        Returns the nearest tag for a given position (AltAz).
        If ret_distance is `True`, returns distance from lookuptable value to the point.
        """
        argmin = np.argmin([v[0].angsep(position) for v in self._coordinates])
        if ret_distance:
            return int(self._coordinates[argmin][1]), self._coordinates[argmin][0].angsep(position)
        else:
            return int(self._coordinates[argmin][1])


if __name__ == '__main__':
    dl = DomeLookupTable()
    for c in [[25, 25], [88, 123], [25, 30]]:
        print 'alt, az, (tag, distance): ', c[0], c[1], dl.get_tag_altaz(Position.fromAltAz(c[0], c[1]),
                                                                         ret_distance=True)
示例#16
0
    def addObservation(self, target, obstime):

        session = Session()

        lineRe = re.compile(
            '(?P<coord>(?P<ra>[\d:-]+)\s+(?P<dec>\+?[\d:-]+)\s+(?P<epoch>[\dnowNOWJjBb\.]+)\s+)?(?P<imagetype>[\w]+)'
            '\s+(?P<objname>\'([^\\n\'\\\\]|\\\\.)*\'|"([^\\n"\\\\]|\\\\.)*"|([^ \\n"\\\\]|\\\\.)*)\s+(?P<exposures>[\w\d\s:\*\(\),]*)'
        )
        programs = []

        entryFormat = '%(ra)s %(dec)s %(epoch)s %(obstype)s %(name)s %(exposures)s'

        p = Position.fromRaDec(target.targetRa, target.targetDec)
        ra = p.ra.HMS
        dec = p.dec.DMS

        filterExpt = self.sciExpTime
        if target.type == self.stdFlag:
            filterExpt = self.stdExpTime

        exposures = '1*('

        for i in range(self.nfilters):
            exposures = exposures + '%s:%.0f, ' % (self.filters[i],
                                                   filterExpt[i])

        exposures = exposures[:-2]
        exposures += ')'

        infos = {
            'ra': '%02.0f:%02.0f:%02.0f' % (ra[1], ra[2], ra[3]),
            'dec': '%+03.0f:%02.0f:%02.0f' % (dec[0] * dec[1], dec[2], dec[3]),
            'epoch': 'J%.0f' % target.targetEpoch,
            'obstype': 'OBJECT',
            'name': target.name,
            'exposures': exposures
        }

        i = 0
        line = entryFormat % infos

        matchs = lineRe.search(line)
        params = matchs.groupdict()

        position = None
        objname = None

        if params.get("coord", None):
            position = Position.fromRaDec(str(params['ra']),
                                          str(params['dec']), params['epoch'])

        imagetype = params['imagetype'].upper()
        objname = params['objname'].replace("\"", "")

        multiplier, exps = params['exposures'].split("*")
        try:
            multiplier = int(multiplier)
        except ValueError:
            multiplier = 1

        exps = exps.replace("(", "").replace(")", "").strip().split(",")

        mjd = obstime - 2400000.5
        for i in range(multiplier):

            program = Program(tid=target.id,
                              name="%s-%03d" % (objname.replace(" ", ""), i),
                              slewAt=mjd,
                              exposeAt=mjd + 1. / 60. / 24.)

            log.info("# program: %s" % program.name)

            if imagetype == "OBJECT":
                if position:
                    program.actions.append(Point(targetRaDec=position))
                else:
                    program.actions.append(Point(targetName=objname))

            if imagetype == "FLAT":
                site = self._remoteManager.getProxy("/Site/0")
                flatPosition = Position.fromAltAz(site['flat_alt'],
                                                  site['flat_az'])
                program.actions.append(Point(targetAltAz=flatPosition))

            #if i == 0:
            #    program.actions.append(AutoFocus(start=1500, end=3000, step=250, filter="R", exptime=10))
            #    program.actions.append(PointVerify(here=True))

            for exp in exps:
                if exp.count(":") > 1:
                    filter, exptime, frames = exp.strip().split(":")
                else:
                    filter, exptime = exp.strip().split(":")
                    frames = 1

                if imagetype in ("OBJECT", "FLAT"):
                    shutter = "OPEN"
                else:
                    shutter = "CLOSE"

                if imagetype == "BIAS":
                    exptime = 0

                if imagetype in ("BIAS", "DARK"):
                    filter = None

                log.info("%s %s %s filter=%s exptime=%s frames=%s" %
                         (imagetype, objname, str(position), filter, exptime,
                          frames))

                program.actions.append(
                    Expose(shutter=shutter,
                           filename="%s-$DATE-$TIME" %
                           objname.replace(" ", ""),
                           filter=filter,
                           frames=frames,
                           exptime=exptime,
                           imageType=imagetype,
                           objectName=objname))
            log.info("")
            programs.append(program)

        session.add_all(programs)
        session.commit()
示例#17
0
 def getPositionAltAz(self):
     self._telescope.GetAzAlt()
     return Position.fromAltAz(Coord.fromD(self._telescope.dAlt), Coord.fromD(self._telescope.dAz))
    def moonpos(self, date=None):
        date = date or self.localtime()
        self._moon.compute(self._getEphem(date))

        return Position.fromAltAz(Coord.fromR(self._moon.alt),
                                  Coord.fromR(self._moon.az))
示例#19
0
 def getPositionAltAz(self):
     self._telescope.GetAzAlt()
     return Position.fromAltAz(Coord.fromD(self._telescope.dAlt),
                               Coord.fromD(self._telescope.dAz))
示例#20
0
 def _setRaDecFromAltAz(self):
     raDec = self._getSite().altAzToRaDec(
         Position.fromAltAz(self._alt, self._az))
     self._ra = raDec.ra
     self._dec = raDec.dec
示例#21
0
    def sunpos(self, date=None):
        date = date or self.ut()
        self._sun.compute(self._getEphem(date))

        return Position.fromAltAz(
            Coord.fromR(self._sun.alt), Coord.fromR(self._sun.az))
示例#22
0
    def slew(self):

        slewFunction = None
        target = None

        currentPage = self.module.view.slewOptions.get_current_page()

        if currentPage == 0:
            raHour = self.module.view.raHourSpin.get_value()
            raMinute = self.module.view.raMinuteSpin.get_value()
            raSec = self.module.view.raSecSpin.get_value()

            decDegree = self.module.view.decDegreeSpin.get_value()
            decMinute = self.module.view.decMinuteSpin.get_value()
            decSec = self.module.view.decSecSpin.get_value()

            ra = "%2d:%2d:%2d" % (raHour, raMinute, raSec)
            dec = "%2d:%2d:%2d" % (decDegree, decMinute, decSec)

            epochStr = str(
                self.module.view.epochCombo.child.get_text()).lower()

            if epochStr == "j2000":
                epoch = Epoch.J2000
            elif epochStr == "b1950":
                epoch = Epoch.B1950
            elif epochStr == "now":
                epoch = Epoch.Now
            else:
                # FIXME
                epoch = epochStr

            target = Position.fromRaDec(ra, dec, epoch=epoch)
            slewFunction = self.telescope.slewToRaDec

        elif currentPage == 1:

            altDegree = self.module.view.altDegreeSpin.get_value()
            altMinute = self.module.view.altMinuteSpin.get_value()
            altSec = self.module.view.altSecSpin.get_value()

            azDegree = self.module.view.azDegreeSpin.get_value()
            azMinute = self.module.view.azMinuteSpin.get_value()
            azSec = self.module.view.azSecSpin.get_value()

            alt = "%2d:%2d:%2d" % (altDegree, altMinute, altSec)
            az = "%2d:%2d:%2d" % (azDegree, azMinute, azSec)

            target = Position.fromAltAz(alt, az)
            slewFunction = self.telescope.slewToAltAz

        elif currentPage == 2:
            target = str(self.module.view.objectNameCombo.child.get_text())
            slewFunction = self.telescope.slewToObject

        self.module.view.slewBeginUi()

        try:
            slewFunction(target)
        except ObjectNotFoundException, e:
            self.module.view.showError(
                "Object %s was not found on our catalogs." % target)
示例#23
0
 def getPositionAltAz(self):
     return Position.fromAltAz(self._ascom.Altitude, self._ascom.Azimuth)
示例#24
0
    def start(self, options):

        filename = "$DATE-$TIME.fits"

        site = self.site

        dome = None
        try:
            dome = self.camera.getManager().getProxy("/Dome/0")
        except ObjectNotFoundException:
            pass

        @callback(self.localManager)
        def exposeBegin(request):
            global currentFrame, currentFrameExposeStart
            currentFrameExposeStart = time.time()
            currentFrame += 1
            self.out(40 * "=")
            self.out("[%03d/%03d] [%s]" %
                     (currentFrame, options.frames, time.strftime("%c")))
            self.out("exposing (%.3fs) ..." % request["exptime"], end="")

        @callback(self.localManager)
        def exposeComplete(request, status):
            global currentFrameExposeStart
            if status == CameraStatus.OK:
                self.out("OK (took %.3f s)" %
                         (time.time() - currentFrameExposeStart))

        @callback(self.localManager)
        def readoutBegin(request):
            global currentFrameReadoutStart
            currentFrameReadoutStart = time.time()
            self.out("reading out and saving ...", end="")

        @callback(self.localManager)
        def readoutComplete(image, status):
            global currentFrame, currentFrameExposeStart, currentFrameReadoutStart

            if status == CameraStatus.OK:
                self.out("OK (took %.3f s)" %
                         (time.time() - currentFrameExposeStart))

                self.out(" (%s) " % image.compressedFilename(), end="")
                self.out("OK (took %.3f s)" %
                         (time.time() - currentFrameReadoutStart))
                self.out("[%03d/%03d] took %.3fs" %
                         (currentFrame, options.frames,
                          time.time() - currentFrameExposeStart))

                if ds9:
                    ds9.set("scale mode 99.5")
                    ds9.displayImage(image)

                image.close()

        self.camera.exposeBegin += exposeBegin
        self.camera.exposeComplete += exposeComplete
        self.camera.readoutBegin += readoutBegin
        self.camera.readoutComplete += readoutComplete

        if dome:

            @callback(self.localManager)
            def syncBegin():
                self.out("=" * 40)
                self.out("synchronizing dome slit ...", end="")

            @callback(self.localManager)
            def syncComplete():
                self.out("OK")

            dome.syncBegin += syncBegin
            dome.syncComplete += syncComplete

        gridAlt = np.arange(options.minalt, options.maxalt, options.stepalt)
        gridAz = np.arange(options.minaz, options.maxaz, options.stepaz)

        global currentFrame

        for alt in gridAlt:
            for az in gridAz:
                altAz = Position.fromAltAz(Coord.fromD(alt), Coord.fromD(az))
                #self.out('alt/az: %s '%(altAz))
                radec = site.altAzToRaDec(altAz)
                self.out('alt/az: %s -> ra/dec: %s' % (altAz, radec))
                if options.dryrun:
                    continue

                self.telescope.slewToRaDec(radec)

                self.camera.expose(exptime=options.exptime,
                                   frames=1,
                                   interval=0.,
                                   filename=filename,
                                   type='OBJECT',
                                   binning=None,
                                   window=None,
                                   shutter='OPEN',
                                   compress=False,
                                   wait_dome=True,
                                   object_name='%s M2 Test Focus 0.0' % altAz)

                currentFrame = 0

                self.focuser.moveOut(options.stepfocus)

                self.camera.expose(exptime=options.exptime,
                                   frames=1,
                                   interval=0.,
                                   filename=filename,
                                   type='OBJECT',
                                   binning=None,
                                   window=None,
                                   shutter='OPEN',
                                   compress=False,
                                   wait_dome=True,
                                   object_name='%s M2 Test Focus +%i' %
                                   (altAz, options.stepfocus))

                currentFrame = 0

                self.focuser.moveIn(options.stepfocus * 2.)

                self.camera.expose(exptime=options.exptime,
                                   frames=1,
                                   interval=0.,
                                   filename=filename,
                                   type='OBJECT',
                                   binning=None,
                                   window=None,
                                   shutter='OPEN',
                                   compress=False,
                                   wait_dome=True,
                                   object_name='%s M2 Test Focus -%i' %
                                   (altAz, options.stepfocus))

                currentFrame = 0

                self.focuser.moveOut(options.stepfocus)
示例#25
0
 def getParkPosition(self):
     return Position.fromAltAz(self["park_position_alt"],
                               self["park_position_az"])
示例#26
0
    def test_az_alt(self):

        p = Position.fromAltAz("60", "200")
        assert p.dd() == (200, 60)

        assert_raises(ValueError, Position.fromAltAz, "xyz", "abc")
示例#27
0

# for i in range(len(map_points)):
#    print map_points[i]

if load_file is not None:
    skip_too_close = list()
    match_points = list()
    # points_save = list()
    load_model = fits.getdata(load_file)
    load_model = load_model
    for point_load in load_model:
        offset = 0
        for i in range(len(map_points)):
            map_point = map_points[i - offset]
            if Position.fromAltAz(Coord.fromD(point_load['ALT']), Coord.fromD(point_load['AZ'])).angsep(Position.fromAltAz(Coord.fromD(map_point[1]), Coord.fromD(map_point[0]))) < skip_degrees:
            # if np.sqrt((point_load['AZ'] - map_point[0]) ** 2 + (point_load['ALT'] - map_point[1]) ** 2) < 4:
                match_points.append([point_load['AZ'], point_load['ALT']])
                skip_too_close.append(map_point)
                map_points = np.delete(map_points, i - offset, axis=0)
                offset += 1
                continue
    skip_too_close = np.array(skip_too_close)
    match_points = np.array(match_points)

plot = True
# if False:
plt.clf()
ax = plt.subplot(111, projection='polar')
# plt.ion()
ax.set_theta_zero_location("N")
示例#28
0
文件: astelco.py 项目: agati/chimera
 def getParkPosition(self):  # no need to convert to Astelco
     return Position.fromAltAz(self["park_position_alt"],
                               self["park_position_az"])
示例#29
0
文件: astelco.py 项目: agati/chimera
 def getTargetAltAz(self):  # no need to convert to Astelco
     return Position.fromAltAz(self.getTargetAlt(), self.getTargetAz())
示例#30
0
    def test_alt_az (self):

        p = Position.fromAltAz("60", "200")
        assert p.dd() == (60, 200)

        assert_raises(ValueError, Position.fromAltAz, "xyz", "abc")        
示例#31
0
        def generateDatabase(options):

            with open(os.path.join(os.path.expanduser('~/'),
                    options.filename), 'r') as stream:
                try:
                    prgconfig = yaml.load(stream)
                except yaml.YAMLError as exc:

                    manager.broadCast(exc)
                    return -1

            session = Session()

            programs = []

            for prg in prgconfig['programs']:

                # process program

                program = Program()
                for key in prg.keys():
                    if hasattr(program,key) and key != 'actions':
                        try:
                            setattr(program,key,prg[key])
                        except:
                            manager.broadCast('Could not set attribute %s = %s on Program' % (key,prg[key]))

                # self.out("# program: %s" % program.name)

                # process actions
                for actconfig in prg['actions']:
                    act = actionDict[actconfig['action']]()
                    # self.out('Action: %s' % actconfig['action'])

                    if actconfig['action'] == 'point':
                        if 'ra' in actconfig.keys() and 'dec' in actconfig.keys():
                            epoch = 'J2000' if 'epoch' not in actconfig.keys() else actconfig['epoch']
                            position = Position.fromRaDec(actconfig['ra'], actconfig['dec'], epoch)
                            # self.out('Coords: %s' % position)
                            act.targetRaDec = position
                            # act = Point(targetRaDec=position)
                        elif 'alt' in actconfig.keys() and 'az' in actconfig.keys():
                            position = Position.fromAltAz(actconfig['alt'], actconfig['az'])
                            # self.out('Coords: %s' % position)
                            act.targetAltAz = position
                        else:
                            # self.out('Target name: %s' % actconfig['name'])
                            act.targetName = actconfig['name']

                    else:
                        for key in actconfig.keys():
                            if hasattr(act,key) and key != 'action':
                                # self.out('\t%s: %s' % (key,actconfig[key]))
                                try:
                                    setattr(act,key,actconfig[key])
                                except:
                                    manager.broadCast('Could not set attribute %s = %s on action %s' % (key,
                                                                                               actconfig[key],
                                                                                               actconfig['action']))
                    program.actions.append(act)

                # self.out("")
                programs.append(program)

            # self.out("List contain %i programs" % len(programs))
            session.add_all(programs)
            session.commit()

            return 0
示例#32
0
    def process(check):

        import yaml
        from chimera.util.position import Position
        from chimera.util.coord import Coord
        from chimera.controllers.scheduler.model import (Session, Program,
                                                         AutoFocus, AutoFlat,
                                                         PointVerify, Point,
                                                         Expose)

        actionDict = {
            'autofocus': AutoFocus,
            'autoflat': AutoFlat,
            'pointverify': PointVerify,
            'point': Point,
            'expose': Expose,
        }

        manager = BaseResponse.manager
        # sched = ConfigureScheduler.scheduler

        # delete all programs
        session = Session()
        programs = session.query(Program).all()
        for program in programs:
            session.delete(program)
        session.commit()

        def generateDatabase(options):

            with open(os.path.join(os.path.expanduser('~/'), options.filename),
                      'r') as stream:
                try:
                    prgconfig = yaml.load(stream)
                except yaml.YAMLError as exc:

                    manager.broadCast(exc)
                    raise
                except Exception, e:
                    manager.broadCast(
                        'Exception trying to start scheduler: %s' % repr(e))
                    raise

            def _validateOffset(value):
                try:
                    offset = Coord.fromAS(int(value))
                except ValueError:
                    offset = Coord.fromDMS(value)

                return offset

            session = Session()

            programs = []

            for prg in prgconfig['programs']:

                # process program

                program = Program()
                for key in prg.keys():
                    if hasattr(program, key) and key != 'actions':
                        try:
                            setattr(program, key, prg[key])
                        except:
                            manager.broadCast(
                                'Could not set attribute %s = %s on Program' %
                                (key, prg[key]))

                # self.out("# program: %s" % program.name)

                # process actions
                for actconfig in prg['actions']:
                    act = actionDict[actconfig['action']]()
                    # self.out('Action: %s' % actconfig['action'])

                    if actconfig['action'] == 'point':
                        if 'ra' in actconfig.keys(
                        ) and 'dec' in actconfig.keys():
                            epoch = 'J2000' if 'epoch' not in actconfig.keys(
                            ) else actconfig['epoch']
                            position = Position.fromRaDec(
                                actconfig['ra'], actconfig['dec'], epoch)
                            # self.out('Coords: %s' % position)
                            act.targetRaDec = position
                            # act = Point(targetRaDec=position)
                        elif 'alt' in actconfig.keys(
                        ) and 'az' in actconfig.keys():
                            position = Position.fromAltAz(
                                actconfig['alt'], actconfig['az'])
                            # self.out('Coords: %s' % position)
                            act.targetAltAz = position
                        elif 'name' in actconfig:
                            # self.out('Target name: %s' % actconfig['name'])
                            act.targetName = actconfig['name']
                        elif 'offset' not in actconfig:
                            manager.broadCast(
                                'Empty Point action. No target to point to or offset to perform!'
                            )
                            continue

                        if 'offset' in actconfig:
                            if 'north' in actconfig['offset']:
                                offset = _validateOffset(
                                    actconfig['offset']['north'])
                                act.offsetNS = offset
                            elif 'south' in actconfig['offset']:
                                offset = _validateOffset(
                                    actconfig['offset']['south'])
                                act.offsetNS = Coord.fromAS(-offset.AS)

                            if 'west' in actconfig['offset']:
                                offset = _validateOffset(
                                    actconfig['offset']['west'])
                                act.offsetEW = offset
                            elif 'east' in actconfig['offset']:
                                offset = _validateOffset(
                                    actconfig['offset']['east'])
                                act.offsetEW = Coord.fromAS(-offset.AS)

                    else:
                        for key in actconfig.keys():
                            if hasattr(act, key) and key != 'action':
                                # self.out('\t%s: %s' % (key,actconfig[key]))
                                try:
                                    setattr(act, key, actconfig[key])
                                except:
                                    manager.broadCast(
                                        'Could not set attribute %s = %s on action %s'
                                        % (key, actconfig[key],
                                           actconfig['action']))
                    program.actions.append(act)

                # self.out("")
                programs.append(program)

            # self.out("List contain %i programs" % len(programs))
            session.add_all(programs)
            session.commit()

            return 0
示例#33
0
 def getTargetAltAz(self):
     return Position.fromAltAz(self.getAlt(), self.getAz())
示例#34
0
文件: tao.py 项目: tribeiro/SMAPS
	def addObservation(self,target,obstime):
	
		session = Session()
		
		lineRe = re.compile('(?P<coord>(?P<ra>[\d:-]+)\s+(?P<dec>\+?[\d:-]+)\s+(?P<epoch>[\dnowNOWJjBb\.]+)\s+)?(?P<imagetype>[\w]+)'
                            '\s+(?P<objname>\'([^\\n\'\\\\]|\\\\.)*\'|"([^\\n"\\\\]|\\\\.)*"|([^ \\n"\\\\]|\\\\.)*)\s+(?P<exposures>[\w\d\s:\*\(\),]*)')
		programs = []
		
		entryFormat = '%(ra)s %(dec)s %(epoch)s %(obstype)s %(name)s %(exposures)s'
		
		p = Position.fromRaDec(target.targetRa,target.targetDec)
		ra = p.ra.HMS
		dec = p.dec.DMS
		
		filterExpt = self.sciExpTime
		if target.type == self.stdFlag:
			filterExpt = self.stdExpTime

		exposures = '1*('

		for i in range(self.nfilters):
			exposures = exposures+'%s:%.0f, '%(self.filters[i],filterExpt[i])

		exposures = exposures[:-2]
		exposures += ')'
		
		infos = {	'ra' : '%02.0f:%02.0f:%02.0f'%(ra[1],ra[2],ra[3]),
					'dec': '%+03.0f:%02.0f:%02.0f'%(dec[0]*dec[1],dec[2],dec[3]),
					'epoch' : 'J%.0f'%target.targetEpoch,
					'obstype' : 'OBJECT',
					'name' :target.name,
					'exposures' : exposures
					}

		i = 0
		line = entryFormat%infos
		
		matchs = lineRe.search(line)
		params = matchs.groupdict()
		
		position = None
		objname  = None

		if params.get("coord", None):
			position  = Position.fromRaDec(str(params['ra']), str(params['dec']), params['epoch'])

		imagetype = params['imagetype'].upper()
		objname   = params['objname'].replace("\"", "")

		multiplier, exps = params['exposures'].split("*")
		try:
			multiplier = int(multiplier)
		except ValueError:
			multiplier = 1

		exps = exps.replace("(", "").replace(")", "").strip().split(",")

		mjd = obstime - 2400000.5
		for i in range(multiplier):

			program = Program(tid = target.id ,name="%s-%03d" % (objname.replace(" ", ""), i),
                              slewAt=mjd,exposeAt=mjd+1./60./24.)

			self.log.info("# program: %s" % program.name)

			if imagetype == "OBJECT":
				if position:
					program.actions.append(Point(targetRaDec=position))
				else:
					program.actions.append(Point(targetName=objname))

			if imagetype == "FLAT":
				site = self._remoteManager.getProxy("/Site/0")
				flatPosition = Position.fromAltAz(site['flat_alt'], site['flat_az'])
				program.actions.append(Point(targetAltAz=flatPosition))

			#if i == 0:
			#    program.actions.append(AutoFocus(start=1500, end=3000, step=250, filter="R", exptime=10))
			#    program.actions.append(PointVerify(here=True))

			for exp in exps:
				if exp.count(":") > 1:
					filter, exptime, frames = exp.strip().split(":")
				else:
					filter, exptime = exp.strip().split(":")
					frames = 1

				if imagetype in ("OBJECT", "FLAT"):
					shutter = "OPEN"
				else:
					shutter = "CLOSE"

				if imagetype == "BIAS":
					exptime = 0

				if imagetype in ("BIAS", "DARK"):
					filter = None

				self.log.info("%s %s %s filter=%s exptime=%s frames=%s" % (imagetype, objname, str(position), filter, exptime, frames))

				program.actions.append(Expose(shutter=shutter,
											  filename="%s-$DATE-$TIME" % objname.replace(" ", ""),
											  filter=filter,
											  frames=frames,
											  exptime=exptime,
											  imageType=imagetype,
											  objectName=objname))
			self.log.info("")
			programs.append(program)

		session.add_all(programs)
		session.commit()
示例#35
0
 def _setRaDecFromAltAz(self):
     raDec = self._getSite().altAzToRaDec(
         Position.fromAltAz(self._alt, self._az))
     self._ra = raDec.ra
     self._dec = raDec.dec
示例#36
0
    def _watchStateChanged(self, newState, oldState):

        self._debuglog.debug("State changed %s -> %s..." %
                             (oldState, newState))
        if oldState == SchedState.IDLE and newState == SchedState.OFF:
            if self.rob_state == RobState.ON:
                self._debuglog.debug(
                    "Scheduler went from BUSY to OFF. Needs resheduling...")

                # if self._current_program is not None:
                #     self._debuglog.warning("Wait for last program to be updated")
                #     self._current_program_condition.acquire()
                #     self._current_program_condition.wait(30) # wait 10s most!
                #     self._current_program_condition.release()
                session = RSession()
                csession = model.Session()

                # cprog = model.Program(  name =  "CALIB",
                #                         pi = "Tiago Ribeiro",
                #                         priority = 1 )
                # cprog.actions.append(model.Expose(frames = 3,
                #                                   exptime = 10,
                #                                   imageType = "DARK",
                #                                   shutter = "CLOSE",
                #                                   filename = "dark-$DATE-$TIME"))
                # cprog.actions.append(model.Expose(frames = 1,
                #                                   exptime = 0,
                #                                   imageType = "DARK",
                #                                   shutter = "CLOSE",
                #                                   filename = "bias-$DATE-$TIME"))
                #
                # csession.add(cprog)
                # self._current_program = cprog
                # self._debuglog.debug("Added: %s" % cprog)
                program_info = self.reshedule()
                #
                if program_info is not None:
                    program = session.merge(program_info[0])
                    obs_block = session.merge(program_info[2])
                    self._debuglog.debug(
                        "Adding program %s to scheduler and starting." %
                        program)
                    cprogram = program.chimeraProgram()
                    for act in obs_block.actions:
                        cact = getattr(sys.modules[__name__],
                                       act.action_type).chimeraAction(act)
                        cprogram.actions.append(cact)
                    cprogram = csession.merge(cprogram)
                    csession.add(cprogram)
                    csession.commit()
                    program.finished = True
                    session.commit()
                    # sched = self.getSched()
                    self._current_program = program_info
                    self._no_program_on_queue = False
                    # sched.start()
                    # self._current_program_condition.release()
                    self._debuglog.debug("Done")
                elif self._no_program_on_queue:
                    self._debuglog.warning(
                        "No program on robobs queue, waiting for 5 min.")
                    time.sleep(300)
                else:
                    self._debuglog.warning(
                        "No program on robobs queue. Sending telescope to park position."
                    )
                    # ToDo: Run an action from the database to send telescope to park position.
                    cprog = model.Program(name="SAFETY",
                                          pi="ROBOBS",
                                          priority=1)
                    to_park_position = model.Point()
                    to_park_position.targetAltAz = Position.fromAltAz(
                        Coord.fromD(88.), Coord.fromD(89.))
                    cprog.actions.append(to_park_position)

                    csession.add(cprog)
                    self._no_program_on_queue = True
                    # self.stop()

                csession.commit()
                session.commit()
                # for i in range(10):
                #     self.log.debug('Waiting %i/10' % i)
                #     time.sleep(1.0)
                # sched = self.getSched()
                # sched.start()
                self.wake()
                self._debuglog.debug("Done")
            else:
                self._debuglog.debug("Current state is off. Won't respond.")
示例#37
0
# raw_input('Center the telescope on the dome slit and press ENTER to start recording...')

# model_file = open('dome_model.csv', 'w')
#
# model_file.write('Latitude, %s\n' % site["latitude"].R)
#
# model_file.write('Dome Azm, Scope Ha, Scope Dec, Pier Side\n')
i = 1

try:
    # for az, alt in [(ii, jj) for ii in np.arange(15, 360, 10) for jj in np.arange(25, 90, 20)]:
    while sheet.cell(i, 1).value != '':
        if sheet.cell(i, 9).value == '':
            az, alt = float(sheet.cell(i, 1).value), float(sheet.cell(i, 2).value)
            print '@> alt, az', alt, az
            telescope.slewToAltAz(Position.fromAltAz(Coord.fromD(alt), Coord.fromD(az)))
            etiqueta = raw_input('Etiqueta: ')
            alt, az, ra, dec = telescope.getAlt().R, telescope.getAz().R, telescope.getRa().R, telescope.getDec().R
            lst = site.LST()
            ha = CoordUtil.raToHa(ra, lst).R
            j = 3
            for val in (alt, az, ha, ra, dec, lst, etiqueta, str(datetime.datetime.now())):
                sheet.update_cell(i, j, val) #model_file.write('%f,%f,%f,pierWest\n' % (az, ha, dec))
                j += 1
            # i += 1
            # raw_input('Move the telescope, re-center, and press ENTER to grab. CRTL+C to finish.')
        i += 1
except KeyboardInterrupt:
    # model_file.close()
    print '\nDone'
示例#38
0
 def getTargetAltAz(self):
     return Position.fromAltAz(self.getAlt(), self.getAz())
示例#39
0
        # Azimuth is N (0), E (90), S (180), W (270) in both hemispheres
        # However x and y are different in the hemispheres so we fix that here

        zeta = atan2(x, y)
        if (zeta > - 2. * pi) and (zeta < 2. * pi):
            if self.site_latitude.R <= 0.:
                zeta += pi
        else:
            zeta = telaz

        if zeta < 0:
            zeta = zeta + 2 * pi
        elif zeta > 2 * pi:
            zeta - 2 * pi

        return zeta * 180 / pi


if __name__ == '__main__':
    import numpy as np

    dome_radius, mount_dec_height, mount_dec_length, mount_dec_offset = 147, 0, 49.2, 0
    site = Site()
    Model = AzimuthModel(site['latitude'], dome_radius, mount_dec_height, mount_dec_length, mount_dec_offset)
    # for dra in np.arange(10, 200, 36):
    #     for ddec in np.arange(1, 360, 10):
    for az, alt in [(ii, jj) for ii in np.arange(5, 360, 10) for jj in np.arange(25, 90, 20)]:
        tel_pos = Position.altAzToRaDec(Position.fromAltAz(Coord.fromD(alt), Coord.fromD(az)), site['latitude'], site.LST())
        model = Model.solve_dome_azimuth(tel_pos, site.LST_inRads())
        print 'here', alt, az, model, model - az
示例#40
0
文件: site.py 项目: agati/chimera
    def moonpos(self, date=None):
        date = date or self.localtime()
        self._moon.compute(self._getEphem(date))

        return Position.fromAltAz(
            Coord.fromR(self._moon.alt), Coord.fromR(self._moon.az))
示例#41
0
    def sunpos(self, date=None):
        date = date or self.ut()
        self._sun.compute(self._getEphem(date))

        return Position.fromAltAz(Coord.fromR(self._sun.alt),
                                  Coord.fromR(self._sun.az))
示例#42
0
             "Cannot open telescope cover due to manager constraints."
         )
         raise TelescopeActionException(
             "Cannot open telescope cover due to manager constraints."
         )
 elif check.mode == 3:
     try:
         manager.broadCast("Closing telescope cover...")
         tel.closeCover()
     except Exception, e:
         manager.broadCast(e)
         raise
 elif check.mode == 5:
     from chimera.util.position import Position
     alt, az = str(check).parameter.split(",")
     target = Position.fromAltAz(alt, az)
     manager.broadCast("Slewing telescope to alt/az %s" % target)
     tel.slewToAltAz(target)
 elif check.mode == 6:
     from chimera.util.position import Position
     ra, dec = check.parameter.split(",")
     target = Position.fromRaDec(ra, dec)
     manager.broadCast("Slewing telescope to ra/dec %s" % target)
     tel.slewToRaDec(target)
 elif check.mode == 7:
     manager.broadCast("Stopping telescope tracking")
     tel.stopTracking()
 elif check.mode == 8:
     # switch fan on
     try:
         if ',' in str(check.parameter):
示例#43
0
 def getParkPosition (self):
     return Position.fromAltAz(self["park_position_alt"],
                               self["park_position_az"])
示例#44
0
    def slewToAz(self, az):
        # Astelco Dome will only enable slew if it is not tracking
        # If told to slew I will check if the dome is syncronized with
        # with the telescope. If it is not it¡ will wait until it gets
        # in sync or timeout...

        if self.getMode() == Mode.Track:
            raise AstelcoDomeException('Dome is in track mode... Slew is completely controled by AsTelOS...')
            # self.log.warning('Dome is in track mode... Slew is completely controled by AsTelOS...')
            # self.slewBegin(az)
            #
            # start_time = time.time()
            # self._abort.clear()
            # self._slewing = True
            # caz = self.getAz()
            #
            # while self.isSlewing():
            #     # time.sleep(1.0)
            #     if time.time() > (start_time + self._maxSlewTime):
            #         self.log.warning('Dome syncronization timed-out...')
            #         self.slewComplete(self.getAz(), DomeStatus.TIMEOUT)
            #         return 0
            #     elif self._abort.isSet():
            #         self._slewing = False
            #         self.slewComplete(self.getAz(), DomeStatus.ABORTED)
            #         return 0
            #     elif abs(caz - self.getAz()) < 1e-6:
            #         self._slewing = False
            #         self.slewComplete(self.getAz(), DomeStatus.OK)
            #         return 0
            #     else:
            #         caz = self.getAz()
            #
            # self.slewComplete(self.getAz(), DomeStatus.OK)
        else:
            self.log.info('Slewing to %f...' % az)

            start_time = time.time()
            self._abort.clear()
            self._slewing = True
            current_az = self.getAz()

            tpl = self.getTPL()

            self.slewBegin(az)
            cmdid = tpl.set('POSITION.INSTRUMENTAL.DOME[0].TARGETPOS', '%f' % az)
            reference_alt = Coord.fromD(0.)
            desired_position = Position.fromAltAz(reference_alt,
                                                  az)
            # Wait for command to be completed
            cmd = tpl.getCmd(cmdid)
            while not cmd.complete:
                if time.time() > (start_time + self._maxSlewTime):
                    self.log.warning('Dome syncronization timed-out...')
                    self.slewComplete(self.getAz(), DomeStatus.ABORTED)
                    return 0
                cmd = tpl.getCmd(cmdid)

            # time.sleep(self['stabilization_time'])
            # Wait dome arrive on desired position

            while True:

                current_position = Position.fromAltAz(reference_alt,
                                                      current_az)
                if time.time() > (start_time + self._maxSlewTime):
                    self.slewComplete(self.getAz(), DomeStatus.ABORTED)
                    raise AstelcoDomeException('Dome syncronization timed-out...')
                elif self._abort.isSet():
                    self._slewing = False
                    tpl.set('POSITION.INSTRUMENTAL.DOME[0].TARGETPOS', current_az)
                    self.slewComplete(self.getAz(), DomeStatus.ABORTED)
                    return 0
                elif abs(current_position.angsep(desired_position)) < tpl.getobject(
                        'POINTING.SETUP.DOME.MAX_DEVIATION') * 2.0:
                    self._slewing = False
                    self.slewComplete(self.getAz(), DomeStatus.OK)
                    return 0
                else:
                    current_az = self.getAz()

            self.slewComplete(self.getAz(), DomeStatus.OK)
示例#45
0
    def start(self, options):

        filename = "$DATE-$TIME.fits"

        site = self.site

        dome = None
        try:
            dome = self.camera.getManager().getProxy("/Dome/0")
        except ObjectNotFoundException:
            pass

        @callback(self.localManager)
        def exposeBegin(request):
            global currentFrame, currentFrameExposeStart
            currentFrameExposeStart = time.time()
            currentFrame += 1
            self.out(40 * "=")
            self.out("[%03d/%03d] [%s]" %
                     (currentFrame, options.frames, time.strftime("%c")))
            self.out("exposing (%.3fs) ..." % request["exptime"], end="")

        @callback(self.localManager)
        def exposeComplete(request, status):
            global currentFrameExposeStart
            if status == CameraStatus.OK:
                self.out("OK (took %.3f s)" %
                         (time.time() - currentFrameExposeStart))

        @callback(self.localManager)
        def readoutBegin(request):
            global currentFrameReadoutStart
            currentFrameReadoutStart = time.time()
            self.out("reading out and saving ...", end="")

        @callback(self.localManager)
        def readoutComplete(image, status):
            global currentFrame, currentFrameExposeStart, currentFrameReadoutStart

            if status == CameraStatus.OK:
                self.out("OK (took %.3f s)" %
                         (time.time() - currentFrameExposeStart))

                self.out(" (%s) " % image.compressedFilename(), end="")
                self.out("OK (took %.3f s)" %
                         (time.time() - currentFrameReadoutStart))
                self.out("[%03d/%03d] took %.3fs" % (currentFrame, options.frames,
                                                     time.time() - currentFrameExposeStart))

                if ds9:
                    ds9.set("scale mode 99.5")
                    ds9.displayImage(image)

                image.close()

        self.camera.exposeBegin += exposeBegin
        self.camera.exposeComplete += exposeComplete
        self.camera.readoutBegin += readoutBegin
        self.camera.readoutComplete += readoutComplete

        if dome:
            @callback(self.localManager)
            def syncBegin():
                self.out("=" * 40)
                self.out("synchronizing dome slit ...", end="")

            @callback(self.localManager)
            def syncComplete():
                self.out("OK")

            dome.syncBegin += syncBegin
            dome.syncComplete += syncComplete

        gridAlt = np.arange(options.minalt,options.maxalt,options.stepalt)
        gridAz  = np.arange(options.minaz,options.maxaz,options.stepaz)

        global currentFrame

        for alt in gridAlt:
            for az in gridAz:
                altAz = Position.fromAltAz(Coord.fromD(alt),
                                           Coord.fromD(az))
                #self.out('alt/az: %s '%(altAz))
                radec = site.altAzToRaDec(altAz)
                self.out('alt/az: %s -> ra/dec: %s'%(altAz,radec))
                if options.dryrun:
                    continue

                self.telescope.slewToRaDec(radec)

                self.camera.expose(exptime=options.exptime,
                                      frames=1,
                                      interval=0.,
                                      filename=filename,
                                      type='OBJECT',
                                      binning=None,
                                      window=None,
                                      shutter='OPEN',
                                      compress=False,
                                      wait_dome=True,
                                      object_name='%s M2 Test Focus 0.0'%altAz)

                currentFrame = 0

                self.focuser.moveOut(options.stepfocus)

                self.camera.expose(exptime=options.exptime,
                                      frames=1,
                                      interval=0.,
                                      filename=filename,
                                      type='OBJECT',
                                      binning=None,
                                      window=None,
                                      shutter='OPEN',
                                      compress=False,
                                      wait_dome=True,
                                      object_name='%s M2 Test Focus +%i'%(altAz,options.stepfocus))

                currentFrame = 0

                self.focuser.moveIn(options.stepfocus*2.)

                self.camera.expose(exptime=options.exptime,
                                      frames=1,
                                      interval=0.,
                                      filename=filename,
                                      type='OBJECT',
                                      binning=None,
                                      window=None,
                                      shutter='OPEN',
                                      compress=False,
                                      wait_dome=True,
                                      object_name='%s M2 Test Focus -%i'%(altAz,options.stepfocus))

                currentFrame = 0

                self.focuser.moveOut(options.stepfocus)
示例#46
0
        if (zeta > -2. * pi) and (zeta < 2. * pi):
            if self.site_latitude.R <= 0.:
                zeta += pi
        else:
            zeta = telaz

        if zeta < 0:
            zeta = zeta + 2 * pi
        elif zeta > 2 * pi:
            zeta - 2 * pi

        return zeta * 180 / pi


if __name__ == '__main__':
    import numpy as np

    dome_radius, mount_dec_height, mount_dec_length, mount_dec_offset = 147, 0, 49.2, 0
    site = Site()
    Model = AzimuthModel(site['latitude'], dome_radius, mount_dec_height,
                         mount_dec_length, mount_dec_offset)
    # for dra in np.arange(10, 200, 36):
    #     for ddec in np.arange(1, 360, 10):
    for az, alt in [(ii, jj) for ii in np.arange(5, 360, 10)
                    for jj in np.arange(25, 90, 20)]:
        tel_pos = Position.altAzToRaDec(
            Position.fromAltAz(Coord.fromD(alt), Coord.fromD(az)),
            site['latitude'], site.LST())
        model = Model.solve_dome_azimuth(tel_pos, site.LST_inRads())
        print 'here', alt, az, model, model - az
示例#47
0
 def __init__(self):
     self._table = np.loadtxt('%s/data/dome_model.csv' % os.path.dirname(chimera_lna.__file__), delimiter=',')
     self._coordinates = [[Position.fromAltAz(Coord.fromR(v[0]), Coord.fromR(v[1])), v[2]] for v in self._table]