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 healpy as hp 

2import lsst.sims.maf.metrics as metrics 

3import lsst.sims.maf.slicers as slicers 

4import lsst.sims.maf.stackers as stackers 

5import lsst.sims.maf.plots as plots 

6import lsst.sims.maf.metricBundles as mb 

7from lsst.sims.maf.batches import intraNight, interNight 

8from .colMapDict import ColMapDict 

9import numpy as np 

10from lsst.sims.utils import hpid2RaDec, angularSeparation 

11 

12__all__ = ['scienceRadarBatch'] 

13 

14 

15def scienceRadarBatch(colmap=None, runName='', extraSql=None, extraMetadata=None, nside=64, 

16 benchmarkArea=18000, benchmarkNvisits=825, DDF=True): 

17 """A batch of metrics for looking at survey performance relative to the SRD and the main 

18 science drivers of LSST. 

19 

20 Parameters 

21 ---------- 

22 

23 """ 

24 # Hide dependencies 

25 from mafContrib.LSSObsStrategy.galaxyCountsMetric_extended import GalaxyCountsMetric_extended 

26 from mafContrib import Plasticc_metric, plasticc_slicer, load_plasticc_lc 

27 

28 if colmap is None: 

29 colmap = ColMapDict('opsimV4') 

30 

31 if extraSql is None: 

32 extraSql = '' 

33 if extraSql == '': 

34 joiner = '' 

35 else: 

36 joiner = ' and ' 

37 

38 bundleList = [] 

39 

40 healslicer = slicers.HealpixSlicer(nside=nside) 

41 subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()] 

42 

43 # Load up the plastic light curves 

44 models = ['SNIa-normal', 'KN'] 

45 plasticc_models_dict = {} 

46 for model in models: 

47 plasticc_models_dict[model] = list(load_plasticc_lc(model=model).values()) 

48 

49 ######################### 

50 # SRD, DM, etc 

51 ######################### 

52 sql = extraSql 

53 displayDict = {'group': 'SRD', 'subgroup': 'fO', 'order': 0, 'caption': None} 

54 metric = metrics.CountMetric(col=colmap['mjd'], metricName='fO') 

55 plotDict = {'xlabel': 'Number of Visits', 'Asky': benchmarkArea, 

56 'Nvisit': benchmarkNvisits, 'xMin': 0, 'xMax': 1500} 

57 summaryMetrics = [metrics.fOArea(nside=nside, norm=False, metricName='fOArea', 

58 Asky=benchmarkArea, Nvisit=benchmarkNvisits), 

59 metrics.fOArea(nside=nside, norm=True, metricName='fOArea/benchmark', 

60 Asky=benchmarkArea, Nvisit=benchmarkNvisits), 

61 metrics.fONv(nside=nside, norm=False, metricName='fONv', 

62 Asky=benchmarkArea, Nvisit=benchmarkNvisits), 

63 metrics.fONv(nside=nside, norm=True, metricName='fONv/benchmark', 

64 Asky=benchmarkArea, Nvisit=benchmarkNvisits)] 

65 caption = 'The FO metric evaluates the overall efficiency of observing. ' 

66 caption += ('foNv: out of %.2f sq degrees, the area receives at least X and a median of Y visits ' 

67 '(out of %d, if compared to benchmark). ' % (benchmarkArea, benchmarkNvisits)) 

68 caption += ('fOArea: this many sq deg (out of %.2f sq deg if compared ' 

69 'to benchmark) receives at least %d visits. ' % (benchmarkArea, benchmarkNvisits)) 

70 displayDict['caption'] = caption 

71 bundle = mb.MetricBundle(metric, healslicer, sql, plotDict=plotDict, 

72 displayDict=displayDict, summaryMetrics=summaryMetrics, 

73 plotFuncs=[plots.FOPlot()]) 

74 bundleList.append(bundle) 

75 displayDict['order'] += 1 

76 

77 displayDict = {'group': 'SRD', 'subgroup': 'Gaps', 'order': 0, 'caption': None} 

78 plotDict = {'percentileClip': 95.} 

79 for filtername in 'ugrizy': 

