Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1import numpy as np 

2import unittest 

3import lsst.sims.featureScheduler.basis_functions as bf 

4from lsst.sims.featureScheduler.utils import standard_goals, calc_norm_factor 

5from lsst.sims.featureScheduler.surveys import (generate_dd_surveys, Greedy_survey, 

6 Blob_survey, Pairs_survey_scripted) 

7from lsst.sims.featureScheduler.schedulers import Core_scheduler 

8import lsst.utils.tests 

9import healpy as hp 

10from lsst.sims.featureScheduler import sim_runner 

11from lsst.sims.featureScheduler.modelObservatory import Model_observatory 

12import lsst.sims.featureScheduler.detailers as detailers 

13 

14 

15def gen_greedy_surveys(nside): 

16 """ 

17 Make a quick set of greedy surveys 

18 """ 

19 target_map = standard_goals(nside=nside) 

20 filters = ['g', 'r', 'i', 'z', 'y'] 

21 surveys = [] 

22 

23 for filtername in filters: 

24 bfs = [] 

25 bfs.append(bf.M5_diff_basis_function(filtername=filtername, nside=nside)) 

26 bfs.append(bf.Target_map_basis_function(filtername=filtername, 

27 target_map=target_map[filtername], 

28 out_of_bounds_val=np.nan, nside=nside)) 

29 bfs.append(bf.Slewtime_basis_function(filtername=filtername, nside=nside)) 

30 bfs.append(bf.Strict_filter_basis_function(filtername=filtername)) 

31 # Masks, give these 0 weight 

32 bfs.append(bf.Zenith_shadow_mask_basis_function(nside=nside, shadow_minutes=60., max_alt=76.)) 

33 bfs.append(bf.Moon_avoidance_basis_function(nside=nside, moon_distance=30.)) 

34 bfs.append(bf.Clouded_out_basis_function()) 

35 

36 bfs.append(bf.Filter_loaded_basis_function(filternames=filtername)) 

37 bfs.append(bf.Planet_mask_basis_function(nside=nside)) 

38 

39 weights = np.array([3.0, 0.3, 3., 3., 0., 0., 0., 0., 0.]) 

40 surveys.append(Greedy_survey(bfs, weights, block_size=1, filtername=filtername, 

41 dither=True, nside=nside)) 

42 return surveys 

43 

44 

45def gen_blob_surveys(nside): 

46 """ 

47 make a quick set of blob surveys 

48 """ 

49 target_map = standard_goals(nside=nside) 

50 norm_factor = calc_norm_factor(target_map) 

51 

52 filter1s = ['u', 'g'] # , 'r', 'i', 'z', 'y'] 

53 filter2s = [None, 'g'] # , 'r', 'i', None, None] 

54 filter1s = ['g'] # , 'r', 'i', 'z', 'y'] 

55 filter2s = ['g'] # , 'r', 'i', None, None] 

56 

57 pair_surveys = [] 

58 for filtername, filtername2 in zip(filter1s, filter2s): 

59 detailer_list = [] 

60 bfs = [] 

61 bfs.append(bf.M5_diff_basis_function(filtername=filtername, nside=nside)) 

62 if filtername2 is not None: 

63 bfs.append(bf.M5_diff_basis_function(filtername=filtername2, nside=nside)) 

64 bfs.append(bf.Target_map_basis_function(filtername=filtername, 

65 target_map=target_map[filtername], 

66 out_of_bounds_val=np.nan, nside=nside, 

67 norm_factor=norm_factor)) 

68 if filtername2 is not None: 

69 bfs.append(bf.Target_map_basis_function(filtername=filtername2, 

70 target_map=target_map[filtername2], 

71 out_of_bounds_val=np.nan, nside=nside, 

72 norm_factor=norm_factor)) 

73 bfs.append(bf.Slewtime_basis_function(filtername=filtername, nside=nside)) 

74 bfs.append(bf.Strict_filter_basis_function(filtername=filtername)) 

75 # Masks, give these 0 weight 

76 bfs.append(bf.Zenith_shadow_mask_basis_function(nside=nside, shadow_minutes=60., max_alt=76.)) 

77 bfs.append(bf.Moon_avoidance_basis_function(nside=nside, moon_distance=30.)) 

78 bfs.append(bf.Clouded_out_basis_function()) 

79 # feasibility basis fucntions. Also give zero weight. 

80 filternames = [fn for fn in [filtername, filtername2] if fn is not None] 

