def write_membership(self,filename): """ Write a catalog file of the likelihood region including membership properties. Parameters: ----------- filename : output filename Returns: -------- None """ # Column names name_objid = self.config['catalog']['objid_field'] name_mag_1 = self.config['catalog']['mag_1_field'] name_mag_2 = self.config['catalog']['mag_2_field'] name_mag_err_1 = self.config['catalog']['mag_err_1_field'] name_mag_err_2 = self.config['catalog']['mag_err_2_field'] # Coordinate conversion #ra,dec = gal2cel(self.catalog.lon,self.catalog.lat) glon,glat = self.catalog.glon_glat ra,dec = self.catalog.ra_dec # Angular and isochrone separations sep = angsep(self.source.lon,self.source.lat, self.catalog.lon,self.catalog.lat) isosep = self.isochrone.separation(self.catalog.mag_1,self.catalog.mag_2) # If size becomes an issue we can make everything float32 data = odict() data[name_objid] = self.catalog.objid data['GLON'] = glon data['GLAT'] = glat data['RA'] = ra data['DEC'] = dec data[name_mag_1] = self.catalog.mag_1 data[name_mag_err_1] = self.catalog.mag_err_1 data[name_mag_2] = self.catalog.mag_2 data[name_mag_err_2] = self.catalog.mag_err_2 data['COLOR'] = self.catalog.color data['ANGSEP'] = sep.astype(np.float32) data['ISOSEP'] = isosep.astype(np.float32) data['PROB'] = self.p.astype(np.float32) # HIERARCH allows header keywords longer than 8 characters header = [] for param,value in self.source.params.items(): card = dict(name='HIERARCH %s'%param.upper(), value=value.value, comment=param) header.append(card) card = dict(name='HIERARCH %s'%'TS',value=self.ts(), comment='test statistic') header.append(card) card = dict(name='HIERARCH %s'%'TIMESTAMP',value=time.asctime(), comment='creation time') header.append(card) fitsio.write(filename,data,header=header,clobber=True)
def match_query(lon1, lat1, lon2, lat2, eps=0.01, n_jobs=1): """ Perform a KDTree match after transforming to Cartesian coordinates. Parameters ---------- lon1 : longitude from first array (deg) lat1 : latitude from first array (deg) lon2 : longitude from second array (deg) lat2 : latitude from second array (deg) eps : precision (see `cKDTree.query`) n_jobs : Number of workers to use for processing (see `cKDTree.query`) Returns: -------- idx1 : index into the first array idx2 : index into the second array ds : angular seperation (deg) """ coords1 = projector(lon1, lat1) coords2 = projector(lon2, lat2) tree = cKDTree(coords2) idx1 = np.arange(lon1.size) idx2 = tree.query(coords1, eps=eps, n_jobs=n_jobs)[1] ds = angsep(lon1, lat1, lon2[idx2], lat2[idx2]) return np.atleast_1d(idx1), np.atleast_1d(idx2), np.atleast_1d(ds)
def write_membership2(self, filename): ra, dec = gal2cel(self.catalog.lon, self.catalog.lat) name_objid = self.config['catalog']['objid_field'] name_mag_1 = self.config['catalog']['mag_1_field'] name_mag_2 = self.config['catalog']['mag_2_field'] name_mag_err_1 = self.config['catalog']['mag_err_1_field'] name_mag_err_2 = self.config['catalog']['mag_err_2_field'] # Angular and isochrone separations sep = angsep(self.source.lon, self.source.lat, self.catalog.lon, self.catalog.lat) isosep = self.isochrone.separation(self.catalog.mag_1, self.catalog.mag_2) columns = [ pyfits.Column(name=name_objid, format='K', array=self.catalog.objid), pyfits.Column(name='GLON', format='D', array=self.catalog.lon), pyfits.Column(name='GLAT', format='D', array=self.catalog.lat), pyfits.Column(name='RA', format='D', array=ra), pyfits.Column(name='DEC', format='D', array=dec), pyfits.Column(name=name_mag_1, format='E', array=self.catalog.mag_1), pyfits.Column(name=name_mag_err_1, format='E', array=self.catalog.mag_err_1), pyfits.Column(name=name_mag_2, format='E', array=self.catalog.mag_2), pyfits.Column(name=name_mag_err_2, format='E', array=self.catalog.mag_err_2), pyfits.Column(name='COLOR', format='E', array=self.catalog.color), pyfits.Column(name='ANGSEP', format='E', array=sep), pyfits.Column(name='ISOSEP', format='E', array=isosep), pyfits.Column(name='PROB', format='E', array=self.p), ] hdu = pyfits.new_table(columns) for param, value in self.source.params.items(): # HIERARCH allows header keywords longer than 8 characters name = 'HIERARCH %s' % param.upper() hdu.header.set(name, value.value, param) name = 'HIERARCH %s' % 'TS' hdu.header.set(name, self.ts()) name = 'HIERARCH %s' % 'TIMESTAMP' hdu.header.set(name, time.asctime()) hdu.writeto(filename, clobber=True)
def write_membership(self,filename): ra,dec = gal2cel(self.catalog.lon,self.catalog.lat) name_objid = self.config['catalog']['objid_field'] name_mag_1 = self.config['catalog']['mag_1_field'] name_mag_2 = self.config['catalog']['mag_2_field'] name_mag_err_1 = self.config['catalog']['mag_err_1_field'] name_mag_err_2 = self.config['catalog']['mag_err_2_field'] # Angular and isochrone separations sep = angsep(self.source.lon,self.source.lat,self.catalog.lon,self.catalog.lat) isosep = self.isochrone.separation(self.catalog.mag_1,self.catalog.mag_2) columns = [ pyfits.Column(name=name_objid,format='K',array=self.catalog.objid), pyfits.Column(name='GLON',format='D',array=self.catalog.lon), pyfits.Column(name='GLAT',format='D',array=self.catalog.lat), pyfits.Column(name='RA',format='D',array=ra), pyfits.Column(name='DEC',format='D',array=dec), pyfits.Column(name=name_mag_1,format='E',array=self.catalog.mag_1), pyfits.Column(name=name_mag_err_1,format='E',array=self.catalog.mag_err_1), pyfits.Column(name=name_mag_2,format='E',array=self.catalog.mag_2), pyfits.Column(name=name_mag_err_2,format='E',array=self.catalog.mag_err_2), pyfits.Column(name='COLOR',format='E',array=self.catalog.color), pyfits.Column(name='ANGSEP',format='E',array=sep), pyfits.Column(name='ISOSEP',format='E',array=isosep), pyfits.Column(name='PROB',format='E',array=self.p), ] hdu = pyfits.new_table(columns) for param,value in self.source.params.items(): # HIERARCH allows header keywords longer than 8 characters name = 'HIERARCH %s'%param.upper() hdu.header.set(name,value.value,param) name = 'HIERARCH %s'%'TS' hdu.header.set(name,self.ts()) name = 'HIERARCH %s'%'TIMESTAMP' hdu.header.set(name,time.asctime()) hdu.writeto(filename,clobber=True)
def pdf(self, lon, lat): if self.projector is None: radius = angsep(self.lon, self.lat, lon, lat) return self.norm * self._pdf(radius) else: return super(RadialKernel, self).pdf(lon, lat)
def angsep(self, lon, lat): return angsep(self.lon, self.lat, lon, lat)
if (gcm['EXPNUM']!=qslr['EXPNUM']).any() \ or (gcm['CCDNUM']!=qslr['CCDNUM']).any(): msg = "GCM and qSLR do not match" raise Exception(msg) gcm = gcm[np.lexsort((gcm['CCDNUM'], gcm['EXPNUM']))] qslr = qslr[np.lexsort((qslr['CCDNUM'], qslr['EXPNUM']))] if (gcm['EXPNUM']!=qslr['EXPNUM']).any() \ or (gcm['CCDNUM']!=qslr['CCDNUM']).any(): msg = "GCM and qSLR do not match" raise Exception(msg) dzero = gcm['MAG_ZERO'] - qslr['MAG_ZERO'] sep = angsep(gcm['RA'], gcm['DEC'], qslr['RA_MEAN'], qslr['DEC_MEAN']) plt.figure() plotting.draw_hist(dzero, normed=False) plt.legend(loc='upper right') plt.xlabel(r'${\rm ZP_{GCM} - ZP_{qSLR}}') plt.ylabel("Number of CCDs") gcm_bands = dict() qslr_bands = dict() diff_bands = dict() for b in BANDS: zp_g = gcm['MAG_ZERO'][gcm['BAND'] == b] zp_q = qslr['MAG_ZERO'][qslr['BAND'] == b] delta = zp_g - zp_q labels = qslr[HPX][qslr['BAND'] == b]
plt.title('HPX %05d (g < 30)'%opts.pix) plt.xlabel('RA (deg)') plt.ylabel('DEC (deg)') plt.savefig(pltdir+'spatial_se_%05d.png'%opts.pix) plt.figure() sel = coadd['MAG_PSF_G'] < maglim plt.hist2d(coadd['RA'][sel],coadd['DEC'][sel],bins=250,norm=colors.LogNorm()) plt.colorbar(label='log(Counts)') plt.title('HPX %05d (g < %s)'%(opts.pix,maglim)) plt.xlabel('RA (deg)') plt.ylabel('DEC (deg)') plt.savefig(pltdir+'spatial_coadd_%05d.png'%opts.pix) # Matching and separation sep = angsep(coadd['RA'][inv],coadd['DEC'][inv],se['RA'],se['DEC']) plt.figure() n,b,p = plt.hist(sep*3600.,**kwargs) c = (b[:-1]+b[1:])/2. peak = c[np.argmax(n)]; text = '%.1f (mas)'%(peak*1e3) plot_peak(peak,text,lw=2,ls='--',c='r') plt.xlabel("Separation (arcsec)") plt.ylabel("Counts") plt.savefig(pltdir+'angsep_%05d.png'%opts.pix,bbox_inches='tight') plt.figure() plt.hist(sep*3600.,log=True,**kwargs) c = (b[:-1]+b[1:])/2. peak = c[np.argmax(n)]; text = '%.1f (mas)'%(peak*1e3) plot_peak(peak,text,lw=2,ls='--',c='r')
def write_membership(self, filename): """ Write a catalog file of the likelihood region including membership properties. Parameters: ----------- filename : output filename Returns: -------- None """ # Column names name_objid = self.config['catalog']['objid_field'] name_mag_1 = self.config['catalog']['mag_1_field'] name_mag_2 = self.config['catalog']['mag_2_field'] name_mag_err_1 = self.config['catalog']['mag_err_1_field'] name_mag_err_2 = self.config['catalog']['mag_err_2_field'] # Coordinate conversion #ra,dec = gal2cel(self.catalog.lon,self.catalog.lat) glon, glat = self.catalog.glon_glat ra, dec = self.catalog.ra_dec # Angular and isochrone separations sep = angsep(self.source.lon, self.source.lat, self.catalog.lon, self.catalog.lat) isosep = self.isochrone.separation(self.catalog.mag_1, self.catalog.mag_2) # If size becomes an issue we can make everything float32 data = odict() data[name_objid] = self.catalog.objid data['GLON'] = glon data['GLAT'] = glat data['RA'] = ra data['DEC'] = dec data[name_mag_1] = self.catalog.mag_1 data[name_mag_err_1] = self.catalog.mag_err_1 data[name_mag_2] = self.catalog.mag_2 data[name_mag_err_2] = self.catalog.mag_err_2 data['COLOR'] = self.catalog.color data['ANGSEP'] = sep.astype(np.float32) data['ISOSEP'] = isosep.astype(np.float32) data['PROB'] = self.p.astype(np.float32) # HIERARCH allows header keywords longer than 8 characters header = [] for param, value in self.source.params.items(): card = dict(name='HIERARCH %s' % param.upper(), value=value.value, comment=param) header.append(card) card = dict(name='HIERARCH %s' % 'TS', value=self.ts(), comment='test statistic') header.append(card) card = dict(name='HIERARCH %s' % 'TIMESTAMP', value=time.asctime(), comment='creation time') header.append(card) fitsio.write(filename, data, header=header, clobber=True)
def internal_astrometry(catfile,hpxfile,nside=128,band='r',plot=False): """ Calculate internal relative astrometry. Parameters ---------- catfile : merged catalog file hpxfile : single epoch catalog file(s) nside : nside for calculation band : band to use plot : plot output Returns ------- stats : output statistics """ nice = os.nice(0) os.nice(10-nice) if band=='all': band = 'r' #print catfile,hpxfile,nside #catfile = glob.glob('cat/*_%05d.fits'%pix)[0] if not os.path.exists(catfile): msg = "Couldn't find %s"%catfile raise Exception(msg) columns = [OBJECT_ID,'RA','DEC'] spread,mag,nepochs = bfields(['WAVG_SPREAD_MODEL','MAG_PSF','NEPOCHS'],band) columns += [spread,mag,nepochs] cat = load_infiles([catfile],columns) # Select stars with 17 < mag < 21 sel = (np.fabs(cat[spread])<0.002) & \ (cat[mag]>17) & \ (cat[mag]<21) & \ (cat[nepochs] > 1) cat = cat[sel] if len(cat) == 0: print("WARNING: No objects passing selection in: %s"%catfile) return np.array([],dtype=int), np.array([]) #hpxfiles = glob.glob('hpx/%s/*_%05d.fits'%(band,pix)) hpx = load_infiles(hpxfile, [OBJECT_ID, 'RA', 'DEC']) hpx = hpx[np.in1d(hpx[OBJECT_ID],cat[OBJECT_ID])] if len(hpx) == 0: print("WARNING: No matched objects in: %s"%hpxfile) return np.array([],dtype=int), np.array([]) #keyfile = 'key/key_hpx_%05d.fits'%pix #key = load_infiles([keyfile],[OBJECT_ID,'FILENAME','OBJECT_NUMBER']) #key = key[np.in1d(key[OBJECT_ID],cat[OBJECT_ID])] # #key_id = np.char.add(key['FILENAME'],key['OBJECT_NUMBER'].astype(str)) #hpx_id = np.char.add(hpx['FILENAME'],hpx['OBJECT_NUMBER'].astype(str)) # #hpx = hpx[np.in1d(hpx_id,key_id)] uid,inv,cts = np.unique(hpx[OBJECT_ID],False,True,True) # Make sure that the order matches between coadd and single epoch. if not np.all(uid == cat[OBJECT_ID]): cat = cat[np.in1d(cat[OBJECT_ID],hpx[OBJECT_ID])] if not np.all(uid == cat[OBJECT_ID]): cat = cat[np.argsort(cat[OBJECT_ID])] assert np.all(uid == cat[OBJECT_ID]) ra,dec = cat['RA'][inv],cat['DEC'][inv] sepdeg = angsep(ra,dec,hpx['RA'],hpx['DEC']) sepsec = sepdeg * 3600. sepmas = sepsec * 1000. sel = [sepsec > 1e-5] sep = sepmas[sel] pix = ang2pix(nside,ra[sel],dec[sel]) upix = np.unique(pix) peak = nd.median(sep,labels=pix,index=upix) if plot: plt.figure() draw_angsep(sep) if isinstance(plot,basestring): outfile = plot plt.savefig(outfile,bbox_inches='tight') return upix,peak
def pdf(self, lon, lat): if self.projector is None: radius = angsep(self.lon,self.lat,lon,lat) return self.norm*self._pdf(radius) else: return super(RadialKernel,self).pdf(lon,lat)
def angsep(self,lon,lat): return angsep(self.lon,self.lat,lon,lat)