Pose
Included in the Peptides are a set of methods who primarily act on a Pose instance, expanding on the list of availabe Core functions (See Pose methods). These are subdivided by topics, for organization purposes:
- Appending and inserting fragments
- Mutating an aminoacid
- Removing and adding sidechains
- Removing and adding N- and C- terminal caps
- Diagnosing poses
Appending and inserting fragments
Expanding on the homologous Core functions, the next methods allow the user to append and insert Fragment instances in Pose instances (from Fragment instances or from a derivation (for example, seq"AAA", a triplet of alanine aminoacids)). These expanded methods all add the possibility to set the Secondary Structure of the appendage (using the setss! method) and correct certain bond orientation artifacts introduced by the Core functions, specific to peptidic structures.
ProtoSyn.Peptides.append_fragment! — Methodappend_fragment!(pose::Pose{Topology}, residue::Residue, grammar::LGrammar, frag::Pose{Segment}; [ss::Opt{SecondaryStructureTemplate} = nothing], [op = "α"])Add the Fragment frag to the given Pose pose, appending it after the given Residue residue. This residue and the new Fragment frag will be connected using operation op ("α" by default) of the given LGrammar grammar. If given, a SecondaryStructureTemplate ss can be applied to the new appendage (using the setss! method). In either case, the C=O bond position is re-calculated and set (in the first residue of the appendage). Request internal to cartesian coordinate conversion and return the altered Pose pose.
This function is an extension of ProtoSyn.append_fragment!.
See also
Examples
julia> ProtoSyn.Peptides.append_fragment!(pose, pose.graph[1][end], res_lib, frag)
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 373
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)
Figure 1 | Two example applications of the append_fragment! method. 1 - Appending a new Fragment (which can be one or more aminoacids) to the end of a peptidic structure (the Fragment is displayed in dark grey). The Residue instances are re-indexed (using the reindex! method) and inserted in the Pose graph (sharing the root). 2 - A Fragment can also be appended to a severed cut (using the unbond! method or the fragment! method, for example). In this case, naturally, the downstream Residue instances are connected to the Pose root. Note that the appended aminoacids are ordered in such a way as to continue numerate (on index) from the Residue instance appended to.
ProtoSyn.Peptides.insert_fragment! — Methodinsert_fragment!(pose::Pose{Topology}, residue::Residue, grammar::LGrammar, frag::Pose{Segment}; ss::Opt{SecondaryStructureTemplate} = nothing, op = "α")Insert the Fragment frag in the given pose, on the position of the provided Residue instance residue (the residue gets shifted downstream). This first downstream Residue and the new Fragment will be connected using operation op ("α" by default) from [LGrammar] grammar. Also connects to the upstream Residue instance, using the same operation. If given, a SecondaryStructureTemplate ss can be applied to the new appendage (using the setss! method). If the appendage is not being inserted at the root, the C=O bond position is re-calculated and set (in the anchor for the first residue of the appendage). If the appendage is being inserted at the root, perform a soft uncap of the terminal hydrogen atoms (removes "H2" and "H3", leaves "H1", renames it to "H") and recalculate the N-H bond position (at the first downstream Residue). Request internal to cartesian coordinate conversion and return the altered Pose pose.
This function is an extension of ProtoSyn.insert_fragment!.
See also
Examples
julia> ProtoSyn.Peptides.insert_fragment!(pose, pose.graph[1][1], res_lib, frag)
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 373
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)
Figure 2 | Two example applications of the insert_fragment! method. 1 - Inserting a new Fragment (which can be one or more aminoacids) to the middle of a peptidic structure (the Fragment is displayed in dark grey). The Residue instances are re-indexed (using the reindex! method) and inserted in the Pose graph (sharing the root), while being connected in both upstream and downstream ends. 2 - A Fragment can also be inserted at position 1 of the peptidic chain (in the beginning).
Mutating an aminoacid
In a design effort, the objetive is to change the nature of an aminoacid (i.e.: change its sidechain), in order to stabilize a given interaction or conformation. Naturally, the main component necessary in such an algorithm is the ability to mutate an aminoacid, as explored in the next section.
ProtoSyn.Peptides.mutate! — Functionmutate!(pose::Pose{Topology}, residue::Residue, grammar::LGrammar, derivation)Mutate the given Pose pose at Residue residue, changing it's aminoacid to be derivation, as given by the template at grammar. This function changes the sidechain only (± 7x faster than force_mutate!). When mutating to Proline, falls back to force_mutate!. If ignore_existing_sidechain is set to true (false by default), existing sidechains are first removed and then re-added, regardless of being of the same type (which normally are ignored, if no mutation is required).
mutate!(pose::Pose{Topology}, sele::AbstractSelection, grammar::LGrammar, derivation)Mutate the given Pose pose at Residue residue selected by the AbstractSelection sele. Note that this selection can only return a single aminoacid at a time.
See also
Examples
julia> ProtoSyn.Peptides.mutate!(pose, pose.graph[1][3], res_lib, seq"K")
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 354
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)ProtoSyn.Peptides.force_mutate! — Functionforce_mutate!(pose::Pose{Topology}, residue::Residue, grammar::LGrammar, derivation, op = "α")Mutate the given Pose pose at Residue residue, changing it's aminoacid to be derivation, as given by the template at grammar. This function changes the whole residue (backbone included). By default, the user should use mutate! instead of this function, except for uncommon aminoacids.
See also mutate!
Examples
julia> ProtoSyn.Peptides.force_mutate!(pose, pose.graph[1][3], res_lib, seq"K")
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 354
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)
Figure 3 | Example of an aminoacid mutation cycle.
Removing and adding sidechains
Certain coarse-grain EnergyFunctionComponent instances might not require an explicit sidechain. In certain algorithms, it might be, therefore, useful to remove the sidechains, lowering the degrees of freedom of a system and reducing the amount of particles simulated. In the next section, the methods used in ProtoSyn to remove and add sidechains in peptidic systems are explored.
ProtoSyn.Peptides.remove_sidechains! — Functionremove_sidechains!(pose::Pose{Topology}, res_lib::LGrammar, Opt{AbstractSelection} = nothing)Removes the sidechain atoms of the given Pose pose. If an AbstractSelection selection is provided, only the sidechain atoms belonging to the Residue instances of that selection are considered for possible removal. Essentially, the selected Residue instances are mutated to Glycine, based on the provided residue library res_lib, without changing the peptide sequence. Therefore, the original sequence can be recovered using the add_sidechains! method and energy components such as neighbour_vector can perform correctly.
Proline residues are ignored.
See also
Examples
julia> ProtoSyn.Peptides.remove_sidechains!(pose, res_lib)
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 147
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)
julia> ProtoSyn.Peptides.remove_sidechains!(pose, res_lib, rn"ALA")
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 147
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)ProtoSyn.Peptides.force_remove_sidechains! — Functionforce_remove_sidechains!(pose::Pose{Topology}, selection::Opt{AbstractSelection} = nothing)Removes the sidechain Atom instances of the given Pose pose. If an AbstractSelection selection is provided, only the sidechain Atom instances belonging to that selection are considered for possible removal. This function completly removes any atom other than backbone atoms (may break Cα coordination, consider using the remove_sidechains! method instead).
Proline residues are ignored.
See also
Examples
julia> ProtoSyn.Peptides.force_remove_sidechains!(pose)
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 105
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)
julia> ProtoSyn.Peptides.force_remove_sidechains!(pose, rn"ALA")
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 105
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)ProtoSyn.Peptides.add_sidechains! — Functionadd_sidechains!(pose::Pose{Topology}, grammar::LGrammar, selection::Opt{AbstractSelection} = nothing)Add the sidechain Atom instances to the given Pose pose, based on the templates of the provided grammar. If an AbstractSelection selection is given, only the residues of that selection (promoted to Residue instances, using the default aggregator function) are considered for sidechain addition. The addition is performed using the mutate! function, and follows the current Pose sequence.
Examples
julia> ProtoSyn.Peptides.add_sidechains!(pose, res_lib)
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 343
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)
julia> ProtoSyn.Peptides.add_sidechains!(pose, res_lib, rn"ALA")
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 343
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)
Figure 4 | Example of application of the remove_sidechains! and [add_sidechains!] methods. Note that, when re-adding the sidechains, the Rotamer conformation is set to be a default position, not recovering the initial conformation without further processing.
Removing and adding N- and C- terminal caps
When extending a peptide (by appending new Residue instances, for example), it might be useful to remove the N- and C-terminal caps, as well as add them back at a later point in the algorithm or design process. In this section, two methods for this task are explored.
ProtoSyn.Peptides.is_N_terminal — Functionis_N_terminal(res::Residue)Return true if the provided Residue residue is a child of the residue's container root.
Examples
julia> ProtoSyn.Peptides.is_N_terminal(pose.graph[1][1])
trueProtoSyn.Peptides.is_C_terminal — Functionis_C_terminal(res::Residue)Return true if the provided Residue residue has no children.
Examples
julia> ProtoSyn.Peptides.is_C_terminal(pose.graph[1][end])
trueProtoSyn.Peptides.identify_c_terminal — Functionidentify_c_terminal(seg::Segment; supress_warn::Bool = false)Attempts to identify the C terminal of a given Segment seg, using the following criteria:
- Bonding patter: the C terminal follows the bonding pattern C-C-N-C, there the C-terminal is the first C atom of the pattern.
- Bond number: the C terminal must not exceed 3 bonds.
- By atom name: the C terminal must be bonded to an atom named CA
As such, this method does not use parenthood relationships to identify the C terminal. If the supress_warn is set to true (false, by default), any generated warnings are ignored.
Examples
julia> ProtoSyn.Peptides.identify_c_terminal(pose.graph[1])
Atom{/2a3d:40139/A:1/ASN:73/C:1138}ProtoSyn.Peptides.uncap! — Functionuncap!(pose::Pose, selection::Opt{AbstractSelection} = nothing)Remove all bonded Atom instances to the N- and C-terminal (except Cα) of the provided Pose pose. If an AbstractSelections selection is provided, search for terminal residues only in the given selection. A terminal is identified based on the following criteria (see is_N_terminal and is_C_terminal methods):
Return the modified (in-place) Pose pose. Does not sync!.
Examples
julia> ProtoSyn.Peptides.uncap!(pose)
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 341
i2c: true | c2i: false
Energy: Dict(:Total => Inf)
)ProtoSyn.Peptides.cap! — Functioncap!(pose::Pose, selection::Opt{AbstractSelection} = nothing)Add template terminals to the N- and C- terminals of the given Pose pose. If an AbstractSelection selection is provided, search for terminal residues only in the given selection. A terminal is identified based on the following criteria (see is_N_terminal and is_C_terminal methods):
Return the modified (in-place) Pose pose. Performs sync! operation.
Examples
julia> ProtoSyn.Peptides.cap!(pose)
Pose{Topology}(Topology{/UNK:1}, State{Float64}:
Size: 346
i2c: false | c2i: false
Energy: Dict(:Total => Inf)
)
Figure 5 | Example of application of the uncap! and [cap!] methods. Uncapping a terminal end of a peptide is usefull when appending new Residue instances, extending or adding an appendage.
Diagnosing poses
The following methods extend the usage of Diagnosing poses methods (from the Core module) to include Peptides specific standards.
ProtoSyn.Peptides.diagnose — Functiondiagnose(pose::Pose; [return_issues::Bool = false], [atom_order_search_algorithm::F = Peptides.IUPAC], [res_lib::LGrammar = Peptides.grammar]) where {F <: ProtoSyn.SearchAlgorithm}Measure several agreement criteria on the given Pose pose:
- All diagnostics from
ProtoSyn.diagnose, except using the givenatom_order_search_algorithm(Peptides.IUPAC, by default) - Check if
AtomandResiduenames are in accordance to the templates in the provided [LGrammar]res_lib - Check for missing hydrogens (in comparison with the templates in the provided [
LGrammar]res_lib)
If return_issues is set to true (false, by default) doesn't print results to stdout, returns them as a Vector{String} instead.
Examples
julia> ProtoSyn.Peptides.diagnose(pose)
⬤ Diagnosing pose 2a3d ...
|
├── • Residue-level graph OK
|
├── • Pose indexation OK
|
├── • Atom-level graph OK
|
├── • Pose synchronization status (1 issue identified)
| └── Pose is requesting internal to cartesian coordinates synchronization. Consider using the sync! function.
|
├── • Pose charges (1 issue identified)
| └── Sum of charges in the pose is not 0.0.
|
├── • (Peptides only) Residue and atom naming OK
|
└── • (Peptides only) Missing atoms (1 issue identified)
└── Pose seems to be missing hydrogens. Suggested fix: Consider using ProtoSyn.add_hydrogens!Other
The following as miscellaneous methods that may help workflows in the Peptides module.
ProtoSyn.Peptides.measure_similarity — Functionmeasure_similarity(sequence1::String, sequence2::String)Showcase the total similarity and average similarity of two peptidic sequences according to the ProtoSyn.Peptides.aminoacid_similarity map (this is a mutation tolerance measure map by Stephenson et al. (2013) (see https://link.springer.com/article/10.1007/s00239-013-9565-0)).
Examples
julia> ProtoSyn.Peptides.measure_similarity(ProtoSyn.sequence(pose1), ProtoSyn.sequence(pose2))
(...)