Skip to content

Commit

Permalink
SCHED 410: Fix time accounting for split observations. (#283)
Browse files Browse the repository at this point in the history
* SCHED-410: Add correct atom start/end in Visits for split observations

* SCHED-410: Fix iteration through atoms in visit instead of whole sequence in Time accounting

---------

Co-authored-by: Sergio <sergio.troncoso@noirlab.edu>
  • Loading branch information
stroncod and Sergio committed Jul 28, 2023
1 parent 3a43ab3 commit 0f49a5f
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 11 deletions.
19 changes: 10 additions & 9 deletions scheduler/core/components/collector/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -497,25 +497,26 @@ def time_accounting(self, site_plans: Plans) -> None:
for v in plan.visits:
# Update Observation from Collector.
observation = self.get_observation(v.obs_id)
obs_seq = observation.sequence
# check that Observation is Observed
if v.atom_end_idx == len(observation.sequence)-1:
if v.atom_end_idx == len(obs_seq)-1:
observation.status = ObservationStatus.OBSERVED
else:
observation.status = ObservationStatus.ONGOING

# Update by atom in the sequence
for atom_idx, atom in enumerate(observation.sequence):
for atom_idx in range (v.atom_start_idx, v.atom_end_idx):

atom.program_used = atom.prog_time
atom.partner_used = atom.part_time
obs_seq[atom_idx].program_used = obs_seq[atom_idx].prog_time
obs_seq[atom_idx].partner_used = obs_seq[atom_idx].part_time

# Charge acquisition to the first atom
if atom_idx == 0:
if observation.obs_class == ObservationClass.PARTNERCAL:
atom.program_used += observation.acq_overhead
obs_seq[atom_idx].program_used += observation.acq_overhead
elif (observation.obs_class == ObservationClass.SCIENCE or
observation.obs_class == ObservationClass.PROGCAL):
atom.program_used += observation.acq_overhead
obs_seq[atom_idx].program_used += observation.acq_overhead

atom.observed = True
atom.qa_state = QAState.PASS
obs_seq[atom_idx].observed = True
obs_seq[atom_idx].qa_state = QAState.PASS
6 changes: 6 additions & 0 deletions scheduler/core/components/optimizer/greedymax.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ class ObsPlanData:
obs: Observation
obs_start: datetime
obs_len: int
atom_start: int
atom_end: int
visit_score: float


Expand Down Expand Up @@ -820,6 +822,8 @@ def _add_visit(self, night, obs, max_group_info, best_interval, n_slots_filled)
obs=obs,
obs_start=start,
obs_len=visit_length,
atom_start=atom_start,
atom_end=atom_end,
visit_score=visit_score
)

Expand Down Expand Up @@ -937,6 +941,8 @@ def output_plans(self, plans: Plans) -> None:
obs_in_plan = self.obs_in_plan[timeline.site][start_time_slot]
plans[timeline.site].add(obs_in_plan.obs,
obs_in_plan.obs_start,
obs_in_plan.atom_start,
obs_in_plan.atom_end,
start_time_slot,
obs_in_plan.obs_len,
obs_in_plan.visit_score)
6 changes: 4 additions & 2 deletions scheduler/core/plans/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,13 +196,15 @@ def time2slots(time_slot_length: timedelta, time: timedelta) -> int:
def add(self,
obs: Observation,
start: datetime,
atom_start: int,
atom_end: int,
start_time_slot: int,
time_slots: int,
score: float) -> None:
visit = Visit(start,
obs.id,
obs.sequence[0].id,
obs.sequence[-1].id,
atom_start,
atom_end,
start_time_slot,
time_slots,
score,
Expand Down

0 comments on commit 0f49a5f

Please sign in to comment.