Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
 def angsep(self, lon, lat):
     return angsep(self.lon, self.lat, lon, lat)
Ejemplo n.º 7
0
    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]
Ejemplo n.º 8
0
 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')
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
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
Ejemplo n.º 11
0
 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)
Ejemplo n.º 12
0
 def angsep(self,lon,lat):
     return angsep(self.lon,self.lat,lon,lat)