예제 #1
0
    def _load(self, filename):
        raw = Vizier.get_catalogs('VII/26D')[0]
        if FILTER_DWARFS:
            raw = raw[raw['UGC'] != 10822]  # Draco (UGC 10822)
            raw = raw[raw['UGC'] != 9749]  # Ursa Minor (UGC 9749)
            raw = raw[raw['UGC'] != 5470]  # Leo I (UGC 5470)
            raw = raw[raw['UGC'] != 6253]  # Leo II (UGC 6253)

        self.data.resize(len(raw))
        self.data['name'] = np.char.mod('UGC %s', raw['UGC'])

        ra = np.array([map(float, hms.split()) for hms in raw['RA1950']])
        dec = np.array([map(float, dms.split()) for dms in raw['DE1950']])
        ra = np.vstack([ra.T, np.zeros(len(raw))]).T
        dec = np.vstack([dec.T, np.zeros(len(raw))]).T
        ra1950 = ugali.utils.projector.hms2dec(ra)
        dec1950 = ugali.utils.projector.dms2dec(dec)
        ra2000, dec2000 = ugali.utils.idl.jprecess(ra1950, dec1950)
        self.data['ra'] = ra2000
        self.data['dec'] = dec2000

        self.data[
            'radius'] = raw['MajAxis'] / 60.0  # Major axis on POSS blue print
        # Could also use minor axis 'MinAxis' (no position angle given)

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat
예제 #2
0
    def _parse_coords(self, opts):
        """ Parse target coordinates in various ways...
        """
        # The coordinates are mutually exclusive, so
        # shouldn't have to worry about over-writing them.
        if 'coords' in vars(opts): return
        radius = vars(opts).get('radius', 0)
        gal = None
        if vars(opts).get('gal') is not None:
            gal = opts.gal
        elif vars(opts).get('cel') is not None:
            gal = cel2gal(*opts.cel)
        elif vars(opts).get('hpx') is not None:
            gal = pix2ang(*opts.hpx)

        if gal is not None:
            opts.coords = [(gal[0], gal[1], radius)]
            opts.names = [vars(opts).get('name', '')]
        else:
            opts.coords = None
            opts.names = None

        if vars(opts).get('targets') is not None:
            opts.names, opts.coords = self.parse_targets(opts.targets)
            if vars(opts).get('radius') is not None:
                opts.coords['radius'] = vars(opts).get('radius')
예제 #3
0
    def _load(self,filename):
        kwargs = dict(delimiter=[1,1,4,15,3,3,8,3,3,7],usecols=[1,2]+list(range(4,10)),dtype=['S1']+[int]+6*[float])
        if filename is None: 
            raw = []
            for basename in ['VII_239A/ngcpos.dat','VII_239A/icpos.dat']:
                filename = os.path.join(self.DATADIR,basename)
                raw.append(np.genfromtxt(filename,**kwargs))
            raw = np.concatenate(raw)
        else:
            raw = np.genfromtxt(filename,**kwargs)
        self.filename = filename

        # Some entries are missing...
        raw['f4'] = np.where(np.isnan(raw['f4']),0,raw['f4'])
        raw['f7'] = np.where(np.isnan(raw['f7']),0,raw['f7'])

        self.data.resize(len(raw))
        names = np.where(raw['f0'] == 'N', 'NGC %04i', 'IC %04i')
        self.data['name'] = np.char.mod(names,raw['f1'])

        ra = raw[['f2','f3','f4']].view(float).reshape(len(raw),-1)
        dec = raw[['f5','f6','f7']].view(float).reshape(len(raw),-1)
        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)

        glon,glat = cel2gal(self.data['ra'],self.data['dec'])
        self.data['glon'],self.data['glat'] = glon,glat
예제 #4
0
def pixelizeCatalog(infiles, config, force=False):
    """
    Break catalog up into a set of healpix files.
    """
    nside_catalog = config['coords']['nside_catalog']
    nside_pixel = config['coords']['nside_pixel']
    outdir = mkdir(config['catalog']['dirname'])
    filenames = config.getFilenames()
    
    for ii,infile in enumerate(infiles):
        logger.info('(%i/%i) %s'%(ii+1, len(infiles), infile))
        f = pyfits.open(infile)
        data = f[1].data
        header = f[1].header
        logger.info("%i objects found"%len(data))
        if not len(data): continue
        glon,glat = cel2gal(data['RA'],data['DEC'])
        catalog_pix = ang2pix(nside_catalog,glon,glat,coord='GAL')
        pixel_pix = ang2pix(nside_pixel,glon,glat,coord='GAL')
        names = [n.upper() for n in data.columns.names]
        ra_idx = names.index('RA'); dec_idx = names.index('DEC')
        idx = ra_idx if ra_idx > dec_idx else dec_idx
        catalog_pix_name = 'PIX%i'%nside_catalog
        pixel_pix_name = 'PIX%i'%nside_pixel

        coldefs = pyfits.ColDefs(
            [pyfits.Column(name='GLON',format='1D',array=glon),
             pyfits.Column(name='GLAT',format='1D',array=glat),
             pyfits.Column(name=catalog_pix_name,format='1J',array=catalog_pix),
             pyfits.Column(name=pixel_pix_name  ,format='1J',array=pixel_pix)]
        )
        hdu = pyfits.new_table(data.columns[:idx+1]+coldefs+data.columns[idx+1:])
        table = hdu.data

        for pix in numpy.unique(catalog_pix):
            logger.debug("Processing pixel %s"%pix)
            outfile = filenames.data['catalog'][pix]
            if not os.path.exists(outfile):
                logger.debug("Creating %s"%outfile)
                names = [n.upper() for n in table.columns.names]
                formats = table.columns.formats
                columns = [pyfits.Column(n,f) for n,f in zip(names,formats)]
                out = pyfits.HDUList([pyfits.PrimaryHDU(),pyfits.new_table(columns)])
                out[1].header['NSIDE'] = nside_catalog
                out[1].header['PIX'] = pix
                out.writeto(outfile)
            hdulist = pyfits.open(outfile,mode='update')
            t1 = hdulist[1].data
            # Could we speed up with sorting and indexing?
            t2 = table[ table[catalog_pix_name] == pix ]
            nrows1 = t1.shape[0]
            nrows2 = t2.shape[0]
            nrows = nrows1 + nrows2
            out = pyfits.new_table(t1.columns, nrows=nrows)
            for name in t1.columns.names:
                out.data.field(name)[nrows1:]=t2.field(name)
            hdulist[1] = out
            logger.debug("Writing %s"%outfile)
            hdulist.flush()
            hdulist.close()
예제 #5
0
    def _load(self, filename):
        if filename is None:
            filename = os.path.join(self.DATADIR, "VII_202/mwgc.dat")
        self.filename = filename

        kwargs = dict(delimiter=[12, 12, 3, 3, 6, 5, 3, 6, 8, 8, 6],
                      dtype=2 * ['S12'] + 7 * [float],
                      skip_header=72,
                      skip_footer=363)
        raw = np.genfromtxt(filename, **kwargs)

        kwargs2 = dict(delimiter=[13, 6, 6, 8, 8, 8, 9, 6, 6, 8, 7, 7, 5],
                       dtype=['S12'] + 12 * [float],
                       skip_header=433,
                       skip_footer=2)
        raw2 = np.genfromtxt(filename, **kwargs2)

        self.data.resize(len(raw))
        self.data['name'] = np.char.strip(raw['f0'])

        ra = raw[['f2', 'f3', 'f4']].view(float).reshape(len(raw), -1)
        dec = raw[['f5', 'f6', 'f7']].view(float).reshape(len(raw), -1)

        radius = raw2['f8'] / 60.0  # Half-light radius
        # Could also use core radius raw2['f7']

        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat

        self.data['radius'] = radius
