Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
c00b3d0
Initial commit
torogi94 May 19, 2023
53ebb27
Minor changes
torogi94 Aug 22, 2023
85d3a4e
Implement IdentityAssigner for one FID object
torogi94 Sep 5, 2023
97df96f
Update generate_api.yaml
torogi94 Sep 5, 2023
29606d3
Update generate_api.yaml
torogi94 Sep 5, 2023
1583813
Update generate_api.yaml
torogi94 Sep 5, 2023
a87f2f6
Update generate_api.yaml
torogi94 Sep 5, 2023
f164b24
Update generate_api.yaml
torogi94 Sep 5, 2023
188c365
Implement IdentityAssigner for entire FIDArray
torogi94 Sep 6, 2023
0bfbfe4
Update data model
torogi94 Sep 25, 2023
cb0def5
Minor bug fix
torogi94 Sep 25, 2023
2feaa3d
Add interface with EnzymeML
torogi94 Nov 2, 2023
9f7fd0c
Update IdentityAssigner
torogi94 Nov 20, 2023
aaea4f9
Update generate_api.yaml
torogi94 Nov 20, 2023
c1bec90
Update generate_api.yaml
torogi94 Nov 20, 2023
ce11a73
Update generate_api.yaml
torogi94 Nov 20, 2023
030dcc5
API update
Nov 20, 2023
41c363e
Remove Citation info from data model
torogi94 Apr 19, 2024
ecbaea2
API update
Apr 19, 2024
6b3e30a
Remove depricated data model
torogi94 Jun 24, 2024
56d2cf7
Add apply_to_enzymeml() method
torogi94 Sep 23, 2024
d7e5cf5
Update plotting.py
torogi94 Sep 24, 2024
6afc891
Restructure data model & reflect changes in lib
torogi94 Jan 16, 2025
b7bacb0
Delete .vscode directory
torogi94 Jan 16, 2025
cb07ff9
Update from sdRDM to md-models
torogi94 Jan 20, 2025
58e94ba
Temporarily remove conc. calculation
torogi94 Jan 20, 2025
037e60f
Revert linting changes
torogi94 Jan 28, 2025
1909b9a
Update regular and add optional requirements
torogi94 Jan 28, 2025
921b9ec
Add graceful handling of optional imports
torogi94 Jan 29, 2025
7b5c86f
Fix recurring typo in pyenzyme import error
torogi94 Jan 29, 2025
fd90839
Remove deprecated data model linking
torogi94 Jan 29, 2025
dfbb0aa
Add None check for new FidArray properties
torogi94 Feb 19, 2025
65ebd00
Fix various bugs
torogi94 Feb 21, 2025
7e1b192
Update requirements.txt
torogi94 Mar 3, 2025
1b0349d
Update data_objects.py
torogi94 Mar 4, 2025
f6659b4
fix: Fix `Fid.baseline_correct()` and `FidArray.baseline_correct_fids()`
jmrohwer Apr 24, 2025
afa951b
Add measurement handling (#14)
torogi94 May 5, 2025
848e643
Rework data handling (#15)
torogi94 May 5, 2025
d674e41
update ruff.toml
jmrohwer May 21, 2025
e0a724c
fix data_model.setter ; formatting fixes
jmrohwer May 21, 2025
651684c
Fix `FidArray.save_to_file()` when deleting data model
jmrohwer May 22, 2025
38072de
rework calibrate() widget not to make use of asyncio.Future()
jmrohwer May 23, 2025
c851b60
revert @data_model.setter changes as data_model is now deleted during…
jmrohwer May 24, 2025
e987ad3
fix pyenzyme imports, update dependencies
jmrohwer Aug 4, 2025
b28d5e6
Upgrade to pyenzyme v2
torogi94 Aug 7, 2025
3dc3d12
Add t0 handling (#18)
torogi94 Aug 27, 2025
6cf0830
Fix copy() error in plotting.py
torogi94 Sep 8, 2025
4f48277
Add explicit super init to FidArray
torogi94 Sep 16, 2025
d796f8d
Update range handling in Fid (#20)
torogi94 Sep 16, 2025
80e4e12
Add attribute checks for data model existence
torogi94 Sep 17, 2025
c3dca2d
Fix faulty argument to T0Adder widget
torogi94 Sep 22, 2025
7a3e67d
Add data model test suites
torogi94 Sep 22, 2025
2309dc2
Add data model property unit tests + fixes
torogi94 Sep 25, 2025
9f55722
Fix parameter mapping to data model
torogi94 Nov 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
707 changes: 677 additions & 30 deletions nmrpy/data_objects.py

Large diffs are not rendered by default.

825 changes: 825 additions & 0 deletions nmrpy/nmrpy_model.py

Large diffs are not rendered by default.

1,270 changes: 1,219 additions & 51 deletions nmrpy/plotting.py

Large diffs are not rendered by default.

214 changes: 214 additions & 0 deletions nmrpy/tests/nmrpy_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
import numpy
import os

try:
import pyenzyme
from pyenzyme import EnzymeMLDocument, Measurement, MeasurementData
except ImportError as ex:
print(f"Optional dependency import failed for nmrpy_tests.py: {ex}")
pyenzyme = None


testpath = os.path.dirname(__file__)

class TestBaseInitialisation(unittest.TestCase):
Expand Down Expand Up @@ -697,6 +705,199 @@ def test_peakpicker_traces(self):
def test_select_integral_traces(self):
self.fid_array_varian.select_integral_traces()

class TestDataModels(unittest.TestCase):
def setUp(self):
if (pyenzyme is None):
raise RuntimeError(
"The `pyenzyme` package is required to use NMRpy with an EnzymeML document. Please install it via `pip install nmrpy[enzymeml]` or choose a different set of tests to run."
)
# Load Bruker test data
path_bruker = os.path.join(testpath, 'test_data', 'bruker1')
self.fid_array = FidArray.from_path(fid_path=path_bruker, file_format='bruker')
self.fid = self.fid_array.get_fids()[0]

# Load EnzymeML test document
enzml_doc = pyenzyme.EnzymeMLDocument(name='NMRpy test document')
enzml_doc.add_to_creators(
given_name='Foo',
family_name='Bar',
mail='foo.bar@example.com'
)
enzml_doc.add_to_vessels(
id='test_vessel',
name='Test vessel',
volume=1.0,
unit='ml'
)
enzml_doc.add_to_small_molecules(
id='test_variable_small_molecule',
name='Test variable small molecule',
vessel_id='test_vessel'
)
enzml_doc.add_to_small_molecules(
id='test_constant_small_molecule',
name='Test constant small molecule',
constant=True,
vessel_id='test_vessel'
)
measurement = pyenzyme.Measurement(
id='test_measurement',
name='Test measurement',
)
for species in getattr(enzml_doc, 'small_molecules'):
measurement.add_to_species_data(
species_id=species.id
)
enzml_doc.measurements.append(measurement)
self.enzml_doc = enzml_doc

# Create data model objects
self.data_model = NMRpy(
datetime_created='2025-01-01T00:00:00',
experiment=Experiment(name="Test experiment object")
)
self.fid_object = FIDObject(
raw_data=[],
processed_data=[],
nmr_parameters=Parameters(),
processing_steps=ProcessingSteps(),
)

# Set peaks and ranges for both FidArrays
peaks = [ 4.71, 4.64, 4.17, 0.57]
ranges = [[ 5.29, 3.67], [1.05, 0.27]]
for fid in self.fid_array.get_fids():
fid.peaks = peaks
fid.ranges = ranges

# Test Fid properties
def test_fid_species_setter(self):
self.fid.peaks = [1]
self.fid.species = 'string'
self.assertEqual(all(i==j for i, j in zip(self.fid.species, numpy.array(['string'], dtype=object))), True)
self.fid.peaks = [1, 2]
self.fid.species = ['string', 'string2']
self.assertEqual(all(i==j for i, j in zip(self.fid.species, numpy.array(['string', 'string2'], dtype=object))), True)
self.fid.peaks = [1, 2, 3]
self.fid.species = None
self.assertEqual(self.fid.species, None)

def test_failed_fid_species_setter(self):
self.fid.peaks = [1]
with self.assertRaises(TypeError):
self.fid.species = 1
self.fid.peaks = [1, 2]
with self.assertRaises(AttributeError):
self.fid.species = [1, 'string']
with self.assertRaises(AttributeError):
self.fid.species = [['string', 'string2']]
with self.assertRaises(AttributeError):
self.fid.species = [['string'], ['string2']]
with self.assertRaises(AttributeError):
self.fid.species = [['string', 'string2'], ['string3', 'string4']]
with self.assertRaises(AttributeError):
self.fid.species = ['string', 'string2', 'string3']

def test_fid_fid_object_setter(self):
self.assertIsInstance(self.fid.fid_object, FIDObject)
self.fid.fid_object = None
self.assertEqual(self.fid.fid_object, None)
self.fid.fid_object = self.fid_object
self.assertEqual(self.fid.fid_object, self.fid_object)

def test_failed_fid_fid_object_setter(self):
with self.assertRaises(AttributeError):
self.fid.fid_object = 1
with self.assertRaises(AttributeError):
self.fid.fid_object = 'string'
with self.assertRaises(AttributeError):
self.fid.fid_object = [1, 2]
with self.assertRaises(AttributeError):
self.fid.fid_object = {'string': 1}
with self.assertRaises(AttributeError):
self.fid.fid_object = True

def test_fid_enzymeml_species_setter(self):
self.fid.enzymeml_species = self.enzml_doc.small_molecules
self.assertEqual(self.fid.enzymeml_species, self.enzml_doc.small_molecules)
self.fid.enzymeml_species = self.enzml_doc.small_molecules[0]
self.assertEqual(self.fid.enzymeml_species, [self.enzml_doc.small_molecules[0]])

def test_failed_fid_enzymeml_species_setter(self):
with self.assertRaises(AttributeError):
self.fid.enzymeml_species = 1
with self.assertRaises(AttributeError):
self.fid.enzymeml_species = 'string'
with self.assertRaises(AttributeError):
self.fid.enzymeml_species = [1, 2]
with self.assertRaises(AttributeError):
self.fid.enzymeml_species = [self.enzml_doc.small_molecules[0], 'string']

# Test FidArray properties
def test_fid_array_data_model_setter(self):
self.assertIsInstance(self.fid_array.data_model, NMRpy)
self.fid_array.data_model = self.data_model
self.assertEqual(self.fid_array.data_model, self.data_model)
self.fid_array.data_model = None
self.assertEqual(self.fid_array.data_model, None)

def test_failed_fid_array_data_model_setter(self):
with self.assertRaises(AttributeError):
self.fid_array.data_model = 'string'
with self.assertRaises(AttributeError):
self.fid_array.data_model = 1
with self.assertRaises(AttributeError):
self.fid_array.data_model = [1, 2]
with self.assertRaises(AttributeError):
self.fid_array.data_model = {'string': 1}
with self.assertRaises(AttributeError):
self.fid_array.data_model = True

def test_fid_array_enzymeml_document_setter(self):
self.fid_array.enzymeml_document = self.enzml_doc
self.assertEqual(self.fid_array.enzymeml_document, self.enzml_doc)
self.fid_array.enzymeml_document = None
self.assertEqual(self.fid_array.enzymeml_document, None)

def test_failed_fid_array_enzymeml_document_setter(self):
with self.assertRaises(AttributeError):
self.fid_array.enzymeml_document = 'string'
with self.assertRaises(AttributeError):
self.fid_array.enzymeml_document = 1
with self.assertRaises(AttributeError):
self.fid_array.enzymeml_document = [1, 2]
with self.assertRaises(AttributeError):
self.fid_array.enzymeml_document = {'string': 1}
with self.assertRaises(AttributeError):
self.fid_array.enzymeml_document = True

def test_fid_array_concentrations_setter(self):
for fid in self.fid_array.get_fids():
fid.species = ['test_variable_small_molecule', 'test_variable_small_molecule', 'test_variable_small_molecule', 'test_constant_small_molecule']
test_concentrations = {'test_variable_small_molecule': [1], 'test_constant_small_molecule': [1.0]}
self.fid_array.concentrations = test_concentrations
self.assertEqual(self.fid_array.concentrations, test_concentrations)
self.fid_array.concentrations = None
self.assertEqual(self.fid_array.concentrations, None)

def test_failed_fid_array_concentrations_setter(self):
for fid in self.fid_array.get_fids():
fid.species = ['test_variable_small_molecule', 'test_variable_small_molecule', 'test_variable_small_molecule', 'test_constant_small_molecule']
with self.assertRaises(TypeError):
self.fid_array.concentrations = 'string'
with self.assertRaises(TypeError):
self.fid_array.concentrations = 1
with self.assertRaises(TypeError):
self.fid_array.concentrations = [1, 2]
with self.assertRaises(TypeError):
self.fid_array.concentrations = True
with self.assertRaises(ValueError):
self.fid_array.concentrations = {'test_variable_small_molecule': [1], 'test_constant_small_molecule': ['string']}
with self.assertRaises(ValueError):
self.fid_array.concentrations = {'test_variable_small_molecule': [1], 'test_constant_small_molecule': [1.0, 2.0]}

# Test methods

class NMRPyTest:
def __init__(self, tests='all'):
"""
Expand All @@ -711,6 +912,8 @@ def __init__(self, tests='all'):
'fidarrayutils' - FidArray utilities tests
'plotutils' - plotting utilities tests
'noplot' - all tests except plotting utilities (scripted usage)
'datamodels' - data model tests
'nodatamodels' - all tests except data model tests
"""
runner = unittest.TextTestRunner()
baseinit_test = unittest.makeSuite(TestBaseInitialisation)
Expand All @@ -719,6 +922,7 @@ def __init__(self, tests='all'):
fidutils_test = unittest.makeSuite(TestFidUtils)
fidarrayutils_test = unittest.makeSuite(TestFidArrayUtils)
plotutils_test = unittest.makeSuite(TestPlottingUtils)
datamodels_test = unittest.makeSuite(TestDataModels)

suite = baseinit_test
if tests == 'all':
Expand All @@ -727,11 +931,13 @@ def __init__(self, tests='all'):
suite.addTests(fidutils_test)
suite.addTests(fidarrayutils_test)
suite.addTests(plotutils_test)
suite.addTests(datamodels_test)
elif tests == 'noplot':
suite.addTests(fidinit_test)
suite.addTests(fidarrayinit_test)
suite.addTests(fidutils_test)
suite.addTests(fidarrayutils_test)
suite.addTests(datamodels_test)
elif tests == 'fidinit':
suite.addTests(fidinit_test)
elif tests == 'fidarrayinit':
Expand All @@ -742,6 +948,14 @@ def __init__(self, tests='all'):
suite.addTests(fidarrayutils_test)
elif tests == 'plotutils':
suite.addTests(plotutils_test)
elif tests == 'datamodels':
suite.addTests(datamodels_test)
elif tests == 'nodatamodels':
suite.addTests(fidinit_test)
suite.addTests(fidarrayinit_test)
suite.addTests(fidutils_test)
suite.addTests(fidarrayutils_test)
suite.addTests(plotutils_test)
else:
raise ValueError('Please select a valid set of tests to run.')

Expand Down
Loading