예제 #1
0
 def testNsecsDefault(self):
     ts = DateTime(1192755506000000000)
     self.assertEqual(ts.nsecs(DateTime.UTC), 1192755473000000000)
     self.assertEqual(ts.nsecs(DateTime.TAI), 1192755506000000000)
     self.assertEqual(ts.nsecs(), 1192755506000000000)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC), 54392.040196759262)
     self.assertTrue(ts.isValid())
예제 #2
0
 def testMJD(self):
     ts = DateTime(45205.125, DateTime.MJD, DateTime.UTC)
     self.assertEqual(ts.nsecs(DateTime.UTC), 399006000000000000)
     self.assertEqual(ts.nsecs(DateTime.TAI), 399006021000000000)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC), 45205.125)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.TAI), 45205.125 + 21.0/86400.0)
     self.assertTrue(ts.isValid())
예제 #3
0
 def testMJD(self):
     ts = DateTime(45205.125, DateTime.MJD, DateTime.UTC)
     self.assertEqual(ts.nsecs(DateTime.UTC), 399006000000000000)
     self.assertEqual(ts.nsecs(DateTime.TAI), 399006021000000000)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC), 45205.125)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.TAI), 45205.125 + 21.0/86400.0)
     self.assertTrue(ts.isValid())
예제 #4
0
 def testNsecsDefault(self):
     ts = DateTime(1192755506000000000)
     self.assertEqual(ts.nsecs(DateTime.UTC), 1192755473000000000)
     self.assertEqual(ts.nsecs(DateTime.TAI), 1192755506000000000)
     self.assertEqual(ts.nsecs(), 1192755506000000000)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC), 54392.040196759262)
     self.assertTrue(ts.isValid())
예제 #5
0
    def testPopMjdDate(self):
        for timesys in (None, "UTC", "TAI"):

            dataDict = {
                "DATE1": 51943.1705801,
                "DATE2": 44302.0433218,
                "BADMJDDATE": "2001-02-03T04:05:06.123456789",
            }
            if timesys is not None:
                dataDict["TIMESYS"] = timesys
            length = len(dataDict)

            for key, mjdDate in dataDict.items():
                if not key.startswith("DATE"):
                    continue

                lsstSys = dict(
                    UTC=DateTime.UTC,
                    TAI=DateTime.TAI,
                ).get(timesys, DateTime.UTC)

                desDate = DateTime(mjdDate, DateTime.MJD, lsstSys)

                md = getMetadata(dataDict)
                date = self.makeRawVisitInfo.popMjdDate(md, key, timesys=timesys)
                self.assertEqual(len(md.names()), length)
                self.assertAlmostEqual(date.get(), desDate.get())

            badDate = self.makeRawVisitInfo.popMjdDate(md, "BADMJDDATE")
            self.assertEqual(badDate, DateTime())

            missingDate = self.makeRawVisitInfo.popMjdDate(md, "BADKEY")
            self.assertEqual(missingDate, DateTime())
예제 #6
0
 def testNsecsTT(self):
     ts = DateTime(long(1192755538184000000), DateTime.TT)
     self.assertEqual(ts.nsecs(DateTime.UTC), long(1192755473000000000))
     self.assertEqual(ts.nsecs(DateTime.TAI), long(1192755506000000000))
     self.assertEqual(ts.nsecs(), long(1192755506000000000))
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC),
                            54392.040196759262)
     self.assertTrue(ts.isValid())
예제 #7
0
 def testInvalid(self):
     ts = DateTime()
     self.assertFalse(ts.isValid())
     for scale in self.timeScales:
         self.assertEqual(ts.nsecs(scale), DateTime.invalid_nsecs)
         for system in self.dateSystems:
             with self.assertRaises(pexExcept.RuntimeError):
                 ts.get(system, scale)
         with self.assertRaises(pexExcept.RuntimeError):
             ts.gmtime(scale)
         with self.assertRaises(pexExcept.RuntimeError):
             ts.timespec(scale)
         with self.assertRaises(pexExcept.RuntimeError):
             ts.timeval(scale)
         with self.assertRaises(pexExcept.RuntimeError):
             ts.toString(scale)
     self.assertEqual(repr(ts), "DateTime()")
예제 #8
0
 def testInvalid(self):
     ts = DateTime()
     self.assertFalse(ts.isValid())
     for scale in self.timeScales:
         self.assertEqual(ts.nsecs(scale), DateTime.invalid_nsecs)
         for system in self.dateSystems:
             with self.assertRaises(RuntimeError):
                 ts.get(system, scale)
         with self.assertRaises(RuntimeError):
             ts.gmtime(scale)
         with self.assertRaises(RuntimeError):
             ts.timespec(scale)
         with self.assertRaises(RuntimeError):
             ts.timeval(scale)
         with self.assertRaises(RuntimeError):
             ts.toString(scale)
     self.assertEqual(repr(ts), "DateTime()")
예제 #9
0
파일: dateTime.py 프로젝트: lsst-dm/bp
 def testMJD(self):
     ts = DateTime(45205.125, DateTime.MJD, DateTime.UTC)
     self.assertEqual(ts.nsecs(DateTime.UTC), 399006000000000000L)
     self.assertEqual(ts.nsecs(DateTime.TAI), 399006021000000000L)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC), 45205.125)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.TAI), 45205.125 + 21.0/86400.0)
     # Following interface is deprecated
     self.assertAlmostEqual(ts.mjd(DateTime.UTC), 45205.125)
     self.assertAlmostEqual(ts.mjd(DateTime.TAI), 45205.125 + 21.0/86400.0)
