Example #1
0
 def read_catalog(self, filename=None):
     if not filename:
         filename = os.path.join(self.config['simulate']['dirname'],self.config['simulate']['catfile'])
     catalog =  ugali.observation.catalog.Catalog(self.config,filenames=filename)
     catalog.data = mlab.rec_append_fields(catalog.data,
                                        names=['PIX8','PIX4096'],
                                        arrs=np.zeros((2,len(catalog.lon)),dtype='>i8'))
     return catalog
Example #2
0
 def read_catalog(self, filename=None):
     if not filename:
         filename = os.path.join(self.config['simulate']['dirname'],
                                 self.config['simulate']['catfile'])
     catalog = ugali.observation.catalog.Catalog(self.config,
                                                 filenames=filename)
     catalog.data = mlab.rec_append_fields(catalog.data,
                                           names=['PIX8', 'PIX4096'],
                                           arrs=np.zeros(
                                               (2, len(catalog.lon)),
                                               dtype='>i8'))
     return catalog
Example #3
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
Example #4
0
    def _defineVariables(self):
        """
        Helper funtion to define pertinent variables from catalog data.

        ADW (20170627): This has largely been replaced by properties.
        """
        logger.info('Catalog contains %i objects'%(len(self.data)))

        mc_source_id_field = self.config['catalog']['mc_source_id_field']
        if mc_source_id_field is not None:
            if mc_source_id_field not in self.data.dtype.names:
                array = np.zeros(len(self.data),dtype='>i8') # FITS byte-order convention
                self.data = mlab.rec_append_fields(self.data,
                                                   names=mc_source_id_field,
                                                   arrs=array)
            logger.info('Found %i simulated objects'%(np.sum(self.mc_source_id>0)))
Example #5
0
    def _defineVariables(self):
        """
        Helper funtion to define pertinent variables from catalog data.

        ADW (20170627): This has largely been replaced by properties.
        """
        logger.info('Catalog contains %i objects' % (len(self.data)))

        mc_source_id_field = self.config['catalog']['mc_source_id_field']
        if mc_source_id_field is not None:
            if mc_source_id_field not in self.data.dtype.names:
                array = np.zeros(len(self.data),
                                 dtype='>i8')  # FITS byte-order convention
                self.data = mlab.rec_append_fields(self.data,
                                                   names=mc_source_id_field,
                                                   arrs=array)
            logger.info('Found %i simulated objects' %
                        (np.sum(self.mc_source_id > 0)))
Example #6
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
Example #7
0
    def createAssociations(self):
        objects = self.objects

        tol = self.config['search']['proximity']
        columns = odict()

        names = np.empty(len(objects), dtype=object)
        names.fill('')
        for i, refs in enumerate(self.config['search']['catalogs']):
            i += 1
            catalog = SourceCatalog()
            for ref in refs:
                print(ref)
                catalog += catalogFactory(ref)

            # String length (should be greater than longest name)
            length = len(max(catalog['name'], key=len)) + 1
            dtype = 'S%i' % length
            fitstype = '%iA' % length

            assoc = np.empty(len(objects), dtype=dtype)
            assoc.fill('')
            angsep = np.zeros(len(objects), dtype=np.float32)
            idx1, idx2, sep = catalog.match(objects['GLON'],
                                            objects['GLAT'],
                                            tol=tol)
            assoc[idx1] = catalog['name'][idx2].astype(dtype)
            angsep[idx1] = sep
            columns['ASSOC%i' % i] = assoc
            columns['ANGSEP%i' % i] = angsep

            if length > objects['NAME'].itemsize:
                logger.warning("Association name may not fit.")
            names = np.where(names == '', assoc, names)
        names = names.astype(objects['NAME'].dtype)
        objects['NAME'][:] = np.where(names == '', objects['NAME'], names)
        objects['NAME'][:] = np.char.replace(objects['NAME'], '_', ' ')

        self.assocs = mlab.rec_append_fields(objects, columns.keys(),
                                             columns.values())
        self.assocs = self.assocs[self.assocs['NAME'].argsort()]
Example #8
0
    def createAssociations(self):
        objects = self.objects

        tol = self.config['search']['proximity']
        columns = odict()

        names = np.empty(len(objects),dtype=object)
        names.fill('')
        for i,refs in enumerate(self.config['search']['catalogs']):
            i += 1
            catalog = SourceCatalog()
            for ref in refs:
                print(ref)
                catalog += catalogFactory(ref)
     
            # String length (should be greater than longest name)
            length = len(max(catalog['name'],key=len)) + 1
            dtype = 'S%i'%length; fitstype='%iA'%length
     
            assoc = np.empty(len(objects),dtype=dtype)
            assoc.fill('')
            angsep = np.zeros(len(objects),dtype=np.float32)
            idx1,idx2,sep = catalog.match(objects['GLON'],objects['GLAT'],tol=tol)
            assoc[idx1] = catalog['name'][idx2].astype(dtype)
            angsep[idx1] = sep
            columns['ASSOC%i'%i] = assoc
            columns['ANGSEP%i'%i] = angsep

            if length > objects['NAME'].itemsize:
                logger.warning("Association name may not fit.")
            names = np.where(names=='',assoc,names)
        names = names.astype(objects['NAME'].dtype)
        objects['NAME'][:] = np.where(names=='',objects['NAME'],names)
        objects['NAME'][:] = np.char.replace(objects['NAME'],'_',' ')

        self.assocs=mlab.rec_append_fields(objects,columns.keys(),columns.values())
        self.assocs=self.assocs[self.assocs['NAME'].argsort()]
Example #9
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()
Example #10
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

        names += [cat_pix_name, pix_pix_name]
        arrs += [cat_pix, pix_pix]
        data = mlab.rec_append_fields(data, names=names, arrs=arrs)

        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()