예제 #1
0
def prepare():
    fit_interface.ResetFitterParameters()
    hdtv.options.Set("table", "classic")
    hdtv.options.Set("uncertainties", "short")
    spec_interface.LoadSpectra(testspectrum)
    for i in range(5):
        spec_interface.LoadSpectra(testspectrum)
        spectra.Get(str(i)).cal = [0, (i + 1) * 0.5]
    yield
    spectra.Clear()
예제 #2
0
def prepare():
    fit_interface.ResetFitterParameters()
    hdtv.options.Set("table", "classic")
    hdtv.options.Set("uncertainties", "short")
    spec_interface.LoadSpectra(testspectrum)
    yield
    spectra.Clear()
예제 #3
0
def test_cmd_fit_various():
    hdtvcmd("fit function peak activate theuerkauf")
    spec_interface.LoadSpectra(testspectrum)
    assert len(spec_interface.spectra.dict) == 1
    f, ferr = setup_fit()
    assert f == ""
    assert ferr == ""
    f, ferr = hdtvcmd("fit execute")
    assert "WorkFit on spectrum: 0" in f
    assert ".0 |" in f
    assert ".1 |" in f
    assert "2 peaks in WorkFit" in f
    f, ferr = hdtvcmd("fit store")
    assert f == "Storing workFit with ID 0"
    assert ferr == ""
    f, ferr = hdtvcmd("fit clear", "fit list")
    assert ferr == ""
    assert "Fits in Spectrum 0" in f
    f, ferr = hdtvcmd(
        "fit hide 0",
        "fit show 0",
        "fit show decomposition 0",
        "fit hide decomposition 0",
        "fit show residuals 0",
        "fit hide residuals 0")
    assert ferr == ""
    assert f == ""
    f, ferr = hdtvcmd("fit activate 0")
    assert "Activating fit 0" in f
    assert ferr == ""
    f, ferr = hdtvcmd("fit delete 0",
                      "fit function peak activate ee")
    assert ferr == ""
    assert f == ""
예제 #4
0
def test_cmd_fit_parameter(peak, bg, integrate, likelihood):
    spec_interface.LoadSpectra(testspectrum)
    f, ferr = setup_fit()
    hdtvcmd("fit marker background set 415", "fit marker background set 450")
    f, ferr = hdtvcmd(
        f"fit function peak activate {peak}",
        f"fit function background activate {bg}",
        f"fit parameter integrate {integrate}",
        f"fit parameter likelihood {likelihood}",
    )
    assert f == ""
    assert ferr == ""
    f, ferr = hdtvcmd("fit execute")
    assert "WorkFit on spectrum: 0" in f
    assert ".0 |" in f
    assert ".1 |" in f
    assert "2 peaks in WorkFit" in f

    f, ferr = hdtvcmd("fit parameter status")
    assert re.search(f"Peak model.*{peak}", f, re.M)
    assert re.search(f"Background model.*{bg}", f, re.M)
    assert f"likelihood: {likelihood}" in f
    assert f"integrate: {integrate}" in f
    assert ferr == ""

    f, ferr = hdtvcmd("fit store")
    assert f == "Storing workFit with ID 0"
    assert ferr == ""

    f, ferr = hdtvcmd("fit clear", "fit list")
    assert ferr == ""
    assert "Fits in Spectrum 0" in f

    f, ferr = hdtvcmd("fit parameter reset")
    assert ferr == ""
예제 #5
0
def prepare():
    fit_interface.ResetFitterParameters()
    hdtv.options.Set("table", "classic")
    hdtv.options.Set("uncertainties", "short")
    for _ in range(3):
        spec_interface.LoadSpectra(testspectrum)
    spectra.ActivateObject("0")
    yield
    spectra.Clear()
예제 #6
0
def test_cmd_fit_peakfind():
    spec_interface.LoadSpectra(testspectrum)
    assert len(spec_interface.spectra.dict) == 1
    f, ferr = hdtvcmd("fit peakfind -a -t 0.002")
    assert "Search Peaks in region" in f
    assert "Found 68 peaks" in f
    # This was not needed before commits around ~b41833c9c66f9ba5dbdcfc6fc4468b242360641f
    # However, some small change has happened that prevents a correct fit of a single 
    # double peak at ~1540 keV. When I fit it manually, using a similar fit region
    # and internal background only, it works.
    assert "WARNING: Adding invalid fit" in ferr
