Coverage for python / lsst / afw / detection / _footprintContinued.py: 41%

23 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-14 16:53 -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# 

19 

20__all__ = [] # import this module only for its side effects 

21 

22from typing import TYPE_CHECKING 

23 

24if TYPE_CHECKING: 

25 from lsst.afw.image import Image 

26 

27import numpy as np 

28 

29from lsst.utils import continueClass 

30 

31from lsst.geom import Point2I 

32from ._detection import Footprint 

33 

34 

35def getFootprintIntersection( 

36 footprint1: Footprint, 

37 footprint2: Footprint, 

38 copyPeaks: bool = True, 

39) -> Footprint: 

40 """Calculate the intersection of two Footprints. 

41 

42 Parameters 

43 ---------- 

44 footprint1: Footprint 

45 The first Footprint. 

46 footprint2: Footprint 

47 The second Footprint. 

48 copyFromFirst: bool 

49 Whether or not to copy the peaks from the first Footprint. 

50 

51 Returns 

52 ------- 

53 result: 

54 The Footprint containing the intersection of the two footprints. 

55 """ 

56 # Create the intersecting footprint 

57 spans = footprint1.spans.intersect(footprint2.spans) 

58 result = Footprint(spans) 

59 result.setPeakSchema(footprint1.peaks.getSchema()) 

60 

61 if copyPeaks: 

62 # Only copy peaks that are contained in the intersection 

63 for peak in footprint1.peaks: 

64 if spans.contains(Point2I(peak.getIx(), peak.getIy())): 

65 # Add a copy of the entire peak record to preserve the ID 

66 result.peaks.append(peak) 

67 return result 

68 

69 

70@continueClass 

71class Footprint: # noqa: F811 

72 def computeFluxFromArray(self, image: np.ndarray, xy0: Point2I) -> float: 

73 """Calculate the total flux in the region of an image array 

74 contained in this Footprint. 

75 

76 Parameters 

77 ---------- 

78 image: 

79 Array containing the pixels to extract. 

80 xy0: 

81 The origin of the image array. 

82 

83 Returns 

84 flux: 

85 Flux from the image in pixels contained in the footprint. 

86 """ 

87 return self.spans.flatten(image, xy0).sum() 

88 

89 def computeFluxFromImage(self, image: "Image") -> float: 

90 """Calculate the total flux in the region of an Image contained in 

91 this Footprint. 

92 

93 Parameters 

94 ---------- 

95 image: 

96 Image to extract. 

97 

98 Returns 

99 ------- 

100 flux: 

101 Flux from the image pixels contained in the footprint. 

102 """ 

103 return self.computeFluxFromArray(image.array, image.getXY0()) 

104 

105 def intersect(self, other: Footprint, copyPeaks: bool = True) -> Footprint: 

106 """Calculate the intersection of this Footprint with another Footprint. 

107 

108 Parameters 

109 ---------- 

110 other: 

111 The other Footprint. 

112 copyPeaks: 

113 Whether or not to copy the peaks from this Footprint. 

114 Note: the peaks in other are always ignored. 

115 

116 Returns 

117 ------- 

118 result: 

119 The Footprint containing the intersection of the two footprints. 

120 """ 

121 return getFootprintIntersection(self, other, True)