From 0b55242f58a5c0a474b39da0670c74f1a221205a Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Thu, 8 Sep 2022 12:34:25 +0200 Subject: [PATCH 01/22] Fix typo, grammar issues --- nomad/metainfo/metainfo.py | 196 ++++++++++++++++++------------------- 1 file changed, 98 insertions(+), 98 deletions(-) diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index 38d31445c..f5abc1387 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -113,8 +113,8 @@ def _split_python_definition(definition_with_id: str) -> Tuple[list, Union[str, Split a Python type name into names and an optional id. Example: - mypackage.mysection@myid ==> (['mypackage', 'mysection'], 'myid') - mypackage.mysection ==> (['mypackage', 'mysection'], None) + my_package.my_section@my_id ==> (['my_package', 'my_section'], 'my_id') + my_package.my_section ==> (['my_package', 'my_section'], None) ''' if '@' not in definition_with_id: return definition_with_id.split('.'), None @@ -723,11 +723,11 @@ class Reference(DataType): The behavior in this DataType class uses URLs to serialize references. In memory, the actual referenced section instance (or respective MProxy instances) are used as values. - During de-serialization, MProxy instances that autoresolve on usage, will be used. + During de-serialization, MProxy instances that auto-resolve on usage, will be used. The reference datatype will also accept MProxy instances or URL strings as values when set in Python and replace the value with the resolved section instance. - Sub-classes might exchange URLs with a different string serialization, e.g. Python + Subclasses might exchange URLs with a different string serialization, e.g. Python qualified names. Arguments: @@ -1138,7 +1138,7 @@ This can either be : - the name of the section - the section definition itself -- the definition of a sub section +- the definition of a subsection - or the section definition Python class ''' @@ -1179,7 +1179,7 @@ class Context(): def create_reference(self, section: 'MSection', quantity_def: 'Quantity', value: 'MSection') -> str: ''' Returns a reference for the given target section (value) based on the given context. - Allows sub-classes to build references across resources, if necessary. + Allows subclasses to build references across resources, if necessary. Raises: MetainfoReferenceError ''' @@ -1268,29 +1268,29 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas .. automethod:: m_add_sub_section .. automethod:: m_remove_sub_section - There are some specific attributes for section instances that are sub-sections of - another section. While sub-sections are directly accessible from the containing - section by using the Python property that represents the sub-section (e.g. - `run.section_system`), there is also a way to navigate from the sub-section to + There are some specific attributes for section instances that are subsections of + another section. While subsections are directly accessible from the containing + section by using the Python property that represents the subsection (e.g. + `run.section_system`), there is also a way to navigate from the subsection to the containing section (`parent section`) using these Python properties: Attributes: m_parent: - If this section is a sub-section, this references the parent section instance. + If this section is a subsection, this references the parent section instance. m_parent_sub_section: - If this section is a sub-section, this is the :class:`SubSection` that defines + If this section is a subsection, this is the :class:`SubSection` that defines this relationship. m_parent_index: - For repeatable sections, parent keep a list of sub-sections. This is the index - of this section in the respective parent sub-section list. + For repeatable sections, parent keep a list of subsections. This is the index + of this section in the respective parent subsection list. m_context: The :class:`MContext` that manages this (root-)section. Often some general tasks have to be performed on a whole tree of sections without knowing about the definitions in advance. The following methods allow to access - sub-sections reflectively. + subsections reflectively. .. automethod:: m_traverse .. automethod:: m_all_contents @@ -1446,12 +1446,12 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas pkg.m_add_sub_section(Package.section_definitions, cls.m_def) # apply_google_docstrings - # Parses the google doc string of the given class and properly updates the + # Parses the Google doc string of the given class and properly updates the # definition descriptions. - # This allows to document quantities and sub-sections with 'Args:' in the section + # This allows to document quantities and subsections with 'Args:' in the section # class. It will remove the 'Args' section from the section definition and will - # set the respective pieces to the quantity and sub-section descriptions. + # set the respective pieces to the quantity and subsection descriptions. docstring = cls.__doc__ if docstring is not None: parsed_docstring = docstring_parser.parse(docstring) @@ -1752,7 +1752,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas sub_section.m_parent_index = -1 def m_add_sub_section(self, sub_section_def: 'SubSection', sub_section: 'MSection', index: int = -1) -> None: - ''' Adds the given section instance as a sub section of the given sub section definition. ''' + ''' Adds the given section instance as a subsection of the given subsection definition. ''' sub_section_name = sub_section_def.name if sub_section_def.repeats: @@ -1760,7 +1760,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if index == -1: sub_section_lst.append(sub_section) else: - raise NotImplementedError('You can only append sub sections.') + raise NotImplementedError('You can only append subsections.') if sub_section_lst.__class__ != MSubSectionList: self._on_add_sub_section( @@ -1775,7 +1775,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas self._on_remove_sub_section(sub_section_def, old_sub_section) def m_remove_sub_section(self, sub_section_def: 'SubSection', index: int) -> None: - ''' Removes the exiting section for a non repeatable sub section ''' + ''' Removes the exiting section for a non-repeatable subsection ''' self.m_mod_count += 1 if sub_section_def.repeats: @@ -1788,7 +1788,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas self._on_remove_sub_section(sub_section_def, sub_section) def m_get_sub_section(self, sub_section_def: 'SubSection', index: Any) -> 'MSection': - ''' Retrieves a single sub section of the given sub section definition. ''' + ''' Retrieves a single subsection of the given subsection definition. ''' if sub_section_def.repeats: if isinstance(index, int): return self.__dict__[sub_section_def.name][index] @@ -1809,7 +1809,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return self.__dict__.get(sub_section_def.name, None) def m_get_sub_sections(self, sub_section_def: 'SubSection') -> List['MSection']: - ''' Retrieves all sub sections of the given sub section definition. ''' + ''' Retrieves all subsections of the given subsection definition. ''' if sub_section_def.repeats: return self._get_sub_sections(sub_section_def) else: @@ -1819,7 +1819,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return [] def m_sub_section_count(self, sub_section_def: 'SubSection') -> int: - ''' Returns the number of sub sections for the given sub section definition. ''' + ''' Returns the number of subsections for the given subsection definition. ''' try: value = self.__dict__[sub_section_def.name] if sub_section_def.repeats: @@ -1884,29 +1884,29 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas self, section_cls: Type[MSectionBound], sub_section_def: 'SubSection' = None, **kwargs) -> MSectionBound: ''' Creates a section instance and adds it to this section provided there is a - corresponding sub section. + corresponding subsection. Args: - section_cls: The section class for the sub-section to create - sub_section_def: If there are multiple sub-sections for the given class, - this must be used to explicitly state the sub-section definition. + section_cls: The section class for the subsection to create + sub_section_def: If there are multiple subsections for the given class, + this must be used to explicitly state the subsection definition. ''' section_def = section_cls.m_def sub_section_defs = self.m_def.all_sub_sections_by_section.get(section_def, []) n_sub_section_defs = len(sub_section_defs) if n_sub_section_defs == 0: - raise TypeError(f'There is no sub section to hold a {section_def} in {self.m_def}.') + raise TypeError(f'There is no subsection to hold a {section_def} in {self.m_def}.') if n_sub_section_defs > 1 and sub_section_def is None: raise MetainfoError( - f'There are multiple sub section to hold a {section_def} in {self.m_def}, ' - f'but no sub-section was explicitly given.') + f'There are multiple subsection to hold a {section_def} in {self.m_def}, ' + f'but no subsection was explicitly given.') if sub_section_def is not None and sub_section_def not in sub_section_defs: raise MetainfoError( - f'The given sub-section class {section_cls} does not ' - f'match the given sub-section definition {sub_section_def}.') + f'The given subsection class {section_cls} does not ' + f'match the given subsection definition {sub_section_def}.') if sub_section_def is None: sub_section_def = sub_section_defs[0] @@ -1917,7 +1917,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return cast(MSectionBound, sub_section) def m_update(self, m_ignore_additional_keys: bool = False, **kwargs): - ''' Updates all quantities and sub-sections with the given arguments. ''' + ''' Updates all quantities and subsections with the given arguments. ''' self.m_mod_count += 1 for name, value in kwargs.items(): @@ -1933,7 +1933,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas for item in value: self.m_add_sub_section(prop, item) else: - raise TypeError(f'Sub section {prop.name} repeats, but no list was given') + raise TypeError(f'Subsection {prop.name} repeats, but no list was given') else: self.m_add_sub_section(prop, value) @@ -1972,8 +1972,8 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas with_meta: Include information about the section definition, the sections position in its parent, and annotations. For Definition instances this information will be included regardless; the section definition will - always be included if the sub section definition references a base section - and the concrete sub section is derived from this base section. + always be included if the subsection definition references a base section + and the concrete subsection is derived from this base section. with_out_meta: Exclude information `with_meta` information, even from Definition instances. with_root_def: Include the m_def for the top-level section. This allows to @@ -1986,25 +1986,25 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas Treat references as the sections and values they represent. References must not create circles; there is no check and danger of endless looping. categories: A list of category classes or category definitions that is used - to filter the included quantities and sub sections. Only applied to - properties of this section, not on sub-sections. Is overwritten + to filter the included quantities and subsections. Only applied to + properties of this section, not on subsections. Is overwritten by partial. - include: A function that determines if a property (quantity or sub-section) will + include: A function that determines if a property (quantity or subsection) will be included in the results. It takes the property definition and the current section as arguments. The function returns true for including and false for - excluding the property. Include is applied recursively on sub-sections. + excluding the property. Include is applied recursively on subsections. Overrides categories. - exclude: A function that determines if a property (quantity or sub-section) will + exclude: A function that determines if a property (quantity or subsection) will be excluded from the results. It takes the property definition and the current section as arguments. The function returns true for excluding and false for - including the property. Exclude is applied recursively on sub-sections. + including the property. Exclude is applied recursively on subsections. Overrides categories. transform: A function that determines serialized quantity values. It takes the quantity definition, current section, the default serialized value and the metainfo path with respect to the - document root as arguments. Depending where this is used, you + document root as arguments. Depending on where this is used, you might have to ensure that the result is JSON-serializable. By - default values are serialized to JSON according to the quantity + default, values are serialized to JSON according to the quantity type. ''' if isinstance(self, Definition) and not with_out_meta: @@ -2250,9 +2250,9 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if with_def_id: yield 'm_def_id', self.m_def.definition_id elif self.m_parent and self.m_parent_sub_section.sub_section != self.m_def: - # The sub section definition's section def is different from our + # The subsection definition's section def is different from our # own section def. We are probably a specialized derived section - # from the base section that was used in the sub section def. To allow + # from the base section that was used in the subsection def. To allow # clients to recognize the concrete section def, we force the export # of the section def. yield 'm_def', m_def_reference() @@ -2287,7 +2287,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas except ValueError as e: raise ValueError(f'Value error ({str(e)}) for {quantity}') - # sub sections + # subsections for name, sub_section_def in self.m_def.all_sub_sections.items(): if exclude(sub_section_def, self): continue @@ -2374,7 +2374,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas def m_from_dict(cls: Type[MSectionBound], data: Dict[str, Any], **kwargs) -> MSectionBound: ''' Creates a section from the given serializable data dictionary. - This is the 'opposite' of :func:`m_to_dict`. It takes a deserialized dict, e.g + This is the 'opposite' of :func:`m_to_dict`. It takes a deserialized dict, e.g. loaded from JSON, and turns it into a proper section, i.e. instance of the given section class. ''' @@ -2415,7 +2415,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas m_def_proxy.m_proxy_context = m_context cls = m_def_proxy.section_cls - # if 'm_def_id' exist, check if id matches + # if 'm_def_id' exists, check if id matches # in case of mismatch, retrieve the Package and use the corresponding section definition if 'm_def_id' in dct: if cls is None or cls.m_def is None or dct['m_def_id'] != cls.m_def.definition_id: @@ -2448,7 +2448,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas self, depth_first: bool = False, include_self: bool = False, stop: TypingCallable[['MSection'], bool] = None) -> Iterable['MSection']: ''' - Returns an iterable over all sub and sub subs sections. + Returns an iterable over all sub and sub subsections. Arguments: depth_first: A boolean indicating that children should be returned before @@ -2611,14 +2611,14 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas section = section.m_get_sub_section(prop_def, index) except Exception: raise MetainfoReferenceError( - f'Could not resolve {path}, there is no sub section for ' + f'Could not resolve {path}, there is no subsection for ' f'{prop_name} at {index}') else: section = section.m_get_sub_section(prop_def, -1) if section is None: raise MetainfoReferenceError( - f'Could not resolve {path}, there is no sub section {prop_name}') + f'Could not resolve {path}, there is no subsection {prop_name}') elif isinstance(prop_def, Quantity): if len(path_stack) > 0: @@ -2642,7 +2642,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas case the annotation is returned, regardless of its type. In the second case, all names and list for names are iterated and all annotations of the given class are returned. - default: The default, if no annotation is found. None is the default default. + default: The default, if no annotation is found. None is the default `default`. as_list: Returns a list, no matter how many annotations have been found. ''' if isinstance(key, str): @@ -2854,7 +2854,7 @@ class MSubSectionList(list): super().__init__() def __setitem__(self, key, value): - raise NotImplementedError('You can only append sub-sections.') + raise NotImplementedError('You can only append subsections.') def __delitem__(self, key): old_value = self[key] @@ -2865,10 +2865,10 @@ class MSubSectionList(list): self.section._on_remove_sub_section(self.sub_section_def, old_value) def __setslice__(self, i, j, sequence): - raise NotImplementedError('You can only append sub-sections.') + raise NotImplementedError('You can only append subsections.') def __delslice__(self, i, j): - raise NotImplementedError('You can only append sub-sections.') + raise NotImplementedError('You can only append subsections.') def append(self, value): list.append(self, value) @@ -2876,7 +2876,7 @@ class MSubSectionList(list): self.section._on_add_sub_section(self.sub_section_def, value, len(self) - 1) def pop(self): - raise NotImplementedError('You can only append sub-sections.') + raise NotImplementedError('You can only append subsections.') def extend(self, newvalue): start_index = len(self) @@ -2886,16 +2886,16 @@ class MSubSectionList(list): self.sub_section_def, value, start_index + index) def insert(self, i, element): - raise NotImplementedError('You can only append sub-sections.') + raise NotImplementedError('You can only append subsections.') def remove(self, element): - raise NotImplementedError('You can only append sub-sections.') + raise NotImplementedError('You can only append subsections.') def reverse(self): - raise NotImplementedError('You can only append sub-sections.') + raise NotImplementedError('You can only append subsections.') def sort(self, cmpfunc=None): - raise NotImplementedError('You can only append sub-sections.') + raise NotImplementedError('You can only append subsections.') def clear(self): old_values = list(self) @@ -2934,7 +2934,7 @@ class Definition(MSection): ''' :class:`Definition` is the common base class for all metainfo definitions. - All metainfo `definitions` (sections, quantities, sub-sections, packages, ...) share + All metainfo `definitions` (sections, quantities, subsections, packages, ...) share some common properties. Attributes: @@ -2950,22 +2950,22 @@ class Definition(MSection): definitions* (i.e. section definitions are represented by Python classes), lower case `snake_case` identifier for variables that hold *sections*, and for *properties* (i.e. fields in a Python class) we typically use lower - case `snake_case` identifier. Sub-sections are often prefixed with ``section_`` - to clearly separate sub-sections from quantities. + case `snake_case` identifier. Subsections are often prefixed with ``section_`` + to clearly separate subsections from quantities. Generally, you do not have to set this attribute manually, it will be derived from Python identifiers automatically. - description: The description can be an arbitrary human readable text that explains + description: The description can be an arbitrary human-readable text that explains what a definition is about. For section definitions you do not have to set this manually as it will be derived from the classes doc string. Quantity and - sub-section descriptions can also be taken from the containing section class' + subsection descriptions can also be taken from the containing section class' doc-string ``Attributes:`` section. links: Each definition can be accompanied by a list of URLs. These should point to resources that further explain the definition. - aliases: A list of alternative names. For quantities and sub-sections these + aliases: A list of alternative names. For quantities and subsections these can be used to access the respective property with a different name from its containing section. @@ -3117,7 +3117,7 @@ class Definition(MSection): class Attribute(Definition): ''' - Attributes can be used to qualify all properties (sub sections and quantities) + Attributes can be used to qualify all properties (subsections and quantities) with simple scalar values. Attributes: @@ -3159,7 +3159,7 @@ class Attribute(Definition): class Property(Definition): ''' - A common base-class for section properties: sub sections and quantities. + A common base-class for section properties: subsections and quantities. Attributes: attributes: @@ -3320,7 +3320,7 @@ class Quantity(Property): virtual: A boolean that determines if this quantity is virtual. Virtual quantities can - be get/set like regular quantities, but their values are not (de-)serialized, + be got/set like regular quantities, but their values are not (de-)serialized, hence never permanently stored. ''' @@ -3588,22 +3588,22 @@ class PrimitiveQuantity(Quantity): class SubSection(Property): ''' - Like quantities, sub-sections are defined in a `section class` as attributes - of this class. An like quantities, each sub-section definition becomes a property of - the corresponding `section definition` (parent). A sub-section definition references - another `section definition` as the sub-section (child). As a consequence, parent - `section instances` can contain child `section instances` as sub-sections. + Like quantities, subsections are defined in a `section class` as attributes + of this class. Unlike quantities, each subsection definition becomes a property of + the corresponding `section definition` (parent). A subsection definition references + another `section definition` as the subsection (child). As a consequence, parent + `section instances` can contain child `section instances` as subsections. - Contrary to the old NOMAD metainfo, we distinguish between sub-section the section - and sub-section the property. This allows to use on child `section definition` as - sub-section of many different parent `section definitions`. + Contrary to the old NOMAD metainfo, we distinguish between subsection the section + and subsection the property. This allows to use on child `section definition` as + subsection of many parent `section definitions`. Attributes: sub_section: A :class:`Section` or Python class object for a `section class`. This will be the child `section definition`. The defining section the child `section definition`. - repeats: A boolean that determines whether this sub-section can appear multiple + repeats: A boolean that determines whether this subsection can appear multiple times in the parent section. ''' @@ -3636,7 +3636,7 @@ class SubSection(Property): if value is not None: raise NotImplementedError( - 'Cannot set a repeating sub section directly, modify the list, e.a. via append.') + 'Cannot set a repeating subsection directly, modify the list, e.a. via append.') obj.m_get_sub_sections(self).clear() @@ -3647,12 +3647,12 @@ class SubSection(Property): obj.m_add_sub_section(self, value) def __delete__(self, obj): - raise NotImplementedError('Deleting sub sections is not supported.') + raise NotImplementedError('Deleting subsections is not supported.') @constraint(warning=False) def has_sub_section(self): assert self.sub_section is not None, \ - 'Each sub section must define the section that is used as sub section via the "sub_section" quantity' + 'Each subsection must define the section that is used as subsection via the "sub_section" quantity' try: assert not isinstance(self.sub_section.m_resolved(), MProxy), 'Cannot resolve "sub_section"' except MetainfoReferenceError as e: @@ -3707,20 +3707,20 @@ class Section(Definition): Will be automatically set from the `section class`. sub_sections: - The sub-section definitions of this section definition as list of :class:`SubSection`. + The subsection definitions of this section definition as list of :class:`SubSection`. Will be automatically set from the `section class`. base_sections: A list of `section definitions` (:class:`Section`). By default this definition will - inherit all quantity and sub section definitions from the given section definitions. + inherit all quantity and subsection definitions from the given section definitions. This behavior might be altered with ``extends_base_section``. If there are no base sections to define, you have to use :class:`MSection`. - The Metainfo supports two inheritance mechanism. By default it behaves like regular + The Metainfo supports two inheritance mechanism. By default, it behaves like regular Python inheritance and the class inherits all its base classes' properties. The other mode (enabled via ``extends_base_section=True``), will - add all sub-class properties to the base-class. This is used throughout the NOMAD metainfo + add all subclass properties to the base-class. This is used throughout the NOMAD metainfo to add code-specific metadata to common section definitions. Here is an example: .. code-block:: python @@ -3733,18 +3733,18 @@ class Section(Definition): x_vasp_some_incar_parameter = Quantity(str) method = Method() - methid.x_vasp_same_incar_parameter = 'value' + method.x_vasp_same_incar_parameter = 'value' In this example, the section class ``VASPMethod`` defines a section definition that inherits from section definition ``Method``. The quantity `x_vasp_some_incar_parameter` will be added to `Method` and can be used in regular `Method` instances. - The following :class:`Section` attributes maniputlate the inheritance semantics: + The following :class:`Section` attributes manipulate the inheritance semantics: Attributes: extends_base_section: If True, this definition must have exactly one ``base_sections``. - Instead of inheriting properties, the quantity and sub-section definitions + Instead of inheriting properties, the quantity and subsection definitions of this section will be added to the base section. This allows to add further properties to an existing section definition. @@ -3759,11 +3759,11 @@ class Section(Definition): inheriting_sections: A list of `section definitions` (:class:`Section`). These are those sections - that inherit (i.e. are sub classes) of this section. + that inherit (i.e. are subclasses) of this section. - Besides defining quantities and sub-sections, a section definition can also provide - constraints that are used to validate a section and its quantities and sub-sections. + Besides defining quantities and subsections, a section definition can also provide + constraints that are used to validate a section and its quantities and subsections. Constraints allow to define more specific data structures beyond types and shapes. But constraints are not enforced automatically, sections have to be explicitly validated in order to evaluate constraints. @@ -3787,7 +3787,7 @@ class Section(Definition): Constraints are rules that a section must fulfil to be valid. This allows to implement semantic checks that go behind mere type or shape checks. This quantity takes the names of constraints as string. Constraints have to be implemented as methods - with the :func:`constraint` decorator. They can raise :class:`ConstraintVialated` + with the :func:`constraint` decorator. They can raise :class:`ConstraintViolated` or an AssertionError to indicate that the constraint is not fulfilled for the ``self`` section. This quantity will be set automatically from all constraint methods in the respective section class. To run validation of a section use :py:meth:`MSection.m_validate`. @@ -3810,7 +3810,7 @@ class Section(Definition): A helper attribute that gives direct and indirect inheriting sections. all_properties: - A helper attribute that gives all properties (sub section and quantity) definitions + A helper attribute that gives all properties (subsection and quantity) definitions including inherited properties and properties from extending sections as a dictionary with names and definitions. @@ -3820,12 +3820,12 @@ class Section(Definition): to :class:`Quantity`. all_sub_sections: - A helper attribute that gives all sub-section definition including inherited ones + A helper attribute that gives all subsection definition including inherited ones and ones from extending sections as a dictionary that maps names (strings) to :class:`SubSection`. all_sub_sections_by_section: - A helper attribute that gives all sub-section definition including inherited ones + A helper attribute that gives all subsection definition including inherited ones and ones from extending sections as a dictionary that maps section classes (i.e. Python class objects) to lists of :class:`SubSection`. @@ -3839,7 +3839,7 @@ class Section(Definition): their aliases by name. path: Shortest path from a root section to this section. This is not the path - in the metainfo schema (`m_path`) but a archive path in potential data. + in the metainfo schema (`m_path`) but an archive path in potential data. event_handlers: Event handler are functions that get called when the section data is changed. -- GitLab From 4b782c20378c2405e2e2ec7d45193d7814147a0c Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Thu, 8 Sep 2022 17:43:44 +0200 Subject: [PATCH 02/22] Add MQuantity implementation --- nomad/app/optimade/common.py | 7 +- nomad/metainfo/metainfo.py | 1663 +++++++----------- nomad/metainfo/metainfo_utility.py | 721 ++++++++ nomad/metainfo/nx_unit.py | 58 - tests/metainfo/test_attributes.py | 97 +- tests/metainfo/test_full_storage_quantity.py | 105 ++ tests/metainfo/test_quantities.py | 16 +- tests/metainfo/test_yaml_schema.py | 15 +- 8 files changed, 1507 insertions(+), 1175 deletions(-) create mode 100644 nomad/metainfo/metainfo_utility.py delete mode 100644 nomad/metainfo/nx_unit.py create mode 100644 tests/metainfo/test_full_storage_quantity.py diff --git a/nomad/app/optimade/common.py b/nomad/app/optimade/common.py index 64548ea11..76833abe7 100644 --- a/nomad/app/optimade/common.py +++ b/nomad/app/optimade/common.py @@ -23,8 +23,7 @@ from nomad.metainfo.metainfo import ( Reference, Datetime, MEnum, - _types_int, - _types_float + MTypes ) from nomad.metainfo.elasticsearch_extension import SearchQuantity, entry_type @@ -42,9 +41,9 @@ def create_provider_field(name, definition): type = 'boolean' elif definition.type == Datetime: type = 'timestamp' - elif definition.type in _types_float: + elif definition.type in MTypes.float: type = 'float' - elif definition.type in _types_int: + elif definition.type in MTypes.int: type = 'integer' else: raise NotImplementedError( diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index f5abc1387..9532e402c 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -16,111 +16,41 @@ # limitations under the License. # -import hashlib import itertools -from difflib import SequenceMatcher from typing import Type, TypeVar, Union, Tuple, Iterable, List, Any, Dict, Set, \ Callable as TypingCallable, cast, Optional -from dataclasses import dataclass -from collections.abc import Iterable as IterableABC, Sequence +from collections.abc import Iterable as IterableABC import sys import inspect import re import json +import base64 +import importlib + import numpy as np import pandas as pd import pint -import aniso8601 -from datetime import datetime, date -import pytz import docstring_parser import jmespath -import base64 -import importlib -import email.utils -from urllib.parse import urlsplit, urlunsplit, SplitResult +from cachetools import cached, TTLCache from nomad import config from nomad.config import process +from nomad.metainfo.metainfo_utility import Annotation, DefinitionAnnotation, MEnum, MQuantity, MRegEx, \ + MSubSectionList, MTypes, ReferenceURL, SectionAnnotation, _storage_suffix, check_dimensionality, convert_to, \ + default_hash, dict_to_named_list, normalize_datetime, resolve_variadic_name, retrieve_attribute, \ + split_python_definition, to_dict, to_numpy, to_section_def, to_storage_name, validate_shape, validate_url from nomad.units import ureg as units -from cachetools import cached, TTLCache -m_package: 'Package' = None +m_package: Optional['Package'] = None is_bootstrapping = True Elasticsearch = TypeVar('Elasticsearch') MSectionBound = TypeVar('MSectionBound', bound='MSection') SectionDefOrCls = Union['Section', 'SectionProxy', Type['MSection']] T = TypeVar('T') -_hash_method = 'sha1' # choose from hashlib.algorithms_guaranteed -reserved_name_re = re.compile(r'^(m_|a_|_+).*$') - -_primitive_types = { - str: lambda v: None if v is None else str(v), - # TODO it is more complicated than that, because bytes cannot be naturally serialized to JSON - # bytes: lambda v: None if v is None else bytes(v), - int: int, - float: lambda v: None if v is None else float(v), - bool: bool, - np.bool_: bool} - - -_primitive_type_names = { - primitive_type.__name__: primitive_type for primitive_type in _primitive_types} - -_types_int_numpy = {np.int8, np.int16, np.int32, np.int64, np.uint8, np.uint16, np.uint32, np.uint64} -_types_int_python = {int} -_types_int = _types_int_python | _types_int_numpy -_types_float_numpy = {np.float16, np.float32, np.float64} -_types_float_python = {float} -_types_float = _types_float_python | _types_float_numpy -_types_num_numpy = _types_int_numpy | _types_float_numpy -_types_num_python = _types_int_python | _types_float_python -_types_num = _types_num_python | _types_num_numpy -_types_str_numpy = {np.str_} -_types_bool_numpy = {np.bool_} -_types_numpy = _types_num_numpy | _types_str_numpy | _types_bool_numpy - -validElnTypes = { - 'str': ['str'], - 'bool': ['bool'], - 'number': [x.__name__ for x in _types_num_python] + [f'np.{x.__name__}' for x in _types_num_numpy], - 'datetime': ['Datetime'], - 'enum': ['{type_kind: Enum, type_data: [Operator, Responsible_person]}'], - 'user': ['User'], - 'author': ['Author'], - 'reference': [''] -} - -validElnComponents = { - 'str': ['StringEditQuantity', 'FileEditQuantity', 'RichTextEditQuantity', 'EnumEditQuantity'], - 'bool': ['BoolEditQuantity'], - 'number': ['NumberEditQuantity', 'SliderEditQuantity'], - 'datetime': ['DateTimeEditQuantity'], - 'enum': ['EnumEditQuantity', 'AutocompleteEditQuantity', 'RadioEnumEditQuantity'], - 'user': ['UserEditQuantity'], - 'author': ['AuthorEditQuantity'], - 'reference': ['ReferenceEditQuantity'] -} - - -def _default_hash(): - return hashlib.new(_hash_method) - -def _split_python_definition(definition_with_id: str) -> Tuple[list, Union[str, None]]: - ''' - Split a Python type name into names and an optional id. - - Example: - my_package.my_section@my_id ==> (['my_package', 'my_section'], 'my_id') - my_package.my_section ==> (['my_package', 'my_section'], None) - ''' - if '@' not in definition_with_id: - return definition_with_id.split('.'), None - - definition_names, definition_id = definition_with_id.split('@') - return definition_names.split('.'), definition_id +_HASH_OBJ = Type['hashlib._Hash'] # type: ignore def _check_definition_id(target_id, tgt_section: MSectionBound) -> MSectionBound: @@ -132,17 +62,6 @@ def _check_definition_id(target_id, tgt_section: MSectionBound) -> MSectionBound return tgt_section -def to_section_def(section_def: SectionDefOrCls): - ''' - Resolves duck-typing for values that are section definitions or section classes to - section definition. - ''' - if isinstance(section_def, type): - return section_def.m_def # type: ignore - - return section_def - - # Make pylint believe all bootstrap quantities are actual properties even though # we have to initialize them to None due to bootstrapping _placeholder_quantity: 'Quantity' = property() # type: ignore @@ -167,81 +86,6 @@ class MetainfoReferenceError(MetainfoError): pass -# Metainfo quantity data types - -class MEnum(Sequence): - ''' - Allows to define str types with values limited to a pre-set list of possible values. - - The allowed values can be provided as a list of strings, the keys of which will be identical to values. - Alternatively, they can be provided as key-value pairs. - - Example: - some_variable = MEnum(['a', 'b', 'c']) - some_variable = MEnum(a='a', b='b', c='c') - - The values are stored in __dict__ and can be accessed as attributes: - some_variable.a # gives 'a' - - For description of each possible value, it can be organized into a dictionary. - - Example: - some_variable = MEnum(['a', 'b', 'c'], m_descriptions={'a': 'first', 'b': 'second', 'c': 'third'}) - ''' - - def __init__(self, *args, **kwargs): - # Supports one big list in place of args - if len(args) == 1 and isinstance(args[0], list): - args = args[0] - - self._descriptions: Dict[str, str] = {} - if 'm_descriptions' in kwargs: - self._descriptions = kwargs.pop('m_descriptions') - - # If non-named arguments are given, the default is to have them placed - # into a dictionary with their string value as both the enum name and - # the value. - for arg in args: - if arg in kwargs: - raise ValueError(f"Duplicate value '{arg}' provided for enum") - kwargs[arg] = arg - - self._list = list(kwargs.values()) - self._values = set(kwargs.values()) # For allowing constant time member check - - for enum_value in self._values: - if not isinstance(enum_value, str): - raise TypeError(f'MEnum value {enum_value} is not a string.') - - self.__dict__.update(kwargs) - - def set_description(self, value: str, description: str): - if value not in self._values: - raise ValueError(f'{value} is not a value of this MEnum') - self._descriptions[value] = description - - def get_description(self, value: str) -> str: - if value not in self._values: - raise ValueError(f'{value} is not a value of this MEnum') - return self._descriptions.get(value, '') - - def get_all_descriptions(self) -> Dict[str, str]: - return self._descriptions - - def get_all_values(self) -> set: - return self._values - - # no need to implement __getattr__ as all attributes are stored in the __dict__ - # def __getattr__(self, attr): - # pass - - def __getitem__(self, index): - return self._list[index] - - def __len__(self): - return len(self._list) - - class MProxy: ''' A placeholder object that acts as reference to a value that is not yet resolved. @@ -369,7 +213,7 @@ class SectionProxy(MProxy): if '.' in self.m_proxy_value: # Try to interpret as python class name - python_name, definition_id = _split_python_definition(self.m_proxy_value) + python_name, definition_id = split_python_definition(self.m_proxy_value) package_name = '.'.join(python_name[:-1]) section_name = python_name[-1] @@ -391,7 +235,7 @@ class SectionProxy(MProxy): if not self.m_proxy_section or self.m_proxy_resolved: return self.m_proxy_resolved - python_name, definition_id = _split_python_definition(self.m_proxy_value) + python_name, definition_id = split_python_definition(self.m_proxy_value) current = self.m_proxy_section for name in python_name: current = self._resolve_name(name, current) @@ -421,6 +265,7 @@ class DataType: section differently from how users might set/get them, and it allows to have non-serializable values that are transformed on de-/serialization. ''' + def set_normalize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: ''' Transforms the given value before it is set and checks its type. ''' return value @@ -439,8 +284,6 @@ class DataType: class _Dimension(DataType): - range_re = re.compile(r'(\d)\.\.(\d|\*)') - def set_normalize(self, section, quantity_def: 'Quantity', value): if isinstance(value, int): return value @@ -448,7 +291,7 @@ class _Dimension(DataType): if isinstance(value, str): if value.isidentifier(): return value - if re.match(_Dimension.range_re, value): + if re.match(MRegEx.index_range, value): return value if isinstance(value, Section): @@ -463,52 +306,10 @@ class _Dimension(DataType): # that is later evaluated in the parser return value - raise TypeError('%s is not a valid dimension' % str(value)) - - @staticmethod - def check_dimension(section, dimension, length): - if isinstance(dimension, int): - return dimension == length - if isinstance(dimension, str): - if dimension.isidentifier(): - return dimension == getattr(section, dimension) - - m = re.match(_Dimension.range_re, dimension) - start = int(m.group(1)) - end = -1 if m.group(2) == '*' else int(m.group(2)) - return start <= length and (end == -1 or length <= end) + raise TypeError(f'{str(value)} is not a valid dimension') class _Unit(DataType): - @staticmethod - def check_dimensionality(quantity_def, unit: Optional[pint.Unit]) -> None: - if quantity_def is None or unit is None: - return - - # Explicitly providing a Pint delta-unit is not currently allowed. - # Implicit conversions are fine as MathJS on the frontend supports them. - # todo add back - # unit_string = str(unit) - # if 'delta_' in unit_string or 'Δ' in unit_string: - # raise TypeError(f'Explicit Pint "delta"-unit {unit_string} are not yet supported.') - - dimensionality = getattr(quantity_def, 'dimensionality', None) - - if dimensionality is None: # not set, do not validate - return - - if dimensionality in ('dimensionless', '1') and unit.dimensionless: # dimensionless - return - - if dimensionality == 'transformation': - # todo: check transformation dimensionality - return - - if units.Quantity(1 * unit).check(dimensionality): # dimensional - return - - raise TypeError(f'Dimensionality {dimensionality} is not met by unit {unit}') - def set_normalize(self, section, quantity_def: 'Quantity', value): if isinstance(value, str): value = units.parse_units(value) @@ -519,7 +320,7 @@ class _Unit(DataType): elif not isinstance(value, pint.Unit): raise TypeError('Units must be given as str or pint Unit instances.') - _Unit.check_dimensionality(quantity_def, value) + check_dimensionality(quantity_def, value) return value @@ -528,7 +329,7 @@ class _Unit(DataType): def deserialize(self, section, quantity_def: 'Quantity', value): value = units.parse_units(value) - _Unit.check_dimensionality(quantity_def, value) + check_dimensionality(quantity_def, value) return value @@ -554,7 +355,7 @@ class _QuantityType(DataType): ''' def set_normalize(self, section, quantity_def, value): - if value in _primitive_types: + if value in MTypes.primitive: return value if isinstance(value, MEnum): @@ -563,7 +364,7 @@ class _QuantityType(DataType): if isinstance(value, np.dtype): value = value.type # we normalise all np.dtype to basic np.number types - if value in _types_numpy: + if value in MTypes.numpy: return value if isinstance(value, Section): @@ -597,7 +398,7 @@ class _QuantityType(DataType): raise MetainfoError(f'Type {value} of {quantity_def} is not a valid metainfo quantity type') def serialize(self, section, quantity_def, value): - if value in _primitive_types: + if value in MTypes.primitive: return dict(type_kind='python', type_data=value.__name__) if isinstance(value, MEnum): @@ -609,7 +410,7 @@ class _QuantityType(DataType): if isinstance(value, np.dtype): value = value.type # serialise follows the same logic to use basic np.number only - if value in _types_numpy: + if value in MTypes.numpy: return dict(type_kind='numpy', type_data=str(value.__name__)) if isinstance(value, Reference): @@ -649,7 +450,7 @@ class _QuantityType(DataType): type_kind, type_data = value['type_kind'], value.get('type_data') if type_kind == 'python': - return _primitive_type_names[type_data] + return MTypes.primitive_name[type_data] if type_kind == 'Enum': return MEnum(*type_data) if type_kind == 'reference': @@ -672,12 +473,11 @@ class _QuantityType(DataType): return np.dtype(type_data).type except Exception: raise MetainfoError(f'{type_data} is not a valid numpy type.') - if type_kind in ['numpy', 'custom']: - raise NotImplementedError() + raise MetainfoError(f'{type_kind} is not a valid quantity type kind.') - if value in _primitive_type_names: - return _primitive_type_names[value] + if value in MTypes.primitive_name: + return MTypes.primitive_name[value] if isinstance(value, str): if value.startswith('np.') or value.startswith('numpy.'): @@ -699,22 +499,6 @@ class _QuantityType(DataType): return super().deserialize(section, quantity_def, value) -@dataclass -class ReferenceURL: - fragment: str - archive_url: str - url_parts: SplitResult - - def __init__(self, url: str): - if '#' not in url: - url = f'#{url}' - - self.url_parts = urlsplit(url) - archive_url = urlunsplit(self.url_parts[0:4] + ('',)) - self.archive_url = None if archive_url is None else archive_url - self.fragment = self.url_parts.fragment - - class Reference(DataType): ''' Datatype used for quantities that use other sections as values. @@ -736,7 +520,7 @@ class Reference(DataType): sections that inherit from the given section can also be used as values. ''' - def __init__(self, section_def: SectionDefOrCls): + def __init__(self, section_def: Optional[SectionDefOrCls]): self._target_section_def = to_section_def(section_def) @property @@ -824,11 +608,6 @@ class Reference(DataType): # TODO has to deal with URLs, Python qualified names, and Metainfo references class _SectionReference(Reference): - # matches for example - # Python package/module name: nomad.metainfo.section - # Python name + 40 digits id: nomad.metainfo.section@1a2b3c... - value_re = re.compile(r'^\w*(\.\w*)*(@\w{40})?$') - def __init__(self): super().__init__(None) @@ -858,7 +637,7 @@ class _SectionReference(Reference): else: first_segment, remaining_fragment = split_fragment[0], None - resolved: MSection = None + resolved: Optional[MSection] = None for content in definitions.m_contents(): if isinstance(content, Definition) and content.name == first_segment: if remaining_fragment: @@ -873,7 +652,7 @@ class _SectionReference(Reference): return super().resolve_fragment(context_section, fragment_with_id) def set_normalize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: - if isinstance(value, str) and _SectionReference.value_re.match(value): + if isinstance(value, str) and MRegEx.python_definition.match(value): return SectionProxy(value, m_proxy_section=section, m_proxy_type=quantity_def.type) return super().set_normalize(section, quantity_def, value) @@ -897,10 +676,10 @@ class _SectionReference(Reference): def deserialize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: proxy_type = quantity_def.type if quantity_def else SectionReference - if isinstance(value, str) and _SectionReference.value_re.match(value): + if isinstance(value, str) and MRegEx.python_definition.match(value): # First assume it's a python name and try to resolve it. if '.' in value: - python_name, definition_id = _split_python_definition(value) + python_name, definition_id = split_python_definition(value) package_name = '.'.join(python_name[:-1]) section_name = python_name[-1] @@ -945,12 +724,12 @@ class QuantityReference(Reference): return getattr(section, self.target_quantity_def.name) def serialize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: - section_path = super().serialize(section, quantity_def, value) - return f'{section_path}/{self.target_quantity_def.name}' + target_path = super().serialize(section, quantity_def, value) + return f'{target_path}/{self.target_quantity_def.name}' def deserialize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: - section_path = value.rsplit('/', 1)[0] - return MProxy(section_path, m_proxy_section=section, m_proxy_type=quantity_def.type) + target_path = value.rsplit('/', 1)[0] + return MProxy(target_path, m_proxy_section=section, m_proxy_type=quantity_def.type) class _File(DataType): @@ -967,117 +746,25 @@ class _File(DataType): class _URL(DataType): - _url_regex = re.compile( - r'^(?:http|ftp)s?://' - r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' - r'localhost|' - r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' - r'(?::\d+)?' - r'(?:/?|[/?]\S+)$', re.IGNORECASE) - - @staticmethod - def _validate_url(url_str: str) -> Optional[str]: - if url_str is None: - return None - - if not isinstance(url_str, str): - raise TypeError('Links need to be given as URL strings') - if re.match(_URL._url_regex, url_str) is None: - raise ValueError('The given URL is not valid') - - return url_str - def set_normalize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: - return _URL._validate_url(value) + return validate_url(value) def serialize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: - return _URL._validate_url(value) + return validate_url(value) def deserialize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: - return _URL._validate_url(value) + return validate_url(value) class _Datetime(DataType): - @staticmethod - def _parse(datetime_str: str) -> datetime: - # removing trailing spaces and replacing the potential white space between date and time with char 'T' - if datetime_str[0].isdigit(): - datetime_str = datetime_str.strip().replace(' ', 'T') - - try: - return aniso8601.parse_datetime(datetime_str) - except ValueError: - pass - - try: - date = aniso8601.parse_date(datetime_str) - if isinstance(date, datetime): - return date - except ValueError: - pass - - try: - return email.utils.parsedate_to_datetime(datetime_str) - except Exception: - pass - - try: - return datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S.%f') - except ValueError: - pass - - try: - return datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S') - except ValueError: - pass - - try: - return datetime.strptime(datetime_str, '%Y-%m-%d') - except ValueError: - pass - - try: - return datetime.fromisoformat(datetime_str) - except ValueError: - pass - - raise TypeError(f'Invalid date literal {datetime_str}') - - @staticmethod - def _convert(value) -> Optional[datetime]: - if value is None: - return None - - if isinstance(value, str): - value = _Datetime._parse(value) - - elif isinstance(value, (int, float)): - value = datetime.fromtimestamp(value) - - elif isinstance(value, pint.Quantity): - value = datetime.fromtimestamp(value.magnitude) - - elif not isinstance(value, datetime) and isinstance(value, date): - value = datetime.combine(value, datetime.min.time()) - - if not isinstance(value, datetime): - raise TypeError(f'{value} is not a datetime.') - - if value.tzinfo is None: - value = value.replace(tzinfo=pytz.utc) - else: - value = value.astimezone(pytz.utc) - - return value - def set_normalize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: - return self._convert(value) + return normalize_datetime(value) def serialize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: return None if value is None else value.isoformat() def deserialize(self, section: 'MSection', quantity_def: 'Quantity', value: Any) -> Any: - return self._convert(value) + return normalize_datetime(value) class _JSON(DataType): @@ -1119,7 +806,7 @@ class MObjectMeta(type): def __new__(self, cls_name, bases, dct): do_init = dct.get('do_init', None) if do_init is not None: - del(dct['do_init']) + del dct['do_init'] else: do_init = True @@ -1150,18 +837,15 @@ def constraint(warning): f = warning warning = False - def decorator(f): - setattr(f, 'm_constraint', True) - setattr(f, 'm_warning', warning) - return f + def decorator(_f): + setattr(_f, 'm_constraint', True) + setattr(_f, 'm_warning', warning) + return _f - if f is None: - return decorator - else: - return decorator(f) + return decorator if f is None else decorator(f) -class Context(): +class Context: ''' The root of a metainfo section hierarchy can have a Context. Contexts allow to customize the resolution of references based on how and in what context a metainfo-based @@ -1398,10 +1082,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if attr.description is not None: description = inspect.cleandoc(attr.description) description = description.strip() - description = re.sub( - r'\(https?://[^\)]*\)', - lambda m: re.sub(r'\n', '', m.group(0)), - description) + description = re.sub(r'\(https?://[^)]*\)', lambda m: re.sub(r'\n', '', m.group(0)), description) attr.description = description attr.__doc__ = attr.description @@ -1411,6 +1092,9 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas m_def.m_add_sub_section(Section.sub_sections, attr) else: raise NotImplementedError('Unknown property kind.') + elif isinstance(attr, Attribute): + attr.name = name + m_def.m_add_sub_section(Section.attributes, attr) if inspect.isclass(attr): inner_section_def = getattr(attr, 'm_def', None) @@ -1437,8 +1121,10 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas for event_handler in base_section.event_handlers: event_handlers.add(event_handler) - if len(constraints) > 0: m_def.constraints = list(constraints) - if len(event_handlers) > 0: m_def.event_handlers = list(event_handlers) + if len(constraints) > 0: + m_def.constraints = list(sorted(constraints)) + if len(event_handlers) > 0: + m_def.event_handlers = list(sorted(event_handlers)) # add section cls' section to the module's package module_name = cls.__module__ @@ -1479,45 +1165,6 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas for content in m_def.m_all_contents(depth_first=True, include_self=True): cast(Definition, content).__init_metainfo__() - @staticmethod - def __resolve_variable_name( - definitions: Dict[str, 'Definition'], name: str) -> Optional['Definition']: - ''' - For properties with variadic names, it is necessary to check all possible definitions - in the schema to find the unique and correct definition that matches the naming pattern. - - In the schema defines a property with the name 'FOO_bar', implying the prefix 'FOO' is - merely a placeholder, the actual name in the data can be anything, such as 'a_bar' or 'b_bar'. - - This method checks each definition name by replacing the placeholder with '.*' and then check if - the property name matches the pattern. If it does, it returns the corresponding definition. - - For example, the definition name 'FOO_bar' will be replaced by '.*_bar', which further matches - 'a_bar', 'aa_bar', etc. - - In case of multiple quantities with identical template/variadic patterns, the string similarity - is used to determine which to be used. - ''' - candidates: list = [] - for definition in set(definitions.values()): - if not definition.variable: - continue - - name_re = re.sub(r'(^_*)[A-Z_]+(_|$)', r'\1.*\2', definition.name) - if re.match(name_re, name): - candidates.append(definition) - - if len(candidates) == 0: - raise MetainfoError(f'Cannot find a proper definition for name {name}') - - if len(candidates) == 1: - return candidates[0] - - # multiple matches, check similarity - similarity: list = [SequenceMatcher(None, v.name.upper(), name.upper()).ratio() for v in candidates] - - return candidates[similarity.index(max(similarity))] - def __setattr__(self, name, value): if self.m_def is None: return super().__setattr__(name, value) @@ -1526,11 +1173,10 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if alias_pool is not None and name in alias_pool: name = alias_pool[name].name - elif self.m_def.has_variable_names and not reserved_name_re.match(name): - resolved_variable_name = self.__resolve_variable_name(self.m_def.all_properties, name) - if resolved_variable_name: - self.m_set_attribute(resolved_variable_name, 'm_source_name', name) # type: ignore - name = resolved_variable_name.name + elif self.m_def.has_variable_names and not MRegEx.reserved_name.match(name): + resolved_name = resolve_variadic_name(self.m_def.all_properties, name) + if resolved_name: + name = resolved_name.name return super().__setattr__(name, value) @@ -1543,20 +1189,23 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return getattr(self, self.m_def.all_aliases[name].name) if self.m_def.has_variable_names: - resolved_variable_name = self.__resolve_variable_name(self.m_def.all_properties, name) - if resolved_variable_name: - return getattr(self, resolved_variable_name.name) + m_definition: Definition = resolve_variadic_name(self.m_def.all_properties, name) + if m_definition: + if not isinstance(m_definition, Quantity) or not m_definition.use_full_storage: + return getattr(self, m_definition.name) - raise AttributeError(name) + m_storage: dict = self.__dict__.get(to_storage_name(m_definition), None) + if m_storage is None: + return None - def __check_np(self, definition: 'Definition', value: np.ndarray) -> np.ndarray: - # TODO this feels expensive, first check, then possible convert very often? - # if quantity_ref.type != value.dtype: - # raise MetainfoError( - # 'Quantity dtype %s and value dtype %s do not match.' % - # (quantity_ref.type, value.dtype)) + m_quantity = m_storage.get(name, None) + if m_quantity is None: + return None - return value + if m_quantity.value is not None: + return m_quantity.value + + raise AttributeError(name) def __normalize_value(self, value_type, definition: 'Definition', value: Any) -> Any: if isinstance(value_type, DataType): @@ -1579,22 +1228,25 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if value_type == int and type(value) == np.float_: return int(value) - if value_type in _primitive_types and type(value) != value_type: - try: - return _primitive_types[value_type](value) # type: ignore - except ValueError as e: - raise TypeError(e) + if type(value) != value_type: + if value_type in MTypes.primitive: + try: + return MTypes.primitive[value_type](value) # type: ignore + except ValueError as e: + raise TypeError(e) - if value is not None and type(value) != value_type: - raise TypeError(f'The value {value} with for {definition} is not of type {value_type}.') + if value is not None: + raise TypeError(f'The value {value} for {definition} is not of type {value_type}.') return value def __set_normalize(self, quantity_def: 'Quantity', value: Any) -> Any: - if isinstance(quantity_def.type, DataType): - return quantity_def.type.set_normalize(self, quantity_def, value) + target_type = quantity_def.type + + if isinstance(target_type, DataType): + return target_type.set_normalize(self, quantity_def, value) - if isinstance(quantity_def.type, Section): + if isinstance(target_type, Section): if isinstance(value, MProxy): return value @@ -1602,124 +1254,128 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas raise TypeError( f'The value {value} for reference quantity {quantity_def} is not a section instance.') - if not value.m_follows(quantity_def.type): + if not value.m_follows(target_type): raise TypeError( - f'The value {value} for quantity {quantity_def} does not follow {quantity_def.type}') + f'The value {value} for quantity {quantity_def} does not follow {target_type}') return value - return self.__normalize_value(quantity_def.type, quantity_def, value) - - def __to_np(self, np_type, shape, unit, definition: 'Definition', value): - _Unit.check_dimensionality(definition, unit) - - if isinstance(value, pint.Quantity): - if unit is None: - raise MetainfoError(f'The quantity {definition} does not have a unit, but value {value} does.') - - if type(value.magnitude) == np.ndarray and np_type != value.dtype: - value = value.astype(np_type) - - value = value.to(unit).magnitude - - if isinstance(value, pd.DataFrame): - try: - value = value.to_numpy() - except AttributeError: - raise AttributeError( - f'Could not convert value {value} of type pandas.Dataframe to a numpy array') - - if type(value) != np.ndarray: - if len(shape) > 0: - try: - value = np.asarray(value) - except TypeError: - raise TypeError(f'Could not convert value {value} of {definition} to a numpy array') - elif type(value) != np_type: - try: - value = np_type(value) - except TypeError: - raise TypeError(f'Could not convert value {value} of {definition} to a numpy scalar') - - return self.__check_np(definition, value) + return self.__normalize_value(target_type, quantity_def, value) - def m_set(self, quantity_def: 'Quantity', value: Any, add_new: bool = False) -> None: + def m_set(self, quantity_def: 'Quantity', value: Any) -> None: ''' Set the given value for the given quantity. ''' self.m_mod_count += 1 if quantity_def.derived is not None: raise MetainfoError(f'The quantity {quantity_def} is derived and cannot be set.') + # full storage suffix + full_name: str = to_storage_name(quantity_def) + if value is None: # This implements the implicit "unset" semantics of assigned None as a value - self.__dict__.pop(quantity_def.name, None) + to_remove = self.__dict__.pop(full_name, None) + # if full storage is used, also need to clear quantities created for convenient access + if quantity_def.use_full_storage and to_remove: + # self.__dict__[full_name] is guaranteed to be a 'dict[str, MQuantity]' + for key in to_remove.keys(): + self.__dict__.pop(key, None) return - if quantity_def.type in _types_numpy or isinstance(quantity_def.type, pd.DataFrame): - value = self.__to_np( - quantity_def.type, - quantity_def.shape, - quantity_def.unit, - quantity_def, - value) + if not quantity_def.use_full_storage: + # handles the non-repeating and no attribute case, store the value directly under the name + if quantity_def.type in MTypes.numpy or isinstance(quantity_def.type, pd.DataFrame): + value = to_numpy(quantity_def.type, quantity_def.shape, quantity_def.unit, quantity_def, value) + else: + dimensions = len(quantity_def.shape) + if dimensions == 0: + value = self.__set_normalize(quantity_def, value) + + elif dimensions == 1: + if type(value) == str or not isinstance(value, IterableABC): + raise TypeError( + f'The shape of {quantity_def} requires an iterable value, but {value} is not iterable.') + + value = list(self.__set_normalize(quantity_def, item) for item in value) + + else: + raise MetainfoError( + f'Only numpy arrays and dtypes can be used for higher dimensional quantities: {quantity_def}') + + self.__dict__[full_name] = value else: - dimensions = len(quantity_def.shape) - if dimensions == 0: - value = self.__set_normalize(quantity_def, value) + # it is a repeating quantity w/o attributes + # the actual value/name/unit would be wrapped into 'MQuantity' + # check if there is an existing item + m_quantity: MQuantity + m_attribute: dict = {} + if isinstance(value, MQuantity): + m_quantity = value + if not quantity_def.variable: + if not m_quantity.name: + m_quantity.name = quantity_def.name + elif m_quantity.name != quantity_def.name: + raise MetainfoError(f"The name of {value} must match definition name {quantity_def.name}") + else: + if not m_quantity.name: + raise MetainfoError(f"The name must be provided for variadic quantity {quantity_def.name}") - elif dimensions == 1: - if type(value) == str or not isinstance(value, IterableABC): - raise TypeError( - f'The shape of {quantity_def} requires an iterable value, but {value} is not iterable.') - - value = list(self.__set_normalize(quantity_def, item) for item in value) - - def __check_shape(shape): - if not isinstance(shape, str) or shape == '*': - return - - bound_match = re.match(r"(\d+)\.\.(\d+|\*)", shape) - if bound_match: - low_bound = bound_match.group(1) - upper_bound = bound_match.group(2) - if len(value) < int(low_bound): - raise MetainfoError(f'At least {low_bound} elements required.') - if upper_bound != '*' and len(value) >= int(upper_bound): - raise MetainfoError(f'At most {upper_bound} elements required.') + # swap to add attributes via the setter to allow validation + m_attribute = m_quantity.attributes + m_quantity.attributes = {} + elif not quantity_def.variable: + try: + m_quantity = self.__dict__[full_name][quantity_def.name] + if isinstance(value, pint.Quantity): + m_quantity.value = value.m + m_quantity.unit = value.u else: - try: - bound = int(shape) - if len(value) != bound: - raise MetainfoError(f'Exact {bound} elements required.') - except ValueError: - pass - # todo: need further work as some tests do not follow the shape rule - # __check_shape(quantity_def.shape[0]) + m_quantity.value = value + except KeyError: + m_quantity = MQuantity(quantity_def.name, value) else: - raise MetainfoError( - f'Only numpy arrays and dtypes can be used for higher dimensional quantities: {quantity_def}') + raise MetainfoError("Variadic quantities only accept raw values wrapped in 'MQuantity'") - # account for variable name - if add_new: - self.m_def.quantities.append(quantity_def) - quantity_def.init_metainfo() + if not validate_shape(self, quantity_def, m_quantity.value): + raise MetainfoError(f"The shape of {m_quantity} does not match {quantity_def.shape}") - self.__dict__[quantity_def.name] = value + # todo validate values + if quantity_def.unit is None: + # no prescribed unit, need to check dimensionality, no need to convert + check_dimensionality(quantity_def, m_quantity.unit) + else: + try: + m_quantity.value = convert_to(m_quantity.value, m_quantity.unit, quantity_def.unit) + except (ValueError, TypeError): + raise MetainfoError(f'Could not convert {m_quantity.unit} to {quantity_def.unit}') + m_quantity.unit = quantity_def.unit + + # store under variable name with suffix + if full_name in self.__dict__: + self.__dict__[full_name][m_quantity.name] = m_quantity + else: + self.__dict__[full_name] = {m_quantity.name: m_quantity} + + for k, v in m_attribute.items(): + self.m_set_quantity_attribute(m_quantity.name, k, v) for handler in self.m_def.event_handlers: if handler.__name__.startswith('on_set'): handler(self, quantity_def, value) - def m_get(self, quantity_def: 'Quantity') -> Any: + def m_get(self, quantity_def: 'Quantity', full: bool = False) -> Any: ''' Retrieve the given value for the given quantity. ''' - return quantity_def.__get__(self, Quantity) + if not full: + return quantity_def.__get__(self, Quantity) + + return self.__dict__[to_storage_name(quantity_def)] def m_is_set(self, quantity_def: 'Quantity') -> bool: ''' True if the given quantity is set. ''' if quantity_def.derived is not None: return True - return quantity_def.name in self.__dict__ + return quantity_def.name in self.__dict__ or to_storage_name(quantity_def) in self.__dict__ def m_add_values(self, quantity_def: 'Quantity', values: Any, offset: int) -> None: ''' Add (partial) values for the given quantity of higher dimensionality. ''' @@ -1756,16 +1412,13 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas sub_section_name = sub_section_def.name if sub_section_def.repeats: - sub_section_lst = self._get_sub_sections(sub_section_def) - if index == -1: - sub_section_lst.append(sub_section) - else: + if index != -1: raise NotImplementedError('You can only append subsections.') + sub_section_lst = self._get_sub_sections(sub_section_def) + sub_section_lst.append(sub_section) if sub_section_lst.__class__ != MSubSectionList: - self._on_add_sub_section( - sub_section_def, sub_section, len(sub_section_lst) - 1) - + self._on_add_sub_section(sub_section_def, sub_section, len(sub_section_lst) - 1) else: old_sub_section = self.__dict__.get(sub_section_name, None) self.__dict__[sub_section_name] = sub_section @@ -1778,107 +1431,154 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas ''' Removes the exiting section for a non-repeatable subsection ''' self.m_mod_count += 1 + if sub_section_def.name not in self.__dict__: + return + if sub_section_def.repeats: sub_section = self.__dict__[sub_section_def.name][index] - del(self.__dict__[sub_section_def.name][index]) - - elif sub_section_def.name in self.__dict__: + del self.__dict__[sub_section_def.name][index] + else: sub_section = self.__dict__[sub_section_def.name] - del(self.__dict__[sub_section_def.name]) - self._on_remove_sub_section(sub_section_def, sub_section) + del self.__dict__[sub_section_def.name] - def m_get_sub_section(self, sub_section_def: 'SubSection', index: Any) -> 'MSection': - ''' Retrieves a single subsection of the given subsection definition. ''' - if sub_section_def.repeats: - if isinstance(index, int): - return self.__dict__[sub_section_def.name][index] - elif isinstance(index, str): - try: - sub_sections: List['MSection'] = [section for section in self.__dict__[sub_section_def.name] if index == section.name] - if len(sub_sections) > 1: - raise MetainfoReferenceError( - f'multiple sections with this section id were found.') - if len(sub_sections) == 1: - return sub_sections[0] - except KeyError: - raise MetainfoReferenceError( - f'{index} is not a valid subsection.') - return None + self._on_remove_sub_section(sub_section_def, sub_section) - else: + def m_get_sub_section(self, sub_section_def: 'SubSection', index: Any) -> Optional['MSection']: + ''' Retrieves a single subsection of the given subsection definition. ''' + if not sub_section_def.repeats: return self.__dict__.get(sub_section_def.name, None) + if isinstance(index, int): + return self.__dict__[sub_section_def.name][index] + + if isinstance(index, str): + try: + sub_sections: List['MSection'] = [ + section for section in self.__dict__[sub_section_def.name] if index == section.name] + if len(sub_sections) > 1: + raise MetainfoReferenceError(f'multiple sections with this section id were found.') + if len(sub_sections) == 1: + return sub_sections[0] + except KeyError: + raise MetainfoReferenceError(f'{index} is not a valid subsection.') + + return None + def m_get_sub_sections(self, sub_section_def: 'SubSection') -> List['MSection']: ''' Retrieves all subsections of the given subsection definition. ''' if sub_section_def.repeats: return self._get_sub_sections(sub_section_def) - else: - try: - return [self.__dict__[sub_section_def.name]] - except KeyError: - return [] + + try: + return [self.__dict__[sub_section_def.name]] + except KeyError: + return [] def m_sub_section_count(self, sub_section_def: 'SubSection') -> int: ''' Returns the number of subsections for the given subsection definition. ''' try: value = self.__dict__[sub_section_def.name] - if sub_section_def.repeats: - return len(value) - else: - return 1 + return len(value) if sub_section_def.repeats else 1 except KeyError: return 0 - def _get_attribute(self, property: Union[str, 'Property'], attr_name: str) -> 'Attribute': - property_as_property = None - - if isinstance(property, str): - property_as_property = self.m_def.all_properties.get(property) - if not property_as_property: - property_as_property = self.__resolve_variable_name( - self.m_def.all_properties, property) - elif isinstance(property, Property): - property_as_property = self.m_def.all_properties.get(property.name) - - if property_as_property is None: - raise ValueError('The given property is not a property.') - - attribute = property_as_property.all_attributes.get(attr_name) - if attribute is None: - attribute = self.__resolve_variable_name(property_as_property.all_attributes, attr_name) - if attribute is None: - raise ValueError( - 'The given attribute name must be a name for an attribute of the given property.') - - return attribute - - def m_set_attribute(self, tgt_property: Union[str, 'Property'], attr_name: str, attr_value: Any): - attribute = self._get_attribute(tgt_property, attr_name) - key = attribute.section_key - if attribute.type in _types_numpy: - attr_value = self.__to_np(attribute.type, [], None, attribute, attr_value) - attr_value = self.__normalize_value(attribute.type, attribute, attr_value) + def m_set_section_attribute(self, name: str, value: Any) -> None: + ''' + Set attribute for the current section. + ''' + self.__set_attribute(None, name, value) + + def m_set_quantity_attribute(self, quantity_def: Union[str, 'Quantity'], name: str, value: Any) -> None: + ''' + Set attribute for the given quantity. + ''' + self.__set_attribute(quantity_def, name, value) + + def __set_attribute(self, tgt_property: Union[Optional[str], 'Definition'], attr_name: str, attr_value: Any): + ''' + Set attribute for current section for a quantity of the current section. + + For attributes of the current section, use None as the target property. + For attributes of a quantity, use the quantity name/definition as the target property. + + Both the quantity name and the attribute name can be variadic. + + Arguments: + tgt_property: The name or definition of the quantity to set the attribute for, can be None. + attr_name: The name of the attribute to set. + attr_value: The value of the attribute to set. + ''' + tgt_name: Optional[str] = tgt_property.name if isinstance(tgt_property, Definition) else tgt_property + + tgt_def, tgt_attr = retrieve_attribute(self.m_def, tgt_name, attr_name) + + if tgt_attr.type in MTypes.numpy: + attr_value = to_numpy(tgt_attr.type, [], None, tgt_attr, attr_value) + attr_value = self.__normalize_value(tgt_attr.type, tgt_attr, attr_value) else: - dimension = len(attribute.shape) + dimension = len(tgt_attr.shape) if dimension == 0: - attr_value = self.__normalize_value(attribute.type, attribute, attr_value) + attr_value = self.__normalize_value(tgt_attr.type, tgt_attr, attr_value) elif dimension == 1: if type(attr_value) == str or not isinstance(attr_value, IterableABC): - raise TypeError( - f'The shape requires an iterable value, but {attr_value} is not iterable.') - - attr_value = list(self.__normalize_value(attribute.type, attribute, item) for item in attr_value) + raise TypeError(f'The shape requires an iterable value, but {attr_value} is not.') + attr_value = list(self.__normalize_value(tgt_attr.type, tgt_attr, item) for item in attr_value) else: - raise MetainfoError( - f'Only numpy arrays and dtypes can be used for higher dimensional quantities: {attribute}') + raise MetainfoError(f'Only numpy arrays can be used for higher dimensional quantities: {tgt_attr}.') + + if not validate_shape(self, tgt_attr, attr_value): + raise MetainfoError(f'Invalid shape for attribute: {tgt_attr}.') + + if isinstance(tgt_def, Quantity) and tgt_def.use_full_storage: + m_storage: Optional[dict] = self.__dict__.get(to_storage_name(tgt_def), None) + m_quantity: Optional[MQuantity] = m_storage.get(tgt_property, None) if m_storage else None + if m_quantity is None: + m_quantity = MQuantity(tgt_name, None) + self.m_set(tgt_def, m_quantity) + m_quantity.m_set_attribute(attr_name, attr_value) + elif tgt_property is None: + # indicating that the attribute is for the current section + if 'm_attributes' not in self.__dict__: + self.__dict__['m_attributes'] = {} + self.__dict__['m_attributes'][attr_name] = attr_value + + def m_get_section_attribute(self, name: str) -> Any: + ''' + Get attribute for the current section. + ''' + return self.__get_attribute(None, name) + + def m_get_quantity_attribute(self, quantity_def: str, name: str) -> Any: + ''' + Get attribute for the given quantity. + ''' + return self.__get_attribute(quantity_def, name) + + def __get_attribute(self, tgt_property: Optional[str], attr_name: str): + ''' + Get the attribute of a quantity of the current section, or of the current section itself. + ''' + tgt_def: Definition = tgt_property if tgt_property is None else retrieve_attribute( + self.m_def, tgt_property, attr_name)[0] + + # section attributes + if tgt_def is None: + if 'm_attributes' not in self.__dict__: + return None - self.__dict__[key] = attr_value + return self.__dict__['m_attributes'].get(attr_name, None) - def m_get_attribute(self, tgt_property: Union[str, 'Property'], attr_name: str): - attribute = self._get_attribute(tgt_property, attr_name) - key = attribute.section_key - return self.__dict__.get(key) + # quantity attributes + m_storage: Optional[dict] = self.__dict__.get(to_storage_name(tgt_def), None) + if m_storage is None: + return None + + m_quantity: Optional[MQuantity] = m_storage.get(tgt_property, None) + if m_quantity is None: + return None + + return m_quantity.attributes.get(attr_name, None) def m_create( self, section_cls: Type[MSectionBound], sub_section_def: 'SubSection' = None, @@ -2032,7 +1732,6 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return False kwargs['exclude'] = exclude - else: category_defs: List[Category] = [] for category in categories: @@ -2041,25 +1740,25 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas elif isinstance(category, Category): category_defs.append(category) else: - raise TypeError('%s is not a category' % category) + raise TypeError(f'{category} is not a category') def exclude(prop, section): # pylint: disable=function-redefined - return not any( - prop in category.get_all_definitions() - for category in category_defs) + return not any(prop in v.get_all_definitions() for v in category_defs) - def serialize_quantity(quantity, is_set, is_derived, path): + def serialize_quantity(quantity, is_set, is_derived, path, target_value=None): quantity_type = quantity.type - serialize: TypingCallable[[Any], Any] = str if resolve_references and isinstance(quantity_type, QuantityReference): quantity_type = quantity_type.target_quantity_def.type - is_ref = False + serialize: TypingCallable[[Any], Any] + + # define serialization functions for all valid data types + is_reference = False if isinstance(quantity_type, Reference): - is_ref = True + is_reference = True - def reference_serialize(value, path_override): + def serialize_reference(value, path_override): if resolve_references: assert not isinstance(quantity_type, QuantityReference) value = value.m_resolved() @@ -2068,41 +1767,34 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas ref_kwargs["transform"] = lambda q, s, v, p: kwargs["transform"](q, s, v, path_override) return value.m_to_dict(**ref_kwargs) - elif isinstance(value, MProxy): + if isinstance(value, MProxy): if value.m_proxy_resolved is not None: return quantity_type.serialize(self, quantity, value) - else: - return quantity_type.serialize_proxy_value(value) + + return quantity_type.serialize_proxy_value(value) return quantity_type.serialize(self, quantity, value) - serialize = reference_serialize + serialize = serialize_reference elif isinstance(quantity_type, DataType): - def data_type_serialize(value): + def serialize_data_type(value): return quantity_type.serialize(self, quantity, value) - serialize = data_type_serialize - - elif quantity_type in _primitive_types: - serialize = _primitive_types[quantity_type] + serialize = serialize_data_type - elif quantity_type in _types_numpy: - is_scalar = quantity.is_scalar + elif quantity_type in MTypes.primitive: - def serialize_dtype(value): - if isinstance(value, np.ndarray): - if is_scalar: - self.m_warning('numpy quantity has wrong shape', quantity=str(quantity)) + serialize = MTypes.primitive[quantity_type] - return value.tolist() + elif quantity_type in MTypes.numpy: - else: - if not is_scalar: - self.m_warning('numpy quantity has wrong shape', quantity=str(quantity)) + def serialize_dtype(value): + if not (isinstance(value, np.ndarray) ^ quantity.is_scalar): + self.m_warning('numpy quantity has wrong shape', quantity=str(quantity)) - return value.item() + return value.tolist() if isinstance(value, np.ndarray) else value.item() serialize = serialize_dtype @@ -2113,16 +1805,15 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas serialize = serialize_enum elif quantity_type == Any: - def _serialize(value: Any): + def serialize_any(value: Any): if type(value) not in [str, int, float, bool, np.bool_, list, dict, type(None)]: raise MetainfoError( - 'Only python primitives are allowed for Any typed non ' - 'virtual quantities: %s of quantity %s in section %s' % - (value, quantity, self)) + f'Only python primitives are allowed for Any typed non-virtual ' + f'quantities: {value} of quantity {quantity} in section {self}') return value - serialize = _serialize + serialize = serialize_any else: raise MetainfoError( @@ -2132,59 +1823,61 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if resolve_references and isinstance(quantity_type, QuantityReference): serialize_before_reference_resolution = serialize - def serialize_reference(value: Any): + def serialize_reference_v2(value: Any): value = getattr(value.m_resolved(), quantity_type.target_quantity_def.name) return serialize_before_reference_resolution(value) - serialize = serialize_reference + serialize = serialize_reference_v2 - if is_set: - value = self.__dict__[quantity.name] - elif is_derived: - try: - value = quantity.derived(self) - except Exception: - value = quantity.default - else: - value = quantity.default + # get the value to be serialized + # explicitly assigning the target value overrides the value from the section + if target_value is None: + if is_set: + target_value = self.__dict__[quantity.name] + elif is_derived: + try: + target_value = quantity.derived(self) + except Exception: + target_value = quantity.default + else: + target_value = quantity.default if transform is not None: serialize_before_transform = serialize def serialize_and_transform(value: Any, path_override=None): - if not is_ref: + if not is_reference: return transform(quantity, self, serialize_before_transform(value), path_override) return transform(quantity, self, serialize_before_transform(value, path_override), path_override) serialize = serialize_and_transform - if quantity_type in _types_numpy: - return serialize(value) + # serialization starts here + if quantity_type in MTypes.numpy: + return serialize(target_value) - elif len(quantity.shape) == 0: - if is_ref: - return serialize(value, path) - else: - return serialize(value) - elif len(quantity.shape) == 1: - if is_ref: - return [serialize(item, f"{path}/{index}") for index, item in enumerate(value)] - else: - return [serialize(item) for item in value] - else: - raise NotImplementedError(f'Higher shapes ({quantity.shape}) not supported: {quantity}') + if len(quantity.shape) == 0: + return serialize(target_value, path) if is_reference else serialize(target_value) + + if len(quantity.shape) == 1: + if not is_reference: + return [serialize(item) for item in target_value] + + return [serialize(item, f"{path}/{index}") for index, item in enumerate(target_value)] + + raise NotImplementedError(f'Higher shapes ({quantity.shape}) not supported: {quantity}') def serialize_attribute(attribute: 'Attribute', value: Any) -> Any: if isinstance(attribute.type, DataType): return attribute.type.serialize(self, None, value) - if attribute.type in _primitive_types: + if attribute.type in MTypes.primitive: if len(attribute.shape) == 0: - return _primitive_types[attribute.type](value) # type: ignore + return MTypes.primitive[attribute.type](value) # type: ignore - return [_primitive_types[attribute.type](v) for v in value] # type: ignore + return [MTypes.primitive[attribute.type](v) for v in value] # type: ignore if isinstance(attribute.type, MEnum): return str(value) @@ -2194,6 +1887,27 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return value + def collect_attributes(attr_map: dict, all_attr: dict): + result: dict = {} + for attr_key, attr_value in attr_map.items(): + attr_def = resolve_variadic_name(all_attr, attr_key) + result[attr_key] = serialize_attribute(attr_def, attr_value) + return result + + def serialize_full_quantity(quantity_def: 'Quantity', values: Dict[str, MQuantity]): + result: dict = {} + for m_quantity in values.values(): + m_result: dict = {'m_value': serialize_quantity(quantity_def, True, False, None, m_quantity.value)} + if m_quantity.unit: + m_result['m_unit'] = str(m_quantity.unit) + if m_quantity.attributes: + a_result: dict = collect_attributes(m_quantity.attributes, quantity_def.all_attributes) + if a_result: + m_result['m_attributes'] = a_result + result[m_quantity.name] = m_result + + return result + def serialize_annotation(annotation): if isinstance(annotation, Annotation): return annotation.m_to_dict() @@ -2277,16 +1991,18 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if not include_defaults or not quantity.m_is_set(Quantity.default): continue - yield name, serialize_quantity(quantity, is_set, False, path) - - for attribute in quantity.all_attributes.values(): - key = attribute.section_key - if key in self.__dict__: - yield key, serialize_attribute(attribute, self.__dict__[key]) + if not quantity.use_full_storage: + yield name, serialize_quantity(quantity, is_set, False, path) + else: + yield name, serialize_full_quantity(quantity, self.__dict__[to_storage_name(quantity)]) except ValueError as e: raise ValueError(f'Value error ({str(e)}) for {quantity}') + # section attributes + if 'm_attributes' in self.__dict__: + yield 'm_attributes', collect_attributes(self.__dict__['m_attributes'], self.m_def.all_attributes) + # subsections for name, sub_section_def in self.m_def.all_sub_sections.items(): if exclude(sub_section_def, self): @@ -2305,14 +2021,37 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas is_set = True yield name, sub_section.m_to_dict(**kwargs) - if is_set: - for attribute in sub_section_def.all_attributes.values(): - key = attribute.section_key - if key in self.__dict__: - yield key, serialize_attribute(attribute, self.__dict__[key]) + # attributes are disabled for subsections + # if is_set: + # yield from collect_attributes(sub_section_def.all_attributes) return {key: value for key, value in items()} + @staticmethod + def __deserialize(section: 'MSection', quantity_def: 'Quantity', quantity_value: Any): + tgt_type = quantity_def.type + + if tgt_type in MTypes.numpy: + if not isinstance(quantity_value, list): + return tgt_type(quantity_value) + + return np.asarray(quantity_value).astype(tgt_type) + + if isinstance(tgt_type, DataType): + def __type_specific_deserialize(v): + return tgt_type.deserialize(section, quantity_def, v) + + dimensions = len(quantity_def.shape) + + if dimensions == 0: + return __type_specific_deserialize(quantity_value) + if dimensions == 1: + return list(__type_specific_deserialize(item) for item in quantity_value) + + raise MetainfoError('Only numpy quantities can have more than 1 dimension.') + + return quantity_value + def m_update_from_dict(self, dct: Dict[str, Any]) -> None: ''' Updates this section with the serialized data from the given dict, e.g. data @@ -2347,28 +2086,25 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas quantity_def = property_def quantity_value = dct[name] - if quantity_def.type in _types_numpy: - quantity_value = np.asarray(quantity_value) - - if isinstance(quantity_def.type, DataType): - dimensions = len(quantity_def.shape) - if dimensions == 0: - quantity_value = quantity_def.type.deserialize( - section, quantity_def, quantity_value) - elif dimensions == 1: - quantity_value = list( - quantity_def.type.deserialize(section, quantity_def, item) - for item in quantity_value) - else: - raise MetainfoError( - 'Only numpy quantities can have more than 1 dimension.') + if quantity_def.use_full_storage: + if not isinstance(quantity_value, dict): + raise MetainfoError('Full storage quantity must be a dict') + + for each_name, each_quantity in quantity_value.items(): + m_value = self.__deserialize(section, quantity_def, each_quantity['m_value']) + m_quantity = MQuantity(each_name, m_value) + if 'm_unit' in each_quantity: + m_quantity.unit = units.parse_units(each_quantity['m_unit']) + if 'm_attributes' in each_quantity: + m_quantity.attributes = each_quantity['m_attributes'] - section.__dict__[property_def.name] = quantity_value # type: ignore + section.m_set(quantity_def, m_quantity) + else: + section.__dict__[property_def.name] = self.__deserialize(section, quantity_def, quantity_value) - for attribute in property_def.all_attributes.values(): - key = attribute.section_key - if key in dct: - section.m_set_attribute(property_def, attribute.name, dct[key]) + if 'm_attributes' in dct: + for attr_key, attr_value in dct['m_attributes'].items(): + section.m_set_section_attribute(attr_key, attr_value) @classmethod def m_from_dict(cls: Type[MSectionBound], data: Dict[str, Any], **kwargs) -> MSectionBound: @@ -2382,11 +2118,11 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas @staticmethod def from_dict( - dct: Dict[str, Any], - cls: Type[MSectionBound] = None, - m_parent: 'MSection' = None, - m_context: 'Context' = None, - **kwargs + dct: Dict[str, Any], + cls: Type[MSectionBound] = None, + m_parent: 'MSection' = None, + m_context: 'Context' = None, + **kwargs ) -> MSectionBound: ''' Creates a section from the given serializable data dictionary. @@ -2431,11 +2167,11 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas section = cls(**kwargs) if 'm_annotations' in dct: - if isinstance(dct['m_annotations'], dict): - section.m_annotations.update(dct['m_annotations']) - else: + m_annotations = dct['m_annotations'] + if not isinstance(m_annotations, dict): raise MetainfoError( - f'The provided m_annotations is of a wrong type. {type(dct["m_annotations"]).__name__} was provided.') + f'The provided m_annotations is of a wrong type. {type(m_annotations).__name__} was provided.') + section.m_annotations.update(m_annotations) section.m_update_from_dict(dct) return section @@ -2622,8 +2358,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas elif isinstance(prop_def, Quantity): if len(path_stack) > 0: - raise MetainfoReferenceError( - f'Could not resolve {path}, no property {prop_name}') + raise MetainfoReferenceError(f'Could not resolve {path}, no property {prop_name}') if not section.m_is_set(prop_def): raise MetainfoReferenceError( @@ -2673,28 +2408,6 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas raise TypeError('Key must be str or annotation class.') - def __validate_shape(self, quantity_def: 'Quantity', value): - if quantity_def == Quantity.default: - return True - - quantity_shape = quantity_def.shape - - if type(value) == np.ndarray: - value_shape = value.shape - elif isinstance(value, list) and not isinstance(value, MEnum): - value_shape = [len(value)] - else: - value_shape = [] - - if len(value_shape) != len(quantity_shape): - return False - - for i in range(0, len(value_shape)): - if not _Dimension.check_dimension(self, quantity_shape[i], value_shape[i]): - return False - - return True - def m_validate(self) -> Tuple[List[str], List[str]]: ''' Evaluates all constraints and shapes of this section and returns a list of errors. ''' errors: List[str] = [] @@ -2717,10 +2430,9 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas errors.append(error_str) for quantity in self.m_def.all_quantities.values(): - if self.m_is_set(quantity) and not quantity.derived: - if not self.__validate_shape(quantity, self.m_get(quantity)): - errors.append( - f'The shape of quantity {quantity} does not match its value.') + if self.m_is_set(quantity) and not quantity.derived and quantity != Quantity.default: + if not validate_shape(self, quantity, self.m_get(quantity)): + errors.append(f'The shape of quantity {quantity} does not match its value.') return errors, warnings @@ -2781,20 +2493,17 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas # name = self.m_get(name_quantity_def) try: name = self.__dict__['name'] - main = '%s:%s' % (name, m_section_name) + main = f'{name}:{m_section_name}' except KeyError: main = m_section_name more = '' - props = [ - prop - for prop in self.m_def.all_properties - if prop in self.__dict__] + props = [prop for prop in self.m_def.all_properties if prop in self.__dict__] if len(props) > 10: - more = ', +%d more properties' % (len(props) - 10) + more = f', +{len(props) - 10:d} more properties' - return '%s(%s%s)' % (main, ', '.join(props[0:10]), more) + return f'{main}({", ".join(props[0:10])}{more})' def __getitem__(self, key): try: @@ -2832,80 +2541,11 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas metainfo_section.m_xpath('sccs[?energy_total < `1.0E-23`].system') ''' - def to_dict(entries): - if not isinstance(entries, list): - try: - entries = entries.m_to_dict() - except Exception: - pass - return entries - else: - return [to_dict(entry) for entry in entries] - - result = jmespath.search(expression, self) - return to_dict(result) - - -# TODO implement and test the NotImplementErrors -class MSubSectionList(list): - def __init__(self, section: 'MSection', sub_section_def: 'SubSection'): - self.section = section - self.sub_section_def = sub_section_def - super().__init__() - - def __setitem__(self, key, value): - raise NotImplementedError('You can only append subsections.') - - def __delitem__(self, key): - old_value = self[key] - list.__delitem__(self, key) - for index in range(key, len(self)): - self[index].m_parent_index = index - - self.section._on_remove_sub_section(self.sub_section_def, old_value) - - def __setslice__(self, i, j, sequence): - raise NotImplementedError('You can only append subsections.') - - def __delslice__(self, i, j): - raise NotImplementedError('You can only append subsections.') - - def append(self, value): - list.append(self, value) - if value is not None: - self.section._on_add_sub_section(self.sub_section_def, value, len(self) - 1) - - def pop(self): - raise NotImplementedError('You can only append subsections.') - - def extend(self, newvalue): - start_index = len(self) - list.extend(self, newvalue) - for index, value in enumerate(newvalue): - self.section._on_add_sub_section( - self.sub_section_def, value, start_index + index) - def insert(self, i, element): - raise NotImplementedError('You can only append subsections.') - - def remove(self, element): - raise NotImplementedError('You can only append subsections.') - - def reverse(self): - raise NotImplementedError('You can only append subsections.') - - def sort(self, cmpfunc=None): - raise NotImplementedError('You can only append subsections.') - - def clear(self): - old_values = list(self) - list.clear(self) - for old_value in old_values: - self.section._on_remove_sub_section(self.sub_section_def, old_value) + return to_dict(jmespath.search(expression, self)) class MCategory(metaclass=MObjectMeta): - m_def: 'Category' = None @classmethod @@ -2993,6 +2633,14 @@ class Definition(MSection): more: A dictionary that contains additional definition properties that are not part of the metainfo. Those can be passed as additional kwargs to definition constructors. The values must be JSON serializable. + + attributes: + The attributes that can further qualify property values. + + all_attributes: + A virtual convenient property that provides all attributes as a dictionary + from attribute name to attribute. This includes meta attributes (starting with m_) + that are defined for all properties of the same kind (sub_section or quantity). ''' name: 'Quantity' = _placeholder_quantity @@ -3004,8 +2652,12 @@ class Definition(MSection): variable: 'Quantity' = _placeholder_quantity more: 'Quantity' = _placeholder_quantity + attributes: 'SubSection' = None # type: ignore + + all_attributes: 'Quantity' = _placeholder_quantity + # store the hash object generated - _cached_hash: 'hashlib._Hash' = None # type: ignore + _cached_hash: _HASH_OBJ = None # type: ignore def __init__(self, *args, **kwargs): if is_bootstrapping: @@ -3023,7 +2675,9 @@ class Definition(MSection): more[key] = value super().__init__(*args, **new_kwargs) - self.more = more + self.more = more # type: ignore + + self._cached_hash = None # type: ignore def __init_metainfo__(self): ''' @@ -3095,14 +2749,19 @@ class Definition(MSection): return seed - def _hash(self, regenerate=False) -> 'hashlib._Hash': + def _hash(self, regenerate=False) -> _HASH_OBJ: ''' Generates a hash object based on the unique representation of the definition. ''' if self._cached_hash is None or regenerate: - self._cached_hash = _default_hash() + self._cached_hash = default_hash() self._cached_hash.update(self._hash_seed().encode('utf-8')) + if self.attributes: + for item in self.attributes: # pylint: disable=not-an-iterable + if id(self) != id(item): + self._cached_hash.update(item._hash(regenerate).digest()) + return self._cached_hash @property @@ -3129,19 +2788,14 @@ class Attribute(Definition): shape: 'Quantity' = _placeholder_quantity def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - @property - def section_key(self): - return f'{cast(Property, self.m_parent).name}@{self.name}' + super(Attribute, self).__init__(*args, **kwargs) @constraint(warning=False) - def type_is_primitive(self): - value = self.type - if value in _primitive_types or value in _types_num: + def is_primitive(self): + if self.type in MTypes.primitive or self.type in MTypes.num: return - if isinstance(value, (MEnum, np.dtype, _Datetime)): + if isinstance(self.type, (MEnum, np.dtype, _Datetime)): return assert False, 'Attributes must have primitive type.' @@ -3153,32 +2807,16 @@ class Attribute(Definition): type_id['type_data'].sort() seed += json.dumps(type_id) for dim in self.shape: - seed += dim if isinstance(dim, str) else str(dim) + seed += str(dim) return seed class Property(Definition): ''' A common base-class for section properties: subsections and quantities. - - Attributes: - attributes: - The attributes that can further qualify property values. - all_attributes: - A virtual convenient property that provides all attributes as a dictionary - from attribute name to attribute. This includes meta attributes (starting with m_) - that are defined for all properties of the same kind (sub_section or quantity). - An example for a meta attribute is the quantity attribute `m_source_unit`, - which can be set on all quantities without defining it on each quantity - separately. ''' - m_attributes: List['Attribute'] = [] - - all_attributes: 'Quantity' = _placeholder_quantity - attributes: 'SubSection' = None - - def get_from_dict(self, data: Dict[str, Any], default_value: Any = None) -> Tuple[str, Any]: + def get_from_dict(self, data: Dict[str, Any], default_value: Any = None) -> Tuple[Optional[str], Any]: ''' Attempts to read the property from a dict. Returns the used alias and value as tuple. @@ -3188,7 +2826,7 @@ class Property(Definition): return name, data[name] return None, default_value - def get_base_property(self) -> 'Property': + def get_base_property(self) -> Optional['Property']: ''' Retrieve a potential overwritten property from a base-class. ''' @@ -3203,15 +2841,6 @@ class Property(Definition): return None - def _hash_seed(self) -> str: - seed = super(Property, self)._hash_seed() - - if self.attributes: - for item in self.attributes: # pylint: disable=not-an-iterable - seed += item._hash_seed() - - return seed - class Quantity(Property): ''' @@ -3332,7 +2961,10 @@ class Quantity(Property): derived: 'Quantity' = _placeholder_quantity cached: 'Quantity' = _placeholder_quantity virtual: 'Quantity' = _placeholder_quantity + is_scalar: 'Quantity' = _placeholder_quantity + repeats: 'Quantity' = _placeholder_quantity + use_full_storage: 'Quantity' = _placeholder_quantity # TODO derived_from = Quantity(type=Quantity, shape=['0..*']) def __init__(self, *args, **kwargs): @@ -3342,14 +2974,14 @@ class Quantity(Property): super().__init_metainfo__() if self.derived is not None: - self.virtual = True + self.virtual = True # type: ignore # replace the quantity implementation with an optimized version for the most # primitive quantities if applicable - is_primitive = not self.derived + is_primitive = not self.derived and not self.use_full_storage is_primitive = is_primitive and len(self.shape) <= 1 is_primitive = is_primitive and self.type in [str, bool, float, int] - is_primitive = is_primitive and self.type not in _types_num_numpy + is_primitive = is_primitive and self.type not in MTypes.num_numpy if is_primitive: self._default = self.default self._name = self.name @@ -3357,12 +2989,14 @@ class Quantity(Property): self._list = len(self.shape) == 1 self.__class__ = PrimitiveQuantity - _Unit.check_dimensionality(self, self.unit) + check_dimensionality(self, self.unit) def __get__(self, obj, cls): try: - value = obj.__dict__[self.name] - + try: + value = obj.__dict__[self.name] + except KeyError: + value = obj.__dict__[f'{self.name}{_storage_suffix}'][self.name].value except KeyError: if self.derived is not None: try: @@ -3372,10 +3006,10 @@ class Quantity(Property): cached[0] = obj.m_mod_count cached[1] = self.derived(obj) # pylint: disable=not-callable return cached[1] - else: - return self.derived(obj) # pylint: disable=not-callable + + return self.derived(obj) # pylint: disable=not-callable except Exception as e: - raise DeriveError('Could not derive value for %s: %s' % (self, str(e))) + raise DeriveError(f'Could not derive value for {self}: {str(e)}') value = self.default @@ -3398,8 +3032,8 @@ class Quantity(Property): raise MetainfoError( 'Only numpy arrays and dtypes can be used for higher dimensional quantities.') - if self.unit is not None and self.type in _types_num: - value = value * self.unit + if self.unit is not None and self.type in MTypes.num: + return value * self.unit return value @@ -3447,7 +3081,7 @@ class Quantity(Property): @constraint(warning=True) def higher_shapes_require_dtype(self): if len(self.shape) > 1: - assert self.type in _types_numpy, \ + assert self.type in MTypes.numpy, \ f'Higher dimensional quantities ({self}) need a dtype and will be treated as numpy arrays.' def _hash_seed(self) -> str: @@ -3531,6 +3165,7 @@ class DirectQuantity(Quantity): class PrimitiveQuantity(Quantity): ''' An optimized replacement for Quantity suitable for primitive properties. ''' + def __get__(self, obj, cls): try: value = obj.__dict__[self._name] @@ -3538,8 +3173,8 @@ class PrimitiveQuantity(Quantity): value = self._default except AttributeError: return self - if value is not None and self.unit is not None and self.type in _types_num: - value = value * self.unit + if value is not None and self.unit is not None and self.type in MTypes.num: + return value * self.unit # type: ignore return value def __set__(self, obj, value): @@ -3552,16 +3187,13 @@ class PrimitiveQuantity(Quantity): # Handle pint quantities. Conversion is done automatically between # units. Notice that currently converting from float to int or vice # versa is not allowed for primitive types. - if isinstance(value, pint.quantity._Quantity): + if isinstance(value, pint.Quantity): if self.unit is None: - raise TypeError( - f'The quantity {self} does not have a unit, but value {value} has.' - ) - if self.type in _types_int: + raise TypeError(f'The quantity {self} does not have a unit, but value {value} has.') + if self.type in MTypes.int: raise TypeError( f'Cannot save data with unit conversion into the quantity {self} ' - 'with integer data type due to possible precision loss.' - ) + 'with integer data type due to possible precision loss.') value = value.to(self.unit).magnitude if self._list: @@ -3569,8 +3201,7 @@ class PrimitiveQuantity(Quantity): if hasattr(value, 'tolist'): value = value.tolist() else: - raise TypeError( - f'The value {value} for quantity {self} has not shape {self.shape}') + raise TypeError(f'The value {value} for quantity {self} has not shape {self.shape}') if any(v is not None and type(v) != self._type for v in value): raise TypeError( @@ -3658,14 +3289,13 @@ class SubSection(Property): except MetainfoReferenceError as e: assert False, f'Cannot resolve "sub_section": {str(e)}' - def _hash(self, regenerate=False) -> 'hashlib._Hash': + def _hash(self, regenerate=False) -> _HASH_OBJ: if self._cached_hash is not None and not regenerate: return self._cached_hash - base_id = f'{super(SubSection, self)._hash_seed()}{"T" if self.repeats else "F"}' + self._cached_hash = super(SubSection, self)._hash(regenerate) - self._cached_hash = _default_hash() - self._cached_hash.update(base_id.encode('utf-8')) + self._cached_hash.update(('T' if self.repeats else 'F').encode('utf-8')) for item in itertools.chain( self.sub_section.quantities, @@ -3882,7 +3512,7 @@ class Section(Definition): path: 'Quantity' = _placeholder_quantity def __init__(self, *args, validate: bool = True, **kwargs): - self._section_cls: Type[MSection] = None + self._section_cls: Type[MSection] = None # type: ignore super().__init__(*args, **kwargs) self.validate = validate @@ -3901,9 +3531,7 @@ class Section(Definition): # Create a section class if this does not exist. This happens if the section # is not created through a class definition. - attrs = { - prop.name: prop - for prop in self.quantities + self.sub_sections} + attrs = {prop.name: prop for prop in itertools.chain(self.quantities, self.sub_sections)} for name, inner_section_def in self.all_inner_section_definitions.items(): attrs[name] = inner_section_def.section_cls @@ -3925,11 +3553,11 @@ class Section(Definition): base_sections_count = len(self.base_sections) if base_sections_count == 0: raise MetainfoError( - 'Section %s extend the base section, but has no base section.' % self) + f'Section {self} extend the base section, but has no base section.') if base_sections_count > 1: raise MetainfoError( - 'Section %s extend the base section, but has more than one base section' % self) + f'Section {self} extend the base section, but has more than one base section.') base_section = self.base_sections[0] for name, attr in self.section_cls.__dict__.items(): @@ -3949,7 +3577,7 @@ class Section(Definition): for base_section in self.all_base_sections: inherited_properties.update(**base_section.all_properties) - for property in self.quantities + self.sub_sections: + for property in itertools.chain(self.quantities, self.sub_sections): inherited_property = inherited_properties.get(property.name) if inherited_property is None: continue @@ -3962,93 +3590,72 @@ class Section(Definition): def unique_names(self): names: Set[str] = set() for base in self.extending_sections: - for quantity in base.quantities + base.sub_sections: + for quantity in itertools.chain(base.quantities, base.sub_sections): for alias in quantity.aliases: names.add(alias) names.add(quantity.name) - for def_list in [self.quantities, self.sub_sections]: - for definition in def_list: - assert definition.name not in names, \ - f'All names in a section must be unique. ' \ - f'Name {definition.name} of {definition} in {definition.m_parent} already exists in {self}.' - names.add(definition.name) - for alias in definition.aliases: - assert alias not in names, \ - f'All names (incl. aliases) in a section must be unique. ' \ - f'Alias {alias} of {definition} in {definition.m_parent} already exists in {self}.' - names.add(alias) + for definition in itertools.chain(self.quantities, self.sub_sections): + assert definition.name not in names, \ + f'All names in a section must be unique. ' \ + f'Name {definition.name} of {definition} in {definition.m_parent} already exists in {self}.' + names.add(definition.name) + for alias in definition.aliases: + assert alias not in names, \ + f'All names (incl. aliases) in a section must be unique. ' \ + f'Alias {alias} of {definition} in {definition.m_parent} already exists in {self}.' + names.add(alias) @constraint def compatible_eln_annotation(self): def assert_component(component_name, quantity_name, quantity_type, accepted_components): assert component_name in accepted_components, \ - 'The component `%s` is not compatible with the quantity `%s` of the type `%s`. Accepted components: %s.' \ - % (component_name, quantity_name, quantity_type, ', '.join(accepted_components)) - - for def_list in [self.quantities, self.sub_sections]: - for definition in def_list: - if definition.m_annotations and 'eln' in definition.m_annotations \ - and definition.m_annotations['eln'] and 'component' in definition.m_annotations['eln']: - component = definition.m_annotations['eln']['component'] - if component: - if isinstance(definition.type, type): - if definition.type.__name__ == 'str': - assert_component( - component, definition.name, definition.type.__name__, - validElnComponents['str'] - ) - elif definition.type.__name__ == 'bool': - assert_component( - component, definition.name, definition.type.__name__, validElnComponents['bool'] - ) - elif definition.type in _types_num_python: - assert_component( - component, definition.name, definition.type.__name__, - validElnComponents['number'] - ) - elif definition.type in _types_num_numpy: - assert_component( - component, definition.name, f'np.{definition.type.__name__}', - validElnComponents['number'] - ) - elif definition.type.__name__ == 'User': - assert_component( - component, definition.name, definition.type.__name__, - validElnComponents['user'] - ) - elif definition.type.__name__ == 'Author': - assert_component( - component, definition.name, definition.type.__name__, - validElnComponents['author'] - ) - elif isinstance(definition.type, _Datetime): - assert_component( - component, definition.name, type(definition.type).__name__, - validElnComponents['datetime'] - ) - elif isinstance(definition.type, MEnum): - assert_component( - component, definition.name, type(definition.type).__name__, - validElnComponents['enum'] - ) - elif isinstance(definition.type, Reference): - target_class = definition.type.target_section_def.section_cls - if target_class.__name__ == 'User': - assert_component( - component, definition.name, target_class.__name__, - validElnComponents['user'] - ) - elif target_class.__name__ == 'Author': - assert_component( - component, definition.name, target_class.__name__, - validElnComponents['author'] - ) - else: - assert_component( - component, definition.name, type(definition.type).__name__, - validElnComponents['reference'] - ) + f'The component `{component_name}` is not compatible with the quantity `{quantity_name}` ' \ + f'of the type `{quantity_type}`. Accepted components: {", ".join(accepted_components)}.' + + for definition in itertools.chain(self.quantities, self.sub_sections): + if not definition.m_annotations or 'eln' not in definition.m_annotations or not \ + definition.m_annotations['eln'] or 'component' not in definition.m_annotations['eln']: + continue + component = definition.m_annotations['eln']['component'] + if not component: + continue + if isinstance(definition.type, type): + if definition.type.__name__ == 'str': + assert_component( + component, definition.name, definition.type.__name__, MTypes.eln_component['str']) + elif definition.type.__name__ == 'bool': + assert_component( + component, definition.name, definition.type.__name__, MTypes.eln_component['bool']) + elif definition.type in MTypes.num_python: + assert_component( + component, definition.name, definition.type.__name__, MTypes.eln_component['number']) + elif definition.type in MTypes.num_numpy: + assert_component( + component, definition.name, f'np.{definition.type.__name__}', MTypes.eln_component['number']) + elif definition.type.__name__ == 'User': + assert_component( + component, definition.name, definition.type.__name__, MTypes.eln_component['user']) + elif definition.type.__name__ == 'Author': + assert_component( + component, definition.name, definition.type.__name__, MTypes.eln_component['author']) + elif isinstance(definition.type, _Datetime): + assert_component( + component, definition.name, type(definition.type).__name__, MTypes.eln_component['datetime']) + elif isinstance(definition.type, MEnum): + assert_component( + component, definition.name, type(definition.type).__name__, MTypes.eln_component['enum']) + elif isinstance(definition.type, Reference): + target_class = definition.type.target_section_def.section_cls + if target_class.__name__ == 'User': + assert_component( + component, definition.name, target_class.__name__, MTypes.eln_component['user']) + elif target_class.__name__ == 'Author': + assert_component( + component, definition.name, target_class.__name__, MTypes.eln_component['author']) + else: + assert_component( + component, definition.name, type(definition.type).__name__, MTypes.eln_component['reference']) @constraint def resolved_base_sections(self): @@ -4088,7 +3695,7 @@ class Section(Definition): return super(Section, cls).m_from_dict(data, **kwargs) - def _hash(self, regenerate=False) -> 'hashlib._Hash': + def _hash(self, regenerate=False) -> _HASH_OBJ: if self._cached_hash is not None and not regenerate: return self._cached_hash @@ -4106,19 +3713,6 @@ class Section(Definition): return self._cached_hash -def dict_to_named_list(data): - if not isinstance(data, dict): - return data - - results = [] - for key, value in data.items(): - if value is None: - value = {} - value.update(dict(name=key)) - results.append(value) - return results - - class Package(Definition): ''' Packages organize metainfo definitions alongside Python modules @@ -4239,7 +3833,7 @@ class Package(Definition): if archive.metadata.entry_name is None and self.name and self.name != '*': archive.metadata.entry_name = self.name - def _hash(self, regenerate=False) -> 'hashlib._Hash': + def _hash(self, regenerate=False) -> _HASH_OBJ: if self._cached_hash is not None and not regenerate: return self._cached_hash @@ -4290,37 +3884,6 @@ class Category(Definition): return definitions -class Annotation: - ''' Base class for annotations. ''' - - def m_to_dict(self): - ''' - Returns a JSON serializable representation that is used for exporting the - annotation to JSON. - ''' - return str(self.__class__.__name__) - - -class DefinitionAnnotation(Annotation): - ''' Base class for annotations for definitions. ''' - - def __init__(self): - self.definition: Definition = None - - def init_annotation(self, definition: Definition): - self.definition = definition - - -class SectionAnnotation(DefinitionAnnotation): - ''' - Special annotation class for section definition that allows to auto add annotations - to section instances. - ''' - - def new(self, section) -> Dict[str, Any]: - return {} - - Section.m_def = Section(name='Section') Section.m_def.m_def = Section.m_def Section.m_def._section_cls = Section @@ -4333,6 +3896,9 @@ SubSection.m_def = Section(name='SubSection') Category.m_def = Section(name='Category') Package.m_def = Section(name='Package') +Attribute.type = DirectQuantity(type=QuantityType, name='type') +Attribute.shape = DirectQuantity(type=Dimension, shape=['0..*'], name='shape', default=[]) + Definition.name = DirectQuantity(type=str, name='name') Definition.description = Quantity(type=str, name='description') Definition.links = Quantity(type=str, shape=['0..*'], name='links') @@ -4342,6 +3908,19 @@ Definition.deprecated = Quantity(type=str, name='deprecated') Definition.aliases = Quantity(type=str, shape=['0..*'], default=[], name='aliases') Definition.variable = Quantity(type=bool, name='variable', default=False) Definition.more = Quantity(type=JSON, name='more', default={}) +Definition.attributes = SubSection(sub_section=Attribute.m_def, name='attributes', repeats=True) + + +@derived(cached=True, virtual=True) # Virtual has to be set manually, due to bootstrapping hen-egg problems +def all_attributes(self: Property) -> Dict[str, Attribute]: + result: Dict[str, Attribute] = {} + for definition in self.attributes: + result[definition.name] = definition + + return result + + +Definition.all_attributes = all_attributes Section.quantities = SubSection( sub_section=Quantity.m_def, name='quantities', repeats=True) @@ -4406,7 +3985,7 @@ def all_inheriting_sections(self) -> List[Section]: def all_properties(self) -> Dict[str, Union[SubSection, Quantity]]: result: Dict[str, Union[SubSection, Quantity]] = dict() for section in self.inherited_sections: - for definition in section.quantities + section.sub_sections: + for definition in itertools.chain(section.quantities, section.sub_sections): result[definition.name] = definition return result @@ -4443,7 +4022,7 @@ def all_sub_sections_by_section(self) -> Dict[Section, List[SubSection]]: def all_aliases(self) -> Dict[str, Union[SubSection, Quantity]]: result: Dict[str, Union[SubSection, Quantity]] = dict() for section in self.inherited_sections: - for definition in section.quantities + section.sub_sections: + for definition in itertools.chain(section.quantities, section.sub_sections): for alias in definition.aliases: result[alias] = definition result[definition.name] = definition @@ -4466,20 +4045,14 @@ def all_inner_section_definitions(self) -> Dict[str, Section]: @derived(cached=True) def has_variable_names(self) -> bool: - for property in self.all_properties.values(): - if property.variable: - return True - return False + return any(value.variable for value in self.all_properties.values()) @derived(cached=True) def section_path(self) -> str: used_in_sub_sections: List[SubSection] = SubSection._used_sections.get(self, []) # type: ignore if len(used_in_sub_sections) == 0: - if self.name == 'EntryArchive': - return None - else: - return '__no_archive_path__' + return None if self.name == 'EntryArchive' else '__no_archive_path__' if len(used_in_sub_sections) > 1: return '__ambiguous__' @@ -4508,28 +4081,6 @@ Section.all_inner_section_definitions = all_inner_section_definitions Section.has_variable_names = has_variable_names Section.path = section_path -Attribute.type = DirectQuantity(type=QuantityType, name='type') -Attribute.shape = DirectQuantity(type=Dimension, shape=['0..*'], name='shape', default=[]) - - -@derived(cached=True, virtual=True) # Virtual has to be set manually, due to bootstrapping hen-egg problems -def all_attributes(self: Property) -> Dict[str, Attribute]: - result: Dict[str, Attribute] = {} - for definition in self.attributes: - result[definition.name] = definition - - for section_def in self.m_def.all_base_sections + [self.m_def]: - m_attributes = getattr(section_def.section_cls, 'm_attributes', []) - for m_attribute in m_attributes: - m_attribute = m_attribute.m_copy(parent=self) - result[m_attribute.name] = m_attribute - return result - - -Property.attributes = SubSection( - sub_section=Attribute.m_def, name='attributes', repeats=True) -Property.all_attributes = all_attributes - SubSection.repeats = Quantity(type=bool, name='repeats', default=False) SubSection.sub_section = Quantity( @@ -4546,6 +4097,10 @@ Quantity.derived = DirectQuantity(type=Callable, default=None, name='derived', v Quantity.virtual = DirectQuantity(type=bool, default=False, name='virtual') Quantity.is_scalar = Quantity( type=bool, name='is_scalar', derived=lambda quantity: len(quantity.shape) == 0) +Quantity.use_full_storage = Quantity( + type=bool, name='use_full_storage', + derived=lambda quantity: quantity.repeats or quantity.variable or len(quantity.attributes) > 0) +Quantity.repeats = Quantity(type=bool, name='repeats', default=False) Quantity.cached = Quantity(type=bool, name='cached', default=False) Package.section_definitions = SubSection( @@ -4559,13 +4114,13 @@ Package.category_definitions = SubSection( @derived(cached=True) def all_definitions(self): - all_definitions: Dict[str, Definition] = dict() + result: Dict[str, Definition] = dict() for sub_section_def in [Package.section_definitions, Package.category_definitions]: for definition in self.m_get_sub_sections(sub_section_def): - all_definitions[definition.name] = definition + result[definition.name] = definition for alias in definition.aliases: - all_definitions[alias] = definition - return all_definitions + result[alias] = definition + return result @derived(cached=True) @@ -4574,7 +4129,7 @@ def dependencies(self): All packages which have definitions that definitions from this package need. Being 'needed' includes categories, base sections, and referenced definitions. ''' - dependencies: Set[Package] = set() + result = set() for content in self.m_all_contents(): to_add = None if isinstance(content, Definition): @@ -4597,19 +4152,16 @@ def dependencies(self): more_dependencies.append(to_add) while len(more_dependencies) > 0: dependency = more_dependencies.pop() - if dependency not in dependencies: - dependencies.add(dependency) + if dependency not in result: + result.add(dependency) more_dependencies.extend(dependency.dependencies) - return dependencies + return result Package.all_definitions = all_definitions Package.dependencies = dependencies -Property.m_attributes.append(Attribute(name='m_source_name', type=str)) -Quantity.m_attributes.append(Attribute(name='m_source_unit', type=Unit)) - is_bootstrapping = False Definition.__init_cls__() @@ -4668,10 +4220,11 @@ class Environment(MSection): defs = self.resolve_definitions(name, section_cls, filter=filter) if len(defs) == 1: return defs[0] - elif len(defs) > 1: - raise KeyError('Could not uniquely identify %s, candidates are %s' % (name, defs)) - else: - raise KeyError('Could not resolve %s' % name) + + if len(defs) > 1: + raise KeyError(f'Could not uniquely identify {name}, candidates are {defs}') + + raise KeyError(f'Could not resolve {name}') class Author(MSection): diff --git a/nomad/metainfo/metainfo_utility.py b/nomad/metainfo/metainfo_utility.py new file mode 100644 index 000000000..b84d75460 --- /dev/null +++ b/nomad/metainfo/metainfo_utility.py @@ -0,0 +1,721 @@ +# +# Copyright The NOMAD Authors. +# +# This file is part of NOMAD. See https://nomad-lab.eu for further info. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import email.utils +import hashlib +import re +from dataclasses import dataclass +from datetime import datetime, date +from difflib import SequenceMatcher +from typing import Sequence, Dict, Any, Optional, Union, Tuple +from urllib.parse import SplitResult, urlsplit, urlunsplit + +import aniso8601 +import numpy as np +import pandas as pd +import pint +import pytz + +from nomad.units import ureg + +__hash_method = 'sha1' # choose from hashlib.algorithms_guaranteed + +_storage_suffix = '_full' + + +@dataclass +class MRegEx: + # matches the range of indices, e.g., 1..3, 0..* + index_range = re.compile(r'(\d)\.\.(\d|\*)') + # matches the reserved name + reserved_name = re.compile(r'^(m_|a_|_+).*$') + # matches for example + # Python package/module name: nomad.metainfo.section + # Python name + 40 digits id: nomad.metainfo.section@1a2b3c... + python_definition = re.compile(r'^\w*(\.\w*)*(@\w{40})?$') + # matches url + url = re.compile( + r'^(?:http|ftp)s?://' + r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' + r'localhost|' + r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' + r'(?::\d+)?' + r'(?:/?|[/?]\S+)$', re.IGNORECASE) + + +@dataclass +class MTypes: + # todo: account for bytes which cannot be naturally serialized to JSON + primitive = { + str: lambda v: None if v is None else str(v), + int: lambda v: None if v is None else int(v), + float: lambda v: None if v is None else float(v), + bool: lambda v: None if v is None else bool(v), + np.bool_: lambda v: None if v is None else bool(v)} + + primitive_name = {v.__name__: v for v in primitive} + + int_numpy = {np.int8, np.int16, np.int32, np.int64, np.uint8, np.uint16, np.uint32, np.uint64} + int_python = {int} + int = int_python | int_numpy + float_numpy = {np.float16, np.float32, np.float64} + float_python = {float} + float = float_python | float_numpy + num_numpy = int_numpy | float_numpy + num_python = int_python | float_python + num = num_python | num_numpy + str_numpy = {np.str_} + bool_numpy = {np.bool_} + numpy = num_numpy | str_numpy | bool_numpy + + eln = { + 'str': ['str'], + 'bool': ['bool'], + 'number': [x.__name__ for x in num_python] + [f'np.{x.__name__}' for x in num_numpy], + 'datetime': ['Datetime'], + 'enum': ['{type_kind: Enum, type_data: [Operator, Responsible_person]}'], + 'user': ['User'], + 'author': ['Author'], + 'reference': [''] + } + + eln_component = { + 'str': ['StringEditQuantity', 'FileEditQuantity', 'RichTextEditQuantity', 'EnumEditQuantity'], + 'bool': ['BoolEditQuantity'], + 'number': ['NumberEditQuantity', 'SliderEditQuantity'], + 'datetime': ['DateTimeEditQuantity'], + 'enum': ['EnumEditQuantity', 'AutocompleteEditQuantity', 'RadioEnumEditQuantity'], + 'user': ['UserEditQuantity'], + 'author': ['AuthorEditQuantity'], + 'reference': ['ReferenceEditQuantity'] + } + + +class MEnum(Sequence): + ''' + Allows to define string types with values limited to a pre-set list of possible values. + + The allowed values can be provided as a list of strings, the keys of which will be identical to values. + Alternatively, they can be provided as key-value pairs. + + For example: + some_variable = MEnum(['a', 'b', 'c']) + some_variable = MEnum(a='a', b='b', c='c') + + The values are stored in __dict__ and can be accessed as attributes: + some_variable.a # gives 'a' + + For description of each possible value, it can be organized into a dictionary. + + For example: + some_variable = MEnum(['a', 'b', 'c'], m_descriptions={'a': 'first', 'b': 'second', 'c': 'third'}) + ''' + + def __init__(self, *args, **kwargs): + # Supports one big list in place of args + if len(args) == 1 and isinstance(args[0], list): + args = args[0] + + self._descriptions: Dict[str, str] = {} + if 'm_descriptions' in kwargs: + self._descriptions = kwargs.pop('m_descriptions') + + # If non-named arguments are given, the default is to have them placed + # into a dictionary with their string value as both the enum name and + # the value. + for arg in args: + if arg in kwargs: + raise ValueError(f"Duplicate value '{arg}' provided for enum") + kwargs[arg] = arg + + self._list = list(kwargs.values()) + self._values = set(kwargs.values()) # For allowing constant time member check + + for enum_value in self._values: + if not isinstance(enum_value, str): + raise TypeError(f'MEnum value {enum_value} is not a string.') + + self.__dict__.update(kwargs) + + def set_description(self, value: str, description: str): + if value not in self._values: + raise ValueError(f'{value} is not a value of this MEnum') + self._descriptions[value] = description + + def get_description(self, value: str) -> str: + if value not in self._values: + raise ValueError(f'{value} is not a value of this MEnum') + return self._descriptions.get(value, '') + + def get_all_descriptions(self) -> Dict[str, str]: + return self._descriptions + + def get_all_values(self) -> set: + return self._values + + # no need to implement __getattr__ as all attributes are stored in the __dict__ + # def __getattr__(self, attr): + # pass + + def __getitem__(self, index): + return self._list[index] + + def __len__(self): + return len(self._list) + + +class MQuantity: + ''' + A simple wrapper to represent complex quantities that may have multiple values, + additional attributes, and more. + ''' + name: str = None + value: Any = None + unit: Optional[pint.Unit] = None + attributes: dict = None + + def __init__( + self, + in_name: Optional[str], + in_value: Any, + in_unit: Optional[pint.Unit] = None, + in_attributes: Optional[dict] = None): + ''' + The validation of value/unit/attribute is performed at 'MSection' level. + ''' + self.name = in_name + if self.name: + assert isinstance(self.name, str), 'Name must be a string' + + self.unit = None + if isinstance(in_value, pint.Quantity): + self.value = in_value.m # magnitude + self.unit = in_value.u # unit + assert in_unit is None, f'Unit is already defined in the value {in_value}' + else: + # the input argument is not a pint quantity + # the unit is set to None + self.value = in_value + if isinstance(in_unit, pint.Unit): + self.unit = in_unit + elif isinstance(in_unit, str): + self.unit = ureg.parse_units(in_unit) + + self.attributes: dict = {} + if in_attributes is not None: + self.attributes.update(**in_attributes) + self.__dict__.update(**in_attributes) + + @staticmethod + def wrap(in_value: Any, in_name: Optional[str] = None): + ''' + Syntax sugar to wrap a value into a MQuantity. The name is optional. + + This would be useful for non-variadic primitive quantities with additional attributes. + ''' + return MQuantity(in_name, in_value) + + def __repr__(self): + return self.name if self.name else 'Unnamed quantity' + + def m_set_attribute(self, name, value): + ''' + Validation is done outside this container + ''' + self.attributes[name] = value + + +class MSubSectionList(list): + def __init__(self, section, sub_section_def): + self.section = section + self.sub_section_def = sub_section_def + super().__init__() + + def __setitem__(self, key, value): + raise NotImplementedError('You can only append subsections.') + + def __delitem__(self, key): + old_value = self[key] + list.__delitem__(self, key) + for index in range(key, len(self)): + self[index].m_parent_index = index + + # noinspection PyProtectedMember + self.section._on_remove_sub_section(self.sub_section_def, old_value) + + def __setslice__(self, i, j, sequence): + raise NotImplementedError('You can only append subsections.') + + def __delslice__(self, i, j): + raise NotImplementedError('You can only append subsections.') + + def append(self, value): + list.append(self, value) + if value is not None: + # noinspection PyProtectedMember + self.section._on_add_sub_section(self.sub_section_def, value, len(self) - 1) + + def pop(self, index=...): + raise NotImplementedError('You can only append subsections.') + + def extend(self, new_value): + start_index = len(self) + list.extend(self, new_value) + for index, value in enumerate(new_value): + # noinspection PyProtectedMember + self.section._on_add_sub_section(self.sub_section_def, value, start_index + index) + + def insert(self, i, element): + raise NotImplementedError('You can only append subsections.') + + def remove(self, element): + raise NotImplementedError('You can only append subsections.') + + def reverse(self): + raise NotImplementedError('You can only append subsections.') + + def sort(self, *, key=..., reverse=...): + raise NotImplementedError('You can only append subsections.') + + def clear(self): + old_values = list(self) + list.clear(self) + for old_value in old_values: + # noinspection PyProtectedMember + self.section._on_remove_sub_section(self.sub_section_def, old_value) + + +@dataclass +class ReferenceURL: + fragment: str + archive_url: str + url_parts: SplitResult + + def __init__(self, url: str): + if '#' not in url: + url = f'#{url}' + + self.url_parts = urlsplit(url) + archive_url = urlunsplit(self.url_parts[0:4] + ('',)) + self.archive_url = None if archive_url is None else archive_url + self.fragment = self.url_parts.fragment + + +class Annotation: + ''' Base class for annotations. ''' + + def m_to_dict(self): + ''' + Returns a JSON serializable representation that is used for exporting the + annotation to JSON. + ''' + return str(self.__class__.__name__) + + +class DefinitionAnnotation(Annotation): + ''' Base class for annotations for definitions. ''' + + def __init__(self): + self.definition = None + + def init_annotation(self, definition): + self.definition = definition + + +class SectionAnnotation(DefinitionAnnotation): + ''' + Special annotation class for section definition that allows to auto add annotations + to section instances. + ''' + + def new(self, section) -> Dict[str, Any]: + return {} + + +def to_dict(entries): + if isinstance(entries, list): + return [to_dict(entry) for entry in entries] + + # noinspection PyBroadException + try: + entries = entries.m_to_dict() + except Exception: + pass + + return entries + + +def to_storage_name(quantity) -> str: + ''' + Returns the name used for storage. + + If the quantity requires full storage due to, for example, being repeating, the value and + other metadata will be wrapped into a 'MQuantity' and stored in a map under the full name. + + If the quantity does not require full storage, the value will be stored directly under the + original name. + + If the quantity is an attribute, the full name will be the corresponding section key. + + This function checks and returns the proper name to be used to access the storage. + + Arguments: + quantity: the quantity definition 'Quantity' to be checked + ''' + + if quantity.use_full_storage: + return f'{quantity.name}{_storage_suffix}' + + return quantity.name + + +def convert_to(from_magnitude, from_unit: Optional[ureg.Unit], to_unit: Optional[ureg.Unit]): + ''' + Convert a magnitude from one unit to another. + + Arguments: + from_magnitude: the magnitude to be converted + from_unit: the unit of the magnitude + to_unit: the unit to convert to + + Return: + the converted magnitude + ''' + + if to_unit is None: + return from_magnitude + + from_quantity: ureg.Quantity = from_magnitude * from_unit + + return from_quantity.to(to_unit).m + + +def resolve_variadic_name(definitions: dict, name: str): + ''' + For properties with variadic names, it is necessary to check all possible definitions + in the schema to find the unique and correct definition that matches the naming pattern. + + In the schema defines a property with the name 'FOO_bar', implying the prefix 'FOO' is + merely a placeholder, the actual name in the data can be anything, such as 'a_bar' or 'b_bar'. + + This method checks each definition name by replacing the placeholder with '.*' and then check if + the property name matches the pattern. If it does, it returns the corresponding definition. + + For example, the definition name 'FOO_bar' will be replaced by '.*_bar', which further matches + 'a_bar', 'aa_bar', etc. + + In case of multiple quantities with identical template/variadic patterns, the string similarity + is used to determine which to be used. + ''' + + # check the exact name match + if name in definitions: + return definitions[name] + + # check naming pattern match + candidates: list = [] + for definition in set(definitions.values()): + if not definition.variable: + continue + + name_pattern = re.sub(r'^([a-z0-9_]*)[A-Z0-9]+([a-z0-9_]*)$', r'\1[a-z0-9]+\2', definition.name) + if re.match(name_pattern, name): + candidates.append(definition) + + if len(candidates) == 0: + raise ValueError(f'Cannot find a proper definition for name {name}') + + if len(candidates) == 1: + return candidates[0] + + # multiple matches, check similarity + similarity: list = [SequenceMatcher(None, v.name.upper(), name.upper()).ratio() for v in candidates] + + return candidates[similarity.index(max(similarity))] + + +def retrieve_attribute(section, definition: Optional[str], attr_name: str) -> tuple: + ''' + Retrieve the attribute of a definition by its name. + In the case of variadic/template name, the name is also resolved by checking naming pattern. + ''' + + # find the section or quantity where attribute is defined + tgt_def = section if definition is None else resolve_variadic_name(section.all_quantities, definition) + if tgt_def is None: + raise ValueError(f'Cannot find the definition by the given {definition}') + + # find the corresponding attribute + tgt_attr = resolve_variadic_name(tgt_def.all_attributes, attr_name) + if tgt_attr is None: + raise ValueError('The given attribute name is not found in the given property.') + + return tgt_def, tgt_attr + + +def validate_allowable_unit( + dimensionality: Optional[str], + allowable_list: Union[str, list, pint.Unit, pint.Quantity]) -> bool: + ''' + For a given list of units, e.g., ['m', 'cm', 'mm'], and a target NX unit token such as 'NX_LENGTH', + this function checks the compatibility of the target unit with the list of units. + + Returns: + True if ALL units are compatible with the unit token (dimensionality). + False if at least one unit cannot be represented by the unit token (dimensionality). + ''' + if not dimensionality: + return True + + if isinstance(allowable_list, str): + if dimensionality in ('1', 'dimensionless'): + return ureg.Quantity(1, allowable_list).dimensionless + + try: + return ureg.Quantity(1, allowable_list).check(dimensionality) + except KeyError: + return False + + if isinstance(allowable_list, (pint.Unit, pint.Quantity)): + if dimensionality in ('1', 'dimensionless'): + return allowable_list.dimensionless + + return allowable_list.dimensionality == dimensionality + + for unit in allowable_list: + if not validate_allowable_unit(dimensionality, unit): + return False + + return True + + +def default_hash(): + ''' + Returns a hash object using the designated hash algorithm. + ''' + return hashlib.new(__hash_method) + + +def split_python_definition(definition_with_id: str) -> Tuple[list, Optional[str]]: + ''' + Split a Python type name into names and an optional id. + + Example: + my_package.my_section@my_id ==> (['my_package', 'my_section'], 'my_id') + + my_package.my_section ==> (['my_package', 'my_section'], None) + ''' + if '@' not in definition_with_id: + return definition_with_id.split('.'), None + + definition_names, definition_id = definition_with_id.split('@') + return definition_names.split('.'), definition_id + + +def check_dimensionality(quantity_def, unit: Optional[pint.Unit]) -> None: + if quantity_def is None or unit is None: + return + + dimensionality = getattr(quantity_def, 'dimensionality', None) + + if dimensionality is None: # not set, do not validate + return + + if dimensionality in ('dimensionless', '1') and unit.dimensionless: # dimensionless + return + + if dimensionality == 'transformation': + # todo: check transformation dimensionality + return + + if ureg.Quantity(1 * unit).check(dimensionality): # dimensional + return + + raise TypeError(f'Dimensionality {dimensionality} is not met by unit {unit}') + + +def to_section_def(section_def): + ''' + Resolves duck-typing for values that are section definitions or section classes to + section definition. + ''' + return section_def.m_def if isinstance(section_def, type) else section_def # type: ignore + + +def to_numpy(np_type, shape: list, unit: Optional[pint.Unit], definition, value: Any): + check_dimensionality(definition, unit) + + if isinstance(value, pint.Quantity): + if unit is None: + raise TypeError(f'The quantity {definition} does not have a unit, but value {value} does.') + + if type(value.magnitude) == np.ndarray and np_type != value.dtype: + value = value.astype(np_type) + + value = value.to(unit).magnitude + + if isinstance(value, pd.DataFrame): + try: + value = value.to_numpy() + except AttributeError: + raise AttributeError( + f'Could not convert value {value} of type pandas.Dataframe to a numpy array') + + if type(value) != np.ndarray: + if len(shape) > 0: + try: + value = np.asarray(value) + except TypeError: + raise TypeError(f'Could not convert value {value} of {definition} to a numpy array') + elif type(value) != np_type: + try: + value = np_type(value) + except TypeError: + raise TypeError(f'Could not convert value {value} of {definition} to a numpy scalar') + + return value + + +def __validate_shape(section, dimension: Union[str, int], length: int) -> bool: + if isinstance(dimension, int): + return dimension == length + + if not isinstance(dimension, str): + raise TypeError(f'Invalid dimension type {type(dimension)}') + + if dimension.isidentifier(): + return dimension == getattr(section, dimension) + + m = re.match(MRegEx.index_range, dimension) + start = int(m.group(1)) + end = -1 if m.group(2) == '*' else int(m.group(2)) + return start <= length and (end == -1 or length <= end) + + +def validate_shape(section, quantity_def, value: Any) -> bool: + quantity_shape: list = quantity_def.shape + + if type(value) == np.ndarray: + value_shape = value.shape + elif isinstance(value, list) and not isinstance(value, MEnum): + value_shape = [len(value)] + else: + value_shape = [] + + if len(value_shape) != len(quantity_shape): + return False + + return all(__validate_shape(section, x, y) for x, y in zip(quantity_shape, value_shape)) + + +def dict_to_named_list(data) -> list: + if not isinstance(data, dict): + return data + + results: list = [] + for key, value in data.items(): + if value is None: + value = {} + value.update(dict(name=key)) + results.append(value) + return results + + +def validate_url(url_str: str) -> Optional[str]: + if url_str is None: + return None + + if not isinstance(url_str, str): + raise TypeError('Links need to be given as URL strings') + if re.match(MRegEx.url, url_str) is None: + raise ValueError('The given URL is not valid') + + return url_str + + +def parse_datetime(datetime_str: str) -> datetime: + # removing trailing spaces and replacing the potential white space between date and time with char "T" + if datetime_str[0].isdigit(): + datetime_str = datetime_str.strip().replace(' ', 'T') + + try: + return aniso8601.parse_datetime(datetime_str) + except ValueError: + pass + + try: + date_value = aniso8601.parse_date(datetime_str) + if isinstance(date_value, datetime): + return date_value + except ValueError: + pass + + # noinspection PyBroadException + try: + return email.utils.parsedate_to_datetime(datetime_str) + except Exception: + pass + + try: + return datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S.%f') + except ValueError: + pass + + try: + return datetime.strptime(datetime_str, '%Y-%m-%d %H:%M:%S') + except ValueError: + pass + + try: + return datetime.strptime(datetime_str, '%Y-%m-%d') + except ValueError: + pass + + try: + return datetime.fromisoformat(datetime_str) + except ValueError: + pass + + raise TypeError(f'Invalid date literal {datetime_str}') + + +def normalize_datetime(value) -> Optional[datetime]: + if value is None: + return None + + if isinstance(value, str): + value = parse_datetime(value) + + elif isinstance(value, (int, float)): + value = datetime.fromtimestamp(value) + + elif isinstance(value, pint.Quantity): + value = datetime.fromtimestamp(value.magnitude) + + elif not isinstance(value, datetime) and isinstance(value, date): + value = datetime.combine(value, datetime.min.time()) + + if not isinstance(value, datetime): + raise TypeError(f'{value} is not a datetime.') + + if value.tzinfo is None: + value = value.replace(tzinfo=pytz.utc) + else: + value = value.astimezone(pytz.utc) + + return value diff --git a/nomad/metainfo/nx_unit.py b/nomad/metainfo/nx_unit.py deleted file mode 100644 index 697e81ae3..000000000 --- a/nomad/metainfo/nx_unit.py +++ /dev/null @@ -1,58 +0,0 @@ -# -# Copyright The NOMAD Authors. -# -# This file is part of NOMAD. See https://nomad-lab.eu for further info. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -from typing import Union - -import pint - -from nomad.units import ureg - - -def validate_allowable_list( - dimensionality: Union[str, None], allowable_list: Union[str, list, pint.Unit, pint.Quantity]) -> bool: - ''' - For a given list of units, e.g., ['m', 'cm', 'mm'], and a target NX unit token such as 'NX_LENGTH', - this function check the compatibility of the target unit with the list of units. - - Returns: - True if ALL units are compatible with the unit token (dimensionality). - False if at least one unit cannot be represented by the unit token (dimensionality). - ''' - if not dimensionality: - return True - - if isinstance(allowable_list, str): - if dimensionality in ('1', 'dimensionless'): - return ureg.Quantity(1, allowable_list).dimensionless - - try: - return ureg.Quantity(1, allowable_list).check(dimensionality) - except KeyError: - return False - - if isinstance(allowable_list, (pint.Unit, pint.Quantity)): - if dimensionality == ('1', 'dimensionless'): - return allowable_list.dimensionless - - return allowable_list.dimensionality == dimensionality - - for unit in allowable_list: - if not validate_allowable_list(dimensionality, unit): - return False - - return True diff --git a/tests/metainfo/test_attributes.py b/tests/metainfo/test_attributes.py index 61fb5bf97..969a057a5 100644 --- a/tests/metainfo/test_attributes.py +++ b/tests/metainfo/test_attributes.py @@ -22,9 +22,9 @@ import pytest import numpy as np import pytz -from nomad.metainfo import MSection, Quantity, Attribute, MEnum, Reference, Datetime, Property -from nomad.metainfo.metainfo import SubSection, MetainfoError -from nomad.metainfo.nx_unit import validate_allowable_list +from nomad.metainfo import MSection, Quantity, Attribute, MEnum, Reference, Datetime +from nomad.metainfo.metainfo import MQuantity, Definition +from nomad.metainfo.metainfo_utility import validate_allowable_unit from nomad.units import ureg @@ -43,44 +43,28 @@ def test_attributes(type, errors, value): Attribute(name='my_quantity_attribute', type=type) ] ) - my_section = SubSection( - section=Quantity.m_def, - attributes=[ - Attribute(name='my_section_attribute', type=type) - ] - ) - assert Property.all_attributes.derived is not None - assert len(MySection.m_def.m_all_validate()[0]) == errors * 2 + assert Definition.all_attributes.derived is not None + assert len(MySection.m_def.m_all_validate()[0]) == errors assert MySection.my_quantity.attributes[0].name == 'my_quantity_attribute' assert MySection.my_quantity.attributes[0].type == type - assert MySection.my_section.attributes[0].name == 'my_section_attribute' - assert MySection.my_section.attributes[0].type == type if errors > 0: return section = MySection() - attributes = [ - (MySection.my_quantity, 'my_quantity_attribute'), - (MySection.my_section, 'my_section_attribute') - ] - for property, attribute in attributes: - assert section.m_get_attribute(property, attribute) is None - section.m_set_attribute(property, attribute, value) - assert section.m_get_attribute(property, attribute) == value - json_data = section.m_to_dict() - assert json_data == {} + assert section.m_get_quantity_attribute('my_quantity', 'my_quantity_attribute') is None + section.m_set_quantity_attribute('my_quantity', 'my_quantity_attribute', value) + assert section.m_get_quantity_attribute('my_quantity', 'my_quantity_attribute') == value section.my_quantity = 'test' - section.my_section = MySection.my_quantity json_data = section.m_to_dict() section = MySection.m_from_dict(json_data) - for property, attribute in attributes: - assert section.m_get_attribute(property, attribute) == value + + assert section.m_get_quantity_attribute('my_quantity', 'my_quantity_attribute') == value @pytest.mark.parametrize('name,value', [ @@ -89,20 +73,21 @@ def test_attributes(type, errors, value): ]) def test_m_attributes(name, value): class MySection(MSection): - my_quantity = Quantity(type=float) + my_quantity = Quantity( + type=float, + attributes=[ + Attribute(name='m_source_unit', type=str) + ]) section = MySection(my_quantity=1) if name: - section.m_set_attribute('my_quantity', name, value) + section.m_set_quantity_attribute('my_quantity', name, value) json_data = section.m_to_dict() section = MySection.m_from_dict(json_data) if name: - assert section.m_get_attribute('my_quantity', name) == value - else: - for key in json_data.keys(): - assert '@' not in key + assert section.m_get_quantity_attribute('my_quantity', name) == value def test_variable_name(): @@ -116,20 +101,17 @@ def test_variable_name(): section = MySection() - section.MY_quantity = 'v1' - section.m_set_attribute('MY_quantity', 'MY_attribute', 'v1') + section.MY_quantity = MQuantity.wrap('v1', 'MY_quantity') + section.m_set_quantity_attribute('MY_quantity', 'MY_attribute', 'v1') assert section.MY_quantity == 'v1' - assert section.m_get_attribute('MY_quantity', 'MY_attribute') == 'v1' + assert section.m_get_quantity_attribute('MY_quantity', 'MY_attribute') == 'v1' - section.test_quantity = 'v2' - section.m_set_attribute('test_quantity', 'test_attribute', 'v2') - assert section.MY_quantity == 'v2' - assert section.m_get_attribute('MY_quantity', 'm_source_name') == 'test_quantity' - assert section.m_get_attribute('MY_quantity', 'MY_attribute') == 'v2' + section.test_quantity = MQuantity.wrap('v2', 'test_quantity') + section.m_set_quantity_attribute('test_quantity', 'test_attribute', 'v2') assert section.test_quantity == 'v2' - assert section.m_get_attribute('test_quantity', 'test_attribute') == 'v2' + assert section.m_get_quantity_attribute('test_quantity', 'test_attribute') == 'v2' - with pytest.raises(MetainfoError): + with pytest.raises(ValueError): section.completely_off = 'v1' @@ -138,8 +120,8 @@ def test_variable_name(): pytest.param('[length]', ['m/m/m', '1/m'], False, id='length_false'), pytest.param('dimensionless', ['1', 'm/m', 'kg*m/s/s/m^2/MPa'], True, id='dimensionless_true') ]) -def test_nx_unit_compatibility(token, units, result): - assert validate_allowable_list(token, units) == result +def test_unit_compatibility(token, units, result): + assert validate_allowable_unit(token, units) == result if result: class MySection(MSection): @@ -160,3 +142,30 @@ def test_nx_unit_compatibility(token, units, result): section = MySection() for u in units: section.numerical = 1 * ureg.parse_units(u) + + +def test_repeating_quantity(): + class MySection(MSection): + TEST_repeat = Quantity(repeats=True, type=float, unit='m') + TEST_nonrepeat = Quantity(variable=True, type=float) + + my_section = MySection() + + my_section.TEST_repeat = MQuantity.wrap(ureg.Quantity(1., 'cm')) + + assert my_section.TEST_repeat.m == 0.01 # pylint: disable=E1101 + + my_section.TEST_repeat = None + + assert my_section.TEST_repeat is None + + with pytest.raises(ValueError): + _ = my_section.instance_repeat + + my_section.instance_nonrepeat = MQuantity('instance_nonrepeat', 1.23) + + assert my_section.instance_nonrepeat == 1.23 + + my_section.instance_nonrepeat = None + + _ = my_section.instance_nonrepeat diff --git a/tests/metainfo/test_full_storage_quantity.py b/tests/metainfo/test_full_storage_quantity.py new file mode 100644 index 000000000..a7dbcfec2 --- /dev/null +++ b/tests/metainfo/test_full_storage_quantity.py @@ -0,0 +1,105 @@ +# +# Copyright The NOMAD Authors. +# +# This file is part of NOMAD. See https://nomad-lab.eu for further info. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import pytest + +from nomad.datamodel import EntryArchive +from nomad.metainfo import MSection, Quantity, Attribute, SubSection, MetainfoError, Section +from nomad.metainfo.metainfo_utility import MQuantity +from nomad.units import ureg + + +class SectionA(MSection): + plain = Quantity(type=float) + full = Quantity(type=int, unit='m', dimensionality='[length]', attributes=[Attribute(name='gender', type=str)]) + VARIABLE_game = Quantity(type=str, variable=True, attributes=[ + Attribute(name='year', type=int), + Attribute(name='aka', type=str, shape=['1..3']), + ]) + a_attribute = Attribute(type=str) + + +class SectionB(MSection): + out_plain = Quantity(type=int) + b_attribute = Attribute(type=str) + subsection = SubSection( + section=SectionA.m_def + ) + + +def test_full_storage_quantity(): + a_section = SectionA() + b_section = SectionB() + + a_section.plain = 1. + assert a_section.plain == 1. + + # wrong dimensionality + with pytest.raises(MetainfoError): + a_section.full = ureg.Quantity('2*s') + + a_section.full = ureg.Quantity('2*cm') + assert a_section.full == ureg.Quantity('0.02*m') + + # for variadic quantity, it is not allowed to set the value directly + with pytest.raises(MetainfoError): + a_section.gta5_game = 'gta5' + + # need to wrap it in a MQuantity with the correct name + a_section.gta5_game = MQuantity.wrap('gta5', 'gta5_game') + assert a_section.gta5_game == 'gta5' + + # possible to use variadic name to set the value + a_section.VARIABLE_game = MQuantity.wrap('gta3', 'gta3_game') + assert a_section.gta3_game == 'gta3' + + # wrong type but implicitly convertible + a_section.m_set_quantity_attribute('full', 'gender', 0) + assert a_section.m_get_quantity_attribute('full', 'gender') == '0' + + a_section.m_set_quantity_attribute('full', 'gender', 'Male') + assert a_section.m_get_quantity_attribute('full', 'gender') == 'Male' + + a_section.m_set_quantity_attribute('gta5_game', 'year', 2013) + assert a_section.m_get_quantity_attribute('gta5_game', 'year') == 2013 + + a_section.m_set_quantity_attribute('gta3_game', 'year', 2001) + assert a_section.m_get_quantity_attribute('gta3_game', 'year') == 2001 + + # shape error + with pytest.raises(MetainfoError): + a_section.m_set_quantity_attribute('gta3_game', 'aka', ['rockstar games', 'gta', 'gta 3', 'GTA3']) + + a_section.m_set_quantity_attribute('gta3_game', 'aka', ['rockstar games', 'gta', 'gta 3']) + a_section.m_set_section_attribute('a_attribute', 'easy') + + assert a_section.m_get_quantity_attribute('gta3_game', 'aka') == ['rockstar games', 'gta', 'gta 3'] + assert a_section.m_get_section_attribute('a_attribute') == 'easy' + + b_section.subsection = a_section + + json = a_section.m_to_dict(with_out_meta=True) + assert json == SectionA.m_from_dict(json).m_to_dict(with_out_meta=True) + + json = b_section.m_to_dict(with_out_meta=True) + assert json == SectionB.m_from_dict(json).m_to_dict(with_out_meta=True) + + json = a_section.m_def.m_to_dict(with_out_meta=True) + assert json == Section.m_from_dict(json).m_to_dict(with_out_meta=True) + + json = b_section.m_def.m_to_dict(with_out_meta=True) + assert json == Section.m_from_dict(json).m_to_dict(with_out_meta=True) diff --git a/tests/metainfo/test_quantities.py b/tests/metainfo/test_quantities.py index 78bf120d7..71141d055 100644 --- a/tests/metainfo/test_quantities.py +++ b/tests/metainfo/test_quantities.py @@ -31,8 +31,7 @@ from nomad.metainfo.metainfo import ( Capitalized, Bytes, URL, - _types_float, - _types_int, + MTypes ) @@ -107,11 +106,14 @@ def test_normalization_string(def_type, orig_value, normalized_value): @pytest.mark.parametrize( 'def_type, unit, shape, input, output, valid', - [pytest.param(x, None, [], 1, 1, True, id=f'0D type without unit: {x.__name__}') for x in _types_int] - + [pytest.param(x, None, [], 1.0, 1.0, True, id=f'0D type without unit: {x.__name__}') for x in _types_float] - + [pytest.param(x, 'm', [], 100 * units('cm'), 1 * units('m'), True, id=f'0D type with unit: {x.__name__}') for x in _types_int - {int}] - + [pytest.param(int, 'm', [], 100 * units('m'), 100 * units('m'), False, id="precision loss: 0D int to int with unit")] - + [pytest.param(x, 'm', [], 100.0 * units('cm'), 1.0 * units('m'), True, id=f'0D type with unit: {x.__name__}') for x in _types_float] + [pytest.param(x, None, [], 1, 1, True, id=f'0D type without unit: {x.__name__}') for x in MTypes.int] + + [pytest.param(x, None, [], 1.0, 1.0, True, id=f'0D type without unit: {x.__name__}') for x in MTypes.float] + + [pytest.param(x, 'm', [], 100 * units('cm'), 1 * units('m'), True, id=f'0D type with unit: {x.__name__}') for x in + MTypes.int - {int}] + + [pytest.param(int, 'm', [], 100 * units('m'), 100 * units('m'), False, + id="precision loss: 0D int to int with unit")] + + [pytest.param(x, 'm', [], 100.0 * units('cm'), 1.0 * units('m'), True, id=f'0D type with unit: {x.__name__}') for + x in MTypes.float] ) def test_normalization_number(def_type, unit, shape, input, output, valid): '''Numeric quantities with a unit should always return a full pint.Quantity diff --git a/tests/metainfo/test_yaml_schema.py b/tests/metainfo/test_yaml_schema.py index 91b2df2db..551504fc7 100644 --- a/tests/metainfo/test_yaml_schema.py +++ b/tests/metainfo/test_yaml_schema.py @@ -2,7 +2,7 @@ import numpy as np # pylint: disable=unused-import import pytest import yaml -from nomad.metainfo.metainfo import validElnComponents, validElnTypes +from nomad.metainfo.metainfo import MTypes from nomad.utils import strip from nomad.metainfo import Package, MSection, Quantity, Reference, SubSection, Section, MProxy, MetainfoError @@ -190,8 +190,8 @@ def test_sub_section_tree(): assert yaml.m_to_dict() == reference.m_to_dict() -@pytest.mark.parametrize("eln_type", validElnTypes.keys()) -@pytest.mark.parametrize("eln_component", sum(validElnComponents.values(), [])) +@pytest.mark.parametrize("eln_type", MTypes.eln.keys()) +@pytest.mark.parametrize("eln_component", sum(MTypes.eln_component.values(), [])) def test_datatype_component_annotations(eln_type, eln_component): base_schema = ''' m_def: 'nomad.metainfo.metainfo.Package' @@ -213,22 +213,23 @@ def test_datatype_component_annotations(eln_type, eln_component): component: eln_component ''' - for quantity_type in validElnTypes[eln_type]: + for quantity_type in MTypes.eln[eln_type]: if eln_type == 'reference': yaml_schema = base_schema.replace("quantity_type", "'#/Sample'").replace("eln_component", eln_component) else: yaml_schema = base_schema.replace("quantity_type", quantity_type).replace("eln_component", eln_component) - if eln_component not in validElnComponents[eln_type]: + if eln_component not in MTypes.eln_component[eln_type]: with pytest.raises(Exception) as exception: package = yaml_to_package(yaml_schema) type_name = quantity_type if eln_type == 'number' or eln_type == 'datetime' or eln_type == 'enum' or eln_type == 'reference': - process = next(filter(lambda section: section['name'] == 'Process', package['section_definitions']), None) + process = next(filter(lambda section: section['name'] == 'Process', package['section_definitions']), + None) quantity = process['quantities'][0] if type(quantity.type).__name__ != 'type': type_name = type(quantity.type).__name__ package.__init_metainfo__() assert isinstance(exception.value, MetainfoError) assert exception.value.args[0] == 'One constraint was violated: The component `%s` is not compatible with the quantity `%s` of the type `%s`. Accepted components: %s (there are 0 more violations)' \ - % (eln_component, 'quantity_name', type_name, ', '.join(validElnComponents[eln_type])) + % (eln_component, 'quantity_name', type_name, ', '.join(MTypes.eln_component[eln_type])) -- GitLab From 7722b99767560e29d681c80fbe0e412713181225 Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Tue, 6 Sep 2022 12:18:34 +0200 Subject: [PATCH 03/22] Add gui support for attributes --- gui/src/components/archive/Browser.js | 17 +++- gui/src/components/archive/MetainfoBrowser.js | 84 +++++++++++++++++-- gui/src/components/archive/metainfo.js | 36 ++++---- 3 files changed, 114 insertions(+), 23 deletions(-) diff --git a/gui/src/components/archive/Browser.js b/gui/src/components/archive/Browser.js index 24ebfecf2..da7098409 100644 --- a/gui/src/components/archive/Browser.js +++ b/gui/src/components/archive/Browser.js @@ -524,20 +524,27 @@ export function Content(props) { return } -export function Compartment({title, children, color}) { +export function Compartment({title, children, color, startCollapsed}) { + const [collapsed, setCollapsed] = useState(startCollapsed) + const handleClick = useCallback(() => { + setCollapsed(value => !value) + }, [setCollapsed]) if (!React.Children.count(children)) { return null } + return - + {title && {title}} + {collapsed && } - {children} + {(!collapsed) && children} } Compartment.propTypes = ({ title: PropTypes.string, color: PropTypes.string, + startCollapsed: PropTypes.bool, children: PropTypes.oneOfType([ PropTypes.arrayOf(PropTypes.node), PropTypes.node @@ -587,3 +594,7 @@ Title.propTypes = ({ PropTypes.node ]) }) + +export function ItemChip(props) { + return +} diff --git a/gui/src/components/archive/MetainfoBrowser.js b/gui/src/components/archive/MetainfoBrowser.js index e89030bbe..6cef50a9a 100644 --- a/gui/src/components/archive/MetainfoBrowser.js +++ b/gui/src/components/archive/MetainfoBrowser.js @@ -19,9 +19,9 @@ import React, { useMemo, useEffect, useRef, useLayoutEffect, useContext, useStat import PropTypes from 'prop-types' import { useRecoilValue, useRecoilState, atom } from 'recoil' import { configState, useBrowserAdaptorContext } from './ArchiveBrowser' -import Browser, { Item, Content, Compartment, Adaptor, laneContext, formatSubSectionName, Title } from './Browser' +import Browser, { Item, Content, Compartment, Adaptor, laneContext, formatSubSectionName, Title, ItemChip } from './Browser' import { Typography, Box, makeStyles, FormGroup, TextField, Button, Link } from '@material-ui/core' -import { resolveRef, vicinityGraph, SubSectionMDef, SectionMDef, QuantityMDef, CategoryMDef, useGlobalMetainfo, PackageMDef } from './metainfo' +import { resolveRef, vicinityGraph, SubSectionMDef, SectionMDef, QuantityMDef, CategoryMDef, useGlobalMetainfo, PackageMDef, AttributeMDef } from './metainfo' import * as d3 from 'd3' import blue from '@material-ui/core/colors/blue' import teal from '@material-ui/core/colors/teal' @@ -170,6 +170,8 @@ export async function metainfoAdaptorFactory(context, obj) { return new CategoryDefAdaptor(context, obj) } else if (obj.m_def === PackageMDef) { return new PackageDefAdaptor(context, obj) + } else if (obj.m_def === AttributeMDef) { + return new AttributeDefAdaptor(context, obj) } else { throw new Error('Unknown metainfo definition type') } @@ -356,6 +358,10 @@ class SubSectionDefAdaptor extends MetainfoAdaptor { this.sectionDefAdaptor = new SectionDefAdaptor(this.context, this.def.sub_section) } async itemAdaptor(key) { + const attributeDef = this.def.attributes?.find(def => def.name === key) + if (attributeDef) { + return metainfoAdaptorFactory(this.context, attributeDef) + } return this.sectionDefAdaptor.itemAdaptor(key) } render() { @@ -364,6 +370,15 @@ class SubSectionDefAdaptor extends MetainfoAdaptor { } class QuantityDefAdaptor extends MetainfoAdaptor { + itemAdaptor(key) { + const attributeDef = this.def.attributes.find(def => def.name === key) + if (attributeDef) { + return metainfoAdaptorFactory(this.context, attributeDef) + } + + return super.itemAdaptor(key) + } + render() { return } @@ -378,6 +393,12 @@ class CategoryDefAdaptor extends MetainfoAdaptor { } } +class AttributeDefAdaptor extends MetainfoAdaptor { + render() { + return + } +} + function SectionDefContent({def}) { const config = useRecoilValue(configState) const metainfoConfig = useRecoilValue(metainfoConfigState) @@ -422,7 +443,7 @@ function SectionDefContent({def}) { } {def._allInheritingSections?.length > 0 && - + {def._allInheritingSections.map((inheritingSection, index) => { const key = `_inheritingSectionDef@${inheritingSection.name}` const categories = inheritingSection.categories @@ -449,7 +470,10 @@ function SectionDefContent({def}) { {formatSubSectionName(subSectionDef.more?.label || subSectionDef.name)} - {subSectionDef.repeats &&  (repeats)} + + {subSectionDef.repeats && } + {subSectionDef._overwritten && } + {subSectionDef._inherited && } }) @@ -468,6 +492,8 @@ function SectionDefContent({def}) { {quantityDef.more?.label || quantityDef.name} + {quantityDef._overwritten && } + {quantityDef._inherited && } }) @@ -515,6 +541,7 @@ function SubSectionDef({def}) { + @@ -540,7 +567,7 @@ function DefinitionProperties({def, children}) { {children} {def.aliases?.length && aliases: {def.aliases.map(a => `"${a}"`).join(', ')}} {def.deprecated && deprecated: {def.deprecated}} - {Object.keys(def.more).map((moreKey, i) => ( + {Object.keys(def.more || {}).map((moreKey, i) => ( {moreKey}: {String(def.more[moreKey])} ))} {hasSearchAnnotations > 0 && search keys: { @@ -573,10 +600,13 @@ function QuantityDef({def}) { {def.unit && unit: {def.unit}} + {def.dimensionality && + dimensionality: {def.dimensionality}} {def.default && default: {String(def.default)}} {def.derived && derived} + } @@ -584,6 +614,47 @@ QuantityDef.propTypes = ({ def: PropTypes.object }) +function AttributeDef({def}) { + return + + + + type:  + {Array.isArray(def.type.type_data) ? def.type.type_data.join(', ') : def.type.type_data}  + {def.type.type_kind !== 'data' && `(${def.type.type_kind})`} + + + shape:  + [{def.shape.join(', ')}] + + {def.default && + default: {String(def.default)}} + + + + +} +AttributeDef.propTypes = ({ + def: PropTypes.object +}) + +function Attributes({def}) { + if (!def.attributes?.length) { + return null + } + + return + {def.attributes.map((attributeDef, index) => { + return + {attributeDef.more?.label || attributeDef.name} + + })} + +} +Attributes.propTypes = ({ + def: PropTypes.object +}) + function DefinitionDocs({def}) { return {def.description && !def.extends_base_section && @@ -702,7 +773,8 @@ const definitionLabels = { [SectionMDef]: 'section', [QuantityMDef]: 'quantity', [SubSectionMDef]: 'sub section', - [CategoryMDef]: 'category' + [CategoryMDef]: 'category', + [AttributeMDef]: 'attribute' } export function ArchiveTitle({def, isDefinition, data, kindLabel, useName, actions}) { diff --git a/gui/src/components/archive/metainfo.js b/gui/src/components/archive/metainfo.js index bf7e867d0..499c5af89 100644 --- a/gui/src/components/archive/metainfo.js +++ b/gui/src/components/archive/metainfo.js @@ -106,6 +106,7 @@ export const SectionMDef = 'nomad.metainfo.metainfo.Section' export const QuantityMDef = 'nomad.metainfo.metainfo.Quantity' export const SubSectionMDef = 'nomad.metainfo.metainfo.SubSection' export const CategoryMDef = 'nomad.metainfo.metainfo.Category' +export const AttributeMDef = 'nomad.metainfo.metainfo.Attribute' export async function createGlobalMetainfo() { return createMetainfo(metainfoData) @@ -282,23 +283,30 @@ class Metainfo { async _getAllProperties(sectionDef) { const results = {} - function addProperties(sectionDef) { - sectionDef.quantities.forEach( - property => { - property.m_def = QuantityMDef - results[property.name] = property - } - ) - sectionDef.sub_sections.forEach( - property => { - property.m_def = SubSectionMDef - results[property.name] = property + function createAddProperties(inherited) { + return (sectionDef) => { + function createAddProperty(m_def) { + return (property) => { + const propertyToAdd = inherited ? {} : property + if (inherited) { + Object.assign(propertyToAdd, property) + propertyToAdd._inherited = true + } else { + if (results[property.name]) { + propertyToAdd._overwritten = true + } + } + property.m_def = m_def + results[property.name] = propertyToAdd + } } - ) + sectionDef.quantities.forEach(createAddProperty(QuantityMDef)) + sectionDef.sub_sections.forEach(createAddProperty(SubSectionMDef)) + } } sectionDef = await this._initSection(sectionDef) - sectionDef._allBaseSections.forEach(addProperties) - addProperties(sectionDef) + sectionDef._allBaseSections.forEach(createAddProperties(true)) + createAddProperties(false)(sectionDef) return Object.keys(results).map(key => results[key]) } -- GitLab From 4774b49e4aa87f001d68d8d4b31a9b917e6d56c7 Mon Sep 17 00:00:00 2001 From: Markus Scheidgen Date: Fri, 16 Sep 2022 12:02:04 +0200 Subject: [PATCH 04/22] Added example and archive browser support for full storage quantities. --- .../full-storage-quantities.archive.yaml | 58 ++++++++ gui/package.json | 2 +- gui/src/components/archive/ArchiveBrowser.js | 137 +++++++++++++++--- gui/src/components/archive/MetainfoBrowser.js | 18 ++- gui/src/components/archive/metainfo.js | 4 + gui/yarn.lock | 8 +- nomad/metainfo/metainfo.py | 5 +- tests/metainfo/test_full_storage_quantity.py | 1 - 8 files changed, 200 insertions(+), 33 deletions(-) create mode 100644 examples/data/custom-schema/full-storage-quantities.archive.yaml diff --git a/examples/data/custom-schema/full-storage-quantities.archive.yaml b/examples/data/custom-schema/full-storage-quantities.archive.yaml new file mode 100644 index 000000000..09d6d121b --- /dev/null +++ b/examples/data/custom-schema/full-storage-quantities.archive.yaml @@ -0,0 +1,58 @@ +definitions: + sections: + MySection: + base_section: nomad.datamodel.EntryData + attributes: + - + name: section_attr_1 + type: str + - + name: section_attr_2 + type: float + quantities: + my_quantity: + type: str + attributes: + - + name: quantity_attr_1 + type: str + - + name: quantity_attr_2 + type: float + MY_variable_quantity: + type: np.float64 + variable: true + shape: [3,3] + dimensionality: '[length]' + unit: 'm' + attributes: + - + name: quantity_attr_1 + type: str + - + name: quantity_attr_2 + type: float + +data: + m_def: MySection + m_attributes: + section_attr_1: "value" + section_attr_2: 0 + MY_variable_quantity: + foo_variable_quantity: + m_value: [[1,1,1], [0,0,0], [-1,-1,-1]] + m_unit: 'mm' + m_attributes: + quantity_attr_1: "foo" + quantity_attr_2: 0 + bar_variable_quantity: + m_value: [[1,1,1], [0,0,0], [-1,-1,-1]] + m_unit: 'cm' + m_attributes: + quantity_attr_1: "bar" + quantity_attr_2: 0 + my_quantity: + my_quantity: + m_value: 'value' + m_attributes: + quantity_attr_2: 0.0 \ No newline at end of file diff --git a/gui/package.json b/gui/package.json index cbcc0473b..2b9e6ed9a 100644 --- a/gui/package.json +++ b/gui/package.json @@ -145,7 +145,7 @@ }, "resolutions": { "//": "See https://github.com/facebook/create-react-app/issues/11773 and https://github.com/jsdom/jsdom/issues/3419", - "react-error-overlay": "6.0.11", + "react-error-overlay": "6.0.9", "tough-cookie": "4.0.0" } } diff --git a/gui/src/components/archive/ArchiveBrowser.js b/gui/src/components/archive/ArchiveBrowser.js index 8297cff70..3ed803e92 100644 --- a/gui/src/components/archive/ArchiveBrowser.js +++ b/gui/src/components/archive/ArchiveBrowser.js @@ -30,7 +30,8 @@ import Autocomplete from '@material-ui/lab/Autocomplete' import Browser, { Item, Content, Compartment, Adaptor, formatSubSectionName, laneContext, useLane, browserContext } from './Browser' import { RawFileAdaptor } from './FileBrowser' import { - isEditable, PackageMDef, QuantityMDef, removeSubSection, resolveRef, resolveRefAsync, SectionMDef, SubSectionMDef, + AttributeMDef, + isEditable, PackageMDef, QuantityMDef, quantityUsesFullStorage, removeSubSection, resolveRef, resolveRefAsync, SectionMDef, SubSectionMDef, useMetainfo } from './metainfo' import { ArchiveTitle, metainfoAdaptorFactory, DefinitionLabel } from './MetainfoBrowser' @@ -462,6 +463,10 @@ class ArchiveAdaptor extends Adaptor { return new QuantityAdaptor(context, obj, def, parent) } + if (def.m_def === AttributeMDef) { + return new AttributeAdaptor(context, obj, def, parent) + } + throw new Error('not implemented') } @@ -477,8 +482,11 @@ class ArchiveAdaptor extends Adaptor { class SectionAdaptor extends ArchiveAdaptor { async itemAdaptor(key) { const [name, index] = key.split(':') - const property = this.def._properties[name] - const value = this.obj[name] + const property = this.def._properties[name] || (name === 'm_attributes' && this.def.attributes.find(attr => attr.name === index)) + let value = this.obj[name] + if (property.m_def === QuantityMDef && quantityUsesFullStorage(property)) { + value = value[index] + } if (!property) { return super.itemAdaptor(key) } else if (property.m_def === SubSectionMDef) { @@ -537,6 +545,8 @@ class SectionAdaptor extends ArchiveAdaptor { } } return this.adaptorFactory(value, property, this.obj) + } else if (property.m_def === AttributeMDef) { + return this.adaptorFactory(this.obj?.m_attributes[index], property, this.obj) } else { throw new Error('Unknown metainfo meta definition') } @@ -556,8 +566,28 @@ class ReferenceAdaptor extends ArchiveAdaptor { } class QuantityAdaptor extends ArchiveAdaptor { + async itemAdaptor(key) { + const attribute = this.def.attributes.find(attr => attr.name === key) + const value = this.obj.m_attributes[key] + if (attribute) { + return await this.adaptorFactory(value, attribute, this.obj) + } + + return super.itemAdaptor(key) + } + render() { - return + if (quantityUsesFullStorage(this.def)) { + return + } else { + return + } + } +} + +class AttributeAdaptor extends ArchiveAdaptor { + render() { + return } } @@ -620,19 +650,24 @@ QuantityItemPreview.propTypes = ({ def: PropTypes.object.isRequired }) -const QuantityValue = React.memo(function QuantityValue({value, def}) { +const QuantityValue = React.memo(function QuantityValue({value, def, ...more}) { const units = useUnits() const getRenderValue = useCallback(value => { let finalValue = (def.type.type_data === 'nomad.metainfo.metainfo._Datetime' ? new Date(value).toLocaleString() : value) let finalUnit if (def.unit) { - const a = new Q(finalValue, def.unit).toSystem(units) - finalValue = a.value() - finalUnit = a.label() + const systemUnitQ = new Q(finalValue, def.unit).toSystem(units) + finalValue = systemUnitQ.value() + finalUnit = systemUnitQ.label() + if (more.unit) { + const customUnitQ = systemUnitQ.to(more.unit) + finalValue = customUnitQ.value() + finalUnit = customUnitQ.label() + } } return [finalValue, finalUnit] - }, [def, units]) + }, [def, more, units]) const isMathValue = def.type.type_kind === 'numpy' if (isMathValue) { @@ -676,7 +711,8 @@ const QuantityValue = React.memo(function QuantityValue({value, def}) { }) QuantityValue.propTypes = ({ value: PropTypes.any, - def: PropTypes.object.isRequired + def: PropTypes.object.isRequired, + unit: PropTypes.string }) const InheritingSections = React.memo(function InheritingSections({def, section, lane}) { @@ -785,23 +821,19 @@ function Section({section, def, parentRelation}) { }, [navEntryId, setShowJson, sectionIsEditable, parentRelation, lane, history, handleArchiveChanged, section]) - const renderQuantity = useCallback(quantityDef => { - const key = quantityDef.name - const disabled = section[key] === undefined - if (!disabled && quantityDef.type.type_kind === 'reference' && quantityDef.shape.length === 1) { - return - } + const renderQuantityItem = useCallback((key, quantityName, quantityDef, value, disabled) => { + const itemKey = quantityName ? `${key}:${quantityName}` : key return ( - + - {quantityDef.name} + {quantityName || quantityDef.name} {!disabled &&  =  @@ -809,7 +841,25 @@ function Section({section, def, parentRelation}) { ) - }, [section]) + }, []) + + const renderQuantity = useCallback(quantityDef => { + const key = quantityDef.name + const disabled = section[key] === undefined + if (!disabled && quantityDef.type.type_kind === 'reference' && quantityDef.shape.length === 1) { + return + } + if (quantityUsesFullStorage(quantityDef)) { + const storage = section[quantityDef.name] || {} + return + {Object.keys(storage).map(quantityName => + renderQuantityItem(key, quantityName, quantityDef, storage[quantityName]?.m_value, disabled) + )} + + } else { + return renderQuantityItem(key, null, quantityDef, section[quantityDef.name], disabled) + } + }, [section, renderQuantityItem]) if (!section) { console.error('section is not available') @@ -862,6 +912,7 @@ function Section({section, def, parentRelation}) { {def.m_annotations?.plot && } } else { + const attributes = section?.m_attributes || {} contents = {subSectionCompartment} @@ -871,6 +922,11 @@ function Section({section, def, parentRelation}) { .map(renderQuantity) } + {Object.keys(attributes).length > 0 && + {Object.keys(attributes).map(key => ( + {key} + ))} + } {def.m_annotations?.plot && } } @@ -1299,7 +1355,22 @@ SectionPlots.propTypes = { section: PropTypes.object } -function Quantity({value, def}) { +function FullStorageQuantity({value, def}) { + const attributes = value.m_attributes || {} + return + {Object.keys(attributes).length > 0 && + {Object.keys(attributes).map(key => ( + {key} + ))} + } + +} +FullStorageQuantity.propTypes = ({ + value: PropTypes.any, + def: PropTypes.object.isRequired +}) + +function Quantity({value, def, unit, children}) { const {prev} = useLane() return @@ -1317,12 +1388,36 @@ function Quantity({value, def}) { + {children} } Quantity.propTypes = ({ + value: PropTypes.any, + def: PropTypes.object.isRequired, + unit: PropTypes.string, + children: PropTypes.oneOfType([ + PropTypes.arrayOf(PropTypes.node), + PropTypes.node + ]) +}) + +function Attribute({value, def}) { + return + + + + + + +} +Attribute.propTypes = ({ value: PropTypes.any, def: PropTypes.object.isRequired }) diff --git a/gui/src/components/archive/MetainfoBrowser.js b/gui/src/components/archive/MetainfoBrowser.js index 6cef50a9a..63c805d1d 100644 --- a/gui/src/components/archive/MetainfoBrowser.js +++ b/gui/src/components/archive/MetainfoBrowser.js @@ -345,6 +345,11 @@ export class SectionDefAdaptor extends MetainfoAdaptor { return metainfoAdaptorFactory(this.context, property) } + const attribute = this.def.attributes?.find(attr => attr.name === key) + if (attribute) { + return metainfoAdaptorFactory(this.context, attribute) + } + return super.itemAdaptor(key) } render() { @@ -518,6 +523,8 @@ function SectionDefContent({def}) { } } + + } SectionDefContent.propTypes = ({ @@ -528,7 +535,6 @@ function SectionDef({def}) { return - } SectionDef.propTypes = ({ @@ -542,8 +548,8 @@ function SubSectionDef({def}) { - + } @@ -598,13 +604,15 @@ function QuantityDef({def}) { shape:  [{def.shape.join(', ')}] + {def.derived && repeats: true} {def.unit && unit: {def.unit}} {def.dimensionality && dimensionality: {def.dimensionality}} {def.default && default: {String(def.default)}} - {def.derived && derived} + {def.derived && derived: true} + {def.variable && variable: true} @@ -623,10 +631,10 @@ function AttributeDef({def}) { {Array.isArray(def.type.type_data) ? def.type.type_data.join(', ') : def.type.type_data}  {def.type.type_kind !== 'data' && `(${def.type.type_kind})`} - + {def.shape && shape:  [{def.shape.join(', ')}] - + } {def.default && default: {String(def.default)}} diff --git a/gui/src/components/archive/metainfo.js b/gui/src/components/archive/metainfo.js index 499c5af89..309accf2a 100644 --- a/gui/src/components/archive/metainfo.js +++ b/gui/src/components/archive/metainfo.js @@ -136,6 +136,10 @@ export async function createMetainfo(data, parentMetainfo, context) { return metainfo } +export function quantityUsesFullStorage(def) { + return def.repeats || def.variable || def.attributes?.length +} + /** * Represents and manages schema data. * diff --git a/gui/yarn.lock b/gui/yarn.lock index a6b46b282..2539c8b9c 100644 --- a/gui/yarn.lock +++ b/gui/yarn.lock @@ -13313,10 +13313,10 @@ react-error-boundary@3.1.4: dependencies: "@babel/runtime" "^7.12.5" -react-error-overlay@6.0.11, react-error-overlay@^6.0.9: - version "6.0.11" - resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== +react-error-overlay@6.0.9, react-error-overlay@^6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" + integrity sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew== react-event-listener@^0.6.0: version "0.6.6" diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index 9532e402c..7ec7f952e 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -2091,7 +2091,10 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas raise MetainfoError('Full storage quantity must be a dict') for each_name, each_quantity in quantity_value.items(): - m_value = self.__deserialize(section, quantity_def, each_quantity['m_value']) + try: + m_value = self.__deserialize(section, quantity_def, each_quantity['m_value']) + except KeyError: + raise MetainfoError(f'Set full storage quantity {property_def} must have a value') m_quantity = MQuantity(each_name, m_value) if 'm_unit' in each_quantity: m_quantity.unit = units.parse_units(each_quantity['m_unit']) diff --git a/tests/metainfo/test_full_storage_quantity.py b/tests/metainfo/test_full_storage_quantity.py index a7dbcfec2..7d9c1896e 100644 --- a/tests/metainfo/test_full_storage_quantity.py +++ b/tests/metainfo/test_full_storage_quantity.py @@ -17,7 +17,6 @@ # import pytest -from nomad.datamodel import EntryArchive from nomad.metainfo import MSection, Quantity, Attribute, SubSection, MetainfoError, Section from nomad.metainfo.metainfo_utility import MQuantity from nomad.units import ureg -- GitLab From 1f5fe79f3a0bbffc5ecdaabb074a05aeccc76f0c Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Fri, 16 Sep 2022 15:15:40 +0200 Subject: [PATCH 05/22] Add `original unit` --- nomad/metainfo/metainfo.py | 118 ++++++++++++------- nomad/metainfo/metainfo_utility.py | 62 ++++++++-- tests/metainfo/test_full_storage_quantity.py | 3 +- 3 files changed, 127 insertions(+), 56 deletions(-) diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index 7ec7f952e..264c1271b 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -325,7 +325,7 @@ class _Unit(DataType): return value def serialize(self, section, quantity_def: 'Quantity', value): - return value.__str__() + return None if quantity_def.flexible_unit else value.__str__() def deserialize(self, section, quantity_def: 'Quantity', value): value = units.parse_units(value) @@ -1207,39 +1207,6 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas raise AttributeError(name) - def __normalize_value(self, value_type, definition: 'Definition', value: Any) -> Any: - if isinstance(value_type, DataType): - return value_type.set_normalize(self, None, value) # type: ignore - - if isinstance(value_type, MEnum): - if value not in cast(MEnum, value_type).get_all_values(): - raise TypeError(f'The value {value} is not an enum value for {definition}.') - return value - - if value_type == Any: - return value - - if value_type == str and type(value) == np.str_: - return str(value) - - if value_type == bool and type(value) == np.bool_: - return bool(value) - - if value_type == int and type(value) == np.float_: - return int(value) - - if type(value) != value_type: - if value_type in MTypes.primitive: - try: - return MTypes.primitive[value_type](value) # type: ignore - except ValueError as e: - raise TypeError(e) - - if value is not None: - raise TypeError(f'The value {value} for {definition} is not of type {value_type}.') - - return value - def __set_normalize(self, quantity_def: 'Quantity', value: Any) -> Any: target_type = quantity_def.type @@ -1260,7 +1227,37 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return value - return self.__normalize_value(target_type, quantity_def, value) + if isinstance(target_type, DataType): + return target_type.set_normalize(self, None, value) # type: ignore + + if isinstance(target_type, MEnum): + if value not in cast(MEnum, target_type).get_all_values(): + raise TypeError(f'The value {value} is not an enum value for {quantity_def}.') + return value + + if target_type == Any: + return value + + if target_type == str and type(value) == np.str_: + return str(value) + + if target_type == bool and type(value) == np.bool_: + return bool(value) + + if target_type == int and type(value) == np.float_: + return int(value) + + if type(value) != target_type: + if target_type in MTypes.primitive: + try: + return MTypes.primitive[target_type](value) # type: ignore + except ValueError as e: + raise TypeError(e) + + if value is not None: + raise TypeError(f'The value {value} for {quantity_def} is not of type {target_type}.') + + return value def m_set(self, quantity_def: 'Quantity', value: Any) -> None: ''' Set the given value for the given quantity. ''' @@ -1350,6 +1347,26 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas raise MetainfoError(f'Could not convert {m_quantity.unit} to {quantity_def.unit}') m_quantity.unit = quantity_def.unit + if quantity_def.type in MTypes.numpy or isinstance(quantity_def.type, pd.DataFrame): + m_quantity.value = to_numpy( + quantity_def.type, quantity_def.shape, quantity_def.unit, quantity_def, m_quantity.value) + else: + dimensions = len(quantity_def.shape) + if dimensions == 0: + m_quantity.value = self.__set_normalize(quantity_def, m_quantity.value) + + elif dimensions == 1: + if type(m_quantity.value) == str or not isinstance(m_quantity.value, IterableABC): + raise TypeError( + f'The shape of {quantity_def} requires an iterable value, ' + f'but {m_quantity.value} is not iterable.') + + m_quantity.value = list(self.__set_normalize(quantity_def, item) for item in m_quantity.value) + + else: + raise MetainfoError( + f'Only numpy arrays and dtypes can be used for higher dimensional quantities: {quantity_def}') + # store under variable name with suffix if full_name in self.__dict__: self.__dict__[full_name][m_quantity.name] = m_quantity @@ -1370,6 +1387,15 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return self.__dict__[to_storage_name(quantity_def)] + def m_get_quantity_definition(self, quantity_name: str, hint: Optional[str] = None): + ''' + Get the definition of the quantity with the target name. + + An optional hint string can be provided. The hint should be the name of one of attributes + defined in the target quantity. + ''' + return resolve_variadic_name(self.m_def.all_quantities, quantity_name, hint) + def m_is_set(self, quantity_def: 'Quantity') -> bool: ''' True if the given quantity is set. ''' if quantity_def.derived is not None: @@ -1514,16 +1540,15 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if tgt_attr.type in MTypes.numpy: attr_value = to_numpy(tgt_attr.type, [], None, tgt_attr, attr_value) - attr_value = self.__normalize_value(tgt_attr.type, tgt_attr, attr_value) else: dimension = len(tgt_attr.shape) if dimension == 0: - attr_value = self.__normalize_value(tgt_attr.type, tgt_attr, attr_value) + attr_value = self.__set_normalize(tgt_attr, attr_value) elif dimension == 1: if type(attr_value) == str or not isinstance(attr_value, IterableABC): raise TypeError(f'The shape requires an iterable value, but {attr_value} is not.') - attr_value = list(self.__normalize_value(tgt_attr.type, tgt_attr, item) for item in attr_value) + attr_value = list(self.__set_normalize(tgt_attr, item) for item in attr_value) else: raise MetainfoError(f'Only numpy arrays can be used for higher dimensional quantities: {tgt_attr}.') @@ -1900,6 +1925,8 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas m_result: dict = {'m_value': serialize_quantity(quantity_def, True, False, None, m_quantity.value)} if m_quantity.unit: m_result['m_unit'] = str(m_quantity.unit) + if m_quantity.original_unit: + m_result['m_original_unit'] = str(m_quantity.original_unit) if m_quantity.attributes: a_result: dict = collect_attributes(m_quantity.attributes, quantity_def.all_attributes) if a_result: @@ -2068,17 +2095,14 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if isinstance(property_def, SubSection): sub_section_def = property_def sub_section_value = dct.get(name) + sub_section_cls = sub_section_def.sub_section.section_cls if sub_section_def.repeats: for sub_section_dct in sub_section_value: - if sub_section_dct is None: - sub_section = None - else: - sub_section = sub_section_def.sub_section.section_cls.m_from_dict( - sub_section_dct, m_parent=self, m_context=m_context) + sub_section = None if sub_section_dct is None else sub_section_cls.m_from_dict( + sub_section_dct, m_parent=self, m_context=m_context) section.m_add_sub_section(sub_section_def, sub_section) - else: - sub_section = sub_section_def.sub_section.section_cls.m_from_dict( + sub_section = sub_section_cls.m_from_dict( sub_section_value, m_parent=self, m_context=m_context) section.m_add_sub_section(sub_section_def, sub_section) @@ -2098,6 +2122,8 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas m_quantity = MQuantity(each_name, m_value) if 'm_unit' in each_quantity: m_quantity.unit = units.parse_units(each_quantity['m_unit']) + if 'm_original_unit' in each_quantity: + m_quantity.original_unit = units.parse_units(each_quantity['m_original_unit']) if 'm_attributes' in each_quantity: m_quantity.attributes = each_quantity['m_attributes'] @@ -2968,6 +2994,7 @@ class Quantity(Property): is_scalar: 'Quantity' = _placeholder_quantity repeats: 'Quantity' = _placeholder_quantity use_full_storage: 'Quantity' = _placeholder_quantity + flexible_unit: 'Quantity' = _placeholder_quantity # TODO derived_from = Quantity(type=Quantity, shape=['0..*']) def __init__(self, *args, **kwargs): @@ -4103,6 +4130,7 @@ Quantity.is_scalar = Quantity( Quantity.use_full_storage = Quantity( type=bool, name='use_full_storage', derived=lambda quantity: quantity.repeats or quantity.variable or len(quantity.attributes) > 0) +Quantity.flexible_unit = Quantity(type=bool, name='flexible_unit', default=False) Quantity.repeats = Quantity(type=bool, name='repeats', default=False) Quantity.cached = Quantity(type=bool, name='cached', default=False) diff --git a/nomad/metainfo/metainfo_utility.py b/nomad/metainfo/metainfo_utility.py index b84d75460..5ed533f8c 100644 --- a/nomad/metainfo/metainfo_utility.py +++ b/nomad/metainfo/metainfo_utility.py @@ -187,6 +187,7 @@ class MQuantity: name: str = None value: Any = None unit: Optional[pint.Unit] = None + original_unit: Optional[pint.Unit] = None attributes: dict = None def __init__( @@ -216,6 +217,8 @@ class MQuantity: elif isinstance(in_unit, str): self.unit = ureg.parse_units(in_unit) + self.original_unit = self.unit + self.attributes: dict = {} if in_attributes is not None: self.attributes.update(**in_attributes) @@ -405,7 +408,16 @@ def convert_to(from_magnitude, from_unit: Optional[ureg.Unit], to_unit: Optional return from_quantity.to(to_unit).m -def resolve_variadic_name(definitions: dict, name: str): +def __similarity_match(candidates: list, name: str): + ''' + Use similarity to find the best match for a name. + ''' + similarity: list = [SequenceMatcher(None, v.name.upper(), name.upper()).ratio() for v in candidates] + + return candidates[similarity.index(max(similarity))] + + +def resolve_variadic_name(definitions: dict, name: str, hint: Optional[str] = None): ''' For properties with variadic names, it is necessary to check all possible definitions in the schema to find the unique and correct definition that matches the naming pattern. @@ -419,8 +431,18 @@ def resolve_variadic_name(definitions: dict, name: str): For example, the definition name 'FOO_bar' will be replaced by '.*_bar', which further matches 'a_bar', 'aa_bar', etc. - In case of multiple quantities with identical template/variadic patterns, the string similarity - is used to determine which to be used. + In case of multiple quantities with identical template/variadic patterns, the following strategy + is used: + 1. Check all quantities and collect all qualified quantities that match the naming pattern + in a candidate list. + 2. Use the optionally provided hint string, which shall be one of attribute names of the desired + quantity. Check all candidates if this attribute exists. The existence of a hint attribute + prioritize this quantity, and it will be put into a prioritized list. + 3. If the prioritized candidate list contains multiple matches, use name similarity determine + which to be used. + 4. If no hint is provided, or no candidate has the hint attribute, check all quantities in the + first candidate list and use name similarity to determine which to be used. + ''' # check the exact name match @@ -443,10 +465,23 @@ def resolve_variadic_name(definitions: dict, name: str): if len(candidates) == 1: return candidates[0] + hinted_candidates: list = [] + if hint is not None: + for definition in candidates: + try: + if resolve_variadic_name(definition.all_attributes, hint): + hinted_candidates.append(definition) + except ValueError: + pass + + if len(hinted_candidates) == 1: + return hinted_candidates[0] + # multiple matches, check similarity - similarity: list = [SequenceMatcher(None, v.name.upper(), name.upper()).ratio() for v in candidates] + if len(hinted_candidates) > 1: + return __similarity_match(hinted_candidates, name) - return candidates[similarity.index(max(similarity))] + return __similarity_match(candidates, name) def retrieve_attribute(section, definition: Optional[str], attr_name: str) -> tuple: @@ -456,7 +491,8 @@ def retrieve_attribute(section, definition: Optional[str], attr_name: str) -> tu ''' # find the section or quantity where attribute is defined - tgt_def = section if definition is None else resolve_variadic_name(section.all_quantities, definition) + tgt_def = section if definition is None else resolve_variadic_name( + section.all_quantities, definition, attr_name) if tgt_def is None: raise ValueError(f'Cannot find the definition by the given {definition}') @@ -561,13 +597,19 @@ def to_numpy(np_type, shape: list, unit: Optional[pint.Unit], definition, value: check_dimensionality(definition, unit) if isinstance(value, pint.Quantity): - if unit is None: + # if flexible unit is set, do not check unit in the definition + # it will be handled specially + # the stored unit would not be serialized + flexible_unit = getattr(definition, 'flexible_unit', False) + + if not flexible_unit and unit is None: raise TypeError(f'The quantity {definition} does not have a unit, but value {value} does.') if type(value.magnitude) == np.ndarray and np_type != value.dtype: value = value.astype(np_type) - value = value.to(unit).magnitude + if not flexible_unit: + value = value.to(unit).magnitude if isinstance(value, pd.DataFrame): try: @@ -648,7 +690,7 @@ def validate_url(url_str: str) -> Optional[str]: return url_str -def parse_datetime(datetime_str: str) -> datetime: +def __parse_datetime(datetime_str: str) -> datetime: # removing trailing spaces and replacing the potential white space between date and time with char "T" if datetime_str[0].isdigit(): datetime_str = datetime_str.strip().replace(' ', 'T') @@ -699,7 +741,7 @@ def normalize_datetime(value) -> Optional[datetime]: return None if isinstance(value, str): - value = parse_datetime(value) + value = __parse_datetime(value) elif isinstance(value, (int, float)): value = datetime.fromtimestamp(value) diff --git a/tests/metainfo/test_full_storage_quantity.py b/tests/metainfo/test_full_storage_quantity.py index 7d9c1896e..53c61c165 100644 --- a/tests/metainfo/test_full_storage_quantity.py +++ b/tests/metainfo/test_full_storage_quantity.py @@ -24,7 +24,7 @@ from nomad.units import ureg class SectionA(MSection): plain = Quantity(type=float) - full = Quantity(type=int, unit='m', dimensionality='[length]', attributes=[Attribute(name='gender', type=str)]) + full = Quantity(type=float, unit='m', dimensionality='[length]', attributes=[Attribute(name='gender', type=str)]) VARIABLE_game = Quantity(type=str, variable=True, attributes=[ Attribute(name='year', type=int), Attribute(name='aka', type=str, shape=['1..3']), @@ -92,6 +92,7 @@ def test_full_storage_quantity(): b_section.subsection = a_section json = a_section.m_to_dict(with_out_meta=True) + assert json == SectionA.m_from_dict(json).m_to_dict(with_out_meta=True) json = b_section.m_to_dict(with_out_meta=True) -- GitLab From c6efdb9b872aa9dc103664eb54210d66ebaeb459 Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Tue, 20 Sep 2022 11:42:45 +0200 Subject: [PATCH 06/22] Minor update --- nomad/metainfo/metainfo_utility.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/nomad/metainfo/metainfo_utility.py b/nomad/metainfo/metainfo_utility.py index 5ed533f8c..61902d531 100644 --- a/nomad/metainfo/metainfo_utility.py +++ b/nomad/metainfo/metainfo_utility.py @@ -610,6 +610,8 @@ def to_numpy(np_type, shape: list, unit: Optional[pint.Unit], definition, value: if not flexible_unit: value = value.to(unit).magnitude + else: + value = value.magnitude if isinstance(value, pd.DataFrame): try: -- GitLab From 9ab076eae47051ca95b0caae0db11a37f48558e4 Mon Sep 17 00:00:00 2001 From: Markus Scheidgen Date: Thu, 22 Sep 2022 13:47:33 +0200 Subject: [PATCH 07/22] Fixed rebase regressions. --- gui/src/components/archive/ArchiveBrowser.js | 2 +- gui/src/components/archive/metainfo.js | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/gui/src/components/archive/ArchiveBrowser.js b/gui/src/components/archive/ArchiveBrowser.js index 731840f9d..8afc89156 100644 --- a/gui/src/components/archive/ArchiveBrowser.js +++ b/gui/src/components/archive/ArchiveBrowser.js @@ -577,7 +577,7 @@ class QuantityAdaptor extends ArchiveAdaptor { const attribute = this.def.attributes.find(attr => attr.name === key) const value = this.obj.m_attributes[key] if (attribute) { - return await this.adaptorFactory(value, attribute, this.obj) + return await this.adaptorFactory(this.parsedBaseUrl, value, attribute) } return super.itemAdaptor(key) diff --git a/gui/src/components/archive/metainfo.js b/gui/src/components/archive/metainfo.js index b92b4ac60..fbc590080 100644 --- a/gui/src/components/archive/metainfo.js +++ b/gui/src/components/archive/metainfo.js @@ -431,6 +431,10 @@ export class Metainfo { property._qualifiedName = `${sectionDef._qualifiedName}.${property.name}` } property._package = pkg + property._parent = sectionDef + for (const attribute of (property?.attributes || [])) { + attribute._parent = property + } await this._addDef(property) } for (const property of sectionDef._allProperties) { @@ -450,6 +454,9 @@ export class Metainfo { property._section = sectionDef } } + for (const attribute of (sectionDef?.attributes || [])) { + attribute._parent = sectionDef + } } async _addPackage(pkg, unique_id, url) { -- GitLab From c1075ecddfec02f6cbc595555c1ea5c129c2aeef Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Fri, 23 Sep 2022 03:29:57 +0200 Subject: [PATCH 08/22] Append units via getter --- nomad/metainfo/metainfo.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index f72bbcea5..a85f77bc0 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -1238,6 +1238,9 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return None if m_quantity.value is not None: + if m_quantity.unit is not None: + return units.Quantity(m_quantity.value, m_quantity.unit) + return m_quantity.value raise AttributeError(name) @@ -3072,7 +3075,12 @@ class Quantity(Property): try: value = obj.__dict__[self.name] except KeyError: - value = obj.__dict__[f'{self.name}{_storage_suffix}'][self.name].value + # ! can only directly build the key here due to infinite recursion + m_quantity = obj.__dict__[f'{self.name}{_storage_suffix}'][self.name] + if m_quantity.unit: + value = units.Quantity(m_quantity.value, m_quantity.unit) + else: + value = m_quantity.value except KeyError: if self.derived is not None: try: @@ -3108,6 +3116,10 @@ class Quantity(Property): raise MetainfoError( 'Only numpy arrays and dtypes can be used for higher dimensional quantities.') + # no need to append unit if it is already a quantity from full storage + if isinstance(value, units.Quantity): + return value + if self.unit is not None and self.type in MTypes.num: return value * self.unit -- GitLab From dc48149723c4c58267ebf2b8c99b3d5b610aa035 Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Fri, 23 Sep 2022 16:48:23 +0200 Subject: [PATCH 09/22] Add full storage support for m_traverse --- nomad/metainfo/metainfo.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index a85f77bc0..758b4bd9b 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -2297,7 +2297,15 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas for key in self.__dict__: property_def = self.m_def.all_properties.get(key) if property_def is None: - continue + # for quantities using full storage, the key does not match the property name + # check the potential full storage + if key.endswith(_storage_suffix): + property_def = self.m_def.all_properties.get(key[:-len(_storage_suffix)]) + + if property_def is None: + continue + + assert property_def.full_storage, f'Property {key} is not a full storage property' if isinstance(property_def, SubSection): for sub_section in self.m_get_sub_sections(property_def): -- GitLab From f44db3094d27a91b76e00084f6bbbf0afafcb994 Mon Sep 17 00:00:00 2001 From: Markus Scheidgen Date: Mon, 26 Sep 2022 12:16:25 +0200 Subject: [PATCH 10/22] Fixed wrong assertion for full storage traversal. --- nomad/metainfo/metainfo.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index 758b4bd9b..c2252cc55 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -2301,12 +2301,11 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas # check the potential full storage if key.endswith(_storage_suffix): property_def = self.m_def.all_properties.get(key[:-len(_storage_suffix)]) + assert property_def.use_full_storage, f'Property {key} is not a full storage property' if property_def is None: continue - assert property_def.full_storage, f'Property {key} is not a full storage property' - if isinstance(property_def, SubSection): for sub_section in self.m_get_sub_sections(property_def): for i in sub_section.m_traverse(): -- GitLab From 6ca4403095bc1b2487841b7394cd902896ed7ba3 Mon Sep 17 00:00:00 2001 From: Markus Scheidgen Date: Mon, 26 Sep 2022 13:55:52 +0200 Subject: [PATCH 11/22] Improvements to UI support for full storage quantities. #1037 --- gui/src/components/archive/ArchiveBrowser.js | 41 ++++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/gui/src/components/archive/ArchiveBrowser.js b/gui/src/components/archive/ArchiveBrowser.js index 8afc89156..9327b2e68 100644 --- a/gui/src/components/archive/ArchiveBrowser.js +++ b/gui/src/components/archive/ArchiveBrowser.js @@ -575,8 +575,8 @@ class UnresolvedReferenceAdaptor extends ArchiveAdaptor { class QuantityAdaptor extends ArchiveAdaptor { async itemAdaptor(key) { const attribute = this.def.attributes.find(attr => attr.name === key) - const value = this.obj.m_attributes[key] if (attribute) { + const value = this.obj?.m_attributes[key] return await this.adaptorFactory(this.parsedBaseUrl, value, attribute) } @@ -612,22 +612,26 @@ function QuantityItemPreview({value, def}) { } if (def.shape.length > 0) { const dimensions = [] - let current = value - for (let i = 0; i < def.shape.length; i++) { - dimensions.push(current.length) - current = current[0] - } - let typeLabel - if (def.type.type_kind === 'python') { - typeLabel = 'list' - } else { - if (dimensions.length === 1) { - typeLabel = 'vector' - } else if (dimensions.length === 2) { - typeLabel = 'matrix' + let typeLabel = 'unknown' + try { + let current = value + for (let i = 0; i < def.shape.length; i++) { + dimensions.push(current.length) + current = current[0] + } + if (def.type.type_kind === 'python') { + typeLabel = 'list' } else { - typeLabel = 'tensor' + if (dimensions.length === 1) { + typeLabel = 'vector' + } else if (dimensions.length === 2) { + typeLabel = 'matrix' + } else { + typeLabel = 'tensor' + } } + } catch (e) { + console.error('Quantity shape did not fit quantity value.', e) } return @@ -969,7 +973,12 @@ function SubSection({subSectionDef, section, editable}) { sectionDef._properties[key] && sectionDef._properties[key].m_def === QuantityMDef )) } - const labelQuantity = itemLabelKey && sectionDef._properties[itemLabelKey] + let labelQuantity = itemLabelKey && sectionDef._properties[itemLabelKey] + if (labelQuantity && quantityUsesFullStorage(labelQuantity)) { + // We do not yet support label quantities that use full storage + labelQuantity = undefined + itemLabelKey = undefined + } const getItemLabel = item => { if (labelQuantity) { const value = item[itemLabelKey] -- GitLab From 0503c1e62768f2fdb92597873c5370795d643122 Mon Sep 17 00:00:00 2001 From: Markus Scheidgen Date: Mon, 26 Sep 2022 14:11:57 +0200 Subject: [PATCH 12/22] Improvements to UI support for full storage quantities. #1035 --- gui/src/components/archive/ArchiveBrowser.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/src/components/archive/ArchiveBrowser.js b/gui/src/components/archive/ArchiveBrowser.js index 9327b2e68..f4a64183c 100644 --- a/gui/src/components/archive/ArchiveBrowser.js +++ b/gui/src/components/archive/ArchiveBrowser.js @@ -574,9 +574,9 @@ class UnresolvedReferenceAdaptor extends ArchiveAdaptor { class QuantityAdaptor extends ArchiveAdaptor { async itemAdaptor(key) { - const attribute = this.def.attributes.find(attr => attr.name === key) + const attribute = this.def?.attributes?.find(attr => attr.name === key) if (attribute) { - const value = this.obj?.m_attributes[key] + const value = this.obj?.m_attributes?.[key] return await this.adaptorFactory(this.parsedBaseUrl, value, attribute) } -- GitLab From e28b78b909031d35557a0a38a11f89d561651b9d Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Mon, 26 Sep 2022 19:13:16 +0200 Subject: [PATCH 13/22] Remove storage suffix --- nomad/metainfo/metainfo.py | 90 ++++++++++++++---------------- nomad/metainfo/metainfo_utility.py | 26 +-------- 2 files changed, 43 insertions(+), 73 deletions(-) diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index c2252cc55..4b3c0dda0 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -16,30 +16,30 @@ # limitations under the License. # +import base64 +import importlib +import inspect import itertools -from typing import Type, TypeVar, Union, Tuple, Iterable, List, Any, Dict, Set, \ - Callable as TypingCallable, cast, Optional -from collections.abc import Iterable as IterableABC +import json +import re import sys +from collections.abc import Iterable as IterableABC from functools import reduce -import inspect -import re -import json -import base64 -import importlib +from typing import Any, Callable as TypingCallable, Dict, Iterable, List, Optional, Set, Tuple, Type, \ + TypeVar, Union, cast +import docstring_parser +import jmespath import numpy as np import pandas as pd import pint -import docstring_parser -import jmespath from nomad.config import process from nomad.metainfo.metainfo_utility import Annotation, DefinitionAnnotation, MEnum, MQuantity, MRegEx, \ - MSubSectionList, MTypes, ReferenceURL, SectionAnnotation, _storage_suffix, check_dimensionality, convert_to, \ - default_hash, dict_to_named_list, normalize_datetime, resolve_variadic_name, retrieve_attribute, \ - split_python_definition, to_dict, to_numpy, to_section_def, to_storage_name, validate_shape, validate_url, \ - check_unit, _delta_symbols + MSubSectionList, MTypes, ReferenceURL, SectionAnnotation, _delta_symbols, check_dimensionality, \ + check_unit, convert_to, default_hash, dict_to_named_list, normalize_datetime, resolve_variadic_name, \ + retrieve_attribute, split_python_definition, to_dict, to_numpy, to_section_def, validate_shape, \ + validate_url from nomad.units import ureg as units m_package: Optional['Package'] = None @@ -1229,7 +1229,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if not isinstance(m_definition, Quantity) or not m_definition.use_full_storage: return getattr(self, m_definition.name) - m_storage: dict = self.__dict__.get(to_storage_name(m_definition), None) + m_storage: dict = self.__dict__.get(m_definition.name, None) if m_storage is None: return None @@ -1304,12 +1304,11 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if quantity_def.derived is not None: raise MetainfoError(f'The quantity {quantity_def} is derived and cannot be set.') - # full storage suffix - full_name: str = to_storage_name(quantity_def) + item_name: str = quantity_def.name if value is None: # This implements the implicit "unset" semantics of assigned None as a value - to_remove = self.__dict__.pop(full_name, None) + to_remove = self.__dict__.pop(item_name, None) # if full storage is used, also need to clear quantities created for convenient access if quantity_def.use_full_storage and to_remove: # self.__dict__[full_name] is guaranteed to be a 'dict[str, MQuantity]' @@ -1340,7 +1339,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas raise MetainfoError( f'Only numpy arrays and dtypes can be used for higher dimensional quantities: {quantity_def}') - self.__dict__[full_name] = value + self.__dict__[item_name] = value else: # it is a repeating quantity w/o attributes # the actual value/name/unit would be wrapped into 'MQuantity' @@ -1351,26 +1350,26 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas m_quantity = value if not quantity_def.variable: if not m_quantity.name: - m_quantity.name = quantity_def.name - elif m_quantity.name != quantity_def.name: - raise MetainfoError(f"The name of {value} must match definition name {quantity_def.name}") + m_quantity.name = item_name + elif m_quantity.name != item_name: + raise MetainfoError(f"The name of {value} must match definition name {item_name}") else: if not m_quantity.name: - raise MetainfoError(f"The name must be provided for variadic quantity {quantity_def.name}") + raise MetainfoError(f"The name must be provided for variadic quantity {item_name}") # swap to add attributes via the setter to allow validation m_attribute = m_quantity.attributes m_quantity.attributes = {} elif not quantity_def.variable: try: - m_quantity = self.__dict__[full_name][quantity_def.name] + m_quantity = self.__dict__[item_name][item_name] if isinstance(value, pint.Quantity): m_quantity.value = value.m m_quantity.unit = value.u else: m_quantity.value = value except KeyError: - m_quantity = MQuantity(quantity_def.name, value) + m_quantity = MQuantity(item_name, value) else: raise MetainfoError("Variadic quantities only accept raw values wrapped in 'MQuantity'") @@ -1412,10 +1411,10 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas f'Only numpy arrays and dtypes can be used for higher dimensional quantities: {quantity_def}') # store under variable name with suffix - if full_name in self.__dict__: - self.__dict__[full_name][m_quantity.name] = m_quantity + if item_name in self.__dict__: + self.__dict__[item_name][m_quantity.name] = m_quantity else: - self.__dict__[full_name] = {m_quantity.name: m_quantity} + self.__dict__[item_name] = {m_quantity.name: m_quantity} for k, v in m_attribute.items(): self.m_set_quantity_attribute(m_quantity.name, k, v) @@ -1429,7 +1428,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if not full: return quantity_def.__get__(self, Quantity) - return self.__dict__[to_storage_name(quantity_def)] + return self.__dict__[quantity_def.name] def m_get_quantity_definition(self, quantity_name: str, hint: Optional[str] = None): ''' @@ -1445,7 +1444,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if quantity_def.derived is not None: return True - return quantity_def.name in self.__dict__ or to_storage_name(quantity_def) in self.__dict__ + return quantity_def.name in self.__dict__ def m_add_values(self, quantity_def: 'Quantity', values: Any, offset: int) -> None: ''' Add (partial) values for the given quantity of higher dimensionality. ''' @@ -1600,7 +1599,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas raise MetainfoError(f'Invalid shape for attribute: {tgt_attr}.') if isinstance(tgt_def, Quantity) and tgt_def.use_full_storage: - m_storage: Optional[dict] = self.__dict__.get(to_storage_name(tgt_def), None) + m_storage: Optional[dict] = self.__dict__.get(tgt_def.name, None) m_quantity: Optional[MQuantity] = m_storage.get(tgt_property, None) if m_storage else None if m_quantity is None: m_quantity = MQuantity(tgt_name, None) @@ -1639,7 +1638,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas return self.__dict__['m_attributes'].get(attr_name, None) # quantity attributes - m_storage: Optional[dict] = self.__dict__.get(to_storage_name(tgt_def), None) + m_storage: Optional[dict] = self.__dict__.get(tgt_def.name, None) if m_storage is None: return None @@ -1966,7 +1965,8 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas def serialize_full_quantity(quantity_def: 'Quantity', values: Dict[str, MQuantity]): result: dict = {} for m_quantity in values.values(): - m_result: dict = {'m_value': serialize_quantity(quantity_def, True, False, None, m_quantity.value)} + m_result: dict = { + 'm_value': serialize_quantity(quantity_def, True, False, None, m_quantity.value)} if m_quantity.unit: m_result['m_unit'] = str(m_quantity.unit) if m_quantity.original_unit: @@ -2065,14 +2065,15 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas if not quantity.use_full_storage: yield name, serialize_quantity(quantity, is_set, False, path) else: - yield name, serialize_full_quantity(quantity, self.__dict__[to_storage_name(quantity)]) + yield name, serialize_full_quantity(quantity, self.__dict__[quantity.name]) except ValueError as e: raise ValueError(f'Value error ({str(e)}) for {quantity}') # section attributes if 'm_attributes' in self.__dict__: - yield 'm_attributes', collect_attributes(self.__dict__['m_attributes'], self.m_def.all_attributes) + yield 'm_attributes', collect_attributes( + self.__dict__['m_attributes'], self.m_def.all_attributes) # subsections for name, sub_section_def in self.m_def.all_sub_sections.items(): @@ -2297,14 +2298,7 @@ class MSection(metaclass=MObjectMeta): # TODO find a way to make this a subclas for key in self.__dict__: property_def = self.m_def.all_properties.get(key) if property_def is None: - # for quantities using full storage, the key does not match the property name - # check the potential full storage - if key.endswith(_storage_suffix): - property_def = self.m_def.all_properties.get(key[:-len(_storage_suffix)]) - assert property_def.use_full_storage, f'Property {key} is not a full storage property' - - if property_def is None: - continue + continue if isinstance(property_def, SubSection): for sub_section in self.m_get_sub_sections(property_def): @@ -3079,11 +3073,11 @@ class Quantity(Property): def __get__(self, obj, cls): try: - try: - value = obj.__dict__[self.name] - except KeyError: - # ! can only directly build the key here due to infinite recursion - m_quantity = obj.__dict__[f'{self.name}{_storage_suffix}'][self.name] + value = obj.__dict__[self.name] + # appears to be a quantity using full storage + # cannot use .use_full_storage as this is not set yet + if isinstance(value, dict) and self.name in value: + m_quantity = value[self.name] if m_quantity.unit: value = units.Quantity(m_quantity.value, m_quantity.unit) else: diff --git a/nomad/metainfo/metainfo_utility.py b/nomad/metainfo/metainfo_utility.py index 46264a059..5f9ab5081 100644 --- a/nomad/metainfo/metainfo_utility.py +++ b/nomad/metainfo/metainfo_utility.py @@ -35,7 +35,7 @@ from nomad.units import ureg __hash_method = 'sha1' # choose from hashlib.algorithms_guaranteed -_storage_suffix = '_full' +_storage_suffix = '' _delta_symbols = {'delta_', 'Δ'} @@ -365,30 +365,6 @@ def to_dict(entries): return entries -def to_storage_name(quantity) -> str: - ''' - Returns the name used for storage. - - If the quantity requires full storage due to, for example, being repeating, the value and - other metadata will be wrapped into a 'MQuantity' and stored in a map under the full name. - - If the quantity does not require full storage, the value will be stored directly under the - original name. - - If the quantity is an attribute, the full name will be the corresponding section key. - - This function checks and returns the proper name to be used to access the storage. - - Arguments: - quantity: the quantity definition 'Quantity' to be checked - ''' - - if quantity.use_full_storage: - return f'{quantity.name}{_storage_suffix}' - - return quantity.name - - def convert_to(from_magnitude, from_unit: Optional[ureg.Unit], to_unit: Optional[ureg.Unit]): ''' Convert a magnitude from one unit to another. -- GitLab From 8518124da4d75955ec92c4b4bfc1829147af48f6 Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Tue, 27 Sep 2022 16:36:14 +0200 Subject: [PATCH 14/22] Fix after merge --- dependencies/parsers/nexus | 2 +- nomad/metainfo/metainfo.py | 54 ------------------------------ nomad/metainfo/metainfo_utility.py | 6 ++-- tests/metainfo/test_yaml_schema.py | 6 ++-- 4 files changed, 7 insertions(+), 61 deletions(-) diff --git a/dependencies/parsers/nexus b/dependencies/parsers/nexus index cada3606c..13ddffbdc 160000 --- a/dependencies/parsers/nexus +++ b/dependencies/parsers/nexus @@ -1 +1 @@ -Subproject commit cada3606c0379d2de4ba55297c866d35552ca3df +Subproject commit 13ddffbdcc8a098a411691f1e54d8250e170d091 diff --git a/nomad/metainfo/metainfo.py b/nomad/metainfo/metainfo.py index 3a8aafb73..ef41df4d2 100644 --- a/nomad/metainfo/metainfo.py +++ b/nomad/metainfo/metainfo.py @@ -49,60 +49,6 @@ Elasticsearch = TypeVar('Elasticsearch') MSectionBound = TypeVar('MSectionBound', bound='MSection') SectionDefOrCls = Union['Section', 'SectionProxy', Type['MSection']] T = TypeVar('T') -_hash_method = 'sha1' # choose from hashlib.algorithms_guaranteed -reserved_name_re = re.compile(r'^(m_|a_|_+).*$') - -_primitive_types = { - str: lambda v: None if v is None else str(v), - # TODO it is more complicated than that, because bytes cannot be naturally serialized to JSON - # bytes: lambda v: None if v is None else bytes(v), - int: int, - float: lambda v: None if v is None else float(v), - bool: bool, - np.bool_: bool} - -primitive_type_aliases = {'string': str, 'boolean': bool} - -_primitive_type_names = { - primitive_type.__name__: primitive_type for primitive_type in _primitive_types} - -_primitive_type_names.update(primitive_type_aliases) - -_types_int_numpy = {np.int8, np.int16, np.int32, np.int64, np.uint8, np.uint16, np.uint32, np.uint64} -_types_int_python = {int} -_types_int = _types_int_python | _types_int_numpy -_types_float_numpy = {np.float16, np.float32, np.float64} -_types_float_python = {float} -_types_float = _types_float_python | _types_float_numpy -_types_num_numpy = _types_int_numpy | _types_float_numpy -_types_num_python = _types_int_python | _types_float_python -_types_num = _types_num_python | _types_num_numpy -_types_str_numpy = {np.str_} -_types_bool_numpy = {np.bool_} -_types_numpy = _types_num_numpy | _types_str_numpy | _types_bool_numpy -_delta_symbols = {'delta_', 'Δ'} - -validElnTypes = { - 'str': ['str', 'string'], - 'bool': ['bool', 'boolean'], - 'number': [x.__name__ for x in _types_num_python] + [f'np.{x.__name__}' for x in _types_num_numpy], - 'datetime': ['Datetime'], - 'enum': ['{type_kind: Enum, type_data: [Operator, Responsible_person]}'], - 'user': ['User'], - 'author': ['Author'], - 'reference': [''] -} - -validElnComponents = { - 'str': ['StringEditQuantity', 'FileEditQuantity', 'RichTextEditQuantity', 'EnumEditQuantity'], - 'bool': ['BoolEditQuantity'], - 'number': ['NumberEditQuantity', 'SliderEditQuantity'], - 'datetime': ['DateTimeEditQuantity'], - 'enum': ['EnumEditQuantity', 'AutocompleteEditQuantity', 'RadioEnumEditQuantity'], - 'user': ['UserEditQuantity'], - 'author': ['AuthorEditQuantity'], - 'reference': ['ReferenceEditQuantity'] -} _unset_value = '__UNSET__' diff --git a/nomad/metainfo/metainfo_utility.py b/nomad/metainfo/metainfo_utility.py index 5f9ab5081..2bc14fb6b 100644 --- a/nomad/metainfo/metainfo_utility.py +++ b/nomad/metainfo/metainfo_utility.py @@ -70,7 +70,7 @@ class MTypes: bool: lambda v: None if v is None else bool(v), np.bool_: lambda v: None if v is None else bool(v)} - primitive_name = {v.__name__: v for v in primitive} + primitive_name = {**{v.__name__: v for v in primitive}, 'string': str, 'boolean': bool} int_numpy = {np.int8, np.int16, np.int32, np.int64, np.uint8, np.uint16, np.uint32, np.uint64} int_python = {int} @@ -86,8 +86,8 @@ class MTypes: numpy = num_numpy | str_numpy | bool_numpy eln = { - 'str': ['str'], - 'bool': ['bool'], + 'str': ['str', 'string'], + 'bool': ['bool', 'boolean'], 'number': [x.__name__ for x in num_python] + [f'np.{x.__name__}' for x in num_numpy], 'datetime': ['Datetime'], 'enum': ['{type_kind: Enum, type_data: [Operator, Responsible_person]}'], diff --git a/tests/metainfo/test_yaml_schema.py b/tests/metainfo/test_yaml_schema.py index 4c6698a30..078d17315 100644 --- a/tests/metainfo/test_yaml_schema.py +++ b/tests/metainfo/test_yaml_schema.py @@ -3,7 +3,7 @@ import pytest import yaml from nomad.datamodel.data import UserReference, AuthorReference -from nomad.metainfo.metainfo import validElnComponents, validElnTypes, primitive_type_aliases, MTypes +from nomad.metainfo.metainfo import MTypes from nomad.utils import strip from nomad.metainfo import Package, MSection, Quantity, Reference, SubSection, Section, MProxy, MetainfoError @@ -267,8 +267,8 @@ def test_datatype_component_annotations(eln_type, eln_component): quantity = process['quantities'][0] if type(quantity.type).__name__ != 'type': type_name = type(quantity.type).__name__ - if type_name in primitive_type_aliases.keys(): - type_name = primitive_type_aliases[type_name].__name__ + if type_name in MTypes.primitive_name: + type_name = MTypes.primitive_name[type_name].__name__ package.__init_metainfo__() assert isinstance(exception.value, MetainfoError) assert exception.value.args[0] == 'One constraint was violated: The component `%s` is not compatible with the quantity `%s` of the type `%s`. Accepted components: %s (there are 0 more violations)' \ -- GitLab From f5c14bd02ae4ce41b38e9557967f16531d257196 Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Tue, 27 Sep 2022 18:34:28 +0200 Subject: [PATCH 15/22] Update --- dependencies/parsers/nexus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies/parsers/nexus b/dependencies/parsers/nexus index 13ddffbdc..bc0119a0b 160000 --- a/dependencies/parsers/nexus +++ b/dependencies/parsers/nexus @@ -1 +1 @@ -Subproject commit 13ddffbdcc8a098a411691f1e54d8250e170d091 +Subproject commit bc0119a0b9e29c4dc904a9e965b389662a51fff4 -- GitLab From ea37be9727fdbcf9bf1db31054a04060f348df8a Mon Sep 17 00:00:00 2001 From: "tlc@void" Date: Wed, 28 Sep 2022 16:57:01 +0200 Subject: [PATCH 16/22] Add nexus metainfo and parser and test --- dependencies/parsers/nexus | 2 +- nomad/metainfo/nexus.py | 624 ++++++++++++++++++ nomad/parsing/metadata.yaml | 64 ++ nomad/parsing/nexus.py | 250 +++++++ nomad/parsing/parsers.py | 2 +- requirements.txt | 1 + .../data/parsers/nexus/201805_WSe2_arpes.nxs | Bin 0 -> 1312143 bytes tests/parsing/test_parsing.py | 5 +- 8 files changed, 944 insertions(+), 4 deletions(-) create mode 100644 nomad/metainfo/nexus.py create mode 100644 nomad/parsing/metadata.yaml create mode 100644 nomad/parsing/nexus.py create mode 100755 tests/data/parsers/nexus/201805_WSe2_arpes.nxs diff --git a/dependencies/parsers/nexus b/dependencies/parsers/nexus index bc0119a0b..b33cbd8d5 160000 --- a/dependencies/parsers/nexus +++ b/dependencies/parsers/nexus @@ -1 +1 @@ -Subproject commit bc0119a0b9e29c4dc904a9e965b389662a51fff4 +Subproject commit b33cbd8d59012b95082d4e604d12c1972c29f417 diff --git a/nomad/metainfo/nexus.py b/nomad/metainfo/nexus.py new file mode 100644 index 000000000..41046174d --- /dev/null +++ b/nomad/metainfo/nexus.py @@ -0,0 +1,624 @@ +# +# Copyright The NOMAD Authors. +# +# This file is part of NOMAD. See https://nomad-lab.eu for further info. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +import os +import os.path +import re +import sys +# noinspection PyPep8Naming +import xml.etree.ElementTree as ET +from typing import Dict, Optional, Union + +import numpy as np +from toposort import toposort_flatten + +from nexusparser.tools import nexus +from nomad.datamodel import EntryArchive +from nomad.metainfo import Attribute, Bytes, Datetime, Definition, MEnum, Package, Property, Quantity, Section, \ + SubSection +from nomad.utils import get_logger, strip + +# __URL_REGEXP from +# https://stackoverflow.com/questions/3809401/what-is-a-good-regular-expression-to-match-a-url +__URL_REGEXP = re.compile( + r'(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)' + r'(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+' + r'(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))') +# noinspection HttpUrlsUsage +__XML_NAMESPACES = {'nx': 'http://definition.nexusformat.org/nxdl/3.1'} + +# TO DO the validation still show some problems. Most notably there are a few higher +# dimensional fields with non number types, which the metainfo does not support + +__section_definitions: Dict[str, Section] = dict() + +__logger = get_logger(__name__) + +VALIDATE = False + +__XML_PARENT_MAP: Dict[ET.Element, ET.Element] +__NX_DOC_BASE = 'https://manual.nexusformat.org/classes' +__NX_TYPES = { # Primitive Types, 'ISO8601' is the only type not defined here + 'NX_COMPLEX': np.float64, + 'NX_FLOAT': np.float64, + 'NX_CHAR': str, + 'NX_BOOLEAN': bool, + 'NX_INT': np.int64, + 'NX_UINT': np.uint64, + 'NX_NUMBER': np.float64, + 'NX_POSINT': np.uint64, + 'NX_BINARY': Bytes, + 'NX_DATE_TIME': Datetime +} + + +class NXUnitSet: + ''' + maps from `NX_` token to dimensionality + None -> disable dimensionality check + '1' -> dimensionless quantities + 'transformation' -> Specially handled in metainfo + ''' + mapping: dict = { + 'NX_ANGLE': '[angle]', + 'NX_ANY': None, + 'NX_AREA': '[area]', + 'NX_CHARGE': '[charge]', + 'NX_COUNT': '1', + 'NX_CROSS_SECTION': '[area]', + 'NX_CURRENT': '[current]', + 'NX_DIMENSIONLESS': '1', + 'NX_EMITTANCE': '[length] * [angle]', + 'NX_ENERGY': '[energy]', + 'NX_FLUX': '1 / [time] / [area]', + 'NX_FREQUENCY': '[frequency]', + 'NX_LENGTH': '[length]', + 'NX_MASS': '[mass]', + 'NX_MASS_DENSITY': '[mass] / [volume]', + 'NX_MOLECULAR_WEIGHT': '[mass] / [substance]', + 'NX_PERIOD': '[time]', + 'NX_PER_AREA': '1 / [area]', + 'NX_PER_LENGTH': '1 / [length]', + 'NX_POWER': '[power]', + 'NX_PRESSURE': '[pressure]', + 'NX_PULSES': '1', + 'NX_SCATTERING_LENGTH_DENSITY': '1 / [area]', + 'NX_SOLID_ANGLE': '[angle] * [angle]', + 'NX_TEMPERATURE': '[temperature]', + 'NX_TIME': '[time]', + 'NX_TIME_OF_FLIGHT': '[time]', + 'NX_TRANSFORMATION': 'transformation', + 'NX_UNITLESS': '1', + 'NX_VOLTAGE': '[energy] / [current] / [time]', + 'NX_VOLUME': '[volume]', + 'NX_WAVELENGTH': '[length]', + 'NX_WAVENUMBER': '1 / [length]' + } + + @staticmethod + def normalise(value: str) -> str: + ''' + Normalise the given token + ''' + value = value.upper() + if not value.startswith('NX_'): + value = 'NX_' + value + return value + + @staticmethod + def is_nx_token(value: str) -> bool: + ''' + Check if a given token is one of NX tokens + ''' + return NXUnitSet.normalise(value) in NXUnitSet.mapping.keys() + + +def __to_camel_case(snake_str: str, upper: bool = False) -> str: + ''' + Take as input a snake case variable and return a camel case one + ''' + components = snake_str.split('_') + + if upper: + return ''.join(x.capitalize() for x in components) + + return components[0] + ''.join(x.capitalize() for x in components[1:]) + + +def __to_root(xml_node: ET.Element) -> ET.Element: + ''' + get the root element + ''' + elem = xml_node + while True: + parent = __XML_PARENT_MAP.get(elem) + if parent is None: + break + elem = parent + + return elem + + +def __if_base(xml_node: ET.Element) -> bool: + ''' + retrieves the category from the root element + ''' + return __to_root(xml_node).get('category') == 'base' + + +def __if_repeats(name: str, max_occurs: str) -> bool: + repeats = any(char.isupper() for char in name) or max_occurs == 'unbounded' + + if max_occurs.isdigit(): + repeats = repeats or int(max_occurs) > 1 + + return repeats + + +def __if_template(name: Optional[str]) -> bool: + return name is None or name.lower() != name + + +def __get_documentation_url( + xml_node: ET.Element, nx_type: Optional[str]) -> Optional[str]: + ''' + Get documentation url + ''' + if nx_type is None: + return None + + anchor_segments = [] + if nx_type != 'class': + anchor_segments.append(nx_type) + + while True: + nx_type = xml_node.get('type') + if nx_type: + nx_type = nx_type.replace('NX', '') + segment = xml_node.get('name', nx_type) # type: ignore + anchor_segments.append(segment.replace('_', '-')) + + xml_parent = xml_node + xml_node = __XML_PARENT_MAP.get(xml_node) + if xml_node is None: + break + + nx_package = xml_parent.get('nxdl_base').split('/')[-1] + anchor = "-".join([name.lower() for name in reversed(anchor_segments)]) + return f'{__NX_DOC_BASE}/{nx_package}/{anchor_segments[-1]}.html#{anchor}' + + +def __to_section(name: str, **kwargs) -> Section: + ''' + Returns the 'existing' metainfo section for a given top-level nexus base-class name. + + This function ensures that sections for these base-classes are only created one. + This allows to access the metainfo section even before it is generated from the base + class nexus definition. + ''' + if name in __section_definitions: + section = __section_definitions[name] + section.more.update(**kwargs) + return section + + section = Section(validate=VALIDATE, name=name, **kwargs) + + __section_definitions[name] = section + + return section + + +def __get_enumeration(xml_node: ET.Element) -> Optional[MEnum]: + ''' + Get the enumeration field from xml node + ''' + enumeration = xml_node.find('nx:enumeration', __XML_NAMESPACES) + if enumeration is None: + return None + + items = enumeration.findall('nx:item', __XML_NAMESPACES) + + return MEnum([value.attrib['value'] for value in items]) + + +def __add_common_properties(xml_node: ET.Element, definition: Definition): + ''' + Adds general metainfo definition properties (e.g., deprecated, docs, optional, ...) + from the given nexus XML node to the given metainfo definition. + ''' + xml_attrs = xml_node.attrib + + # Read properties from potential base section. Those are not inherited, but we + # duplicate them for a nicer presentation + if isinstance(definition, Section) and definition.base_sections: + base_section = definition.base_sections[0] + if base_section.description: + definition.description = base_section.description + if base_section.deprecated: + definition.deprecated = base_section.deprecated + if base_section.more: + definition.more.update(**base_section.more) + + links = [] + doc_url = __get_documentation_url(xml_node, definition.more.get('nx_kind')) + if doc_url: + links.append(doc_url) + + doc = xml_node.find('nx:doc', __XML_NAMESPACES) + if doc is not None and doc.text is not None: + definition.description = strip(doc.text) + links.extend([match[0] for match in __URL_REGEXP.findall(definition.description)]) + + if links: + definition.links = links + + for key, value in xml_attrs.items(): + if key == 'deprecated': + definition.deprecated = value + continue + if 'nxdl_base' in key or 'schemaLocation' in key: + continue + definition.more['nx_' + key] = value + + if 'optional' not in xml_attrs: + definition.more['nx_optional'] = __if_base(xml_node) + + +def __create_attributes(xml_node: ET.Element, definition: Union[Section, Property]): + ''' + Add all attributes in the given nexus XML node to the given + Quantity or SubSection using the Attribute class (new mechanism). + + todo: account for more attributes of attribute, e.g., default, minOccurs + ''' + for attribute in xml_node.findall('nx:attribute', __XML_NAMESPACES): + name = attribute.get('name') + + nx_enum = __get_enumeration(attribute) + if nx_enum: + nx_type = nx_enum + nx_shape = [] + else: + nx_type = __NX_TYPES[attribute.get('type', 'NX_CHAR')] # type: ignore + has_bound = False + has_bound |= 'minOccurs' in attribute.attrib + has_bound |= 'maxOccurs' in attribute.attrib + if has_bound: + nx_min_occurs = attribute.get('minOccurs', '0') # type: ignore + nx_max_occurs = attribute.get('maxOccurs', '*') # type: ignore + if nx_max_occurs == 'unbounded': + nx_max_occurs = '*' + nx_shape = [f'{nx_min_occurs}..{nx_max_occurs}'] + else: + nx_shape = [] + + # check if the attribute exist + # if yes then modify directly + # if not create a new one and append to the list + for m_attribute in definition.attributes: + if m_attribute.name == name: + m_attribute.shape = nx_shape + m_attribute.type = nx_type + + for name, value in attribute.items(): + m_attribute.more[f'nx_{name}'] = value + + break + else: + m_attribute = Attribute( + name=name, variable=__if_template(name), shape=nx_shape, type=nx_type) + + for name, value in attribute.items(): + m_attribute.more[f'nx_{name}'] = value + + definition.attributes.append(m_attribute) + + +def __create_field(xml_node: ET.Element, container: Section) -> Quantity: + ''' + Creates a metainfo quantity from the nexus field given as xml node. + ''' + xml_attrs = xml_node.attrib + + # name + assert 'name' in xml_attrs, 'Expecting name to be present' + name = xml_attrs['name'] + + # type + nx_type = xml_attrs.get('type', 'NX_CHAR') + if nx_type not in __NX_TYPES: + raise NotImplementedError(f'Type {nx_type} is not supported for the moment for {name}.') + + # enumeration + enum_type = __get_enumeration(xml_node) + + # dimensionality + nx_dimensionality = xml_attrs.get('units', None) + if nx_dimensionality: + if nx_dimensionality not in NXUnitSet.mapping: + raise NotImplementedError(f'Unit {nx_dimensionality} is not supported for {name}.') + dimensionality = NXUnitSet.mapping[nx_dimensionality] + else: + dimensionality = None + + # shape + shape: list = [] + dimensions = xml_node.find('nx:dimensions', __XML_NAMESPACES) + if dimensions is not None: + for dimension in dimensions.findall('nx:dim', __XML_NAMESPACES): + dimension_value: str = dimension.attrib.get('value', '0..*') + if dimension_value.isdigit(): + dimension_value: int = int(dimension_value) + elif dimension_value == 'n': + dimension_value = '0..*' + + shape.append(dimension_value) + + value_quantity: Quantity = None # type: ignore + + # copy from base to inherit from it + if container.base_sections is not None: + base_quantity: Quantity = container.base_sections[0].all_quantities.get(name) + if base_quantity: + value_quantity = base_quantity.m_copy(deep=True) + + # create quantity + if value_quantity is None: + value_quantity = Quantity(name=name, flexible_unit=True) + + value_quantity.variable = __if_template(name) + + # check parent type compatibility + parent_type = getattr(value_quantity, 'type', None) + if not isinstance(parent_type, MEnum): + # if parent type is not MEnum then overwrite whatever given + value_quantity.type = enum_type if enum_type else __NX_TYPES[nx_type] + elif enum_type: + # only when derived type is also MEnum to allow overwriting + value_quantity.type = enum_type + + value_quantity.dimensionality = dimensionality + value_quantity.shape = shape + value_quantity.more.update(dict(nx_kind='field', nx_type=nx_type)) + + __add_common_properties(xml_node, value_quantity) + __create_attributes(xml_node, value_quantity) + + container.quantities.append(value_quantity) + + return value_quantity + + +def __create_group(xml_node: ET.Element, root_section: Section): + ''' + Adds all properties that can be generated from the given nexus group XML node to + the given (empty) metainfo section definition. + ''' + __create_attributes(xml_node, root_section) + + for group in xml_node.findall('nx:group', __XML_NAMESPACES): + xml_attrs = group.attrib + + assert 'type' in xml_attrs, 'Expecting type to be present' + nx_type = xml_attrs['type'] + + nx_name = xml_attrs.get('name', nx_type) + group_section = Section(validate=VALIDATE, nx_kind='group', name=nx_name) + + __attach_base_section(group_section, root_section, __to_section(nx_type)) + __copy_base_attributes(group_section, nx_type) + __add_common_properties(group, group_section) + + nx_name = xml_attrs.get('name', nx_type.replace('NX', '').upper()) + group_subsection = SubSection( + section_def=group_section, + nx_kind='group', + name=nx_name, + repeats=__if_repeats(nx_name, xml_attrs.get('maxOccurs', '0')), + variable=__if_template(nx_name)) + + root_section.inner_section_definitions.append(group_section) + + root_section.sub_sections.append(group_subsection) + + __create_group(group, group_section) + + for field in xml_node.findall('nx:field', __XML_NAMESPACES): + __create_field(field, root_section) + + +def __attach_base_section(section: Section, container: Section, default: Section): + ''' + Potentially adds a base section to the given section, if the given container has + a base-section with a suitable base. + ''' + base_section = container.all_inner_section_definitions.get(section.name) + if base_section: + assert base_section.nx_kind == section.nx_kind, 'Base section has wrong kind' + else: + base_section = default + + section.base_sections = [base_section] + + +def __copy_base_attributes(destination: Section, source_name: str): + ''' + Copy attributes from base subsection to derived subsection. + + Attributes are stored in `SubSection.attributes` list. They are not inherited + thus need to be manually copied. + ''' + source: Section = __section_definitions.get(source_name) + + if not source or not destination or source is destination: + return + + for m_attribute in source.attributes: + destination.attributes.append(Attribute( + name=m_attribute.name, + type=m_attribute.type, + shape=m_attribute.shape, + variable=m_attribute.variable, + **m_attribute.more)) + + +def __create_class_section(xml_node: ET.Element) -> Section: + ''' + Creates a metainfo section from the top-level nexus definition given as xml node. + ''' + xml_attrs = xml_node.attrib + assert 'name' in xml_attrs, 'Expecting name to be present' + assert 'type' in xml_attrs, 'Expecting type to be present' + assert 'category' in xml_attrs, 'Expecting category to be present' + + nx_name = xml_attrs['name'] + nx_type = xml_attrs['type'] + nx_category = xml_attrs['category'] + + class_section: Section = __to_section( + nx_name, nx_kind=nx_type, nx_category=nx_category) + + if 'extends' in xml_attrs: + base_section = __to_section(xml_attrs['extends']) + class_section.base_sections = [base_section] + __copy_base_attributes(class_section, base_section.name) + + __add_common_properties(xml_node, class_section) + + __create_group(xml_node, class_section) + + return class_section + + +def __sort_nxdl_files(paths): + ''' + Sort all definitions based on dependencies + ''' + + name_node_map = {} + name_dependency_map = {} + for path in paths: + for nxdl_file in os.listdir(path): + if not nxdl_file.endswith('.nxdl.xml'): + continue + xml_node = ET.parse(os.path.join(path, nxdl_file)).getroot() + xml_node.set('nxdl_base', path) + assert xml_node.get('type') == 'group', 'definition is not a group' + xml_name = xml_node.get('name') + name_node_map[xml_name] = xml_node + dependency_list = [] + if 'extends' in xml_node.attrib: + dependency_list.append(xml_node.get('extends')) + for child in xml_node.iter(): + if child.tag.endswith('group') and child.get('type') != xml_name: + dependency_list.append(child.get('type')) + name_dependency_map[xml_name] = set(dependency_list) + + # manually remove deprecated circular dependency + name_dependency_map['NXgeometry'].remove('NXorientation') + name_dependency_map['NXgeometry'].remove('NXtranslation') + + sorted_nodes = toposort_flatten(name_dependency_map) + validated_names = [] + for node in sorted_nodes: + if node in name_node_map: + validated_names.append(name_node_map[node]) + else: + parent_nodes = [] + for name, dependencies in name_dependency_map.items(): + if node in dependencies: + parent_nodes.append(name) + __logger.error('Missing dependency (incorrect group type).', target_name=node, used_by=parent_nodes) + + return validated_names + + +def __add_section_from_nxdl(xml_node: ET.Element) -> Optional[Section]: + ''' + Creates a metainfo section from a nxdl file. + ''' + try: + global __XML_PARENT_MAP # pylint: disable=global-statement + __XML_PARENT_MAP = { + child: parent for parent in xml_node.iter() for child in parent} + + return __create_class_section(xml_node) + + except NotImplementedError as err: + __logger.error('Fail to generate metainfo.', target_name=xml_node.attrib['name'], exe_info=str(err)) + return None + + +def __create_package_from_nxdl_directories(nexus_section: Section) -> Package: + ''' + Creates a metainfo package from the given nexus directory. Will generate the + respective metainfo definitions from all the nxdl files in that directory. + ''' + package = Package(name='nexus') + + folder_list = ('base_classes', 'contributed_definitions', 'applications') + paths = [os.path.join( + nexus.get_nexus_definitions_path(), folder) for folder in folder_list] + + for nxdl_file in __sort_nxdl_files(paths): + section = __add_section_from_nxdl(nxdl_file) + if section is None: + continue + package.section_definitions.append(section) + nexus_section.sub_sections.append( + SubSection(section_def=section, name=section.name)) + + return package + + +nexus_metainfo_package: Optional[Package] = None # pylint: disable=C0103 + + +def init_nexus_metainfo(): + ''' + Initializes the metainfo package for the nexus definitions. + ''' + global nexus_metainfo_package # pylint: disable=global-statement + + if nexus_metainfo_package is not None: + return + + # We take the application definitions and create a common parent section that allows + # to include nexus in an EntryArchive. + nexus_section = Section(validate=VALIDATE, name='NeXus') + + nexus_metainfo_package = __create_package_from_nxdl_directories(nexus_section) + + EntryArchive.nexus = SubSection(name='nexus', section_def=nexus_section) + EntryArchive.nexus.init_metainfo() + EntryArchive.m_def.sub_sections.append(EntryArchive.nexus) + + nexus_metainfo_package.section_definitions.append(nexus_section) + + # We need to initialize the metainfo definitions. This is usually done automatically, + # when the metainfo schema is defined though MSection Python classes. + nexus_metainfo_package.init_metainfo() + + # We skip the Python code generation for now and offer Python classes as variables + # TO DO not necessary right now, could also be done case-by-case by the nexus parser + python_module = sys.modules[__name__] + for section in nexus_metainfo_package.section_definitions: # pylint: disable=E1133 + setattr(python_module, section.name, section.section_cls) + + +init_nexus_metainfo() diff --git a/nomad/parsing/metadata.yaml b/nomad/parsing/metadata.yaml new file mode 100644 index 000000000..3b918850d --- /dev/null +++ b/nomad/parsing/metadata.yaml @@ -0,0 +1,64 @@ +codeName: nexus +codeLabel: NeXus +codeCategory: Database manager +status: production +codeLabelStyle: 'capitals: N, X.' +codeUrl: https://www.nexusformat.org/ +parserDirName: dependencies/parsers/nexus/ +parserGitUrl: https://github.com/nomad-coe/nomad-parser-nexus.git +preamble: | + This is not a real parser, but an example template on how to write one. You can fork this repository to create actual parsers. + + ## Get started + + You should create a virtual environment. This is optional, but highly recommended as + the required nomad-lab pypi package requires many dependencies with specific versions + that might conflict with other libraries that you have installed. This was tested + with Python 3.7. + + ``` + pip install virtualenv + virtualenv -p `which python3` .pyenv + source .pyenv/bin/activate + ``` + + Simply install our pypi package with pip: + ``` + pip install --upgrade pip + pip install nomad-lab + ``` + + Clone this project (or fork and then clone the fork). Go into the cloned directly and + directly run the parser from there: + ``` + git clone https://github.com/nomad-coe/nomad-parser-nexus.git parser-nexus + cd parser-nexus + python -m nexusparser tests/data/nexus.out + ``` + + There are also a basic test framework written in [pytest](https://docs.pytest.org/en/stable/). + Install the remaining dev dependencies and run the tests with: + ``` + pip install -r requirements.txt + pytest -sv tests + ``` + + ## Next steps + + Our documentation provides several resources that might be interesting: + - [How to write a parser](https://nomad-lab.eu/prod/rae/docs/parser.html). Provides + a more detailed tutorial on how to write a parser. + - [Introduction to the NOMAD Metainfo](https://nomad-lab.eu/prod/rae/docs/metainfo.html). + This explains how NOMAD data schema and can be extended and used within your parser. + + To get you parser included in NOMAD or ask further questions, you can: + - Use our forums at [matsci.org](https://matsci.org/c/nomad/32) + - Open an issue on the [nexus-parser GitHub project](https://github.com/nomad-coe/nomad-parser-nexus/issues) + - Write to [support@nomad-lab.eu](mailto:support@nomad-lab.eu) + + **Note!** The rest of this README.md is the usual text that applies to all NOMAD parsers. + +tableOfFiles: | + |Input Filename| Description| + |--- | --- | + |`nexus.out` | **Mainfile** in NEXUS specific plain-text | diff --git a/nomad/parsing/nexus.py b/nomad/parsing/nexus.py new file mode 100644 index 000000000..e47bedd31 --- /dev/null +++ b/nomad/parsing/nexus.py @@ -0,0 +1,250 @@ +# +# Copyright The NOMAD Authors. +# +# This file is part of NOMAD. See https://nomad-lab.eu for further info. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +import os.path +import xml.etree.ElementTree as ET +from typing import Optional + +import numpy as np + +from nexusparser.tools import nexus as read_nexus +from nomad.datamodel import EntryArchive +from nomad.metainfo import MSection, nexus +from nomad.metainfo.metainfo_utility import MQuantity, resolve_variadic_name +from nomad.parsing import MatchingParser +from nomad.units import ureg +from nomad.utils import get_logger + +__logger = get_logger(__name__) + + +def _to_group_name(nx_node: ET.Element): + ''' + Normalise the given group name + ''' + return nx_node.attrib.get('name', nx_node.attrib['type'][2:].upper()) + + +# noinspection SpellCheckingInspection +def _to_section( + hdf_name: Optional[str], nx_def: str, nx_node: Optional[ET.Element], + current: MSection) -> MSection: + ''' + Args: + hdf_name : name of the hdf group/field/attribute (None for definition) + nx_def : application definition + nx_node : node in the nxdl.xml + current : current section in which the new entry needs to be picked up from + + Note that if the new element did not exist, it will be created + + Returns: + tuple: the new subsection + + The strict mapping is available between metainfo and nexus: + Group <-> SubSection + Field <-> Quantity + Attribute <-> SubSection.Attribute or Quantity.Attribute + + If the given nxdl_node is a Group, return the corresponding Section. + If the given nxdl_node is a Field, return the Section contains it. + If the given nxdl_node is an Attribute, return the associated Section or the + Section contains the associated Quantity. + ''' + + if hdf_name is None: + nomad_def_name = nx_def + elif nx_node.tag.endswith('group'): + # it is a new group + nomad_def_name = _to_group_name(nx_node) + else: + # no need to change section for quantities and attributes + return current + + # for groups, get the definition from the package + new_def = current.m_def.all_sub_sections[nomad_def_name] + + new_section: MSection = None # type:ignore + + for section in current.m_get_sub_sections(new_def): + if hdf_name is None or getattr(section, 'nx_name', None) == hdf_name: + new_section = section + break + + if new_section is None: + current.m_create(new_def.section_def.section_cls) + new_section = current.m_get_sub_section(new_def, -1) + new_section.__dict__['nx_name'] = hdf_name + + return new_section + + +def _get_value(hdf_node): + ''' + Get value from hdl5 node + ''' + + hdf_value = hdf_node[...] + if str(hdf_value.dtype) == 'bool': + val = bool(hdf_value) + elif hdf_value.dtype.kind in 'iufc': + val = hdf_value + else: + try: + val = str(hdf_value.astype(str)) + except UnicodeDecodeError: + val = str(hdf_node[()].decode()) + return val + + +def _populate_data(depth: int, nx_path: list, nx_def: str, hdf_node, current: MSection): + ''' + Populate attributes and fields + ''' + + if depth < len(nx_path): + # it is an attribute of either field or group + nx_attr = nx_path[depth] + nx_parent: ET.Element = nx_path[depth - 1] + + if isinstance(nx_attr, str): + if nx_attr != 'units': + # no need to handle units here + # as all quantities have flexible units + print(nx_attr) + else: + # get the name of parent (either field or group) + # which will be used to set attribute + # this is required by the syntax of metainfo mechanism + # due to variadic/template quantity names + parent_type = nx_parent.get('type').replace('NX', '').upper() + parent_name = nx_parent.get('name', parent_type) # type: ignore + + attr_name = nx_attr.get('name') + # by default, we assume it is a 1D array + attr_value = hdf_node.attrs[attr_name] + if not isinstance(attr_value, str): + attr_value = [value for value in attr_value] + if len(attr_value) == 1: + attr_value = attr_value[0] + + current = _to_section(attr_name, nx_def, nx_attr, current) + + try: + if nx_parent.tag.endswith('group'): + current.m_set_section_attribute(attr_name, attr_value) + else: + current.m_set_quantity_attribute(parent_name, attr_name, attr_value) + except Exception as e: + __logger.warning('Error while setting attribute.', target_name=attr_name, exe_info=str(e)) + else: + # it is a field + field = _get_value(hdf_node) + + # need to remove + if hdf_node[...].dtype.kind in 'iufc' and isinstance(field, np.ndarray) and field.size > 1: + field = np.array([np.mean(field), np.var(field), np.min(field), np.max(field)]) + + # get the corresponding field name + field_name = nx_path[-1].get('name') + metainfo_def = resolve_variadic_name(current.m_def.all_properties, field_name) + + # check if unit is given + unit = hdf_node.attrs.get('units', None) + + pint_unit: Optional[ureg.Unit] = None + + if unit: + try: + if unit != 'counts': + pint_unit = ureg.parse_units(unit) + else: + pint_unit = ureg.parse_units('1') + field = ureg.Quantity(field, pint_unit) + except ValueError: + pass + + if metainfo_def.use_full_storage: + field = MQuantity.wrap(field, hdf_node.name.split('/')[-1]) + elif metainfo_def.unit is None and pint_unit is not None: + metainfo_def.unit = pint_unit + + # may need to check if the given unit is in the allowable list + + try: + current.m_set(metainfo_def, field) + except Exception as e: + __logger.warning('Error while setting field.', target_name=field_name, exe_info=str(e)) + + +class NexusParser(MatchingParser): + ''' + NexusParser doc + ''' + + def __init__(self): + super().__init__( + metadata_path=os.path.join(os.path.dirname(__file__), 'metadata.yaml'), + mainfile_mime_re=r'(application/.*)|(text/.*)', + mainfile_name_re=r'.*\.nxs', + supported_compressions=['gz', 'bz2', 'xz'] + ) + self.archive: Optional[EntryArchive] = None + self.nx_root = None + + def __nexus_populate(self, params: dict, attr=None): # pylint: disable=W0613 + ''' + Walks through name_list and generate nxdl nodes + (hdf_info, nx_def, nx_path, val, logger) = params + ''' + + hdf_info: dict = params['hdf_info'] + nx_def: str = params['nxdef'] + nx_path: list = params['nxdl_path'] + + hdf_path: str = hdf_info['hdf_path'] + hdf_node = hdf_info['hdf_node'] + + if nx_path is None: + return + + current: MSection = _to_section(None, nx_def, None, self.nx_root) + depth: int = 1 + for name in hdf_path.split('/')[1:]: + nx_node = nx_path[depth] if depth < len(nx_path) else name + current = _to_section(name, nx_def, nx_node, current) + depth += 1 + + _populate_data(depth, nx_path, nx_def, hdf_node, current) + + def parse(self, mainfile: str, archive: EntryArchive, logger=None, child_archives=None): + self.archive = archive + self.archive.m_create(nexus.NeXus) # type: ignore # pylint: disable=no-member + self.nx_root = self.archive.nexus + + nexus_helper = read_nexus.HandleNexus(logger, [mainfile]) + nexus_helper.process_nexus_master_file(self.__nexus_populate) + + if archive.metadata is None: + return + + app_def: str = '' + for var in dir(archive.nexus): + if getattr(archive.nexus, var, None) is not None: + app_def = var + + archive.metadata.entry_type = app_def diff --git a/nomad/parsing/parsers.py b/nomad/parsing/parsers.py index d13396feb..f3e4310c1 100644 --- a/nomad/parsing/parsers.py +++ b/nomad/parsing/parsers.py @@ -29,7 +29,7 @@ from nomad.datamodel.context import Context, ClientContext from .parser import MissingParser, BrokenParser, Parser, ArchiveParser, MatchingParserInterface from .artificial import EmptyParser, GenerateRandomParser, TemplateParser, ChaosParser from .tabular import TabularDataParser -from nexusparser.parser import NexusParser +from .nexus import NexusParser try: diff --git a/requirements.txt b/requirements.txt index b763636cd..6f6713aef 100644 --- a/requirements.txt +++ b/requirements.txt @@ -91,6 +91,7 @@ oauthenticator==14.2.0 validators==0.18.2 aiofiles==0.8.0 joblib==1.1.0 +toposort==1.7 # [dev] markupsafe==2.0.1 diff --git a/tests/data/parsers/nexus/201805_WSe2_arpes.nxs b/tests/data/parsers/nexus/201805_WSe2_arpes.nxs new file mode 100755 index 0000000000000000000000000000000000000000..69eba9d4b66073f5e0bd40aee0c803d7b09fb633 GIT binary patch literal 1312143 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�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%0AVt=1+BlKisftv6}b{5t%>b6fn5TvEbyB%`| zZ*3luN8h#h`GBGiImKv&ON3n=+?a|(IT>~N=Zy6=I>jyPDdCOKH?c#@VoT{_C4v&o zf7_ENCH@Cl7ZCPzuouhWqCY|3h>r`IMuwPI*hDvQ7 zM%L6K7uyoqEPezA&Xn}o9r=dej>(O`w3!$8q)ZKJ9OE7yu3MtvdZ|3=>|mfZrP2e$mY5`}M3%MROP-%I4ONIq zS_*F2=G1fErp8`;>@&V5`GazchSo6ZDW%c?{LLe+&Fl!%6W57O-bEhMCm*kGT|a@7 z7f0VIS=~XrcwqB@>jp{%&SN9mOln$%5CExxq=x@i7emaNiV!S#0dqXTW2(3U)wCZ^ zcve0$C0z9G?OVnuVP?D%?=sfj1YI=`mMy!dF93%i6M%Zt)W^cHM7u|Nw8Suw1+|~O z6l!1iyM)H6cDTeohMg^HidM$n?$5B}dZ-gi`{K~%y=sR&-``^wxDQtk*%i1M@#alUC89 z(W|SJ#ZLJ?txU6?rnYx}oCv7%I^dyxjvyw3VB12W>`aNl2ALFj-GNBEU{htmYayfl zUb!O6ZbO5o;u3zWWyKRNv1K6 z!Uky=Y&rK)b=b;Id4FViLySk1+K(&cyIcKMI`r?{X)Py^I@4N5wZZ&m@|3L)zIZXe zJ}W+yl907qDZjQW6FUG2-`R~vA3auIodoh;13>lO8)|H7GQO@6hi*9UJQ;jQPd4=d zus>Fx$^>%pEDQ3NXpk~}D);Y?nikzXJ7Y}iu-SP~^A4_kPUu~U=qjlc zfPE;8M=Fip>gpt&e2=#J+nj{M8&(5D=ZDy5b?KhnjX#5Setno_gUo+i*cJIm0|d>} zmI#FI(YB-6#gB2HWxy7o*8GC9=!Z4O{_IevVg19HY2?X`CmxX$Ts?Ay^9>pyo3MOO z))0@JZa6I|w&mEsUs9v61;77#G4Gfh8l$OMNPe#GIdJZt2?Q_(qZ?6%pt zvT^~eyAa!jwU)~Fq_mEW+1?Z6i*Q>jXnJ&h=60Ag*T86h4`d%~B5WXnApU$hT21q4 zsoT2Q#qd0{cPWpCk2@H|Y82STii!&XWaskd)r5xT4m9L_L2VKrRrN=N?I@4gf)@9Q z3WU3GT##mIj7x z-{(#c>yOw@LU}{?3(Y-(e6t=io_VFSaCtc%%16{^-3!!T-j3>s@^Jrjj>}4o5uKAx z&ztOR6QkBn;f7rwQW^yV7hvUrAP)yoi~r-wRyUOiYGV3Ku1KB!`La5(08YqDY6vuA z9`!aDLwq4)er(uVhn%SwIIjlAe4x>VRGfn;G~Q*eZs#|hNHspIvE2B1*Z#JhKqokY zDuKFu44i-=uXz@SYv1mTQ5uy`(|;7~-q5+AG`F+uKUO8)%s@6h#o(gb05jJWU6l&6q?Ouij1jZL>n z?r}?DUcNyPo*@jMs#R@!*5A}X%$>UVkyf%Rm{KXA2x)MFF0HZO(~b2&pE?D%gRt~H znWz#+#+W%D>Pn$IgLc7aH4~wq2srMi1w)^(Oim(jra2WeUfN1I^u*?{sF@U!T-e3J zgd#hn3!x}3`A~22Gm_d%*2!K<H>-n3g ztXjjZO+p2)b#mAz?;H%!erImz3~`T`#8Ew#BG(v&k}oKP{*N!4AJk^W7$bD%K*HaX zY#$F^3XZY6wknb;C4A_s+VpKlSfREzDc;+qtP)CCy`Va-3>$-i!)^KN!&sJr+?MYb zu3^6aUN3c6Z^qB0WDz86cRYIIL~kb<2*>)Bx5O<5LPpac6k18gmHM~MI3jjw{!_}`$rY60!vPj{lWr4VDlRB{|+wHn?k7+mKUpN>&$p# zA+(_>uyDlZD{$T0gtICMj`hNZ7LN(qti9Hy>P!9zc7D~)77t&n|i~kW9t)8U=*>?yerknT-NilzV@d&ej3u@YFz)pN%*?A#SYw>{? z$tN)96DL5_-#5r2ES)GgMF$xOy0rtP`K|5;FYRSHOe3G`$Lu=8)vE09VbWK>hAZ9h zTUPvBxRaWrX^Bw3{0`g9mnNjFhq89p3kUg&#=5H8{gt%z7Lgs+9b|Mvq6E1)>&8+K zHAhML`_;Xd_>-+vcx?2L%8)>ZSd60&7r#Q3k0zaSiLb66sl(J&BGnGy;bz6G;bdpt z8q|MM{yUz$9cs91e2@QhhnCN^#yFW@vKeT%DR4s;t0m>2?wVA$>L{pye@9gQVig_y zooM@IwF*xCm}|j36tDJ zUVu!rw~@4}LxpY6pvgA~g}X~XLDpC9%&izy$DpowEyw3!q+v0DhAZ2e!PTPZU)xL{ zwG7q_ATDHcAP?`!XgowEGprjVf|QL!7XTagiI_*J|2WHsPQb56%~{mc z#iH$UIFNp%-GSC$?h%xl9Asx&goaa<;&@B1kT%a2f(hl*3-$nRuw#$9VWum7>+L>F7MMLXwqY0BE420f!J z>#PmJrOs2Lg5R86$Cp`smhn}pA&$XP{Q*m%*SvdmBF|{EML{kS zv!YY>L=0m6l+>S*K+)-ljd?V!D+l@!JaL>`^MR&(AE(wR5~@YDMu@H2?5e|2-YX+o z4XH5r$BP&33+G+5%p|qCRm}{z;WqkYP%!@wOa=l-777j8r<}FS(p&6`f(B;PP+nm% zJKqeK*3dOUTM?s~IEOj99a5T1mJdU^&??;*(eOZ3ViCCfH;YKSf0 zSa3h(e$`|qQ{*Q}t1c;G4lFJuPf114wn&Bh6D9!|P)1T0%EMz#-Ig97p4c`|;S5M% zN-fSh*J7$nQ8bAgGev;~afoyr*~EZoU{feOVDt-yYf~6A z?yqU!kHZRYD-nXGc}pu6(ts|*iLuP*Xu5L57x-?&;XBw zXby%mT8*pPKv_v_VbIEzC$9^{pA20mGk|pSbQ*dRlqwQ*nfP*Wml`$KRaFMfxcDnS zbLV&7&d793NPWdt$>&2G;O^-HX@!k5os~A~saDqteVPRi!Ql8|PxNmSevSJT>gIq? zHgO1j+zBm%`{2s15R@K-mZdO5-8sdYF&BBaCcuf{T3DdM@EI zxH5!#Y8-G`gvGK51($54B3M4HEboE@ge*VK!D~k1*Nn@6U()WP(~rq)u}|IsW>vE& z0syQ^NN8NrD63sHwm~DAG7-A(W6JsG3cG0R-KJCHk4bW8tas zVU1vv6u+aT5jnkXoTj^8wqC9$ybkmD9|X2}+;$#XX4XEq{9btQsWGqg;dVcZt9t?4 zGNB52&G?9;nEf|?6J>LeOZWLtzK=1k=T<&5TvDXz6?h{r%78nqg35y!#FH)*h^kX( zycFhu#xxi4I7Zfq0t1V@$__XFQvaj}R>&kkB>V|K`71%VJHAKPZR3p*fw6;Z&>dk- zkA~9ZO%iR-hI*7M%f}vqK}mm4Kw&TiGbb2Z+Y+u-dWZod9K|>;#Lb<2~k-oC4CN3E_D1rHl-fYt>NgrVrx0@?8 zj2x(Cs$_y1M<@>%Dt;9#e28PD=4>@A#=O!>+{aeD|BJsR%Fb~E5DaM?azp7VqCN*h z8Jd!yjt^9}pS|1#Zjw{g?Jv`MYybns7rme6GADPVrwoBg&&&EH8&Z4fq|T!xoNB=? zUM-4xQZNupSsIIA#LQ-t86H6q(k%g%j&OeB#YqbO-OQ?Tloc9wSBIGE(&hs(uQY@! z%5<;Il2ZNb9w#&yn-$Nzm%+YvCm?ps4%@#5>)5Pe&d#>08lqV^Bhy?@UtTOdLBek@ z-}lR=o$OmO=1FaLbnVltML4$>G9qsNszfO30^ld7lON}NKh+VLMS|bpWtca+w#T1S2fE7F6X9 zDjMy4{TS``ih@3d@NBtckGbx*fEN#qq8pFg{syBsZ;h!45;Pl!!!E*oU0bCJkQ^p< zC2seAPHx}l0=F~VQOD@)*PH_#{b8x{c<(G4z#^j~7v zgW`o;uF6e{9SnT(s&n7#1E!6lLsT%d6y_(mOV~o)fhrsUkRE(_|H#PRa^sdu3V-k} zO78eF?Qu@(3@&T(g@YT&68wJO_OmqLegFDeHYKYKN-Y}QGFy=5D`n%z>>MTn^hNQp z*8NacQ=*)>=4AE693f;MdkMEHA%9bF;9C^|(FT9i@tk`D-Uz6g~o(C)eFIx|THVgxz z1ZzLGY0P``1X1F^;}#jHC3D40We%g1Z#adRLSv*7=#i4SN2muj&};`~2}l;8n z%p=2=QSuNn)q@^y@LHqS+|w)o)V;tzpE1BPl3x1!%_0Fnx*1AbPe^-1HL&%PtqpXS z7^=`{i5hj^P0^x|=H2okM77P`1xnmLEe?iDUq144Z%QrQG^h*4Jzt6hT*Wbf zS2OQ(+w1p%a)EICpC}P=IX^YIJ#1E{G6klbT{h*c)>3?(Daz31#5cr~Ty>*n&6K;z zRnUj|Bk&@jhr7R8v&4&*E$Q;c-s${Rku;;gQu?MZvRaVA)Dydpq2l5$P{8q0_62ch zHPE=o1p>3)V*w)JbG;mWkm>zZs@+o;7SRu$dIS75@{DE4L8{}q$+*TQ*2kC}FH#Uh z&V09|fJ!C=Ut^B^b;E?o_@p@1)WETDdj?afv;f++2tloJy&?jxeun-m9d@9`8fd8T z;ne0lJJdnd{)Bne=?6lq@p|^-H0FIK0rZh8@XQ0aA8jC00qLinfoL+@%nRHPF-Yz? zt41(E=FOUhKu9}9g&!3_3~+F%82vOih5@>`V#0-2Z50Tqo(Ly0fC~PpBYjwkemmeD zM{h297(%8{8DKThj{clG5k$s*V^HHFTJ{(OuR{T-+LS>$YO7wxccO(lp^<^UWFs#5 z@Sr7EyT-fkm;U?-o6&!4vn=?6jJ^~gI?4T!W)~j(jstarkKWhM9$#qE`ElG=jujy4 zPpIWdCIdTF4e9!pn$CXrN?lp4{3ISGTzp?)e+<~Ez6ev& zjUqO6{fdFxdYevt@*~4Q_i?VPSvf=c88<__v1)B)uchozF7ahBA2fH^8zOs>ESYXm zo6f0k+h2?Qc#ZbuwJa9iv!Y15=N+BUFe=+~H8(n#@3bf{OB~dh&#S-||J~i0x>_ z^MH*>aEu(gjN;tUApRsFLRU)O~`@a2@+5{-W>waL`WT=3# zh<76Uq{{Y)m@zk9w({87Az${kebH>r$>+ls|34w91 zM49>A-dAG~R3oPaivX)%oFD=Gh~~E+k=a}6LS7Ydn%z3Eo(b8m>dIdK+EJ0e$d$k^ z1;+CBl_tj*g(u={kKnUY)xtwaM$NH>shoFGw!+&wA!h8ucEq6^%NroC<*OA-V}cD% zd@s}z|0{{!%eIj$jcA^u3I@ry8*96&A7+iKh#BrK8wXZP6F$!@-P5AakvMkT_n*|Z zX15LTT6I=L!Y;n}UBlvVcLv2`l%bMsjE{X|f3L=gs?u~G(xLddm+%eUmUh(orj*Kv%wW2aym3iozl(trE;r-4sG|Q3cu_S=5(V@dQ$TQ z8qV(p$hF62xcD5)&lx!C`SOj?l|hdBhXJ>5c5!#ad$;52HP3&*mxS`s(8&M}I4o2N zC%+zOfgHk3V)k!KIXv8O!V_%z=Lm*$kE6BI>ab|LTl7BY|%W0Tz#c*p6i?+5Z`EEp!#f=nEy$(ItGRE4kZq=9qqi{M08*JbxV6 zKk0yJRjIM%eAp22IFlY`)ZOfd5Is=c0mSx=)wEbm+FLPjpxuzyCF~w7oQ^S=02t9| z1yknI+Ep!wL1l>^uzhe9%vgdrFDSFsfDZt39kxD!*+^jQ*59nG;eF`;*Jq4*k`+0; zObTy$v001(a%Ta;0u_d;qsy2__ssnh!_-NWlC-GKZc@ia4y(sBl80*gY z{ryt*^B-bcgcZkt)UZ_L&V`*FDQE{@$`;Bu=VgY? zk#cC+&hQ+?WK0b|LV#+hFBi|?V=47sr8yMtbz_Ej21K-od2tVQC|VfK4v_6I8>FM4 zMnpN;{@y4!1;WqT4Yt>1M)BL{{%Nc zPTalEVV}XL-~`)%K66LOZ9pK$)X{JuYG^y<&g1S1XS$^bYYKA|L^qE*xeN%enw-4- z#9)Pi1KBeDw-k(~Sx*O;)q?Z`pUe zgxrt(uj&SUo?A?L2b?gV@8<{1ELA!VP5s_#TccQUSEZP6Gd0gW{(XDuWni*JRc!^4 z>F)%drzU6YmfkIo>Vh%&e`U9Ijs{+swl5mHp<^J>kQqFKP6M1x;4#Q4peRh1rVQkU zB1hX!s@m=9_!LDF%#s8HuULTUD_=Kd%_%x*r6@=tyd0Pmtypr~wLKCff(5k#nBmOc zgdhXyk=9lKJANOP9Ucv_mAtS6M5Zreiw&p~9VT{ExcCIqf&Ubf9PvJbgV$Yd@B6gf zEsh_mTQx|dGo-h!2bs!H>xvbGY3?bcHivAAd8YFK7}tkqnLq4jGM=L}Qfn0utuy_7 zoPV}^c!-}amWa^!=9^NiQ)dpw4lxX}lNxjVoUFBb-$baHH0O(TJ(%hBXQ$KPFm30&yh~xOew)?P4 zR3A+mXWNa}f%KlV4|j}EJE1KGW=$Y;72;zb#0Q6&M`^&NIi}JxXXH)+0K-)`GAjS9 z5G?s>S8_){{=%;>AN;O>UrG}TJbsIPTL*r~<*pQQNOS72>LVWHY8ybwJX(H9{ngZ8 z#>kzIC*5z0vijPZv`d#zgMP4E7D8~syBe@kmMn?u(<;3$O%q>`q8B%>p=p74QHx}P zKEdf*JCt<1~)ndi#CRJ0n+Dd1_`^(TD>$Io79_ z_zetK&qwe$ma6jG)fq%79_(+9ZLfABgQ9idi(@Y~}yUR+A7i)rd zK$a#_#r#=t?mTTy3~O!oLPzdH0^hq%`GfHZS)yqNm6YPc_^kXS`^^$n_ht@dTte8F z>d!!;_}Sg`N|^WoIH7SiBc9aOO!@cTxbYkLjZ5@rU+3rX?Q`iyA!*kQ$(4xS*ZfaS z7pWcoYb2}DJ<+P}P|wiqa6I)L*UoEwf|$L%-vwe+|MS+WPJ3iDoqWtw^2JwGg(hD_ z)Y;Jw#B*lDB3zYsqr4nHCSI6yAu!cOlI=Pc``da4T%yOv1S{Er`%+fW%I$4igP1DF zE0|JD-4k{?y`u*Y)?iq&fAVUkM*`->B=aIlS5nmPKs;Kkgga6gsm9mBWaa*P>CV3| zBk6dK65_I4(D7efTr3lEyUW`&!}y$+F={D6hs&HA)sx-e;**{V4_w4%r=K&qn-h? zTYMxs0Mv!x2EscxKod*`5Le7If?IxD63+bN<<1Oe@Pv?(hSw*fGNwHuaM`_eNy0cl zj-!C_B>s%I5ed=!=sq`a9WNNTG${5}^d?slP={p5Z{)2200j?wuUDX4Q3E1I{tC!i zs<1EiXhgPr9PCcl?;`y^pX?22+7a+V9}#TwZsZyUN%Ufup@-7#qc8m4^R(nsVfaIS z2^%tNb>KVh-DuqIAn%W>$^c&qo;(fSL3f;6+%3K@5k9vxKP$KCm{)d3bM*qAK1xqusjc1 z_h(zLgi>tFY_F-4g+t4Rc8m%n=av&=B0z(f{We|-sr7cCSm<;LWms&mo1Hc)Ww-NV z&a`1hPscG2C?t{0?qBOBNHa zEtq-Xts2+W5pofeERte|SNR9VjJKLd)WZ|bopBEe>u{l<*MoQV?--8I=?kur%K?l0 z1e0%X;$!dFQ&NLkWNao8aUfYNSHHfwlItwB6H^cuQ4|-vFk7V$ckh&vE?n0BJhs%Qo)a zGz>PVx|0IcjwxYgu{=EtZRLEkf?7OauX3z;!=#2@R5YyaaDonm{*nC%Ex8ox4IiexUUmeG@itCSw3v0#LQ80U z7qY*?sy!h@2GO`{C6YE|1>SkpDlyo+ZUbqWe*yDm11Ohak?k=8!9DS$4n&Yqm9p9^ z^(rOtq6StO9Yck@m*U1iFyFq4AL8R*0ayoKhtb>yLi1X_ z+oV8ieu2u2hQJ1t9NE0fD0o|E4n>R7|1F-@C5CDzyzbJ zFoxHwJkHB0l zVxGm+At7m0;YmoMz>&4hl13UDM~*E~If`lToq@bNY1kp5FpvGWz{Bd_AcTu|MRY4F z_R?wTeFE3-cXOyzl)6unQXNvBiCiodmynq7s^VM*jW&ZvNp+@3t3*i>jjwS|TBou= zGr$<0T==fy*=L?lNhT>Coyg7>J|iMo72Q`_PI@*RH%XjrPW0xq z3K?We`Z@3eXGMO|b7LcrkdGx#LSlxGPsaZ{C*1mgWxuHAOaf}26jmdoK@gG$341E{ z`_!`-ihUE^Xp1m48EQ+NJB)+C%B%pgawB3izf6rn7NP&2KjB*d`HiA%d=N|4V#)pXEadTJNHbF&aG zijl00FqTW;vIUvbIU-_F!27L9#cw)+N*$>yO1`ADdQoZFERTS5_Md+rx8O*B%;iol zu3dB_$f8ECM$cETEwwncg^GR22vbAE5HG*rx0mjxz8DlkNu6}T^?X3rMqW5B@$vfqSIQ46F-T~ThuC|Qz^L7>f^ z`3N?qgfoO)z@8wX;+pBem@t(<1)?#s+?ljESx`s@u#(Hc?m`yCV=>t*rt@%Er(go{ zu3YW%Z7`bogn3`bVJXp8hg9hIR8S>BJGU zyIp14-h>QnMSYCF(!wbNujIf!I=5e|gqtfzl1>j1DsIPT>u3&YJ5ECM_j1AAkVTEk z83|Z(v~|&`x|g`}IqbCTUI;StAjn|DF%wy!GylsRyp1}3+pPdr>+c}kmZODLdoxEP zbFb{HMrZB_Ef~YkU{^z;ZR(zy)FbJcr(yFoH+33DOI0!X?uM^BJGiDrV2V;tM)k%q zKTD_qHQ3;&q^Aw@n_gZ{4E_Ntc13Ob&)9-;R{b@$4FAg4S@oS)PRct+2UKCWXf_cR zjte1?)EO#6iyu)G0+Z+e+E}%W2kPoBrqVV<&Ehi1U>c1nnka_upB`Une;_mp#p$_$ z7tkrfxHAG~r+u@WZoY2(5`W-g`K@?IeJ;Ily>1#_ct5hdkpAA9yte@+#)+N~M;R*G zNgpfuc}L0t5~NM&I**FlYC_&xO-6gt78Z}aD#5|gAgn@OW`zmN1Laxq+M_(hC3+I= zusT!(aX+NRWhM<%1NbFwta)g=usSw|VmvMwP4BPSzEML5sNz4;dYe20m(L=p&FjcW zEXSseq;LMsD*Z;LNq@wHYC!s1^eS)bH6L3)$RjLTSR>M!=qW$xgPNlpuz?v& zG^P!}GRhf+YFLJDeoep=H=EcDE6(-I1kIWB&mK5e_g=J0`1 zH;(B|DNax!=aDq~2Vxe-@0j$w2-RREppCp6G%>tvf5?2emL~BB5Era7>YupbSREXD zx;xJ;FmL|=$U)lT;>E})kFz-*qds`tfIzhk z*1`kig+zG4xelvtD6FHs$-5b(yG7}v*G?>mX7zUfAX2`xCko8-$!V{9yBA8Og5Sv< zaFx{_X~U6Ap5O~)I&77HQg>0K3i=3jqT%x%Quk4I$GGO0a;(eV5EQ8_EZ~nTH(N{& z>Ekr*@)X-@x*n9GO8NP&4dx@(sGa4IkK#zB>g`!f?X@tNdKke$QWp!U3o=uc=n*<3 zTrV%8;gHCd^l{R z4~H}HEoU&qWye?tFHDEDbV8_Yo*At}YXdrkPmppnyW?}u2h9V^EY*(}lCtb=IEIvq zxC7Z!a`FXRMZM#vHv!OCgyc(R;5Tmd$J)^m4@JgimFq4m!8H~>TtIx&ceyp;o+$1! z5FNW@FqV30NzjBCg9Tg%dJ|%WL|x?HpO<=VPa8(9FVZR%q*aXJc?m+U zyrf~UKT-kn$U@x|sItfZcqVwZ(08d3Y0;iziwvk6Y`t_|ju7qM^xm{mH_SVs-d>TW zE^9iDPl<8pSbK=QJV2Z&xjguGgq*bk0%1gLNB<}$s{3257*@oi?o>&w%#dnCH3g^h zAeQH6i-TJz-{x-hhU6~zuG0f6*2%S$Kcm~43!MsahRWGJg z%Dfunp}gnWMX*h`4Y#7VJvkf@!=Uu`rwQB1((pp$75?d zc1gjcS-k(T$Sjn!rnbSv6vs4QwGYXG`=Fo|n2wLa=5A+bNQk)#vnIl^NrgH)!(zYY zLLjJxW>UF?grx_ZR8+-V4o73{TV;T^mf}DG7Bj*?Y$B(Cc6L5NBcFy%_vT)^!}T#+Pta zD0>Bx4^+iI9E^8vxQ;9|ks;EB1uRHC4Y~eZ~49%KewjLQl*M33MXEc(1m0)Rb3n31 z(mXBqUNk17y#l%^U2}wHfkJM?L-9uyzhbU9^|5dZ%xjP%*zYABw5!;5N@*k}Fl;NR zksaK&yXTl1hs37j%*1T&@CnY#F=irX+`Wk}{w89bssn+8pxNA*acZbO6+QMs9LZFu zs?>|7#8?Rn!nM~K*K1E8*^E4X{Ms(o%0R6;+8o6S_; z6~F!>`7M$m;V`@L)`qG#?{KknGxDeu6}s@6v~%{rZT&tJlh`5p=^?1HK}04edn9R_ zy~|9Pv8wlCrap%++eWz56ee&MAm^2)Ietex)#Pq~lQB{rO&ZELTf=G!?0OeQ1E{7X zRT87Bd|oke)|5DiEF!@%QwfgM+{afCd#=@p>>!*3;!+Z!K?ps(*C(*>4d5Wqh~0h| z_4ek5fPc=cL)z859u$a%of|&nXAo=%@WG!vqGD>D`E%14G#i3pRWv+Te`By|fCSxS>w*5YGEhA%VXAXMNT|+UB!rK{$U~ z^F=o^V-eT|r52%Yw-pI?aEJWvEugDiB;8r@74?8)&jO;FurDx^$x)!Qi*qKmKaX2O zS;5ss9g4x(q~L;PFxj`YBR|CsAEG8llDsFmNvYj?Vl)89kD7117J55k-qr^&-#NC` z{gSo5F|vN40h=d&x#fmgSNXR7XFlstGsPg^S7P8}$BRK-3N;3M*`DKu&^2C5H<(;% zbAWl#Y-<`tS6gDD%B&F-b0OXl?A7I-8Tu1Mt+z*o!tMhWIJ@RDl zIEPi67xtC*cDu1Gjq9bYN_`uRJze9)9k++A6F@y%lNdVM_h%;UMd&v$yyyqt&us9u z#aFK2%_&`THwSLg2!Xb5oY&7-@z{ump6b&@pMB>} zE6NP@U;f?qRe}5YX=|t4?M+&V17FW{gMv!zhQpsux<|VDf!A^POKR(0cJFx?FE>Qa z@WpnAF-PSd$zWVPMh2iC<*36{Q+*TM1b?=8)(ofX2T zDjwWE!8^l+K*mxQbcvc0Qn7h=n8-aD(25t{luf&BQ68n9$X;!s)f*r6vx)MVaxP8@ zW7(t)ZzweupB%QD?pyl42kG6YBAiUixFV@QJ_Bj2Zr9qy($c&VjNBm>bh}M^?h@8V z_^4Yv-In6XX`uJUc)K>tdRkmfa_dFPd$im!8VmMIR@PEbY7rKl?Ac!ALvWi@tLg0C zyYaq0er<*nj&RR|Y8U^=N&wbeG51R{e7tbk=d6JlrGqDYoB{oW&Gx9_Q9C6N^F}7dW@5#0Q zHX2;p`)GxfE0;pO`$pP+%EN~Uhmzs?loWhzLavF4$nM4#M8A04)s&d; z+UL`OLRrJIq~cD#&%3j%yqwB(mpEfzf%UkjsO#%Bj8Tj;)x4S-+GhnVAh{0Mtee7p zK?Dwkz;^ObFA=`5W(jk?N0piaY77m~|KWnkFD^8Yeo)}n(%cCjhzQGLj)#JbD-ytE z0l~gp>-;IVcI-dqS$g>U)i+*UyfjO$k%VLJ_OcMn8zn=1Laq~jRRA(U zdL_|iO8MEr*2-z|NQ5;&I67zo0elo%bHnTM1pWc zby!pjK&FBHYtK3aBJe6Qb{Ld5d)0TBcjAD5lb_5PfmV|G5DGR0#@k`8!PvHYcR^&T6o=8S~vppE?`O_g;d<(~U zJ}6yVDlId*mlr)0Y+pa!6c`jwwl}9x^vn~OW3H6U`JZo89R@sZK4Bql4YN7zb0X}! z@_B}6M_%VTO-DlguECZK67X5>DF=)C%>I9;hJ5-e_Lz_#2=e8evy2WW|19JbN{#)} zUh=_ZFgxMK3Y$l4Oc2+zR%i#beo>(l=l_y|_?@$C?Q7r_D1`Bb1?rXTS|WsgY;`&b zo~O=G8>mQhUuUDS{duq81-tglP^vu~+1=`alz=@n(6f31%h=3^!jB|1!Hlfw8yFtk`xw8) z(V_O6R<+seDpd9f;OVYd8+E8%lX77|+xDB`?)VbF_x$m=ZZQvmEu8_sogG^ieGP^!VQFL2 zkcPHRz*Ps6u>54u)elIV(A~j1I{<){@7{maG|V6yZZGJw#`4D+)G(UJ@WXaWz9#&4 zrE`%^@PxjC(#&0&HdIX~!+f=t@60z!j6%nu1VX@1E!ox&>}eVOWxf04&&fW81oRMG z|LjL#)&<7mW%l9GCXZ*^i~mTDit0%FjePneiAFjF$GV4q04%fo+dsMklYFFAq&zEW z1leiZ5ZWN|+c&;4UEJsqVtg{%RXxw!*I7HGWXTNv1c>Tuuc!PPAa8di*XRN0oUE8t zgTQVm&)II=rs>gr1`_gYxU=_^099GVSDK0$zaOF=P@paH`Y2K_AracqYVu_J`R-Y# zaLcE5fP*t!sOHhmD@O-WOug$vHLe$xEPZtUmOaq%Mmze@uvz+zX5Oi?gLBPeZmhCY zB0V>&#+8fghFJWlg$qA+J7DlX^U%x46>?DkAqSsz7 zy$FpWqN3ml_}9?hX-_u%0A|sG*hM(gpwj{2b!)^JZHNmuzhFm6@3~>A*{Z7293=6( zAilVZj5)a4D7{_37V8N$fJ2bV$y4txUkzzOfylEt#7bs|#th9sWJJMi9ha;mi|-e6 zu-^PSRh=FN>*W45bayR9(gLSiinbm&R93rRz66NesMqKmw{&9ky6T(Q|BZJF@I)QK zjUfu3j>~yuHs9-7ugW$nf589TWu%}&`75zlsZ6IRmmSpagl;)5WoKbcn6m2mwI-D<0b-ek!20f}2 zed6eqBAdVw{DVrwg7zpgl@JL?1LggKT(}k)`iA&XQ|vGjd@F~CQM3TRm{?6|Mv1hb zE;l&w0&?pjntwQXICJkh-U|5=66Fa?+4u<>1L%20;v3AS`c!`K`mwzHp4~L2G*1T) z6ZxoFsbjmChVtsNb#7A#l)v((Gw<%g4-$N)8l_i(@(drV{m4xeIK~c+#JqLA&GBC) zWhDONmVZwFbldhoxr|&xTKB?Fgg4j;;bs8!A2g6q=~Z~Le?)AJcHTwncq;jGM+uw0 zF5H~*h{5!49F;EUx=L)8QI1rDy*(G6O`fS3*WrQcBWy@u?=) z&k`&$=VNgYfz-ROhwo)lhTy&F=bH0zKOMlVsxyMRbw}dZHGIi)Q{xFy9~Dn@-0u~s zPg2i0Ycf~fFHC{g{B)WcjUD0pz0#u49qCfs(};S!nW;d)yzT~BHzx#EZ%^gbH*UO# z8c$~Tj!H&p>tgD51ouN@zNEO3WSXbF^;KQt?$JBGDZ(a0pS!5ZU|N-NjmM7t>De~= zv|&siceMqKQ4VJ77ChDok4D=wh{{RP;P6q_d3BBGITy^i%PVO{n@{}RFXT(d+`YRG zPCEv?kdm?@$yG#?VC1=|`P*#SHg?QrU;idLKMoF~0nngF5Wgc-KPz#AFJx`eL>&7E zWw@*_u#U{2BVYGiZG+(Vk&yM_Kz&}Uz;q<+K;^<8Z@vOB+U>>R8^RA6*@L!H5@!B{f7V*t=^yc1!ANlj@ozWQD zWTdW?ZDiik1f?M|xyR(YB^NcPdpc>~Q&=irg~H&N>n6rL1_9L`^uX3dKoh2qyDCn? zU1a0{p9uL$NWzh|OrYK&v;Yh;4pu8WA~aVp{_XWGd2?^hU-{zn94s}_{m60HTJ5zG zBlAk06;E;7XAs-k_KhUF9J5??_2X~M7k6MeGyuC~h)^7LT-3aW>*XC*VWl|0=K|Y` z9s4RuH@!Viz!_oI8JL9O5%3WpA{_g0>MzTkuw9*ZDG;>+n8m=xXZ)Od=quz45ZmuZ z2U*F%vNpYGEh^9*ZuvVYfdTDkHIIiGC`R531lF~H$+bt?9B@crOKO(!i$~8)_+7z@ z?XHmm>{c?`*O6ERHg5^`HD{&r!U{eMrZ5*ZqnXjSbN7$%5CTpuV5j;i978U3ogN3kRIVtbTDwy!d ziFfVHHBvd`7GcdGp{+$Z_~@uZdynFd7XJEvQlep$wX>YCZuV?w4sby79nD^4A7TyD z6o51b(7kmnLc7y)a}6$3y9(mY*XwvgfC%U;>ovjX2elof^xo*!ze^nJG9HJ0AMPQwBTpf!hT z`4L9q;ZNOVV_BM`$=eQAGN!GVA{0px@Xmeuh?)gRQiQyHxsl8g!dIje^{`n{vi-kN z(Lr8##1+;cWM9C-!=LVZ(vmhNFQETz7d{GxH3G%9OMm^j^^<~u`0%QI{?1_iW%0h+ zwh%hcQ0|q@f$uKSDgewxn}}SK9JbiEetgFEY_Ib#APu8v9Ix5G`GZ-(B z4d<+$ji9z@?njJE&i5%db4{`IR)D8DuA7nI?HWFa9+5%BRMZq^zW~&QQg; z#*Lb=%;;k-a25|W7N}gpk*D6CB#SeugWh+#e6N4ONupGQ;#D(rrBZ$r08-C#INVHN zI4*SM@2e;yfgtNis;d}ma~xjXrlBfOK9JIu(2#;6V@{JNmGc?aREn5>qFOP}g7=!k zZOU>RJC{+LQ63u%)15>%o(_aCiJi=4!Vf(Et=>o7u!x*}6z`lbSA_o~bwsAhl`ngy zlVMDcm#wSh!Cx4z%oRe}ejYYKzCzh}PmZZlL{6ry$#H0y?-VbX#w4A_RhH)+wy)eU zA3I96$!Me)t(DR+8=Y?DHx7bx*woTElwVl>1QFOw7&$_=5pEIWLKuJrl1^3vq7s{9 zNxoeGWkC1$nuueioHg`VmjfQd$2fk+19LXD*HT238Isf4mr}@t-W5Ms`zs@H+1VDO zxE5h7&#O~VbZfgDVZ66JScS368MDE+6eKI5KgnxK&2m_fMb#=RoB$?#Yuw4|Q!v5r zUD|8^XEW)!I?#Af=>t)r&}=RSgH27Xxv-YV*g}PUAv^jMXzdoK`%zZP5vR^OS?}G< zO(CVKQPcmYLbM4ALGspyH#4S@&4ap1+#p^Kva~01eo-viGU`Dh&QLYT%VuO-+&X?Z z3Y7z~bsVi;87;Veq}+@u++e(ICEKauRyi67;Rst|KOiQwd6#(rt(=apF)Y;fT-X6K z^-uYns=nx!*uxI^i{q6CsnHzjZ7W%dOH zVete@sso9GSi}Tpu+G8}l^2=9MAl$>nmK2Zg|vl4^p^E(0`{eqJ-LL{WW$2|@!+6(uJUkp4XR())P$N@b;kZZAc4g)vk&78kzj<0BBR?E zHbgY=5wpPPhB;9$d(tltY39~+eM|UHlCPJ4t@5+q@fJ;@6>!joJU8HtQ$ibZ7wkW}Z=Q9#UwnFAdaVEYMhc{94T?P; z2_4$-cifc13;f`XVBq^PX-aYxrvgRZmFaF)mn>R%iozbFnV+%pDrXfAI7jvEYZL=1 z#)*zdDvvHfQ>sc>u(eLOI4q5w`T&CiI8Sd)9Vts7RmUl!RhArtVbLQQbh&37lItUQ zZUB@nDQ#@9@-7HPsw_MM)mXL#6zi4@)e$$QyjPou-l44bHSkg9D_UtC+QAB;%M!LB z={yZ=*DsJ@KQ^>pRoGtr{i=t}ulv`q4liYqGu0cX zo`uRb9YYidGACUODwU}4<=(&v zDj^U3A@TnJtUy!0&~A2%0qA-o78TKelp$hEsMxpyahOqs%140Ma9M{=y`||!%r2ri zS`ten72_l-BY|g->Uokcr|mzu?9ts^iowv#WbjI(J820;2%GuJRN#M@0<8n733md$ zfMqqvucfIgh9)HAF^qXBZ^@@EhhpJe)>7>CC+9p%ECZpW)&%sNTfyrv69;<1b24N` z_pU1!6)|JDdtvz})hJ23egRV3-d2cq?eM#*F5}Zl=n*&U&Y#r+7%&vX(vjIm$sazf z*s~D*Zco9fv<2zm#8TzWsd%pn!-%iUGc|0jEqfOuVFtRAd1L+9ES4dBCav@a5K9%E zpXo8^g)eW6s79~-xOq{FnRvffZ!8TFwGgpSG4*aK8&r^%ybxPb%y66Jag%{3X z(K{k3#2HyjC`_+V3PX56s_j_Sc|6lPgJya?lq|}&5i(h>v!FnQU4>E;#Z)m?d62G) zDQe&->0#PXAGHn#uk@3kl`iJ%pJ^Z~M#Z}G7(=GXjY3}y$4X3VHwEXhiARS{=g&t&VzS#->)+c;{|1*XT49ZjwRp$2qBMK+9NzG z>~>v;ZbaditXyVk8up&SJGbFLCsu0>MQ`-$(!DSS6S{~kEkQYj848sg$jUHmeer&A z%32oYpF*{^%K(yrtTi)oCkN$|15?{_Y)w_6=N`v-+E6f(h<5&L8@VXU&_6wVu2Se* zuppfyAO1Swg(q_`ES=}P0S~mT#IoSVA+;To-wJO7p?jV_;=l@HBm%tcs|t znudeGo_vILBAtAeypC*%D2z=fMgA9clO2U9v}YMO2oMWx_dvvx*=pb zA+14v9DY7>R&DdaUxduLWBjZ8`{O&3p-biLUK96@sCkDL?#39Lqz#4Rd%X~)yD-%6 z`U+wRhe}p=0En;qU=bfg-5La}iwef`!4+oQ(A0r2P&a-G0u=7kZB_tmlcS?0ACF_C z*3}Yh)e?6VEli}AjEP%>4UiN2yaDy=4q<7yR#dTzDx7pgAzD&s`tp^%oIQ6x3C%&N zQ||%1aO@AJjcKV!ZF$RL@IFnb;e#t8_1;VQ5(fbe#@Cn60VgKyOgQUxTuvkpnRfzH zm|Zl09dWKM+}Q%8|JoIdMTQ#L!#D!X!12c8N}LNpg72k)^=U%$=6s7n=Dktk678aThf*(0zQj9_ z7qN2GY-R>$GgPEpWRFR<$h=c2b=cpIG68UCI?fqc{$F%3Z|q~Vh=p({FmC2`0H>jO z6a-H43J!=f!N%B9rX4_u?nXO~R1!OaT(B*t2{f$J5DpjQK;cGx#-|An^x;6pI^=9- zvstoEcu3Ca;k}F4`Fiw~P+9Sn-j*e7T2C_Y!quYFFIgAsP`ikXN)j-KrBqs?{WrJ6 z3>Fv1V>NXU=*Iq2fHz6}0pPMFPD2IOMa?aK01VWVlY!TP%Yh)b_<>>F-?dNsvE-nh zT!UdO2AnX9KU@Udj7q}eK(c!dAz3K%QV0sU6%q%k)j;MO1bCm$*C6{@vXh2Qb!TKI zn}JENXqU|AqepzYTmlHghD!@^QOXf`Q{;@x+%##_fh!}ci<);(`@X$cDVedEU2?vG zl~PVs3XtT46WwhbI(6H1;0oT23Uh}U5cTiV*8naQ891BK6m6w%!)2g;pKfeuq8kK0 zQK1gZV+vQY?iXk5KCL-l192gh!^tWv>Pt?7q1JiWa?y|nAwOOCMw}*GRp7_i!N8AC z{p%V8eXJMArM$WS4}nadt9~X}*L~E|gn$T=^Ia@<`d2ieLD2LsAg(4et}oZPnq+7~ z6D}9_Az3ikSA>m?AUB~7u48FU!!LpYuJI2oQx1?_n}nORbkaaX;N<{2Kh4 zl_)Hjgj=Xw+!^oQ)Bbg^mW0AQK1A@`Xqnm__(!#{vFoo2OWCCtC4Jy}5Wo|y77kkCQa zA+Dn|eSoB=NTXlyTdHWO8Hp8BfwvIVXDVOTq{aWDcOsW^5dRE6{7xbjbJuSX-TH;M z_4O{V16$`^z)ip}V&W%fU?n!h4{V8JNPFYqr(gOa7JKesEzQdwc~@t!35AhbM_^)h z8(xR!aqo0IJ!I*q&XY)Jc`ws{&&T^SFf$^%3qpIu$KX&aMD$ENQbIz{n~^wq>vme$ zczzxqn)Dj^!%a_|*n>`Mmm~3`F2$pXrL5PZu%f3t@fxx^hOM<#$Bq~{3X{mZF*W)- zmLZ`vt#l2DrTGKjs!U7yzZbsw1#U`1;>+8gN5u4w_+Y81B?shj>HVc_FrT#Kh1il} zl()#R>GT6m4YQ=aqB?iIQWk$Ok;OYepcGo68;$?apUD>=HkWatJE=t8? zQt^azW53kzXT)JFUVe_84(63TYYD5mJ)snC;Q>;`==rxJ{Ah8t`UDv|S(I%fB(q#m zLNPN&YD&e17N`u;H6n!$uMsyHu|8^j7rfF_K`Z^=eBDL^Sx=;RZbcfI#!KDMpF`yf zGuc{iLZ-70<0w>`C_`9^lu3Ql@GuphI3eT@W#5hB&Lj@QT+ zx~Ved^NPE8rHLhCI&lhWh(d>WY~4P+;{pmZDUeU<7Javp{eedi1rqw5w{^xUHuQO< zo~;oaLN|a1pqe}`@6jpA(Q9=b5{ZI*c*HE#AY(P2dldJ^v06Xm4>az)vDK>Wcsx;T z=?IQdn4wU~fvhd6vj3Z6>&t9V(;?q|0@r;-8%j5_*5nqG$RaQ@FSG~8)+iM^`%V5V zVKSLn97@8U;AJ8iO1o9hQVMTO>{85;56upyOg(`rc{@BKzC-UJ7_|XM^bJ@GJWeM3 zx9Kg`E)c=(rbw@RlAj9HJ22?Fs$5=nzjp6sEBZ z90bTJGdjH7W-_)vjuxMU!;?vST=fm;R*fm=TclMU%5L*7cO^!5I=vTNNruEJ<8B&} zF)!vhTDX-t7(yG0??WX&l=@xA`(0l_JS|2M_yH|%qrOPuLpLpR5U?&Pkf(sIFyn@% z4&XQ5B3)PB52loOAH!=*aTY(ZS-Nmh6Hz?c6^uoOn0Q?+ z@(J8}A1E$yF!`1#2ulZ$DKe~3wbrgSG9aF#_j|~Z6z*~PfD%#JxQpTvCntTRf}xRY z6h7D>p^}nB(b9CHFq1j&JeAcOmBI^0Io}|>9RIusO)Sxdl5}Szr9agta6bARdECTf zyrC?kXh0kLT}L)%(*R~^J6?R6LnSZVALOf*ME!VWqT13D+MUcw(*R6h8Vv0S}mJ&0AA)H1N%U>lI+@fsR*vXU-Cg6|GYESi)PD?%H)hKCO2s3_H{YvS`lk z1-j^r7W!413xV(8tWOhW9KuIp-uIaA8#$E@29q!G4&;S?#H88GD9&amg~v`$ z^A4qW`1T=HNC&*h8QEk_i@_VaRofo;-0QtA0g%(sDhe}?vqLUuZGw%lrDQvxGgt-% zMU8}ccn-bUiz&g1qhS0LJ5aUcd@5>ZiLD>SaUkO`(*Yc2bjjiB~1H zRL)=4UaCiYm`yV9!et;XZUs22tWKhQWEHnMEQM08@%HPj(7YL6y_uk?gP{ITTdp-+ zz@Dxwe4ZN^Z?v}N%EkSVrzf*z1%S(eoR4h%z%kOgziXea?@>lQxdy}B*Av+IOhV8= zxRaWfU1ex?Pa6tZ>s&8|px_%v{Ha1 zC!FYx;!n(U+jZb<1dR+)YdxrcpS}hVOmGHoY?=?>=i6`@sNbg>8=B|_!7={|ADG7! zu4MfqZ;@f+s(1Tu02&aC^;xBZ`jV4ipgrzI|GEakdFt`gMBtm(YX+Bm<8W1gA7cjt zKR)%ZYY-%>bcX^5a(n!P!FQkTV(zEq4&~Zj>Bd2jobO^W$-klr4T5?36$s`|@v1<5 zxyIEbLlc^Cxv2k^-is^s#T`GDz7X{FntyE*n(!lq>$Of`Tp;BQhDJ<(5a2=iMIgn$ z;*wGH5FdAz$;BBy6gQ`g_#72-!Cy8U1PU|Eullit?g$>jM!n#t=Y$CR+we^M);#v$ zk=Vg+@wT8A4>`{b#>qp1GX6;)?4Z!Jh95VU*#XYC63uh>CTi*9!#nwPwqOUzaa@bp&Ij&i2FXjf z9I9Hq{hMg>x}vx+V-;et6&s4cA7bWb|Aoo-is>KXi7Q>eGTaZW#>i6n`$T1n_}w6B zsk-3Ud)4|*a|=^gcvimD@N7bC?xx*fEeVA+d^p8(<2U2B0Pp1qOV41)R%}@d?A?Us zIkDNSW!C0@aK~YVvq^-ElJ%&LwNE{2e%4F=*g~lX#rbFMKac2fxXwdr9bA@0`W;q8 zTo!Ctla-4DB=qTG(M5k?I15edusd&322<&$afW7r4fH!Xv*$_t+)es|=5y#b?9yZDh$HYPlPn#rq3OI!Dq?%BjvfHBnN zIxOFIn%ChlhW#F=V+z*4GIHP8FG0g_pr+p|@5195&425v`59#AAbvz?D6Ow&P3VNe zLjH;)pZCRFPdxcU-_K9g;KW1Y@MuwpCx%$sxjPT{m5GM-9?W8EEjao(zFv=!yqJTt zxA2Ru!U=d_?QRfD`HS}^Mq|;FxqDE!6JvH2AI7P(M=?gdZY}=`J?ns!4f4(3A5w@d zDfAN$2lhp}Ivj&pQYY!96~-T6{J}W2cYr`C6yO6J2smC8A8^{`ceA-{F2C~D(Q@oy z7X|wX<8%3nfT@R=F8293Vb=-%8(4;Ad2(myN?jVRAVNi_ad-OfERaGLYcowv1+f;1MHOx8-w$Y1Z>L z{@{oPoZ`yCxfoW&g!{1Kiv~Y@?#~z% zFAFmYB@|{zQVwK&;TiTY*~~6}H*!{9eG;bjB`3`#YxVRy%QyM)%_1bW=Bd!za(MSB z#AD=T{Ys9puMw?3MHlZZ6$)o|gm^geVeCq*&V=Vdo-?%k-35!0y#s?Z6J3C43irb& zZr(mFBzhm3$vflo*tWVXH~Ztmpnx*I5UYyF_DVJ!CxsG)?A*_RKa0c!qOh1{*iJ!! z0*7bBkoZCrzl-?gB{*J9dtBZmL>FUH{^kcgA<@H=_Uw3la>9K$M>3RVA1h4otjRh- z3-{0>#L$Kk^sRt-C-1<|v92UOk&PxWLH&C|ZpbS&V>%oJtcwcdDWEINxZzlRGyOgL zIj+hsu!e0v0C2Q)z!og>>S_u0kH&oBt}4+80VhgX?9dI#^@@74ek#<=`9*)3_w@xk zo(pEfXY7!p6O@i^+etz*$)cl~tVi|-)7DQf6&eJL@*?@*ib!So8)>Ik^TxiC;rt2{ z_nJ4hg-VQa2Qu%kc}mZhm7LA&)P-BS1D+Vy5{e92<@!>7D~0>4eexMqUy*RDvQ&U_ znfAW_lrbX?8X1t!(K{BjPj4h=UM8(;M`I7grQG{>n<&lDd?_1aCP}C)s#GmaBnlpi zOW0J*k4|;rD0ch4k+SnfqowJPwFiV3G zdzwQfFI<^C5G>UXGh)@2Xz8NON^@)Bz+MuUMy|=?Dl+dxPJ3vZCSRVmZh)q6+$1?4 zG7syg3o2(&m|ZOZ4)|9DKwuYZ0K6N<_X%UCK8_#`9O zG=bis)C<2zq|jVNvzhg*zqJw;Pnpjbcc9ri+Lv>)mHUs8!)z8Bk$7XT)uQ~R1Q&(f zl1XtIIu}_Sf_{(8YQw*=C667j$+gfFHP)@c2`u0=fx=KxHGh0b4peN`$M`g1>^2_9 zVWtcmW>hytCXD75e^kcSKJknwyKf)8ExYbd!$^iTk(>#{jpmms$5C2ITgo|Zby!+Q zo|3ye2Pgl?SAEuL>LB>(JYxD`eBQvvT8-;i7p*@A%Ew^NM@9kQa-cdcXHX7rH`hL0 zj|0`0YcRa?v+;TNtcKvctGvrqhGzG4hk~DBYhVfLK=dKn^Y|o74zf7HQf5qPsPp%S zvfSH+$!6e0)e{nuPm52tv_Ib>mV6;DO36CyqQ=MNrpaVFK}{^{1dg1t7yBeLHo;hO zzGgZ!Pbp|n=0ulv|F8W6Ge32>5~$zIg4yUb0IxL!24^$+m}{SJ!(||tvKtq!Tm8TY z{^i(lJ-L!~pP-|k`!h7>YaoJniiKZtS6^}x3`d;Y7Myf7;o{-iUj5;^lmF3! z??40LYLcM|O}JcKFy}^{-`X}B_^I@TAlv_?rp8TZ!uJiod(OJJjQidWAO>8WlI)YQ~F}9N?nG?KlK7L z9TQNMbB)TWV?{>kq>aLZI*GE%(~96)W5{!V>wacl<5JviTt_*y%b?oxuAwj}9;;mq z?*gH!6b)HZ5DsNR9;1AV;5vW$OA;AR1G1WU&IY#+1pY-BV{qS$}zrKP{#sU+p zTkG!3CtXehqqTr=svRTJweaiUT-TXK2GoJl_i6BU^y_bkxmb>HR@+p%i1-ioFM2t( z)+5WVEw<4}swJOs{<<=TsCC9ZttGoS7g|hCyDD9&wSDExlho}*N}bgc5lF}wtAG~okN6ekkWhHKMqe26_r9o^fYQ)*{*A0{JnDMh6d zX%B`cuGVm)al`UpClyLMnKbdqZXYU4P#7u!P=AXT4e1jQmpt&Y;81muSG9SseZcjO zbvW8=fLeV?cn!>+T~nC#kI?@ELfJ5|LtRsvqIbBr&LS|+ZYFhKuofDG8w1nqJF!+O zzcP`|W~`gfVyf0!m56FUDO#dBg#&F-FR*);?QOa_gI%*oS^Uh*r-Qi4JIa)euS%Wc zPdrr5CMPqlrO|=U5=0`UquGs(YfIUgg(*fjySlfhE3;yiM*o8wPi8-;u^8tV=Zn(oGL4k$-e?4BUFU)cFaZaQVLFMIw>A z(Sgokz0}mWx_PIq1DDTR{>&wxtUoIQW}*luDEQ7BgvwuvZ(|j5lZ9fBD;VzELQ3iK2>~zmkQ<1;Y4p;hnrVVmT)0_0rgUgB5hHg{R3Zm9% z%PBow7;SY_8*kv=3rwv

tf4fdzHUNdxITn6)rwD`g`ywML;6 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�rQ~3AVh`P*|G87UzzM^gT!% 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%0Aah@gm&f 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 lEpQ0sxem;0$ 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 z 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