예제 #6
0
    def _load(self,filename):
        kwargs = dict(delimiter=[8,15,9,4,3,3,5,5],usecols=[1]+list(range(3,8)),dtype=['S13']+5*[float])
        if filename is None: 
            raw = []
            for basename in ['VII_151/table1a.dat','VII_151/table1c.dat']:
                filename = os.path.join(self.DATADIR,basename)
                raw.append(np.genfromtxt(filename,**kwargs))
            raw = np.concatenate(raw)
        else:
            raw = np.genfromtxt(filename,**kwargs)
        self.filename = filename
        
        self.data.resize(len(raw))
        #self.data['name'] = np.char.strip(raw['f0'])
        self.data['name'] = np.char.join(' ',np.char.split(raw['f0']))

        ra = raw[['f1','f2','f3']].view(float).reshape(len(raw),-1)
        dec = raw[['f4','f5']].view(float).reshape(len(raw),-1)
        dec = np.vstack([dec.T,np.zeros(len(raw))]).T
        ra1950 = ugali.utils.projector.hms2dec(ra)
        dec1950 = ugali.utils.projector.dms2dec(dec)
        ra2000,dec2000 = ugali.utils.idl.jprecess(ra1950,dec1950)
        self.data['ra'] = ra2000
        self.data['dec'] = dec2000

        glon,glat = cel2gal(self.data['ra'],self.data['dec'])
        self.data['glon'],self.data['glat'] = glon,glat
예제 #7
0
def pixelizeCatalog(infiles, config, force=False):
    """
    Break catalog into chunks by healpix pixel.
    
    Parameters:
    -----------
    infiles : List of input files
    config  : Configuration file
    force   : Overwrite existing files (depricated)
    
    Returns:
    --------
    None
    """
    nside_catalog = config['coords']['nside_catalog']
    nside_pixel = config['coords']['nside_pixel']
    outdir = mkdir(config['catalog']['dirname'])
    filenames = config.getFilenames()

    for i, filename in enumerate(infiles):
        logger.info('(%i/%i) %s' % (i + 1, len(infiles), filename))
        data = fitsio.read(filename)
        logger.info("%i objects found" % len(data))
        if not len(data): continue

        glon, glat = cel2gal(data['RA'], data['DEC'])
        cat_pix = ang2pix(nside_catalog, glon, glat)
        pix_pix = ang2pix(nside_pixel, glon, glat)
        cat_pix_name = 'PIX%i' % nside_catalog
        pix_pix_name = 'PIX%i' % nside_pixel

        data = mlab.rec_append_fields(
            data,
            names=['GLON', 'GLAT', cat_pix_name, pix_pix_name],
            arrs=[glon, glat, cat_pix, pix_pix],
            dtypes=['f4', 'f4', int, int])

        for pix in np.unique(cat_pix):
            logger.debug("Processing pixel %s" % pix)

            arr = data[cat_pix == pix]
            outfile = filenames.data['catalog'][pix]

            if not os.path.exists(outfile):
                logger.debug("Creating %s" % outfile)
                out = fitsio.FITS(outfile, mode='rw')
                out.write(arr)
                hdr = ugali.utils.healpix.header_odict(nside=nside_catalog,
                                                       coord='G')
                for key in ['PIXTYPE', 'ORDERING', 'NSIDE', 'COORDSYS']:
                    out[1].write_key(*list(hdr[key].values()))
                out[1].write_key('PIX',
                                 pix,
                                 comment='HEALPIX pixel for this file')
            else:
                out = fitsio.FITS(outfile, mode='rw')
                out[1].append(arr)

            logger.debug("Writing %s" % outfile)
            out.close()
예제 #8
0
파일: associate.py 프로젝트: eonadler/ugali
    def _load(self, filename):
        kwargs = dict(delimiter=[1, 1, 4, 15, 3, 3, 8, 3, 3, 7],
                      usecols=[1, 2] + list(range(4, 10)),
                      dtype=['S1'] + [int] + 6 * [float])
        if filename is None:
            raw = []
            for basename in ['VII_239A/ngcpos.dat', 'VII_239A/icpos.dat']:
                filename = os.path.join(self.DATADIR, basename)
                raw.append(np.genfromtxt(filename, **kwargs))
            raw = numpy.concatenate(raw)
        else:
            raw = numpy.genfromtxt(filename, **kwargs)
        self.filename = filename

        # Some entries are missing...
        raw['f4'] = numpy.where(numpy.isnan(raw['f4']), 0, raw['f4'])
        raw['f7'] = numpy.where(numpy.isnan(raw['f7']), 0, raw['f7'])

        self.data.resize(len(raw))
        names = numpy.where(raw['f0'] == 'N', 'NGC %04i', 'IC %04i')
        self.data['name'] = numpy.char.mod(names, raw['f1'])

        ra = raw[['f2', 'f3', 'f4']].view(float).reshape(len(raw), -1)
        dec = raw[['f5', 'f6', 'f7']].view(float).reshape(len(raw), -1)
        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat
예제 #9
0
    def _parse_coords(self,opts):
        """ Parse target coordinates in various ways...
        """
        # The coordinates are mutually exclusive, so
        # shouldn't have to worry about over-writing them.
        if 'coords' in vars(opts): return
        radius = vars(opts).get('radius',0)
        gal = None
        if vars(opts).get('gal') is not None: 
            gal = opts.gal
        elif vars(opts).get('cel') is not None: 
            gal = cel2gal(*opts.cel)
        elif vars(opts).get('hpx') is not None: 
            gal = pix2ang(*opts.hpx)

        if gal is not None:
            opts.coords = [(gal[0],gal[1],radius)]
            opts.names = [vars(opts).get('name','')]
        else:
            opts.coords = None
            opts.names = None

        if vars(opts).get('targets') is not None:
            opts.names,opts.coords = self.parse_targets(opts.targets)
            if vars(opts).get('radius') is not None:
                opts.coords['radius'] = vars(opts).get('radius')
예제 #10
0
파일: associate.py 프로젝트: eonadler/ugali
    def _load(self, filename):
        kwargs = dict(delimiter=[8, 15, 9, 4, 3, 3, 5, 5],
                      usecols=[1] + list(range(3, 8)),
                      dtype=['S13'] + 5 * [float])
        if filename is None:
            raw = []
            for basename in ['VII_151/table1a.dat', 'VII_151/table1c.dat']:
                filename = os.path.join(self.DATADIR, basename)
                raw.append(np.genfromtxt(filename, **kwargs))
            raw = numpy.concatenate(raw)
            print raw.dtype
        else:
            raw = np.genfromtxt(filename, **kwargs)
            print raw.dtype
        self.filename = filename

        self.data.resize(len(raw))
        #self.data['name'] = np.char.strip(raw['f0'])
        self.data['name'] = np.char.join(' ', np.char.split(raw['f0']))
        print self.data.dtype

        ra = raw[['f1', 'f2', 'f3']].view(float).reshape(len(raw), -1)
        dec = raw[['f4', 'f5']].view(float).reshape(len(raw), -1)
        dec = np.vstack([dec.T, np.zeros(len(raw))]).T
        ra1950 = ugali.utils.projector.hms2dec(ra)
        dec1950 = ugali.utils.projector.dms2dec(dec)
        ra2000, dec2000 = ugali.utils.idl.jprecess(ra1950, dec1950)
        self.data['ra'] = ra2000
        self.data['dec'] = dec2000

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat
예제 #11
0
파일: associate.py 프로젝트: eonadler/ugali
 def match(self, lon, lat, coord='gal', tol=0.1, nnearest=1):
     if coord.lower() == 'cel':
         glon, glat = cel2gal(lon, lat)
     else:
         glon, glat = lon, lat
     return ugali.utils.projector.match(glon, glat, self['glon'],
                                        self['glat'], tol, nnearest)
