bfs.append( fs.M5_diff_basis_function(filtername=filtername2, nside=nside)) bfs.append( fs.Target_map_basis_function(filtername=filtername, target_map=target_map[filtername], out_of_bounds_val=hp.UNSEEN, nside=nside, norm_factor=norm_factor)) if filtername2 is not None: bfs.append( fs.Target_map_basis_function(filtername=filtername2, target_map=target_map[filtername2], out_of_bounds_val=hp.UNSEEN, nside=nside, norm_factor=norm_factor)) bfs.append(fs.Slewtime_basis_function(filtername=filtername, nside=nside)) bfs.append(fs.Strict_filter_basis_function(filtername=filtername)) bfs.append( fs.Zenith_shadow_mask_basis_function(nside=nside, shadow_minutes=60., max_alt=76.)) weights = np.array([3.0, 3.0, .3, .3, 3., 3., 0.]) if filtername2 is None: # Need to scale weights up so filter balancing still works properly. weights = np.array([6.0, 0.6, 3., 3., 0.]) # XXX- # This is where we could add a look-ahead basis function to include m5_diff in the future. # Actually, having a near-future m5 would also help prevent switching to u or g right at twilight? # Maybe just need a "filter future" basis function? if filtername2 is None: survey_name = 'blob, %s' % filtername
if __name__ == "__main__": survey_length = 365.25 # days # Define what we want the final visit ratio map to look like target_map = fs.standard_goals()['r'] filtername = 'r' bfs = [] bfs.append(fs.M5_diff_basis_function(filtername=filtername, teff=False)) bfs.append( fs.Target_map_basis_function(target_map=target_map, filtername=filtername, out_of_bounds_val=hp.UNSEEN)) bfs.append(fs.North_south_patch_basis_function(zenith_min_alt=50.)) bfs.append(fs.Slewtime_basis_function(filtername=filtername)) weights = np.array([1., 0.2, 1., 2.]) surveys = [] surveys.append( fs.Greedy_survey_fields(bfs, weights, block_size=1, filtername=filtername)) surveys.append(fs.Pairs_survey_scripted([], [])) scheduler = fs.Core_scheduler(surveys) observatory = Speed_observatory() observatory, scheduler, observations = fs.sim_runner( observatory, scheduler,
def year_1_surveys(nside=32, mjd0=None): """ Generate a list of surveys for executing in year 1 """ nside = nside filters = ['u', 'g', 'r', 'i', 'z', 'y'] target_map = large_target_map(nside, dec_max=34.3) norm_factor = fs.calc_norm_factor({'r': target_map}) # set up a cloud map cloud_map = target_map * 0 + 0.7 # Set up map m5-depth limits: m5_limits = {} percentile_cut = 0.7 m52per = sb.M5percentiles() for filtername in filters: m5_limits[filtername] = m52per.percentile2m5map(percentile_cut, filtername=filtername, nside=nside) surveys = [] for filtername in filters: bfs = [] bfs.append( fs.M5_diff_basis_function(filtername=filtername, nside=nside)) bfs.append( fs.Target_map_basis_function(filtername=filtername, target_map=target_map, out_of_bounds_val=hp.UNSEEN, nside=nside, norm_factor=norm_factor)) bfs.append( fs.Slewtime_basis_function(filtername=filtername, nside=nside)) bfs.append(fs.Strict_filter_basis_function(filtername=filtername)) bfs.append( fs.Zenith_shadow_mask_basis_function(nside=nside, shadow_minutes=0., max_alt=76.)) bfs.append( fs.Moon_avoidance_basis_function(nside=nside, moon_distance=40.)) bfs.append( fs.Bulk_cloud_basis_function(max_cloud_map=cloud_map, nside=nside)) weights = [3.0, 0.3, 3., 3., 0, 0., 0.] # add in some constriants to make sure we only observe in good conditions and shut off after 3 good ones bfs.append( Limit_m5_map_basis_function(m5_limits[filtername], nside=nside, filtername=filtername)) bfs.append( Seeing_limit_basis_function(nside=nside, filtername=filtername)) bfs.append(Time_limit_basis_function(day_max=365.25)) # XXX--Do I need a m5-depth limit on here too? bfs.append( Nvis_limit_basis_function(nside=nside, filtername=filtername, n_limit=3, seeing_limit=1.2, time_lag=0.45, m5_limit_map=m5_limits[filtername])) weights.extend([0, 0, 0, 0]) #weights.extend([0., 0., 0.]) weights = np.array(weights) # Might want to try ignoring DD observations here, so the DD area gets covered normally--DONE surveys.append( fs.Greedy_survey_fields(bfs, weights, block_size=1, filtername=filtername, dither=True, nside=nside, ignore_obs='DD', survey_name='templates')) # Do we want to cover all the potential area LSST could observe? In case a GW goes off # in the north not in the NES. return surveys
def generate_blob_surveys(nside): target_maps, norm_factor = generate_target_maps(nside) # set up a cloud map cloud_map = target_maps['r'][0] * 0 + 0.7 # Set up observations to be taken in blocks filter1s = ['u', 'g', 'r', 'i', 'z', 'y'] filter2s = [None, 'g', 'r', 'i', None, None] pair_surveys = [] for filtername, filtername2 in zip(filter1s, filter2s): bfs = [] bfs.append( fs.M5_diff_basis_function(filtername=filtername, nside=nside)) if filtername2 is not None: bfs.append( fs.M5_diff_basis_function(filtername=filtername2, nside=nside)) bfs.append( fs.Target_map_basis_function(filtername=filtername, target_map=target_maps[filtername], out_of_bounds_val=hp.UNSEEN, nside=nside, norm_factor=norm_factor)) if filtername2 is not None: bfs.append( fs.Target_map_basis_function( filtername=filtername2, target_map=target_maps[filtername2], out_of_bounds_val=hp.UNSEEN, nside=nside, norm_factor=norm_factor)) bfs.append( fs.Slewtime_basis_function(filtername=filtername, nside=nside)) bfs.append(fs.Strict_filter_basis_function(filtername=filtername)) # Masks, give these 0 weight bfs.append( fs.Zenith_shadow_mask_basis_function(nside=nside, shadow_minutes=60., max_alt=76.)) bfs.append( fs.Moon_avoidance_basis_function(nside=nside, moon_distance=40.)) bfs.append( fs.Bulk_cloud_basis_function(max_cloud_map=cloud_map, nside=nside)) weights = np.array([3.0, 3.0, .3, .3, 3., 3., 0., 0., 0.]) if filtername2 is None: # Need to scale weights up so filter balancing still works properly. weights = np.array([6.0, 0.6, 3., 3., 0., 0., 0.]) if filtername2 is None: survey_name = 'blob, %s' % filtername else: survey_name = 'blob, %s%s' % (filtername, filtername2) pair_surveys.append( fs.Blob_survey(bfs, weights, filtername=filtername, filter2=filtername2, survey_note=survey_name, ignore_obs='DD')) return pair_surveys
import numpy as np import lsst.sims.featureScheduler as fs from lsst.sims.speedObservatory import Speed_observatory import healpy as hp if __name__ == "__main__": survey_length = 5 # days # Define what we want the final visit ratio map to look like target_map = fs.standard_goals()['r'] bfs = [] bfs.append(fs.Depth_percentile_basis_function()) bfs.append(fs.Target_map_basis_function(target_map=target_map)) bfs.append(fs.Quadrant_basis_function()) bfs.append(fs.Slewtime_basis_function()) weights = np.array([.5, 1., 1., 1.]) survey = fs.Simple_greedy_survey_fields(bfs, weights, block_size=1) scheduler = fs.Core_scheduler([survey]) observatory = Speed_observatory() observatory, scheduler, observations = fs.sim_runner( observatory, scheduler, survey_length=survey_length, filename='marching_d%i.db' % survey_length, delete_past=True) # block_size=10, surveylength of 365 had runtime of 163 min. and got 0.26e6 observations. So, 10 years would be 27 hours. # Going to block_size=1, runtime of 211 min, and 0.33e6 observations. So, 35 hours. Not too shabby!