Top

xi_covutils.distances module

import re

class Distances(object):
    '''
    Store and access distance data for residues from a protein structure.
    '''
    def __init__(self, dist_data):
        '''
        Creates a new instance from distance data.
        
        Distance data should be a list of tuples of five elements: (chain1, pos1, chain2, pos2, distance).
        :param dist_data: a list of (chain1, pos1, chain2, pos2, distance)
        '''
        dis = {}
        for c1, p1, c2, p2, d in dist_data:
            if not (c1, p1) in dis:
                dis[(c1, p1)] = {}
            dis[(c1, p1)][(c2,p2)] = d 
        self._distances = dis
#         self._distances = {(c1, p1): {(c2,p2): d
#             for c1p, p1p, c2, p2, d in dist_data if c1p == c1 and p1p == p1}
#             for c1, p1, _, _, _ in dist_data}
    
    def of(self, chain_a, pos_a, chain_b, pos_b):
        '''
        Retrieves distance for a residue pair.
        
        If the pair is not found, None is returned.
        :param chain_a: A string specifying the first residue chain.
        :param pos_a: An integer specifying the first residue position.
        :param chain_b: A string specifying the second residue chain.
        :param pos_b: An integer specifying the second residue position.
        '''
        pair1 = ((chain_a, pos_a))
        pair2 = ((chain_b, pos_b))
        if pair1 == pair2: # Special case for distance with the same residue.
            return 0
        d = self._distances.get( pair1 , {}).get(pair2)
        if not d:
            d = self._distances.get( pair2 , {}).get(pair1)
        return d
    
    def remap_positions(self, mapping):
        '''
        Remap index positions.
        
        If a positions could not be mapped it is excluded from the results.
        :param mapping: a dict that maps old positions to new positions.
        '''
        def remap(dic):
            return {(chain, mapping[chain][pos]):value 
                    for (chain, pos), value in dic.items()
                    if pos in mapping.get(chain, {})}
        
        self._distances = remap({(c1,p1):remap(r2) 
                                 for (c1,p1), r2 in self._distances.items()})
        
    def is_contact(self, chain_a, pos_a, chain_b, pos_b, distance_cutoff = 6.05):
        '''
        Returns True if a given pair's distance is lower or equal than a given
        distance cutoff. 
        :param chain_a: A string specifying the first residue chain.
        :param pos_a: An integer specifying the first residue position.
        :param chain_b: A string specifying the second residue chain.
        :param pos_b: An integer specifying the second residue position.
        :param distance_cutoff: a float with the distance cutoff (defaults to 6.05 angstroms)
        '''
        return self.of(chain_a, pos_a, chain_b, pos_b) <= distance_cutoff
        

def from_mitos(dist_file):
    '''
    Loads data of residue distances from a file generated by MIToS.
    
    Input data should look like:
    
    
    # model_i,chain_i,group_i,pdbe_i,number_i,name_i,model_j,chain_j,group_j,pdbe_j,number_j,name_j,distance
    1,A,ATOM,,55,LEU,1,A,ATOM,,56,LEU,1.3247309160731473
    
:param dist_file: A string to a text file with the distance data. ''' # model_i,chain_i,group_i,pdbe_i,number_i,name_i,model_j,chain_j,group_j,pdbe_j,number_j,name_j,distance # 1,A,ATOM,,55,LEU,1,A,ATOM,,56,LEU,1.3247309160731473 # 1 ,A ,ATOM, ,55 ,LEU ,1 ,A ,ATOM, ,56 ,LEU ,1.3247309160731473 d_pattern = re.compile("(\d+),(.),(.+),.*,(\d+),(.+),(\d+),(.),(.+),.*,(\d+),(.+),(.+)$") res = [] with open(dist_file) as fh: for line in fh: line = line.strip() if not line.startswith("#"): m = re.match(d_pattern, line) try: res.append(( m.group(2), # Chain 1 int(m.group(4)), # Pos res 1 m.group(7), # Chain 2 int(m.group(9)), # Pos res 2 float(m.group(11)))) # distance except: pass return res