예제 #12
0
def ebv(ra, dec, ebvmap=None):
    ra = np.atleast_1d(ra)
    dec = np.atleast_1d(dec)

    if not len(ra) == len(dec):
        msg = "Column lengths must match"
        raise Exception(msg)

    if ebvmap is None or ebvmap.lower() == 'sfd':
        # Download SFD map
        url = "http://lambda.gsfc.nasa.gov/data/foregrounds/SFD/lambda_sfd_ebv.fits"
        logger.info("Downloading %s..." % url)
        filename = tempfile.NamedTemporaryFile().name
        cmd = "wget %s -O %s" % (url, filename)
        subprocess.call(cmd, shell=True)
        ebvmap = healpy.read_map(filename)
        os.remove(filename)
    elif isinstance(ebvmap, basestring):
        logger.info("Loading %s..." % ebvmap)
        ebvmap = healpy.read_map(ebvmap)
    else:
        msg = "Unrecognized ebv: %s" % ebvmap
        raise Exception(msg)

    # The SFD map is in Galactic coordinates
    glon, glat = cel2gal(ra, dec)
    ebv = healpix.get_interp_val(ebvmap, glon, glat)
    return ebv
예제 #13
0
    def finalizeObjects(self, objects):
        objs = numpy.recarray(len(objects),
                              dtype=[('NAME','S24'),
                                     ('TS','f4'),
                                     ('GLON','f4'),
                                     ('GLAT','f4'),
                                     ('RA','f4'),
                                     ('DEC','f4'),
                                     ('MODULUS','f4'),
                                     ('DISTANCE','f4'),
                                     ('RICHNESS','f4'),
                                     ('MASS','f4'),
                                     ('NANNULUS','i4'),
                                     ('NINTERIOR','i4'),
                                     ])
        
        objs['TS'] = self.values[objects['IDX_MAX'],objects['ZIDX_MAX']]
        lon,lat = objects['X_MAX'],objects['Y_MAX']

        coordsys = self.config['coords']['coordsys']
        if coordsys.lower() == 'gal':
            print("GAL coordintes")
            objs['GLON'],objs['GLAT'] = lon,lat
            objs['RA'],objs['DEC'] = gal2cel(lon,lat)
        else:
            print("CEL coordintes")
            objs['RA'],objs['DEC'] = lon,lat
            objs['GLON'],objs['GLAT'] = cel2gal(lon,lat)

        modulus = objects['Z_MAX']
        objs['MODULUS'] = modulus
        objs['DISTANCE'] = mod2dist(modulus)

        nside = healpy.npix2nside(len(self.nannulus))
        pix = ang2pix(nside,lon,lat)

        richness = self.richness[objects['IDX_MAX'],objects['ZIDX_MAX']]
        objs['RICHNESS'] = richness
        objs['MASS'] = richness * self.stellar[pix]

        objs['NANNULUS']  = self.nannulus[pix].astype(int)
        objs['NINTERIOR'] = self.ninterior[pix].astype(int)

        # Default name formatting
        # http://cdsarc.u-strasbg.fr/ftp/pub/iau/
        # http://cds.u-strasbg.fr/vizier/Dic/iau-spec.htx
        fmt = "J%(hour)02i%(hmin)04.1f%(deg)+03i%(dmin)02i"
        for obj,_ra,_dec in zip(objs,objs['RA'],objs['DEC']):
            hms = dec2hms(_ra); dms = dec2dms(_dec)
            params = dict(hour=hms[0],hmin=hms[1]+hms[2]/60.,
                          deg=dms[0],dmin=dms[1]+dms[2]/60.)
            obj['NAME'] = fmt%params

        out = recfuncs.merge_arrays([objs,objects],usemask=False,
                                    asrecarray=True,flatten=True)

        return out
예제 #14
0
    def parse_targets(filename):
        """
        Load a text file with target coordinates. Returns
        an array of target locations in Galactic coordinates.
        File description:
        [NAME] [LON] [LAT] [RADIUS] [COORD]
        
        The values of LON and LAT will depend on COORD:
        COORD = [GAL  | CEL | HPX  ],
        LON   = [GLON | RA  | NSIDE]
        LAT   = [GLAT | DEC | PIX  ]

        """
        base,ext = os.path.splitext(filename)
        if (ext=='.fits'):
            import fitsio
            data = fitsio.read(filename)
        elif (ext=='.txt'):
            from numpy.lib import NumpyVersion
            if NumpyVersion(np.__version__) < '1.14.0':
                data = np.genfromtxt(filename,names=True,dtype=None)
            else:
                data = np.genfromtxt(filename,names=True,dtype=None,encoding=None)
            #data = np.genfromtxt(filename,unpack=True,usecols=list(range(5)),dtype=object,names=True)
        elif (ext=='.yaml'):
            import yaml
            data = [(k,v['kernel']['lon']['value'],v['kernel']['lat']['value'],0.5,'CEL') for k,v in yaml.load(open(filename)).items()]
            data = np.rec.fromrecords(data,names=['name','lon','lat','radius','coord'])
        else:
            msg = "Unrecognized file type: %s"%filename
            raise IOError(msg)

        data = np.atleast_1d(data)
        data.dtype.names = list(map(str.lower,data.dtype.names))

        # Deal with one-line input files
        #if data.ndim == 1: data = np.array([data]).T
        names = data['name']
        out   = data[['lon','lat','radius']].copy()
         
        coord = np.char.lower(data['coord'])
        gal = (coord=='gal')
        cel = (coord=='cel')
        hpx = (coord=='hpx')
         
        if cel.any():
            glon,glat = cel2gal(data['lon'][cel],data['lat'][cel])
            out['lon'][cel] = glon
            out['lat'][cel] = glat
        if hpx.any():
            glon,glat = pix2ang(data['lat'][hpx],data['lon'][hpx])
            out['lon'][hpx] = glon
            out['lat'][hpx] = glat
         
        return names,out.view(np.ndarray)
예제 #15
0
    def _load(self, filename):
        if filename is None: 
            filename = os.path.join(self.DATADIR,"dr8_run_redmapper_v5.10_lgt20_catalog.fit")

        raw = pyfits.open(filename)[1].data

        self.data.resize(len(raw))
        self.data['name'] = numpy.char.mod("RedMaPPer %d",raw['MEM_MATCH_ID'])
        self.data['ra'] = raw['ra']
        self.data['dec'] = raw['dec']
        glon,glat = cel2gal(raw['ra'],raw['dec'])
        self.data['glon'],self.data['glat'] = glon, glat
예제 #16
0
    def _load(self,filename):
        kwargs = dict(delimiter=',')
        if filename is None: 
            filename = os.path.join(self.DATADIR,"extras/extra_clusters.csv")
        raw = np.recfromcsv(filename,**kwargs)
        
        self.data.resize(len(raw))
        self.data['name'] = raw['name']
        
        self.data['ra'] = raw['ra']
        self.data['dec'] = raw['dec']

        self.data['glon'],self.data['glat'] = cel2gal(raw['ra'],raw['dec'])
