diff --git a/python/lsst/ap/association/packageAlerts.py b/python/lsst/ap/association/packageAlerts.py index 99c899c0..02e4fe00 100644 --- a/python/lsst/ap/association/packageAlerts.py +++ b/python/lsst/ap/association/packageAlerts.py @@ -263,6 +263,8 @@ def run(self, self._patchDiaSources(diaSrcHistory) detector = diffIm.detector.getId() visit = diffIm.visitInfo.id + observation_reason = diffIm.visitInfo.getObservationReason() + target_name = diffIm.visitInfo.getObject() midpoint_unix = diffIm.visitInfo.date.toAstropy().tai.unix exposure_time = diffIm.visitInfo.exposureTime diffImPhotoCalib = diffIm.getPhotoCalib() @@ -347,6 +349,8 @@ def run(self, alerts.append( self.makeAlertDict(diaSource["diaSourceId"], + observation_reason, + target_name, diaSource, diaObject, objSourceHistory, @@ -584,6 +588,8 @@ def makeLocalTransformMatrix(self, wcs, center, skyCenter): def makeAlertDict(self, diaSourceId, + observationReason, + targetName, diaSource, diaObject, objDiaSrcHistory, @@ -600,6 +606,10 @@ def makeAlertDict(self, Unique identifier of the triggering diaSource diaSource : `pandas.DataFrame` New single DiaSource to package. + observationReason : `str` + Scheduler reason for the image containing this diaSource. + targetName : `str` + Scheduler target for the image containing this diaSource. diaObject : `pandas.DataFrame` DiaObject that ``diaSource`` is matched to. objDiaSrcHistory : `pandas.DataFrame` @@ -618,6 +628,13 @@ def makeAlertDict(self, """ alert = dict() alert['diaSourceId'] = diaSourceId + # alerts should have NULL if scheduler fields are not populated + if not len(observationReason): + observationReason = None + if not len(targetName): + targetName = None + alert['observation_reason'] = observationReason + alert['target_name'] = targetName alert['diaSource'] = diaSource.to_dict() if objDiaSrcHistory is None: diff --git a/tests/test_packageAlerts.py b/tests/test_packageAlerts.py index 81c8f6e4..8d07e131 100644 --- a/tests/test_packageAlerts.py +++ b/tests/test_packageAlerts.py @@ -383,6 +383,8 @@ def testMakeAlertDict(self): objForcedSources = self.diaForcedSources.loc[srcIdx[0]] alert = packageAlerts.makeAlertDict( dia_source_id, + self.exposure.visitInfo.getObservationReason(), + self.exposure.visitInfo.getObject(), diaSource, self.diaObjects.loc[srcIdx[0]], objSources, @@ -390,10 +392,12 @@ def testMakeAlertDict(self): ccdCutout, ccdCutout, ccdCutout) - self.assertEqual(len(alert), 11) + self.assertEqual(len(alert), 13) self.assertEqual(alert["diaSourceId"], dia_source_id) self.assertEqual(alert["diaSource"], diaSource.to_dict()) + self.assertIsNone(alert["observation_reason"]) + self.assertIsNone(alert["target_name"]) self.assertEqual(alert["cutoutDifference"], cutoutBytes) self.assertEqual(alert["cutoutScience"], @@ -407,6 +411,34 @@ def testMakeAlertDict(self): self.assertAlmostEqual(science_cutout.header["ROTPA"], template_cutout.header["ROTPA"]) + def testMakeAlertDictSchedulerFields(self): + """Test non-null scheduler fields pass through as expected. + + """ + packageAlerts = PackageAlertsTask() + dia_source_id = 1234 + + for srcIdx, diaSource in self.diaSources.iterrows(): + objSources = self.diaSourceHistory.loc[srcIdx[0]] + objForcedSources = self.diaForcedSources.loc[srcIdx[0]] + obs_reason = f"obs_reason_{srcIdx}", + target = f"target_name_{srcIdx}", + alert = packageAlerts.makeAlertDict( + dia_source_id, + obs_reason, + target, + diaSource, + self.diaObjects.loc[srcIdx[0]], + objSources, + objForcedSources, + None, + None, + None) + self.assertEqual(len(alert), 13) + + self.assertEqual(alert["observation_reason"], obs_reason) + self.assertEqual(alert["target_name"], target) + def testCutoutRotpa(self): """Test that the ROTPA header keyword matches the boresightRotAngle from visitInfo. """