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
14__all__ = ['scienceRadarBatch']
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.
22 Parameters
23 ----------
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)
32 if colmap is None:
33 colmap = ColMapDict('fbs')
35 if extraSql is None:
36 extraSql = ''
37 if extraSql == '':
38 joiner = ''
39 else:
40 joiner = ' and '
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)
48 standardStats = standardSummary(withCount=False)
50 healslicer = slicers.HealpixSlicer(nside=nside)
51 subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
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())
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)
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)
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))
92 #########################
93 # Solar System
94 #########################
95 # Generally, we need to run Solar System metrics separately; they're a multi-step process.
97 #########################
98 # Cosmology
99 #########################
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
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
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))
147 # XXX--need some sort of metric for weak lensing
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)
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
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)
191 # Tidal Disruption Events
192 displayDict['subgroup'] = 'TDE'
193 displayDict['caption'] = 'TDE lightcurves that could be identified'
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)
207 # Microlensing events
208 displayDict['subgroup'] = 'Microlensing'
209 displayDict['caption'] = 'Fast microlensing events'
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)
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)
230 #########################
231 # Milky Way
232 #########################
234 displayDict = {'group': 'Milky Way', 'subgroup': ''}
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)
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)
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()
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'))
288 # For doing a high-res sampling of the DDF for co-adds
289 ddf_radius = 1.8 # Degrees
290 ddf_nside = 512
292 ra, dec = hpid2RaDec(ddf_nside, np.arange(hp.nside2npix(ddf_nside)))
294 displayDict = {'group': 'DDF depths', 'subgroup': None}
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)
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
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)
338 return bundleDict