예제 #17
0
    def _load(self, filename):
        if filename is None: 
            filename = os.path.join(self.DATADIR,"redmapper/dr8_run_redmapper_v5.10_lgt20_catalog.fit")
        self.filename = filename

        raw = fitsio.read(filename,lower=True)

        self.data.resize(len(raw))
        self.data['name'] = np.char.mod("RedMaPPer %d",raw['mem_match_id'])
        self.data['ra'] = raw['ra']
        self.data['dec'] = raw['dec']
        glon,glat = cel2gal(raw['ra'],raw['dec'])
        self.data['glon'],self.data['glat'] = glon, glat
예제 #18
0
    def finalizeObjects(self, objects):
        objs = np.recarray(len(objects),
                           dtype=[
                               ('NAME', 'S24'),
                               ('TS', 'f4'),
                               ('GLON', 'f4'),
                               ('GLAT', 'f4'),
                               ('RA', 'f4'),
                               ('DEC', 'f4'),
                               ('MODULUS', 'f4'),
                               ('DISTANCE', 'f4'),
                               ('RICHNESS', 'f4'),
                               ('MASS', 'f4'),
                               ('NANNULUS', 'i4'),
                               ('NINTERIOR', 'i4'),
                           ])

        objs['TS'] = self.values[objects['IDX_MAX'], objects['ZIDX_MAX']]
        lon, lat = objects['X_MAX'], objects['Y_MAX']

        coordsys = self.config['coords']['coordsys']
        if coordsys.lower() == 'gal':
            print("GAL coordintes")
            objs['GLON'], objs['GLAT'] = lon, lat
            objs['RA'], objs['DEC'] = gal2cel(lon, lat)
        else:
            print("CEL coordintes")
            objs['RA'], objs['DEC'] = lon, lat
            objs['GLON'], objs['GLAT'] = cel2gal(lon, lat)

        modulus = objects['Z_MAX']
        objs['MODULUS'] = modulus
        objs['DISTANCE'] = mod2dist(modulus)

        nside = healpy.npix2nside(len(self.nannulus))
        pix = ang2pix(nside, lon, lat)

        richness = self.richness[objects['IDX_MAX'], objects['ZIDX_MAX']]
        objs['RICHNESS'] = richness
        objs['MASS'] = richness * self.stellar[pix]

        objs['NANNULUS'] = self.nannulus[pix].astype(int)
        objs['NINTERIOR'] = self.ninterior[pix].astype(int)
        objs['NAME'] = ang2iau(objs['RA'], objs['DEC'], coord='cel')

        out = recfuncs.merge_arrays([objs, objects],
                                    usemask=False,
                                    asrecarray=True,
                                    flatten=True)

        return out
예제 #19
0
파일: parser.py 프로젝트: sidneymau/ugali
    def parse_targets(filename):
        """
        Load a text file with target coordinates. Returns
        an array of target locations in Galactic coordinates.
        File description:
        [NAME] [LON] [LAT] [RADIUS] [COORD]
        
        The values of LON and LAT will depend on COORD:
        COORD = [GAL  | CEL | HPX  ],
        LON   = [GLON | RA  | NSIDE]
        LAT   = [GLAT | DEC | PIX  ]

        """
        base, ext = os.path.splitext(filename)
        if (ext == '.fits'):
            import fitsio
            data = fitsio.read(filename)
        else:
            from numpy.lib import NumpyVersion
            if NumpyVersion(np.__version__) < '1.14.0':
                data = np.genfromtxt(filename, names=True, dtype=None)
            else:
                data = np.genfromtxt(filename,
                                     names=True,
                                     dtype=None,
                                     encoding=None)
            #data = np.genfromtxt(filename,unpack=True,usecols=list(range(5)),dtype=object,names=True)
        data = np.atleast_1d(data)
        data.dtype.names = list(map(str.lower, data.dtype.names))

        # Deal with one-line input files
        #if data.ndim == 1: data = np.array([data]).T
        names = data['name']
        out = data[['lon', 'lat', 'radius']].copy()

        coord = np.char.lower(data['coord'])
        gal = (coord == 'gal')
        cel = (coord == 'cel')
        hpx = (coord == 'hpx')

        if cel.any():
            glon, glat = cel2gal(data['lon'][cel], data['lat'][cel])
            out['lon'][cel] = glon
            out['lat'][cel] = glat
        if hpx.any():
            glon, glat = pix2ang(data['lat'][hpx], data['lon'][hpx])
            out['lon'][hpx] = glon
            out['lat'][hpx] = glat

        return names, out.view(np.ndarray)
예제 #20
0
    def supplement(self, coordsys='gal'):
        """ Add some supplemental columns """
        from ugali.utils.projector import gal2cel, gal2cel_angle
        from ugali.utils.projector import cel2gal, cel2gal_angle

        coordsys = coordsys.lower()
        kwargs = dict(usemask=False, asrecarray=True)
        out = copy.deepcopy(self)

        if ('lon' in out.names) and ('lat' in out.names):
            # Ignore entries that are all zero
            zeros = np.all(self.ndarray == 0, axis=1)

            if coordsys == 'gal':
                ra, dec = gal2cel(out.lon, out.lat)
                glon, glat = out.lon, out.lat
            else:
                ra, dec = out.lon, out.lat
                glon, glat = cel2gal(out.lon, out.lat)

            ra[zeros] = 0
            dec[zeros] = 0
            glon[zeros] = 0
            glat[zeros] = 0

            names = ['ra', 'dec', 'glon', 'glat']
            arrs = [ra, dec, glon, glat]
            out = mlab.rec_append_fields(out, names, arrs).view(Samples)
            #out = recfuncs.append_fields(out,names,arrs,**kwargs).view(Samples)

            if 'position_angle' in out.names:
                if coordsys == 'gal':
                    pa_gal = out.position_angle
                    pa_cel = gal2cel_angle(out.lon, out.lat,
                                           out.position_angle)
                    pa_cel = pa_cel - 180. * (pa_cel > 180.)
                else:
                    pa_gal = cel2gal_angle(out.lon, out.lat,
                                           out.position_angle)
                    pa_cel = out.position_angle
                    pa_gal = pa_gal - 180. * (pa_gal > 180.)

                pa_gal[zeros] = 0
                pa_cel[zeros] = 0
                names = ['position_angle_gal', 'position_angle_cel']
                arrs = [pa_gal, pa_cel]
                out = recfuncs.append_fields(out, names, arrs,
                                             **kwargs).view(Samples)

        return out
예제 #21
0
    def _load(self,filename):
        kwargs = dict(delimiter=[32,2,3,3,5,3,3],dtype=['S32']+6*[float])
        if filename is None: 
            filename = os.path.join(self.DATADIR,"J_MNRAS_389_678/table3.dat")
        raw = np.genfromtxt(filename,**kwargs)

        self.data.resize(len(raw))
        self.data['name'] = numpy.char.strip(raw['f0'])
 
        ra = raw[['f1','f2','f3']].view(float).reshape(len(raw),-1)
        dec = raw[['f4','f5','f6']].view(float).reshape(len(raw),-1)
        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)
        
        glon,glat = cel2gal(self.data['ra'],self.data['dec'])
        self.data['glon'],self.data['glat'] = glon,glat
예제 #22
0
    def _load(self, filename):
        kwargs = dict(delimiter=',')
        if filename is None:
            filename = os.path.join(self.DATADIR, "extras/extra_dwarfs.csv")
        self.filename = filename
        raw = np.recfromcsv(filename, **kwargs)

        self.data.resize(len(raw))
        self.data['name'] = raw['name']

        self.data['ra'] = raw['ra']
        self.data['dec'] = raw['dec']

        self.data['radius'] = raw['rhalf'] / 60.0  # Half-light radius, arcmin

        self.data['glon'], self.data['glat'] = cel2gal(raw['ra'], raw['dec'])
