Skip to content

PdbxContainers

mmcif.api.PdbxContainers.ContainerBase

Container base class for data and definition objects.

Source code in mmcif/api/PdbxContainers.py
class ContainerBase(object):
    """Container base class for data and definition objects."""

    def __init__(self, name):
        # The enclosing scope of the data container (e.g. data_/save_)
        self.__name = name
        # List of category names within this container -
        self.__objNameList = []
        # dictionary of DataCategory objects keyed by category name.
        self.__objCatalog = {}
        # dictionary for properties of the container
        self.__propCatalog = {}
        self.__type = None

    def __eq__(self, other):
        if not isinstance(other, type(self)):
            return NotImplemented
        return (
            self.__name == other.getName()
            and self.__objNameList == other.getObjNameList()
            and self.__objCatalog == other.getObjCatalog()
            and self.__type == other.getType()
            and self.__propCatalog == other.getPropCatalog()
        )

    def __hash__(self):
        return hash((self.__name, tuple(self.__objNameList), self.__type, tuple(self.__objCatalog.items()), tuple(self.__propCatalog.items())))

    def getObjCatalog(self):
        return self.__objCatalog

    def getPropCatalog(self):
        return self.__propCatalog

    def setProp(self, propName, value):
        try:
            self.__propCatalog[propName] = value
            return True
        except Exception:
            return False

    def getProp(self, propName):
        try:
            return self.__propCatalog[propName]
        except Exception:
            return None

    def getType(self):
        return self.__type

    def setType(self, cType):
        self.__type = cType

    def getName(self):
        return self.__name

    def setName(self, name):
        self.__name = name

    def exists(self, name):
        if name in self.__objCatalog:
            return True
        else:
            return False

    def getObj(self, name):
        if name in self.__objCatalog:
            return self.__objCatalog[name]
        else:
            return None

    def getObjNameList(self):
        return self.__objNameList

    def append(self, obj):
        """Add the input object to the current object catalog. An existing object
        of the same name will be overwritten.
        """
        if obj.getName() is not None:
            if obj.getName() not in self.__objCatalog:
                # self.__objNameList is keeping track of object order here --
                self.__objNameList.append(obj.getName())
            self.__objCatalog[obj.getName()] = obj

    def replace(self, obj):
        """Replace an existing object with the input object"""
        if (obj.getName() is not None) and (obj.getName() in self.__objCatalog):
            self.__objCatalog[obj.getName()] = obj

    def printIt(self, fh=sys.stdout, pType="brief"):
        fh.write("+ %s container: %30s contains %4d categories\n" % (self.getType(), self.getName(), len(self.__objNameList)))
        for nm in self.__objNameList:
            fh.write("--------------------------------------------\n")
            fh.write("Data category: %s\n" % nm)
            if pType == "brief":
                self.__objCatalog[nm].printIt(fh)
            else:
                self.__objCatalog[nm].dumpIt(fh)

    def rename(self, curName, newName):
        """Change the name of an object in place
        Will fail if newName already exists or curName doesn't exist.

        Args:
            curName (str): current category name
            newName (str): new category name

        Returns:
            (bool): True for success or False otherwise
        """

        try:
            # first check if requested new category already exists
            if newName in self.__objNameList:
                logger.error("Category already exists, %r", newName)
                return False
            # also check if current category exists
            if curName not in self.__objNameList:
                logger.error("Category doesn't exist, %r", curName)
                return False
            i = self.__objNameList.index(curName)
            self.__objNameList[i] = newName
            self.__objCatalog[newName] = self.__objCatalog[curName]
            self.__objCatalog[newName].setName(newName)
            del self.__objCatalog[curName]
            return True
        except Exception as e:
            logger.exception("Failing with %s", str(e))
            return False

    def copy(self, curName, newName):
        """Copy the object to a new category name.
        Will fail if newName already exists or curName doesn't exist.

        Args:
            curName (str): current category name
            newName (str): new category name

        Returns:
            (bool): True for success or False otherwise
        """
        try:
            # first check if requested new category already exists
            if newName in self.__objNameList:
                logger.error("Category already exists, %r", newName)
                return False
            # also check if current category exists
            if curName not in self.__objNameList:
                logger.error("Category doesn't exist, %r", curName)
                return False
            # now do the copy
            obj = copy.deepcopy(self.__objCatalog[curName])
            obj.setName(newName)
            self.append(obj)
            return True
        except Exception as e:
            logger.exception("Failing with %s", str(e))
            return False

    def remove(self, curName):
        """Remove object by name.  Return True on success or False otherwise."""
        try:
            if curName in self.__objCatalog:
                del self.__objCatalog[curName]
                i = self.__objNameList.index(curName)
                del self.__objNameList[i]
                return True
            else:
                return False
        except Exception:
            pass

        return False

    def merge(self, container):
        """Merge the contents of the input container with the contents of the current container."""
        try:
            objNameList = container.getObjNameList()
            for objName in objNameList:
                self.append(container.getObj(objName))
        except Exception as e:
            logger.exception("Failing with %s", str(e))
            return False
        return True

    def filterObjectNameList(self, lastInOrder=None, selectOrder=None):
        """Return an ordered list of categories in the input container subject to
        input -

           lastInOrder: list:  categories to be shifted to the end of the container.
           selectOrder: list:  ordered selection of container categories

        returns:
           filNameList: list:  augmented category list or full list (default)
        """
        filNameList = []
        if lastInOrder:
            objNameList = self.__objNameList
            lastList = []
            for nm in objNameList:
                if nm in lastInOrder:
                    lastList.append(nm)
                    continue
                filNameList.append(nm)
            filNameList.extend(lastList)
        elif selectOrder:
            for nm in selectOrder:
                if self.exists(nm):
                    filNameList.append(nm)
        else:
            filNameList = self.__objNameList

        return filNameList

    def toJSON(self):
        return self.__objCatalog

