LSST Applications g0265f82a02+d6b5cd48b5,g02d81e74bb+a41d3748ce,g1470d8bcf6+6be6c9203b,g2079a07aa2+14824f138e,g212a7c68fe+a4f2ea4efa,g2305ad1205+72971fe858,g295015adf3+ab2c85acae,g2bbee38e9b+d6b5cd48b5,g337abbeb29+d6b5cd48b5,g3ddfee87b4+31b3a28dff,g487adcacf7+082e807817,g50ff169b8f+5929b3527e,g52b1c1532d+a6fc98d2e7,g591dd9f2cf+b2918d57ae,g5a732f18d5+66d966b544,g64a986408d+a41d3748ce,g858d7b2824+a41d3748ce,g8a8a8dda67+a6fc98d2e7,g99cad8db69+7fe4acdf18,g9ddcbc5298+d4bad12328,ga1e77700b3+246acaaf9c,ga8c6da7877+84af8b3ff8,gb0e22166c9+3863383f4c,gb6a65358fc+d6b5cd48b5,gba4ed39666+9664299f35,gbb8dafda3b+d8d527deb2,gc07e1c2157+b2dbe6b631,gc120e1dc64+61440b2abb,gc28159a63d+d6b5cd48b5,gcf0d15dbbd+31b3a28dff,gdaeeff99f8+a38ce5ea23,ge6526c86ff+39927bb362,ge79ae78c31+d6b5cd48b5,gee10cc3b42+a6fc98d2e7,gf1cff7945b+a41d3748ce,v24.1.5.rc1
LSST Data Management Base Package
Loading...
Searching...
No Matches
Classes | Functions | Variables
lsst.meas.algorithms.objectSizeStarSelector Namespace Reference

Classes

class  EventHandler
 
class  ObjectSizeStarSelectorConfig
 
class  ObjectSizeStarSelectorTask
 

Functions

 _assignClusters (yvec, centers)
 
 _kcenters (yvec, nCluster, useMedian=False, widthStdAllowed=0.15)
 
 _improveCluster (yvec, centers, clusterId, nsigma=2.0, nIteration=10, clusterNum=0, widthStdAllowed=0.15)
 
 plot (mag, width, centers, clusterId, marker="o", markersize=2, markeredgewidth=0, ltype='-', magType="model", clear=True)
 

Variables

 _LOG = getLogger(__name__)
 

Function Documentation

◆ _assignClusters()

lsst.meas.algorithms.objectSizeStarSelector._assignClusters ( yvec,
centers )
protected
Return a vector of centerIds based on their distance to the centers.

Definition at line 167 of file objectSizeStarSelector.py.

167def _assignClusters(yvec, centers):
168 """Return a vector of centerIds based on their distance to the centers.
169 """
170 assert len(centers) > 0
171
172 minDist = numpy.nan*numpy.ones_like(yvec)
173 clusterId = numpy.empty_like(yvec)
174 clusterId.dtype = int # zeros_like(..., dtype=int) isn't in numpy 1.5
175 dbl = _LOG.getChild("_assignClusters")
176 dbl.setLevel(dbl.INFO)
177
178 # Make sure we are logging aall numpy warnings...
179 oldSettings = numpy.seterr(all="warn")
180 with warnings.catch_warnings(record=True) as w:
181 warnings.simplefilter("always")
182 for i, mean in enumerate(centers):
183 dist = abs(yvec - mean)
184 if i == 0:
185 update = dist == dist # True for all points
186 else:
187 update = dist < minDist
188 if w: # Only do if w is not empty i.e. contains a warning message
189 dbl.trace(str(w[-1]))
190
191 minDist[update] = dist[update]
192 clusterId[update] = i
193 numpy.seterr(**oldSettings)
194
195 return clusterId
196
197

◆ _improveCluster()

lsst.meas.algorithms.objectSizeStarSelector._improveCluster ( yvec,
centers,
clusterId,
nsigma = 2.0,
nIteration = 10,
clusterNum = 0,
widthStdAllowed = 0.15 )
protected
Improve our estimate of one of the clusters (clusterNum) by sigma-clipping around its median.

Definition at line 240 of file objectSizeStarSelector.py.

240def _improveCluster(yvec, centers, clusterId, nsigma=2.0, nIteration=10, clusterNum=0, widthStdAllowed=0.15):
241 """Improve our estimate of one of the clusters (clusterNum) by sigma-clipping around its median.
242 """
243
244 nMember = sum(clusterId == clusterNum)
245 if nMember < 5: # can't compute meaningful interquartile range, so no chance of improvement
246 return clusterId
247 for iter in range(nIteration):
248 old_nMember = nMember
249
250 inCluster0 = clusterId == clusterNum
251 yv = yvec[inCluster0]
252
253 centers[clusterNum] = numpy.median(yv)
254 stdev = numpy.std(yv)
255
256 syv = sorted(yv)
257 stdev_iqr = 0.741*(syv[int(0.75*nMember)] - syv[int(0.25*nMember)])
258 median = syv[int(0.5*nMember)]
259
260 sd = stdev if stdev < stdev_iqr else stdev_iqr
261
262 if False:
263 print("sigma(iqr) = %.3f, sigma = %.3f" % (stdev_iqr, numpy.std(yv)))
264 newCluster0 = abs(yvec - centers[clusterNum]) < nsigma*sd
265 clusterId[numpy.logical_and(inCluster0, newCluster0)] = clusterNum
266 clusterId[numpy.logical_and(inCluster0, numpy.logical_not(newCluster0))] = -1
267
268 nMember = sum(clusterId == clusterNum)
269 # 'sd < widthStdAllowed * median' prevents too much rejections
270 if nMember == old_nMember or sd < widthStdAllowed * median:
271 break
272
273 return clusterId
274
275

