Skip to content

Commit

Permalink
Merge pull request #170 from wschoenell/scheduler_review
Browse files Browse the repository at this point in the history
Accepted scheduler review to follow the review being done on `chimera-robobs` plugin.
  • Loading branch information
wschoenell committed Jun 27, 2018
2 parents 10d64e5 + 0dd9bc9 commit 736e7d6
Show file tree
Hide file tree
Showing 8 changed files with 144 additions and 84 deletions.
1 change: 1 addition & 0 deletions src/chimera/controllers/scheduler/circular.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ def next (self):
program.finished = False

session.commit()
session.close()

self.reschedule(self.machine)

Expand Down
37 changes: 32 additions & 5 deletions src/chimera/controllers/scheduler/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@ def process(action):
else:
telescope.moveEast(-action.offsetEW.AS)

# If dome azimuth is given, point there.
if action.domeTracking is not None:
if action.domeTracking:
dome.track()
else:
dome.stand()
if action.domeAz is not None:
dome.slewToAz(action.domeAz)

except Exception, e:
raise ProgramExecutionException(str(e))

Expand Down Expand Up @@ -90,8 +99,16 @@ def log(action):
return "slewing telescope to (alt az) %s%s" % (action.targetAltAz, offset)
elif action.targetName is not None:
return "slewing telescope to (object) %s%s" % (action.targetName, offset)
else:
elif offset != '':
return "applying telescope%s" % offset
else:
if action.domeTracking is None:
tracking = "left AS IS"
elif action.domeTracking:
tracking = "STARTED"
else:
tracking = "STOPPED"
return "dome tracking %s" % tracking

class ExposeHandler(ActionHandler):

Expand All @@ -115,18 +132,22 @@ def process(action):
object_name=str(action.objectName),
window=action.window,
binning=action.binning,
wait_dome=True,
wait_dome=action.wait_dome,
compress_format=action.compress_format)

ir.headers += [("PROGRAM", str(action.program.name), "Program Name"),
("PROG_PI", str(action.program.pi), "Principal Investigator")]

try:
camera.expose(ir)
images = camera.expose(ir)
except Exception, e:
printException(e)
raise ProgramExecutionException("Error while exposing")

# Close image files after exposing... See issue #160 for more details...
for img in images:
img.close()

@staticmethod
def abort(action):
camera = copy.copy(ExposeHandler.camera)
Expand Down Expand Up @@ -160,7 +181,8 @@ def process(action):

@staticmethod
def abort(action):
pass
autofocus = copy.copy(AutoFocusHandler.autofocus)
autofocus.abort()

class AutoFlatHandler(ActionHandler):

Expand All @@ -169,8 +191,13 @@ class AutoFlatHandler(ActionHandler):
def process(action):
autoflat = AutoFlatHandler.autoflat

if action.binning is None:
request = {"binning": "1x1"}
else:
request = {"binning": action.binning}

try:
autoflat.getFlats(action.filter, n_flats=action.frames)
autoflat.getFlats(action.filter, n_flats=action.frames, request=request)
except Exception, e:
printException(e)
raise ProgramExecutionException("Error trying to take flats")
Expand Down
18 changes: 11 additions & 7 deletions src/chimera/controllers/scheduler/machine.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,7 @@ def run(self):

if program:
log.debug("[idle] there is something to do, processing...")
log.debug("[idle] program slew start %s",program.slewAt)
log.debug("[idle] program exposure start %s",program.exposeAt)
log.debug("[idle] program slew start %s",program.startAt)
self.state(State.BUSY)
self.currentProgram = program
self._process(program)
Expand Down Expand Up @@ -133,18 +132,23 @@ def process ():
site=Site()
nowmjd=site.MJD()
log.debug("[start] Current MJD is %f",nowmjd)
if program.slewAt:
waittime=(program.slewAt-nowmjd)*86.4e3
if program.startAt:
waittime=(program.startAt-nowmjd)*86.4e3
if waittime>0.0:
log.debug("[start] Waiting until MJD %f to start slewing",program.slewAt)
log.debug("[start] Waiting until MJD %f to start slewing",program.startAt)
log.debug("[start] Will wait for %f seconds",waittime)
time.sleep(waittime)
else:
log.debug("[start] Specified slew start MJD %s has already passed; proceeding without waiting",program.slewAt)
if program.validFor >= 0.0:
if -waittime > program.validFor:
log.debug("[start] Program is not valid anymore", program.startAt, program.validFor)
self.controller.programComplete(program, SchedulerStatus.OK, "Program not valid anymore.")
else:
log.debug("[start] Specified slew start MJD %s has already passed; proceeding without waiting",program.startAt)
else:
log.debug("[start] No slew time specified, so no waiting")
log.debug("[start] Current MJD is %f",site.MJD())
log.debug("[start] Proceeding since MJD %f should have passed",program.slewAt)
log.debug("[start] Proceeding since MJD %f should have passed",program.startAt)
self.controller.programBegin(program)

try:
Expand Down
36 changes: 22 additions & 14 deletions src/chimera/controllers/scheduler/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ class Targets(Base):
__tablename__ = "targets"

id = Column(Integer, primary_key=True)
name = Column(String, default="Program")
type = Column(String, default=None)
name = Column(String, default="Program")
type = Column(String, default=None)
lastObservation = Column(DateTime, default=None)
observed = Column(Boolean, default=False)
scheduled = Column(Boolean, default=False)
Expand Down Expand Up @@ -48,9 +48,9 @@ class Program(Base):

