diff --git a/amberparser/AMBERCommon.py b/amberparser/AMBERCommon.py
index 16da670d21b0dc855d37c6ca78c644c454ced218..7892043c5ae5dc75e04539a55c2d088af905e65a 100644
--- a/amberparser/AMBERCommon.py
+++ b/amberparser/AMBERCommon.py
@@ -19,12 +19,13 @@ from nomadcore.caching_backend import CachingLevel
 from nomadcore.simple_parser import mainFunction
 from nomadcore.simple_parser import SimpleMatcher as SM
 from .AMBERDictionary import get_unitDict, get_nameListDict, get_fileListDict, set_excludeList, set_includeList
-from .MetaInfoStorage import COMMON_META_INFO_PATH, PUBLIC_META_INFO_PATH
-from . import MetaInfoStorage as mStore
+from MetaInfoStorage import COMMON_META_INFO_PATH, PUBLIC_META_INFO_PATH
+import MetaInfoStorage as mStore
 import logging
 import json
 import os
 import re
+import metainfo
 
 PARSERNAME = "AMBER"
 PROGRAMNAME = "amber"
@@ -38,8 +39,8 @@ PARSER_INFO_DEFAULT = {
 }
 
 META_INFO_PATH = os.path.normpath(os.path.join(
-    os.path.dirname(os.path.abspath(__file__)),
-    "../../../../nomad-meta-info/meta_info/nomad_meta_info/amber.nomadmetainfo.json"))
+    os.path.dirname(os.path.abspath(metainfo.__file__)),
+    "amber.nomadmetainfo.json"))
 
 LOGGER = logging.getLogger("nomad.AMBERParser")
 
diff --git a/amberparser/AMBERParser.py b/amberparser/AMBERParser.py
index f5107cc3a985f73cf8a2b14e8c0bbd460a4c1042..35be4fb5d40a2963ca235f92aacb95c23b47535d 100644
--- a/amberparser/AMBERParser.py
+++ b/amberparser/AMBERParser.py
@@ -1063,6 +1063,7 @@ class AMBERParserInterface():
         backend = self.backend_factory("amber.nomadmetainfo.json")
         parserInfo = {'name': 'amber-parser', 'version': '1.0'}
         context = AMBERParser()
