def prepare(self, arf, data=None): """Fill the fields given the ARF. Parameters ---------- arf : The ARF to plot data : DataPHA instance, optional The `units` attribute of this object is used to determine whether the X axis should be in Angstrom instead of KeV (the default). """ self.xlo = arf.energ_lo self.xhi = arf.energ_hi self.y = arf.specresp self.title = arf.name self.xlabel = arf.get_xlabel() self.ylabel = arf.get_ylabel() if data is not None: if not isinstance(data, DataPHA): raise PlotErr('notpha', data.name) if data.units == "wavelength": self.xlabel = 'Wavelength (Angstrom)' self.xlo = data._hc/self.xlo self.xhi = data._hc/self.xhi
def prepare(self, data, src, lo=None, hi=None): # Note: src is source model before folding if not isinstance(data, DataPHA): raise IOErr('notpha', data.name) lo, hi = bounds_check(lo, hi) self.units = data.units if self.units == "channel": warning("Channel space is unappropriate for the PHA unfolded" + " source model,\nusing energy.") self.units = "energy" self.xlabel = data.get_xlabel() self.title = f'Source Model of {data.name}' self.xlo, self.xhi = data._get_indep(filter=False) # Why do we not apply the mask at the end of prepare? # self.mask = filter_bins((lo, ), (hi, ), (self.xlo, )) # The source model is assumed to not contain an instrument model, # and so it evaluates the expected number of photons/cm^2/s in # each bin (or it can be thought of as a 1 second exposure). # self.y = src(self.xlo, self.xhi) prefix_quant = 'E' quant = 'keV' if self.units == "wavelength": # No other labels use the LaTeX forms for lambda and # Angstrom, so use the text version here too. # prefix_quant = to_latex('\\lambda') # quant = to_latex('\\AA') prefix_quant = 'lambda' quant = 'Angstrom' (self.xlo, self.xhi) = (self.xhi, self.xlo) xmid = abs(self.xhi - self.xlo) sqr = to_latex('^2') self.xlabel = f'{self.units.capitalize()} ({quant})' self.ylabel = f'%s Photons/sec/cm{sqr}%s' if data.plot_fac == 0: self.y /= xmid self.ylabel = self.ylabel % (f'f({prefix_quant})', f'/{quant} ') elif data.plot_fac == 1: self.ylabel = self.ylabel % (f'{prefix_quant} f({prefix_quant})', '') elif data.plot_fac == 2: self.y *= xmid self.ylabel = self.ylabel % ( f'{prefix_quant}{sqr} f({prefix_quant})', f' {quant} ') else: raise PlotErr('plotfac', 'Source', data.plot_fac)
def prepare(self, data, src, lo=None, hi=None): # Note: src is source model before folding if not isinstance(data, DataPHA): raise IOErr('notpha', data.name) lo, hi = bounds_check(lo, hi) self.units = data.units if self.units == "channel": warning("Channel space is unappropriate for the PHA unfolded" + " source model,\nusing energy.") self.units = "energy" self.xlabel = data.get_xlabel() self.title = 'Source Model of %s' % data.name self.xlo, self.xhi = data._get_indep(filter=False) self.mask = filter_bins((lo, ), (hi, ), (self.xlo, )) self.y = src(self.xlo, self.xhi) prefix_quant = 'E' quant = 'keV' if self.units == "wavelength": # No other labels use the LaTeX forms for lambda and # Angstrom, so use the text version here too. # prefix_quant = to_latex('\\lambda') # quant = to_latex('\\AA') prefix_quant = 'lambda' quant = 'Angstrom' (self.xlo, self.xhi) = (self.xhi, self.xlo) xmid = abs(self.xhi - self.xlo) sqr = to_latex('^2') self.xlabel = '%s (%s)' % (self.units.capitalize(), quant) self.ylabel = '%s Photons/sec/cm' + sqr + '%s' if data.plot_fac == 0: self.y /= xmid self.ylabel = self.ylabel % ('f(%s)' % prefix_quant, '/%s ' % quant) elif data.plot_fac == 1: self.ylabel = self.ylabel % ('%s f(%s)' % (prefix_quant, prefix_quant), '') elif data.plot_fac == 2: self.y *= xmid self.ylabel = self.ylabel % ('%s%s f(%s)' % (prefix_quant, sqr, prefix_quant), ' %s ' % quant) else: raise PlotErr('plotfac', 'Source', data.plot_fac)
def prepare(self, data, model, orders=None, colors=None): self.orders = data.response_ids if orders is not None: if iterable(orders): self.orders = list(orders) else: self.orders = [orders] if colors is not None: self.use_default_colors=False if iterable(colors): self.colors = list(colors) else: self.colors = [colors] else: self.colors=[] top_color = '0xffffff' bot_color = '0x0000bf' num = len(self.orders) jump = (int(top_color, 16) - int(bot_color,16))/(num+1) for order in self.orders: self.colors.append(top_color) top_color = hex(int(top_color,16)-jump) if not self.use_default_colors and len(colors) != len(orders): raise PlotErr('ordercolors', len(orders), len(colors)) old_filter = parse_expr(data.get_filter()) old_group = data.grouped try: if old_group: data.ungroup() for interval in old_filter: data.notice(*interval) self.xlo=[] self.xhi=[] self.y=[] (xlo, y, yerr,xerr, self.xlabel, self.ylabel) = data.to_plot(model) y = y[1] if data.units != 'channel': elo, ehi = data._get_ebins(group=False) xlo = data.apply_filter(elo, data._min) xhi = data.apply_filter(ehi, data._max) if data.units == 'wavelength': xlo = data._hc/xlo xhi = data._hc/xhi else: xhi = xlo + 1. for order in self.orders: self.xlo.append(xlo) self.xhi.append(xhi) if len(data.response_ids) > 2: if order < 1 or order > len(model.rhs.orders): raise PlotErr('notorder', order) y = data.apply_filter(model.rhs.orders[order-1]) y = data._fix_y_units(y,True) if data.exposure: y = data.exposure * y self.y.append(y) finally: if old_group: data.ignore() data.group() for interval in old_filter: data.notice(*interval) self.title = 'Model Orders %s' % str(self.orders) if len(self.xlo) != len(self.y): raise PlotErr("orderarrfail")