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=None,
43 extraMetadata=None)
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.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
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 bundle = mb.MetricBundle(metric, slicer, extraSql, runName=runName, summaryMetrics=standardStats,
216 plotFuncs=plotFuncs, metadata=extraMetadata,
217 displayDict=displayDict)
218 bundleList.append(bundle)
220 # XXX -- would be good to add some microlensing events, for both MW and LMC/SMC.
222 #########################
223 # Milky Way
224 #########################
226 displayDict = {'group': 'Milky Way', 'subgroup': ''}
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)
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()
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'))
256 # For doing a high-res sampling of the DDF for co-adds
257 ddf_radius = 1.8 # Degrees
258 ddf_nside = 512
260 ra, dec = hpid2RaDec(ddf_nside, np.arange(hp.nside2npix(ddf_nside)))
262 displayDict = {'group': 'DDF depths', 'subgroup': None}
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)
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
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)
306 return bundleDict