From ee8dfe6b688b5e08509795c0400b1008f51d5d07 Mon Sep 17 00:00:00 2001
From: Ask Hjorth Larsen <asklarsen@gmail.com>
Date: Thu, 1 Mar 2018 19:47:58 +0100
Subject: [PATCH] clean up vestigial code from certain octopus parser modules,
 moving the remainder into the main module

---
 parser/parser-octopus/octopus_info_parser.py  | 122 -----------------
 .../parser-octopus/octopus_logfile_parser.py  |  50 -------
 parser/parser-octopus/parser_octopus.py       | 127 ++++++++++--------
 .../eu/nomad_lab/parsers/OctopusParser.scala  |   2 -
 4 files changed, 68 insertions(+), 233 deletions(-)
 delete mode 100644 parser/parser-octopus/octopus_info_parser.py
 delete mode 100644 parser/parser-octopus/octopus_logfile_parser.py

diff --git a/parser/parser-octopus/octopus_info_parser.py b/parser/parser-octopus/octopus_info_parser.py
deleted file mode 100644
index 33387d8..0000000
--- a/parser/parser-octopus/octopus_info_parser.py
+++ /dev/null
@@ -1,122 +0,0 @@
-from __future__ import print_function
-from builtins import object
-import logging
-import setup_paths
-from nomadcore.simple_parser import SimpleMatcher as SM
-from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
-from nomadcore.unit_conversion.unit_conversion \
-    import register_userdefined_quantity, convert_unit
-import os, sys, json
-
-from util import OCT_ENERGY_UNIT_NAME, f_num, i_num, numpattern, integer,\
-    parse_file_without_decorations
-
-# Match lines like: "      Total    =     -7.05183\n"
-def oct_energy_sm(octname, nomadname):
-    pattern = (r'\s*%(octname)s\s*=\s*%(pattern)s'
-               % dict(octname=octname,
-                      pattern=numpattern(nomadname,
-                                         unit=OCT_ENERGY_UNIT_NAME)))
-    #print 'oct energy sm', pattern
-    return SM(pattern,
-              name=octname)
-
-
-sm_scfconv = SM(r'SCF converged in\s*%s\s*iterations'
-                % integer('x_octopus_info_scf_converged_iterations'),
-                sections=['section_run'])
-sm_energy = SM(r'Energy \[(H|eV)\]:', required=True, name='energy_header',
-               subMatchers=[
-                   oct_energy_sm('Total', 'energy_total'),
-                   oct_energy_sm('Free', 'energy_free'),
-                   oct_energy_sm('Ion-ion', 'x_octopus_info_energy_ion_ion'),
-                   oct_energy_sm('Eigenvalues', 'energy_sum_eigenvalues'),
-                   oct_energy_sm('Hartree', 'energy_electrostatic'),
-                   #oct_energy_sm(r'Int\[n.v_xc\]', ''),
-                   oct_energy_sm('Exchange', 'energy_X'),
-                   oct_energy_sm('Correlation', 'energy_C'),
-                   oct_energy_sm('vanderWaals', 'energy_van_der_Waals'),
-                   oct_energy_sm('-TS', 'energy_correction_entropy'),
-                   oct_energy_sm('Kinetic', 'electronic_kinetic_energy')
-               ])
-
-
-infoFileDescription = SM(
-    name='root',
-    weak=True,
-    startReStr='',
-    fixedStartValues={'program_name': 'octopus'},
-    sections=['section_single_configuration_calculation'],
-    subFlags=SM.SubFlags.Sequenced,
-    subMatchers=[
-        sm_scfconv,
-        sm_energy,
-    ])
-
-parserInfo = {
-  "name": "info_parser_octopus",
-  "version": "1.0"
-}
-
-class OctopusParserContext(object):
-    """main place to keep the parser status, open ancillary files,..."""
-    def __init__(self):
-        self.scfIterNr = 0
-
-    # just examples, you probably want to remove the following two triggers
-    def startedParsing(self, name, parser):
-        pass
-
-    def onClose_section_single_configuration_calculation(self, backend, gIndex, section):
-        """trigger called when section_single_configuration_calculation is closed"""
-        pass
-        #backend.addValue("", self.scfIterNr)
-        #logging.getLogger("nomadcore.parsing").info("closing section_single_configuration_calculation gIndex %d %s", gIndex, section.simpleValues)
-        #self.scfIterNr = 0
-
-    def onClose_section_scf_iteration(self, backend, gIndex, section):
-        """trigger called when section_scf_iteration is closed"""
-        pass
-        #logging.getLogger("nomadcore.parsing").info("closing section_scf_iteration bla gIndex %d %s", gIndex, section.simpleValues)
-        #self.scfIterNr += 1
-
-#def parse_infofile(meta_info_env, pew, fname):
-#    parse_file_without_decorations(pew, meta_info_env, infoFileDescription,
-#                                   parserInfo, OctopusParserContext(), fname)
-
-
-def parse_infofile(meta_info_env, pew, fname):
-    with open(fname) as fd:
-        for line in fd:
-            if line.startswith('SCF converged'):
-                iterations = int(line.split()[-2])
-                pew.addValue('x_octopus_info_scf_converged_iterations',
-                             iterations)
-                break
-        for line in fd:  # Jump down to energies:
-            if line.startswith('Energy ['):
-                octunit = line.strip().split()[-1].strip('[]:')
-                nomadunit = {'eV': 'eV', 'H': 'hartree'}[octunit]
-                break
-
-        names = {'Total': 'energy_total',
-                 'Free': 'energy_free',
-                 'Ion-ion': 'x_octopus_info_energy_ion_ion',
-                 'Eigenvalues': 'energy_sum_eigenvalues',
-                 'Hartree': 'energy_electrostatic',
-                 'Exchange': 'energy_X',
-                 'Correlation': 'energy_C',
-                 'vanderWaals': 'energy_van_der_Waals',
-                 '-TS': 'energy_correction_entropy',
-                 'Kinetic': 'electronic_kinetic_energy'}
-
-        for line in fd:
-            if line.startswith('---'):
-                continue
-            tokens = line.split()
-            if len(tokens) < 3:
-                break
-
-            if tokens[0] in names:
-                pew.addValue(names[tokens[0]],
-                             convert_unit(float(tokens[2]), nomadunit))
diff --git a/parser/parser-octopus/octopus_logfile_parser.py b/parser/parser-octopus/octopus_logfile_parser.py
deleted file mode 100644
index 2fe912b..0000000
--- a/parser/parser-octopus/octopus_logfile_parser.py
+++ /dev/null
@@ -1,50 +0,0 @@
-from nomadcore.simple_parser import mainFunction, SimpleMatcher as SM
-
-from util import numpattern, i_num, f_num, e_num, word, integer, \
-    parse_file_without_decorations
-
-
-parserInfo = {
-  "name": "logfile_parser_octopus",
-  "version": "1.0"
-}
-
-
-logFileDescription = SM(
-    name='root',
-    weak=True,
-    startReStr='',
-    fixedStartValues={'program_name': 'octopus'},
-    #sections=['section_run'],
-    subFlags=SM.SubFlags.Sequenced,
-    subMatchers=[
-        SM(r'Version\s*:\s*%s' % word('program_version')),
-        #SM(r'Revision\s*:\s*%s' % integer('x_octopus_log_svn_revision')),
-    ]
-)
-
-class OctopusLogFileParserContext(object):
-    def startedParsing(self, name, parser):
-        pass
-
-
-def parse_logfile(meta_info_env, pew, fname):
-    # XXX this is just a hack until we decide to do more
-    maxlines = 100
-    with open(fname) as fd:
-        for i, line in enumerate(fd):
-            if i > maxlines:
-                break
-            if line.startswith('Version'):
-                version = line.split()[-1]
-                pew.addValue('program_version', version)
-            elif line.startswith('Revision'):
-                revision = int(line.split()[-1])
-                pew.addValue('x_octopus_log_svn_revision', revision)
-            # XXX more info
-
-
-#def parse_logfile(meta_info_env, pew, fname):
-#    parse_file_without_decorations(pew, meta_info_env, logFileDescription,
-#                                   parserInfo, OctopusLogFileParserContext(),
-#                                   fname)
diff --git a/parser/parser-octopus/parser_octopus.py b/parser/parser-octopus/parser_octopus.py
index e71cb21..8c188a0 100644
--- a/parser/parser-octopus/parser_octopus.py
+++ b/parser/parser-octopus/parser_octopus.py
@@ -13,12 +13,9 @@ import setup_paths
 
 from nomadcore.local_meta_info import loadJsonFile, InfoKindEl
 from nomadcore.parser_backend import JsonParseEventsWriterBackend