예제 #10
0
class GetRawTestCase(lsst.utils.tests.TestCase):
    """Testing butler raw image retrieval"""

    def setUp(self):
        self.butler = dafPersist.Butler(root=os.path.join(os.path.dirname(__file__), "data"))
        self.exposureTime = 15.0
        self.darkTime = 15.0
        dateObs = DateTime(49552.28496, DateTime.MJD, DateTime.TAI)
        self.dateAvg = DateTime(dateObs.nsecs(DateTime.TAI) + int(0.5e9*self.exposureTime), DateTime.TAI)
        self.boresightRaDec = SpherePoint(359.936019771151, -2.3356222648145, degrees)
        self.boresightAzAlt = SpherePoint(127.158246182602, 90 - 40.6736117075876, degrees)
        self.boresightAirmass = 1.31849492005496
        self.boresightRotAngle = -3.43228*degrees
        self.rotType = RotType.SKY
        self.obs_longitude = -70.749417*degrees
        self.obs_latitude = -30.244633*degrees
        self.obs_elevation = 2663.0
        self.weath_airTemperature = 5.0
        self.weath_airPressure = MakeRawVisitInfo.pascalFromMmHg(520.0)
        self.weath_humidity = 40.

    def tearDown(self):
        del self.butler

    def testRaw(self):
        """Test retrieval of raw image"""
        raw = self.butler.get("raw", visit=85471048, snap=0, raft='0,3', sensor='0,1', channel='1,0',
                              immediate=True)
        self.assertEqual(raw.getWidth(), 513)
        self.assertEqual(raw.getHeight(), 2001)
        self.assertEqual(raw.getFilter().getFilterProperty().getName(), "y")
        self.assertEqual(raw.getDetector().getName(), "R:0,3 S:0,1")
        origin = raw.getWcs().getSkyOrigin()
        self.assertAlmostEqual(
            origin.getLongitude().asDegrees(), 0.0058520, 6)
        self.assertAlmostEqual(
            origin.getLatitude().asDegrees(), -2.3052624, 6)
        visitInfo = raw.getInfo().getVisitInfo()
        self.assertAlmostEqual(visitInfo.getDate().get(), self.dateAvg.get())
        # Explicit test for NaN here, because phosim output may not have consistent alt/az/ra/dec/time
        self.assertTrue(math.isnan(visitInfo.getEra()))
        self.assertAlmostEqual(visitInfo.getExposureTime(), self.exposureTime)
        self.assertAlmostEqual(visitInfo.getDarkTime(), self.darkTime)
        self.assertSpherePointsAlmostEqual(visitInfo.getBoresightRaDec(), self.boresightRaDec)
        self.assertSpherePointsAlmostEqual(visitInfo.getBoresightAzAlt(), self.boresightAzAlt)
        self.assertAlmostEqual(visitInfo.getBoresightAirmass(), self.boresightAirmass)
        self.assertAnglesAlmostEqual(visitInfo.getBoresightRotAngle(), self.boresightRotAngle)
        self.assertEqual(visitInfo.getRotType(), self.rotType)
        observatory = visitInfo.getObservatory()
        self.assertAnglesAlmostEqual(observatory.getLongitude(), self.obs_longitude)
        self.assertAnglesAlmostEqual(observatory.getLatitude(), self.obs_latitude)
        self.assertAlmostEqual(observatory.getElevation(), self.obs_elevation)
        weather = visitInfo.getWeather()
        self.assertAlmostEqual(weather.getAirTemperature(), self.weath_airTemperature)
        self.assertAlmostEqual(weather.getAirPressure(), self.weath_airPressure)
        self.assertAlmostEqual(weather.getHumidity(), self.weath_humidity)
예제 #11
0
class GetRawTestCase(lsst.utils.tests.TestCase):
    """Testing butler raw image retrieval"""

    def setUp(self):
        self.butler = dafPersist.Butler(root=os.path.join(os.path.dirname(__file__), "data"))
        self.exposureTime = 15.0
        self.darkTime = 15.0
        dateObs = DateTime(49552.28496, DateTime.MJD, DateTime.TAI)
        self.dateAvg = DateTime(dateObs.nsecs(DateTime.TAI) + int(0.5e9*self.exposureTime), DateTime.TAI)
        self.boresightRaDec = SpherePoint(359.936019771151, -2.3356222648145, degrees)
        self.boresightAzAlt = SpherePoint(127.158246182602, 90 - 40.6736117075876, degrees)
        self.boresightAirmass = 1.31849492005496
        self.boresightRotAngle = -3.43228*degrees
        self.rotType = RotType.SKY
        self.obs_longitude = -70.749417*degrees
        self.obs_latitude = -30.244633*degrees
        self.obs_elevation = 2663.0
        self.weath_airTemperature = 5.0
        self.weath_airPressure = MakeRawVisitInfo.pascalFromMmHg(520.0)
        self.weath_humidity = 40.

    def tearDown(self):
        del self.butler

    def testRaw(self):
        """Test retrieval of raw image"""
        raw = self.butler.get("raw", visit=85471048, snap=0, raft='0,3', sensor='0,1', channel='1,0',
                              immediate=True)
        self.assertEqual(raw.getWidth(), 513)
        self.assertEqual(raw.getHeight(), 2001)
        self.assertEqual(raw.getFilter().getFilterProperty().getName(), "y")
        self.assertEqual(raw.getDetector().getName(), "R:0,3 S:0,1")
        origin = raw.getWcs().getSkyOrigin()
        self.assertAlmostEqual(
            origin.getLongitude().asDegrees(), 0.0058520, 6)
        self.assertAlmostEqual(
            origin.getLatitude().asDegrees(), -2.3052624, 6)
        visitInfo = raw.getInfo().getVisitInfo()
        self.assertAlmostEqual(visitInfo.getDate().get(), self.dateAvg.get())
        # Explicit test for NaN here, because phosim output may not have consistent alt/az/ra/dec/time
        self.assertTrue(math.isnan(visitInfo.getEra()))
        self.assertAlmostEqual(visitInfo.getExposureTime(), self.exposureTime)
        self.assertAlmostEqual(visitInfo.getDarkTime(), self.darkTime)
        self.assertSpherePointsAlmostEqual(visitInfo.getBoresightRaDec(), self.boresightRaDec)
        self.assertSpherePointsAlmostEqual(visitInfo.getBoresightAzAlt(), self.boresightAzAlt)
        self.assertAlmostEqual(visitInfo.getBoresightAirmass(), self.boresightAirmass)
        self.assertAnglesAlmostEqual(visitInfo.getBoresightRotAngle(), self.boresightRotAngle)
        self.assertEqual(visitInfo.getRotType(), self.rotType)
        observatory = visitInfo.getObservatory()
        self.assertAnglesAlmostEqual(observatory.getLongitude(), self.obs_longitude)
        self.assertAnglesAlmostEqual(observatory.getLatitude(), self.obs_latitude)
        self.assertAlmostEqual(observatory.getElevation(), self.obs_elevation)
        weather = visitInfo.getWeather()
        self.assertAlmostEqual(weather.getAirTemperature(), self.weath_airTemperature)
        self.assertAlmostEqual(weather.getAirPressure(), self.weath_airPressure)
        self.assertAlmostEqual(weather.getHumidity(), self.weath_humidity)