Methods

__eq__(self, other) special

Source code in mmcif/api/PdbxContainers.py
def __eq__(self, other):
    if not isinstance(other, type(self)):
        return NotImplemented
    return (
        self.__name == other.getName()
        and self.__objNameList == other.getObjNameList()
        and self.__objCatalog == other.getObjCatalog()
        and self.__type == other.getType()
        and self.__propCatalog == other.getPropCatalog()
    )

__hash__(self) special

Source code in mmcif/api/PdbxContainers.py
def __hash__(self):
    return hash((self.__name, tuple(self.__objNameList), self.__type, tuple(self.__objCatalog.items()), tuple(self.__propCatalog.items())))

__init__(self, name) special

Source code in mmcif/api/PdbxContainers.py
def __init__(self, name):
    # The enclosing scope of the data container (e.g. data_/save_)
    self.__name = name
    # List of category names within this container -
    self.__objNameList = []
    # dictionary of DataCategory objects keyed by category name.
    self.__objCatalog = {}
    # dictionary for properties of the container
    self.__propCatalog = {}
    self.__type = None

append(self, obj)

Add the input object to the current object catalog. An existing object of the same name will be overwritten.

Source code in mmcif/api/PdbxContainers.py
def append(self, obj):
    """Add the input object to the current object catalog. An existing object
    of the same name will be overwritten.
    """
    if obj.getName() is not None:
        if obj.getName() not in self.__objCatalog:
            # self.__objNameList is keeping track of object order here --
            self.__objNameList.append(obj.getName())
        self.__objCatalog[obj.getName()] = obj

copy(self, curName, newName)

Copy the object to a new category name. Will fail if newName already exists or curName doesn't exist.

Parameters:

Name Type Description Default
curName str

current category name

required
newName str

new category name

required

Returns:

Type Description
(bool)

True for success or False otherwise

Source code in mmcif/api/PdbxContainers.py
def copy(self, curName, newName):
    """Copy the object to a new category name.
    Will fail if newName already exists or curName doesn't exist.

    Args:
        curName (str): current category name
        newName (str): new category name

    Returns:
        (bool): True for success or False otherwise
    """
    try:
        # first check if requested new category already exists
        if newName in self.__objNameList:
            logger.error("Category already exists, %r", newName)
            return False
        # also check if current category exists
        if curName not in self.__objNameList:
            logger.error("Category doesn't exist, %r", curName)
            return False
        # now do the copy
        obj = copy.deepcopy(self.__objCatalog[curName])
        obj.setName(newName)
        self.append(obj)
        return True
    except Exception as e:
        logger.exception("Failing with %s", str(e))
        return False

