Propose fix for nc/idl map (#284)

* proposed fix for nc/idl map

* correct docs, implement failesafe for therm. trajectories

* lint

* easier test, improve descriptions

* clarify r_step parameterin docs

* add small test for trajectories
This commit is contained in:
Justus Kuhlmann 2026-05-28 11:37:21 +02:00 committed by GitHub
commit 30d109413d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 40 additions and 5 deletions

View file

@ -238,8 +238,9 @@ def _extract_flowed_energy_density(path, prefix, dtr_read, xmin, spatial_extent,
It is assumed that one measurement is performed for each config. It is assumed that one measurement is performed for each config.
If this is not the case, the resulting idl, as well as the handling If this is not the case, the resulting idl, as well as the handling
of r_start, r_stop and r_step is wrong and the user has to correct of `r_start`, `r_stop` and `r_step` is wrong and the user has to correct
this in the resulting observable. this in the resulting observable.
The function also assumes that `r_step` is the same across all replica.
Parameters Parameters
---------- ----------
@ -250,7 +251,7 @@ def _extract_flowed_energy_density(path, prefix, dtr_read, xmin, spatial_extent,
dtr_read : int dtr_read : int
Determines how many trajectories should be skipped Determines how many trajectories should be skipped
when reading the ms.dat files. when reading the ms.dat files.
Corresponds to dtr_cnfg / dtr_ms in the openQCD input file. Corresponds to dtr_cnfg (dncnfg) in the openQCD input file.
xmin : int xmin : int
First timeslice where the boundary First timeslice where the boundary
effects have sufficiently decayed. effects have sufficiently decayed.
@ -358,8 +359,8 @@ def _extract_flowed_energy_density(path, prefix, dtr_read, xmin, spatial_extent,
if (len(t) < 4): if (len(t) < 4):
break break
nc = struct.unpack('i', t)[0] nc = struct.unpack('i', t)[0]
if nc % dtr_read == 0:
configlist[-1].append(nc) configlist[-1].append(nc)
t = fp.read(8 * tmax * (nn + 1)) t = fp.read(8 * tmax * (nn + 1))
if kwargs.get('plaquette'): if kwargs.get('plaquette'):
if nc % dtr_read == 0: if nc % dtr_read == 0:
@ -377,6 +378,8 @@ def _extract_flowed_energy_density(path, prefix, dtr_read, xmin, spatial_extent,
for current in range(0, len(item), tmax)]) for current in range(0, len(item), tmax)])
diffmeas = configlist[-1][-1] - configlist[-1][-2] diffmeas = configlist[-1][-1] - configlist[-1][-2]
if not all(c % diffmeas == 0 for c in configlist[-1]):
raise ValueError(f"Irregular spacing of configurations in {ls[rep]}, determined stepsize does not divide all trajectory steps.")
configlist[-1] = [item // diffmeas for item in configlist[-1]] configlist[-1] = [item // diffmeas for item in configlist[-1]]
if kwargs.get('assume_thermalization', True) and configlist[-1][0] > 1: if kwargs.get('assume_thermalization', True) and configlist[-1][0] > 1:
warnings.warn('Assume thermalization and that the first measurement belongs to the first config.') warnings.warn('Assume thermalization and that the first measurement belongs to the first config.')
@ -433,8 +436,9 @@ def extract_t0(path, prefix, dtr_read, xmin, spatial_extent, fit_range=5, postfi
It is assumed that one measurement is performed for each config. It is assumed that one measurement is performed for each config.
If this is not the case, the resulting idl, as well as the handling If this is not the case, the resulting idl, as well as the handling
of r_start, r_stop and r_step is wrong and the user has to correct of `r_start`, `r_stop` and `r_step` is wrong and the user has to correct
this in the resulting observable. this in the resulting observable.
The function also assumes that `r_step` is the same across all replica.
Parameters Parameters
---------- ----------

Binary file not shown.

View file

@ -65,6 +65,37 @@ def test_rwms():
pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2, plot_fit=True) pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2, plot_fit=True)
# trajectories
t0 = pe.input.openQCD.extract_t0(path, 'oqcd2_traj', dtr_read=30, xmin=16, spatial_extent=48, fit_range=2, plot_fit=True, names = ["A|r1"], assume_thermalization=False)
assert len(t0.idl['A|r1']) == 10
assert t0.idl['A|r1'][0] == 4
assert t0.idl['A|r1'][9] == 13
with pytest.warns(Warning):
t0 = pe.input.openQCD.extract_t0(path, 'oqcd2_traj', dtr_read=1, xmin=16, spatial_extent=48, fit_range=2, plot_fit=True, names = ["A|r1"])
assert len(t0.idl['A|r1']) == 30
assert t0.idl['A|r1'][0] == 1
assert t0.idl['A|r1'][29] == 30
with pytest.warns(Warning):
t0 = pe.input.openQCD.extract_t0(path, 'oqcd2_traj', dtr_read=10, xmin=16, spatial_extent=48, fit_range=2, plot_fit=True, names = ["A|r1"])
assert len(t0.idl['A|r1']) == 30
assert t0.idl['A|r1'][0] == 1
assert t0.idl['A|r1'][29] == 30
with pytest.warns(Warning):
t0 = pe.input.openQCD.extract_t0(path, 'oqcd2_traj', dtr_read=30, xmin=16, spatial_extent=48, fit_range=2, plot_fit=True, names = ["A|r1"])
assert len(t0.idl['A|r1']) == 10
assert t0.idl['A|r1'][0] == 1
assert t0.idl['A|r1'][9] == 10
with pytest.warns(Warning):
t0 = pe.input.openQCD.extract_t0(path, 'oqcd2_traj', dtr_read=60, xmin=16, spatial_extent=48, fit_range=2, plot_fit=True, names = ["A|r1"])
assert len(t0.idl['A|r1']) == 5
assert t0.idl['A|r1'][0] == 1
assert t0.idl['A|r1'][4] == 5
with pytest.raises(Exception): with pytest.raises(Exception):
pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2, c=14) pe.input.openQCD.extract_t0(path, '', dtr_read=3, xmin=0, spatial_extent=4, files=files, names=names, fit_range=2, c=14)
# w0 # w0