예제 #12
0
 def testNsecs(self):
     ts = DateTime(1192755473000000000, DateTime.UTC)
     self.assertEqual(ts.nsecs(DateTime.UTC), 1192755473000000000)
     self.assertEqual(ts.nsecs(DateTime.TAI), 1192755506000000000)
     self.assertEqual(ts.nsecs(), 1192755506000000000)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC), 54392.040196759262)
     ts2 = ts
     self.assertEqual(ts, ts2)
     ts2 = DateTime(1192755473000000000, DateTime.UTC)
     self.assertEqual(ts, ts2)
     ts2 = DateTime(1234567890000000000, DateTime.UTC)
     self.assertNotEqual(ts, ts2)
예제 #13
0
    def _makeDiaSources(self, sources: numpy.ndarray, indices: numpy.ndarray,
                        dt: DateTime, visit_id: int) -> pandas.DataFrame:
        """Generate catalog of DiaSources to store in a database

        Parameters
        ----------
        sources : `numpy.ndarray`
            (x, y, z) coordinates of sources, array dimension is (N, 3)
        indices : `numpy.array`
            array of indices of sources, 1-dim ndarray, transient sources
            have negative indices
        dt : `DateTime`
            Visit time.
        visit_id : `int`
            ID of the visit

        Returns
        -------
        catalog : `pandas.DataFrame`
            Catalog of DIASources.
        """
        def polar(row: Any) -> pandas.Series:
            v3d = Vector3d(row.x, row.y, row.z)
            sp = SpherePoint(v3d)
            return pandas.Series(
                [sp.getRa().asDegrees(),
                 sp.getDec().asDegrees()],
                index=["ra", "decl"])

        midPointTai = dt.get(system=DateTime.MJD)

        catalog = pandas.DataFrame(sources, columns=["x", "y", "z"])
        catalog["diaObjectId"] = indices
        catalog = cast(pandas.DataFrame,
                       catalog[catalog["diaObjectId"] != _OUTSIDER])

        cat_polar = cast(pandas.DataFrame,
                         catalog.apply(polar, axis=1, result_type='expand'))
        cat_polar["diaObjectId"] = catalog["diaObjectId"]
        catalog = cat_polar
        catalog["ccdVisitId"] = visit_id
        catalog["parentDiaSourceId"] = 0
        catalog["psFlux"] = 1.
        catalog["psFluxErr"] = 0.01
        catalog["midPointTai"] = midPointTai
        catalog["flags"] = 0

        nrows = catalog.shape[0]
        catalog["diaSourceId"] = range(self.lastSourceId + 1,
                                       self.lastSourceId + 1 + nrows)
        self.lastSourceId += nrows

        return catalog
예제 #14
0
 def testNsecs(self):
     ts = DateTime(1192755473000000000, DateTime.UTC)
     self.assertEqual(ts.nsecs(DateTime.UTC), 1192755473000000000)
     self.assertEqual(ts.nsecs(DateTime.TAI), 1192755506000000000)
     self.assertEqual(ts.nsecs(), 1192755506000000000)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC), 54392.040196759262)
     ts2 = ts
     self.assertEqual(ts, ts2)
     ts2 = DateTime(1192755473000000000, DateTime.UTC)
     self.assertEqual(ts, ts2)
     ts2 = DateTime(1234567890000000000, DateTime.UTC)
     self.assertNotEqual(ts, ts2)
예제 #15
0
    def testGetDR7(self):
        obsSdssDir = lsst.utils.getPackageDir('obs_sdss')
        butler = dafPersist.Butler(
            root=os.path.join(obsSdssDir, "tests", "data", "dr7", "runs"))
        sub = butler.subset("fpC", run=5754, camcol=3, field=280, filter="r")
        self.assertEqual(len(sub), 1)
        for ref in sub:
            im = ref.get("fpC")
            w, h = im.getWidth(), im.getHeight()
            self.assertEqual(im.__class__, lsst.afw.image.ImageU)
            self.assertEqual(w, 2048)
            self.assertEqual(h, 1489)

            im_md = ref.get("fpC_md")
            self.assertEqual(im_md.get("RUN"), 5754)
            self.assertEqual(im_md.get("FRAME"), 280)
            self.assertEqual(im_md.get("STRIPE"), 82)

            msk = ref.get("fpM")
            w, h = msk.getWidth(), msk.getHeight()
            self.assertEqual(msk.__class__,
                             lsst.afw.image.Mask[lsst.afw.image.MaskPixel])
            self.assertEqual(w, 2048)
            self.assertEqual(h, 1489)

            psf = ref.get("psField")
            k = psf.getKernel()
            w, h = k.getWidth(), k.getHeight()
            self.assertEqual(psf.__class__, lsst.meas.algorithms.PcaPsf)
            self.assertEqual(w, 31)
            self.assertEqual(h, 31)

            wcs = ref.get("asTrans")
            self.assertIsInstance(wcs, SkyWcs)
            self.assertFalse(wcs.isFlipped)
            # comparison is to results from lsst.afw.image.TanWcs class
            self.assertCoordsAlmostEqual(
                wcs.pixelToSky(700, 1000),
                IcrsCoord(343.6507738304687 * degrees,
                          -0.3509870420713227 * degrees))

            tsField = ref.get("tsField")
            self.assertAlmostEqual(tsField.gain, 4.72, 2)
            self.assertAlmostEqual(tsField.airmass, 1.2815132857671601)
            self.assertAlmostEqual(tsField.exptime, 53.907456)
            predDateStart = DateTime(53664.226070589997, DateTime.MJD,
                                     DateTime.TAI)
            predDateAvg = DateTime(
                predDateStart.nsecs(DateTime.TAI) +
                int(0.5e9 * tsField.exptime), DateTime.TAI)
            self.assertAlmostEqual(tsField.dateAvg.get(), predDateAvg.get())