exists(self, name)

Source code in mmcif/api/PdbxContainers.py
def exists(self, name):
    if name in self.__objCatalog:
        return True
    else:
        return False

filterObjectNameList(self, lastInOrder=None, selectOrder=None)

Return an ordered list of categories in the input container subject to input -

lastInOrder: list: categories to be shifted to the end of the container. selectOrder: list: ordered selection of container categories

Returns:

Type Description
filNameList

list: augmented category list or full list (default)

Source code in mmcif/api/PdbxContainers.py
def filterObjectNameList(self, lastInOrder=None, selectOrder=None):
    """Return an ordered list of categories in the input container subject to
    input -

       lastInOrder: list:  categories to be shifted to the end of the container.
       selectOrder: list:  ordered selection of container categories

    returns:
       filNameList: list:  augmented category list or full list (default)
    """
    filNameList = []
    if lastInOrder:
        objNameList = self.__objNameList
        lastList = []
        for nm in objNameList:
            if nm in lastInOrder:
                lastList.append(nm)
                continue
            filNameList.append(nm)
        filNameList.extend(lastList)
    elif selectOrder:
        for nm in selectOrder:
            if self.exists(nm):
                filNameList.append(nm)
    else:
        filNameList = self.__objNameList

    return filNameList

getName(self)

Source code in mmcif/api/PdbxContainers.py
def getName(self):
    return self.__name

getObj(self, name)

Source code in mmcif/api/PdbxContainers.py
def getObj(self, name):
    if name in self.__objCatalog:
        return self.__objCatalog[name]
    else:
        return None

getObjCatalog(self)

Source code in mmcif/api/PdbxContainers.py
def getObjCatalog(self):
    return self.__objCatalog

getObjNameList(self)

Source code in mmcif/api/PdbxContainers.py
def getObjNameList(self):
    return self.__objNameList

getProp(self, propName)

Source code in mmcif/api/PdbxContainers.py
def getProp(self, propName):
    try:
        return self.__propCatalog[propName]
    except Exception:
        return None

getPropCatalog(self)

Source code in mmcif/api/PdbxContainers.py
def getPropCatalog(self):
    return self.__propCatalog

getType(self)

Source code in mmcif/api/PdbxContainers.py
def getType(self):
    return self.__type

merge(self, container)

Merge the contents of the input container with the contents of the current container.

Source code in mmcif/api/PdbxContainers.py
def merge(self, container):
    """Merge the contents of the input container with the contents of the current container."""
    try:
        objNameList = container.getObjNameList()
        for objName in objNameList:
            self.append(container.getObj(objName))
    except Exception as e:
        logger.exception("Failing with %s", str(e))
        return False
    return True

printIt(self, fh=<_io.StringIO object at 0x107a96820>, pType='brief')

Source code in mmcif/api/PdbxContainers.py
def printIt(self, fh=sys.stdout, pType="brief"):
    fh.write("+ %s container: %30s contains %4d categories\n" % (self.getType(), self.getName(), len(self.__objNameList)))
    for nm in self.__objNameList:
        fh.write("--------------------------------------------\n")
        fh.write("Data category: %s\n" % nm)
        if pType == "brief":
            self.__objCatalog[nm].printIt(fh)
        else:
            self.__objCatalog[nm].dumpIt(fh)

remove(self, curName)

Remove object by name. Return True on success or False otherwise.

Source code in mmcif/api/PdbxContainers.py
def remove(self, curName):
    """Remove object by name.  Return True on success or False otherwise."""
    try:
        if curName in self.__objCatalog:
            del self.__objCatalog[curName]
            i = self.__objNameList.index(curName)
            del self.__objNameList[i]
            return True
        else:
            return False
    except Exception:
        pass

    return False

rename(self, curName, newName)

Change the name of an object in place Will fail if newName already exists or curName doesn't exist.

