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