예제 #16
0
파일: test_sdss.py 프로젝트: lsst/obs_sdss
    def testGetDR7(self):
        obsSdssDir = lsst.utils.getPackageDir('obs_sdss')
        butler = dafPersist.Butler(
            root=os.path.join(obsSdssDir, "tests", "data", "dr7", "runs"))
        sub = butler.subset("fpC", run=5754, camcol=3, field=280, filter="r")
        self.assertEqual(len(sub), 1)
        for ref in sub:
            im = ref.get("fpC")
            w, h = im.getWidth(), im.getHeight()
            self.assertEqual(im.__class__, lsst.afw.image.ExposureU)
            self.assertEqual(w, 2048)
            self.assertEqual(h, 1489)

            im_md = ref.get("fpC_md")
            self.assertEqual(im_md.getScalar("RUN"), 5754)
            self.assertEqual(im_md.getScalar("FRAME"), 280)
            self.assertEqual(im_md.getScalar("STRIPE"), 82)

            msk = ref.get("fpM")
            w, h = msk.getWidth(), msk.getHeight()
            self.assertEqual(msk.__class__, lsst.afw.image.Mask[lsst.afw.image.MaskPixel])
            self.assertEqual(w, 2048)
            self.assertEqual(h, 1489)

            psf = ref.get("psField")
            k = psf.getKernel()
            w, h = k.getWidth(), k.getHeight()
            self.assertEqual(psf.__class__, lsst.meas.algorithms.PcaPsf)
            self.assertEqual(w, 31)
            self.assertEqual(h, 31)

            wcs = ref.get("asTrans")
            self.assertIsInstance(wcs, SkyWcs)
            self.assertFalse(wcs.isFlipped)
            # comparison is to results from lsst.afw.image.TanWcs class
            self.assertSpherePointsAlmostEqual(wcs.pixelToSky(700, 1000),
                                               SpherePoint(343.6507738304687, -0.3509870420713227, degrees))

            tsField = ref.get("tsField")
            self.assertAlmostEqual(tsField.gain, 4.72, 2)
            self.assertAlmostEqual(tsField.airmass, 1.2815132857671601)
            self.assertAlmostEqual(tsField.exptime, 53.907456)
            predDateStart = DateTime(53664.226070589997, DateTime.MJD, DateTime.TAI)
            predDateAvg = DateTime(predDateStart.nsecs(DateTime.TAI) + int(0.5e9*tsField.exptime),
                                   DateTime.TAI)
            self.assertAlmostEqual(tsField.dateAvg.get(), predDateAvg.get())
예제 #17
0
    def testGetDR7(self):
        obsSdssDir = lsst.utils.getPackageDir('obs_sdss')
        butler = dafPersist.Butler(
            root=os.path.join(obsSdssDir, "tests", "data", "dr7", "runs"))
        sub = butler.subset("fpC", run=5754, camcol=3, field=280, filter="r")
        self.assertEqual(len(sub), 1)
        for ref in sub:
            im = ref.get("fpC")
            w, h = im.getWidth(), im.getHeight()
            self.assertEqual(im.__class__, lsst.afw.image.ImageU)
            self.assertEqual(w, 2048)
            self.assertEqual(h, 1489)

            im_md = ref.get("fpC_md")
            self.assertEqual(im_md.get("RUN"), 5754)
            self.assertEqual(im_md.get("FRAME"), 280)
            self.assertEqual(im_md.get("STRIPE"), 82)

            msk = ref.get("fpM")
            w, h = msk.getWidth(), msk.getHeight()
            self.assertEqual(msk.__class__, lsst.afw.image.Mask[lsst.afw.image.MaskPixel])
            self.assertEqual(w, 2048)
            self.assertEqual(h, 1489)

            psf = ref.get("psField")
            k = psf.getKernel()
            w, h = k.getWidth(), k.getHeight()
            self.assertEqual(psf.__class__, lsst.meas.algorithms.PcaPsf)
            self.assertEqual(w, 31)
            self.assertEqual(h, 31)

            wcs = ref.get("asTrans")
            self.assertEqual(wcs.__class__, lsst.afw.image.TanWcs)
            self.assertFalse(wcs.isFlipped())
            self.assertAlmostEqual(wcs.getFitsMetadata().get("CRPIX1"), 1.0, 5)
            self.assertAlmostEqual(wcs.getFitsMetadata().get("CRPIX2"), 1.0, 5)

            tsField = ref.get("tsField")
            self.assertAlmostEqual(tsField.gain, 4.72, 2)
            self.assertAlmostEqual(tsField.airmass, 1.2815132857671601)
            self.assertAlmostEqual(tsField.exptime, 53.907456)
            predDateStart = DateTime(53664.226070589997, DateTime.MJD, DateTime.TAI)
            predDateAvg = DateTime(predDateStart.nsecs(DateTime.TAI) + int(0.5e9*tsField.exptime),
                                   DateTime.TAI)
            self.assertAlmostEqual(tsField.dateAvg.get(), predDateAvg.get())
