Source code for ccpn.framework.lib.ccpnNmrStarIo.CcpnNmrStarReader

"""
Module to manage Star files in ccpn context
"""
#=========================================================================================
# Licence, Reference and Credits
#=========================================================================================
__copyright__ = "Copyright (C) CCPN project (https://www.ccpn.ac.uk) 2014 - 2022"
__credits__ = ("Ed Brooksbank, Joanna Fox, Victoria A Higman, Luca Mureddu, Eliza Płoskoń",
               "Timothy J Ragan, Brian O Smith, Gary S Thompson & Geerten W Vuister")
__licence__ = ("CCPN licence. See http://www.ccpn.ac.uk/v3-software/downloads/license",
               )
__reference__ = ("Skinner, S.P., Fogh, R.H., Boucher, W., Ragan, T.J., Mureddu, L.G., & Vuister, G.W.",
                 "CcpNmr AnalysisAssign: a flexible platform for integrated NMR analysis",
                 "J.Biomol.Nmr (2016), 66, 111-124, http://doi.org/10.1007/s10858-016-0060-y"
                 )
#=========================================================================================
# Last code modification
#=========================================================================================
__modifiedBy__ = "$modifiedBy: Ed Brooksbank $"
__dateModified__ = "$dateModified: 2022-02-22 19:58:04 +0000 (Tue, February 22, 2022) $"
__version__ = "$Revision: 3.1.0 $"
#=========================================================================================
# Created
#=========================================================================================
__author__ = "$Author: geertenv $"
__date__ = "$Date: 2020-02-17 10:28:41 +0000 (Thu, February 17, 2022) $"
#=========================================================================================
# Start of code
#=========================================================================================

from ccpn.util.Path import aPath, Path
from ccpn.util.Logging import getLogger
from ccpn.util.nef.StarIo import NmrDataBlock, NmrSaveFrame, NmrLoop, parseNmrStarFile
from ccpn.util.nef.GenericStarParser import PARSER_MODE_STANDARD, LoopRow

from ccpn.framework.lib.ccpnNmrStarIo.SaveFrameABC import SaveFrameABC, getSaveFrames


[docs]class CcpnNmrStarReader(): """Class to read/parse and import (bmrb) NmrStar files """ def __init__(self): """Initialise CcpnStarReader instance """ self.path = None # Absolute path to star file used to fill self self._dataBlock = None @property def dataBlock(self): """:return the NmrDataBlock or None, depending if a file has been parsed """ return self._dataBlock
[docs] def parse(self, path, mode=PARSER_MODE_STANDARD) -> NmrDataBlock: """ :param path: path of the star-file to parse :param mode: parsing mode: any of ('lenient', 'strict', 'standard', 'IUCr') :return The parsed data as an NmrDataBlock instance """ if path is None: raise ValueError('Undefined path') path = aPath(path) if not path.exists(): raise RuntimeError('Path "%s" does not exists') _data = parseNmrStarFile(path.asString(), mode=mode, wrapInDataBlock=True) if len(_data) == 0: raise RuntimeError(f'CcpnStarReader.parse: no valid NmrDataBlock obtained from "{path.asString()}"') elif len(_data) > 1: getLogger().warning(f'CcpnStarReader.parse: multiple NmrDataBlock\'s were obtained from "{path.asString()}"; using first one only') #_data is a NamedOrderedDict instance of (key, NmrDataBlock) instances; # get the first key-ed value _keys = list(_data.keys()) _dataBlock = _data[_keys[0]] # now check if we have to do any saveFrame "updates" saveFrameDefs = getSaveFrames() for key, saveFrame in _dataBlock.items(): if (klass := saveFrameDefs.get(saveFrame.category)) is not None: instance = klass.newFromSaveFrame(parent=self, saveFrame=saveFrame) _dataBlock[key] = instance self._dataBlock = _dataBlock self.path = path return _dataBlock
[docs] def importIntoProject(self, project) -> list: """Import the data of the saveFrame's of self into project :param project: A Project instance :return A list of imported V3 objects """ result = [] for key, saveFrame in self.dataBlock.items(): if not isinstance(saveFrame, SaveFrameABC): getLogger().warning(f'CcpNmrStarReader.importIntoProject: cannot import "{key}" (category {saveFrame.category})') else: objs = saveFrame.importIntoProject(project=project) result.extend(objs) return result
def __str__(self): return f'<{self.__class__.__name__}: path={self.path}>'