예제 #7
0
def test_cmd_fit_copy():
    spec_interface.LoadSpectra(testspectrum)
    f, ferr = setup_fit()
    hdtvcmd("fit marker background set 415", "fit marker background set 450")
    f, ferr = hdtvcmd(
        "fit function peak activate theuerkauf",
        "fit function background activate polynomial",
        "fit parameter integrate True",
        "fit parameter likelihood poisson",
        "fit execute",
    )
    workFit = spec_interface.spectra.workFit
    newFit = copy.copy(workFit)
    assert workFit == newFit
    assert workFit.fitter == newFit.fitter
예제 #8
0
def prepare():
    fit_interface.ResetFitterParameters()
    hdtv.options.Set("table", "classic")
    hdtv.options.Set("uncertainties", "short")
    spec_interface.LoadSpectra(testspectrum)
    yield
    spectra.Clear()

    bins_h1 = linspace(0.5, NBINS + 0.5, NBINS)
    spectrum_h1 = BG_PER_BIN * ones(NBINS)
    spectrum_h1 = spectrum_h1 + PEAK_VOLUME * norm.pdf(
        bins_h1, loc=0.5 * NBINS, scale=PEAK_WIDTH)
    savetxt(testspectrum_h1, spectrum_h1)

    bins_h2 = linspace(0.5, NBINS + 0.5, int(0.5 * NBINS))
    spectrum_h2 = 0.5 * BG_PER_BIN * ones(int(0.5 * NBINS))
    spectrum_h2 = spectrum_h2 + 2. * PEAK_VOLUME * norm.pdf(
        bins_h2, loc=0.5 * NBINS, scale=PEAK_WIDTH)
    savetxt(testspectrum_h2, spectrum_h2)
예제 #9
0
def test_mfile_fit_volume_with_binning(region1, region2, peak, expected_volume,
                                       calfactor, temp_file):
    spectra.Clear()

    bins = linspace(0.5, NBINS + 0.5, int(NBINS / calfactor))
    spectrum = 1. / calfactor * BG_PER_BIN * ones(int(NBINS / calfactor))
    spectrum = spectrum + calfactor * PEAK_VOLUME * norm.pdf(
        bins, loc=0.5 * NBINS, scale=PEAK_WIDTH)
    savetxt(temp_file, spectrum)

    spec_interface.LoadSpectra(temp_file)
    spectra.ApplyCalibration("0", [0, calfactor])

    spectra.SetMarker("region", region1)
    spectra.SetMarker("region", region2)
    spectra.SetMarker("peak", peak)
    spectra.ExecuteFit()
    fit = spectra.workFit
    fit_volume = fit.ExtractParams()[0][0]["vol"].nominal_value
    integral_volume = fit.ExtractIntegralParams()[0][0]["vol"].nominal_value

    assert isclose(integral_volume, expected_volume, abs_tol=sqrt(PEAK_VOLUME))
    assert isclose(fit_volume, expected_volume, abs_tol=sqrt(PEAK_VOLUME))
