import setup_paths from nomadcore.simple_parser import mainFunction, SimpleMatcher as SM from nomadcore.local_meta_info import loadJsonFile, InfoKindEl from nomadcore.caching_backend import CachingLevel import os, sys, json, logging import numpy as np # description of the input mainFileDescription = SM( name = 'root', weak = True, startReStr = "", subMatchers = [ SM(name = 'newRun', startReStr = r"\s*Entering Link 1 ", repeats = True, required = True, forwardMatch = True, sections = ['section_run','section_method'], subMatchers = [ SM(name = 'header', startReStr = r"\s*Entering Link 1 ", subMatchers = [ SM(r"\s*Cite this work as:"), SM(r"\s*Gaussian [0-9]+, Revision [A-Za-z0-9.]*,"), SM(r"\s\*\*\*\*\*\*\*\*\*\*\*\**"), SM(r"\s*(?PGaussian)\s*(?P[0-9]*:\s.*)") ] ), SM(name = 'globalparams', startReStr = r"\s*%\w*=", subFlags = SM.SubFlags.Unordered, forwardMatch = True, subMatchers = [ SM(r"\s*%[Cc]hk=(?P[A-Za-z0-9.]*)"), SM(r"\s*%[Mm]em=(?P[A-Za-z0-9.]*)"), SM(r"\s*%[Nn][Pp]roc=(?P[A-Za-z0-9.]*)") ] ), SM(name = 'charge_multiplicity', sections = ['section_system_description','gaussian_section_labels'], startReStr = r"\s*Symbolic Z-matrix:", subMatchers = [ SM(r"\s*Charge =\s*(?P[-+0-9]+) Multiplicity =\s*(?P[0-9]+)"), SM(r"\s*(?P\D{1,2}?(?=\s*[0-9,-]))",repeats = True), SM(r"\s*(?P\w{1,2}(?=\s))",repeats = True), SM(r"\s*Variables:|\s*NAtoms=|\s*Z-MATRIX"), SM(r"\s*"), ] ), SM(name = 'geometry', sections = ['section_system_description','gaussian_section_geometry'], startReStr = r"\s*Z-Matrix orientation:|\s*Input orientation:|\s*Standard orientation:", subMatchers = [ SM(r"\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+(?P[-+0-9EeDd.]+)\s+(?P[-+0-9EeDd.]+)\s+(?P[-+0-9EeDd.]+)",repeats = True) ] ), SM(r"\s*Symmetry|\s*Stoichiometry") ]) ]) # loading metadata from nomad-meta-info/meta_info/nomad_meta_info/gaussian.nomadmetainfo.json metaInfoPath = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"../../../../nomad-meta-info/meta_info/nomad_meta_info/gaussian.nomadmetainfo.json")) metaInfoEnv, warnings = loadJsonFile(filePath = metaInfoPath, dependencyLoader = None, extraArgsHandling = InfoKindEl.ADD_EXTRA_ARGS, uri = None) parserInfo = { "name": "parser_gaussian", "version": "1.0" } class GaussianParserContext(object): """main place to keep the parser status, open ancillary files,...""" def __init__(self): pass def startedParsing(self, path, parser): self.parser = parser def onClose_gaussian_section_labels(self, backend, gIndex, section): labels = section["gaussian_atom_label"] logging.error("labels:%s",labels) backend.addValue("atom_label", labels) def onClose_gaussian_section_geometry(self, backend, gIndex, section): xCoord = section["gaussian_atom_x_coord"] yCoord = section["gaussian_atom_y_coord"] zCoord = section["gaussian_atom_z_coord"] logging.error("x:%s",xCoord) logging.error("y:%s",yCoord) logging.error("z:%s",zCoord) atom_positions = np.zeros((len(xCoord),3), dtype=float) for i in range(len(xCoord)): atom_positions[i,0] = xCoord[i] atom_positions[i,1] = yCoord[i] atom_positions[i,2] = zCoord[i] backend.addArrayValues("atom_position", atom_positions) # which values to cache or forward (mapping meta name -> CachingLevel) cachingLevelForMetaName = { "gaussian_atom_x_coord": CachingLevel.Cache, "gaussian_atom_y_coord": CachingLevel.Cache, "gaussian_atom_z_coord": CachingLevel.Cache, "gaussian_atom_label": CachingLevel.Cache, "gaussian_section_geometry": CachingLevel.Ignore, "gaussian_section_labels": CachingLevel.Ignore, } if __name__ == "__main__": mainFunction(mainFileDescription, metaInfoEnv, parserInfo, cachingLevelForMetaName = cachingLevelForMetaName, superContext = GaussianParserContext())