Source code for rubin_scheduler.scheduler.surveys.roman_surveys

__all__ = ["gen_roman_on_season", "gen_roman_off_season"]

import warnings

import rubin_scheduler.scheduler.basis_functions as bf
import rubin_scheduler.scheduler.detailers as detailers
from rubin_scheduler.scheduler.surveys import DeepDrillingSurvey
from rubin_scheduler.utils import DEFAULT_NSIDE


def roman_info():
    """Manually enter some Roman RGES info."""
    # From the TVS Slack channel:
    # spring 2027, fall 2027, spring 2028, then fall 2030,
    # spring 2031, fall 2031

    result = {}
    result["RA"] = 268.708
    result["dec"] = -28.975

    # Guessing these from the notebook in same dir.
    observing_season_mid_mjds = [61947.3, 62318.8, 62670.3, 63067.2, 63381.4, 63773.2]

    result["seasons_on"] = [[val - 32, val + 32] for val in observing_season_mid_mjds]

    result["seasons_off"] = []
    for i in range(len(result["seasons_on"]) - 1):
        result["seasons_off"].append([result["seasons_on"][i][1] + 1, result["seasons_on"][i + 1][0] - 1])

    return result


[docs] def gen_roman_on_season( nside=DEFAULT_NSIDE, camera_ddf_rot_limit=75.0, exptime=30.0, nexp=2, ): """Generate a survey object for observing the Roman field(s) in an on season""" warnings.warn("Generating Roman survey place holder. Should probably not be in production.") field_info = roman_info() RA = field_info["RA"] dec = field_info["dec"] survey_name = "DD: RGES_onseason" # Add some feasability basis functions. Maybe just give it a set # of nights where it can execute for now. basis_functions = [] # These are crude hard limits. Nominally we would try to # pre-schedule these when they would be at the best airamss # in the night. basis_functions.append(bf.HourAngleLimitBasisFunction(RA=RA, ha_limits=[[20, 24], [0, 4]])) basis_functions.append(bf.NotTwilightBasisFunction()) # Force it to delay about a day basis_functions.append(bf.ForceDelayBasisFunction(days_delay=0.8, survey_name=survey_name)) # Force it to be in a given observing season basis_functions.append(bf.InTimeWindowBasisFunction(mjd_windows=field_info["seasons_on"])) basis_functions.append(bf.MoonDistPointRangeBasisFunction(RA, dec)) basis_functions.append(bf.AirmassPointRangeBasisFunction(RA, dec, nside=nside)) # Add a dither detailer, so it dithers between each set # of exposures I guess? details = [] details.append(detailers.DitherDetailer(max_dither=0.5, seed=42, per_night=True)) details.append(detailers.CameraRotDetailer(min_rot=-camera_ddf_rot_limit, max_rot=camera_ddf_rot_limit)) survey = DeepDrillingSurvey( basis_functions, RA=RA, dec=dec, sequence="giriz", nvis=[1, 1, 1, 1, 1], exptime=exptime, nexp=nexp, survey_name=survey_name, detailers=details, ) return survey
[docs] def gen_roman_off_season( nside=DEFAULT_NSIDE, camera_ddf_rot_limit=75.0, exptime=30.0, nexp=2, ): """Generate a ddf-like survey object to observe the roman field every ~3 days in the off-season""" warnings.warn("Generating Roman survey place holder. Should probably not be in production.") field_info = roman_info() RA = field_info["RA"] dec = field_info["dec"] survey_name = "DD: RGES_offseason" # Add some feasability basis functions. Maybe just give it a # set of nights where it can execute for now. basis_functions = [] # These are crude hard limits. Nominally we would try # to pre-schedule these when they would be at the best # airamss in the night. basis_functions.append(bf.HourAngleLimitBasisFunction(RA=RA, ha_limits=[[20, 24], [0, 4]])) basis_functions.append(bf.NotTwilightBasisFunction()) # Force it to not go every day basis_functions.append(bf.ForceDelayBasisFunction(days_delay=3.0, survey_name=survey_name)) # Force it to be in a given observing season basis_functions.append(bf.InTimeWindowBasisFunction(mjd_windows=field_info["seasons_off"])) basis_functions.append(bf.MoonDistPointRangeBasisFunction(RA, dec)) basis_functions.append(bf.AirmassPointRangeBasisFunction(RA, dec, nside=nside)) # Add a dither detailer, so it dithers between each # set of exposures I guess? details = [] details.append(detailers.DitherDetailer(max_dither=0.5, seed=42, per_night=True)) details.append(detailers.CameraRotDetailer(min_rot=-camera_ddf_rot_limit, max_rot=camera_ddf_rot_limit)) survey = DeepDrillingSurvey( basis_functions, RA=RA, dec=dec, sequence="griz", nvis=[1, 1, 1, 1], exptime=exptime, nexp=nexp, survey_name=survey_name, detailers=details, ) return survey