Esempio n. 1
0
class Chain:
    def __init__(self,
                 chain_id: str = None,
                 residues: dict = None,
                 non_residues: dict = None):
        self.chain_id = chain_id
        self.residues = residues if residues is not None else {}
        self.seq = AASeq(''.join(a.res_type for a in residues.values())) if residues is not None else \
            AASeq('', name=chain_id)
        self.non_residues = non_residues if non_residues is not None else {}
        self.non_residues_seq = AASeq(''.join(a.res_type for a in residues.values()), name=chain_id) if \
            non_residues is not None else AASeq('', name=chain_id)

    def __repr__(self) -> str:
        return "chain %s has %i residues" % (self.chain_id, len(self.residues))

    def __getitem__(self, item: int) -> Residue:
        try:
            return self.residues[item]
        except:
            return self.non_residues[item]

    def __iter__(self):
        for k, v in self.residues.items():
            yield k, v

    def __len__(self):
        if self.residues == {}:
            return 0
        return len(self.residues.keys())

    def add_residue(self, residue: Residue) -> None:
        if residue.res_type_3 in three_2_one.keys():
            self.seq.add_aa(residue.res_type)
            self.residues[residue.res_num] = residue
        else:
            self.non_residues_seq.add_aa(residue.res_type)
            self.non_residues[residue.res_num] = residue

    def min_distance_chain(self, other: Residue) -> float:
        distances = []
        for mrid, mres in self:
            for orid, ores in other:
                distances.append(mres.min_distance_res(ores))
        return min(distances)

    def keys(self):
        return self.residues.keys()

    def values(self):
        return self.residues.values()

    def COM(self) -> XYZ:
        """
        :return:the Center Of Mass of the chain as calculated by the averages over Xs, Ys and Zs of all CAs
        """
        Xs = []
        Ys = []
        Zs = []
        for res in self.values():
            if 'CA' in res.keys():
                Xs.append(res['CA'].xyz.x)
                Ys.append(res['CA'].xyz.y)
                Zs.append(res['CA'].xyz.z)
        return XYZ(np.mean(Xs), np.mean(Ys), np.mean(Zs))

    def change_chain_name(self, new: str) -> None:
        self.chain_id = new
        for rid, r in self:
            r.change_chain_name(new)

    def translate_xyz(self, xyz: XYZ) -> None:
        """
        :param xyz: an xyz point
        :return: None. translate all chain atoms by xyz
        """
        for rid, r in self:
            r.translate_xyz(xyz)
Esempio n. 2
0
class Chain:
    def __init__(self, chain_id: str = None, residues: dict = None, non_residues: dict = None):
        self.chain_id = chain_id
        self.residues = residues if residues is not None else {}
        self.seq = AASeq(''.join(a.res_type for a in residues.values())) if residues is not None else \
            AASeq('', name=chain_id)
        self.non_residues = non_residues if non_residues is not None else {}
        self.non_residues_seq = AASeq(''.join(a.res_type for a in residues.values()), name=chain_id) if \
            non_residues is not None else AASeq('', name=chain_id)

    def __repr__(self) -> str:
        return "chain %s has %i residues" % (self.chain_id, len(self.residues))

    def __getitem__(self, item: int) -> Residue:
        try:
            return self.residues[item]
        except:
            return self.non_residues[item]

    def __iter__(self):
        for k, v in self.residues.items():
            yield k, v

    def __len__(self):
        if self.residues == {}:
            return 0
        return len(self.residues.keys())

    def add_residue(self, residue: Residue) -> None:
        if residue.res_type_3 in three_2_one.keys():
            self.seq.add_aa(residue.res_type)
            self.residues[residue.res_num] = residue
        else:
            self.non_residues_seq.add_aa(residue.res_type)
            self.non_residues[residue.res_num] = residue

    def min_distance_chain(self, other: Residue) -> float:
        distances = []
        for mrid, mres in self:
            for orid, ores in other:
                distances.append(mres.min_distance_res(ores))
        return min(distances)

    def keys(self):
        return self.residues.keys()

    def values(self):
        return self.residues.values()

    def COM(self) -> XYZ:
        """
        :return:the Center Of Mass of the chain as calculated by the averages over Xs, Ys and Zs of all CAs
        """
        Xs = []
        Ys = []
        Zs = []
        for res in self.values():
            if 'CA' in res.keys():
                Xs.append(res['CA'].xyz.x)
                Ys.append(res['CA'].xyz.y)
                Zs.append(res['CA'].xyz.z)
        return XYZ(np.mean(Xs), np.mean(Ys), np.mean(Zs))

    def change_chain_name(self, new: str) -> None:
        self.chain_id = new
        for rid, r in self:
            r.change_chain_name(new)

    def translate_xyz(self, xyz: XYZ) -> None:
        """
        :param xyz: an xyz point
        :return: None. translate all chain atoms by xyz
        """
        for rid, r in self:
            r.translate_xyz(xyz)