◆ _kcenters()

lsst.meas.algorithms.objectSizeStarSelector._kcenters ( yvec,
nCluster,
useMedian = False,
widthStdAllowed = 0.15 )
protected
A classic k-means algorithm, clustering yvec into nCluster clusters

Return the set of centres, and the cluster ID for each of the points

If useMedian is true, use the median of the cluster as its centre, rather than
the traditional mean

Serge Monkewitz points out that there other (maybe smarter) ways of seeding the means:
   "e.g. why not use the Forgy or random partition initialization methods"
however, the approach adopted here seems to work well for the particular sorts of things
we're clustering in this application

Definition at line 198 of file objectSizeStarSelector.py.

198def _kcenters(yvec, nCluster, useMedian=False, widthStdAllowed=0.15):
199 """A classic k-means algorithm, clustering yvec into nCluster clusters
200
201 Return the set of centres, and the cluster ID for each of the points
202
203 If useMedian is true, use the median of the cluster as its centre, rather than
204 the traditional mean
205
206 Serge Monkewitz points out that there other (maybe smarter) ways of seeding the means:
207 "e.g. why not use the Forgy or random partition initialization methods"
208 however, the approach adopted here seems to work well for the particular sorts of things
209 we're clustering in this application
210 """
211
212 assert nCluster > 0
213
214 mean0 = sorted(yvec)[len(yvec)//10] # guess
215 delta = mean0 * widthStdAllowed * 2.0
216 centers = mean0 + delta * numpy.arange(nCluster)
217
218 func = numpy.median if useMedian else numpy.mean
219
220 clusterId = numpy.zeros_like(yvec) - 1 # which cluster the points are assigned to
221 clusterId.dtype = int # zeros_like(..., dtype=int) isn't in numpy 1.5
222 while True:
223 oclusterId = clusterId
224 clusterId = _assignClusters(yvec, centers)
225
226 if numpy.all(clusterId == oclusterId):
227 break
228
229 for i in range(nCluster):
230 # Only compute func if some points are available; otherwise, default to NaN.
231 pointsInCluster = (clusterId == i)
232 if numpy.any(pointsInCluster):
233 centers[i] = func(yvec[pointsInCluster])
234 else:
235 centers[i] = numpy.nan
236
237 return centers, clusterId
238
239

◆ plot()

lsst.meas.algorithms.objectSizeStarSelector.plot ( mag,
width,
centers,
clusterId,
marker = "o",
markersize = 2,
markeredgewidth = 0,
ltype = '-',
magType = "model",
clear = True )

Definition at line 276 of file objectSizeStarSelector.py.

277 magType="model", clear=True):
278
279 log = _LOG.getChild("plot")
280 try:
281 import matplotlib.pyplot as plt
282 except ImportError as e:
283 log.warning("Unable to import matplotlib: %s", e)
284 return
285
286 try:
287 fig
288 except NameError:
289 fig = plt.figure()
290 else:
291 if clear:
292 fig.clf()
293
294 axes = fig.add_axes((0.1, 0.1, 0.85, 0.80))
295
296 xmin = sorted(mag)[int(0.05*len(mag))]
297 xmax = sorted(mag)[int(0.95*len(mag))]
298
299 axes.set_xlim(-17.5, -13)
300 axes.set_xlim(xmin - 0.1*(xmax - xmin), xmax + 0.1*(xmax - xmin))
301 axes.set_ylim(0, 10)
302
303 colors = ["r", "g", "b", "c", "m", "k", ]
304 for k, mean in enumerate(centers):
305 if k == 0:
306 axes.plot(axes.get_xlim(), (mean, mean,), "k%s" % ltype)
307
308 li = (clusterId == k)
309 axes.plot(mag[li], width[li], marker, markersize=markersize, markeredgewidth=markeredgewidth,
310 color=colors[k % len(colors)])
311
312 li = (clusterId == -1)
313 axes.plot(mag[li], width[li], marker, markersize=markersize, markeredgewidth=markeredgewidth,
314 color='k')
315
316 if clear:
317 axes.set_xlabel("Instrumental %s mag" % magType)
318 axes.set_ylabel(r"$\sqrt{(I_{xx} + I_{yy})/2}$")
319
320 return fig
321
322
323@pexConfig.registerConfigurable("objectSize", sourceSelectorRegistry)

Variable Documentation

◆ _LOG

lsst.meas.algorithms.objectSizeStarSelector._LOG = getLogger(__name__)
protected

Definition at line 41 of file objectSizeStarSelector.py.