Skip to content

Commit

Permalink
Create unittest for LocalPhotometry.
Browse files Browse the repository at this point in the history
Debug unittest

Add functor unittests.

Add functor value testing.

Debug unittest
  • Loading branch information
morriscb committed Mar 6, 2020
1 parent d3d6d94 commit 1841575
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 12 deletions.
18 changes: 12 additions & 6 deletions python/lsst/pipe/tasks/functors.py
Original file line number Diff line number Diff line change
Expand Up @@ -1080,8 +1080,7 @@ def instFluxErrToNanojanskyErr(self, instFlux, instFluxErr, localCalib, localCal
calibFluxErr : `numpy.ndarray` or `pd.Series`
Errors on calibrated flux measurements.
"""
return (self.instFluxToNanojansky(instFlux, localCalib) *
np.hypot(instFluxErr / instFlux, localCalib / localCalibErr))
return np.hypot(instFluxErr * localCalib, instFlux * localCalibErr)

def instFluxToMagnitude(self, instFlux, localCalib):
"""Convert instrument flux to nanojanskys.
Expand Down Expand Up @@ -1165,11 +1164,16 @@ class LocalMagnitude(LocalPhotometry):
def columns(self):
return [self.instFluxCol, self.photoCalibCol]

@property
def name(self):
return 'mag_{0}'.format(self.instFluxCol)

def _func(self, df):
return self.instFluxToMagnitude(df[self.col], self.fluxMag0)
return self.instFluxToMagnitude(df[self.instFluxCol],
df[self.photoCalibCol])


class LocalMagnitudeErr(Photometry):
class LocalMagnitudeErr(LocalPhotometry):
"""Compute calibrated AB magnitude errors using the local calibration value.
"""

Expand All @@ -1183,5 +1187,7 @@ def name(self):
return 'magErr_{0}'.format(self.instFluxCol)

def _func(self, df):
return self.instFluxErrToMagnitudeErr(df[self.instFluxCol], df[self.instFluxErrCol],
df[self.photoCalibCol], df[self.photoCalibErrCol])
return self.instFluxErrToMagnitudeErr(df[self.instFluxCol],
df[self.instFluxErrCol],
df[self.photoCalibCol],
df[self.photoCalibErrCol])
79 changes: 73 additions & 6 deletions tests/test_functors.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

import astropy.units as u
import copy
import functools
import numpy as np
Expand All @@ -35,7 +36,8 @@
DecColumn, Mag, MagDiff, Color, StarGalaxyLabeller,
DeconvolvedMoments, SdssTraceSize, PsfSdssTraceSizeDiff,
HsmTraceSize, PsfHsmTraceSizeDiff, HsmFwhm,
LocalPhotometry)
LocalPhotometry, LocalNanojansky, LocalNanojanskyErr,
LocalMagnitude, LocalMagnitudeErr)
havePyArrow = True
except ImportError:
havePyArrow = False
Expand Down Expand Up @@ -273,10 +275,16 @@ def testCompositeColor(self):
def testLocalPhotometry(self):
"""Test the local photometry functors.
"""
self.dataDict["base_PsfFlux_instFlux"] = np.full(self.nRecords, 1000)
self.dataDict["base_PsfFlux_instFluxErr"] = np.full(self.nRecords, 10)
self.dataDict["base_LocalPhotoCalib"] = np.full(self.nRecords, 10)
self.dataDict["base_LocalPhotoCalibErr"] = np.full(self.nRecords, 1)
flux = 1000
fluxErr = 10
calib = 10
calibErr = 1
self.dataDict["base_PsfFlux_instFlux"] = np.full(self.nRecords, flux)
self.dataDict["base_PsfFlux_instFluxErr"] = np.full(self.nRecords,
fluxErr)
self.dataDict["base_LocalPhotoCalib"] = np.full(self.nRecords, calib)
self.dataDict["base_LocalPhotoCalibErr"] = np.full(self.nRecords,
calibErr)
parq = self.simulateMultiParquet(self.dataDict)
func = LocalPhotometry("base_PsfFlux_instFlux",
"base_PsfFlux_instFluxErr",
Expand All @@ -294,7 +302,7 @@ def testLocalPhotometry(self):
mag = func.instFluxToMagnitude(
df[("meas", "HSC-G", "base_PsfFlux_instFlux")],
df[("meas", "HSC-G", "base_LocalPhotoCalib")])
nanJanskyErr = func.instFluxErrToMagnitudeErr(
nanoJanskyErr = func.instFluxErrToNanojanskyErr(
df[("meas", "HSC-G", "base_PsfFlux_instFlux")],
df[("meas", "HSC-G", "base_PsfFlux_instFluxErr")],
df[("meas", "HSC-G", "base_LocalPhotoCalib")],
Expand All @@ -305,6 +313,65 @@ def testLocalPhotometry(self):
df[("meas", "HSC-G", "base_LocalPhotoCalib")],
df[("meas", "HSC-G", "base_LocalPhotoCalibErr")])

self.assertTrue(np.allclose(nanoJansky.values,
flux * calib,
atol=1e-13,
rtol=0))
self.assertTrue(np.allclose(mag.values,
(flux * calib * u.nJy).to_value(u.ABmag),
atol=1e-13,
rtol=0))
self.assertTrue(np.allclose(nanoJanskyErr.values,
np.hypot(fluxErr * calib, flux * calibErr),
atol=1e-13,
rtol=0))
self.assertTrue(np.allclose(
magErr.values,
2.5 / np.log(10) * nanoJanskyErr.values / nanoJansky.values,
atol=1e-13,
rtol=0))

# Test functors
func = LocalNanojansky("base_PsfFlux_instFlux",
"base_PsfFlux_instFluxErr",
"base_LocalPhotoCalib",
"base_LocalPhotoCalibErr")
val = self._funcVal(func, parq)
self.assertTrue(np.allclose(nanoJansky.values,
val.values,
atol=1e-13,
rtol=0))

func = LocalNanojanskyErr("base_PsfFlux_instFlux",
"base_PsfFlux_instFluxErr",
"base_LocalPhotoCalib",
"base_LocalPhotoCalibErr")
val = self._funcVal(func, parq)
self.assertTrue(np.allclose(nanoJanskyErr.values,
val.values,
atol=1e-13,
rtol=0))

func = LocalMagnitude("base_PsfFlux_instFlux",
"base_PsfFlux_instFluxErr",
"base_LocalPhotoCalib",
"base_LocalPhotoCalibErr")
val = self._funcVal(func, parq)
self.assertTrue(np.allclose(mag.values,
val.values,
atol=1e-13,
rtol=0))

func = LocalMagnitudeErr("base_PsfFlux_instFlux",
"base_PsfFlux_instFluxErr",
"base_LocalPhotoCalib",
"base_LocalPhotoCalibErr")
val = self._funcVal(func, parq)
self.assertTrue(np.allclose(magErr.values,
val.values,
atol=1e-13,
rtol=0))


class MyMemoryTestCase(lsst.utils.tests.MemoryTestCase):
pass
Expand Down

0 comments on commit 1841575

Please sign in to comment.