createdAt = Column(DateTime, default=dt.datetime.today())
finished = Column(Boolean, default=False)
slewAt = Column(Float, default=0.0)
exposeAt = Column(Float, default=0.0)
startAt = Column(Float, default=0.0)
validFor = Column(Float, default=-1)

actions = relation("Action", backref=backref("program", order_by="Action.id"),
cascade="all, delete, delete-orphan")

Expand All @@ -67,7 +67,7 @@ class Action(Base):

__tablename__ = "action"
__mapper_args__ = {'polymorphic_on': action_type}

class AutoFocus(Action):
__tablename__ = "action_focus"
__mapper_args__ = {'polymorphic_identity': 'AutoFocus'}
Expand All @@ -91,14 +91,18 @@ class AutoFlat(Action):
id = Column(Integer, ForeignKey('action.id'), primary_key=True)
filter = Column(String, default=None)
frames = Column(Integer, default=1)
binning = Column(String, default=None)

def __str__(self):
return "Flat fields: filter=%s frames=%d" % (self.filter, self.frames)

class PointVerify(Action):
__tablename__ = "action_pv"
__mapper_args__ = {'polymorphic_identity': 'PointVerify'}

id = Column(Integer, ForeignKey('action.id'), primary_key=True)
here = Column(Boolean, default=None)
choose = Column(Boolean, default=None)
choose = Column(Boolean, default=None)

def __str__ (self):
if self.choose is True:
Expand All @@ -113,6 +117,8 @@ class Point(Action):
id = Column(Integer, ForeignKey('action.id'), primary_key=True)
targetRaDec = Column(PickleType, default=None)
targetAltAz = Column(PickleType, default=None)
domeAz = Column(PickleType, default=None) # dome azimuth (can be any azimuth when taking flats)
domeTracking = Column(PickleType, default=None) # set dome tracking ON/OFF. Default: leave as is.
offsetNS = Column(PickleType, default=None) # offset North (>0)/South (<0)
offsetEW = Column(PickleType, default=None) # offset West (>0)/East (<0)
targetName = Column(String, default=None)
Expand All @@ -136,23 +142,25 @@ def __str__ (self):
return offset
else:
return 'No target to point to.'

class Expose(Action):
__tablename__ = "action_expose"
__mapper_args__ = {'polymorphic_identity': 'Expose'}

id = Column(Integer, ForeignKey('action.id'), primary_key=True)
filter = Column(String, default=None)
frames = Column(Integer, default=1)

exptime = Column(Integer, default=5)

binning = Column(Integer, default=None)
window = Column(Float, default=None)
binning = Column(String, default=None)
window = Column(String, default=None)

shutter = Column(String, default="OPEN")

imageType = Column(String, default="")

wait_dome = Column(Boolean, default=True)

imageType = Column(String, default="")
filename = Column(String, default="$DATE-$TIME")
objectName = Column(String, default="")

Expand All @@ -162,7 +170,7 @@ def __str__ (self):
return "expose: exptime=%d frames=%d type=%s" % (self.exptime, self.frames, self.imageType)

###

#metaData.drop_all(engine)
metaData.create_all(engine)

2 changes: 1 addition & 1 deletion src/chimera/controllers/scheduler/status.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from chimera.util.enum import Enum

SchedulerStatus = Enum("OK", "ABORTED", "ERROR")
SchedulerStatus = Enum("OK", "ABORTED", "ERROR", "SKIPPED")

2 changes: 1 addition & 1 deletion src/chimera/core/site.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
def datetimeFromJD(jd):
"""Returns a date corresponding to the given Julian day number."""
if not isinstance(jd, float):
raise TypeError, "%s is not an integer." % str(jd)
raise TypeError, "%s is not a float." % str(jd)

n = int(np.floor(jd))
if jd > np.floor(jd) + 0.5:
Expand Down
8 changes: 4 additions & 4 deletions src/chimera/instruments/telescope.py
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ def getMetadata(self, request):
return md
# If not, just go on with the instrument's default metadata.
position = self.getPositionRaDec()
alt = self.getAlt()
return [('TELESCOP', self['model'], 'Telescope Model'),
('OPTICS', self['optics'], 'Telescope Optics Type'),
('MOUNT', self['mount'], 'Telescope Mount Type'),
Expand All @@ -211,10 +212,9 @@ def getMetadata(self, request):
('RA', position.ra.toHMS().__str__(), 'Right ascension of the observed object'),
('DEC', position.dec.toDMS().__str__(), 'Declination of the observed object'),
("EQUINOX", position.epochString()[1:], "coordinate epoch"),
('ALT', self.getAlt().toDMS().__str__(),
'Altitude of the observed object'),
('AZ', self.getAz().toDMS().__str__(),
'Azimuth of the observed object'),
('ALT', alt.toDMS().__str__(), 'Altitude of the observed object'),
('AZ', self.getAz().toDMS().__str__(), 'Azimuth of the observed object'),
('AIRMASS', alt.R, 'Airmass of the observed object'),
("WCSAXES", 2, "wcs dimensionality"),
("RADESYS", "ICRS", "frame of reference"),
("CRVAL1", position.ra.D,
Expand Down

0 comments on commit 736e7d6

Please sign in to comment.