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

3from lsst.sims.utils import hpid2RaDec, angularSeparation 

4import lsst.sims.maf.metrics as metrics 

5import lsst.sims.maf.slicers as slicers 

6import lsst.sims.maf.plots as plots 

7import lsst.sims.maf.maps as maps 

8import lsst.sims.maf.metricBundles as mb 

9from .common import standardSummary, filterList, combineMetadata 

10from .colMapDict import ColMapDict 

11from .srdBatch import fOBatch, astrometryBatch, rapidRevisitBatch 

12from .descWFDBatch import descWFDBatch 

13 

14 

15__all__ = ['scienceRadarBatch'] 

16 

17 

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

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

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

21 science drivers of LSST. 

22 

23 Parameters 

24 ---------- 

25 

26 """ 

27 # Hide dependencies 

28 from mafContrib.LSSObsStrategy.galaxyCountsMetric_extended import GalaxyCountsMetric_extended 

29 from mafContrib import (Plasticc_metric, plasticc_slicer, load_plasticc_lc, 

30 TdePopMetric, generateTdePopSlicer, 

31 generateMicrolensingSlicer, MicrolensingMetric) 

32 

33 if colmap is None: 

34 colmap = ColMapDict('fbs') 

35 

36 if extraSql is None: 

37 extraSql = '' 

38 if extraSql == '': 

39 joiner = '' 

40 else: 

41 joiner = ' and ' 

42 

43 bundleList = [] 

44 # Get some standard per-filter coloring and sql constraints 

45 filterlist, colors, filterorders, filtersqls, filtermetadata = filterList(all=False, 

46 extraSql=extraSql, 

47 extraMetadata=extraMetadata) 

48 

49 standardStats = standardSummary(withCount=False) 

50 

51 healslicer = slicers.HealpixSlicer(nside=nside) 

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

53 

54 # Load up the plastic light curves - SNIa-normal are loaded in descWFDBatch 

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

56 plasticc_models_dict = {} 

57 for model in models: 

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

59 

60 ######################### 

61 # SRD, DM, etc 

62 ######################### 

63 fOb = fOBatch(runName=runName, colmap=colmap, extraSql=extraSql, extraMetadata=extraMetadata, 

64 benchmarkArea=benchmarkArea, benchmarkNvisits=benchmarkNvisits) 

65 astromb = astrometryBatch(runName=runName, colmap=colmap, extraSql=extraSql, extraMetadata=extraMetadata) 

66 rapidb = rapidRevisitBatch(runName=runName, colmap=colmap, extraSql=extraSql, extraMetadata=extraMetadata) 

67 

68 # loop through and modify the display dicts - set SRD as group and their previous 'group' as the subgroup 

69 temp_list = [] 

70 for key in fOb: 

71 temp_list.append(fOb[key]) 

72 for key in astromb: 

73 temp_list.append(astromb[key]) 

74 for key in rapidb: 

75 temp_list.append(rapidb[key]) 

76 for metricb in temp_list: 

77 metricb.displayDict['subgroup'] = metricb.displayDict['group'].replace('SRD', '').lstrip(' ') 

78 metricb.displayDict['group'] = 'SRD' 

79 bundleList.extend(temp_list) 

80 

81 displayDict = {'group': 'SRD', 'subgroup': 'Year Coverage', 'order': 0, 

82 'caption': 'Number of years with observations.'} 

83 slicer = slicers.HealpixSlicer(nside=nside) 

84 metric = metrics.YearCoverageMetric() 

85 for f in filterlist: 

86 plotDict = {'colorMin': 7, 'colorMax': 10, 'color': colors[f]} 

87 summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.mean, decreasing=True, 

88 metricName='N Seasons (18k) %s' % f)] 

89 bundleList.append(mb.MetricBundle(metric, slicer, filtersqls[f], 

90 plotDict=plotDict, metadata=filtermetadata[f], 

91 displayDict=displayDict, summaryMetrics=summary)) 

92 

93 ######################### 

94 # Solar System 

95 ######################### 

96 # Generally, we need to run Solar System metrics separately; they're a multi-step process. 

97 

98 

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

100 # Galaxies 

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

102 

103 displayDict = {'group': 'Galaxies', 'subgroup': 'Galaxy Counts', 'order': 0, 'caption': None} 

104 plotDict = {'percentileClip': 95., 'nTicks': 5} 

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

106 metadata = combineMetadata(extraMetadata, 'i band') 

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

108 summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.sum, decreasing=True, 

109 metricName='N Galaxies (18k)')] 

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

111 # make sure slicer has cache off 

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

113 displayDict['caption'] = 'Number of galaxies across the sky, in i band. Generally, full survey footprint.' 

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

115 metadata=metadata, 

116 displayDict=displayDict, summaryMetrics=summary, 

117 plotFuncs=subsetPlots) 

118 bundleList.append(bundle) 

119 displayDict['order'] += 1 

120 

121 

122 ######################### 

123 # Cosmology 

124 ######################### 

125 

126 # note the desc batch does not currently take the extraSql or extraMetadata arguments. 

127 descBundleDict = descWFDBatch(colmap=colmap, runName=runName, nside=nside) 

128 for d in descBundleDict: 

129 bundleList.append(descBundleDict[d]) 

130 

131 ######################### 

132 # Variables and Transients 

133 ######################### 

134 displayDict = {'group': 'Variables/Transients', 

135 'subgroup': 'Periodic Stars', 

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

137 for period in [0.5, 1, 2,]: 

138 for magnitude in [21., 24.]: 

139 amplitudes = [0.05, 0.1, 1.0] 

140 periods = [period] * len(amplitudes) 

141 starMags = [magnitude] * len(amplitudes) 

142 

143 plotDict = {'nTicks': 3, 'colorMin': 0, 'colorMax': 3, 'xMin': 0, 'xMax': 3} 

144 metadata = combineMetadata('P_%.1f_Mag_%.0f_Amp_0.05-0.1-1' % (period, magnitude), 

145 extraMetadata) 

146 sql = None 

147 displayDict['caption'] = 'Metric evaluates if a periodic signal of period %.1f days could ' \ 

148 'be detected for an r=%i star. A variety of amplitudes of periodicity ' \ 

149 'are tested: [1, 0.1, and 0.05] mag amplitudes, which correspond to ' \ 

150 'metric values of [1, 2, or 3]. ' % (period, magnitude) 

151 metric = metrics.PeriodicDetectMetric(periods=periods, starMags=starMags, 

152 amplitudes=amplitudes, 

153 metricName='PeriodDetection') 

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

155 displayDict=displayDict, plotDict=plotDict, 

156 plotFuncs=subsetPlots, summaryMetrics=standardStats) 

157 bundleList.append(bundle) 

158 displayDict['order'] += 1 

159 

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

161 displayDict['subgroup'] = 'KN' 

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

163 displayDict['order'] = 0 

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

165 metric = Plasticc_metric(metricName='KN') 

166 plotFuncs = [plots.HealpixSkyMap()] 

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

168 bundle = mb.MetricBundle(metric, slicer, extraSql, runName=runName, summaryMetrics=summary_stats, 

169 plotFuncs=plotFuncs, metadata=extraMetadata, 

170 displayDict=displayDict) 

171 bundleList.append(bundle) 

172 

173 # Tidal Disruption Events 

174 displayDict['subgroup'] = 'TDE' 

175 displayDict['caption'] = 'TDE lightcurves that could be identified' 

176 

177 metric = TdePopMetric() 

178 slicer = generateTdePopSlicer() 

179 sql = '' 

180 plotDict = {'reduceFunc': np.sum, 'nside': 128} 

181 plotFuncs = [plots.HealpixSkyMap()] 

182 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, 

183 plotDict=plotDict, plotFuncs=plotFuncs, 

184 summaryMetrics=[metrics.MeanMetric(maskVal=0)], 

185 displayDict=displayDict) 

186 bundleList.append(bundle) 

187 

188 

189 # Microlensing events 

190 displayDict['subgroup'] = 'Microlensing' 

191 displayDict['caption'] = 'Fast microlensing events' 

192 

193 plotDict = {'nside': 128} 

194 sql = '' 

195 slicer = generateMicrolensingSlicer(min_crossing_time=1, max_crossing_time=10) 

196 metric = MicrolensingMetric(metricName='Fast Microlensing') 

197 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, 

198 summaryMetrics=[metrics.MeanMetric(maskVal=0)], 

199 plotFuncs=[plots.HealpixSkyMap()], metadata=extraMetadata, 

200 displayDict=displayDict, plotDict=plotDict) 

201 bundleList.append(bundle) 

202 

203 displayDict['caption'] = 'Slow microlensing events' 

204 slicer = generateMicrolensingSlicer(min_crossing_time=100, max_crossing_time=1500) 

205 metric = MicrolensingMetric(metricName='Slow Microlensing') 

206 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, 

207 summaryMetrics=[metrics.MeanMetric(maskVal=0)], 

208 plotFuncs=[plots.HealpixSkyMap()], metadata=extraMetadata, 

209 displayDict=displayDict, plotDict=plotDict) 

210 bundleList.append(bundle) 

211 

212 ######################### 

213 # Milky Way 

214 ######################### 

215 

216 displayDict = {'group': 'Milky Way', 'subgroup': ''} 

217 

218 displayDict['subgroup'] = 'N stars' 

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

220 sum_stats = [metrics.SumMetric(metricName='Total N Stars, crowding')] 

221 for f in filterlist: 

222 stellar_map = maps.StellarDensityMap(filtername=f) 

223 displayDict['order'] = filterorders[f] 

224 displayDict['caption'] = 'Number of stars in %s band with an measurement error due to crowding ' \ 

225 'of less than 0.2 mag' % f 

226 # Configure the NstarsMetric - note 'filtername' refers to the filter in which to evaluate crowding 

227 metric = metrics.NstarsMetric(crowding_error=0.2, filtername=f, ignore_crowding=False, 

228 seeingCol=colmap['seeingGeom'], m5Col=colmap['fiveSigmaDepth'], 

229 maps=[]) 

230 plotDict = {'nTicks': 5, 'logScale': True, 'colorMin': 100} 

231 bundle = mb.MetricBundle(metric, slicer, filtersqls[f], runName=runName, 

232 summaryMetrics=sum_stats, 

233 plotFuncs=subsetPlots, plotDict=plotDict, 

234 displayDict=displayDict, mapsList=[stellar_map]) 

235 bundleList.append(bundle) 

236 

237 

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

239 sum_stats = [metrics.SumMetric(metricName='Total N Stars, no crowding')] 

240 for f in filterlist: 

241 stellar_map = maps.StellarDensityMap(filtername=f) 

242 displayDict['order'] = filterorders[f] 

243 displayDict['caption'] = 'Number of stars in %s band with an measurement error ' \ 

244 'of less than 0.2 mag, not considering crowding' % f 

245 # Configure the NstarsMetric - note 'filtername' refers to the filter in which to evaluate crowding 

246 metric = metrics.NstarsMetric(crowding_error=0.2, filtername=f, ignore_crowding=True, 

247 seeingCol=colmap['seeingGeom'], m5Col=colmap['fiveSigmaDepth'], 

248 metricName='Nstars_no_crowding', maps=[]) 

249 plotDict = {'nTicks': 5, 'logScale': True, 'colorMin': 100} 

250 bundle = mb.MetricBundle(metric, slicer, filtersqls[f], runName=runName, 

251 summaryMetrics=sum_stats, 

252 plotFuncs=subsetPlots, plotDict=plotDict, 

253 displayDict=displayDict, mapsList=[stellar_map]) 

254 bundleList.append(bundle) 

255 

256 

257 ######################### 

258 # DDF 

259 ######################### 

260 if DDF: 

261 # Hide this import to avoid adding a dependency. 

262 from lsst.sims.featureScheduler.surveys import generate_dd_surveys, Deep_drilling_survey 

263 ddf_surveys = generate_dd_surveys() 

264 

265 # Add on the Euclid fields 

266 # XXX--to update. Should have a spot where all the DDF locations are stored. 

267 ddf_surveys.append(Deep_drilling_survey([], 58.97, -49.28, survey_name='DD:EDFSa')) 

268 ddf_surveys.append(Deep_drilling_survey([], 63.6, -47.60, survey_name='DD:EDFSb')) 

269 

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

271 ddf_radius = 1.8 # Degrees 

272 ddf_nside = 512 

273 

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

275 

276 displayDict = {'group': 'DDF depths', 'subgroup': None} 

277 

278 for survey in ddf_surveys: 

279 displayDict['subgroup'] = survey.survey_name 

280 # Crop off the u-band only DDF 

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

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

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

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

285 for f in filterlist: 

286 metric = metrics.Coaddm5Metric(metricName=survey.survey_name + ', ' + f) 

287 summary = [metrics.MedianMetric(metricName='Median depth ' + survey.survey_name+', ' + f)] 

288 plotDict = {'color': colors[f]} 

289 sql = filtersqls[f] 

290 displayDict['order'] = filterorders[f] 

291 displayDict['caption'] = 'Coadded m5 depth in %s band.' % (f) 

292 bundle = mb.MetricBundle(metric, slicer, sql, metadata=filtermetadata[f], 

293 displayDict=displayDict, summaryMetrics=summary, 

294 plotFuncs=[], plotDict=plotDict) 

295 bundleList.append(bundle) 

296 

297 displayDict = {'group': 'DDF Transients', 'subgroup': None} 

298 for survey in ddf_surveys: 

299 displayDict['subgroup'] = survey.survey_name 

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

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

302 ra_cen=survey.ra, dec_cen=survey.dec, radius=np.radians(3.), 

303 useCamera=False) 

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

305 sql = extraSql 

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

307 plotFuncs = [plots.HealpixSkyMap()] 

308 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, 

309 summaryMetrics=summary_stats, 

310 plotFuncs=plotFuncs, metadata=extraMetadata, 

311 displayDict=displayDict) 

312 bundleList.append(bundle) 

313 displayDict['order'] = 10 

314 

315 # Set the runName for all bundles and return the bundleDict. 

316 for b in bundleList: 

317 b.setRunName(runName) 

318 bundleDict = mb.makeBundlesDictFromList(bundleList) 

319 

320 return bundleDict