Beispiel #1
0
def make_pictures(config_dir='.', image_folder = 'extended_images'):
    """ make a folder with images for all extended sources """
    from uw.like2 import configuration
    from skymaps import Band
    if not os.path.exists(image_folder):
        os.mkdir(image_folder)
    cf = configuration.Configuration(config_dir, quiet=True, postpone=True)
    class Bandlite(object):
        def __init__(self, roi_dir, event_type=1, energy =133.352):
            self.event_type=event_type
            self.energy=energy
            self.sd=roi_dir
            self.psf=cf.psfman(event_type,energy)
            self.exposure = cf.exposureman(event_type,energy)
            self.radius =5

    ecat = ExtendedCatalog(cf.extended)
    for name in ecat.names:
        print 'processing %s ...' % name ,
        source = ecat.lookup(name)
        b12 = Band(12); roi_index = b12.index(source.skydir); 
        roi_dir = b12.dir(roi_index)
        conv = convolution.ExtendedConvolver(source, Bandlite(roi_dir=roi_dir))
        conv.create_grid()
        fig = conv.show_source()
        fig.savefig('%s/%s_map.png' %(image_folder,name.replace(' ','_')))
        print 
Beispiel #2
0
 def average(self, radius=1.0):
     """ average over all pixels within radius"""
     iv = IntVector()
     hp = Healpix(self.nside, Healpix.RING, SkyDir.GALACTIC)
     band = Band(self.nside)
     newvec = [0] * len(self.vec)
     for i in range(len(self.vec)):
         hp.query_disc(band.dir(i), np.radians(radius), iv)
         newvec[i] = np.array([self.vec[j] for j in iv]).mean()
     self.vec = newvec
Beispiel #3
0
 def __init__(self, outdir, filename, nside=512, fieldname='ts'):
     full_filename = os.path.join(outdir, filename)
     band = Band(nside)
     self.sdir = lambda index: band.dir(index)
     assert os.path.exists(
         full_filename), 'file, %s, not found' % full_filename
     self.rts = pyfits.open(full_filename)[1].data.field(fieldname)
     assert len(self.rts) == 12 * (
         nside)**2, 'wrong nside in file %s: expect %d' % (filename, nside)
     self.glat = None  # np.array([sdir(i).b() for i in range(len(self.rts))])
Beispiel #4
0
class Display_map(object):
    """ utility class to handle nice displays of a HParray object
    
    """
    def __init__(self,
                 hptable,
                 outdir,
                 map_dir=None,
                 nside=12,
                 imshow_kw=dict(
                     interpolation='bilinear',
                     vmin=0,
                     vmax=100,
                 ),
                 **kwargs):
        """
        hptable : HParray object
            expect to have vec, nside members
        outdir : string
            folder containing the skymodel
        map_dir : None, string
            folder name to save the images
        
        """
        from .. import skymodel
        self.v = hptable.vec
        self.subband = Band(hptable.nside)
        self.band = Band(nside)
        self.n = 12 * nside**2
        self.imshow_kw = imshow_kw
        self.scale = kwargs.pop('scale', lambda x: x)
        if type(self.scale) == types.StringTypes:
            if self.scale == 'sqrt': self.scale = lambda x: np.sqrt(max(x, 0))
            elif self.scale == 'log':
                self.scale = lambda x: np.log10(max(x, 0.1))
            else:
                raise Exception, 'unrecognized scale function, %s' % self.scale
        print 'Can generate %d map figures' % (self.n)
        self.outdir = outdir
        self.ZEA_kw = kwargs.pop('ZEA_kw', dict())
        if map_dir is not None:
            self.map_path = os.path.join(outdir, map_dir)
            if not os.path.exists(self.map_path):
                os.makedirs(self.map_path)
            print 'will save figures in folder %s' % self.map_path
        else:
            self.map_path = None
        skm = skymodel.SkyModel(outdir)
        self.sources = skm.point_sources + skm.extended_sources
        print 'loaded %d sources from skymodel %s' % (len(
            self.sources), outdir)

    def get_pyskyfun(self):
        return PySkyFunction(self)

    def skyfun(self, v):
        skydir = SkyDir(Hep3Vector(v[0], v[1], v[2]))
        return self.v[self.subband.index(skydir)]

    def __call__(self, v):
        skydir = SkyDir(Hep3Vector(v[0], v[1], v[2]))
        t = self.v[self.subband.index(skydir)]
        #if   self.scale=='sqrt': return np.sqrt(max(t,0))
        #elif self.scale=='log':  return np.log10(max(t, 1e-1))
        return self.scale(t)

    def fill_ait(self, fignum=11, axes=None, show_kw={}, **kwargs):
        if axes is None:
            plt.close(fignum)
            fig = plt.figure(fignum, figsize=(12, 8))
            axes = fig.gca()
        pixelsize = kwargs.pop('pixelsize', 0.25)
        ait = image.AIT(self.get_pyskyfun(),
                        axes=axes,
                        pixelsize=pixelsize,
                        **kwargs)
        self.imgplot = ait.imshow(**show_kw)
        return ait

    def fill_zea(self, index, fignum=12, axes=None, **kwargs):
        """ sources is a recarray with name, ra, dec
        """
        if axes is None:
            plt.close(fignum)
            fig = plt.figure(fignum, figsize=(6, 6))
            axes = fig.gca()
        size = kwargs.pop('size', 10)
        pixelsize = kwargs.pop('pixelsize', 0.1)
        title = kwargs.pop('title', hpname(index))
        label = kwargs.pop('label', '')
        zea = image.ZEA(self.band.dir(index),
                        size=size,
                        pixelsize=pixelsize,
                        **self.ZEA_kw)
        zea.grid()
        zea.fill(self.get_pyskyfun())
        imshow_kw = self.imshow_kw  #
        imshow_kw.update(kwargs)
        zea.imshow(**imshow_kw)
        zea.colorbar(label=label)
        axes.set_title(title)
        if self.sources is not None:
            count = 0
            for s in self.sources:
                sdir = s.skydir
                if not zea.inside(sdir): continue
                count += 1
                inside = self.band.index(sdir) == index
                zea.plot_source(s.name,
                                sdir,
                                symbol='*' if inside else 'd',
                                markersize=14 if inside else 8,
                                color='w')
            print 'found %d sources to plot' % count

        if self.map_path is not None:
            fout = os.path.join(self.map_path, hpname(index) + '.png')
            plt.savefig(fout)
            print 'saved figure to %s' % fout
        plt.draw_if_interactive()