예제 #18
0
class GetDataTestCase(lsst.utils.tests.TestCase):
    """Demonstrate retrieval of data from a repository."""
    @unittest.skipIf(testDataDirectory is None, "%s is not available" % testDataPackage)
    def setUp(self):
        rawPath = os.path.join(testDataDirectory, "hsc", "raw")
        calibPath = os.path.join(testDataDirectory, "hsc", "calib")
        self.repoPath = createDataRepository("lsst.obs.hsc.HscMapper", rawPath, calibPath)
        self.butler = dafPersist.Butler(root=self.repoPath, calibRoot=calibPath)

        # The following properties of the provided data are known a priori.
        self.visit = 904024
        self.ccdNum = 50
        self.filter = 'i'
        self.rawSize = (2144, 4241)
        self.ccdSize = (2048, 4176)
        self.exptime = 30.0
        self.darktime = self.exptime  # No explicit darktime
        self.dateAvg = DateTime(56598.261654253474, DateTime.MJD, DateTime.TAI)
        self.boresightRaDec = afwGeom.SpherePoint(320.7499250000, 0.500019444, degrees)
        self.boresightAzAlt = afwGeom.SpherePoint(226.68922661, 63.04359233, degrees)
        self.boresightAirmass = 1.121626027604189
        self.boresightRotAngle = 270.0*degrees
        self.rotType = RotType.SKY
        self.obs_longitude = -155.476667*degrees
        self.obs_latitude = 19.825556*degrees
        self.obs_elevation = 4139
        self.weath_airTemperature = -0.8
        self.weath_airPressure = 62170.
        self.weath_humidity = 33.1
        # NOTE: if we deal with DM-8053 and get UT1 implemented, ERA will change slightly.
        self.era = 2.3659577248977826*radians

    def tearDown(self):
        del self.butler
        rmtree(self.repoPath)

    def testRaw(self):
        """Test retrieval of raw image"""
        raw = self.butler.get("raw", visit=self.visit, ccd=self.ccdNum)
        ccd = raw.getDetector()
        self.assertEqual(raw.getDimensions(), afwGeom.Extent2I(*self.rawSize))
        self.assertEqual(raw.getFilter().getFilterProperty().getName(), self.filter)
        self.assertEqual(ccd.getId(), self.ccdNum)
        self.assertEqual(ccd.getBBox().getDimensions(), afwGeom.Extent2I(*self.ccdSize))

        visitInfo = raw.getInfo().getVisitInfo()
        self.assertAlmostEqual(visitInfo.getDate().get(), self.dateAvg.get())
        self.assertAnglesAlmostEqual(visitInfo.getEra(), self.era)
        self.assertSpherePointsAlmostEqual(visitInfo.getBoresightRaDec(), self.boresightRaDec)
        self.assertSpherePointsAlmostEqual(visitInfo.getBoresightAzAlt(), self.boresightAzAlt)
        self.assertAlmostEqual(visitInfo.getBoresightAirmass(), self.boresightAirmass)
        self.assertAnglesAlmostEqual(visitInfo.getBoresightRotAngle(), self.boresightRotAngle)
        self.assertEqual(visitInfo.getRotType(), self.rotType)
        self.assertEqual(visitInfo.getExposureTime(), self.exptime)
        self.assertEqual(visitInfo.getDarkTime(), self.darktime)
        observatory = visitInfo.getObservatory()
        self.assertAnglesAlmostEqual(observatory.getLongitude(), self.obs_longitude)
        self.assertAnglesAlmostEqual(observatory.getLatitude(), self.obs_latitude)
        self.assertAlmostEqual(observatory.getElevation(), self.obs_elevation)
        weather = visitInfo.getWeather()
        self.assertAlmostEqual(weather.getAirTemperature(), self.weath_airTemperature)
        self.assertAlmostEqual(weather.getAirPressure(), self.weath_airPressure, places=4)
        self.assertAlmostEqual(weather.getHumidity(), self.weath_humidity)

    def testPupil(self):
        """Test retrieval of pupil (without checking value)"""
        raw = self.butler.get("raw", visit=self.visit, ccd=self.ccdNum)
        visitInfo = raw.getInfo().getVisitInfo()
        camera = self.butler.get("camera", visit=self.visit, ccd=self.ccdNum)
        size = 16.4
        npix = 1024

        pupilFactory = camera.getPupilFactory(visitInfo, size, npix)
        self.assertIsInstance(pupilFactory, lsst.obs.hsc.hscPupil.HscPupilFactory)

        pupil = pupilFactory.getPupil(afwGeom.Point2D(0.0, 0.0))
        self.assertEqual(pupil.size, size)
        self.assertEqual(pupil.scale, size/npix)
        self.assertEqual(pupil.illuminated.shape, (npix, npix))

    def testRawMetadata(self):
        """Test retrieval of raw image metadata"""
        md = self.butler.get("raw_md", visit=self.visit, ccd=self.ccdNum)
        self.assertEqual(md.getScalar("DET-ID"), self.ccdNum)

    def testBias(self):
        """Test retrieval of bias frame"""
        bias = self.butler.get("bias", visit=self.visit, ccd=self.ccdNum)
        self.assertEqual(bias.getDimensions(), afwGeom.Extent2I(*self.ccdSize))
        self.assertEqual(bias.getDetector().getId(), self.ccdNum)

    def testDark(self):
        """Test retrieval of dark frame"""
        dark = self.butler.get("dark", visit=self.visit, ccd=self.ccdNum)
        self.assertEqual(dark.getDimensions(), afwGeom.Extent2I(*self.ccdSize))
        self.assertEqual(dark.getDetector().getId(), self.ccdNum)
        self.assertEqual(dark.getInfo().getVisitInfo().getExposureTime(), 1.0)

    def testFlat(self):
        """Test retrieval of flat"""
        flat = self.butler.get("flat", visit=self.visit, ccd=self.ccdNum)
        self.assertEqual(flat.getDimensions(), afwGeom.Extent2I(*self.ccdSize))
        self.assertEqual(flat.getDetector().getId(), self.ccdNum)

    def testLinearizer(self):
        self.assertTrue(self.butler.get('linearizer', ccdnum=1))
예제 #19
0
 def testNsecsTAI(self):
     ts = DateTime(1192755506000000000L, DateTime.TAI)
     self.assertEqual(ts.nsecs(DateTime.UTC), 1192755473000000000L)
     self.assertEqual(ts.nsecs(DateTime.TAI), 1192755506000000000L)
     self.assertEqual(ts.nsecs(), 1192755506000000000L)
     self.assertAlmostEqual(ts.get(DateTime.MJD, DateTime.UTC), 54392.040196759262)
