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)