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

43 extraMetadata=None) 

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.5] 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 bundle = mb.MetricBundle(metric, slicer, extraSql, runName=runName, summaryMetrics=standardStats, 

216 plotFuncs=plotFuncs, metadata=extraMetadata, 

217 displayDict=displayDict) 

218 bundleList.append(bundle) 

219 

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

221 

222 ######################### 

223 # Milky Way 

224 ######################### 

225 

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

227 

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

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

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

231 for f in filterlist: 

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

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

234 'of less than 0.1 mag' % f 

235 metric = metrics.NstarsMetric() 

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

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

238 summaryMetrics=sum_stats, 

239 plotFuncs=subsetPlots, plotDict=plotDict, 

240 displayDict=displayDict) 

241 bundleList.append(bundle) 

242 

243 ######################### 

244 # DDF 

245 ######################### 

246 if DDF: 

247 # Hide this import to avoid adding a dependency. 

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

249 ddf_surveys = generate_dd_surveys() 

250 

251 # Add on the Euclid fields 

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

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

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

255 

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

257 ddf_radius = 1.8 # Degrees 

258 ddf_nside = 512 

259 

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

261 

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

263 

264 for survey in ddf_surveys: 

265 displayDict['subgroup'] = survey.survey_name 

266 # Crop off the u-band only DDF 

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

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

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

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

271 for f in filterlist: 

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

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

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

275 sql = filtersqls[f] 

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

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

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

279 displayDict=displayDict, summaryMetrics=summary, 

280 plotFuncs=[], plotDict=plotDict) 

281 bundleList.append(bundle) 

282 

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

284 for survey in ddf_surveys: 

285 displayDict['subgroup'] = survey.survey_name 

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

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

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

289 useCamera=False) 

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

291 sql = extraSql 

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

293 plotFuncs = [plots.HealpixSkyMap()] 

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

295 summaryMetrics=summary_stats, 

296 plotFuncs=plotFuncs, metadata=extraMetadata, 

297 displayDict=displayDict) 

298 bundleList.append(bundle) 

299 displayDict['order'] = 10 

300 

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

302 for b in bundleList: 

303 b.setRunName(runName) 

304 bundleDict = mb.makeBundlesDictFromList(bundleList) 

305 

306 return bundleDict