+        context.coverageIgnore = re.compile(r"^(?:" + r"|".join(context.coverageIgnoreList) + r")$")
         with patch.object(sys, 'argv', ['<exe>', '--uri', 'nmd://uri', mainfile]):
             mainFunction(
                 mainFileDescription=context.mainFileDescription(),
diff --git a/amberparser/MetaInfoStorage.py b/amberparser/MetaInfoStorage.py
deleted file mode 100644
index b5cef009421e7aee7a419d5572fbc2de39d0fd52..0000000000000000000000000000000000000000
--- a/amberparser/MetaInfoStorage.py
+++ /dev/null
@@ -1,749 +0,0 @@
-# Copyright 2017-2018 Berk Onat, Fawzi Mohamed
-#
-#   Licensed under the Apache License, Version 2.0 (the "License");
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an "AS IS" BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
-
-import numpy as np
-from nomadcore.unit_conversion.unit_conversion import convert_unit
-from contextlib import contextmanager
-import logging
-import json
-import os
-import re
-from collections import namedtuple
-
-COMMON_META_INFO_PATH = os.path.normpath(os.path.join(
-    os.path.dirname(os.path.abspath(__file__)),
-    "../../../../nomad-meta-info/meta_info/nomad_meta_info/common.nomadmetainfo.json"))
-
-PUBLIC_META_INFO_PATH = os.path.normpath(os.path.join(
-    os.path.dirname(os.path.abspath(__file__)),
-    "../../../../nomad-meta-info/meta_info/nomad_meta_info/public.nomadmetainfo.json"))
-
-NOTEXCEPT = re.compile(r'[^a-cf-zA-CF-Z!\.?,]')
-
-class Container(object):
-    """The container class for nested data storage
-    """
-    def __init__(self, *args):
-        self.Name = []
-        for arg in args:
-            if isinstance(arg, str):
-                self.Name.append(arg)
-        self.Active = False
-        self.OpenBackend = False
-        self.CloseBackend = False
-        self.gid = None
-        self.Containers = []
-        self.References = []
-        self.ReferencedFrom = []
-        self.Storage = None
-        self.Indent = '   '
-        self.Color = None
-        self.PrintOnlyActive = None
-        self.PrintOnlyNames = None
-        self.localDict = None
-
-    def add(self, *args):
-        for arg in args:
-            if isinstance(arg, Container):
-                self.Containers.append(arg)
-            if isinstance(arg, Storage):
-                if self.Storage:
-                    self.Storage(arg.__dict__)
-                else:
-                    self.Storage = arg
-            if isinstance(arg, dict):
-                if self.Storage:
-                    if isinstance(self.Storage, dict):
-                        self.Storage.update(arg)
-                    elif isinstance(self.Storage, Storage):
-                        self.Storage(arg)
-                else:
-                    self.Storage = Storage(arg)
-            if isinstance(arg, JsonMetaInfo):
-                for item in arg.jsonList:
-                    self.add(item)
-
-    def build(self, metadata, startsection, umaskdict):
-        if isinstance(metadata, JsonMetaInfo):
-            attrdict = metadata.attributes(startsection)
-            if attrdict:
-                self.add(attrdict)
-            childs = metadata.siblings(startsection)
-            if startsection in umaskdict.keys():
-                excludes = umaskdict[startsection]
-            else:
-                excludes = []
-            for section in childs:
-                if section not in excludes:
-                    newContainer = Container(section)
-                    newContainer.build(metadata, section, umaskdict)
-                    if newContainer.Storage is None:
-                        newContainer.add()
-                    self.add(newContainer)
-            return True
-        else:
-            return False
-
-    def populate(self, metadata, startsection, umaskdict, updatedict):
-        if isinstance(metadata, JsonMetaInfo):
-            self.build(metadata, startsection, umaskdict)
-            self.update(updatedict)
-
-    def updaterefs(self, *args):
-        for arg in args:
-            if isinstance(arg, Container):
-                self.References.extend(arg.Name)
-
-    def update(self, *args):
-        for arg in args:
-            if isinstance(arg, dict):
-                if arg["startSection"]:
-                    if self.Name in arg["startSection"]:
-                        self.accumulateValues(self, arg)
-                    else:
-                        if self.Containers:
-                            for module in self.Containers:
-                                module.update(arg)
-                else:
-                    self.accumulateValues(self, arg)
-
-    def updateBackend(self, backend, startsection=None, autoopenclose=False):
-        if startsection:
-            if self.Name == startsection:
-                if autoopenclose:
-                    with self.autosection(backend, self.Name):
-                        self.updateBackendValues(backend)
-                else:
-                    self.updateBackendValues(backend)
-            else:
-                if self.Containers:
-                    for module in self.Containers:
-                        module.updateBackend(backend, startsection, autoopenclose)
-        else:
-            if autoopenclose:
-                with self.autosection(backend, self.Name):
-                    self.updateBackendValues(backend)
-            else:
-                self.updateBackendValues(backend)
-
-    @contextmanager
-    def autosection(self, backend, name):
-        self.gid = backend.openSection(name)
-        yield self.gid
-        backend.closeSection(name, self.gid)
-
-    def opensection(self, backend, name):
-        self.gid = backend.openSection(name)
-        yield self.gid
-
-    def closesection(self, backend, name):
-        backend.closeSection(name, self.gid)
-
-    def fetchAttr(self, resdict):
-        for item in resdict:
-            if self.Storage:
-                if item in self.Storage.__dict__:
-                    resdict.update({item: self.Storage.__dict__[item]})
-                else:
-                    if self.Containers:
-                        for module in self.Containers:
-                            resdict.update(module.fetchAttr(resdict))
-            else:
-                if self.Containers:
-                    for module in self.Containers:
-                        resdict.update(module.fetchAttr(resdict))
-        return resdict
-
-    def updateBackendValues(self, backend):
-        if self.Storage:
-            self.updateBackendStorage(backend)
-            self.Active = False
-        if self.Containers:
-            for module in self.Containers:
-                module.updateBackendValues(backend)
-
-    def accumulateValues(self, *args):
-        for arg in args:
-            if isinstance(arg, dict):
-                if self.Storage:
-                    self.accumulateDict(arg["dictionary"])
-                if self.Containers:
-                    for module in self.Containers:
-                        module.accumulateValues(arg)
-                if "activeSections" in arg:
-                    if self.Name in arg["activeSections"]:
-                        self.Active = True
-                if "muteSections" in arg:
-                    if self.Name in arg["muteSections"]:
-                        self.Active = False
-
-    def checkUpdateValue(self, item, localdict):
-        """ Updating value with the rules given in depends
-
-         Updating values follows the following order:
-          1) If 'depends' is supplied (not empty or not None),
-             the tests in the depends list will be checked in order.
-             If one of the tests is successful than the one of the
-             values in 'assign' or 'value' will be updated for the item.
-             Here 'assign' will assign a new value in the given string and
-             'value' will assign the value of the given key item.
-             (Ex. : 'assign' : 'CG' will update the item with 'CG' while
-             'value' : 'NATOM' will update the item with number of atoms
-             returned by the value of NATOM key ,which is stored in lookup dict.)
-          2) If 'depends' is supplied but a lookup dictionary is not than
-             only the values of attributes in the sections can be used for test.
-             The rest of the tests and assignments are updated as in case (1).
-          3) If 'depends' is not supplied, subfunction is used to update value.
-          4) If 'depends' and subfunction are not supplied but value of
-             MetaInfoMap is supplied, the value will be assign directly from the value
-             item.
-          5) If none of the above items are supplied, this function will return None
-             to not update any values for the selected item.
-        """
-        # Check whether depends is supplied in the item.
-        updateValue = None
-        storeValue = False
-        if "prefunction" in item:
-            prefunc = item.prefunction
-            storeValue, updateValue, item = prefunc(item)
-        if "depends" in item:
-            firstdepend = item["depends"][0]
-            if "lookupdict" in item:
-                needFetchVal = False
-                if "test" in firstdepend:
-                    updateValue, localdict = self.checkTestsDicts(item, localdict)
-                elif "assign" in firstdepend:
-                    updateValue = firstdepend["assign"]
-                elif "value" in firstdepend:
-                    itemdepval = firstdepend["value"]
-                    needFetchVal = True
-                elif "store" in firstdepend:
-                    itemdepval = firstdepend["store"]
-                    needFetchVal = True
-                    storeValue = True
-                if needFetchVal:
-                    if itemdepval in localdict:
-                        checkval = localdict[itemdepval]
-                    else:
-                        accessName, checkval = self.findNameInLookupDict(itemdepval, item.lookupdict)
-                        localdict.update({itemdepval : checkval})
-                    updateValue = checkval
-            else:
-                needFetchVal = False
-                if "test" in firstdepend:
-                    updateValue, localdict = self.checkTestsAttr(item, localdict)
-                elif "assign" in firstdepend:
-                    updateValue = firstdepend["assign"]
-                elif "value" in firstdepend:
-                    itemdepval = firstdepend["value"]
-                    needFetchVal = True
-                elif "store" in firstdepend:
-                    itemdepval = firstdepend["store"]
-                    needFetchVal = True
-                    storeValue = True
-                if needFetchVal:
-                    if itemdepval in localdict:
-                        checkval = localdict[itemdepval]
-                    else:
-                        attrdict = {deptest[0] : ''}
-                        attrdict = self.fetchAttr(attrdict)
-                        localdict.update(attrdict)
-                        checkval = attrdict[deptest[0]]
-                    updateValue = checkval
-        elif "subfunction" in item:
-            subfunc = item.subfunction
-            storeValue, updateValue, item = subfunc(item)
-        elif "value" in item:
-            updateValue = item['value']
-        if "postfunction" in item:
-            postfunc = item.postfunction
-            storeValue, updateValue, item = postfunc(item)
-        if "valtype" in item:
-            if updateValue is not None:
-                updateValue = self.convertToNumber(updateValue, item["valtype"])
-        if("unit" in item and "unitdict" in item):
-            if updateValue is not None:
-                updateValue = self.convertUnits(updateValue, item["unit"], item["unitdict"])
-        return storeValue, updateValue, localdict
-
-    def convertToNumber(self, updateValue, valtype):
-        if(isinstance(updateValue, list) or isinstance(updateValue, tuple)):
-            newUpdateValue = [eval(
-                valtype+"("+str(ival)+")"
-                ) for ival in updateValue]
-        elif isinstance(updateValue, np.ndarray):
-            newUpdateValue = np.asarray([eval(
-                valtype+"("+str(ival)+")"
-                ) for ival in updateValue])
-        elif self.is_number(updateValue):
-            newUpdateValue = eval(valtype+"("+str(updateValue)+")")
-        else:
-            # I hope you know what you are doing
-            newUpdateValue = updateValue
-        return newUpdateValue
-
-    def convertUnits(self, updateValue, unit, unitdict):
-        if(isinstance(updateValue, list) or isinstance(updateValue, tuple)):
-            updateValue = [float(ival) * self.unitConverter(
-                unit, unitdict
-                ) for ival in updateValue]
-        elif isinstance(updateValue, np.ndarray):
-            updateValue = updateValue * self.unitConverter(
-                unit, unitdict)
-            #updateValue = np.asarray([self.unitConverter(
-            #    ival, unit, unitdict
-            #    ) for ival in updateValue])
-        elif self.is_number(updateValue):
-            updateValue = self.convertToNumber(updateValue, "float")
-            updateValue = updateValue * self.unitConverter(
-                unit, unitdict)
-        else:
-            # I hope you know what you are doing
-            updateValue = float(updateValue) * self.unitConverter(
-                unit, unitdict)
-        return updateValue
-
-    def unitConverter(self, unit, unitdict):
-        """ Unit converter using definitions of units explicitly
-
-            The unit names are converted to numbers and the resulting
-            expression will be evaluated by python.
-            Ex.: unit = 'electron-volt/Angstrom^3'
-                 will be converted to
-                 unit = '1.602176565e-19*1.0/1.0e-10**3'
-                 factor = eval(unit) = 160.2176565e+9 Joule/meter^3 (Pascal)
-                 160.2176565e+9 Pascal = 160.2176565 GPa
-                 in SI units and the result will be calculated as follows:
-                 output_value = input_value * factor
-        """
-        newunit = unit.lower()
-        newunit = newunit.replace('-','*').replace(' ', '*').replace('^', "**")
-        for key,value in unitdict.items():
-            newunit = newunit.replace(str(key), str(value))
-        NOTEXCEPT.sub('', newunit)
-        return float(eval(newunit))
-
-    def checkTestsDicts(self, item, localdict):
-        for depdict in item["depends"]:
-            deptests = depdict["test"]
-            depmeet = 0
-            for deptest in deptests:
-                if deptest[0] in localdict:
-                    checkval = localdict[deptest[0]]
-                else:
-                    accessName, checkval = self.findNameInLookupDict(deptest[0], item.lookupdict)
-                    localdict.update({deptest[0] : checkval})
-                if(('<' in deptest[1] or   # In Python 3, different type comparisons
-                    '>' in deptest[1]) and # are removed. Therefore, < and > comparisons
-                    (checkval is None)):   # with a None value generates TypeError
-                    pass
-                else:
-                    if eval(str(checkval) + deptest[1]):
-                        depmeet += 1
-                if depmeet == len(deptests):
-                    if 'assign' in depdict:
-                        return depdict['assign'], localdict
-                    elif 'value' in depdict:
-                        if depdict['value'] in localdict:
-                            checkval = localdict[depdict['value']]
-                        else:
-                            accessName, checkval = self.findNameInLookupDict(depdict['value'],
-                                    item.lookupdict)
-                            localdict.update({depdict['value'] : checkval})
-                        return checkval, localdict
-        return None, localdict
-
-    def checkTestsAttr(self, item, localdict):
-        for depdict in item["depends"]:
-            #depdict = item["depends"][tests]
-            for deptests in depdict["test"]:
-                depmeet = 0
-                for deptest in deptests:
-                    if deptest[0] in localdict:
-                        checkval = localdict[deptest[0]]
-                    else:
-                        attrdict = {deptest[0] : ''}
-                        attrdict = self.fetchAttr(attrdict)
-                        localdict.update(attrdict)
-                        checkval = attrdict[deptest[0]]
-                    if eval(str(checkval) + deptest[1]):
-                        depmeet += 1
-                if depmeet == len(deptests):
-                    if 'assign' in depdict:
-                        return depdict['assign'], localdict
-                    elif 'value' in depdict:
-                        if depdict['value'] in localdict:
-                            checkval = localdict[depdict['value']]
-                        else:
-                            attrdict = {depdict['value'] : ''}
-                            attrdict = self.fetchAttr(attrdict)
-                            localdict.update(attrdict)
-                            checkval = attrdict[deptest[0]]
-                        return checkval, localdict
-        return None, localdict
-
-    def findNameInLookupDict(self, metaname, lookupdict):
-        for item in lookupdict:
-            itemMap = lookupdict[item]
-            #if metaname in itemMap.metaName:
-            if metaname in itemMap.matchStr:
-                return item, itemMap.value
-
-    def updateBackendStorage(self, backend):
-        for itemk in self.Storage.__dict__:
-            if self.Storage.__dict__[itemk]["act"]:
-                self.Storage.__dict__[itemk]["act"] = False
-                value = self.Storage.__dict__[itemk]["val"]
-                if isinstance(value, np.ndarray):
-                    backend.addArrayValues(itemk, value)
-                elif isinstance(value, (list, tuple)):
-                    backend.addArrayValues(itemk, np.asarray(value))
-                elif value is None:
-                    pass
-                else:
-                    backend.addValue(itemk, value)
-
-    def accumulateDict(self, checkDict):
-        localdict = {}
-        for itemk in checkDict:
-            itemv = checkDict[itemk]
-            storeValue, updateValue, localdict = self.checkUpdateValue(itemv, localdict)
-            if updateValue is not None:
-                if itemk in self.Storage.__dict__:
-                    if storeValue:
-                        #If we need to store the updated values
-                        if self.Storage.__dict__[itemk]["val"] is None:
-                            #If not initialized, initialize with a list to store
-                            if isinstance(updateValue, str) and float(updateValue):
-                                self.Storage.__dict__[itemk]["val"] = [float(updateValue)]
-                            else:
-                                self.Storage.__dict__[itemk]["val"] = [updateValue]
-                        else:
-                            #Append to the stored list if there is a list
-                            if type(self.Storage.__dict__[itemk]["val"]) is list:
-                                #self.Storage.__dict__[itemk]["val"].append(updateValue)
-                                if isinstance(updateValue, str) and float(updateValue):
-                                    self.Storage.__dict__[itemk]["val"].append(float(updateValue))
-                                else:
-                                    self.Storage.__dict__[itemk]["val"].append(updateValue)
-                            else:
-                                #Convert the prevoius update to list and append update
-                                preValue = self.Storage.__dict__[itemk]["val"]
-                                self.Storage.__dict__[itemk]["val"] = [preValue, updateValue]
-                    else:
-                        #No need to store, assign the updated value
-                        self.Storage.__dict__[itemk]["val"] = updateValue
-                    self.Storage.__dict__[itemk]["act"] = True
-                elif (itemk.startswith('x_') and
-                      itemv.activeSection == self.Name):
-                    attrvalues = {
-                            'act' : True,
-                            'val' : updateValue,
-                            'kind': None,
-                            'dtyp': "C",
-                            'unit': None,
-                            'size': [],
-                            'refs': None
-                            }
-                    self.Storage.__dict__.update({itemk : attrvalues})
-                self.Active = True
-                if "valueSize" in itemv:
-                    if "sizeMetaName" in itemv:
-                        self.Storage.__dict__[itemv["sizeMetaName"]] = itemv["valueSize"]
-                if "unitconverter" in itemv:
-                    newValue = itemv["unitconverter"](self, itemv)
-                    self.Storage.__dict__[itemk["val"]] = newvalue
-
-    def is_number(self, val):
-        try:
-            float(val)
-            return True
-        except ValueError:
-            return False
-
-    def __str__(self, caller=None, decorate='', color=None, printactive=None, onlynames=None):
-        string = ''
-        if onlynames is None:
-            if self.PrintOnlyNames:
-                onlynames = self.PrintOnlyNames
-        if printactive is None:
-            if self.PrintOnlyActive:
-                printactive = self.PrintOnlyActive
-        if color:
-            color = int(color) + 1
-        else:
-            if self.Color:
-                color = int(self.Color)
-        printok = False
-        if printactive:
-            if self.Active:
-                printok = True
-        else:
-            printok = True
-        if caller:
-            if printok:
-                if color:
-                    string = '%s\033[9%sm`-->[' % (decorate + self.Indent, str(color%6 + 1))
-                    string = string + ','.join(['%s' % (name) for name in self.Name]) + ']\n\033[0m'
-                else:
-                    string = '%s`-->[' % (decorate + self.Indent)
-                    string = string + ','.join(['%s' % (name) for name in self.Name]) + ']\n'
-        else:
-            if printok:
-                if color:
-                    string = '%s\033[9%sm-->[' % (decorate + self.Indent, str(color%6 + 1))
-                    string = string + ','.join(['%s' % (name) for name in self.Name]) + ']\n\033[0m'
-                else:
-                    string = '%s-->[' % (decorate + self.Indent)
-                    string = string + ','.join(['%s' % (name) for name in self.Name]) + ']\n'
-        if printok:
-            if color:
-                string = string + '%s\033[9%sm|\033[0m   `.\n' % (decorate + self.Indent, str(color%6 + 1))
-            else:
-                string = string + '%s|   `.\n' % (decorate + self.Indent)
-        if self.Storage:
-            for key in self.Storage.__dict__:
-                printattrok = False
-                if printactive:
-                    if self.Storage.__dict__[key]["act"]:
-                        printattrok = True
-                else:
-                    printattrok = True
-                if printattrok and printok:
-                    if color:
-                        if onlynames:
-                            string = string + '%s\033[9%sm|\033[0m    |__.%s\n' % (decorate
-                                    + self.Indent, str(color%6 + 1), key)
-                        else:
-                            string = string + '%s\033[9%sm|\033[0m    |__.%s : Active=%s Value=%s\n' % (decorate
-                                    + self.Indent, str(color%6 + 1), key, self.Storage.__dict__[key]["act"],
-                                    self.Storage.__dict__[key]["val"])
-                    else:
-                        if onlynames:
-                            string = string + '%s|    |__.%s\n' % (decorate +
-                                    self.Indent, key)
-                        else:
-                            string = string + '%s|    |__.%s : Active=%s Value=%s\n' % (decorate +
-                                    self.Indent, key, self.Storage.__dict__[key]["act"],
-                                    self.Storage.__dict__[key]["val"])
-            if color:
-                string = string + '%s\033[9%sm|\033[0m\n' % (decorate + self.Indent, str(color%6 + 1))
-            else:
-                string = string + '%s|\n' % (decorate + self.Indent)
-        if self.Containers:
-            for module in self.Containers:
-                if color:
-                    string = string + '%s\033[9%sm|\033[0m\n' % (decorate + self.Indent,
-                            str(color%6 + 1)) + module.__str__(self.Name,
-                            '%s\033[9%sm|\033[0m' % (decorate + self.Indent, str(color%6 + 1)),
-                            color, printactive, onlynames)
-                else:
-                    string = string + '%s|\n' % (decorate + self.Indent) + module.__str__(self.Name,
-                            '%s|' % (decorate + self.Indent),
-                            color, printactive, onlynames)
-        return string
-
-class Storage(dict):
-    """ Storage for meta info document types.
-        Sections are build by Container class
-    """
-    def __init__(self, *args, **kwargs):
-        super(Storage, self).__init__(*args, **kwargs)
-        for arg in args:
-            if isinstance(arg, dict):
-                for k, v in arg.items():
-                    self[k] = v
-
-        if kwargs:
-            for k, v in kwargs.items():
-                self[k] = v
-
-    def __getattr__(self, attr):
-        return self.get(attr)
-
-    def __setattr__(self, key, value):
-        self.__setitem__(key, value)
-
-    def __setitem__(self, key, value):
-        super(Storage, self).__setitem__(key, value)
-        self.__dict__.update({key: value})
-
-    def __delattr__(self, item):
-        self.__delitem__(item)
-
-    def __delitem__(self, key):
-        super(Storage, self).__delitem__(key)
-        del self.__dict__[key]
-
-
-class JsonMetaInfo(object):
-    """ Json file loader for meta info data of NOMAD.
-        Loads data and extracts values of items
-        with specified superNames
-    """
-    def __init__(self, *args):
-        self.jsonList = None
-        for filepath in args:
-            try:
-                with open(filepath, encoding="utf-8") as f:
-                    jsonDict = json.load(f)
-            except:
-                logging.exception("Error while loading file %s" % filepath)
-                raise
-            typeStr = jsonDict.get("type","nomad_meta_info_1_0")
-            typeRe = re.compile(r"nomad_meta_info_(?P<major>[0-9]+)_(?P<minor>[0-9]+)$")
-            m = typeRe.match(typeStr)
-            if not m:
-                raise Exception("unexpected type '%s', expected nomad_meta_info_1_0" % typeStr)
-            newJsonList = jsonDict.get("metaInfos",[])
-            if self.jsonList:
-                self.jsonList = self.jsonList + newJsonList
-            else:
-                self.jsonList = newJsonList
-
-    def attributes(self, sectionname):
-        attributes = {}
-        for item in self.jsonList:
-            superlist = item['superNames']
-            itemname = item['name']
-            try:
-                kindname = item['kindStr']
-            except:
-                kindname = []
-            try:
-                dtyp = item['dtypeStr']
-            except:
-                dtyp = []
-            try:
-                size = item['shape']
-            except:
-                size = []
-            try:
-                unit = item['units']
-            except:
-                unit = []
-            try:
-                refs = item['referencedSections']
-            except:
-                refs = []
-            if ('type_section' in kindname or
-                sectionname not in superlist):
-                continue
-            attrvalues = {
-                    'act' : False,
-                    'val' : None,
-                    'kind': kindname,
-                    'dtyp': dtyp,
-                    'unit': unit,
-                    'size': size,
-                    'refs': refs
-                    }
-            attributes.update({itemname: attrvalues})
-        return attributes
-
-    def siblings(self, sectionname):
-        siblings = []
-        searchList = []
-        nameList = []
-        containsList = []
-        for item in self.jsonList:
-            superlist = item['superNames']
-            itemname = item['name']
-            try:
-                kindname = item['kindStr']
-            except:
-                kindname = []
-            if ('type_section' in kindname or
-                'type_abstract_document_content' in kindname):
-                if sectionname in superlist:
-                    searchList.append(itemname)
-                if itemname not in nameList:
-                    nameList.append(itemname)
-        for name in searchList:
-            if (set([name]) not in set(nameList) and
-                self.isparent(name)):
-                siblings.append(name)
-        return siblings
-
-    def isparent(self, itemname):
-        haschild = False
-        for item in self.jsonList:
-            if itemname in item['superNames']:
-                haschild = True
-        return haschild
-
-    def rootsections(self):
-        rootname = []
-        searchList = []
-        nameList = []
-        for item in self.jsonList:
-            superlist = item['superNames']
-            itemname = item['name']
-            try:
-                kindname = item['kindStr']
-            except:
-                kindname = []
-            if 'type_section' not in kindname:
-                continue
-            if not superlist:
-                searchList.append(itemname)
-            if itemname not in nameList:
-               nameList.append(itemname)
-        for name in searchList:
-            if ('section' in name and set([name]) not in set(nameList)):
-                rootname.append(name)
-        return rootname
-
-    def fetchdict(self, itemname, pattern):
-        resDict = {}
-        for item in self.jsonList:
-            val = dict(item)
-            itemProperty = item[itemname]
-            if pattern in itemProperty:
-                resDict.update({item["name"]: val})
-        return resDict
-
-if __name__ == "__main__":
-    run = Container('section_run')
-    exclude_dict = {
-            'section_run' : [
-            'section_processor_info',
-            'section_processor_log',
-            'section_springer_material',
-            'section_repository_info'
-            ]}
-
-    jsonmetadata = JsonMetaInfo(COMMON_META_INFO_PATH, PUBLIC_META_INFO_PATH)
-
-    updateDict = {
-            'startSection' : [['section_topology']],
-            'muteSections' : [['section_interaction']],
-            'dictionary' : {
-                'molecule_constraint_atoms' : {'depends' : [[]], 'assign' : 100},
-                'interaction_atoms' : {'depends' : [[]], 'assign' : 10},
-                'topology_force_field_name' : {'depends' : [[]], 'assign' : "ReaxFF"}
-                }
-            }
-
-    run.populate(jsonmetadata, 'section_run', exclude_dict, updateDict)
-    run.Color = 4
-    for container in run.Containers:
-        if 'section_topology' in container.Name:
-            select = container
-    select.Color = 4
-    #select.PrintOnlyActive = 1
-    run.PrintOnlyNames = 1
-    print(run)
-
-