def test_arf1d_no_pha_no_exposure_call(exposure): "Can we call an ARF (no PHA)" egrid = np.arange(0.1, 0.6, 0.1) specresp = np.asarray([1.1, 1.2, 1.3, 1.4]) adata = create_arf(egrid[:-1], egrid[1:], specresp, exposure=exposure) arf = ARF1D(adata) mdl = Const1D('flat') mdl.c0 = 2.3 wrapped = arf(mdl) assert isinstance(wrapped, ARFModelNoPHA) wmdl = wrapped.model if exposure is None: assert wmdl == mdl else: # It looks like equality is not well defined for the model # classes, since the following assertion fails # assert wmdl == (exposure * mdl) # so manually check # assert isinstance(wmdl, BinaryOpModel) assert wmdl.op == np.multiply assert wmdl.rhs == mdl assert isinstance(wmdl.lhs, ArithmeticConstantModel) assert wmdl.lhs.val == pytest.approx(exposure)
def test_arf1d_no_pha_zero_energy_bin_replace(): "What happens when the first bin starts at 0, with replacement" ethresh = 1e-5 exposure = 0.1 egrid = np.asarray([0.0, 0.1, 0.2, 0.4, 0.5, 0.7, 0.8]) elo = egrid[:-1] ehi = egrid[1:] specresp = np.asarray([10.2, 9.8, 10.0, 12.0, 8.0, 10.0]) with warnings.catch_warnings(record=True) as ws: warnings.simplefilter("always") adata = create_arf(elo, ehi, specresp, exposure=exposure, ethresh=ethresh) validate_zero_replacement(ws, 'ARF', 'user-arf', ethresh) arf = ARF1D(adata) mdl = MyPowLaw1D() tmdl = PowLaw1D() wrapped = arf(mdl) out = wrapped([0.1, 0.2]) elo[0] = ethresh expected = exposure * specresp * tmdl(elo, ehi) assert_allclose(out, expected) assert not np.isnan(out[0])
def derive_identity_arf(name, arf): """Create an "identity" ARF that has uniform sensitivity. *name* The name of the ARF object to be created; passed to Sherpa. *arf* An existing ARF object on which to base this one. Returns: A new ARF1D object that has a uniform spectral response vector. In many X-ray observations, the relevant background signal does not behave like an astrophysical source that is filtered through the telescope's response functions. However, I have been unable to get current Sherpa (version 4.9) to behave how I want when working with backround models that are *not* filtered through these response functions. This function constructs an "identity" ARF response function that has uniform sensitivity as a function of detector channel. """ from sherpa.astro.data import DataARF from sherpa.astro.instrument import ARF1D darf = DataARF( name, arf.energ_lo, arf.energ_hi, np.ones(arf.specresp.shape), arf.bin_lo, arf.bin_hi, arf.exposure, header=None, ) return ARF1D(darf, pha=arf._pha)
def test_arf1d_empty(): arf = ARF1D(None) assert arf._arf is None assert arf._pha is None assert str(arf) == str(None) # Since there's no ARF to fall through, it should be an error # to access the name attribute. # with pytest.raises(AttributeError): arf.name
def test_arf1d_pha_zero_energy_bin(): "What happens when the first bin starts at 0, with replacement" ethresh = 1.0e-10 # Note: the two exposures are different to check which is # used (the answer is neither, which seems surprising) # exposure1 = 0.1 egrid = np.asarray([0.0, 0.1, 0.2, 0.4, 0.5, 0.7, 0.8]) elo = egrid[:-1] ehi = egrid[1:] specresp = np.asarray([10.2, 9.8, 10.0, 12.0, 8.0, 10.0]) with warnings.catch_warnings(record=True) as ws: warnings.simplefilter("always") adata = create_arf(elo, ehi, specresp, exposure=exposure1, ethresh=ethresh) validate_zero_replacement(ws, 'ARF', 'user-arf', ethresh) arf = ARF1D(adata) exposure2 = 2.4 channels = np.arange(1, 7, dtype=np.int16) counts = np.ones(6, dtype=np.int16) pha = DataPHA('test-pha', channel=channels, counts=counts, exposure=exposure2) pha.set_arf(adata) pha.set_analysis('energy') mdl = MyPowLaw1D() tmdl = PowLaw1D() wrapped = ARFModelPHA(arf, pha, mdl) out = wrapped([0.1, 0.2]) elo[0] = ethresh expected = specresp * tmdl(elo, ehi) assert_allclose(out, expected) assert not np.isnan(out[0])
def test_arf1d_no_pha_no_exposure_basic(): "Can we create an ARF with no PHA?" egrid = np.arange(0.1, 0.6, 0.1) adata = create_arf(egrid[:-1], egrid[1:]) arf = ARF1D(adata) assert arf._arf == adata assert arf._pha is None # Does the ARF1D pass through functionality to the DataARF? assert arf.name == 'user-arf' assert arf.exposure is None assert str(arf) == str(adata) assert dir(arf) == dir(adata) # Should be exact specresp = np.ones(egrid.size - 1, dtype=np.float32) assert (specresp == arf.specresp).all()