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 healpy as hp
2import lsst.sims.maf.metrics as metrics
3import lsst.sims.maf.slicers as slicers
4import lsst.sims.maf.stackers as stackers
5import lsst.sims.maf.plots as plots
6import lsst.sims.maf.metricBundles as mb
7from lsst.sims.maf.batches import intraNight, interNight
8from .colMapDict import ColMapDict
9import numpy as np
10from lsst.sims.utils import hpid2RaDec, angularSeparation
12__all__ = ['scienceRadarBatch']
15def scienceRadarBatch(colmap=None, runName='', extraSql=None, extraMetadata=None, nside=64,
16 benchmarkArea=18000, benchmarkNvisits=825, DDF=True):
17 """A batch of metrics for looking at survey performance relative to the SRD and the main
18 science drivers of LSST.
20 Parameters
21 ----------
23 """
24 # Hide dependencies
25 from mafContrib.LSSObsStrategy.galaxyCountsMetric_extended import GalaxyCountsMetric_extended
26 from mafContrib import Plasticc_metric, plasticc_slicer, load_plasticc_lc
28 if colmap is None:
29 colmap = ColMapDict('opsimV4')
31 if extraSql is None:
32 extraSql = ''
33 if extraSql == '':
34 joiner = ''
35 else:
36 joiner = ' and '
38 bundleList = []
40 healslicer = slicers.HealpixSlicer(nside=nside)
41 subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
43 # Load up the plastic light curves
44 models = ['SNIa-normal', 'KN']
45 plasticc_models_dict = {}
46 for model in models:
47 plasticc_models_dict[model] = list(load_plasticc_lc(model=model).values())
49 #########################
50 # SRD, DM, etc
51 #########################
52 sql = extraSql
53 displayDict = {'group': 'SRD', 'subgroup': 'fO', 'order': 0, 'caption': None}
54 metric = metrics.CountMetric(col=colmap['mjd'], metricName='fO')
55 plotDict = {'xlabel': 'Number of Visits', 'Asky': benchmarkArea,
56 'Nvisit': benchmarkNvisits, 'xMin': 0, 'xMax': 1500}
57 summaryMetrics = [metrics.fOArea(nside=nside, norm=False, metricName='fOArea',
58 Asky=benchmarkArea, Nvisit=benchmarkNvisits),
59 metrics.fOArea(nside=nside, norm=True, metricName='fOArea/benchmark',
60 Asky=benchmarkArea, Nvisit=benchmarkNvisits),
61 metrics.fONv(nside=nside, norm=False, metricName='fONv',
62 Asky=benchmarkArea, Nvisit=benchmarkNvisits),
63 metrics.fONv(nside=nside, norm=True, metricName='fONv/benchmark',
64 Asky=benchmarkArea, Nvisit=benchmarkNvisits)]
65 caption = 'The FO metric evaluates the overall efficiency of observing. '
66 caption += ('foNv: out of %.2f sq degrees, the area receives at least X and a median of Y visits '
67 '(out of %d, if compared to benchmark). ' % (benchmarkArea, benchmarkNvisits))
68 caption += ('fOArea: this many sq deg (out of %.2f sq deg if compared '
69 'to benchmark) receives at least %d visits. ' % (benchmarkArea, benchmarkNvisits))
70 displayDict['caption'] = caption
71 bundle = mb.MetricBundle(metric, healslicer, sql, plotDict=plotDict,
72 displayDict=displayDict, summaryMetrics=summaryMetrics,
73 plotFuncs=[plots.FOPlot()])
74 bundleList.append(bundle)
75 displayDict['order'] += 1
77 displayDict = {'group': 'SRD', 'subgroup': 'Gaps', 'order': 0, 'caption': None}
78 plotDict = {'percentileClip': 95.}
79 for filtername in 'ugrizy':
80 sql = extraSql + joiner + 'filter ="%s"' % filtername
81 metric = metrics.MaxGapMetric()
82 summaryMetrics = [metrics.PercentileMetric(percentile=95, metricName='95th percentile of Max gap, %s' % filtername)]
83 bundle = mb.MetricBundle(metric, healslicer, sql, plotFuncs=subsetPlots,
84 summaryMetrics=summaryMetrics, displayDict=displayDict, plotDict=plotDict)
85 bundleList.append(bundle)
86 displayDict['order'] += 1
88 #########################
89 # Solar System
90 #########################
92 # XXX -- may want to do Solar system seperatly
94 # XXX--fraction of NEOs detected (assume some nominal size and albido)
95 # XXX -- fraction of MBAs detected
96 # XXX -- fraction of KBOs detected
97 # XXX--any others? Planet 9s? Comets? Neptune Trojans?
99 #########################
100 # Cosmology
101 #########################
103 displayDict = {'group': 'Cosmology', 'subgroup': 'galaxy counts', 'order': 0, 'caption': None}
104 plotDict = {'percentileClip': 95.}
105 sql = extraSql + joiner + 'filter="i"'
106 metric = GalaxyCountsMetric_extended(filterBand='i', redshiftBin='all', nside=nside)
107 summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.sum, decreasing=True, metricName='N Galaxies (WFD)')]
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 displayDict=displayDict, summaryMetrics=summary,
113 plotFuncs=subsetPlots)
114 bundleList.append(bundle)
115 displayDict['order'] += 1
117 # let's put Type Ia SN in here
118 displayDict['subgroup'] = 'SNe Ia'
119 metadata = ''
120 # XXX-- use the light curves from PLASTICC here
121 displayDict['Caption'] = 'Fraction of normal SNe Ia'
122 sql = ''
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=metadata, displayDict=displayDict)
130 bundleList.append(bundle)
131 displayDict['order'] += 1
133 # XXX--need some sort of metric for weak lensing and camera rotation.
135 #########################
136 # Variables and Transients
137 #########################
138 displayDict = {'group': 'Variables and Transients', 'subgroup': 'Periodic Stars',
139 'order': 0, 'caption': None}
140 periods = [0.1, 0.5, 1., 2., 5., 10., 20.] # days
142 plotDict = {}
143 metadata = ''
144 sql = extraSql
145 displayDict['Caption'] = 'Measure of how well a periodic signal can be measured combining amplitude and phase coverage. 1 is perfect, 0 is no way to fit'
146 for period in periods:
147 summary = metrics.PercentileMetric(percentile=10., metricName='10th %%-ile Periodic Quality, Period=%.1f days' % period)
148 metric = metrics.PeriodicQualityMetric(period=period, starMag=20., metricName='Periodic Stars, P=%.1f d' % period)
149 bundle = mb.MetricBundle(metric, healslicer, sql, metadata=metadata,
150 displayDict=displayDict, plotDict=plotDict,
151 plotFuncs=subsetPlots, summaryMetrics=summary)
152 bundleList.append(bundle)
153 displayDict['order'] += 1
155 # XXX add some PLASTICC metrics for kilovnova and tidal disruption events.
156 displayDict['subgroup'] = 'KN'
157 displayDict['caption'] = 'Fraction of Kilonova (from PLASTICC)'
158 sql = ''
159 slicer = plasticc_slicer(plcs=plasticc_models_dict['KN'], seed=43, badval=0)
160 metric = Plasticc_metric(metricName='KN')
161 summary_stats = [metrics.MeanMetric(maskVal=0)]
162 plotFuncs = [plots.HealpixSkyMap()]
163 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, summaryMetrics=summary_stats,
164 plotFuncs=plotFuncs, metadata=metadata,
165 displayDict=displayDict)
166 bundleList.append(bundle)
168 displayDict['order'] += 1
170 # XXX -- would be good to add some microlensing events, for both MW and LMC/SMC.
172 #########################
173 # Milky Way
174 #########################
176 # Let's do the proper motion, parallax, and DCR degen of a 20nd mag star
177 rmag = 20.
178 displayDict = {'group': 'Milky Way', 'subgroup': 'Astrometry',
179 'order': 0, 'caption': None}
181 sql = extraSql
182 metadata = ''
183 plotDict = {'percentileClip': 95.}
184 metric = metrics.ParallaxMetric(metricName='Parallax Error r=%.1f' % (rmag), rmag=rmag,
185 seeingCol=colmap['seeingGeom'], filterCol=colmap['filter'],
186 m5Col=colmap['fiveSigmaDepth'], normalize=False)
187 summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.median, decreasing=False, metricName='Median Parallax Error (WFD)')]
188 summary.append(metrics.PercentileMetric(percentile=95, metricName='95th Percentile Parallax Error'))
189 bundle = mb.MetricBundle(metric, healslicer, sql, metadata=metadata,
190 displayDict=displayDict, plotDict=plotDict,
191 plotFuncs=subsetPlots, summaryMetrics=summary)
192 bundleList.append(bundle)
193 displayDict['order'] += 1
195 metric = metrics.ProperMotionMetric(metricName='Proper Motion Error r=%.1f' % rmag,
196 rmag=rmag, m5Col=colmap['fiveSigmaDepth'],
197 mjdCol=colmap['mjd'], filterCol=colmap['filter'],
198 seeingCol=colmap['seeingGeom'], normalize=False)
199 summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.median, decreasing=False, metricName='Median Proper Motion Error (WFD)')]
200 summary.append(metrics.PercentileMetric(metricName='95th Percentile Proper Motion Error'))
201 bundle = mb.MetricBundle(metric, healslicer, sql, metadata=metadata,
202 displayDict=displayDict, plotDict=plotDict,
203 summaryMetrics=summary, plotFuncs=subsetPlots)
204 bundleList.append(bundle)
205 displayDict['order'] += 1
207 metric = metrics.ParallaxDcrDegenMetric(metricName='Parallax-DCR degeneracy r=%.1f' % (rmag),
208 rmag=rmag, seeingCol=colmap['seeingEff'],
209 filterCol=colmap['filter'], m5Col=colmap['fiveSigmaDepth'])
210 caption = 'Correlation between parallax offset magnitude and hour angle for a r=%.1f star.' % (rmag)
211 caption += ' (0 is good, near -1 or 1 is bad).'
212 # XXX--not sure what kind of summary to do here
213 summary = [metrics.MeanMetric(metricName='Mean DCR Degeneracy')]
214 bundle = mb.MetricBundle(metric, healslicer, sql, metadata=metadata,
215 displayDict=displayDict, summaryMetrics=summary,
216 plotFuncs=subsetPlots)
217 bundleList.append(bundle)
218 displayDict['order'] += 1
220 for b in bundleList:
221 b.setRunName(runName)
223 #########################
224 # DDF
225 #########################
226 ddf_time_bundleDicts = []
227 if DDF:
228 # Hide this import to avoid adding a dependency.
229 from lsst.sims.featureScheduler.surveys import generate_dd_surveys
230 ddf_surveys = generate_dd_surveys()
231 # For doing a high-res sampling of the DDF for co-adds
232 ddf_radius = 1.8 # Degrees
233 ddf_nside = 512
235 ra, dec = hpid2RaDec(ddf_nside, np.arange(hp.nside2npix(ddf_nside)))
237 displayDict = {'group': 'DDF depths', 'subgroup': None,
238 'order': 0, 'caption': None}
240 # Run the inter and intra gaps at the center of the DDFs
241 for survey in ddf_surveys:
242 slicer = slicers.UserPointsSlicer(ra=np.degrees(survey.ra), dec=np.degrees(survey.dec), useCamera=False)
243 ddf_time_bundleDicts.append(interNight(colmap=colmap, slicer=slicer,
244 runName=runName, nside=64, extraSql='note="%s"' % survey.survey_name,
245 subgroup=survey.survey_name)[0])
246 ddf_time_bundleDicts.append(intraNight(colmap=colmap, slicer=slicer,
247 runName=runName, nside=64, extraSql='note="%s"' % survey.survey_name,
248 subgroup=survey.survey_name)[0])
250 for survey in ddf_surveys:
251 displayDict['subgroup'] = survey.survey_name
252 # Crop off the u-band only DDF
253 if survey.survey_name[0:4] != 'DD:u':
254 dist_to_ddf = angularSeparation(ra, dec, np.degrees(survey.ra), np.degrees(survey.dec))
255 goodhp = np.where(dist_to_ddf <= ddf_radius)
256 slicer = slicers.UserPointsSlicer(ra=ra[goodhp], dec=dec[goodhp], useCamera=False)
257 for filtername in ['u', 'g', 'r', 'i', 'z', 'y']:
258 metric = metrics.Coaddm5Metric(metricName=survey.survey_name+', ' + filtername)
259 summary = [metrics.MedianMetric(metricName='median depth ' + survey.survey_name+', ' + filtername)]
260 sql = extraSql + joiner + 'filter = "%s"' % filtername
261 bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata,
262 displayDict=displayDict, summaryMetrics=summary,
263 plotFuncs=[])
264 bundleList.append(bundle)
265 displayDict['order'] += 1
267 displayDict = {'group': 'DDF Transients', 'subgroup': None,
268 'order': 0, 'caption': None}
269 for survey in ddf_surveys:
270 displayDict['subgroup'] = survey.survey_name
271 if survey.survey_name[0:4] != 'DD:u':
272 slicer = plasticc_slicer(plcs=plasticc_models_dict['SNIa-normal'], seed=42,
273 ra_cen=survey.ra, dec_cen=survey.dec, radius=np.radians(3.), useCamera=False)
274 metric = Plasticc_metric(metricName=survey.survey_name+' SNIa')
275 sql = ''
276 summary_stats = [metrics.MeanMetric(maskVal=0)]
277 plotFuncs = [plots.HealpixSkyMap()]
278 bundle = mb.MetricBundle(metric, slicer, sql, runName=runName, summaryMetrics=summary_stats,
279 plotFuncs=plotFuncs, metadata=metadata,
280 displayDict=displayDict)
281 bundleList.append(bundle)
283 displayDict['order'] += 1
285 for b in bundleList:
286 b.setRunName(runName)
288 bundleDict = mb.makeBundlesDictFromList(bundleList)
290 intraDict = intraNight(colmap=colmap, runName=runName, nside=nside,
291 extraSql=extraSql, extraMetadata=extraMetadata)[0]
292 interDict = interNight(colmap=colmap, runName=runName, nside=nside,
293 extraSql=extraSql, extraMetadata=extraMetadata)[0]
295 bundleDict.update(intraDict)
296 bundleDict.update(interDict)
297 for ddf_time in ddf_time_bundleDicts:
298 bundleDict.update(ddf_time)
300 return bundleDict