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')
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")
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)
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)
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)
def getTargetAltAz(self): drv = self.getDriver() ret = drv.getTargetAltAz() if not isinstance(ret, Position): ret = Position.fromAltAz(*ret) return ret
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)
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")
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!")
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'])))
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())
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())
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()
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")
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)
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()
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))
def getPositionAltAz(self): self._telescope.GetAzAlt() return Position.fromAltAz(Coord.fromD(self._telescope.dAlt), Coord.fromD(self._telescope.dAz))
def _setRaDecFromAltAz(self): raDec = self._getSite().altAzToRaDec( Position.fromAltAz(self._alt, self._az)) self._ra = raDec.ra self._dec = raDec.dec
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))
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)
def getPositionAltAz(self): return Position.fromAltAz(self._ascom.Altitude, self._ascom.Azimuth)
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)
def getParkPosition(self): return Position.fromAltAz(self["park_position_alt"], self["park_position_az"])
def test_az_alt(self): p = Position.fromAltAz("60", "200") assert p.dd() == (200, 60) assert_raises(ValueError, Position.fromAltAz, "xyz", "abc")
# 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")
def getParkPosition(self): # no need to convert to Astelco return Position.fromAltAz(self["park_position_alt"], self["park_position_az"])
def getTargetAltAz(self): # no need to convert to Astelco return Position.fromAltAz(self.getTargetAlt(), self.getTargetAz())
def test_alt_az (self): p = Position.fromAltAz("60", "200") assert p.dd() == (60, 200) assert_raises(ValueError, Position.fromAltAz, "xyz", "abc")
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
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
def getTargetAltAz(self): return Position.fromAltAz(self.getAlt(), self.getAz())
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()
def _setRaDecFromAltAz(self): raDec = self._getSite().altAzToRaDec( Position.fromAltAz(self._alt, self._az)) self._ra = raDec.ra self._dec = raDec.dec
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.")
# 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'
def getTargetAltAz(self): return Position.fromAltAz(self.getAlt(), self.getAz())
# 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
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))
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))
"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):
def getParkPosition (self): return Position.fromAltAz(self["park_position_alt"], self["park_position_az"])
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)
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)
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
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]