Coverage for tests / test_adaptiveThresholdDetection.py: 33%
59 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-14 23:55 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-04-14 23:55 +0000
1import unittest
3import lsst.utils.tests
4import numpy as np
5from lsst.afw.geom import makeCdMatrix, makeSkyWcs
6from lsst.afw.table import SourceTable
7from lsst.geom import Box2I, Extent2I, Point2D, Point2I, SpherePoint, degrees
8from lsst.meas.algorithms.adaptive_thresholds import AdaptiveThresholdDetectionTask
9from lsst.meas.algorithms.testUtils import plantSources
12class AdaptiveThresholdDetectionTest(lsst.utils.tests.TestCase):
13 def setUp(self):
14 xy0 = Point2I(12345, 67890) # xy0 for image
15 dims = Extent2I(2345, 2345) # Dimensions of image
16 self.box = Box2I(xy0, dims) # Bounding box of image
17 self.sigma = 3.21 # PSF sigma
18 self.nSigmaForKernel = 5.0 # Number of PSF sigmas for kernel
19 self.sky = 12345.6 # Sky level
20 noise = np.sqrt(self.sky)*np.pi*self.sigma**2 # Poisson noise per PSF
21 self.faint = 1.0*noise # Faintest level for star fluxes
22 self.bright = 100.0*noise # Brightest level for star fluxes
23 self.starBox = Box2I(self.box) # Area on image in which we can put star centers
24 starBoxBuffer = 4.0 # Buffer for star centers around edge
25 self.starBox.grow(-int(starBoxBuffer*self.sigma))
26 self.scale = 1.0e-5*degrees # Pixel scale
27 self.config = AdaptiveThresholdDetectionTask.ConfigClass()
28 self.rtol = 1e-4
30 def makeMockExposure(self, numStars=300):
31 rng = np.random.Generator(np.random.MT19937(12345))
32 stars = [(xx, yy, ff, self.sigma) for xx, yy, ff in
33 zip(rng.uniform(self.starBox.getMinX(), self.starBox.getMaxX(), numStars),
34 rng.uniform(self.starBox.getMinY(), self.starBox.getMaxY(), numStars),
35 np.linspace(self.faint, self.bright, numStars))]
36 exposure = plantSources(self.box, 2*int(self.nSigmaForKernel*self.sigma) + 1, self.sky, stars, True)
37 exposure.setWcs(makeSkyWcs(crpix=Point2D(0, 0),
38 crval=SpherePoint(0, 0, degrees),
39 cdMatrix=makeCdMatrix(scale=self.scale)))
40 return exposure
42 def tearDown(self):
43 # del self.exposure
44 del self.config
46 def check(self, expectFactor, initialThreshold=None):
47 schema = SourceTable.makeMinimalSchema()
48 table = SourceTable.make(schema)
49 task = AdaptiveThresholdDetectionTask(config=self.config)
50 results = task.run(table, self.exposure, initialThreshold=initialThreshold)
51 self.assertFloatsAlmostEqual(results.thresholdValue, expectFactor, rtol=self.rtol)
53 def testUncrowded(self):
54 """Add sparse-ish numbers of stars.
55 """
56 self.exposure = self.makeMockExposure()
57 self.check(5.0)
58 self.exposure = self.makeMockExposure(numStars=100)
59 self.check(5.0)
61 def testCrowded(self):
62 """Add enough stars to be considered crowded and test adjusting
63 initial detection threshold.
64 """
65 self.exposure = self.makeMockExposure(numStars=8000)
66 self.check(23.8)
67 self.exposure = self.makeMockExposure(numStars=8000)
68 self.check(50.0, initialThreshold=50.0)
69 self.exposure = self.makeMockExposure(numStars=25000)
70 self.check(173.4, initialThreshold=20.0)
73class TestMemory(lsst.utils.tests.MemoryTestCase):
74 pass
77def setup_module(module):
78 lsst.utils.tests.init()
81if __name__ == "__main__": 81 ↛ 82line 81 didn't jump to line 82 because the condition on line 81 was never true
82 import sys
83 setup_module(sys.modules['__main__'])
84 unittest.main()