Parameters:

Name Type Description Default
curName str

current category name

required
newName str

new category name

required

Returns:

Type Description
(bool)

True for success or False otherwise

Source code in mmcif/api/PdbxContainers.py
def rename(self, curName, newName):
    """Change the name of an object in place
    Will fail if newName already exists or curName doesn't exist.

    Args:
        curName (str): current category name
        newName (str): new category name

    Returns:
        (bool): True for success or False otherwise
    """

    try:
        # first check if requested new category already exists
        if newName in self.__objNameList:
            logger.error("Category already exists, %r", newName)
            return False
        # also check if current category exists
        if curName not in self.__objNameList:
            logger.error("Category doesn't exist, %r", curName)
            return False
        i = self.__objNameList.index(curName)
        self.__objNameList[i] = newName
        self.__objCatalog[newName] = self.__objCatalog[curName]
        self.__objCatalog[newName].setName(newName)
        del self.__objCatalog[curName]
        return True
    except Exception as e:
        logger.exception("Failing with %s", str(e))
        return False

replace(self, obj)

Replace an existing object with the input object

Source code in mmcif/api/PdbxContainers.py
def replace(self, obj):
    """Replace an existing object with the input object"""
    if (obj.getName() is not None) and (obj.getName() in self.__objCatalog):
        self.__objCatalog[obj.getName()] = obj

setName(self, name)

Source code in mmcif/api/PdbxContainers.py
def setName(self, name):
    self.__name = name

setProp(self, propName, value)

Source code in mmcif/api/PdbxContainers.py
def setProp(self, propName, value):
    try:
        self.__propCatalog[propName] = value
        return True
    except Exception:
        return False

setType(self, cType)

Source code in mmcif/api/PdbxContainers.py
def setType(self, cType):
    self.__type = cType

toJSON(self)

Source code in mmcif/api/PdbxContainers.py
def toJSON(self):
    return self.__objCatalog

mmcif.api.PdbxContainers.DefinitionContainer (ContainerBase)

Source code in mmcif/api/PdbxContainers.py
class DefinitionContainer(ContainerBase):
    def __init__(self, name):
        super(DefinitionContainer, self).__init__(name)
        self.setType("definition")
        self.__globalFlag = False

    def isCategory(self):
        if self.exists("category"):
            return True
        return False

    def isAttribute(self):
        if self.exists("item"):
            return True
        return False

    def getGlobal(self):
        return self.__globalFlag

    def printIt(self, fh=sys.stdout, pType="brief"):
        fh.write("Definition container: %30s contains %4d categories\n" % (self.getName(), len(self.getObjNameList())))
        if self.isCategory():
            fh.write("Definition type: category\n")
        elif self.isAttribute():
            fh.write("Definition type: item\n")
        else:
            fh.write("Definition type: undefined\n")

        for nm in self.getObjNameList():
            fh.write("--------------------------------------------\n")
            fh.write("Definition category: %s\n" % nm)
            if pType == "brief":
                self.getObj(nm).printIt(fh)
            else:
                self.getObj(nm).dumpId(fh)

__init__(self, name) special

Source code in mmcif/api/PdbxContainers.py
def __init__(self, name):
    super(DefinitionContainer, self).__init__(name)
    self.setType("definition")
    self.__globalFlag = False

getGlobal(self)

Source code in mmcif/api/PdbxContainers.py
def getGlobal(self):
    return self.__globalFlag

isAttribute(self)

Source code in mmcif/api/PdbxContainers.py
def isAttribute(self):
    if self.exists("item"):
        return True
    return False

isCategory(self)

Source code in mmcif/api/PdbxContainers.py
def isCategory(self):
    if self.exists("category"):
        return True
    return False

printIt(self, fh=<_io.StringIO object at 0x107a96820>, pType='brief')