예제 #20
0
class GetRawTestCase(lsst.utils.tests.TestCase):
    """Testing butler raw image retrieval"""
    def setUp(self):
        datadir = self.getTestDataDir()
        self.repoPath = os.path.join(datadir, "DATA")
        self.calibPath = os.path.join(datadir, "CALIB")
        self.butler = dafPersist.Butler(root=self.repoPath,
                                        calibRoot=self.calibPath)
        self.size = (2112, 4644)
        self.dataId = {'visit': 1038843}
        self.filter = "i2"
        self.exposureTime = 615.037
        self.darkTime = 615.0
        self.dateAvg = DateTime(54771.610881712964, DateTime.MJD, DateTime.TAI)
        self.boresightRaDec = SpherePoint(135.40941055, -2.39999432, degrees)
        self.boresightAzAlt = SpherePoint(122.34, 52.02, degrees)
        self.boresightAirmass = 1.269
        self.boresightRotAngle = 0 * degrees
        self.rotType = RotType.SKY
        self.obs_longitude = -155.468876 * degrees
        self.obs_latitude = 19.825252 * degrees
        self.obs_elevation = 4215
        self.weath_airTemperature = 0.90
        self.weath_airPressure = 617.65 * 100  # 100 Pascal/millibar
        self.weath_humidity = 39.77
        # NOTE: if we deal with DM-8053 and get UT1 implemented, ERA will change slightly.
        self.era = 4.55388 * radians

    def tearDown(self):
        del self.butler

    def assertExposure(self, exp, ccd, checkFilter=True):
        print("dataId: ", self.dataId)
        print("ccd: ", ccd)
        print("width: ", exp.getWidth())
        print("height: ", exp.getHeight())
        print("detector name: ", exp.getDetector().getName())
        print("filter name: ", exp.getFilter().getFilterProperty().getName())

        self.assertEqual(exp.getWidth(), self.size[0])
        self.assertEqual(exp.getHeight(), self.size[1])
        self.assertEqual(exp.getDetector().getName(), "ccd%02d" % ccd)
        if checkFilter:
            self.assertEqual(exp.getFilter().getFilterProperty().getName(),
                             self.filter)

        if display and ccd % 18 == 0:
            global frame
            frame += 1
            ccd = exp.getDetector()
            for amp in ccd:
                amp = amp
                print(ccd.getId(), amp.getId(),
                      amp.getDataSec().toString(),
                      amp.getBiasSec().toString(),
                      amp.getElectronicParams().getGain())
            cameraGeomUtils.showCcd(ccd, ccdImage=exp, frame=frame)

    def getTestDataDir(self):
        try:
            datadir = getPackageDir("testdata_cfht")
        except pexExcept.NotFoundError as e:
            warnings.warn(e.args[0])
            raise unittest.SkipTest(
                "Skipping test as testdata_cfht is not setup")
        return datadir

    def testRaw(self):
        """Test retrieval of raw image"""
        if display:
            global frame
            frame += 1
            cameraGeomUtils.showCamera(self.butler.mapper.camera, frame=frame)

        for ccd in range(36):
            raw = self.butler.get("raw", self.dataId, ccd=ccd, immediate=True)

            self.assertExposure(raw, ccd)

            visitInfo = raw.getInfo().getVisitInfo()
            self.assertAlmostEqual(visitInfo.getDate().get(),
                                   self.dateAvg.get())
            self.assertAnglesAlmostEqual(visitInfo.getEra(),
                                         self.era,
                                         maxDiff=0.1 * degrees)
            self.assertAlmostEqual(visitInfo.getExposureTime(),
                                   self.exposureTime)
            self.assertAlmostEqual(visitInfo.getDarkTime(), self.darkTime)
            self.assertSpherePointsAlmostEqual(visitInfo.getBoresightRaDec(),
                                               self.boresightRaDec)
            self.assertSpherePointsAlmostEqual(visitInfo.getBoresightAzAlt(),
                                               self.boresightAzAlt)
            self.assertAlmostEqual(visitInfo.getBoresightAirmass(),
                                   self.boresightAirmass)
            self.assertTrue(visitInfo.getBoresightRotAngle(),
                            self.boresightRotAngle)
            self.assertEqual(visitInfo.getRotType(), self.rotType)
            observatory = visitInfo.getObservatory()
            self.assertAnglesAlmostEqual(observatory.getLongitude(),
                                         self.obs_longitude)
            self.assertAnglesAlmostEqual(observatory.getLatitude(),
                                         self.obs_latitude)
            self.assertAlmostEqual(observatory.getElevation(),
                                   self.obs_elevation)
            weather = visitInfo.getWeather()
            self.assertAlmostEqual(weather.getAirTemperature(),
                                   self.weath_airTemperature)
            self.assertAlmostEqual(weather.getAirPressure(),
                                   self.weath_airPressure)
            self.assertAlmostEqual(weather.getHumidity(), self.weath_humidity)

    def getDetrend(self, detrend):
        """Test retrieval of detrend image"""
        for ccd in range(36):
            flat = self.butler.get(detrend,
                                   self.dataId,
                                   ccd=ccd,
                                   immediate=True)

            self.assertExposure(flat, ccd, checkFilter=False)

    def testFlat(self):
        self.getDetrend("flat")

    def testBias(self):
        self.getDetrend("bias")

    def testFringe(self):
        self.getDetrend("fringe")

    def testPackageName(self):
        name = dafPersist.Butler.getMapperClass(root=self.repoPath).packageName
        self.assertEqual(name, "obs_cfht")
