Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix the plugin setup #2

Merged
merged 4 commits into from
Jul 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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.*',
)
140 changes: 13 additions & 127 deletions src/nomad_parser_vasp/parsers/xml_parser.py
Original file line number Diff line number Diff line change
@@ -1,123 +1,21 @@
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

configuration = config.get_plugin_entry_point('nomad_parser_vasp.parsers:myparser')
from nomad_simulations.schema_packages.general import Simulation

# 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
)
ElectronicEigenvalues.occupation.m_annotations = dict(
xml=MappingAnnotationModel(
path=ElectronicEigenvalues.reciprocal_cell.m_annotations.xml + '.r[0]'
)
)
ElectronicEigenvalues.value.m_annotations = dict(
xml=MappingAnnotationModel(
path=ElectronicEigenvalues.reciprocal_cell.m_annotations.xml + '.r[1]'
)
configuration = config.get_plugin_entry_point(
'nomad_parser_vasp.parsers:xml_entry_point'
)
# ? partial bands


class VasprunXMLParser(MatchingParser):
Expand All @@ -128,19 +26,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())
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if this is a matching parsee you would meed to.add parsee specs

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You mean like the filename to match? I already added it to XMLParser

XMLParser(filepath=mainfile).convert(data_parser)
archive.data = data_parser.data_object
165 changes: 165 additions & 0 deletions src/nomad_parser_vasp/schema_packages/vasp_package.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
from typing import (
TYPE_CHECKING,
)

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

from nomad.metainfo import SchemaPackage
from nomad.parsing.file_parser.mapping_parser import MappingAnnotationModel
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.numerical_settings import KMesh

m_package = SchemaPackage()

# note: vasprun.xml has many meta fields, explaining field semantics
Simulation.m_def.m_annotations['xml'] = MappingAnnotationModel(path='modeling')

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

Simulation.model_method.m_annotations['xml'] = MappingAnnotationModel(
path='.parameters'
)

Simulation.model_system.m_annotations['xml'] = MappingAnnotationModel(
path='.calculation'
)

Simulation.model_system.cell.m_annotations['xml'] = MappingAnnotationModel(
path='.structure'
)

Simulation.outputs.m_annotations['xml'] = MappingAnnotationModel(path='.calculation')

Program.name.m_annotations['xml'] = MappingAnnotationModel(
path='.i[?"@name"="program"]'
)

Program.version.m_annotations['xml'] = MappingAnnotationModel(
path='.i[?"@name"="version"]'
)

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

DFT.numerical_settings.m_annotations['xml'] = MappingAnnotationModel(
path='modeling.kpoints'
)

dft_path = '.separator[?"@name"="electronic exchange-correlation"]'
DFT.xc_functionals.m_annotations['xml'] = MappingAnnotationModel(
path=dft_path
) # start from Simulation.model_method 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(
path=dft_path + '.i[?"@name"="GGA"]' # TODO add LDA & mGGA, convert_xc
)
)

KMesh.grid.m_annotations['xml'] = MappingAnnotationModel(
path='.generation.v[?"@name"="divisions"]'
) # start from DFT.numerical_settings

KMesh.offset.m_annotations['xml'] = MappingAnnotationModel(
path='.generation.v[?"@name"="shift"]'
) # start from DFT.numerical_settings

KMesh.offset.m_annotations['xml'] = MappingAnnotationModel(
path='.generation.v[?"@name"="shift"]'
) # start from DFT.numerical_settings

KMesh.points.m_annotations['xml'] = MappingAnnotationModel(
path='.varray[?"@name"="kpointlist"].v'
) # start from DFT.numerical_settings

KMesh.weights.m_annotations['xml'] = MappingAnnotationModel(
path='.varray[?"@name"="weights"].v'
) # start from DFT.numerical_settings


# ? target <structure name="initialpos" > and <structure name="finalpos" >


AtomicCell.positions.m_annotations = dict(
xml=MappingAnnotationModel(path='.varray[?"@name"="positions"]')
) # start from Simulation.model_system.cell path

"""
...forces.m_annotations['xml'] = MappingAnnotationModel(
path='.varray[?"@name"="forces"]'
) # start from Simulation.model_system.cell path

...stress.m_annotations['xml'] = MappingAnnotationModel(
path='.varray[?"@name"="stress"]'
) # start from Simulation.model_system.cell path
"""

AtomicCell.lattice_vectors.m_annotations['xml'] = MappingAnnotationModel(
path='.crystal.varray[?"@name"="basis"]'
) # start from Simulation.model_system.cell path

"""
cell_volume.m_annotations['xml'] = MappingAnnotationModel(
path='.crystal.i[?"@name"="volume"]'
) # start from Simulation.model_system.cell path

reciprocal_lattice_vectors.m_annotations['xml'] = MappingAnnotationModel(
path='.crystal.varray[?"@name"="rec_basis"]'
) # start from Simulation.model_system.cell path

total_free_energy.m_annotations['xml'] = MappingAnnotationModel(
path='calculation.energy.i[?"@name"="e_fr_energy"]'
)

total_internal_energy.m_annotations['xml'] = MappingAnnotationModel(
path='calculation.energy.i[?"@name"="e_0_energy"]'
)

...eigenvalues.m_annotations['xml'] = MappingAnnotationModel(
path='.eigenvalues.array'
)

ElectronicEigenvalues.spin_channel.m_annotations['xml'] = MappingAnnotationModel(
path='.eigenvalues.set.set[?"@comment"="spin 1"]'
) # start from Simulation.outputs path

ElectronicEigenvalues.reciprocal_cell.m_annotations['xml'] = MappingAnnotationModel(
path=ElectronicEigenvalues.spin_channel.m_annotations.xml
+ '.set[?"@comment"="kpoint 1"]'
) # TODO not going to work: add conversion to reference

ElectronicEigenvalues.occupation.m_annotations['xml'] = MappingAnnotationModel(
path=ElectronicEigenvalues.reciprocal_cell.m_annotations.xml + '.r[0]'
)

ElectronicEigenvalues.value.m_annotations['xml'] = MappingAnnotationModel(
path=ElectronicEigenvalues.reciprocal_cell.m_annotations.xml + '.r[1]'
)
"""

m_package.__init_metainfo__()
Loading