81 bfs.append(bf.Filter_loaded_basis_function(filternames=filternames)) 

82 bfs.append(bf.Time_to_twilight_basis_function(time_needed=22.)) 

83 bfs.append(bf.Not_twilight_basis_function()) 

84 bfs.append(bf.Planet_mask_basis_function(nside=nside)) 

85 

86 weights = np.array([3.0, 3.0, .3, .3, 3., 3., 0., 0., 0., 0., 0., 0., 0.]) 

87 if filtername2 is None: 

88 # Need to scale weights up so filter balancing still works properly. 

89 weights = np.array([6.0, 0.6, 3., 3., 0., 0., 0., 0., 0., 0., 0.]) 

90 if filtername2 is None: 

91 survey_name = 'blob, %s' % filtername 

92 else: 

93 survey_name = 'blob, %s%s' % (filtername, filtername2) 

94 if filtername2 is not None: 

95 detailer_list.append(detailers.Take_as_pairs_detailer(filtername=filtername2)) 

96 pair_surveys.append(Blob_survey(bfs, weights, filtername1=filtername, filtername2=filtername2, 

97 survey_note=survey_name, ignore_obs='DD', detailers=detailer_list)) 

98 return pair_surveys 

99 

100 

101class TestFeatures(unittest.TestCase): 

102 

103 def testGreedy(self): 

104 """ 

105 Set up a greedy survey and run for a few days. A crude way to touch lots of code. 

106 """ 

107 nside = 32 

108 survey_length = 2.0 # days 

109 

110 surveys = gen_greedy_surveys(nside) 

111 # Depricating Pairs_survey_scripted 

112 #surveys.append(Pairs_survey_scripted(None, ignore_obs='DD')) 

113 

114 # Set up the DD 

115 dd_surveys = generate_dd_surveys(nside=nside) 

116 surveys.extend(dd_surveys) 

117 

118 scheduler = Core_scheduler(surveys, nside=nside) 

119 observatory = Model_observatory(nside=nside) 

120 observatory, scheduler, observations = sim_runner(observatory, scheduler, 

121 survey_length=survey_length, 

122 filename=None) 

123 

124 # Check that greedy observed some 

125 assert('' in observations['note']) 

126 # Check that the a DD was observed 

127 assert('DD:ELAISS1' in observations['note']) 

128 # Make sure a few different filters were observed 

129 assert(len(np.unique(observations['filter'])) > 3) 

130 # Make sure lots of observations executed 

131 assert(observations.size > 1000) 

132 # Make sure nothing tried to look through the earth 

133 assert(np.min(observations['alt']) > 0) 

134 

135 def testBlobs(self): 

136 """ 

137 Set up a blob selection survey 

138 """ 

139 nside = 32 

140 survey_length = 2.0 # days 

141 

142 surveys = [] 

143 # Set up the DD 

144 dd_surveys = generate_dd_surveys(nside=nside) 

145 surveys.append(dd_surveys) 

146 

147 surveys.append(gen_blob_surveys(nside)) 

148 surveys.append(gen_greedy_surveys(nside)) 

149 

150 scheduler = Core_scheduler(surveys, nside=nside) 

151 observatory = Model_observatory(nside=nside) 

152 observatory, scheduler, observations = sim_runner(observatory, scheduler, 

153 survey_length=survey_length, 

154 filename=None) 

155 

156 # Make sure some blobs executed 

157 assert('blob, gg, b' in observations['note']) 

158 assert('blob, gg, a' in observations['note']) 

159 # assert('blob, u' in observations['note']) 

160 

161 # Make sure some greedy executed 

162 assert('' in observations['note']) 

163 # Check that the a DD was observed 

164 assert('DD:ELAISS1' in observations['note']) 

165 # Make sure a few different filters were observed 

166 assert(len(np.unique(observations['filter'])) > 3) 

167 # Make sure lots of observations executed 

168 assert(observations.size > 1000) 

169 # Make sure nothing tried to look through the earth 

170 assert(np.min(observations['alt']) > 0) 

171 

172 

173class TestMemory(lsst.utils.tests.MemoryTestCase): 

174 pass 

175 

176 

177def setup_module(module): 

178 lsst.utils.tests.init() 

179 

180 

181if __name__ == "__main__": 181 ↛ 182line 181 didn't jump to line 182, because the condition on line 181 was never true

182 lsst.utils.tests.init() 

183 unittest.main()