Functions

def from_mitos(

dist_file)

Loads data of residue distances from a file generated by MIToS.

Input data should look like:

# model_i,chain_i,group_i,pdbe_i,number_i,name_i,model_j,chain_j,group_j,pdbe_j,number_j,name_j,distance
1,A,ATOM,,55,LEU,1,A,ATOM,,56,LEU,1.3247309160731473

:param dist_file: A string to a text file with the distance data.

def from_mitos(dist_file):
    '''
    Loads data of residue distances from a file generated by MIToS.
    
    Input data should look like:
    
    
    # model_i,chain_i,group_i,pdbe_i,number_i,name_i,model_j,chain_j,group_j,pdbe_j,number_j,name_j,distance
    1,A,ATOM,,55,LEU,1,A,ATOM,,56,LEU,1.3247309160731473
    
:param dist_file: A string to a text file with the distance data. ''' # model_i,chain_i,group_i,pdbe_i,number_i,name_i,model_j,chain_j,group_j,pdbe_j,number_j,name_j,distance # 1,A,ATOM,,55,LEU,1,A,ATOM,,56,LEU,1.3247309160731473 # 1 ,A ,ATOM, ,55 ,LEU ,1 ,A ,ATOM, ,56 ,LEU ,1.3247309160731473 d_pattern = re.compile("(\d+),(.),(.+),.*,(\d+),(.+),(\d+),(.),(.+),.*,(\d+),(.+),(.+)$") res = [] with open(dist_file) as fh: for line in fh: line = line.strip() if not line.startswith("#"): m = re.match(d_pattern, line) try: res.append(( m.group(2), # Chain 1 int(m.group(4)), # Pos res 1 m.group(7), # Chain 2 int(m.group(9)), # Pos res 2 float(m.group(11)))) # distance except: pass return res

Classes

class Distances

Store and access distance data for residues from a protein structure.

class Distances(object):
    '''
    Store and access distance data for residues from a protein structure.
    '''
    def __init__(self, dist_data):
        '''
        Creates a new instance from distance data.
        
        Distance data should be a list of tuples of five elements: (chain1, pos1, chain2, pos2, distance).
        :param dist_data: a list of (chain1, pos1, chain2, pos2, distance)
        '''
        dis = {}
        for c1, p1, c2, p2, d in dist_data:
            if not (c1, p1) in dis:
                dis[(c1, p1)] = {}
            dis[(c1, p1)][(c2,p2)] = d 
        self._distances = dis
#         self._distances = {(c1, p1): {(c2,p2): d
#             for c1p, p1p, c2, p2, d in dist_data if c1p == c1 and p1p == p1}
#             for c1, p1, _, _, _ in dist_data}
    
    def of(self, chain_a, pos_a, chain_b, pos_b):
        '''
        Retrieves distance for a residue pair.
        
        If the pair is not found, None is returned.
        :param chain_a: A string specifying the first residue chain.
        :param pos_a: An integer specifying the first residue position.
        :param chain_b: A string specifying the second residue chain.
        :param pos_b: An integer specifying the second residue position.
        '''
        pair1 = ((chain_a, pos_a))
        pair2 = ((chain_b, pos_b))
        if pair1 == pair2: # Special case for distance with the same residue.
            return 0
        d = self._distances.get( pair1 , {}).get(pair2)
        if not d:
            d = self._distances.get( pair2 , {}).get(pair1)
        return d
    
    def remap_positions(self, mapping):
        '''
        Remap index positions.
        
        If a positions could not be mapped it is excluded from the results.
        :param mapping: a dict that maps old positions to new positions.
        '''
        def remap(dic):
            return {(chain, mapping[chain][pos]):value 
                    for (chain, pos), value in dic.items()
                    if pos in mapping.get(chain, {})}
        
        self._distances = remap({(c1,p1):remap(r2) 
                                 for (c1,p1), r2 in self._distances.items()})
        
    def is_contact(self, chain_a, pos_a, chain_b, pos_b, distance_cutoff = 6.05):
        '''
        Returns True if a given pair's distance is lower or equal than a given
        distance cutoff. 
        :param chain_a: A string specifying the first residue chain.
        :param pos_a: An integer specifying the first residue position.
        :param chain_b: A string specifying the second residue chain.
        :param pos_b: An integer specifying the second residue position.
        :param distance_cutoff: a float with the distance cutoff (defaults to 6.05 angstroms)
        '''
        return self.of(chain_a, pos_a, chain_b, pos_b) <= distance_cutoff