-from nomadcore.unit_conversion.unit_conversion import convert_unit, \
-    register_userdefined_quantity
+from nomadcore.unit_conversion.unit_conversion import convert_unit
 
 from aseoct import Octopus, parse_input_file
-from octopus_info_parser import parse_infofile
-from octopus_logfile_parser import parse_logfile
 
 """This is the Octopus parser.
 
@@ -43,6 +40,57 @@ is largely irrelevant.
 """
 
 
+def parse_infofile(meta_info_env, pew, fname):
+    with open(fname) as fd:
+        for line in fd:
+            if line.startswith('SCF converged'):
+                iterations = int(line.split()[-2])
+                pew.addValue('x_octopus_info_scf_converged_iterations',
+                             iterations)
+                break
+        for line in fd:  # Jump down to energies:
+            if line.startswith('Energy ['):
+                octunit = line.strip().split()[-1].strip('[]:')
+                nomadunit = {'eV': 'eV', 'H': 'hartree'}[octunit]
+                break
+
+        names = {'Total': 'energy_total',
+                 'Free': 'energy_free',
+                 'Ion-ion': 'x_octopus_info_energy_ion_ion',
+                 'Eigenvalues': 'energy_sum_eigenvalues',
+                 'Hartree': 'energy_electrostatic',
+                 'Exchange': 'energy_X',
+                 'Correlation': 'energy_C',
+                 'vanderWaals': 'energy_van_der_Waals',
+                 '-TS': 'energy_correction_entropy',
+                 'Kinetic': 'electronic_kinetic_energy'}
+
+        for line in fd:
+            if line.startswith('---'):
+                continue
+            tokens = line.split()
+            if len(tokens) < 3:
+                break
+
+            if tokens[0] in names:
+                pew.addValue(names[tokens[0]],
+                             convert_unit(float(tokens[2]), nomadunit))
+
+
+def parse_logfile(meta_info_env, pew, fname):
+    maxlines = 100
+    with open(fname) as fd:
+        for i, line in enumerate(fd):
+            if i > maxlines:
+                break
+            if line.startswith('Version'):
+                version = line.split()[-1]
+                pew.addValue('program_version', version)
+            elif line.startswith('Revision'):
+                revision = int(line.split()[-1])
+                pew.addValue('x_octopus_log_svn_revision', revision)
+
+
 def parse_gridinfo(metaInfoEnv, pew, fname):
     results = {}
 
