Skip to content

Commit

Permalink
Allow re-observing completed tiles at very low priority.
Browse files Browse the repository at this point in the history
  • Loading branch information
schlafly committed Jan 21, 2021
1 parent 83fa4f2 commit 415c622
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 11 deletions.
30 changes: 22 additions & 8 deletions py/desisurvey/rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,22 @@ class Rules(object):
def __init__(self, file_name='rules.yaml'):
self.log = desiutil.log.get_logger()
config = desisurvey.config.Configuration()
commissioning = getattr(config, 'commissioning', False)
if not isinstance(commissioning, bool):
commissioning = commissioning()
self.commissioning = commissioning
self.min_snr2_fraction = config.min_snr2_fraction()
finish_started_priority = getattr(config, 'finish_started_priority', 0)
import numbers
if not isinstance(finish_started_priority, numbers.Number):
finish_started_priority = finish_started_priority()
self.finish_started_priority = finish_started_priority
ignore_completed_priority = getattr(config,
'ignore_completed_priority', -1)
if not isinstance(ignore_completed_priority, numbers.Number):
ignore_completed_priority = ignore_completed_priority()
self.ignore_completed_priority = ignore_completed_priority

tile_radius = config.tile_radius().to(u.deg).value

tiles = desisurvey.tiles.get_tiles()
Expand Down Expand Up @@ -226,15 +242,13 @@ def apply(self, donefrac):
"""
# First pass through groups to check trigger conditions.
triggered = {'START': True}
config = desisurvey.config.Configuration()
commissioning = getattr(config, 'commissioning', False)
for i, name in enumerate(self.group_names):
gid = i+1
group_sel = self.group_ids == gid
if not np.any(group_sel) and not commissioning:
if not np.any(group_sel) and not self.commissioning:
self.log.error('No tiles covered by rule {}'.format(name))
ngroup = np.count_nonzero(group_sel)
completed = donefrac > config.min_snr2_fraction()
completed = donefrac > self.min_snr2_fraction
ndone = np.count_nonzero(completed[group_sel])
max_orphans = self.group_max_orphans[name]
triggered[name] = (ndone + max_orphans >= ngroup)
Expand All @@ -247,8 +261,8 @@ def apply(self, donefrac):
priority = max(priority, value)
sel = self.group_ids == gid
priorities[sel] = priority * self.dec_priority[sel]
started_boost = getattr(config, 'finish_started_priority', 0)
if not isinstance(started_boost, int):
started_boost = started_boost()
priorities *= 1 + started_boost*(donefrac > 0)
priorities *= (1 + self.finish_started_priority*(donefrac > 0))
if self.ignore_completed_priority > 0:
priorities *= np.where(donefrac >= 1,
self.ignore_completed_priority, 1)
return priorities
12 changes: 10 additions & 2 deletions py/desisurvey/scheduler.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,11 @@ def __init__(self, restore=None, design_hourangle=None):
self.log = desiutil.log.get_logger()
# Load our configuration.
config = desisurvey.config.Configuration()
ignore_completed_priority = getattr(config,
'ignore_completed_priority', -1)
if not isinstance(ignore_completed_priority, int):
ignore_completed_priority = ignore_completed_priority()
self.ignore_completed_priority = ignore_completed_priority
self.min_snr2frac = config.min_snr2_fraction()
GRAY = desisurvey.config.Configuration().programs.GRAY
self.max_prod = GRAY.max_moon_illumination_altitude_product().to(u.deg).value
Expand Down Expand Up @@ -232,7 +237,9 @@ def init_night(self, night, use_twilight=False):
# Remember the last tile observed this night.
self.last_idx = None
# Initialize the pool of tiles that could be observed this night.
self.in_night_pool[:] = ~self.completed & self.tile_planned & self.tile_available
self.in_night_pool[:] = self.tile_planned & self.tile_available
if self.ignore_completed_priority <= 0:
self.in_night_pool &= ~self.completed
# Check if any tiles cannot be observed because they are too close to a planet this night.
poolRA = self.tiles.tileRA[self.in_night_pool]
poolDEC = self.tiles.tileDEC[self.in_night_pool]
Expand Down Expand Up @@ -452,7 +459,8 @@ def update_snr(self, tileID, snr2frac, lastexpid):
self.snr2frac[idx] = snr2frac
self.lastexpid[idx] = lastexpid
if self.snr2frac[idx] >= self.min_snr2frac:
self.in_night_pool[idx] = False
if self.ignore_completed_priority <= 0:
self.in_night_pool[idx] = False
self.completed[idx] = True
passidx = self.tiles.pass_index[self.tiles.passnum[idx]]
self.completed_by_pass[passidx] += 1
Expand Down
13 changes: 12 additions & 1 deletion py/desisurvey/scripts/afternoon_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -200,13 +200,24 @@ def afternoon_plan(night=None, restore_etc_stats='most_recent',
tilefiledat = hdu.data
_, md, mt = np.intersect1d(donefraccond['TILEID'],
tilefiledat['TILEID'], return_indices=True)
newobsconditions = tilefiledat['OBSCONDITIONS'].copy()
for cond in allcond:
# make tile unobservable in given conditions if it's finished
# in those conditions.
m = (donefraccond['NNIGHT_'+cond][md] >=
donefraccond['NNIGHT_NEEDED_'+cond][md])
condmask = desisurvey.tiles.Tiles.OBSCONDITIONS[cond]
tilefiledat['OBSCONDITIONS'][mt[m]] &= ~condmask
newobsconditions[mt[m]] &= ~condmask
ignore_completed_priority = getattr(config,
'ignore_completed_priority', -1)
if not isinstance(ignore_completed_priority, int):
ignore_completed_priority = ignore_completed_priority()
# tiles that are completely done should have their OBSCONDITIONS
# restored so that they can be observed in any conditions at
# very low priority.
if ignore_completed_priority > 0:
m = (newobsconditions == 0) & (tilefiledat['OBSCONDITIONS'] != 0)
newobsconditions[m] = tilefiledat['OBSCONDITIONS'][m]
hdulist.writeto(newtilefn, overwrite=True)

planner.afternoon_plan(night, fiber_assign_dir=fiber_assign_dir)
Expand Down

0 comments on commit 415c622

Please sign in to comment.