def test_grouped_pha_all_bad_response_bg_warning(elo, ehi, nbins, bkg_id, caplog, make_data_path, clean_astro_ui): """Check we get the warning messages with background filtering""" ui.load_pha('check', make_data_path('3c273.pi')) ui.set_quality('check', 2 * numpy.ones(1024, dtype=numpy.int16), bkg_id=1) ui.ignore_bad('check', bkg_id=1) with caplog.at_level(logging.INFO, logger='sherpa'): ui.notice_id('check', elo, ehi, bkg_id=bkg_id) # filtering has or hasn't happened nsrc = ui.get_dep('check', filter=True).size nback = ui.get_dep('check', filter=True, bkg_id=1).size if bkg_id is None: assert nsrc == nbins assert nback == 0 else: assert nsrc == 46 # ie no filter assert nback == 0 # did we get a warning message from the background? assert len(caplog.records) == 1 name, lvl, msg = caplog.record_tuples[0] assert name == 'sherpa.astro.data' assert lvl == logging.INFO assert msg.startswith('Skipping dataset ') assert msg.endswith('/3c273_bg.pi: mask excludes all data')
def test_dataspace1d_datapha(clean_astro_ui): """Explicitly test dataspace1d for DataPHA""" assert ui.list_data_ids() == [] # Note the grid is ignored, other than the number of bins ui.dataspace1d(20, 30, step=2.5, id='x', dstype=ui.DataPHA) assert ui.list_data_ids() == ['x'] assert ui.get_data('x').name == 'dataspace1d' grid = ui.get_indep('x') assert len(grid) == 1 expected = numpy.asarray([1, 2, 3, 4, 5]) assert grid[0] == pytest.approx(expected) y = ui.get_dep('x') assert y == pytest.approx(numpy.zeros(5)) assert ui.get_exposure('x') is None assert ui.get_grouping('x') is None assert ui.get_quality('x') is None assert ui.get_data('x').subtracted is False with pytest.raises(IdentifierErr): ui.get_bkg('x')
def test_filter_bad_grouped(make_data_path, clean_astro_ui): """Check behavior when the data is grouped. This is a test of the current behavior, to check that values still hold. It may be necessary to change this test if we change the quality handling. """ infile = make_data_path('q1127_src1_grp30.pi') ui.load_pha(infile) pha = ui.get_data() assert pha.quality_filter is None assert pha.mask is True assert ui.get_dep().shape == (439, ) assert pha.quality_filter is None assert pha.mask is True # The last group is marked as quality=2 and so calling # ignore_bad means we lose that group. # ui.ignore_bad() assert ui.get_dep().shape == (438, ) assert pha.mask is True expected = np.ones(1024, dtype=bool) expected[996:1025] = False assert pha.quality_filter == pytest.approx(expected) # What happens when we filter the data? Unlike #1169 # we do change the noticed range. # ui.notice(0.5, 7) assert pha.quality_filter == pytest.approx(expected) # The mask has been filtered to remove the bad channels # (this is grouped data) expected = np.ones(438, dtype=bool) expected[0:15] = False expected[410:438] = False assert pha.mask == pytest.approx(expected) expected = np.ones(996, dtype=bool) expected[0:34] = False expected[481:996] = False assert pha.get_mask() == pytest.approx(expected)
def test_filter_bad_ungrouped(make_data_path, clean_astro_ui): """Check behavior when the data is ungrouped. This is a test of the current behavior, to check that values still hold. It may be necessary to change this test if we change the quality handling. """ infile = make_data_path('q1127_src1_grp30.pi') ui.load_pha(infile) pha = ui.get_data() assert pha.quality_filter is None assert pha.mask is True assert ui.get_dep().shape == (439, ) ui.ungroup() assert ui.get_dep().shape == (1024, ) assert pha.quality_filter is None assert pha.mask is True ui.ignore_bad() assert ui.get_dep().shape == (1024, ) assert pha.quality_filter is None expected = np.ones(1024, dtype=bool) expected[996:1025] = False assert pha.mask == pytest.approx(expected) # At this point we've changed the mask array so Sherpa thinks # we've applied a filter, so a notice is not going to change # anything. See issue #1169 # ui.notice(0.5, 7) assert pha.mask == pytest.approx(expected) # We need to ignore to change the mask. # ui.ignore(None, 0.5) ui.ignore(7, None) expected[0:35] = False expected[479:1025] = False assert pha.mask == pytest.approx(expected)
def check_chi2(): """Execute this function after fitting to see if the best-fit chi2 reported matches the formula coded here""" import sherpa.astro.ui as sau chi2 = sau.get_fit_results().statval print('chi2 from fit: {0}'.format(chi2)) data = sau.get_dep() model = sau.get_model_plot().y error = np.where(model > data, sau.get_syserror(), sau.get_staterror()) chi = ((data - model) / error) # Chi per bin chi2 = chi ** 2 # Chi^2 per bin print('chi2 re-computed: {0}'.format(chi2.sum()))
def check_chi2(): """Execute this function after fitting to see if the best-fit chi2 reported matches the formula coded here""" import sherpa.astro.ui as sau chi2 = sau.get_fit_results().statval print('chi2 from fit: {0}'.format(chi2)) data = sau.get_dep() model = sau.get_model_plot().y error = np.where(model > data, sau.get_syserror(), sau.get_staterror()) chi = ((data - model) / error) # Chi per bin chi2 = chi**2 # Chi^2 per bin print('chi2 re-computed: {0}'.format(chi2.sum()))
def test_group_already_grouped(idval): """Does group still work if the data is already grouped?""" x = [1, 2, 3] y = [0, 4, 3] if idval is None: ui.load_arrays(1, x, y, ui.DataPHA) ui.set_grouping([1, -1, 1]) else: ui.load_arrays(idval, x, y, ui.DataPHA) ui.set_grouping(idval, [1, -1, 1]) data = ui.get_data(idval) assert not data.grouped ui.group(idval) assert data.grouped assert ui.get_dep(idval) == pytest.approx([2, 3]) ui.group(idval) assert ui.get_dep(idval) == pytest.approx([2, 3]) assert data.grouped
def test_dataspace1d_datapha_bkg(clean_astro_ui): """Explicitly test dataspace1d for DataPHA (background)""" # list_bkg_ids will error out until the dataset exists assert ui.list_data_ids() == [] # We don't use the grid range or step size since numbins has been # given. ui.dataspace1d(20, 30, step=2.5, numbins=10, id='x', dstype=ui.DataPHA) assert ui.list_data_ids() == ['x'] assert ui.list_bkg_ids('x') == [] ui.dataspace1d(20, 30, step=2.5, numbins=10, id='x', bkg_id=2, dstype=ui.DataPHA) assert ui.list_data_ids() == ['x'] assert ui.list_bkg_ids('x') == [2] assert ui.get_data('x').name == 'dataspace1d' # I've explicitly not chosen the default background identifier with pytest.raises(IdentifierErr): ui.get_bkg('x') assert ui.get_bkg('x', 2).name == 'bkg_dataspace1d' grid = ui.get_indep('x', bkg_id=2) assert len(grid) == 1 expected = numpy.asarray([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) assert grid[0] == pytest.approx(expected) y = ui.get_dep('x', bkg_id=2) assert y == pytest.approx(numpy.zeros(10)) assert ui.get_exposure('x', bkg_id=2) is None assert ui.get_grouping('x', bkg_id=2) is None assert ui.get_quality('x', bkg_id=2) is None assert ui.get_bkg('x', bkg_id=2).subtracted is False # check we can subtract the dataset; as the data is all zeros # we don't bother checking the result. # ui.subtract('x')
def test_load_grouping(idval, clean_astro_ui, tmp_path): """Simple grouping check""" x = [1, 2, 3] y = [0, 4, 3] if idval is None: ui.load_arrays(1, x, y, ui.DataPHA) else: ui.load_arrays(idval, x, y, ui.DataPHA) path = tmp_path / 'group.dat' path.write_text('1\n-1\n1') data = ui.get_data(idval) assert data.grouping is None if idval is None: ui.load_grouping(str(path)) else: ui.load_grouping(idval, str(path)) assert not data.grouped assert data.grouping is not None ui.group(idval) assert data.grouped grps = ui.get_grouping(idval) assert grps.shape == (3, ) # It's not clear what requirements load_grouping makes of the # data, so do not enforce a data type. At a minimum there # would be potential backend differences. # # assert grps.dtype == np.int16 assert grps == pytest.approx([1, -1, 1]) # Note that get_dep is returning the sum per group / channel width # (since we have no instrument response). # y = ui.get_dep(idval) assert y.shape == (2, ) assert y == pytest.approx([2, 3])
def test_dataspace1d_data1dint(clean_astro_ui): """Explicitly test dataspace1d for Data1DInt""" assert ui.list_data_ids() == [] ui.dataspace1d(20, 30, step=2.5, id='x', dstype=ui.Data1DInt) assert ui.list_data_ids() == ['x'] assert ui.get_data('x').name == 'dataspace1d' grid = ui.get_indep('x') assert len(grid) == 2 expected = numpy.asarray([20, 22.5, 25, 27.5, 30.0]) assert grid[0] == pytest.approx(expected[:-1]) assert grid[1] == pytest.approx(expected[1:]) y = ui.get_dep('x') assert y == pytest.approx(numpy.zeros(4))
def test_subtract_already_subtracted(idval): """Does subtract still work if the data is already subtracted?""" x = [1, 2, 3] y = [0, 4, 3] ui.load_arrays('bgnd', x, y, ui.DataPHA) bkg = ui.get_data('bgnd') if idval is None: ui.load_arrays(1, x, y, ui.DataPHA) ui.set_bkg(bkg) else: ui.load_arrays(idval, x, y, ui.DataPHA) ui.set_bkg(idval, bkg) data = ui.get_data(idval) assert not data.subtracted ui.subtract(idval) assert data.subtracted ui.subtract(idval) assert ui.get_dep(idval) == pytest.approx([0, 0, 0])