Ancestors (in MRO)

Methods

def __init__(

self, dist_data)

Creates a new instance from distance data.

Distance data should be a list of tuples of five elements: (chain1, pos1, chain2, pos2, distance). :param dist_data: a list of (chain1, pos1, chain2, pos2, distance)

def __init__(self, dist_data):
    '''
    Creates a new instance from distance data.
    
    Distance data should be a list of tuples of five elements: (chain1, pos1, chain2, pos2, distance).
    :param dist_data: a list of (chain1, pos1, chain2, pos2, distance)
    '''
    dis = {}
    for c1, p1, c2, p2, d in dist_data:
        if not (c1, p1) in dis:
            dis[(c1, p1)] = {}
        dis[(c1, p1)][(c2,p2)] = d 
    self._distances = dis

def is_contact(

self, chain_a, pos_a, chain_b, pos_b, distance_cutoff=6.05)

Returns True if a given pair's distance is lower or equal than a given distance cutoff. :param chain_a: A string specifying the first residue chain. :param pos_a: An integer specifying the first residue position. :param chain_b: A string specifying the second residue chain. :param pos_b: An integer specifying the second residue position. :param distance_cutoff: a float with the distance cutoff (defaults to 6.05 angstroms)

def is_contact(self, chain_a, pos_a, chain_b, pos_b, distance_cutoff = 6.05):
    '''
    Returns True if a given pair's distance is lower or equal than a given
    distance cutoff. 
    :param chain_a: A string specifying the first residue chain.
    :param pos_a: An integer specifying the first residue position.
    :param chain_b: A string specifying the second residue chain.
    :param pos_b: An integer specifying the second residue position.
    :param distance_cutoff: a float with the distance cutoff (defaults to 6.05 angstroms)
    '''
    return self.of(chain_a, pos_a, chain_b, pos_b) <= distance_cutoff

def of(

self, chain_a, pos_a, chain_b, pos_b)

Retrieves distance for a residue pair.

If the pair is not found, None is returned. :param chain_a: A string specifying the first residue chain. :param pos_a: An integer specifying the first residue position. :param chain_b: A string specifying the second residue chain. :param pos_b: An integer specifying the second residue position.

def of(self, chain_a, pos_a, chain_b, pos_b):
    '''
    Retrieves distance for a residue pair.
    
    If the pair is not found, None is returned.
    :param chain_a: A string specifying the first residue chain.
    :param pos_a: An integer specifying the first residue position.
    :param chain_b: A string specifying the second residue chain.
    :param pos_b: An integer specifying the second residue position.
    '''
    pair1 = ((chain_a, pos_a))
    pair2 = ((chain_b, pos_b))
    if pair1 == pair2: # Special case for distance with the same residue.
        return 0
    d = self._distances.get( pair1 , {}).get(pair2)
    if not d:
        d = self._distances.get( pair2 , {}).get(pair1)
    return d

def remap_positions(

self, mapping)

Remap index positions.

If a positions could not be mapped it is excluded from the results. :param mapping: a dict that maps old positions to new positions.

def remap_positions(self, mapping):
    '''
    Remap index positions.
    
    If a positions could not be mapped it is excluded from the results.
    :param mapping: a dict that maps old positions to new positions.
    '''
    def remap(dic):
        return {(chain, mapping[chain][pos]):value 
                for (chain, pos), value in dic.items()
                if pos in mapping.get(chain, {})}
    
    self._distances = remap({(c1,p1):remap(r2) 
                             for (c1,p1), r2 in self._distances.items()})