diff --git a/SAS/TMSS/backend/services/scheduling/lib/constraints.py b/SAS/TMSS/backend/services/scheduling/lib/constraints.py index 5a65a637b02c19b97d9017f2f8176fea7ed9b995..1daf3079ecab7ffe1f77a7e1fb1ac68206a4b7eb 100644 --- a/SAS/TMSS/backend/services/scheduling/lib/constraints.py +++ b/SAS/TMSS/backend/services/scheduling/lib/constraints.py @@ -868,7 +868,7 @@ def evaluate_sky_min_elevation_constraint(scheduling_unit: models.SchedulingUnit result.score = 0 result.evaluation_timestamp = timestamp result.optimal_start_time = None - # logger.debug("%s min_elevation=%.3f[deg] rise='%s' set='%s'", result, min_elevation.degree, rise_and_set_time['rise'], rise_and_set_time['set']) + logger.debug("%s task_id=%s task_name='%s' station=%s min_elevation=%.3f[deg] rise='%s' set='%s'", result, task.id, task.name, station, min_elevation.degree, rise_and_set_time['rise'], rise_and_set_time['set']) return result # for min_elevation there is no optimal start time. @@ -958,18 +958,22 @@ def evaluate_sky_min_distance_constraint(scheduling_unit: models.SchedulingUnitB gridder.grid_time(task_proposed_end_time)) # currently we only check at bounds and center, we probably want to add some more samples in between later on - for gridded_timestamp in gridded_timestamps: - for pointing in sap_pointings: - bodies = tuple(constraints['sky']['min_distance'].keys()) - distances = coordinates_and_timestamps_to_separation_from_bodies(pointing=pointing, - timestamps=(gridded_timestamp,), - bodies=bodies) - - # loop over all bodies and their respective min_distance constraints - for body, min_distance in constraints['sky']['min_distance'].items(): + # loop over all bodies and their respective min_distance constraints + for pointing in sap_pointings: + for body, min_distance in constraints['sky']['min_distance'].items(): + for gridded_timestamp in gridded_timestamps: + distances = coordinates_and_timestamps_to_separation_from_bodies(pointing=pointing, + timestamps=(gridded_timestamp,), + bodies=[body]) actual_distances = distances[body] assert (len(actual_distances) == 1) actual_distance = actual_distances[gridded_timestamp] + logger.debug("min_distance: SUB id=%s task_id=%s task_name='%s' pointing='%s' distance=%.3f[deg] to body=%s %s min_distance=%.3f[deg] at '%s'", + scheduling_unit.id, target_obs_task.id, target_obs_task.name, pointing, actual_distance.degree, body, + '<' if actual_distance.rad < min_distance else '>=', + Angle(min_distance, astropy.units.rad).degree, + gridded_timestamp) + if actual_distance.rad < min_distance: # constraint not met. update result, and do early exit. result.score = 0 @@ -977,8 +981,8 @@ def evaluate_sky_min_distance_constraint(scheduling_unit: models.SchedulingUnitB result.optimal_start_time = None logger.debug("%s body=%s actual_distance=%.3f[deg] < min_distance=%.3f[deg]", result, body, actual_distance.degree, Angle(min_distance, astropy.units.rad).degree) return result - # no early exit, so constraint is met for this station and timestamp - # continue with rest of stations & timestamps + # no early exit, so constraint is met for this station and timestamp + # continue with rest of stations & timestamps # no early exit, so constraint is met for all stations and timestamps result.earliest_possible_start_time = proposed_start_time @@ -1636,7 +1640,7 @@ def get_missing_stations_for_scheduling_unit(scheduling_unit: models.SchedulingU return sorted((list(missing_stations))) -def determine_unschedulable_reason_and_mark_unschedulable_if_needed(scheduling_unit: models.SchedulingUnitBlueprint, lower_bound: datetime, upper_bound: datetime, gridder: Gridder, raise_if_interruped: Callable=noop) -> models.SchedulingUnitBlueprint: +def determine_unschedulable_reason_and_mark_unschedulable_if_needed(scheduling_unit: models.SchedulingUnitBlueprint, lower_bound: datetime, upper_bound: datetime, gridder: Gridder=None, raise_if_interruped: Callable=noop) -> models.SchedulingUnitBlueprint: try: logger.debug("determine_unschedulable_reason_and_mark_unschedulable_if_needed: scheduling_unit id=%s", scheduling_unit.id) if not can_run_within_station_reservations(scheduling_unit):