80 sql = extraSql + joiner + 'filter ="%s"' % filtername 

81 metric = metrics.MaxGapMetric() 

82 summaryMetrics = [metrics.PercentileMetric(percentile=95, metricName='95th percentile of Max gap, %s' % filtername)] 

83 bundle = mb.MetricBundle(metric, healslicer, sql, plotFuncs=subsetPlots, 

84 summaryMetrics=summaryMetrics, displayDict=displayDict, plotDict=plotDict) 

85 bundleList.append(bundle) 

86 displayDict['order'] += 1 

87 

88 ######################### 

89 # Solar System 

90 ######################### 

91 

92 # XXX -- may want to do Solar system seperatly 

93 

94 # XXX--fraction of NEOs detected (assume some nominal size and albido) 

95 # XXX -- fraction of MBAs detected 

96 # XXX -- fraction of KBOs detected 

97 # XXX--any others? Planet 9s? Comets? Neptune Trojans? 

98 

99 ######################### 

100 # Cosmology 

101 ######################### 

102 

103 displayDict = {'group': 'Cosmology', 'subgroup': 'galaxy counts', 'order': 0, 'caption': None} 

104 plotDict = {'percentileClip': 95.} 

105 sql = extraSql + joiner + 'filter="i"' 

106 metric = GalaxyCountsMetric_extended(filterBand='i', redshiftBin='all', nside=nside) 

107 summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.sum, decreasing=True, metricName='N Galaxies (WFD)')] 

108 summary.append(metrics.SumMetric(metricName='N Galaxies (all)')) 

109 # make sure slicer has cache off 

110 slicer = slicers.HealpixSlicer(nside=nside, useCache=False) 

111 bundle = mb.MetricBundle(metric, slicer, sql, plotDict=plotDict, 

112 displayDict=displayDict, summaryMetrics=summary, 

113 plotFuncs=subsetPlots) 

114 bundleList.append(bundle) 

115 displayDict['order'] += 1 

116 

117 # let's put Type Ia SN in here 

118 displayDict['subgroup'] = 'SNe Ia' 

119 metadata = '' 

120 # XXX-- use the light curves from PLASTICC here 

121 displayDict['Caption'] = 'Fraction of normal SNe Ia' 

122 sql = '' 

123 slicer = plasticc_slicer(plcs=plasticc_models_dict['SNIa-normal'], seed=42, badval=0) 

124 metric = Plasticc_metric(metricName='SNIa') 

125 # Set the maskval so that we count missing objects as zero. 

126 summary_stats = [metrics.MeanMetric(maskVal=0)] 

127 plotFuncs = [plots.HealpixSkyMap()] 

128 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, summaryMetrics=summary_stats, 

129 plotFuncs=plotFuncs, metadata=metadata, displayDict=displayDict) 

130 bundleList.append(bundle) 

131 displayDict['order'] += 1 

132 

133 # XXX--need some sort of metric for weak lensing and camera rotation. 

134 

135 ######################### 

136 # Variables and Transients 

137 ######################### 

138 displayDict = {'group': 'Variables and Transients', 'subgroup': 'Periodic Stars', 

139 'order': 0, 'caption': None} 

140 periods = [0.1, 0.5, 1., 2., 5., 10., 20.] # days 

141 

142 plotDict = {} 

143 metadata = '' 

144 sql = extraSql 

145 displayDict['Caption'] = 'Measure of how well a periodic signal can be measured combining amplitude and phase coverage. 1 is perfect, 0 is no way to fit' 

146 for period in periods: 

147 summary = metrics.PercentileMetric(percentile=10., metricName='10th %%-ile Periodic Quality, Period=%.1f days' % period) 

148 metric = metrics.PeriodicQualityMetric(period=period, starMag=20., metricName='Periodic Stars, P=%.1f d' % period) 

149 bundle = mb.MetricBundle(metric, healslicer, sql, metadata=metadata, 

150 displayDict=displayDict, plotDict=plotDict, 

151 plotFuncs=subsetPlots, summaryMetrics=summary) 

152 bundleList.append(bundle) 

153 displayDict['order'] += 1 

154 

