Skip to content

cluster

Cluster

Source code in src/starfinder/cluster.py
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
class Cluster:

    def __init__(self, cluster_number, pixel, starfield):
        self.cluster_number = cluster_number
        self.pixel_list = [pixel]
        self.sf = starfield

    def set_cluster_number(self, cluster_number):
        self.cluster_number = cluster_number

    def add_pixel(self, pixel):
        self.pixel_list.append(pixel)

    def number_of_pixels(self):
        return len(self.pixel_list)

    def flux(self):
        """Estimate of flux for all pixels in cluster"""
        flux = 0
        for pixel in self.pixel_list:
            i, j = pixel
            flux += self.sf.n_ij[i, j] - self.sf.b_ij[i, j]
        return flux

    def mu(self):
        """Barycentre"""
        sumx = 0
        sumy = 0
        denom = 0
        for pixel in self.pixel_list:
            i, j = pixel
            sumx += j * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
            sumy += i * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
            denom += self.sf.n_ij[i, j] - self.sf.b_ij[i, j]
        mux = sumx / denom
        muy = sumy / denom
        return mux, muy

    def cov(self):
        """ Covariance matrix """
        mux, muy = self.mu()
        jc = round(mux)
        ic = round(muy)
        nRow, nCol = self.sf.data_shape
        halfBox = 8
        minCol = max(jc - halfBox, 0)
        maxCol = min(jc + halfBox, nCol - 1)
        minRow = max(ic - halfBox, 0)
        maxRow = min(ic + halfBox, nRow - 1)
        vx = 0
        vy = 0
        covxy = 0
        denom = 0
        for i in range(minRow, maxRow):
            for j in range(minCol, maxCol):
                vx += (j - mux) ** 2 * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
                vy += (i - muy) ** 2 * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
                covxy += (j - mux) * (i - muy) * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
                denom += self.sf.n_ij[i, j] - self.sf.b_ij[i, j]
        if denom > 0:
            vx = vx / denom
            vy = vy / denom
            covxy = covxy / denom
        else:
            vx = -1.0
            vy = -1.0
            covxy = -1.0
        cov = np.array([[vx, covxy], [covxy, vy]])
        return cov

cov()

Covariance matrix

Source code in src/starfinder/cluster.py
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
def cov(self):
    """ Covariance matrix """
    mux, muy = self.mu()
    jc = round(mux)
    ic = round(muy)
    nRow, nCol = self.sf.data_shape
    halfBox = 8
    minCol = max(jc - halfBox, 0)
    maxCol = min(jc + halfBox, nCol - 1)
    minRow = max(ic - halfBox, 0)
    maxRow = min(ic + halfBox, nRow - 1)
    vx = 0
    vy = 0
    covxy = 0
    denom = 0
    for i in range(minRow, maxRow):
        for j in range(minCol, maxCol):
            vx += (j - mux) ** 2 * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
            vy += (i - muy) ** 2 * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
            covxy += (j - mux) * (i - muy) * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
            denom += self.sf.n_ij[i, j] - self.sf.b_ij[i, j]
    if denom > 0:
        vx = vx / denom
        vy = vy / denom
        covxy = covxy / denom
    else:
        vx = -1.0
        vy = -1.0
        covxy = -1.0
    cov = np.array([[vx, covxy], [covxy, vy]])
    return cov

flux()

Estimate of flux for all pixels in cluster

Source code in src/starfinder/cluster.py
20
21
22
23
24
25
26
def flux(self):
    """Estimate of flux for all pixels in cluster"""
    flux = 0
    for pixel in self.pixel_list:
        i, j = pixel
        flux += self.sf.n_ij[i, j] - self.sf.b_ij[i, j]
    return flux

mu()

Barycentre

Source code in src/starfinder/cluster.py
28
29
30
31
32
33
34
35
36
37
38
39
40
def mu(self):
    """Barycentre"""
    sumx = 0
    sumy = 0
    denom = 0
    for pixel in self.pixel_list:
        i, j = pixel
        sumx += j * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
        sumy += i * (self.sf.n_ij[i, j] - self.sf.b_ij[i, j])
        denom += self.sf.n_ij[i, j] - self.sf.b_ij[i, j]
    mux = sumx / denom
    muy = sumy / denom
    return mux, muy