예제 #23
0
    def _load(self, filename):
        raw = Vizier.get_catalogs('J/MNRAS/389/678')[0]

        self.data.resize(len(raw))
        self.data['name'] = np.char.strip(raw['Names'])

        ra = np.array([map(float, hms.split()) for hms in raw['RAJ2000']])
        dec = np.array([map(float, dms.split()) for dms in raw['DEJ2000']])
        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)

        self.data['radius'] = raw['amaj'] / 60.0  # Major axis
        # Could also use minor axis 'amin' and position angle 'PA'

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat
예제 #24
0
    def _load(self,filename):
        if filename is None: 
            filename = os.path.join(self.DATADIR,"J_AJ_144_4/NearbyGalaxies.dat")
 
        raw = numpy.genfromtxt(filename,delimiter=[19,3,3,5,3,3,3],usecols=range(7),dtype=['|S19']+6*[float],skip_header=34)
 
        self.data.resize(len(raw))
        self.data['name'] = numpy.char.strip(raw['f0'])
 
        ra = raw[['f1','f2','f3']].view(float).reshape(len(raw),-1)
        dec = raw[['f4','f5','f6']].view(float).reshape(len(raw),-1)
        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)
        
        glon,glat = cel2gal(self.data['ra'],self.data['dec'])
        self.data['glon'],self.data['glat'] = glon,glat
예제 #25
0
    def _load(self, filename):
        kwargs = dict(delimiter=',')
        if filename is None:
            filename = os.path.join(self.DATADIR,
                                    "extras/extra_structures.csv")
        self.filename = filename
        raw = np.recfromcsv(filename, **kwargs)

        self.data.resize(len(raw))
        self.data['name'] = raw['name']

        self.data['ra'] = raw['ra']
        self.data['dec'] = raw['dec']

        self.data['radius'] = raw['width']  # Only applies to ATLAS stream

        self.data['glon'], self.data['glat'] = cel2gal(raw['ra'], raw['dec'])
예제 #26
0
    def _load(self, filename):
        raw = Vizier.get_catalogs('J/AJ/144/4')[0]

        self.data.resize(len(raw))
        self.data['name'] = raw['Name']

        ra = np.array([map(float, hms.split()) for hms in raw['RAJ2000']])
        dec = np.array([map(float, dms.split()) for dms in raw['DEJ2000']])
        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)

        self.data[
            'radius'] = raw['R1'] / 60.0  # Half-light radius along major axis
        # Could also include elliticity 'Ell' and position angle 'PA'

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat
예제 #27
0
    def _load(self,filename):
        if filename is None: 
            filename = os.path.join(self.DATADIR,"VII_202/mwgc.dat")
        kwargs = dict(delimiter=[12,12,3,3,6,5,3,6,8,8,6],dtype=2*['S12']+7*[float],skip_header=72,skip_footer=363)
        raw = numpy.genfromtxt(filename,**kwargs)

        self.data.resize(len(raw))
        self.data['name'] = numpy.char.strip(raw['f0'])

        ra = raw[['f2','f3','f4']].view(float).reshape(len(raw),-1)
        dec = raw[['f5','f6','f7']].view(float).reshape(len(raw),-1)

        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)

        glon,glat = cel2gal(self.data['ra'],self.data['dec'])
        self.data['glon'],self.data['glat'] = glon,glat
예제 #28
0
    def supplement(self,coordsys='gal'):
        """ Add some supplemental columns """
        from ugali.utils.projector import gal2cel, gal2cel_angle
        from ugali.utils.projector import cel2gal, cel2gal_angle

        coordsys = coordsys.lower()
        kwargs = dict(usemask=False, asrecarray=True)
        out = copy.deepcopy(self)

        if ('lon' in out.names) and ('lat' in out.names):
            # Ignore entries that are all zero
            zeros = np.all(self.ndarray==0,axis=1)

            if coordsys == 'gal':
                ra,dec = gal2cel(out.lon,out.lat)
                glon,glat = out.lon,out.lat
            else:
                ra,dec = out.lon,out.lat
                glon,glat = cel2gal(out.lon,out.lat)

            ra[zeros] = 0; dec[zeros] = 0
            glon[zeros] = 0; glat[zeros] = 0

            names = ['ra','dec','glon','glat']
            arrs = [ra,dec,glon,glat]
            out = mlab.rec_append_fields(out,names,arrs).view(Samples)
            #out = recfuncs.append_fields(out,names,arrs,**kwargs).view(Samples)

            if 'position_angle' in out.names:
                if coordsys == 'gal':
                    pa_gal = out.position_angle
                    pa_cel = gal2cel_angle(out.lon,out.lat,out.position_angle)
                    pa_cel = pa_cel - 180.*(pa_cel > 180.)
                else:
                    pa_gal = cel2gal_angle(out.lon,out.lat,out.position_angle)
                    pa_cel = out.position_angle
                    pa_gal = pa_gal - 180.*(pa_gal > 180.)
                    
                pa_gal[zeros] = 0; pa_cel[zeros] = 0
                names = ['position_angle_gal','position_angle_cel']
                arrs = [pa_gal,pa_cel]
                out = recfuncs.append_fields(out,names,arrs,**kwargs).view(Samples)
        
        return out
예제 #29
0
    def _load(self, filename):
        kwargs = dict(delimiter=',')
        if filename is None:
            filename = os.path.join(self.DATADIR, "extras/extra_clusters.csv")
        self.filename = filename
        raw = np.recfromcsv(filename, **kwargs)
        if FILTER_DWARFS:
            raw = raw[raw['name'] != 'Kim 2']  # Indus 1 (Kim 2)
            pass

        self.data.resize(len(raw))
        self.data['name'] = raw['name']

        self.data['ra'] = raw['ra']
        self.data['dec'] = raw['dec']

        self.data['radius'] = raw['rhalf'] / 60.0  # Half-light radius, arcmin

        self.data['glon'], self.data['glat'] = cel2gal(raw['ra'], raw['dec'])
