Spaces:
No application file
No application file
| # Copyright 2004 by Bob Bussell. All rights reserved. | |
| # This code is part of the Biopython distribution and governed by its | |
| # license. Please see the LICENSE file that should have been included | |
| # as part of this package. | |
| """NOEtools: For predicting NOE coordinates from assignment data. | |
| The input and output are modelled on nmrview peaklists. | |
| This modules is suitable for directly generating an nmrview | |
| peaklist with predicted crosspeaks directly from the | |
| input assignment peaklist. | |
| """ | |
| from . import xpktools | |
| def predictNOE(peaklist, originNuc, detectedNuc, originResNum, toResNum): | |
| """Predict the i->j NOE position based on self peak (diagonal) assignments. | |
| Parameters | |
| ---------- | |
| peaklist : xprtools.Peaklist | |
| List of peaks from which to derive predictions | |
| originNuc : str | |
| Name of originating nucleus. | |
| originResNum : int | |
| Index of originating residue. | |
| detectedNuc : str | |
| Name of detected nucleus. | |
| toResNum : int | |
| Index of detected residue. | |
| Returns | |
| ------- | |
| returnLine : str | |
| The .xpk file entry for the predicted crosspeak. | |
| Examples | |
| -------- | |
| Using predictNOE(peaklist,"N15","H1",10,12) | |
| where peaklist is of the type xpktools.peaklist | |
| would generate a .xpk file entry for a crosspeak | |
| that originated on N15 of residue 10 and ended up | |
| as magnetization detected on the H1 nucleus of | |
| residue 12 | |
| Notes | |
| ===== | |
| The initial peaklist is assumed to be diagonal (self peaks only) | |
| and currently there is no checking done to insure that this | |
| assumption holds true. Check your peaklist for errors and | |
| off diagonal peaks before attempting to use predictNOE. | |
| """ | |
| returnLine = "" # The modified line to be returned to the caller | |
| datamap = _data_map(peaklist.datalabels) | |
| # Construct labels for keying into dictionary | |
| originAssCol = datamap[originNuc + ".L"] + 1 | |
| originPPMCol = datamap[originNuc + ".P"] + 1 | |
| detectedPPMCol = datamap[detectedNuc + ".P"] + 1 | |
| # Make a list of the data lines involving the detected | |
| if (str(toResNum) in peaklist.residue_dict(detectedNuc)) and ( | |
| str(originResNum) in peaklist.residue_dict(detectedNuc) | |
| ): | |
| detectedList = peaklist.residue_dict(detectedNuc)[str(toResNum)] | |
| originList = peaklist.residue_dict(detectedNuc)[str(originResNum)] | |
| returnLine = detectedList[0] | |
| for line in detectedList: | |
| aveDetectedPPM = _col_ave(detectedList, detectedPPMCol) | |
| aveOriginPPM = _col_ave(originList, originPPMCol) | |
| originAss = originList[0].split()[originAssCol] | |
| returnLine = xpktools.replace_entry(returnLine, originAssCol + 1, originAss) | |
| returnLine = xpktools.replace_entry(returnLine, originPPMCol + 1, aveOriginPPM) | |
| return returnLine | |
| def _data_map(labelline): | |
| # Generate a map between datalabels and column number | |
| # based on a labelline | |
| labelList = labelline.split() # Get the label line | |
| # Get the column number for each label | |
| datamap = {label: i for i, label in enumerate(labelList)} | |
| return datamap | |
| def _col_ave(elements, col): | |
| # Compute average values from a particular column in a string list | |
| total = 0.0 | |
| for element in elements: | |
| total += float(element.split()[col]) | |
| return total / len(elements) | |