Пример #1
0
def test_fad_power_spectrum_unknown_alg(ctrate):
    dt = 0.1
    deadtime = 2.5e-3
    length = 25600
    segment_size = 256.
    ncounts = int(ctrate * length)
    ev1 = generate_events(length, ncounts)
    ev2 = generate_events(length, ncounts)

    lc1 = generate_deadtime_lc(ev1,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)
    lc2 = generate_deadtime_lc(ev2,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)

    with pytest.raises(ValueError) as excinfo:
        calculate_FAD_correction(lc1,
                                 lc2,
                                 segment_size,
                                 plot=True,
                                 smoothing_alg='babasone',
                                 strict=False,
                                 verbose=False,
                                 tolerance=0.0001)
    assert 'Unknown smoothing algorithm' in str(excinfo.value)
Пример #2
0
def test_fad_power_spectrum_non_compliant_raise(ctrate):
    dt = 0.1
    deadtime = 2.5e-3
    length = 25600
    segment_size = 256.
    ncounts = int(ctrate * length)
    ev1 = generate_events(length, ncounts)
    ev2 = generate_events(length, ncounts)

    lc1 = generate_deadtime_lc(ev1,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)
    lc2 = generate_deadtime_lc(ev2,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)

    with pytest.raises(RuntimeError) as excinfo:
        _ = \
            calculate_FAD_correction(lc1, lc2, segment_size, plot=True,
                              smoothing_alg='gauss',
                              strict=True, verbose=False,
                              tolerance=0.0001)
    assert 'Results are not compliant, and' in str(excinfo.value)
Пример #3
0
def test_fad_power_spectrum_non_compliant(ctrate):
    dt = 0.1
    deadtime = 2.5e-3
    length = 25600
    segment_size = 256.
    ncounts = int(ctrate * length)
    ev1 = generate_events(length, ncounts)
    ev2 = generate_events(length, int(ncounts * 0.6))

    lc1 = generate_deadtime_lc(ev1,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)
    lc2 = generate_deadtime_lc(ev2,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)

    with warnings.catch_warnings(record=True) as record:
        results = \
            calculate_FAD_correction(lc1, lc2, segment_size, plot=True,
                              smoothing_alg='gauss',
                              strict=False, verbose=False,
                              tolerance=0.0001)
        assert np.any(
            ["results ARE NOT complying" in r.message.args[0] for r in record])

        is_compliant = results.meta['is_compliant']

        assert not is_compliant
Пример #4
0
def test_fad_power_spectrum_equal_ev_lc(ctrate):
    dt = 0.1
    deadtime = 2.5e-3
    length = 25600
    gti = [[0, length]]
    segment_size = 256.
    ncounts = int(ctrate * length)
    ev1 = filter_for_deadtime(generate_events(length, ncounts), deadtime)
    ev2 = filter_for_deadtime(generate_events(length, ncounts), deadtime)

    lc1 = Lightcurve.make_lightcurve(ev1,
                                     dt=dt,
                                     gti=gti,
                                     tstart=0,
                                     tseg=length)
    lc2 = Lightcurve.make_lightcurve(ev2,
                                     dt=dt,
                                     gti=gti,
                                     tstart=0,
                                     tseg=length)

    ev1 = EventList(ev1, gti=gti)
    ev2 = EventList(ev2, gti=gti)

    results_out_ev = \
        FAD(ev1, ev2, segment_size, dt=dt, plot=True,
            strict=True, verbose=True,
            tolerance=0.05, norm="leahy")
    results_out_lc = \
        calculate_FAD_correction(lc1, lc2, segment_size, plot=True,
                                 strict=True, verbose=True,
                                 tolerance=0.05, norm="leahy")

    for attr in ['pds1', 'pds2', 'cs', 'ptot']:
        assert np.allclose(results_out_ev[attr], results_out_lc[attr])
