def setup_pointlike(self): if os.path.isfile(self.srcmdl): return config = self.config self._ds = DataSpecification(ft1files=self.ft1file, ft2files=config['scfile'], ltcube=self.ltcube, binfile=self.binfile) self._sa = SpectralAnalysis(self._ds, binsperdec=config['binsperdec'], emin=config['emin'], emax=config['emax'], irf=config['irfs'], roi_dir=self.skydir, maxROI=config['radius'], minROI=config['radius'], zenithcut=config['zmax'], event_class=0, conv_type=config['convtype']) sources = [] point_sources, diffuse_sources = [], [] galdiff = config['galdiff'] isodiff = config['isodiff'] bkg_sources = self.get_background(galdiff, isodiff) sources += filter(None, bkg_sources) catalog = self.get_catalog(config['catalog']) catalogs = filter(None, [catalog]) for source in sources: if isinstance(source, PointSource): point_sources.append(source) else: diffuse_sources.append(source) self._roi = self._sa.roi(roi_dir=self.skydir, point_sources=point_sources, diffuse_sources=diffuse_sources, catalogs=catalogs, fit_emin=config['emin'], fit_emax=config['emax']) # Create model file self._roi.toXML(self.srcmdl, convert_extended=True, expand_env_vars=True)
def build_roi(name, snrdata, latdata): snrdata=loaddict(snrdata) latdata=loaddict(latdata) roi_dir = SkyDir(*snrdata[name]['cel']) snrsize = snrdata[name]['size'] if isinstance(snrsize,list) and len(snrsize) == 2: snrradius = math.sqrt(snrsize[0]*snrsize[1])/2.0 else: snrradius = snrsize/2.0 ds = DataSpecification(**latdata['data']) sa = SpectralAnalysis(ds, binsperdec = 4, emin = 1e4, emax = 10**5.5, irf = "P7SOURCE_V6", roi_dir = roi_dir, maxROI = 10, minROI = 10, event_class= 0) diffuse_sources = get_default_diffuse(**latdata['diffuse']) catalog = Catalog2FGL(**latdata['catalog']) roi=sa.roi(point_sources=[], diffuse_sources=diffuse_sources, catalogs=catalog) print 'bins',roi.bin_edges for source in roi.get_sources(): if np.degrees(source.skydir.difference(roi_dir)) < snrradius + 0.5: roi.del_source(source) snr = ExtendedSource( name = name, model = PowerLaw(), spatial_model = Disk(sigma=snrradius, center=roi_dir) ) roi.add_source(snr) return roi
def build_roi(self, name, fast): if fast: roi_size=5 binsperdec = 2 max_free=2 free_radius=2 else: roi_size = 10 binsperdec = 4 max_free=5 free_radius=5 catalog = Catalog2FGL('$FERMI/catalogs/gll_psc_v05.fit', latextdir='$FERMI/extended_archives/gll_psc_v05_templates', prune_radius=0, max_free=max_free, free_radius=free_radius, limit_parameters=True) ft1 = self.radiopsr_loader.get_ft1(name) ft2 = self.radiopsr_loader.get_ft2(name) ltcube = self.radiopsr_loader.get_ltcube(name) binfile = self.radiopsr_loader.get_binfile(name, binsperdec) roi_dir = self.radiopsr_loader.get_skydir(name) ds = DataSpecification( ft1files = ft1, ft2files = ft2, ltcube = ltcube, binfile = binfile) sa = SpectralAnalysis(ds, binsperdec = binsperdec, emin = 100, emax = 1000000, irf = "P7SOURCE_V6", roi_dir = roi_dir, maxROI = roi_size, minROI = roi_size, event_class= 0) fit_emin = 1e2 fit_emax = 10**5.5 model=PowerLaw(index=2, e0=np.sqrt(fit_emin*fit_emax)) model.set_limits('index',-5,5) ps = PointSource(name=name, model=model, skydir=roi_dir) point_sources = [ps] diffuse_sources = get_default_diffuse(diffdir="/afs/slac/g/glast/groups/diffuse/rings/2year", gfile="ring_2year_P76_v0.fits", ifile="isotrop_2year_P76_source_v0.txt", limit_parameters=True) roi=sa.roi(point_sources=point_sources, diffuse_sources=diffuse_sources, catalogs=catalog, fit_emin=fit_emin, fit_emax=fit_emax) return roi
def time_cut(roi, tstart, tstop, subdir, use_pointlike_ltcube, verbosity): """ Create a new ROI given a time cut. """ sa = roi.sa ds = sa.dataspec get_defaults = lambda obj: [ k[0] for k in obj.defaults if not isinstance(k, str) ] get_kwargs = lambda obj: { k: obj.__dict__[k] for k in get_defaults(obj) } ds_kwargs, sa_kwargs, roi_kwargs = map(get_kwargs, [ds, sa, roi]) point_sources = [i.copy() for i in roi.psm.point_sources] diffuse_sources = [i.copy() for i in roi.dsm.diffuse_sources] if sa_kwargs['tstart'] != 0 or sa_kwargs['tstop'] != 0: raise Exception("sanity check") # * cut ft1file on time using gtselect ft2files = roi.sa.pixeldata.ft2files if len(ft2files) > 1: raise Exception("...") ft2file = ft2files[0] evfile = Gtlike.make_evfile(roi, subdir) cut_evfile = join(subdir, "cut_ft1_%s_%s.fits" % (tstart, tstop)) if not exists(cut_evfile): if verbosity: print 'Running gtselect' gtselect = GtApp('gtselect', 'dataSubselector') gtselect.run(infile=evfile, outfile=cut_evfile, ra=0, dec=0, rad=180, tmin=tstart, tmax=tstop, emin=1, emax=1e7, zmax=180) else: if verbosity: print '... Skiping gtselect for %s to %s' % (tstart, tstop) ds_kwargs['ft1files'] = cut_evfile # * create new binfile and ltcube ds_kwargs['binfile'] = join(subdir, 'binned_%s_%s.fits' % (tstart, tstop)) # save this to see if it has been phased by # the function uw.utilities.phasetools.phase_ltcube all_time_ltcube = ds_kwargs['ltcube'] new_ltcube = join(subdir, 'ltcube_%s_%s.fits' % (tstart, tstop)) if not exists(new_ltcube): if verbosity: print 'Running gtltcube for %s to %s' % (tstart, tstop) if use_pointlike_ltcube: pointlike_ltcube(evfile=cut_evfile, scfile=ft2file, outfile=new_ltcube, dcostheta=0.025, binsz=1, zmax=roi.sa.zenithcut, cone_angle=roi.sa.exp_radius, dir=roi.roi_dir) else: gtltcube = GtApp('gtltcube', 'Likelihood') gtltcube.run(evfile=cut_evfile, scfile=ft2file, outfile=new_ltcube, dcostheta=0.025, binsz=1) else: if verbosity: print '... Skiping gtltcube for %s to %s' % (tstart, tstop) # next, check if ltcube is phased, kind of a kluge f = pyfits.open(all_time_ltcube) if f['exposure'].header.has_key('PHASE'): assert f['exposure'].header['PHASE'] == f[ 'weighted_exposure'].header['PHASE'] # If so, phase new ltcube phase = f['exposure'].header['PHASE'] phased_ltcube = join(subdir, 'phased_ltcube_%s_%s.fits' % (tstart, tstop)) if not exists(phased_ltcube): phase_ltcube(new_ltcube, phased_ltcube, phase) else: if verbosity: print '... Skiping gtltcube phasing for %s to %s' % ( tstart, tstop) ds_kwargs['ltcube'] = phased_ltcube else: ds_kwargs['ltcube'] = new_ltcube # * create new ds, sa, and roi new_ds = DataSpecification(**ds_kwargs) sa = SpectralAnalysis(new_ds, **sa_kwargs) return sa.roi(point_sources=point_sources, diffuse_sources=diffuse_sources, **roi_kwargs)
def get_roi(self, name, phase, fit_emin, fit_emax, binsperdec, extended=False, roi_size=10, catalog_kwargs=dict(), **kwargs): """ Sets up the ROI for studying a LAT Pulsar in the off pulse. """ sourcedict = yaml.load(open(self.pwndata))[name] ltcube = sourcedict['ltcube'] pulsar_position = SkyDir(*sourcedict['cel']) ft1 = sourcedict['ft1'] ft2 = sourcedict['ft2'] source = PWNRegion.get_source(name, position=pulsar_position, fit_emin=fit_emin, fit_emax=fit_emax, sigma=0.1, extended=extended) sources = [source] roi_dir = pulsar_position phase = PhaseRange(phase) point_sources, diffuse_sources = [], [] for source in sources: if isinstance(source, PointSource): point_sources.append(source) else: diffuse_sources.append(source) diffuse_sources += PWNRegion.get_background() catalog = PWNRegion.get_catalog(**catalog_kwargs) binfile = join(self.savedir, 'binned_phased.fits') phased_ltcube = PWNRegion.phase_ltcube(ltcube, phase, self.savedir) phased_ft1 = PWNRegion.phase_ft1(ft1, phase, self.savedir) ds = DataSpecification(ft1files=phased_ft1, ft2files=ft2, ltcube=phased_ltcube, binfile=binfile) print 'For now, 4 bins per decade. Eventually, this will have to be better.' sa = SpectralAnalysis(ds, binsperdec=binsperdec, emin=100, emax=1000000, irf="P7SOURCE_V6", roi_dir=roi_dir, maxROI=roi_size, minROI=roi_size, event_class=0) roi = sa.roi(point_sources=point_sources, diffuse_sources=diffuse_sources, catalogs=catalog, phase_factor=1, fit_emin=fit_emin, fit_emax=fit_emax, **kwargs) print 'bins ', roi.bin_edges roi.extra = dict(unphased_ft1=ft1, unphased_ltcube=ltcube, phase=phase) self.roi = roi return roi