def gen_ginfo(arr): l = arr['param'][:, 0] b = arr['param'][:, 1] plx = arr['param'][:, 2] pmra = arr['param'][:, 3] pmdec = arr['param'][:, 4] # correct for 0 ~ 360 jump if np.max(l) - np.min(l) > 180.: ids = np.where(l > 180.)[0] l[ids] -= 360. l0 = np.average(l) b0 = np.average(b) pmra0 = np.average(pmra) pmdec0 = np.average(pmdec) plx0 = np.average(plx) g0 = Galactic(l=l0 * u.degree, b=b0 * u.degree) gs = Galactic(l=l * u.degree, b=b * u.degree) rs = g0.separation(gs).degree r_max = np.max(rs) dpm = np.sqrt((pmra - pmra0)**2 + (pmdec - pmdec0)**2) dpm_max = np.max(dpm) dplx_max = np.max(np.abs(plx - plx0)) tpl = [len(arr), l0, b0, r_max, pmra0, pmdec0, dpm_max, plx0, dplx_max] return tpl
def is_overlap(g0, g1): fac = 1.0 p0 = Galactic(l=g0[1] * u.degree, b=g0[2] * u.degree) p1 = Galactic(l=g1[1] * u.degree, b=g1[2] * u.degree) dr = p0.separation(p1).degree if dr > (g0[3] + g1[3]) * fac: return False dpm = np.sqrt((g0[4] - g1[4])**2 + (g0[5] - g1[5])**2) if dpm > (g0[6] + g1[6]) * fac: return False dplx = np.abs(g0[7] - g1[7]) if dplx > (g0[8] + g1[8]) * fac: return False return True
def fof(self): tree = self.build_tree() nloop = 0 while self.nassigned < self.nstar: for i in range(self.nstar): if self.s2g[i] > 0: continue ids = tree.query_radius([self.X[i]], r=self.b_fof)[0] gid = -1 for k in ids: if self.s2g[k] >= 0: gid = self.s2g[i] break if gid < 0: self.groups.append([]) gid = self.ngroup self.ngroup += 1 self.update_neighbor(gid, ids) nloop += 1 print 'loop %d: %d stars assigned, %d groups' % \ (nloop, self.nassigned, self.ngroup) self.clear_group() print '%d groups constructed.' % (self.ngroup) ginfo0 = [] lens = [] l_key = [] for grp in self.groups: if len(grp) < n_star_min: continue lens.append(len(grp)) l = self.l[grp] b = self.b[grp] plx = self.plx[grp] pmra = self.pmra[grp] pmdec = self.pmdec[grp] l_key.append(self.keys[grp]) # 0 to 360 jump of l has been corrected. l0 = np.average(l) b0 = np.average(b) pmra0 = np.average(pmra) pmdec0 = np.average(pmdec) plx0 = np.average(plx) g0 = Galactic(l=l0 * u.degree, b=b0 * u.degree) gs = Galactic(l=l * u.degree, b=b * u.degree) rs = g0.separation(gs).degree r_max = np.max(rs) dpm = np.sqrt((pmra - pmra0)**2 + (pmdec - pmdec0)**2) dpm_max = np.max(dpm) dplx_max = np.max(np.abs(plx - plx0)) # tpl = (l0, b0, r_max, pmra0, pmdec0, dpm_max, plx0, dplx_max, grp, seg) tpl = [ len(grp), l0, b0, r_max, pmra0, pmdec0, dpm_max, plx0, dplx_max ] ginfo0.append(tpl) ids = np.argsort(lens)[::-1] l_key1 = [] ginfos = [] for id in ids: ginfos.append(ginfo0[id]) l_key1.append(l_key[id]) return ginfos, l_key1