예제 #30
0
    def _load(self, filename):
        raw = Vizier.get_catalogs('J/A+A/558/A53')
        if FILTER_DWARFS:
            raw = [raw[0][raw[0]['MWSC'] != '2020'], raw[1],
                   raw[2]]  # Coma Berenices (Melotte_111)

        self.data.resize(len(raw[0]))

        ids = np.array(map(int, raw[0]['MWSC'])) - 1
        self.data['name'] = raw[1]['Name'][ids]

        self.data['ra'] = raw[0]['RAJ2000']
        self.data['dec'] = raw[0]['DEJ2000']

        self.data['radius'] = raw[0]['r1']  # Radius of central part
        # Could also use core radius 'r0' or radius 'r2'

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat
예제 #31
0
    def _load(self, filename):
        if filename is None:
            filename = os.path.join(self.DATADIR,
                                    "J_AJ_144_4/NearbyGalaxies.dat")
        self.filename = filename

        delimiter = [
            19, 3, 3, 5, 3, 3, 3, 6, 6, 5, 5, 7, 5, 5, 5, 4, 4, 6, 5, 5, 5, 5,
            5, 5, 4, 4, 7, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 5, 6, 5,
            5, 2
        ]
        raw = np.genfromtxt(filename,
                            delimiter=delimiter,
                            usecols=list(range(7)) + [26],
                            dtype=['|S19'] + 7 * [float],
                            skip_header=36)

        raw[['LMC' in name for name in raw['f0']
             ].index(True)]['f7'] = 540.0  # LMC radius = 9 deg
        raw[['SMC' in name for name in raw['f0']
             ].index(True)]['f7'] = 180.0  # LMC radius = 3 deg
        raw[['Bootes III' in name for name in raw['f0']
             ].index(True)]['f7'] = 60.0  # Bootes III radius = 1 deg

        self.data.resize(len(raw))
        self.data['name'] = np.char.lstrip(np.char.strip(raw['f0']), '*')

        ra = raw[['f1', 'f2', 'f3']].view(float).reshape(len(raw), -1)
        dec = raw[['f4', 'f5', 'f6']].view(float).reshape(len(raw), -1)
        self.data['ra'] = ugali.utils.projector.hms2dec(ra)
        self.data['dec'] = ugali.utils.projector.dms2dec(dec)

        radius = raw['f7']
        # McConnachie sets "bad" radius to either 99.99 or 9.999
        bad_r = np.nan  # arcmin
        radius = np.array(
            [r if set(str(r)) != set('9.') else bad_r for r in radius])
        self.data[
            'radius'] = radius / 60.0  # Half-light radius along major axis
        # Could also include ellipticity and position angle

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat
예제 #32
0
파일: parser.py 프로젝트: balbinot/ugali
    def parse_targets(filename):
        """
        Load a text file with target coordinates. Returns
        an array of target locations in Galactic coordinates.
        File description:
        [NAME] [LON] [LAT] [RADIUS] [COORD]
        
        The values of LON and LAT will depend on COORD:
        COORD = [GAL  | CEL | HPX  ],
        LON   = [GLON | RA  | NSIDE]
        LAT   = [GLAT | DEC | PIX  ]

        """
        base,ext = os.path.splitext(filename)
        if ext == '.fits':
            f = pyfits.open(filename)
            data = f[1].data.view(np.recarray)
            data = recfuncs.append_fields(data,'RADIUS',np.zeros(len(data)),usemask=False)
            return data['NAME'],data[['GLON','GLAT','RADIUS']]
        elif (ext=='.txt') or (ext=='.dat'):
            data = np.loadtxt(filename,unpack=True,usecols=range(5),dtype=object)
            # Deal with one-line input files
            if data.ndim == 1: data = np.array([data]).T
            names = data[0]
            out   = data[1:4].astype(float)
            lon,lat,radius = out
             
            coord = np.array([s.lower() for s in data[4]])
            gal = (coord=='gal')
            cel = (coord=='cel')
            hpx = (coord=='hpx')
             
            if cel.any():
                glon,glat = cel2gal(lon[cel],lat[cel])
                out[0][cel] = glon
                out[1][cel] = glat
            if hpx.any():
                glon,glat = pix2ang(lat[hpx],lon[hpx])
                out[0][hpx] = glon
                out[1][hpx] = glat
             
            return names,out.T
예제 #33
0
    def parse_targets(filename):
        """
        Load a text file with target coordinates. Returns
        an array of target locations in Galactic coordinates.
        File description:
        [NAME] [LON] [LAT] [RADIUS] [COORD]
        
        The values of LON and LAT will depend on COORD:
        COORD = [GAL  | CEL | HPX  ],
        LON   = [GLON | RA  | NSIDE]
        LAT   = [GLAT | DEC | PIX  ]

        """
        base,ext = os.path.splitext(filename)
        if ext == '.fits':
            f = pyfits.open(filename)
            data = f[1].data.view(np.recarray)
            data = recfuncs.append_fields(data,'RADIUS',np.zeros(len(data)),usemask=False)
            return data['NAME'],data[['GLON','GLAT','RADIUS']]
        elif (ext=='.txt') or (ext=='.dat'):
            data = np.loadtxt(filename,unpack=True,usecols=list(range(5)),dtype=object)
            # Deal with one-line input files
            if data.ndim == 1: data = np.array([data]).T
            names = data[0]
            out   = data[1:4].astype(float)
            lon,lat,radius = out
             
            coord = np.array([s.lower() for s in data[4]])
            gal = (coord=='gal')
            cel = (coord=='cel')
            hpx = (coord=='hpx')
             
            if cel.any():
                glon,glat = cel2gal(lon[cel],lat[cel])
                out[0][cel] = glon
                out[1][cel] = glat
            if hpx.any():
                glon,glat = pix2ang(lat[hpx],lon[hpx])
                out[0][hpx] = glon
                out[1][hpx] = glat
             
            return names,out.T
예제 #34
0
    def _load(self,filename):
        if filename is None: 
            filename = os.path.join(self.DATADIR,"VII_26D/catalog.dat")
        raw = np.genfromtxt(filename,delimiter=[3,7,2,4,3,2],dtype=['S3']+['S7']+4*[float])
        
        self.data.resize(len(raw))
        self.data['name'] = numpy.char.mod('UGC %s',numpy.char.strip(raw['f1']))

        ra = raw[['f2','f3']].view(float).reshape(len(raw),-1)
        ra = np.vstack([ra.T,np.zeros(len(raw))]).T
        dec = raw[['f4','f5']].view(float).reshape(len(raw),-1)
        dec = np.vstack([dec.T,np.zeros(len(raw))]).T
        ra1950 = ugali.utils.projector.hms2dec(ra)
        dec1950 = ugali.utils.projector.dms2dec(dec)
        ra2000,dec2000 = ugali.utils.idl.jprecess(ra1950,dec1950)
        self.data['ra'] = ra2000
        self.data['dec'] = dec2000

        glon,glat = cel2gal(self.data['ra'],self.data['dec'])
        self.data['glon'],self.data['glat'] = glon,glat
예제 #35
0
    def _load(self, filename):
        catalog = Vizier.get_catalogs('VII/151')
        raw = astropy.table.vstack([catalog[0], catalog[2]],
                                   metadata_conflicts='silent')

        self.data.resize(len(raw))
        self.data['name'] = np.char.join(' ', np.char.split(raw['Name1']))

        ra = np.array([map(float, hms.split()) for hms in raw['RA1950']])
        dec = np.array([map(float, dms.split()) for dms in raw['DE1950']])
        dec = np.vstack([dec.T, np.zeros(len(raw))]).T
        ra1950 = ugali.utils.projector.hms2dec(ra)
        dec1950 = ugali.utils.projector.dms2dec(dec)
        ra2000, dec2000 = ugali.utils.idl.jprecess(ra1950, dec1950)
        self.data['ra'] = ra2000
        self.data['dec'] = dec2000

        self.data['radius'] = (10**np.array(raw['lgtt'])) / 60.0  # log(radius)
        # Could also use log(core radius) 'lgtc'

        glon, glat = cel2gal(self.data['ra'], self.data['dec'])
        self.data['glon'], self.data['glat'] = glon, glat
