diff --git a/parser/parser-wien2k/wien2k_parser.py b/parser/parser-wien2k/wien2k_parser.py index d4943a755c09344743941c6f23bb68ef8821dd5d..593c019c1dc35382aa80cf80d02f1204b3f239d4 100644 --- a/parser/parser-wien2k/wien2k_parser.py +++ b/parser/parser-wien2k/wien2k_parser.py @@ -4,7 +4,7 @@ from nomadcore.simple_parser import mainFunction, AncillaryParser, CachingLevel from nomadcore.simple_parser import SimpleMatcher as SM from nomadcore.local_meta_info import loadJsonFile, InfoKindEl import os, sys, json -import wien2k_parser_struct, wien2k_parser_in0, wien2k_parser_in1c +import wien2k_parser_struct, wien2k_parser_in0, wien2k_parser_in1c, wien2k_parser_in2c class Wien2kContext(object): """context for wien2k parser""" @@ -69,6 +69,19 @@ class Wien2kContext(object): subParser.parseFile(fIn) + mainFile = self.parser.fIn.fIn.name + fName = mainFile[:-4] + ".in2c" + if os.path.exists(fName): + subSuperContext = wien2k_parser_in2c.Wien2kIn2cContext() + subParser = AncillaryParser( + fileDescription = wien2k_parser_in2c.buildIn2cMatchers(), + parser = self.parser, + cachingLevelForMetaName = wien2k_parser_in2c.get_cachingLevelForMetaName(self.metaInfoEnv, CachingLevel.PreOpenedIgnore), + superContext = subSuperContext) + with open(fName) as fIn: + subParser.parseFile(fIn) + + # description of the input mainFileDescription = SM( name = 'root', diff --git a/parser/parser-wien2k/wien2k_parser_in2c.py b/parser/parser-wien2k/wien2k_parser_in2c.py new file mode 100644 index 0000000000000000000000000000000000000000..48461d4c8d497fdb4d06ee328fb712ac5f412b0b --- /dev/null +++ b/parser/parser-wien2k/wien2k_parser_in2c.py @@ -0,0 +1,69 @@ +from builtins import object +import setup_paths +from nomadcore.simple_parser import mainFunction, CachingLevel +from nomadcore.simple_parser import SimpleMatcher as SM +from nomadcore.local_meta_info import loadJsonFile, InfoKindEl +import os, sys, json + +class Wien2kIn2cContext(object): + """context for wien2k struct parser""" + + def __init__(self): + self.parser = None + + def initialize_values(self): + """allows to reset values if the same superContext is used to parse different files""" + pass + + def startedParsing(self, path, parser): + """called when parsing starts""" + self.parser = parser + # allows to reset values if the same superContext is used to parse different files + self.initialize_values() + + +# description of the input +def buildIn2cMatchers(): + return SM( + name = 'root', + weak = True, + startReStr = "", + sections = ["section_run", "section_method"], + subMatchers = [ +# SM(name = 'systemName', +# startReStr = r"(?P<x_wien2k_system_nameIn>.*)"), + SM(r"\s*(?P<x_wien2k_in2c_switch>[A-Z]+)\s*.*") +# SM(r"\s*(?P<x_wien2k_rkmax>[0-9.]+)\s*[0-9]+\s*[0-9]+\s*\WR-..\WK-...; MAX \w*.*") +# SM(r"(?P<x_wien2k_calc_mode>.*)"), +# SM(r"\s*(?P<x_wien2k_unit_cell_param_a>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_unit_cell_param_b>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_unit_cell_param_c>[-+0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_alfa>[-+]?[0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_beta>[-+]?[0-9]*\.\d{0,6}){0,10}\s*(?P<x_wien2k_angle_between_unit_axis_gamma>[-+]?[0-9]*\.\d*)"), +# SM(r"\s*ATOM\s*[-0-9]+:\s*X=(?P<x_wien2k_atom_pos_x>[-+0-9.eEdD]+)\s*Y=(?P<x_wien2k_atom_pos_y>[-+0-9.eEdD]+)\s*Z=(?P<x_wien2k_atom_pos_z>[-+0-9.eEdD]+)", +# repeats=True, +# sections=["x_wien2k_section_equiv_atoms"], +# subMatchers=[ +# SM(r"\s*[-0-9]+:\s*X=(?P<x_wien2k_atom_pos_x>[-+0-9.eEdD]+)\s*Y=(?P<x_wien2k_atom_pos_y>[-+0-9.eEdD]+)\s*Z=(?P<x_wien2k_atom_pos_z>[-+0-9.eEdD]+)", +# repeats=True +# ), +# SM(r"\s*(?P<x_wien2k_atom_name>^.+)\s*NPT=\s*(?P<x_wien2k_NPT>[0-9]+)\s*R0=(?P<x_wien2k_R0>[0-9.]+)\s*RMT=\s*(?P<x_wien2k_RMT>[0-9.]+)\s*Z:\s*(?P<x_wien2k_atomic_number_Z>[0-9.]+)",) +# ] +# ) + ]) + +def get_cachingLevelForMetaName(metaInfoEnv, CachingLvl): + """Sets the caching level for the metadata. + + Args: + metaInfoEnv: metadata which is an object of the class InfoKindEnv in nomadcore.local_meta_info.py. + CachingLvl: Sets the CachingLevel for the sections k_band, run, and single_configuration_calculation. + This allows to run the parser without opening new sections. + + Returns: + Dictionary with metaname as key and caching level as value. + """ + # manually adjust caching of metadata + cachingLevelForMetaName = { + 'section_run': CachingLvl, + 'section_method': CachingLvl + } + return cachingLevelForMetaName + +# loading metadata from nomad-meta-info/meta_info/nomad_meta_info/fhi_aims.nomadmetainfo.json diff --git a/src/main/scala/eu/nomad_lab/parsers/Wien2kParser.scala b/src/main/scala/eu/nomad_lab/parsers/Wien2kParser.scala index abd83bcfe79875f86c4bc3958d9a08c0bdf1a126..e3caef7456b40741fb2f73859d6529be85f3bb41 100644 --- a/src/main/scala/eu/nomad_lab/parsers/Wien2kParser.scala +++ b/src/main/scala/eu/nomad_lab/parsers/Wien2kParser.scala @@ -29,6 +29,7 @@ object Wien2kParser extends SimpleExternalParserGenerator( "parser-wien2k/wien2k_parser.py", "parser-wien2k/wien2k_parser_in0.py", "parser-wien2k/wien2k_parser_in1c.py", + "parser-wien2k/wien2k_parser_in2c.py", "parser-wien2k/wien2k_parser_struct.py", "parser-wien2k/setup_paths.py", "nomad_meta_info/public.nomadmetainfo.json",