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()
def prepare(): fit_interface.ResetFitterParameters() hdtv.options.Set("table", "classic") hdtv.options.Set("uncertainties", "short") spec_interface.LoadSpectra(testspectrum) yield spectra.Clear()
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 == ""
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 == ""
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()
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
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
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)
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))
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 ), )
def test_spectra_reload_one(): spectra.Pop("3") spec_interface.LoadSpectra(testspectrum) res = get_list() assert "3 | AV" in res
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))
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