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 

12 

13 

14__all__ = ['scienceRadarBatch'] 

15 

16 

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

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

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

20 science drivers of LSST. 

21 

22 Parameters 

23 ---------- 

24 

25 """ 

26 # Hide dependencies 

27 from mafContrib.LSSObsStrategy.galaxyCountsMetric_extended import GalaxyCountsMetric_extended 

28 from mafContrib import (Plasticc_metric, plasticc_slicer, load_plasticc_lc, 

29 TdePopMetric, generateTdePopSlicer, 

30 generateMicrolensingSlicer, MicrolensingMetric) 

31 

32 if colmap is None: 

33 colmap = ColMapDict('fbs') 

34 

35 if extraSql is None: 

36 extraSql = '' 

37 if extraSql == '': 

38 joiner = '' 

39 else: 

40 joiner = ' and ' 

41 

42 bundleList = [] 

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

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

45 extraSql=extraSql, 

46 extraMetadata=extraMetadata) 

47 

48 standardStats = standardSummary(withCount=False) 

49 

50 healslicer = slicers.HealpixSlicer(nside=nside) 

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

52 

53 # Load up the plastic light curves 

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

55 plasticc_models_dict = {} 

56 for model in models: 

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

58 

59 ######################### 

60 # SRD, DM, etc 

61 ######################### 

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

63 benchmarkArea=benchmarkArea, benchmarkNvisits=benchmarkNvisits) 

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

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

66 

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

68 temp_list = [] 

69 for key in fOb: 

70 temp_list.append(fOb[key]) 

71 for key in astromb: 

72 temp_list.append(astromb[key]) 

73 for key in rapidb: 

74 temp_list.append(rapidb[key]) 

75 for metricb in temp_list: 

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

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

78 bundleList.extend(temp_list) 

79 

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

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

82 slicer = slicers.HealpixSlicer(nside=nside) 

83 metric = metrics.YearCoverageMetric() 

84 for f in filterlist: 

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

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

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

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

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

90 displayDict=displayDict, summaryMetrics=summary)) 

91 

92 ######################### 

93 # Solar System 

94 ######################### 

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

96 

97 ######################### 

98 # Cosmology 

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

100 

101 displayDict = {'group': 'Cosmology', 'subgroup': 'Galaxy Counts', 'order': 0, 'caption': None} 

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

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

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

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

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

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

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 metadata=metadata, 

113 displayDict=displayDict, summaryMetrics=summary, 

114 plotFuncs=subsetPlots) 

115 bundleList.append(bundle) 

116 displayDict['order'] += 1 

117 

118 # let's put Type Ia SN in here 

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

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

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

122 sql = extraSql 

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=extraMetadata, displayDict=displayDict) 

130 bundleList.append(bundle) 

131 displayDict['order'] += 1 

132 

133 displayDict['subgroup'] = 'Camera Rotator' 

134 displayDict['caption'] = 'Kuiper statistic (0 is uniform, 1 is delta function) of the ' 

135 slicer = slicers.HealpixSlicer(nside=nside) 

136 metric1 = metrics.KuiperMetric('rotSkyPos') 

137 metric2 = metrics.KuiperMetric('rotTelPos') 

138 for f in filterlist: 

139 for m in [metric1, metric2]: 

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

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

142 displayDict['caption'] += f"{m.colname} for visits in {f} band." 

143 bundleList.append(mb.MetricBundle(m, slicer, filtersqls[f], plotDict=plotDict, 

144 displayDict=displayDict, summaryMetrics=standardStats, 

145 plotFuncs=subsetPlots)) 

146 

147 # XXX--need some sort of metric for weak lensing 

148 

149 ######################### 

150 # Variables and Transients 

151 ######################### 

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

153 'subgroup': 'Periodic Stars', 

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

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

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

157 amplitudes = [0.05, 0.1, 1.0] 

158 periods = [period] * len(amplitudes) 

159 starMags = [magnitude] * len(amplitudes) 

160 

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

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

163 extraMetadata) 

164 sql = None 

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

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

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

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

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

170 amplitudes=amplitudes, 

171 metricName='PeriodDetection') 

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

173 displayDict=displayDict, plotDict=plotDict, 

174 plotFuncs=subsetPlots, summaryMetrics=standardStats) 

175 bundleList.append(bundle) 

176 displayDict['order'] += 1 

177 

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

179 displayDict['subgroup'] = 'KN' 

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

181 displayDict['order'] = 0 

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

183 metric = Plasticc_metric(metricName='KN') 

184 plotFuncs = [plots.HealpixSkyMap()] 

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

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

187 plotFuncs=plotFuncs, metadata=extraMetadata, 

188 displayDict=displayDict) 

189 bundleList.append(bundle) 

190 

191 # Tidal Disruption Events 

192 displayDict['subgroup'] = 'TDE' 

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

194 

195 metric = TdePopMetric() 

196 slicer = generateTdePopSlicer() 

197 sql = '' 

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

199 plotFuncs = [plots.HealpixSkyMap()] 

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

201 plotDict=plotDict, plotFuncs=plotFuncs, 

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

203 displayDict=displayDict) 

204 bundleList.append(bundle) 

205 

206 

207 # Microlensing events 

208 displayDict['subgroup'] = 'Microlensing' 

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

210 

211 plotDict = {'nside': 128} 

212 sql = '' 

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

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

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

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

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

218 displayDict=displayDict, plotDict=plotDict) 

219 bundleList.append(bundle) 

220 

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

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

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

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

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

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

227 displayDict=displayDict, plotDict=plotDict) 

228 bundleList.append(bundle) 

229 

230 ######################### 

231 # Milky Way 

232 ######################### 

233 

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

235 

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

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

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

239 for f in filterlist: 

240 stellar_map = maps.StellarDensityMap(filtername=f) 

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

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

243 'of less than 0.2 mag' % f 

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

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

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

247 maps=[]) 

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

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

250 summaryMetrics=sum_stats, 

251 plotFuncs=subsetPlots, plotDict=plotDict, 

252 displayDict=displayDict, mapsList=[stellar_map]) 

253 bundleList.append(bundle) 

254 

255 

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

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

258 for f in filterlist: 

259 stellar_map = maps.StellarDensityMap(filtername=f) 

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

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

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

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

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

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

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

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

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

269 summaryMetrics=sum_stats, 

270 plotFuncs=subsetPlots, plotDict=plotDict, 

271 displayDict=displayDict, mapsList=[stellar_map]) 

272 bundleList.append(bundle) 

273 

274 

275 ######################### 

276 # DDF 

277 ######################### 

278 if DDF: 

279 # Hide this import to avoid adding a dependency. 

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

281 ddf_surveys = generate_dd_surveys() 

282 

283 # Add on the Euclid fields 

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

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

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

287 

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

289 ddf_radius = 1.8 # Degrees 

290 ddf_nside = 512 

291 

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

293 

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

295 

296 for survey in ddf_surveys: 

297 displayDict['subgroup'] = survey.survey_name 

298 # Crop off the u-band only DDF 

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

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

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

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

303 for f in filterlist: 

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

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

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

307 sql = filtersqls[f] 

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

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

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

311 displayDict=displayDict, summaryMetrics=summary, 

312 plotFuncs=[], plotDict=plotDict) 

313 bundleList.append(bundle) 

314 

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

316 for survey in ddf_surveys: 

317 displayDict['subgroup'] = survey.survey_name 

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

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

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

321 useCamera=False) 

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

323 sql = extraSql 

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

325 plotFuncs = [plots.HealpixSkyMap()] 

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

327 summaryMetrics=summary_stats, 

328 plotFuncs=plotFuncs, metadata=extraMetadata, 

329 displayDict=displayDict) 

330 bundleList.append(bundle) 

331 displayDict['order'] = 10 

332 

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

334 for b in bundleList: 

335 b.setRunName(runName) 

336 bundleDict = mb.makeBundlesDictFromList(bundleList) 

337 

338 return bundleDict