@@ -88,8 +136,6 @@ def parse_gridinfo(metaInfoEnv, pew, fname):
 def parse_coordinates_from_parserlog(fname):
     results = {}
 
-    units = 'bohr'
-
     def buildblock(block):
         imax = 1 + max(b[0] for b in block)
         jmax = 1 + max(b[1] for b in block)
@@ -167,10 +213,6 @@ def parse_coordinates_from_parserlog(fname):
 def normalize_names(names):
     return [name.lower() for name in names]
 
-
-#ENERGY_UNIT = 'usrOctEnergyUnit'
-#LENGTH_UNIT = 'usrOctLengthUnit'
-
 metaInfoPath = os.path.normpath(os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                              "../../../../nomad-meta-info/meta_info/nomad_meta_info/octopus.nomadmetainfo.json"))
 metaInfoEnv, warnings = loadJsonFile(filePath=metaInfoPath,
@@ -182,7 +224,6 @@ metaInfoEnv, warnings = loadJsonFile(filePath=metaInfoPath,
 metaInfoKinds = metaInfoEnv.infoKinds.copy()
 all_metadata_names = list(metaInfoKinds.keys())
 normalized2real = dict(zip(normalize_names(all_metadata_names), all_metadata_names))
-#assert 'x_octopus_info_scf_converged_iterations' in metaInfoKinds, '\n'.join(list(sorted(metaInfoKinds.keys())))
 # We need access to this information because we want/need to dynamically convert
 # extracted metadata to its correct type.  Thus we need to know the type.
 # Also since input is case insensitive, we need to convert normalized (lowercase)
@@ -211,26 +252,22 @@ def read_parser_log(path):
             if ' ' in name:
                 # Not a real name
                 continue
-                #print(name)
-            # Octopus questionably writes this one twice
-            #if name != 'speciesprojectorspherethreshold':
             exec_kwargs[name] = value
     return exec_kwargs
 
 
 def is_octopus_logfile(fname):
-    fd = open(fname)
-    for n, line in enumerate(fd):
-        if n > 20:
-            break
-        if '|0) ~ (0) |' in line:  # Eyes from Octopus logo
-            return True
+    with open(fname) as fd:
+        for n, line in enumerate(fd):
+            if n > 20:
+                break
+            if '|0) ~ (0) |' in line:  # Eyes from Octopus logo
+                return True
     return False
 
 
 def find_octopus_logfile(dirname):
-    allfnames = glob('%s/*' % dirname)
-    for fname in allfnames:
+    for fname in os.listdir(dirname):
         if os.path.isfile(fname) and is_octopus_logfile(fname):
             return fname
     return None
@@ -275,28 +312,6 @@ def override_keywords(kwargs, parser_log_kwargs, fd):
     return outkwargs
 
 
-def register_units(kwargs, fd):
-    units = kwargs.get('units', 'atomic').lower()
-    if units == 'atomic':
-        length_unit = 'bohr'
-        energy_unit = 'hartree'
-    elif units == 'ev_angstrom':
-        length_unit = 'angstrom'
-        energy_unit = 'eV'
-    else:
-        raise ValueError('Unknown units: %s' % units)
-
-    if 'unitsinput' in kwargs:
-        raise ValueError('UnitsInput not supported')
-    if 'unitsoutput' in kwargs:
-        raise ValueError('UnitsOutput not supported')
-
-    print('Set units: energy=%s, length=%s' % (energy_unit, length_unit),
-          file=fd)
-    register_userdefined_quantity(ENERGY_UNIT, energy_unit)
-    register_userdefined_quantity(LENGTH_UNIT, length_unit)
-
-
 metadata_dtypes = {'b': bool,
                    'C': str,
                    'f': float}  # Integer?
@@ -375,19 +390,12 @@ def parse(fname, fd):
         print('Override certain keywords with processed keywords', file=fd)
         kwargs = override_keywords(kwargs, parser_log_kwargs, fd)
 
-        #register_units(kwargs, fd)
-
         print('Read as ASE calculator', file=fd)
         calc = Octopus(dirname, check_keywords=False)
-        #atoms = calc.get_atoms()
 
         with open_section('section_basis_set_cell_dependent') as basis_set_cell_dependent_gid:
             pew.addValue('basis_set_cell_dependent_kind', 'realspace_grids')
-            # XXX FIXME spacing can very rarely be 3 numbers!
-            # uuh there is no meaningful way to set grid spacing
-        #    pass
-        #cubefiles = glob('staticdirname/*.cube')
-        #cubefiles.sort()
+            # How does nomad want grid spacing?
 
         nbands = calc.get_number_of_bands()
         nspins = calc.get_number_of_spins()
@@ -506,16 +514,17 @@ def parse(fname, fd):
                              float(parser_log_kwargs['excesscharge']))
                 oct_theory_level = kwargs.get('theorylevel', 'dft')
 
-                theory_levels = dict(#independent_particles='',
-                                     #hartree='',
-                                     #hartree_fock='',
-                                     dft='DFT')
-                                     #classical='',
-                                     #rdmft='')
+                theory_levels = dict(independent_particles='independent_particles',  # not defined by Nomad
+                                     hartree='Hartree',  # not defined by Nomad
+                                     hartree_fock='DFT',  # nomad wants it that way
+                                     dft='DFT',
+                                     classical='Classical',  # Not defined by Nomad
+                                     rdmft='RDMFT')  # Not defined by Nomad
                 # TODO how do we warn if we get an unexpected theory level?
+                # Currently: KeyError
                 nomad_theory_level = theory_levels[oct_theory_level]
 
-                pew.addValue('electronic_structure_method', 'DFT')
+                pew.addValue('electronic_structure_method', nomad_theory_level)
 
                 if oct_theory_level == 'dft':
                     ndim = int(kwargs.get('dimensions', 3))
diff --git a/src/main/scala/eu/nomad_lab/parsers/OctopusParser.scala b/src/main/scala/eu/nomad_lab/parsers/OctopusParser.scala
index c208b08..43ce1f3 100644
--- a/src/main/scala/eu/nomad_lab/parsers/OctopusParser.scala
+++ b/src/main/scala/eu/nomad_lab/parsers/OctopusParser.scala
@@ -48,10 +48,8 @@ Simulation Box:
   resList = Seq(
     "parser-octopus/parser_octopus.py",
     "parser-octopus/aseoct.py",
-    "parser-octopus/octopus_logfile_parser.py",
     "parser-octopus/generate-octopus-json.py",
     "parser-octopus/util.py",
-    "parser-octopus/octopus_info_parser.py",
     "parser-octopus/setup_paths.py",
     "nomad_meta_info/public.nomadmetainfo.json",
     "nomad_meta_info/common.nomadmetainfo.json",
-- 
GitLab