Skip to content

Commit

Permalink
- Fix plugin setup
Browse files Browse the repository at this point in the history
- Distinguish between parser reference and entry point reference
- TODO: fix `m_annotations` overloading
  • Loading branch information
Nathan Daelman committed Jul 3, 2024
1 parent a605891 commit 5de6f3f
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 130 deletions.
5 changes: 2 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ select = [
"UP",
# isort
"I",
# pylint
# pylint
"PL",
]

Expand Down Expand Up @@ -108,8 +108,7 @@ package-dir = { "" = "src" }
where = ["src"]

[project.entry-points.'nomad.plugin']
myparser = "nomad_parser_vasp.parsers:myparser"
mypackage = "nomad_parser_vasp.schema_packages:mypackage"
xml_parser = "nomad_parser_vasp.parsers:xml_entry_point"


[tool.cruft]
Expand Down
14 changes: 7 additions & 7 deletions src/nomad_parser_vasp/parsers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
from pydantic import Field


class MyParserEntryPoint(ParserEntryPoint):
class VasprunXMLEntryPoint(ParserEntryPoint):
parameter: int = Field(0, description='Custom configuration parameter')

def load(self):
from nomad_parser_vasp.parsers.myparser import MyParser
from nomad_parser_vasp.parsers.xml_parser import VasprunXMLParser

return MyParser(**self.dict())
return VasprunXMLParser(**self.dict())


