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.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
13__all__ = ['scienceRadarBatch']
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.
21 Parameters
22 ----------
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
29 if colmap is None:
30 colmap = ColMapDict('fbs')
32 if extraSql is None:
33 extraSql = ''
34 if extraSql == '':
35 joiner = ''
36 else:
37 joiner = ' and '
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)
45 standardStats = standardSummary(withCount=False)
47 healslicer = slicers.HealpixSlicer(nside=nside)
48 subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
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())
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)
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)
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))
89 #########################
90 # Solar System
91 #########################
92 # Generally, we need to run Solar System metrics separately; they're a multi-step process.
94 #########################
95 # Cosmology
96 #########################
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
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
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))
144 # XXX--need some sort of metric for weak lensing
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)
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
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)
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}
193 # light curve parameters
194 epochStart = -22
195 peakEpoch = 0
196 nearPeakT = 10
197 postPeakT = 14 # two weeks
198 nPhaseCheck = 1
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
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)
221 # XXX -- would be good to add some microlensing events, for both MW and LMC/SMC.
223 #########################
224 # Milky Way
225 #########################
227 displayDict = {'group': 'Milky Way', 'subgroup': ''}
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)
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()
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'))
259 # For doing a high-res sampling of the DDF for co-adds
260 ddf_radius = 1.8 # Degrees
261 ddf_nside = 512
263 ra, dec = hpid2RaDec(ddf_nside, np.arange(hp.nside2npix(ddf_nside)))
265 displayDict = {'group': 'DDF depths', 'subgroup': None}
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)
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
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)
309 return bundleDict