def make_mutant(self, pose: pyrosetta.Pose, mutation: Union[str, Mutation], chain='A', distance: int = 10, cycles: int = 5) -> pyrosetta.Pose: """ Make a point mutant (``A23D``). :param pose: pose :param mutation: :param chain: :return: """ if pose is None: mutant = self.pose.clone() else: mutant = pose.clone() if isinstance(mutation, str): mutation = Mutation(mutation, chain, mutant) MutateResidue = pyrosetta.rosetta.protocols.simple_moves.MutateResidue MutateResidue(target=mutation.pose_resi, new_res=mutation.to_resn3).apply(mutant) self.relax_around_mover(mutant, mutation=mutation, distance=distance, cycles=cycles, own_chain_only=False) return mutant
def make_mutant(self, pose: pyrosetta.Pose, mutation: str, chain='A') -> pyrosetta.Pose: """ Make a point mutant (``A23D``). :param pose: pose :param mutation: :param chain: :return: """ mutant = pose.clone() pose2pdb = pose.pdb_info().pdb2pose rex = re.match('(\w)(\d+)(\w)', mutation) r = pose2pdb(res=int(rex.group(2)), chain=chain) rn = pose.residue(r).name1() assert rn == rex.group( 1 ), f'residue {r}(pose)/{rex.group(2)}(pdb) is a {rn}, not a {rex.group()}' MutateResidue = pyrosetta.rosetta.protocols.simple_moves.MutateResidue MutateResidue(target=r, new_res=self._name3[rex.group(3)]).apply(mutant) self.relax_around_mover(mutant, int(rex.group(2)), chain, distance=12, cycles=15) return mutant
def movement(self, original: pyrosetta.Pose, resi: int, chain: str, distance: int, trials: int = 50, temperature: int = 1.0, replicate_number: int = 10): """ This method adapted from a notebook of mine, but not from an official source, is not well written. It should be a filter and score combo. It returns the largest bb_rmsd of the pdb residue resi following backrub. """ # this code is experimental n = self.get_neighbour_vector(pose=original, resi=resi, chain=chain, distance=distance, own_chain_only=False) # resi if chain is None: # pose numbering. target_res = resi else: target_res = original.pdb_info().pdb2pose(chain=chain, res=resi) # prep rv = pyrosetta.rosetta.core.select.residue_selector.ResidueVector(n) backrub = pyrosetta.rosetta.protocols.backrub.BackrubMover() backrub.set_pivot_residues(rv) # https://www.rosettacommons.org/docs/latest/scripting_documentation/RosettaScripts/Movers/movers_pages/GenericMonteCarloMover monégasque = pyrosetta.rosetta.protocols.monte_carlo.GenericMonteCarloMover(maxtrials=trials, max_accepted_trials=trials, # gen.max_accepted_trials() = 0 task_scaling=5, # gen.task_scaling() mover=backrub, temperature=temperature, sample_type='low', drift=True) monégasque.set_scorefxn(self.scorefxn) # monégasque.add_filter(filters , False , 0.005 , 'low' , True ) # define the first 4 atoms (N C CA O) am = pyrosetta.rosetta.utility.vector1_unsigned_long(4) for i in range(1, 5): am[i] = i # find most deviant best_r = 0 for i in range(replicate_number): variant = original.clone() monégasque.apply(variant) if monégasque.accept_counter() > 0: variant = monégasque.last_accepted_pose() # pretty sure redundant # bb_rmsd is all residues: pyrosetta.rosetta.core.scoring.bb_rmsd(pose, ori) r = pyrosetta.rosetta.core.scoring.residue_rmsd_nosuper(variant.residue(target_res), original.residue(target_res), am) if r > best_r: best_r = r return best_r