예제 #21
0
class GetDataTestCase(lsst.utils.tests.TestCase):
    """Demonstrate retrieval of data from a repository."""
    @unittest.skipIf(testDataDirectory is None, "%s is not available" % testDataPackage)
    def setUp(self):
        rawPath = os.path.join(testDataDirectory, "hsc", "raw")
        calibPath = os.path.join(testDataDirectory, "hsc", "calib")
        self.repoPath = createDataRepository("lsst.obs.hsc.HscMapper", rawPath, calibPath)
        self.butler = dafPersist.Butler(root=self.repoPath, calibRoot=calibPath)

        # The following properties of the provided data are known a priori.
        self.visit = 904024
        self.ccdNum = 50
        self.filter = 'i'
        self.rawSize = (2144, 4241)
        self.ccdSize = (2048, 4176)
        self.exptime = 30.0
        self.darktime = self.exptime  # No explicit darktime
        dateBeg = DateTime(56598.26106374757, DateTime.MJD, DateTime.UTC)
        dateAvgNSec = dateBeg.nsecs() + int(0.5e9*self.exptime)
        self.dateAvg = DateTime(dateAvgNSec, DateTime.TAI)
        self.boresightRaDec = afwGeom.SpherePoint(320.7499250000, 0.500019444, degrees)
        self.boresightAzAlt = afwGeom.SpherePoint(226.68922661, 63.04359233, degrees)
        self.boresightAirmass = 1.121626027604189
        self.boresightRotAngle = 270.0*degrees
        self.rotType = RotType.SKY
        self.obs_longitude = -155.476667*degrees
        self.obs_latitude = 19.825556*degrees
        self.obs_elevation = 4139
        self.weath_airTemperature = MakeRawVisitInfo.centigradeFromKelvin(272.35)
        self.weath_airPressure = MakeRawVisitInfo.pascalFromMmHg(621.7)
        self.weath_humidity = 33.1
        # NOTE: if we deal with DM-8053 and get UT1 implemented, ERA will change slightly.
        lst = 340.189608333*degrees
        self.era = lst - self.obs_longitude

    def tearDown(self):
        del self.butler
        rmtree(self.repoPath)

    def testRaw(self):
        """Test retrieval of raw image"""
        raw = self.butler.get("raw", visit=self.visit, ccd=self.ccdNum)
        ccd = raw.getDetector()
        self.assertEqual(raw.getDimensions(), afwGeom.Extent2I(*self.rawSize))
        self.assertEqual(raw.getFilter().getFilterProperty().getName(), self.filter)
        self.assertEqual(ccd.getId(), self.ccdNum)
        self.assertEqual(ccd.getBBox().getDimensions(), afwGeom.Extent2I(*self.ccdSize))

        visitInfo = raw.getInfo().getVisitInfo()
        self.assertAlmostEqual(visitInfo.getDate().get(), self.dateAvg.get())
        self.assertAnglesAlmostEqual(visitInfo.getEra(), self.era)
        self.assertSpherePointsAlmostEqual(visitInfo.getBoresightRaDec(), self.boresightRaDec)
        self.assertSpherePointsAlmostEqual(visitInfo.getBoresightAzAlt(), self.boresightAzAlt)
        self.assertAlmostEqual(visitInfo.getBoresightAirmass(), self.boresightAirmass)
        self.assertAnglesAlmostEqual(visitInfo.getBoresightRotAngle(), self.boresightRotAngle)
        self.assertEqual(visitInfo.getRotType(), self.rotType)
        self.assertEqual(visitInfo.getExposureTime(), self.exptime)
        self.assertEqual(visitInfo.getDarkTime(), self.darktime)
        observatory = visitInfo.getObservatory()
        self.assertAnglesAlmostEqual(observatory.getLongitude(), self.obs_longitude)
        self.assertAnglesAlmostEqual(observatory.getLatitude(), self.obs_latitude)
        self.assertAlmostEqual(observatory.getElevation(), self.obs_elevation)
        weather = visitInfo.getWeather()
        self.assertAlmostEqual(weather.getAirTemperature(), self.weath_airTemperature)
        self.assertAlmostEqual(weather.getAirPressure(), self.weath_airPressure)
        self.assertAlmostEqual(weather.getHumidity(), self.weath_humidity)

    def testPupil(self):
        """Test retrieval of pupil (without checking value)"""
        raw = self.butler.get("raw", visit=self.visit, ccd=self.ccdNum)
        visitInfo = raw.getInfo().getVisitInfo()
        camera = self.butler.get("camera", visit=self.visit, ccd=self.ccdNum)
        size = 16.4
        npix = 1024

        pupilFactory = camera.getPupilFactory(visitInfo, size, npix)
        self.assertIsInstance(pupilFactory, lsst.obs.hsc.hscPupil.HscPupilFactory)

        pupil = pupilFactory.getPupil(afwGeom.Point2D(0.0, 0.0))
        self.assertEqual(pupil.size, size)
        self.assertEqual(pupil.scale, size/npix)
        self.assertEqual(pupil.illuminated.shape, (npix, npix))

    def testRawMetadata(self):
        """Test retrieval of raw image metadata"""
        md = self.butler.get("raw_md", visit=self.visit, ccd=self.ccdNum)
        self.assertEqual(md.get("DET-ID"), self.ccdNum)

    def testBias(self):
        """Test retrieval of bias frame"""
        bias = self.butler.get("bias", visit=self.visit, ccd=self.ccdNum)
        self.assertEqual(bias.getDimensions(), afwGeom.Extent2I(*self.ccdSize))
        self.assertEqual(bias.getDetector().getId(), self.ccdNum)

    def testDark(self):
        """Test retrieval of dark frame"""
        dark = self.butler.get("dark", visit=self.visit, ccd=self.ccdNum)
        self.assertEqual(dark.getDimensions(), afwGeom.Extent2I(*self.ccdSize))
        self.assertEqual(dark.getDetector().getId(), self.ccdNum)
        self.assertEqual(dark.getInfo().getVisitInfo().getExposureTime(), 1.0)

    def testFlat(self):
        """Test retrieval of flat"""
        flat = self.butler.get("flat", visit=self.visit, ccd=self.ccdNum)
        self.assertEqual(flat.getDimensions(), afwGeom.Extent2I(*self.ccdSize))
        self.assertEqual(flat.getDetector().getId(), self.ccdNum)

    def testLinearizer(self):
        self.assertTrue(self.butler.get('linearizer', ccdnum=1))