155 # XXX add some PLASTICC metrics for kilovnova and tidal disruption events. 

156 displayDict['subgroup'] = 'KN' 

157 displayDict['caption'] = 'Fraction of Kilonova (from PLASTICC)' 

158 sql = '' 

159 slicer = plasticc_slicer(plcs=plasticc_models_dict['KN'], seed=43, badval=0) 

160 metric = Plasticc_metric(metricName='KN') 

161 summary_stats = [metrics.MeanMetric(maskVal=0)] 

162 plotFuncs = [plots.HealpixSkyMap()] 

163 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, summaryMetrics=summary_stats, 

164 plotFuncs=plotFuncs, metadata=metadata, 

165 displayDict=displayDict) 

166 bundleList.append(bundle) 

167 

168 displayDict['order'] += 1 

169 

170 # XXX -- would be good to add some microlensing events, for both MW and LMC/SMC. 

171 

172 ######################### 

173 # Milky Way 

174 ######################### 

175 

176 # Let's do the proper motion, parallax, and DCR degen of a 20nd mag star 

177 rmag = 20. 

178 displayDict = {'group': 'Milky Way', 'subgroup': 'Astrometry', 

179 'order': 0, 'caption': None} 

180 

181 sql = extraSql 

182 metadata = '' 

183 plotDict = {'percentileClip': 95.} 

184 metric = metrics.ParallaxMetric(metricName='Parallax Error r=%.1f' % (rmag), rmag=rmag, 

185 seeingCol=colmap['seeingGeom'], filterCol=colmap['filter'], 

186 m5Col=colmap['fiveSigmaDepth'], normalize=False) 

187 summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.median, decreasing=False, metricName='Median Parallax Error (WFD)')] 

188 summary.append(metrics.PercentileMetric(percentile=95, metricName='95th Percentile Parallax Error')) 

189 bundle = mb.MetricBundle(metric, healslicer, sql, metadata=metadata, 

190 displayDict=displayDict, plotDict=plotDict, 

191 plotFuncs=subsetPlots, summaryMetrics=summary) 

192 bundleList.append(bundle) 

193 displayDict['order'] += 1 

194 

195 metric = metrics.ProperMotionMetric(metricName='Proper Motion Error r=%.1f' % rmag, 

196 rmag=rmag, m5Col=colmap['fiveSigmaDepth'], 

197 mjdCol=colmap['mjd'], filterCol=colmap['filter'], 

198 seeingCol=colmap['seeingGeom'], normalize=False) 

199 summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.median, decreasing=False, metricName='Median Proper Motion Error (WFD)')] 

200 summary.append(metrics.PercentileMetric(metricName='95th Percentile Proper Motion Error')) 

201 bundle = mb.MetricBundle(metric, healslicer, sql, metadata=metadata, 

202 displayDict=displayDict, plotDict=plotDict, 

203 summaryMetrics=summary, plotFuncs=subsetPlots) 

204 bundleList.append(bundle) 

205 displayDict['order'] += 1 

206 

207 metric = metrics.ParallaxDcrDegenMetric(metricName='Parallax-DCR degeneracy r=%.1f' % (rmag), 

208 rmag=rmag, seeingCol=colmap['seeingEff'], 

209 filterCol=colmap['filter'], m5Col=colmap['fiveSigmaDepth']) 

210 caption = 'Correlation between parallax offset magnitude and hour angle for a r=%.1f star.' % (rmag) 

211 caption += ' (0 is good, near -1 or 1 is bad).' 

212 # XXX--not sure what kind of summary to do here 

213 summary = [metrics.MeanMetric(metricName='Mean DCR Degeneracy')] 

214 bundle = mb.MetricBundle(metric, healslicer, sql, metadata=metadata, 

215 displayDict=displayDict, summaryMetrics=summary, 

216 plotFuncs=subsetPlots) 

217 bundleList.append(bundle) 

218 displayDict['order'] += 1 

219 

220 for b in bundleList: 

221 b.setRunName(runName) 

222 

223 ######################### 

224 # DDF 

225 ######################### 

226 ddf_time_bundleDicts = [] 

227 if DDF: 

228 # Hide this import to avoid adding a dependency. 

