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.metricBundles as mb 

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

9from .common import standardSummary, filterList, combineMetadata 

10from .colMapDict import ColMapDict 

11from .srdBatch import fOBatch, astrometryBatch, rapidRevisitBatch 

12 

13__all__ = ['scienceRadarBatch'] 

14 

15 

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

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

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

19 science drivers of LSST. 

20 

21 Parameters 

22 ---------- 

23 

24 """ 

25 # Hide dependencies 

26 from mafContrib.LSSObsStrategy.galaxyCountsMetric_extended import GalaxyCountsMetric_extended 

27 from mafContrib import Plasticc_metric, plasticc_slicer, load_plasticc_lc, TDEsAsciiMetric 

28 

29 if colmap is None: 

30 colmap = ColMapDict('fbs') 

31 

32 if extraSql is None: 

33 extraSql = '' 

34 if extraSql == '': 

35 joiner = '' 

36 else: 

37 joiner = ' and ' 

38 

39 bundleList = [] 

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

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

42 extraSql=extraSql, 

43 extraMetadata=extraMetadata) 

44 

45 standardStats = standardSummary(withCount=False) 

46 

47 healslicer = slicers.HealpixSlicer(nside=nside) 

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

49 

50 # Load up the plastic light curves 

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

52 plasticc_models_dict = {} 

53 for model in models: 

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

55 

56 ######################### 

57 # SRD, DM, etc 

58 ######################### 

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

60 benchmarkArea=benchmarkArea, benchmarkNvisits=benchmarkNvisits) 

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

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

63 

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

65 temp_list = [] 

66 for key in fOb: 

67 temp_list.append(fOb[key]) 

68 for key in astromb: 

69 temp_list.append(astromb[key]) 

70 for key in rapidb: 

71 temp_list.append(rapidb[key]) 

72 for metricb in temp_list: 

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

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

75 bundleList.extend(temp_list) 

76 

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

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

79 slicer = slicers.HealpixSlicer(nside=nside) 

80 metric = metrics.YearCoverageMetric() 

81 for f in filterlist: 

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

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

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

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

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

87 displayDict=displayDict, summaryMetrics=summary)) 

88 

89 ######################### 

90 # Solar System 

91 ######################### 

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

93 

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

95 # Cosmology 

96 ######################### 

97 

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

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

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

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

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

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

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

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

106 # make sure slicer has cache off 

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

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

109 metadata=metadata, 

110 displayDict=displayDict, summaryMetrics=summary, 

111 plotFuncs=subsetPlots) 

112 bundleList.append(bundle) 

113 displayDict['order'] += 1 

114 

115 # let's put Type Ia SN in here 

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

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

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

119 sql = extraSql 

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

121 metric = Plasticc_metric(metricName='SNIa') 

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

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

124 plotFuncs = [plots.HealpixSkyMap()] 

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

126 plotFuncs=plotFuncs, metadata=extraMetadata, displayDict=displayDict) 

127 bundleList.append(bundle) 

128 displayDict['order'] += 1 

129 

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

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

132 slicer = slicers.HealpixSlicer(nside=nside) 

133 metric1 = metrics.KuiperMetric('rotSkyPos') 

134 metric2 = metrics.KuiperMetric('rotTelPos') 

135 for f in filterlist: 

136 for m in [metric1, metric2]: 

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

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

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

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

141 displayDict=displayDict, summaryMetrics=standardStats, 

142 plotFuncs=subsetPlots)) 

143 

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

145 

146 ######################### 

147 # Variables and Transients 

148 ######################### 

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

150 'subgroup': 'Periodic Stars', 

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

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

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

154 amplitudes = [0.05, 0.1, 1.0] 

155 periods = [period] * len(amplitudes) 

156 starMags = [magnitude] * len(amplitudes) 

157 

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

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

160 extraMetadata) 

161 sql = None 

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

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

164 'are tested: [1, 0.1, and 0.05] magnitudes, which correspond to metric ' \ 

165 'values of [1, 2, or 3]. ' % (max(starMags), max(amplitudes)) 

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

167 amplitudes=amplitudes, 

168 metricName='PeriodDetection') 

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

170 displayDict=displayDict, plotDict=plotDict, 

171 plotFuncs=subsetPlots, summaryMetrics=standardStats) 

172 bundleList.append(bundle) 

173 displayDict['order'] += 1 

174 

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

176 displayDict['subgroup'] = 'KN' 

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

178 displayDict['order'] = 0 

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

180 metric = Plasticc_metric(metricName='KN') 

181 plotFuncs = [plots.HealpixSkyMap()] 

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

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

184 plotFuncs=plotFuncs, metadata=extraMetadata, 

185 displayDict=displayDict) 

186 bundleList.append(bundle) 

187 

188 # Tidal Disruption Events 

189 displayDict['subgroup'] = 'TDE' 

190 displayDict['caption'] = 'Fraction of TDE lightcurves that could be identified.' 

191 detectSNR = {'u': 5, 'g': 5, 'r': 5, 'i': 5, 'z': 5, 'y': 5} 

192 

193 # light curve parameters 

194 epochStart = -22 

195 peakEpoch = 0 

196 nearPeakT = 10 

197 postPeakT = 14 # two weeks 

198 nPhaseCheck = 1 

199 

200 # condition parameters 

201 nObsTotal = {'u': 0, 'g': 0, 'r': 0, 'i': 0, 'z': 0, 'y': 0} 

202 nObsPrePeak = 1 

203 nObsNearPeak = {'u': 0, 'g': 0, 'r': 0, 'i': 0, 'z': 0, 'y': 0} 

204 nFiltersNearPeak = 3 

205 nObsPostPeak = 0 

206 nFiltersPostPeak = 2 

207 

208 metric = TDEsAsciiMetric(asciifile=None, 

209 detectSNR=detectSNR, epochStart=epochStart, peakEpoch=peakEpoch, 

210 nearPeakT=nearPeakT, postPeakT=postPeakT, nPhaseCheck=nPhaseCheck, 

211 nObsTotal=nObsTotal, nObsPrePeak=nObsPrePeak, 

212 nObsNearPeak=nObsNearPeak, nFiltersNearPeak=nFiltersNearPeak, 

213 nObsPostPeak=nObsPostPeak, nFiltersPostPeak=nFiltersPostPeak) 

214 slicer = slicers.HealpixSlicer(nside=32) 

215 sql = extraSql + joiner + "note not like '%DD%'" 

216 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, summaryMetrics=standardStats, 

217 plotFuncs=plotFuncs, metadata=extraMetadata, 

218 displayDict=displayDict) 

219 bundleList.append(bundle) 

220 

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

222 

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

224 # Milky Way 

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

226 

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

228 

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

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

231 sum_stats = [metrics.SumMetric(metricName='Total N Stars')] 

232 for f in filterlist: 

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

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

235 'of less than 0.1 mag' % f 

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

237 metric = metrics.NstarsMetric(crowding_error=0.1, filtername='r', 

238 seeingCol=colmap['seeingGeom'], m5Col=colmap['fiveSigmaDepth']) 

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

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

241 summaryMetrics=sum_stats, 

242 plotFuncs=subsetPlots, plotDict=plotDict, 

243 displayDict=displayDict) 

244 bundleList.append(bundle) 

245 

246 ######################### 

247 # DDF 

248 ######################### 

249 if DDF: 

250 # Hide this import to avoid adding a dependency. 

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

252 ddf_surveys = generate_dd_surveys() 

253 

254 # Add on the Euclid fields 

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

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

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

258 

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

260 ddf_radius = 1.8 # Degrees 

261 ddf_nside = 512 

262 

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

264 

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

266 

267 for survey in ddf_surveys: 

268 displayDict['subgroup'] = survey.survey_name 

269 # Crop off the u-band only DDF 

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

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

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

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

274 for f in filterlist: 

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

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

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

278 sql = filtersqls[f] 

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

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

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

282 displayDict=displayDict, summaryMetrics=summary, 

283 plotFuncs=[], plotDict=plotDict) 

284 bundleList.append(bundle) 

285 

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

287 for survey in ddf_surveys: 

288 displayDict['subgroup'] = survey.survey_name 

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

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

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

292 useCamera=False) 

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

294 sql = extraSql 

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

296 plotFuncs = [plots.HealpixSkyMap()] 

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

298 summaryMetrics=summary_stats, 

299 plotFuncs=plotFuncs, metadata=extraMetadata, 

300 displayDict=displayDict) 

301 bundleList.append(bundle) 

302 displayDict['order'] = 10 

303 

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

305 for b in bundleList: 

306 b.setRunName(runName) 

307 bundleDict = mb.makeBundlesDictFromList(bundleList) 

308 

309 return bundleDict