예제 #22
0
class GetRawTestCase(lsst.utils.tests.TestCase):

    """Testing butler raw image retrieval"""

    def setUp(self):
        datadir = self.getTestDataDir()
        self.repoPath = os.path.join(datadir, "DATA")
        self.calibPath = os.path.join(datadir, "CALIB")
        self.butler = dafPersist.Butler(root=self.repoPath,
                                        calibRoot=self.calibPath)
        self.size = (2112, 4644)
        self.dataId = {'visit': 1038843}
        self.filter = "i2"
        self.exposureTime = 615.037
        self.darkTime = 615.0
        self.dateAvg = DateTime(54771.610881712964, DateTime.MJD, DateTime.TAI)
        self.boresightRaDec = SpherePoint(135.40941055, -2.39999432, degrees)
        self.boresightAzAlt = SpherePoint(122.34, 52.02, degrees)
        self.boresightAirmass = 1.269
        self.rotType = RotType.UNKNOWN
        self.obs_longitude = -155.468876*degrees
        self.obs_latitude = 19.825252*degrees
        self.obs_elevation = 4215
        self.weath_airTemperature = 0.90
        self.weath_airPressure = 617.65*100  # 100 Pascal/millibar
        self.weath_humidity = 39.77
        # NOTE: if we deal with DM-8053 and get UT1 implemented, ERA will change slightly.
        self.era = 4.55388*radians

    def tearDown(self):
        del self.butler

    def assertExposure(self, exp, ccd, checkFilter=True):
        print("dataId: ", self.dataId)
        print("ccd: ", ccd)
        print("width: ", exp.getWidth())
        print("height: ", exp.getHeight())
        print("detector name: ", exp.getDetector().getName())
        print("filter name: ", exp.getFilter().getFilterProperty().getName())

        self.assertEqual(exp.getWidth(), self.size[0])
        self.assertEqual(exp.getHeight(), self.size[1])
        self.assertEqual(exp.getDetector().getName(), "ccd%02d" % ccd)
        if checkFilter:
            self.assertEqual(exp.getFilter().getFilterProperty().getName(), self.filter)

        if display and ccd % 18 == 0:
            global frame
            frame += 1
            ccd = exp.getDetector()
            for amp in ccd:
                amp = amp
                print(ccd.getId(), amp.getId(), amp.getDataSec().toString(),
                      amp.getBiasSec().toString(), amp.getElectronicParams().getGain())
            cameraGeomUtils.showCcd(ccd, ccdImage=exp, frame=frame)

    def getTestDataDir(self):
        try:
            datadir = getPackageDir("testdata_cfht")
        except pexExcept.NotFoundError as e:
            warnings.warn(e.args[0])
            raise unittest.SkipTest("Skipping test as testdata_cfht is not setup")
        return datadir

    def testRaw(self):
        """Test retrieval of raw image"""
        if display:
            global frame
            frame += 1
            cameraGeomUtils.showCamera(self.butler.mapper.camera, frame=frame)

        for ccd in range(36):
            raw = self.butler.get("raw", self.dataId, ccd=ccd, immediate=True)

            self.assertExposure(raw, ccd)

            visitInfo = raw.getInfo().getVisitInfo()
            self.assertAlmostEqual(visitInfo.getDate().get(), self.dateAvg.get())
            self.assertAnglesAlmostEqual(visitInfo.getEra(), self.era, maxDiff=0.1*degrees)
            self.assertAlmostEqual(visitInfo.getExposureTime(), self.exposureTime)
            self.assertAlmostEqual(visitInfo.getDarkTime(), self.darkTime)
            self.assertSpherePointsAlmostEqual(visitInfo.getBoresightRaDec(), self.boresightRaDec)
            self.assertSpherePointsAlmostEqual(visitInfo.getBoresightAzAlt(), self.boresightAzAlt)
            self.assertAlmostEqual(visitInfo.getBoresightAirmass(), self.boresightAirmass)
            self.assertTrue(math.isnan(visitInfo.getBoresightRotAngle()))
            self.assertEqual(visitInfo.getRotType(), self.rotType)
            observatory = visitInfo.getObservatory()
            self.assertAnglesAlmostEqual(observatory.getLongitude(), self.obs_longitude)
            self.assertAnglesAlmostEqual(observatory.getLatitude(), self.obs_latitude)
            self.assertAlmostEqual(observatory.getElevation(), self.obs_elevation)
            weather = visitInfo.getWeather()
            self.assertAlmostEqual(weather.getAirTemperature(), self.weath_airTemperature)
            self.assertAlmostEqual(weather.getAirPressure(), self.weath_airPressure)
            self.assertAlmostEqual(weather.getHumidity(), self.weath_humidity)

    def getDetrend(self, detrend):
        """Test retrieval of detrend image"""
        for ccd in range(36):
            flat = self.butler.get(detrend, self.dataId, ccd=ccd, immediate=True)

            self.assertExposure(flat, ccd, checkFilter=False)

    def testFlat(self):
        self.getDetrend("flat")

    def testBias(self):
        self.getDetrend("bias")

    def testFringe(self):
        self.getDetrend("fringe")

    def testPackageName(self):
        name = dafPersist.Butler.getMapperClass(root=self.repoPath).packageName
        self.assertEqual(name, "obs_cfht")
예제 #23
0
 def testBoundaryMJD(self):
     ts = DateTime(47892.0, DateTime.MJD, DateTime.UTC)
     self.assertEqual(ts.nsecs(DateTime.UTC), 631152000000000000)
     self.assertEqual(ts.nsecs(DateTime.TAI), 631152025000000000)
     self.assertEqual(ts.get(DateTime.MJD, DateTime.UTC), 47892.0)
예제 #24
0
 def testBoundaryMJD(self):
     ts = DateTime(47892.0, DateTime.MJD, DateTime.UTC)
     self.assertEqual(ts.nsecs(DateTime.UTC), long(631152000000000000))
     self.assertEqual(ts.nsecs(DateTime.TAI), long(631152025000000000))
     self.assertEqual(ts.get(DateTime.MJD, DateTime.UTC), 47892.0)
예제 #25
0
    def _forcedPhotometry(
            self, objects: pandas.DataFrame, latest_objects: pandas.DataFrame,
            dt: DateTime,
            visit_id: int) -> Tuple[pandas.DataFrame, pandas.DataFrame]:
        """Do forced photometry on latest_objects which are not in objects.

        Extends objects catalog with new DiaObjects.

        Parameters
        ----------
        objects : `pandas.DataFrame`
            Catalog containing DiaObject records
        latest_objects : `pandas.DataFrame`
            Catalog containing DiaObject records
        dt : `DateTime`
            Visit time.
        visit_id : `int`
            Visit ID.
        """

        midPointTai = dt.get(system=DateTime.MJD)

        if objects.empty:
            return pandas.DataFrame(
                columns=["diaObjectId", "ccdVisitId", "midPointTai", "flags"
                         ]), objects

        # Ids of the detected objects
        ids = set(objects['diaObjectId'])

        # do forced photometry for all detected DiaObjects
        df1 = pandas.DataFrame({
            "diaObjectId": objects["diaObjectId"],
            "ccdVisitId": visit_id,
            "midPointTai": midPointTai,
            "flags": 0,
        })

        # do forced photometry for non-detected DiaObjects (newer than cutoff)
        o1 = cast(pandas.DataFrame,
                  latest_objects[~latest_objects["diaObjectId"].isin(ids)])

        # only do it for 30 days after last detection
        cutoff = dt.toPython() - timedelta(days=self.config.forced_cutoff_days)
        o1 = cast(pandas.DataFrame, o1[o1["lastNonForcedSource"] > cutoff])

        if o1.empty:
            catalog = df1
        else:
            df2 = pandas.DataFrame({
                "diaObjectId": o1["diaObjectId"],
                "ccdVisitId": visit_id,
                "midPointTai": midPointTai,
                "flags": 0,
            })

            # extend forced sources
            catalog = pandas.concat([df1, df2])

            # also extend objects
            o2 = pandas.DataFrame({
                "diaObjectId": o1["diaObjectId"],
                "ra": o1["ra"],
                "decl": o1["decl"],
            })
            objects = objects.append(o2)

        return catalog, objects