Source code in mmcif/api/PdbxContainers.py
def printIt(self, fh=sys.stdout, pType="brief"):
    fh.write("Definition container: %30s contains %4d categories\n" % (self.getName(), len(self.getObjNameList())))
    if self.isCategory():
        fh.write("Definition type: category\n")
    elif self.isAttribute():
        fh.write("Definition type: item\n")
    else:
        fh.write("Definition type: undefined\n")

    for nm in self.getObjNameList():
        fh.write("--------------------------------------------\n")
        fh.write("Definition category: %s\n" % nm)
        if pType == "brief":
            self.getObj(nm).printIt(fh)
        else:
            self.getObj(nm).dumpId(fh)

mmcif.api.PdbxContainers.DataContainer (ContainerBase)

Container class for DataCategory objects.

Source code in mmcif/api/PdbxContainers.py
class DataContainer(ContainerBase):
    """Container class for DataCategory objects."""

    def __init__(self, name):
        super(DataContainer, self).__init__(name)
        self.setType("data")
        self.__globalFlag = False

    def invokeDataBlockMethod(self, mType, method, db):
        _ = mType
        _ = db
        # self.__currentRow = 1
        exec(method.getInline(), globals(), locals())  # pylint: disable=exec-used

    def setGlobal(self):
        self.__globalFlag = True

    def getGlobal(self):
        return self.__globalFlag

__init__(self, name) special

Source code in mmcif/api/PdbxContainers.py
def __init__(self, name):
    super(DataContainer, self).__init__(name)
    self.setType("data")
    self.__globalFlag = False

getGlobal(self)

Source code in mmcif/api/PdbxContainers.py
def getGlobal(self):
    return self.__globalFlag

invokeDataBlockMethod(self, mType, method, db)

Source code in mmcif/api/PdbxContainers.py
def invokeDataBlockMethod(self, mType, method, db):
    _ = mType
    _ = db
    # self.__currentRow = 1
    exec(method.getInline(), globals(), locals())  # pylint: disable=exec-used

setGlobal(self)

Source code in mmcif/api/PdbxContainers.py
def setGlobal(self):
    self.__globalFlag = True

mmcif.api.PdbxContainers.SaveFrameContainer (ContainerBase)

Source code in mmcif/api/PdbxContainers.py
class SaveFrameContainer(ContainerBase):
    def __init__(self, name):
        super(SaveFrameContainer, self).__init__(name)
        self.setType("definition")

__init__(self, name) special

Source code in mmcif/api/PdbxContainers.py
def __init__(self, name):
    super(SaveFrameContainer, self).__init__(name)
    self.setType("definition")

mmcif.api.PdbxContainers.CifName

Class of utilities for CIF-style data names -

Source code in mmcif/api/PdbxContainers.py
class CifName(object):
    """Class of utilities for CIF-style data names -"""

    def __init__(self):
        pass

    @staticmethod
    def categoryPart(name):
        tname = ""
        try:
            if name.startswith("_"):
                tname = name[1:]
            else:
                tname = name

            i = tname.find(".")
            if i == -1:
                return tname
            else:
                return tname[:i]
        except Exception:
            return tname

    @staticmethod
    def attributePart(name):
        try:
            i = name.find(".")
            if i == -1:
                return None
            else:
                return name[i + 1:]
        except Exception:
            return None

    @staticmethod
    def itemName(categoryName, attributeName):
        try:
            return "_" + str(categoryName) + "." + str(attributeName)
        except Exception:
            return None

__init__(self) special

Source code in mmcif/api/PdbxContainers.py
def __init__(self):
    pass

attributePart(name) staticmethod

Source code in mmcif/api/PdbxContainers.py
@staticmethod
def attributePart(name):
    try:
        i = name.find(".")
        if i == -1:
            return None
        else:
            return name[i + 1:]
    except Exception:
        return None

categoryPart(name) staticmethod

Source code in mmcif/api/PdbxContainers.py
@staticmethod
def categoryPart(name):
    tname = ""
    try:
        if name.startswith("_"):
            tname = name[1:]
        else:
            tname = name

        i = tname.find(".")
        if i == -1:
            return tname
        else:
            return tname[:i]
    except Exception:
        return tname

itemName(categoryName, attributeName) staticmethod

Source code in mmcif/api/PdbxContainers.py
@staticmethod
def itemName(categoryName, attributeName):
    try:
        return "_" + str(categoryName) + "." + str(attributeName)
    except Exception:
        return None