"""
Tests for the dabam metrology module.
"""
#
# tests
#
from srxraylib.metrology.dabam import dabam
import copy
from numpy.testing import assert_almost_equal
[docs]def data1(): # some scratch data
return """Line1 Line2 Center Line3 Line4
21.1 -0.871333347 -1.536403196 -1.826784168 -2.013347664 -2.058588716
21.15 -0.876013666 -1.51561079 -1.868885951 -2.014787719 -1.968877289
21.2 -0.981523985 -1.708348394 -1.928961741 -1.979515764 -2.158752833
21.25 -1.087034305 -1.901102009 -1.989037538 -1.944227798 -2.348627347
21.3 -1.254296626 -1.936110635 -2.020671342 -1.791950822 -2.355610831
21.35 -1.421559948 -1.971134271 -2.052305152 -1.639659835 -2.362594286
21.4 -1.399064269 -1.861595918 -2.10292097 -1.713075837 -2.203912711
21.45 -1.376568592 -1.752073576 -2.153552794 -1.78649183 -2.045231106
21.5 -1.036460915 -1.787997245 -2.159108625 -1.864530811 -2.085005472
21.55 -0.696369238 -1.823905924 -2.164680463 -1.942569782 -2.124763808
21.6 -0.780425563 -1.778026614 -2.098917308 -1.897776743 -2.114199114
21.65 -0.864466887 -1.732164315 -2.03315516 -1.852982693 -2.103650391
21.7 -0.940757213 -1.772101026 -2.044830018 -1.900870632 -2.265402638
21.75 -1.017046539 -1.812052748 -2.056520884 -1.948758561 -2.427155856
21.8 -0.989683865 -1.840515481 -2.067112757 -2.05128848 -2.448787044
21.85 -0.962320192 -1.868978225 -2.077720636 -2.153833388 -2.470418202
21.9 -1.01848352 -1.887124979 -1.841470522 -2.060653285 -2.310500331
21.95 -1.074646848 -1.905287744 -1.605221415 -1.967489172 -2.15056743
22 -1.200116177 -1.95608952 -1.666137315 -1.785961048 -2.117633499
22.05 -1.325584506 -2.006875306 -1.727037222 -1.604417914 -2.084699539
22.1 -1.108096836 -1.908324104 -1.757405136 -1.56421777 -2.053077549
22.15 -0.890594166 -1.809756912 -1.787772056 -1.524000614 -2.021439529
22.2 -0.942897497 -1.81974073 -1.763009984 -1.757771449 -2.05019648
22.25 -0.995215829 -1.82972456 -1.738246918 -1.991542273 -2.078953401
22.3 -1.071337161 -1.8554104 -1.976499859 -2.095033086 -2.194563292
22.35 -1.147459494 -1.88108025 -2.214768808 -2.198523889 -2.310189154
22.4 -0.956460827 -1.821011112 -2.387439763 -2.240735681 -2.213289986
22.45 -0.765463161 -1.760941984 -2.560125725 -2.282946463 -2.116405789
"""
[docs]def test_dabam_names():
"""
Tests that the I/O methods work well for the list of input values
:return:
"""
print("------------------- test_dabam_names ------------------------------")
dm = dabam()
number_of_input_fields = len(dm.inputs)
argsdict = dm.inputs
names = []
values = []
for i,j in argsdict.items():
names.append(i)
values.append(j)
#change values and reinsert in object
values2 = copy.copy(values)
for i in range(number_of_input_fields):
if values[i] != None:
values2[i] = 2*values[i]
print ("-----------------------------------------------------")
print ("--input_name value value2")
for i in range(number_of_input_fields):
print(i,names[i],values[i],values2[i])
dm.inputs[names[i]] = values2[i]
print ("-----------------------------------------------------")
print ("-----------------------------------------------------")
print ("--input_name input_name_short stored_value2, help")
for i in range(number_of_input_fields):
print(names[i],
dm.get_input_value(names[i]),
dm.get_input_value_short_name(names[i]),
dm.inputs[names[i]],"\n",
dm.get_input_value_help(names[i]),
)
print ("-----------------------------------------------------")
#back to initial values
dict2 = dm.get_inputs_as_dictionary()
for i in range(number_of_input_fields):
dict2[names[i]] = values[i]
dm.inputs[names[i]] = values2[i]
dm.set_inputs_from_dictionary(dict2)
print ("--back to initial value")
if (dm.inputs == dabam().inputs):
print("Back to initial value: OK")
else:
raise Exception("Back to initial value: error returning to initial state")
[docs]def test_dabam_stdev_slopes(nmax=9):
"""
Tests the slope error value for the nmax first profiles (from remote server)
:return:
"""
print("------------------- test_dabam_slopes ------------------------------")
stdev_ok = [4.8651846141972904e-07, 1.5096270252538352e-07, 1.7394444580303415e-07, 1.3427931903345248e-07, 8.4197811681221573e-07, 1.0097219914737401e-06, 5.74153915948042e-07, 5.7147678897188605e-07, 4.3527688789008779e-07, 2.3241765005153794e-07, 2.2883095949050537e-07, 3.1848792295534762e-07, 1.2899449478710491e-06, 1.1432193606225235e-06, 2.1297554130432642e-06, 1.8447156600570902e-06, 2.2715775271373941e-06, 1.1878208663183125e-07, 4.1777346923623561e-08, 4.0304426129060434e-07, 4.3430016136041185e-07, 5.3156037926371151e-06, 1.7725086287871762e-07, 2.0222947541222619e-07, 7.2140041229621698e-08]
tmp_profile = []
tmp_psd = []
stdev_ok = []
for i in range(nmax):
print(">> testing slopes stdev from profile number: ",i )
dm = dabam()
dm.set_input_silent(True)
dm.set_input_entryNumber(i+1)
dm.load()
stdev_profile = dm.stdev_profile_slopes()
stdev_psd = dm.stdev_psd_slopes()
tmp_profile.append(stdev_profile)
tmp_psd.append(stdev_psd)
try:
tmp = float(dm.metadata["CALC_SLOPE_RMS"]) * float(dm.metadata["CALC_SLOPE_RMS_FACTOR"])
except:
tmp = 0
stdev_ok.append(tmp)
for i in range(nmax):
print("Entry, stdev from profile, stdev from psd, stdev OK (stored): %03d %8.3g %8.3g %8.3g"%
(i+1,tmp_profile[i],tmp_psd[i],stdev_ok[i]))
for i in range(nmax):
if stdev_ok[i] != 0.0:
print("Checking correctness of dabam-entry: %d"%(1+i))
print(" Check slopes profile urad: StDev=%f, FromPSD=%f, stored=%f "%(1e6*tmp_profile[i],1e6*tmp_psd[i],1e6*stdev_ok[i]))
assert abs(tmp_profile[i] - stdev_ok[i])<1e-6
assert abs(tmp_psd[i] - stdev_ok[i])<1e-6
[docs]def test_entry():
dm = dabam.initialize_from_entry_number(80)
stdev_profile = dm.stdev_profile_slopes()
stdev_psd = dm.stdev_psd_slopes()
assert_almost_equal(stdev_profile, stdev_psd)
assert_almost_equal(stdev_profile, 0.158e-6)
assert_almost_equal(stdev_psd, 0.158e-6)
[docs]def test_entry_elliptical():
dm = dabam.initialize_from_entry_number(4)
# recalculate without detrending
dm.set_input_setDetrending(-1)
dm.make_calculations()
[docs]def test_entry_text():
txt = data1().split("\n")
dm = dabam.initialize_from_external_data(txt,
column_index_abscissas=0,
column_index_ordinates=1,
skiprows=1,
useHeightsOrSlopes=0,
to_SI_abscissas=1e-3,
to_SI_ordinates=1e-9,
detrending_flag=-1)
[docs]def test_entry_file():
filename = "tmp.dat"
f = open(filename,"w")
f.write(data1())
f.close()
print("File written to disk: %s"%filename)
dm = dabam.initialize_from_external_data(filename,
column_index_abscissas=0,
column_index_ordinates=1,
skiprows=1,
useHeightsOrSlopes=0,
to_SI_abscissas=1e-3,
to_SI_ordinates=1e-9,
detrending_flag=-1)
[docs]def test_local_server():
import urllib.request
urllib.request.urlretrieve ("https://raw.githubusercontent.com/oasys-kit/DabamFiles/main/dabam-081.txt", "/tmp/dabam-081.txt")
urllib.request.urlretrieve("https://raw.githubusercontent.com/oasys-kit/DabamFiles/main/dabam-081.dat", "/tmp/dabam-081.dat")
dm = dabam.initialize_from_local_server(81,"/tmp")
m0 = dm.momentsHeights, dm.momentsSlopes
# reset to remote server
dm.set_default_server()
dm.set_input_entryNumber(81)
dm.make_calculations()
m1 = dm.momentsHeights, dm.momentsSlopes
# set again to local serer
dm = dabam.initialize_from_local_server(81,"/tmp")
m2 = dm.momentsHeights, dm.momentsSlopes
assert_almost_equal(m0, m1)
assert_almost_equal(m0, m2)
[docs]def test_summary_dictionary():
dm = dabam()
out1 = dm.dabam_summary_dictionary_from_json_indexation(surface=None,
slp_err_from=None,
slp_err_to=None,
length_from=None,
length_to=None)
out2 = dm.dabam_summary_dictionary_from_scratch(surface=None,
slp_err_from=None,
slp_err_to=None,
length_from=None,
length_to=None,
verbose=True)
for i,ilist in enumerate(out1):
for key in ilist.keys():
# print(i,key,out1[i][key],out2[i][key])
if isinstance(out1[i][key],float):
assert_almost_equal(out1[i][key],out2[i][key])
else:
assert (out1[i][key] == out2[i][key])
[docs]def test_load_dictionary():
from srxraylib.metrology.dabam import dabam_summary_dictionary
d = dabam_summary_dictionary(surface=None,
slp_err_from=None,
slp_err_to=None,
length_from=None,
length_to=None,
verbose=True,
server=None)
print(d)
if __name__ == "__main__":
test_entry()
test_entry_file()
test_entry_elliptical()
test_entry_text()
test_dabam_names()
test_dabam_stdev_slopes()
test_write_dabam_formatted_files()
test_write_dabam_formatted_files()
test_local_server()
test_load_dictionary()
# test_summary_dictionary() #slow...
# filename = "/tmp/tmp18"
# f = open(filename,'r')
# txt = f.readlines()
#
# dm = dabam.initialize_from_external_data(txt,
# column_index_abscissas=0,
# column_index_ordinates=4,
# skiprows=1,
# useHeightsOrSlopes=0,
# to_SI_abscissas=1e-3,
# to_SI_ordinates=1e-9,
# detrending_flag=-3)