Beispiel #5
0
def make_seeds(tsdata,
               filename,
               fieldname='ts',
               nside=512,
               rcut=10,
               bcut=0,
               out=None,
               rec=None,
               seedroot='SEED',
               minsize=1,
               max_pixels=30000,
               mask=None):
    """
    tsdata: object created by TSdata | string | None
        if not a TSdata object, create the TSdata object using filename and fieldname
        
    rec: open file to write tab-delimited file to
    """
    global band, sdir
    band = Band(nside)  # replace global
    sdir = lambda index: band.dir(index)

    if not isinstance(tsdata, TSdata):
        tsdata = TSdata(outdir='.',
                        filename=filename,
                        fieldname=fieldname,
                        nside=nside)

    # make list of indices of pixels with ts and b above thresholds
    indices = tsdata.indices(rcut, bcut, mask)
    if len(indices) > max_pixels:
        print 'Too many pixels above TS>{}, {}>{}, to cluster'.format(
            rcut, len(indices), max_pixels)
        return 0

    # create list of the clustered results: each a list of the pixel indeces
    clusters = cluster(indices)

    # split large clusters; add those which have 2 or more sub clusters
    clusters += split_clusters(clusters, tsdata.rts)
    print 'Added split clusters, now %d total' % len(clusters)

    # now create list of seeds from the clusters
    cl = Cluster(tsdata.rts)
    if out is not None:
        print >> out, '# Region file format: DS9 version 4.0 global color=green'
    if rec is not None:
        print >> rec, 'name\tra\tdec\tts\tsize\tl\tb'
    for i, x in enumerate(clusters):
        if len(x) < minsize: continue
        cl.group(x)
        if out is not None:
            print >>out,'fk5; point(%8.3f, %8.3f) # point=cross text={%d:%d %.1f}'%\
                ( cl.sdir.ra(), cl.sdir.dec(),i, len(x), cl.ts)
        if rec is not None:
            print >>rec, '%s-%04d\t%8.3f \t%8.3f\t %8.1f\t%8d\t%8.3f \t%8.3f ' %\
                (seedroot, i,cl.sdir.ra(), cl.sdir.dec(),  cl.ts, len(x), cl.sdir.l(),cl.sdir.b())

    if rec is not None: rec.close()
    if out is not None: out.close()
    return len(clusters)