Coverage for python/lsst/afw/geom/_spanSetContinued.py: 29%

23 statements  

« prev     ^ index     » next       coverage.py v7.5.1, created at 2024-05-16 03:19 -0700

1# This file is part of afw. 

2# 

3# Developed for the LSST Data Management System. 

4# This product includes software developed by the LSST Project 

5# (https://www.lsst.org). 

6# See the COPYRIGHT file at the top-level directory of this distribution 

7# for details of code ownership. 

8# 

9# This program is free software: you can redistribute it and/or modify 

10# it under the terms of the GNU General Public License as published by 

11# the Free Software Foundation, either version 3 of the License, or 

12# (at your option) any later version. 

13# 

14# This program is distributed in the hope that it will be useful, 

15# but WITHOUT ANY WARRANTY; without even the implied warranty of 

16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

17# GNU General Public License for more details. 

18# 

19import numpy as np 

20 

21from . import SpanSet 

22from lsst.utils import continueClass 

23 

24__all__ = [] 

25 

26 

27@continueClass 

28class SpanSet: # noqa: F811 

29 def asArray(self, shape=None, xy0=None): 

30 """Convert a SpanSet into a numpy boolean array 

31 

32 Parameters 

33 ---------- 

34 shape : `tuple` of `int` 

35 The final shape of the output array. 

36 If `shape` is `None` then the extent of the bounding box is used. 

37 xy0 : `~lsst.geom.Box2I` or `tuple` of `int` 

38 The lower-left corner of the array that will contain the spans. 

39 If `xy0` is `None` then the origin of the bounding box is used. 

40 

41 Returns 

42 ------- 

43 result : `numpy.ndarray` 

44 The array with pixels contained in `spans` marked as `True`. 

45 """ 

46 # prevent circular import 

47 from lsst.afw.image import Mask 

48 

49 if shape is None and xy0 is None: 

50 # It's slightly faster to set the array with the Mask instead of 

51 # shifting the spans. 

52 bbox = self.getBBox() 

53 mask = Mask(bbox) 

54 self.setMask(mask, 1) 

55 result = mask.getArray().astype(bool) 

56 else: 

57 if shape is None: 

58 # Use the shape of the full SpanSet 

59 extent = self.getBBox().getDimensions() 

60 shape = extent[1], extent[0] 

61 

62 if xy0 is None: 

63 xy0 = self.getBBox().getMin() 

64 offset = (-xy0[0], -xy0[1]) 

65 

66 result = np.zeros(shape, dtype=bool) 

67 yidx, xidx = self.shiftedBy(*offset).indices() 

68 result[yidx, xidx] = 1 

69 return result