You are here

Protocol for adding/mutating non-canonical AA

2 posts / 0 new
Last post
Protocol for adding/mutating non-canonical AA
#1

Hi all,

I have been trying for some time to implement non-canonical AAs into PyRosetta. I have the params file for the residue but when it is passed on via the -extra_res_fa , pyrosetta still won't recognize it. Next to pyrosetta being able to read this AA in a pdb, I also want to mutate (canonical) AA into modified AAs (say hydroxyl group into acrylate). The mutate_residue only takes one character as an argument that corresponds to the canonical AAs, whilst a three letter argument would be preferred. 

I have also thought about writing a patch for side-chain modifications but it is still unclear to me how I would be able to use this patch to mutate AAs in the sequence.

Does anyone have a solid protocol for incorporating non-canonical AAs and/or mutations involving non-canonical AAs?

Any help is appreciated, thanks!

Post Situation: 
Thu, 2021-03-25 08:14
joeri

In order to add a residue its residue type (=topology as CHARMM et al. call them) needs to be known in the residue type set of the pose.

That is a params file stores a residue type information —this evident by the fact that the params files live in rosetta/main/database/chemical/residue_type_sets/fa_standard.

To add a params file to a pose you need a vector of filenames:

params_filenames = pyrosetta.rosetta.utility.vector1_string()
params_filenames.extend(['a.params', 'b.params'])

or

params_filenames = pyrosetta.rosetta.utility.vector1_string(2)
params_filenames[1] = 'a.params' # fortran counting!
params_filenames[2] = 'b.params'

then 

pyrosetta.generate_nonstandard_residue_set(pose, params_filenames)
# the do what you like
pyrosetta.rosetta.core.import_pose.pose_from_file(pose, pdb_filename)

This pose can be mutated to that residue with the MutateResidue mover, which allows non-canonical and patches.

MutateResidue = pyrosetta.rosetta.protocols.simple_moves.MutateResidue
MutateResidue(target=24, new_res='CYS').apply(pose)
MutateResidue(target=20, new_res='SER:phosphorylated').apply(pose)
MutateResidue(target=1, new_res='NLE').apply(pose)  # Norleucine!

Mutate residue can also repack, but calling relax with a movemap is easier/better/faster.

Do note that if the residue name does not exist a segfault will happen therefore it may be nice to check all is in order first.

assert pose.residue_type_set_for_pose().get_representative_type_name3('XXX') is not None # but don't use XXX, UNK, ACE or HOH etc

To be fancy, one may have a params file as string or want to modify a pre-existing pose.

rts = pose.conformation().modifiable_residue_type_set_for_conf(pyrosetta.rosetta.core.chemical.FULL_ATOM_t)
buffer = pyrosetta.rosetta.std.stringbuf(params_block)
stream = pyrosetta.rosetta.std.istream(buffer)
new = pyrosetta.rosetta.core.chemical.read_topology_file(stream, three_letter_name, rts)        rts.add_base_residue_type(new)

You can also use non-canonical residues with pose_from_sequence etc. which require a 3 letter name using the "Z[NLE]" synthax, where Z is the single letter code (X ligand, Z non-canonical aa) and the  3-letter code as seen in the params file.

Second lastly, note that not everything in works

os.path.split(pyrosetta.__file__)[0], 
                        'database', 
                        'chemical', 
                        'residue_type_sets', 
                        'fa_standard', 
                        'residue_types',
                       'l-ncaa')

So do test them. I actually make my own...

Lastly, some cases such as acylations exist as patches...

Tue, 2021-03-30 08:20
matteoferla