@@ -30,8 +30,8 @@ class IslandParams(object):
30
30
xbar (float): Barycentric centre in x-pixel index
31
31
ybar(float): Barycentric centre in y-pixel index
32
32
"""
33
- parent = attrib ()
34
- label_idx = attrib ()
33
+ parent = attrib (cmp = False )
34
+ label_idx = attrib (cmp = False )
35
35
sign = attrib (validator = _positive_negative_sign_validator )
36
36
extremum_val = attrib ()
37
37
extremum_x_idx = attrib (default = None )
@@ -49,7 +49,7 @@ def calculate_params(self):
49
49
50
50
)
51
51
self .extremum_y_idx , self .extremum_x_idx = _extremum_pixel_index (
52
- self .data )
52
+ self .data , self . sign )
53
53
sum = self .sign * np .ma .sum (self .data )
54
54
self .xbar = np .ma .sum (self .parent .xgrid * self .sign * self .data ) / sum
55
55
self .ybar = np .ma .sum (self .parent .ygrid * self .sign * self .data ) / sum
@@ -59,11 +59,15 @@ def _label_mask(labels_map, label_num):
59
59
return ~ (labels_map == label_num )
60
60
61
61
62
- def _extremum_pixel_index (masked_image ):
62
+ def _extremum_pixel_index (masked_image , sign ):
63
63
"""
64
- Returns max pixel index in np array ordering, i.e. (y_max, x_max)
64
+ Returns max/min pixel index in np array ordering, i.e. (y_max, x_max)
65
65
"""
66
- return np .unravel_index (np .ma .argmax (masked_image ),
66
+ if sign == 1 :
67
+ extremum_func = np .ma .argmax
68
+ elif sign == - 1 :
69
+ extremum_func = np .ma .argmin
70
+ return np .unravel_index (extremum_func (masked_image ),
67
71
masked_image .shape )
68
72
69
73
@@ -98,15 +102,11 @@ def __init__(self, data, detection_n_sigma, analysis_n_sigma,
98
102
99
103
# Label connected regions
100
104
105
+ self .label_map , label_extrema = self ._label_detection_islands (1 )
101
106
if find_negative_sources :
102
- pos_label_map , pos_label_extrema = self ._label_detection_islands (1 )
103
107
neg_label_map , neg_label_extrema = self ._label_detection_islands (- 1 )
104
- self .label_map = self ._combine_label_maps (pos_label_map ,
105
- neg_label_map )
106
- label_extrema = self ._combine_label_extrema (pos_label_extrema ,
107
- neg_label_extrema )
108
- else :
109
- self .label_map , label_extrema = self ._label_detection_islands (1 )
108
+ self .label_map += neg_label_map
109
+ label_extrema .update (neg_label_extrema )
110
110
111
111
self .islands = []
112
112
for l_idx , l_extremum in label_extrema .items ():
@@ -166,6 +166,13 @@ def _label_detection_islands(self, sign):
166
166
valid_label_extrema [label ] = ex_val
167
167
else :
168
168
label_map [label_map == label ] = 0.
169
+
170
+ if sign == - 1 :
171
+ # If extracting negative sources, flip the sign of the indices
172
+ valid_label_extrema = {- 1 * k : valid_label_extrema [k ]
173
+ for k in valid_label_extrema }
174
+ # ... and the corresponding label map:
175
+ label_map = - 1 * label_map
169
176
return label_map , valid_label_extrema
170
177
171
178
0 commit comments