myparser = MyParserEntryPoint(
name='MyParser',
description='Parser defined using the new plugin mechanism.',
mainfile_name_re='.*\.myparser',
xml_entry_point = VasprunXMLEntryPoint(
name='VasprunXML Parser',
description='Parser for VASP output in XML format.',
mainfile_name_re='.*vasprun\.xml.*',
)
161 changes: 41 additions & 120 deletions src/nomad_parser_vasp/parsers/xml_parser.py
Original file line number Diff line number Diff line change
@@ -1,123 +1,56 @@
from typing import (
TYPE_CHECKING,
from nomad.datamodel.datamodel import (
EntryArchive,
)
from structlog.stdlib import (
BoundLogger,
)

if TYPE_CHECKING:
from nomad.datamodel.datamodel import (
EntryArchive,
)
from structlog.stdlib import (
BoundLogger,
)

from nomad.config import config
from nomad.parsing import MatchingParser
from nomad.parsing.file_parser.mapping_parser import (
MappingAnnotationModel,
MetainfoParser,
XMLParser,
)
from nomad_simulations_plugin.numerical_settings import KMesh
from nomad_simulations.schema_packages.general import Simulation, Program
from nomad_simulations.schema_packages.model_system import (
ModelSystem,
AtomicCell,
)
from nomad_simulations.schema_packages.model_method import (
DFT,
XCFunctional,
)
from nomad_simulations.schema_packages.outputs import ElectronicEigenvalues
from nomad_simulations.schema_packages.numerical_settings import KMesh

configuration = config.get_plugin_entry_point('nomad_parser_vasp.parsers:myparser')
configuration = config.get_plugin_entry_point(
'nomad_parser_vasp.parsers:xml_entry_point'
)

# TODO move to schema parser and prepare all relevant annotations for every file format


# ! vasprun.xml has many meta fields, explaining field semantics
Simulation.m_annotations = dict(xml=MappingAnnotationModel(path='modeling'))
Simulation.program.name.m_annotations = dict(
xml=MappingAnnotationModel(path='modeling.generator.i[?"@name"="program"]')
)
Simulation.program.version.m_annotations = dict(
xml=MappingAnnotationModel(path='modeling.generator.i[?"@name"="version"]')
)
# ? compilation mode?
Simulation.program.compilation_host.m_annotations = dict(
xml=MappingAnnotationModel(path='modeling.generator.i[?"@name"="platform"]')
)
KMesh.grid.m_annotations = dict(
xml=MappingAnnotationModel(
path='modeling.kpoints.generation.v[?"@name"="divisions"]'
)
)
KMesh.offset.m_annotations = dict(
xml=MappingAnnotationModel(path='modeling.kpoints.generation.v[?"@name"="shift"]')
)
KMesh.high_symmetry_points.m_annotations = dict(
xml=MappingAnnotationModel(path='modeling.kpoints.varray.v[?"@name"="kpointlist"]')
)
KMesh.weights.m_annotations = dict(
xml=MappingAnnotationModel(path='modeling.kpoints.varray.v[?"@name"="weights"]')
)
dft_path = 'modeling.separator[?"@name"="electronic exchange-correlation"]'
# DFT.xc_functionals.m_annotations = dict(xml=MappingAnnotationModel(path=dft_path))
DFT.exact_exchange_mixing_factor.m_annotations = dict(
xml=MappingAnnotationModel(
operator=(
lambda mix, cond: mix if cond else 0,
[dft_path + '.i[?"@name"="HFALPHA"]', dft_path + '.i[?"@name"="LHFCALC"]'],
)
) # TODO convert vasp bool
)
XCFunctional.libxc_name.m_annotations = dict(
xml=MappingAnnotationModel(
operator=(convert_xc, [dft_path + '.i[?"@name"="GGA"]']) # add LDA & mGGA
)
)
# ? target <structure name="initialpos" > and <structure name="finalpos" >
AtomicCell.positions.m_annotations = dict(
xml=MappingAnnotationModel(
path='calculation.structure.varray[?"@name"="positions"]'
)
)
"""
forces.m_annotations = dict(
xml=MappingAnnotationModel(path='calculation.structure.varray[?"@name"="forces"]')
)
stress.m_annotations = dict(
xml=MappingAnnotationModel(path='calculation.structure.varray[?"@name"="stress"]')
)
"""
AtomicCell.lattice_vectors.m_annotations = dict(
xml=MappingAnnotationModel(
path='calculation.structure.crystal.varray[?"@name"="basis"]'
)
)
"""
cell_volume.m_annotations = dict(
xml=MappingAnnotationModel(path='calculation.structure.crystal.i[?"@name"="volume"]')
)
reciprocal_lattice_vectors.m_annotations = dict(
xml=MappingAnnotationModel(path='calculation.structure.crystal.varray[?"@name"="rec_basis"]')
)
total_free_energy.m_annotations = dict(
xml=MappingAnnotationModel(path='calculation.energy.i[?"@name"="e_fr_energy"]')
)
total_internal_energy.m_annotations = dict(
xml=MappingAnnotationModel(path='calculation.energy.i[?"@name"="e_0_energy"]')
)
"""
ElectronicEigenvalues.spin_channel.m_annotations = dict(
xml=MappingAnnotationModel(
path='calculation.eigenvalues.array.set.set[?"@comment"="spin 1"]'
)
)
ElectronicEigenvalues.reciprocal_cell.m_annotations = dict(
xml=MappingAnnotationModel(
path=ElectronicEigenvalues.spin_channel.m_annotations.xml
+ '.set[?"@comment"="kpoint 1"]'
) # TODO not going to work: add conversion to reference
Simulation.m_annotations['xml'] = MappingAnnotationModel(path='modeling')


Program.m_annotations['xml'] = MappingAnnotationModel(path='.generator')


Program.name.m_annotations['xml'] = MappingAnnotationModel(
path='.i[?"@name"="program"]'
)
ElectronicEigenvalues.occupation.m_annotations = dict(
xml=MappingAnnotationModel(
path=ElectronicEigenvalues.reciprocal_cell.m_annotations.xml + '.r[0]'
)


Program.version.m_annotations['xml'] = MappingAnnotationModel(
path='.i[?"@name"="version"]'
)
ElectronicEigenvalues.value.m_annotations = dict(
xml=MappingAnnotationModel(
path=ElectronicEigenvalues.reciprocal_cell.m_annotations.xml + '.r[1]'
)

# ? compilation mode
Program.compilation_host.m_annotations['xml'] = MappingAnnotationModel(
path='.i[?"@name"="platform"]'
)
# ? partial bands


class VasprunXMLParser(MatchingParser):
Expand All @@ -128,19 +61,7 @@ def parse(
logger: BoundLogger,
child_archives: dict[str, EntryArchive] = None,
) -> None:
logger.info(
self.__class__.__repr__() + '.parse', parameter=configuration.parameter
) # give feedback to Ahmed
archive_parser = MetainfoParser(
annotation_key='xml',
data_object=[
Simulation(
model_system=[ModelSystem(cell=AtomicCell)],
model_method=[DFT, KMesh],
output=[ElectronicEigenvalues],
),
],
)
xml_parser = XMLParser(filepath='vasprun.xml') # TODO apply match
xml_parser.convert(archive_parser)
archive.data = archive_parser.data_object
logger.info('VasprunXMLParser.parse', parameter=configuration.parameter)
data_parser = MetainfoParser(annotation_key='xml', data_object=Simulation())
XMLParser().convert(data_parser)
archive.data = data_parser.data_object

0 comments on commit 5de6f3f

Please sign in to comment.