예제 #36
0
파일: search.py 프로젝트: scantu/ugali-IMF
    def finalizeObjects(self, objects):
        objs = numpy.recarray(len(objects),
                              dtype=[
                                  ('NAME', 'S24'),
                                  ('TS', 'f4'),
                                  ('GLON', 'f4'),
                                  ('GLAT', 'f4'),
                                  ('RA', 'f4'),
                                  ('DEC', 'f4'),
                                  ('MODULUS', 'f4'),
                                  ('DISTANCE', 'f4'),
                                  ('RICHNESS', 'f4'),
                                  ('MASS', 'f4'),
                                  ('NANNULUS', 'i4'),
                                  ('NINTERIOR', 'i4'),
                              ])

        objs['TS'] = self.values[objects['IDX_MAX'], objects['ZIDX_MAX']]
        lon, lat = objects['X_MAX'], objects['Y_MAX']

        coordsys = self.config['coords']['coordsys']
        if coordsys.lower() == 'gal':
            print("GAL coordintes")
            objs['GLON'], objs['GLAT'] = lon, lat
            objs['RA'], objs['DEC'] = gal2cel(lon, lat)
        else:
            print("CEL coordintes")
            objs['RA'], objs['DEC'] = lon, lat
            objs['GLON'], objs['GLAT'] = cel2gal(lon, lat)

        modulus = objects['Z_MAX']
        objs['MODULUS'] = modulus
        objs['DISTANCE'] = mod2dist(modulus)

        nside = healpy.npix2nside(len(self.nannulus))
        pix = ang2pix(nside, lon, lat)

        richness = self.richness[objects['IDX_MAX'], objects['ZIDX_MAX']]
        objs['RICHNESS'] = richness
        objs['MASS'] = richness * self.stellar[pix]

        objs['NANNULUS'] = self.nannulus[pix].astype(int)
        objs['NINTERIOR'] = self.ninterior[pix].astype(int)

        # Default name formatting
        # http://cdsarc.u-strasbg.fr/ftp/pub/iau/
        # http://cds.u-strasbg.fr/vizier/Dic/iau-spec.htx
        fmt = "J%(hour)02i%(hmin)04.1f%(deg)+03i%(dmin)02i"
        for obj, _ra, _dec in zip(objs, objs['RA'], objs['DEC']):
            hms = dec2hms(_ra)
            dms = dec2dms(_dec)
            params = dict(hour=hms[0],
                          hmin=hms[1] + hms[2] / 60.,
                          deg=dms[0],
                          dmin=dms[1] + dms[2] / 60.)
            obj['NAME'] = fmt % params

        out = recfuncs.merge_arrays([objs, objects],
                                    usemask=False,
                                    asrecarray=True,
                                    flatten=True)

        return out
예제 #37
0
 def match(self,lon,lat,coord='gal',tol=0.1,nnearest=1):
     if coord.lower() == 'cel':
         glon, glat = cel2gal(lon,lat)
     else:
         glon,glat = lon, lat
     return ugali.utils.projector.match(glon,glat,self['glon'],self['glat'],tol,nnearest)
예제 #38
0
 def glon_glat(self): 
     if self.coordsys == 'gal': return self.lon,self.lat
     else:                      return cel2gal(self.lon,self.lat)
예제 #39
0
    def get_results(self, **kwargs):
        kwargs.setdefault('alpha', self.alpha)
        kwargs.setdefault('burn', self.nburn * self.nwalkers)

        # Calculate best-fit parameters from MCMC chain
        logger.debug('Estimating parameters...')
        estimate = self.estimate_params(**kwargs)
        params = {k: v[0] for k, v in estimate.items()}
        results = dict(estimate)

        # Extra parameters from the MCMC chain
        logger.debug('Estimating auxiliary parameters...')
        logger.debug("alpha = %.2f" % kwargs['alpha'])
        results['alpha'] = kwargs['alpha']
        try:
            results['ra'] = self.estimate('ra', **kwargs)
            results['dec'] = self.estimate('dec', **kwargs)
            results['glon'] = self.estimate('glon', **kwargs)
            results['glat'] = self.estimate('glat', **kwargs)
        except KeyError:
            logger.warn("Didn't find 'ra' or 'dec' in Samples...")
            if self.coordsys == 'gal':
                results['glon'] = results['lon']
                results['glat'] = results['lat']
                ra, dec = gal2cel(results['lon'][0], results['lat'][0])
                results['ra'] = ugali.utils.stats.interval(ra)
                results['dec'] = ugali.utils.stats.interval(dec)
            else:
                results['ra'] = results['lon']
                results['dec'] = results['lat']
                glon, glat = cel2gal(results['lon'][0], results['lat'][0])
                results['glon'] = ugali.utils.stats.interval(glon)
                results['glat'] = ugali.utils.stats.interval(glat)

        lon, lat = results['lon'][0], results['lat'][0]
        ra, dec = results['ra'][0], results['dec'][0]
        glon, glat = results['glon'][0], results['glat'][0]
        results.update(gal=[float(glon), float(glat)])
        results.update(cel=[float(ra), float(dec)])

        try:
            results['position_angle_cel'] = self.estimate(
                'position_angle_cel', **kwargs)
        except KeyError:
            results['position_angle_cel'] = ugali.utils.stats.interval(np.nan)

        # Update the loglike to the best-fit parameters from the chain
        logger.debug('Calculating TS...')
        ts = 2 * self.loglike.value(**params)
        results['ts'] = ugali.utils.stats.interval(ts, np.nan, np.nan)

        # Celestial position angle
        # Break ambiguity in direction with '% 180.'
        pa, pa_err = results['position_angle']
        pa_cel = gal2cel_angle(lon, lat, pa) % 180.
        pa_cel_err = np.array(pa_err) - pa + pa_cel
        results['position_angle_cel'] = ugali.utils.stats.interval(
            pa_cel, pa_cel_err[0], pa_cel_err[1])

        mod, mod_err = estimate['distance_modulus']
        dist = mod2dist(mod)
        dist_lo, dist_hi = [mod2dist(mod_err[0]), mod2dist(mod_err[1])]
        results['distance'] = ugali.utils.stats.interval(
            dist, dist_lo, dist_hi)
        dist, dist_err = results['distance']

        ext, ext_err = estimate['extension']
        ext_sigma = np.nan_to_num(np.array(ext_err) - ext)
        results['extension_arcmin'] = ugali.utils.stats.interval(
            60 * ext, 60 * ext_err[0], 60 * ext_err[1])

        # Radially symmetric extension (correct for ellipticity).
        ell, ell_err = estimate['ellipticity']
        rext, rext_err = ext * np.sqrt(1 -
                                       ell), np.array(ext_err) * np.sqrt(1 -
                                                                         ell)
        rext_sigma = np.nan_to_num(np.array(rext_err) - rext)
        results['extension_radial'] = ugali.utils.stats.interval(
            rext, rext_err[0], rext_err[1])
        results['extension_radial_arcmin'] = ugali.utils.stats.interval(
            60 * rext, 60 * rext_err[0], 60 * rext_err[1])

        # Bayes factor for ellipticity
        results['ellipticity_bayes_factor'] = self.bayes_factor(
            'ellipticity', burn=kwargs['burn'])

        # Physical Size (should do this with the posteriors)
        # Radially symmetric
        dist_sigma = np.nan_to_num(np.array(dist_err) - dist)

        size = np.arctan(np.radians(ext)) * dist
        size_sigma = size * np.sqrt((ext_sigma / ext)**2 +
                                    (dist_sigma / dist)**2)
        size_err = [size - size_sigma[0], size + size_sigma[1]]
        results['physical_size'] = ugali.utils.stats.interval(
            size, size_err[0], size_err[1])

        rsize = np.arctan(np.radians(rext)) * dist
        rsize_sigma = rsize * np.sqrt((rext_sigma / rext)**2 +
                                      (dist_sigma / dist)**2)
        rsize_err = [rsize - rsize_sigma[0], rsize + rsize_sigma[1]]
        results['physical_size_radial'] = ugali.utils.stats.interval(
            rsize, rsize_err[0], rsize_err[1])

        # Richness
        rich, rich_err = estimate['richness']

        # Number of observed stars (sum of p-values)
        nobs = self.loglike.p.sum()
        nobs_lo, nobs_hi = nobs + np.sqrt(nobs) * np.array([-1, 1])
        results['nobs'] = ugali.utils.stats.interval(nobs, nobs_lo, nobs_hi)

        # Number of predicted stars (pixelization effects?)
        npred = self.loglike.f * rich
        npred_lo, npred_hi = rich_err[0] * self.loglike.f, rich_err[
            1] * self.loglike.f
        results['npred'] = ugali.utils.stats.interval(npred, npred_lo,
                                                      npred_hi)

        # Careful, depends on the isochrone...
        stellar_mass = self.source.stellar_mass()
        mass = rich * stellar_mass
        mass_lo, mass_hi = rich_err[0] * stellar_mass, rich_err[
            1] * stellar_mass
        results['mass'] = ugali.utils.stats.interval(mass, mass_lo, mass_hi)

        stellar_luminosity = self.source.stellar_luminosity()
        lum = rich * stellar_luminosity
        lum_lo, lum_hi = rich_err[0] * stellar_luminosity, rich_err[
            1] * stellar_luminosity
        results['luminosity'] = ugali.utils.stats.interval(lum, lum_lo, lum_hi)

        # Absolute magnitude only calculated for DES isochrones with g,r
        try:
            Mv = self.source.absolute_magnitude(rich)
            Mv_lo = self.source.absolute_magnitude(rich_err[0])
            Mv_hi = self.source.absolute_magnitude(rich_err[1])
            results['Mv'] = ugali.utils.stats.interval(Mv, Mv_lo, Mv_hi)
        except ValueError as e:
            logger.warning("Skipping absolute magnitude")
            logger.warn(str(e))
            Mv = np.nan
            results['Mv'] = Mv

        mu = surfaceBrightness(Mv, rsize, dist)  ##updated from size-->rsize
        results['surface_brightness'] = ugali.utils.stats.interval(
            mu, np.nan, np.nan)

        # ADW: WARNING this is very fragile.
        # Also, this is not quite right, should cut on the CMD available space
        kwargs = dict(richness=rich,
                      mag_bright=16.,
                      mag_faint=23.,
                      n_trials=5000,
                      alpha=kwargs['alpha'],
                      seed=0)
        martin = self.config['results'].get('martin')
        if martin:
            logger.info("Calculating Martin magnitude...")
            if martin > 1: kwargs['n_trials'] = martin
            Mv_martin = self.source.isochrone.absolute_magnitude_martin(
                **kwargs)
            results['Mv_martin'] = Mv_martin

            mu_martin = surfaceBrightness(Mv_martin, rsize,
                                          dist)  ##updated from size-->rsize
            results['surface_brightness_martin'] = ugali.utils.stats.interval(
                mu_martin, np.nan, np.nan)
        else:
            logger.warning("Skipping Martin magnitude")
            results['Mv_martin'] = np.nan
            results['surface_brightness_martin'] = np.nan

        try:
            results['constellation'] = ang2const(lon, lat, self.coordsys)[1]
        except:
            pass
        results['iau'] = ugali.utils.projector.ang2iau(lon, lat, self.coordsys)

        coord = SkyCoord(ra * u.deg, dec * u.deg, distance=dist * u.kpc)
        results['ra_sex'] = str(coord.ra.to_string())
        results['dec_sex'] = str(coord.dec.to_string())

        # Calculate some separations from GC, LMC, SMC
        #NED coordinates with de Grisj distance
        LMC = SkyCoord(80.8939 * u.deg,
                       -69.7561 * u.deg,
                       distance=49.89 * u.kpc)
        #NED coordinates with de Grisj distance
        SMC = SkyCoord(13.1866 * u.deg,
                       -72.8286 * u.deg,
                       distance=61.94 * u.kpc)
        # GC from astropy?
        GC = SkyCoord(266.4168262 * u.deg,
                      -29.0077969 * u.deg,
                      distance=8.0 * u.kpc)

        results['d_gc'] = coord.separation_3d(GC).value
        results['d_lmc'] = coord.separation_3d(LMC).value
        results['d_smc'] = coord.separation_3d(SMC).value

        try:
            results['feh'] = float(self.source.isochrone.feh)
        except:
            results['feh'] = np.nan

        output = dict()
        output['params'] = params
        output['results'] = results
        return output
