Coverage for python/lsst/sims/maf/batches/scienceRadarBatch.py : 6%

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
15__all__ = ['scienceRadarBatch']
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.
23 Parameters
24 ----------
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)
33 if colmap is None:
34 colmap = ColMapDict('fbs')
36 if extraSql is None:
37 extraSql = ''
38 if extraSql == '':
39 joiner = ''
40 else:
41 joiner = ' and '
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)
49 standardStats = standardSummary(withCount=False)
51 healslicer = slicers.HealpixSlicer(nside=nside)
52 subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
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())
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)
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)
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))
93 #########################
94 # Solar System
95 #########################
96 # Generally, we need to run Solar System metrics separately; they're a multi-step process.
99 #########################
100 # Galaxies
101 #########################
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
122 #########################
123 # Cosmology
124 #########################
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])
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)
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
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)
173 # Tidal Disruption Events
174 displayDict['subgroup'] = 'TDE'
175 displayDict['caption'] = 'TDE lightcurves that could be identified'
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)
189 # Microlensing events
190 displayDict['subgroup'] = 'Microlensing'
191 displayDict['caption'] = 'Fast microlensing events'
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)
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)
212 #########################
213 # Milky Way
214 #########################
216 displayDict = {'group': 'Milky Way', 'subgroup': ''}
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)
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)
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()
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'))
270 # For doing a high-res sampling of the DDF for co-adds
271 ddf_radius = 1.8 # Degrees
272 ddf_nside = 512
274 ra, dec = hpid2RaDec(ddf_nside, np.arange(hp.nside2npix(ddf_nside)))
276 displayDict = {'group': 'DDF depths', 'subgroup': None}
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)
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
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)
320 return bundleDict