nomad-coe/nomad

Unpin `pint` to be able to use units supported in more recent version of pint

Opened this issue · 3 comments

It seems that pint is pinned to 0.17 and it would be convenient to unpin it be able to use ppm unit, which was introduced in pint 0.21 https://pint.readthedocs.io/en/stable/changes.html#id3.

year is another unit that is not supported in that version of pint.

Here is the log showing the error when parsing data with a schema containing the unit um / year:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/nomad/processing/data.py", line 1203, in parsing
    parser.parse(self.mainfile_file.os_path, self._parser_results, logger=logger, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/nomad/parsing/parser.py", line 505, in parse
    self.parse_file(mainfile, f, archive, logger)
  File "/usr/local/lib/python3.9/site-packages/nomad/parsing/parser.py", line 494, in parse_file
    archive.definitions = Package.m_from_dict(
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 4120, in m_from_dict
    return super(Package, cls).m_from_dict(data, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2371, in m_from_dict
    return MSection.from_dict(data, cls=cls, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2436, in from_dict
    section.m_update_from_dict(dct)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2322, in m_update_from_dict
    sub_section = sub_section_cls.m_from_dict(
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 4007, in m_from_dict
    return super(Section, cls).m_from_dict(data, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2371, in m_from_dict
    return MSection.from_dict(data, cls=cls, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2436, in from_dict
    section.m_update_from_dict(dct)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2322, in m_update_from_dict
    sub_section = sub_section_cls.m_from_dict(
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2371, in m_from_dict
    return MSection.from_dict(data, cls=cls, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2436, in from_dict
    section.m_update_from_dict(dct)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2357, in m_update_from_dict
    section.__dict__[property_def.name] = self.__deserialize(section, quantity_def, quantity_value)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2285, in __deserialize
    return __type_specific_deserialize(quantity_value)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 2280, in __type_specific_deserialize
    return tgt_type.deserialize(section, quantity_def, v)
  File "/usr/local/lib/python3.9/site-packages/nomad/metainfo/metainfo.py", line 347, in deserialize
    value = units.parse_units(value)
  File "/usr/local/lib/python3.9/site-packages/pint/registry.py", line 1093, in parse_units
    units = self._parse_units(input_string, as_delta, case_sensitive)
  File "/usr/local/lib/python3.9/site-packages/pint/registry.py", line 1306, in _parse_units
    return super()._parse_units(input_string, as_delta, case_sensitive)
  File "/usr/local/lib/python3.9/site-packages/pint/registry.py", line 1121, in _parse_units
    cname = self.get_name(name, case_sensitive=case_sensitive)
  File "/usr/local/lib/python3.9/site-packages/pint/registry.py", line 643, in get_name
    raise UndefinedUnitError(name_or_alias)
pint.errors.UndefinedUnitError: 'year' is not defined in the unit registry

Thanks for bringing this up. We can definitely try updating to pint==0.21, especially since it seems to bring support to "%" which will be very useful. I can try the update and see how smoothly it goes: we also have to check that the code we use in the browser to deal with unit transformations works with these new units.

In general, we like to pin many of our dependencies, because we have had so many problems with unpinned libraries breaking our code. But a controlled update of the pinned version is totally fine.

An update: unfortunately pint>=0.21 seems to have broken certain math operations with numpy arrays that have units (see issue here). This is currently preventing us from updating until the problem gets fixed or we refactor several of our parsers to avoid these operations.