예제 #40
0
def pixelizeCatalog(infiles, config, force=False):
    """
    Break catalog into chunks by healpix pixel.
    
    Parameters:
    -----------
    infiles : List of input files
    config  : Configuration file
    force   : Overwrite existing files (depricated)
    
    Returns:
    --------
    None
    """
    nside_catalog = config['coords']['nside_catalog']
    nside_pixel = config['coords']['nside_pixel']
    coordsys = config['coords']['coordsys'].upper()
    outdir = mkdir(config['catalog']['dirname'])
    filenames = config.getFilenames()
    lon_field = config['catalog']['lon_field'].upper()
    lat_field = config['catalog']['lat_field'].upper()

    # ADW: It would probably be better (and more efficient) to do the
    # pixelizing and the new column insertion separately.
    for i,filename in enumerate(infiles):
        logger.info('(%i/%i) %s'%(i+1, len(infiles), filename))
        data = fitsio.read(filename)
        logger.info("%i objects found"%len(data))
        if not len(data): continue

        columns = map(str.upper,data.dtype.names)
        names,arrs = [],[]

        if (lon_field in columns) and (lat_field in columns):
            lon,lat = data[lon_field],data[lat_field]
        elif coordsys == 'GAL':
            msg = "Columns '%s' and '%s' not found."%(lon_field,lat_field)
            msg += "\nConverting from RA,DEC"
            logger.warning(msg)
            lon,lat = cel2gal(data['RA'],data['DEC'])
            names += [lon_field,lat_field]
            arrs  += [lon,lat]
        elif coordsys == 'CEL':
            msg = "Columns '%s' and '%s' not found."%(lon_field,lat_field)
            msg += "\nConverting from GLON,GLAT"
            lon,lat = gal2cel(data['GLON'],data['GLAT'])
            names  += [lon_field,lat_field]
            arrs   += [lon,lat]

        cat_pix = ang2pix(nside_catalog,lon,lat)
        pix_pix = ang2pix(nside_pixel,lon,lat)
        cat_pix_name = 'PIX%i'%nside_catalog
        pix_pix_name = 'PIX%i'%nside_pixel

        try:
            names += [cat_pix_name,pix_pix_name]
            arrs  += [cat_pix,pix_pix]
            data=mlab.rec_append_fields(data,names=names,arrs=arrs)
        except ValueError as e:
            logger.warn(str(e)+'; not adding column.')
            #data[cat_pix_name] = cat_pix
            #data[pix_pix_name] = pix_pix
                               
        for pix in np.unique(cat_pix):
            logger.debug("Processing pixel %s"%pix)

            arr = data[cat_pix == pix]
            outfile = filenames.data['catalog'][pix]

            if not os.path.exists(outfile):
                logger.debug("Creating %s"%outfile)
                out=fitsio.FITS(outfile,mode='rw')
                out.write(arr)

                hdr=healpix.header_odict(nside=nside_catalog,
                                                     coord=coordsys[0])
                for key in ['PIXTYPE','ORDERING','NSIDE','COORDSYS']:
                    out[1].write_key(*list(hdr[key].values()))
                out[1].write_key('PIX',pix,comment='HEALPIX pixel for this file')
            else:
                out=fitsio.FITS(outfile,mode='rw')
                out[1].append(arr)

            logger.debug("Writing %s"%outfile)
            out.close()