229 from lsst.sims.featureScheduler.surveys import generate_dd_surveys 

230 ddf_surveys = generate_dd_surveys() 

231 # For doing a high-res sampling of the DDF for co-adds 

232 ddf_radius = 1.8 # Degrees 

233 ddf_nside = 512 

234 

235 ra, dec = hpid2RaDec(ddf_nside, np.arange(hp.nside2npix(ddf_nside))) 

236 

237 displayDict = {'group': 'DDF depths', 'subgroup': None, 

238 'order': 0, 'caption': None} 

239 

240 # Run the inter and intra gaps at the center of the DDFs 

241 for survey in ddf_surveys: 

242 slicer = slicers.UserPointsSlicer(ra=np.degrees(survey.ra), dec=np.degrees(survey.dec), useCamera=False) 

243 ddf_time_bundleDicts.append(interNight(colmap=colmap, slicer=slicer, 

244 runName=runName, nside=64, extraSql='note="%s"' % survey.survey_name, 

245 subgroup=survey.survey_name)[0]) 

246 ddf_time_bundleDicts.append(intraNight(colmap=colmap, slicer=slicer, 

247 runName=runName, nside=64, extraSql='note="%s"' % survey.survey_name, 

248 subgroup=survey.survey_name)[0]) 

249 

250 for survey in ddf_surveys: 

251 displayDict['subgroup'] = survey.survey_name 

252 # Crop off the u-band only DDF 

253 if survey.survey_name[0:4] != 'DD:u': 

254 dist_to_ddf = angularSeparation(ra, dec, np.degrees(survey.ra), np.degrees(survey.dec)) 

255 goodhp = np.where(dist_to_ddf <= ddf_radius) 

256 slicer = slicers.UserPointsSlicer(ra=ra[goodhp], dec=dec[goodhp], useCamera=False) 

257 for filtername in ['u', 'g', 'r', 'i', 'z', 'y']: 

258 metric = metrics.Coaddm5Metric(metricName=survey.survey_name+', ' + filtername) 

259 summary = [metrics.MedianMetric(metricName='median depth ' + survey.survey_name+', ' + filtername)] 

260 sql = extraSql + joiner + 'filter = "%s"' % filtername 

261 bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, 

262 displayDict=displayDict, summaryMetrics=summary, 

263 plotFuncs=[]) 

264 bundleList.append(bundle) 

265 displayDict['order'] += 1 

266 

267 displayDict = {'group': 'DDF Transients', 'subgroup': None, 

268 'order': 0, 'caption': None} 

269 for survey in ddf_surveys: 

270 displayDict['subgroup'] = survey.survey_name 

271 if survey.survey_name[0:4] != 'DD:u': 

272 slicer = plasticc_slicer(plcs=plasticc_models_dict['SNIa-normal'], seed=42, 

273 ra_cen=survey.ra, dec_cen=survey.dec, radius=np.radians(3.), useCamera=False) 

274 metric = Plasticc_metric(metricName=survey.survey_name+' SNIa') 

275 sql = '' 

276 summary_stats = [metrics.MeanMetric(maskVal=0)] 

277 plotFuncs = [plots.HealpixSkyMap()] 

278 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, summaryMetrics=summary_stats, 

279 plotFuncs=plotFuncs, metadata=metadata, 

280 displayDict=displayDict) 

281 bundleList.append(bundle) 

282 

283 displayDict['order'] += 1 

284 

285 for b in bundleList: 

286 b.setRunName(runName) 

287 

288 bundleDict = mb.makeBundlesDictFromList(bundleList) 

289 

290 intraDict = intraNight(colmap=colmap, runName=runName, nside=nside, 

291 extraSql=extraSql, extraMetadata=extraMetadata)[0] 

292 interDict = interNight(colmap=colmap, runName=runName, nside=nside, 

293 extraSql=extraSql, extraMetadata=extraMetadata)[0] 

294 

295 bundleDict.update(intraDict) 

296 bundleDict.update(interDict) 

297 for ddf_time in ddf_time_bundleDicts: 

298 bundleDict.update(ddf_time) 

299 

300 return bundleDict