Пример #5
0
def test_fad_power_spectrum_compliant_leahy(ctrate):
    dt = 0.1
    deadtime = 2.5e-3
    length = 25600
    segment_size = 256.
    ncounts = int(ctrate * length)
    ev1 = generate_events(length, ncounts)
    ev2 = generate_events(length, ncounts)

    lc1 = generate_deadtime_lc(ev1,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)
    lc2 = generate_deadtime_lc(ev2,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)

    results_out = \
        calculate_FAD_correction(lc1, lc2, segment_size, plot=True,
                          strict=True, verbose=True,
                          tolerance=0.05, norm="leahy",
                          output_file='table.hdf5')

    results = Table.read('table.hdf5')
    os.unlink('table.hdf5')

    for attr in ['pds1', 'pds2', 'cs', 'ptot']:
        assert np.allclose(results_out[attr], results[attr])

    pds1_f = results['pds1']
    pds2_f = results['pds2']
    cs_f = results['cs']
    ptot_f = results['ptot']

    n = length / segment_size

    pds_std_theor = 2 / np.sqrt(n)
    cs_std_theor = np.sqrt(2 / n)

    assert np.isclose(pds1_f.std(), pds_std_theor, rtol=0.1)
    assert np.isclose(pds2_f.std(), pds_std_theor, rtol=0.1)
    assert np.isclose(cs_f.std(), cs_std_theor, rtol=0.1)
    assert np.isclose(ptot_f.std(), pds_std_theor, rtol=0.1)

    results_cs = get_periodograms_from_FAD_results(results_out, kind='cs')
    assert isinstance(results_cs, AveragedCrossspectrum)
    assert np.allclose(results_cs.power, cs_f)
    results_ps = get_periodograms_from_FAD_results(results_out, kind='pds1')
    assert isinstance(results_ps, AveragedPowerspectrum)
    assert np.allclose(results_ps.power, pds1_f)
    results_ps = get_periodograms_from_FAD_results(results_out, kind='pds2')
    assert isinstance(results_ps, AveragedPowerspectrum)
    assert np.allclose(results_ps.power, pds2_f)
    with pytest.raises(ValueError) as excinfo:
        _ = get_periodograms_from_FAD_results(results_out, kind='a')
    assert "Unknown periodogram type" in str(excinfo.value)
Пример #6
0
def test_fad_power_spectrum_compliant_objects(ctrate):
    dt = 0.1
    deadtime = 2.5e-3
    length = 25600
    segment_size = 256.
    ncounts = int(ctrate * length)
    ev1 = generate_events(length, ncounts)
    ev2 = generate_events(length, ncounts)

    lc1 = generate_deadtime_lc(ev1,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)
    lc2 = generate_deadtime_lc(ev2,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)
    ncounts1 = np.sum(lc1.counts)
    ncounts2 = np.sum(lc2.counts)

    results = \
        calculate_FAD_correction(lc1, lc2, segment_size, plot=True,
                          smoothing_alg='gauss',
                          strict=True, verbose=True,
                          tolerance=0.05, return_objects=True)

    pds1_f = results['pds1'].power
    pds2_f = results['pds2'].power
    cs_f = results['cs'].power
    ptot_f = results['ptot'].power

    n = length / segment_size
    ncounts_per_intv1 = ncounts1 * segment_size / length
    ncounts_per_intv2 = ncounts2 * segment_size / length
    ncounts_per_intvtot = (ncounts1 + ncounts2) * segment_size / length
    ncounts_per_intv_geomav = \
        np.sqrt(ncounts1 * ncounts2) * segment_size / length

    pds_std_theor = 2 / np.sqrt(n)
    cs_std_theor = np.sqrt(2 / n)

    assert np.isclose(pds1_f.std() * 2 / ncounts_per_intv1,
                      pds_std_theor,
                      rtol=0.1)
    assert np.isclose(pds2_f.std() * 2 / ncounts_per_intv2,
                      pds_std_theor,
                      rtol=0.1)
    assert np.isclose(cs_f.std() * 2 / ncounts_per_intv_geomav,
                      cs_std_theor,
                      rtol=0.1)
    assert np.isclose(ptot_f.std() * 2 / ncounts_per_intvtot,
                      pds_std_theor,
                      rtol=0.1)
Пример #7
0
def test_fad_power_spectrum_compliant_leahy_objects(ctrate):
    dt = 0.1
    deadtime = 2.5e-3
    length = 25600
    segment_size = 256.
    ncounts = int(ctrate * length)
    ev1 = generate_events(length, ncounts)
    ev2 = generate_events(length, ncounts)

    lc1 = generate_deadtime_lc(ev1,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)
    lc2 = generate_deadtime_lc(ev2,
                               dt,
                               tstart=0,
                               tseg=length,
                               deadtime=deadtime)

    results_out = \
        calculate_FAD_correction(lc1, lc2, segment_size, plot=True,
                          strict=True, verbose=True,
                          tolerance=0.05, norm="leahy",
                          output_file='table.hdf5', return_objects=True)

    results = Table.read('table.hdf5')
    os.unlink('table.hdf5')

    for attr in ['pds1', 'pds2', 'cs', 'ptot']:
        assert np.allclose(results_out[attr].power, results[attr])

    pds1_f = results_out['pds1'].power
    pds2_f = results_out['pds2'].power
    cs_f = results_out['cs'].power
    ptot_f = results_out['ptot'].power

    n = length / segment_size

    pds_std_theor = 2 / np.sqrt(n)
    cs_std_theor = np.sqrt(2 / n)

    assert np.isclose(pds1_f.std(), pds_std_theor, rtol=0.1)
    assert np.isclose(pds2_f.std(), pds_std_theor, rtol=0.1)
    assert np.isclose(cs_f.std(), cs_std_theor, rtol=0.1)
    assert np.isclose(ptot_f.std(), pds_std_theor, rtol=0.1)