예제 #10
0
def test_backgroundRegions(
    model,
    nparams,
    step,
    nregions,
    settings,
    errormessage,
    bgparams,
    bg_volume,
    temp_file,
    test_spectrum,
):

    spec_interface.LoadSpectra(test_spectrum.filename)
    command = ["fit function background activate " + model]
    if settings != "":
        command.append(settings)
    for i in range(nregions):
        command.append(
            "fit marker background set %f"
            % ((step + test_spectrum.bg_regions[i][0]) * test_spectrum.nbins_per_step)
        )
        command.append(
            "fit marker background set %f"
            % ((step + test_spectrum.bg_regions[i][1]) * test_spectrum.nbins_per_step)
        )
    command.append(
        "fit marker region set %f"
        % (
            (step + 0.5) * test_spectrum.nbins_per_step
            - 3.0 * test_spectrum.peak_width * test_spectrum.nbins_per_step
        )
    )
    command.append(
        "fit marker region set %f"
        % (
            (step + 0.5) * test_spectrum.nbins_per_step
            + 3.0 * test_spectrum.peak_width * test_spectrum.nbins_per_step
        )
    )
    command.append(
        "fit marker peak set %f" % ((step + 0.5) * test_spectrum.nbins_per_step)
    )

    command.append("fit execute")
    command.append("fit store")
    for i in range(nregions):
        command.append("fit marker background delete %i" % (i))
    command.append("fit marker region delete 0")
    command.append("fit marker peak delete 0")
    f, ferr = hdtvcmd(*command)

    if WRITE_BATCHFILE:
        batchfile = os.path.join(
            os.path.curdir,
            "test",
            "share",
            model + "_" + str(nparams) + "_" + str(step) + "_background.hdtv",
        )
        bfile = open(batchfile, "w")
        bfile.write("spectrum get " + test_spectrum.filename + "\n")
        for c in command:
            bfile.write(c + "\n")
        bfile.close()

    if errormessage != "":
        hdtvcmd("fit delete 0", "spectrum delete 0")
        assert errormessage in ferr
    else:
        assert ferr == ""

        fitxml.WriteXML(spectra.Get("0").ID, temp_file)
        fitxml.ReadXML(spectra.Get("0").ID, temp_file, refit=True, interactive=False)
        hdtvcmd("fit delete 0", "spectrum delete 0")

        # Parse xml file manually and check correct output
        tree = ET.parse(temp_file)
        root = tree.getroot()

        # Check the number of fits
        fits = root.findall("fit")
        assert len(fits) == 1

        # Check the number and positions of background markers
        bgMarkers = fits[0].findall("bgMarker")
        assert len(bgMarkers) == nregions
        for i in range(len(bgMarkers)):
            assert isclose(
                float(bgMarkers[i].find("begin").find("cal").text),
                (step + test_spectrum.bg_regions[i][0]) * test_spectrum.nbins_per_step,
                abs_tol=BG_MARKER_TOLERANCE,
            )
            assert isclose(
                float(bgMarkers[i].find("end").find("cal").text),
                (step + test_spectrum.bg_regions[i][1]) * test_spectrum.nbins_per_step,
                abs_tol=BG_MARKER_TOLERANCE,
            )
        # Check the number (and values) of background parameters
        background = fits[0].find("background")
        assert background.get("backgroundModel") == model
        assert int(background.get("nparams")) == nparams

        # Check the background parameters
        if len(bgparams) > 0:
            params = background.findall("param")
            for i in range(len(params)):
                if i < len(bgparams):
                    assert isclose(
                        float(params[i].find("value").text),
                        bgparams[i],
                        abs_tol=N_SIGMA * float(params[i].find("error").text),
                    )

        # Check the fit result
        # All results will be compared
        assert isclose(
            float(fits[0].find("peak").find("cal").find("vol").find("value").text),
            test_spectrum.peak_volume,
            abs_tol=N_SIGMA
            * float(fits[0].find("peak").find("cal").find("vol").find("error").text),
        )
        assert isclose(
            float(fits[0].find("peak").find("cal").find("width").find("value").text),
            SIGMA_TO_FWHM * test_spectrum.peak_width * test_spectrum.nbins_per_step,
            abs_tol=N_SIGMA
            * float(fits[0].find("peak").find("cal").find("width").find("error").text),
        )

        # Check the integration result
        integrals = fits[0].findall("integral")
        assert len(integrals) == 3

        assert integrals[0].get("integraltype") == "tot"
        assert integrals[1].get("integraltype") == "bg"
        assert integrals[2].get("integraltype") == "sub"
        # Peak volume
        assert isclose(
            float(integrals[2].find("uncal").find("vol").find("value").text),
            test_spectrum.peak_volume,
            abs_tol=N_SIGMA
            * float(integrals[2].find("uncal").find("vol").find("error").text),
        )
        # Background volume
        if bg_volume > 0.0:
            assert isclose(
                float(integrals[1].find("uncal").find("vol").find("value").text),
                bg_volume,
                abs_tol=sqrt(bg_volume),
            )
        else:
            assert isclose(
                float(integrals[1].find("uncal").find("vol").find("value").text),
                test_spectrum.bg_per_bin
                * 6.0
                * test_spectrum.peak_width
                * test_spectrum.nbins_per_step,
                abs_tol=N_SIGMA
                * sqrt(
                    test_spectrum.bg_per_bin
                    * 6.0
                    * test_spectrum.peak_width
                    * test_spectrum.nbins_per_step
                ),
            )
예제 #11
0
def test_spectra_reload_one():
    spectra.Pop("3")
    spec_interface.LoadSpectra(testspectrum)
    res = get_list()
    assert "3 |   AV" in res
예제 #12
0
def test_backgroundRegions(model, nparams, step, nregions, settings, errormessage, bgparams, bg_volume, temp_file, test_spectrum):

    spec_interface.LoadSpectra(test_spectrum.filename)
    command  = ['fit function background activate ' + model]
    if settings is not "":
        command.append(settings)
    for i in range(nregions):
        command.append('fit marker background set %f' % ((step+test_spectrum.bg_regions[i][0])*test_spectrum.nbins_per_step))
        command.append('fit marker background set %f' % ((step+test_spectrum.bg_regions[i][1])*test_spectrum.nbins_per_step))
    command.append('fit marker region set %f' % ((step+0.5)*test_spectrum.nbins_per_step - 3.*test_spectrum.peak_width*test_spectrum.nbins_per_step))
    command.append('fit marker region set %f' % ((step+0.5)*test_spectrum.nbins_per_step + 3.*test_spectrum.peak_width*test_spectrum.nbins_per_step))
    command.append('fit marker peak set %f' % ((step+0.5)*test_spectrum.nbins_per_step))

    command.append('fit execute')
    command.append('fit store')
    for i in range(nregions):
        command.append('fit marker background delete %i' % (i))
    command.append('fit marker region delete 0')
    command.append('fit marker peak delete 0')
    f, ferr = hdtvcmd(*command)

    if WRITE_BATCHFILE:
        batchfile = os.path.join(os.path.curdir, 'test', 'share', model + '_' + str(nparams) + '_' + str(step) + '_background.hdtv')
        bfile = open(batchfile, 'w')
        bfile.write('spectrum get '+ test_spectrum.filename + '\n')
        for c in command:
            bfile.write(c + '\n')
        bfile.close()

    if errormessage is not '':
        hdtvcmd('fit delete 0', 'spectrum delete 0')
        assert errormessage in ferr
    else:
        assert ferr == ''

        fitxml.WriteXML(spectra.Get("0").ID, temp_file)
        fitxml.ReadXML(spectra.Get("0").ID, temp_file, refit=True, interactive=False)
        hdtvcmd('fit delete 0', 'spectrum delete 0')

        # Parse xml file manually and check correct output
        tree = ET.parse(temp_file)
        root = tree.getroot()

        # Check the number of fits
        fits = root.findall('fit')
        assert len(fits) == 1

        # Check the number and positions of background markers
        bgMarkers = fits[0].findall('bgMarker')
        assert len(bgMarkers) == nregions
        for i in range(len(bgMarkers)):
            assert isclose(float(bgMarkers[i].find('begin').find('cal').text), (step+test_spectrum.bg_regions[i][0])*test_spectrum.nbins_per_step, abs_tol=BG_MARKER_TOLERANCE)
            assert isclose(float(bgMarkers[i].find('end').find('cal').text), (step+test_spectrum.bg_regions[i][1])*test_spectrum.nbins_per_step, abs_tol=BG_MARKER_TOLERANCE)
        # Check the number (and values) of background parameters
        background = fits[0].find('background')
        assert background.get('backgroundModel') == model
        assert int(background.get('nparams')) == nparams

        # Check the background parameters
        if len(bgparams) > 0:
            params = background.findall('param')
            for i in range(len(params)):
                if i < len(bgparams):
                    assert isclose(float(params[i].find('value').text), bgparams[i], abs_tol=N_SIGMA*float(params[i].find('error').text))

        # Check the fit result
        # All results will be compared 
        assert isclose(float(fits[0].find('peak').find('cal').find('vol').find('value').text), test_spectrum.peak_volume, abs_tol=N_SIGMA*float(fits[0].find('peak').find('cal').find('vol').find('error').text)) 
        assert isclose(float(fits[0].find('peak').find('cal').find('width').find('value').text), SIGMA_TO_FWHM*test_spectrum.peak_width*test_spectrum.nbins_per_step, abs_tol=N_SIGMA*float(fits[0].find('peak').find('cal').find('width').find('error').text)) 

        # Check the integration result
        integrals = fits[0].findall('integral')
        assert len(integrals) == 3

        assert integrals[0].get('integraltype') == 'tot'
        assert integrals[1].get('integraltype') == 'bg'
        assert integrals[2].get('integraltype') == 'sub'
        # Peak volume
        assert isclose(float(integrals[2].find('uncal').find('vol').find('value').text), test_spectrum.peak_volume, abs_tol=N_SIGMA*float(integrals[2].find('uncal').find('vol').find('error').text))
        # Background volume
        if bg_volume > 0.:
            assert  isclose(float(integrals[1].find('uncal').find('vol').find('value').text), bg_volume, abs_tol=sqrt(bg_volume))
        else:
            assert isclose(float(integrals[1].find('uncal').find('vol').find('value').text), test_spectrum.bg_per_bin*6.*test_spectrum.peak_width*test_spectrum.nbins_per_step, abs_tol=N_SIGMA*sqrt(test_spectrum.bg_per_bin*6.*test_spectrum.peak_width*test_spectrum.nbins_per_step))
예제 #13
0
def test_interpolation_incomplete():
    spec_interface.LoadSpectra(testspectrum)
    assert len(spec_interface.spectra.dict) == 1
    f, ferr = setup_interpolation_incomplete()
    assert f == ""
    assert "Background fit failed" in ferr