Back to TaskOperations page.
Note that as of January 2019, LayerDesign no longer supports noncanonical design. For noncanonical design, please use the Layer ResidueSelector.
Also note that we plan to deprecate LayerDesign outright before long. Please update your scripts to use the Layer ResidueSelector ans and DesignRestrictions TaskOperation instead
Layer design is used to control which amino acids are available for design at each residue position depending on the local context, e.g. solvent exposure and secondary structure. Each residue is assigned to one of three layers: core, boundary, or surface. The two methods of determining solvent accessibility are: SASA (solvent accessible surface area of mainchain + CB) and side chain neighbors (number of amino acid side chains in a cone extending along the CA-CB vector). When using SASA, the solvent exposure of the designed position depends on the conformation of neighboring side chains; this is useful when you are making one or two mutations and not changing many neighboring amino acids. When using side chain neighbors, solvent exposure depends on which direction the amino acid side chain is pointed; this is useful for de novo design or protocols where many amino acids will be designed simultaneously.
In essence, layer design is a hack to prevent the packer from putting too many hydrophobic amino acids on the protein's surface and too many polar residues in the protein's interior. Improvements to the energy function will one day obviate the need for layer design.
Note: The LayerDesign TaskOperation will be deprecated in the future. Legacy LayerDesign breaks commutativity, and this leads to opaque and often troublesome behavior. Instead, we recommend using the LayerSelector ResidueSelector and DesignRestrictions TaskOperation. Control over which regions of the pose are to be designed/packed should be performed using an OperateOnResidueSubset TaskOperation.
Here is an example implementation of LayerDesign using LayerSelector and DesignRestrictions.
<RESIDUE_SELECTORS>
<!-- Layer Design -->
<Layer name="surface" select_core="false" select_boundary="false" select_surface="true" use_sidechain_neighbors="true"/>
<Layer name="boundary" select_core="false" select_boundary="true" select_surface="false" use_sidechain_neighbors="true"/>
<Layer name="core" select_core="true" select_boundary="false" select_surface="false" use_sidechain_neighbors="true"/>
<SecondaryStructure name="sheet" overlap="0" minH="3" minE="2" include_terminal_loops="false" use_dssp="true" ss="E"/>
<SecondaryStructure name="entire_loop" overlap="0" minH="3" minE="2" include_terminal_loops="true" use_dssp="true" ss="L"/>
<SecondaryStructure name="entire_helix" overlap="0" minH="3" minE="2" include_terminal_loops="false" use_dssp="true" ss="H"/>
<And name="helix_cap" selectors="entire_loop">
<PrimarySequenceNeighborhood lower="1" upper="0" selector="entire_helix"/>
</And>
<And name="helix_start" selectors="entire_helix">
<PrimarySequenceNeighborhood lower="0" upper="1" selector="helix_cap"/>
</And>
<And name="helix" selectors="entire_helix">
<Not selector="helix_start"/>
</And>
<And name="loop" selectors="entire_loop">
<Not selector="helix_cap"/>
</And>
</RESIDUE_SELECTORS>
<TASKOPERATIONS>
<DesignRestrictions name="layer_design">
<Action selector_logic="surface AND helix_start" aas="DEHKPQR"/>
<Action selector_logic="surface AND helix" aas="EHKQR"/>
<Action selector_logic="surface AND sheet" aas="EHKNQRST"/>
<Action selector_logic="surface AND loop" aas="DEGHKNPQRST"/>
<Action selector_logic="boundary AND helix_start" aas="ADEHIKLMNPQRSTVWY"/>
<Action selector_logic="boundary AND helix" aas="ADEHIKLMNQRSTVWY"/>
<Action selector_logic="boundary AND sheet" aas="DEFHIKLMNQRSTVWY"/>
<Action selector_logic="boundary AND loop" aas="ADEFGHIKLMNPQRSTVWY"/>
<Action selector_logic="core AND helix_start" aas="AFILMPVWY"/>
<Action selector_logic="core AND helix" aas="AFILMVWY"/>
<Action selector_logic="core AND sheet" aas="FILMVWY"/>
<Action selector_logic="core AND loop" aas="AFGILMPVWY"/>
<Action selector_logic="helix_cap" aas="DNST"/>
</DesignRestrictions>
</TASKOPERATIONS>
differences from legacy LayerDesign in the example above
While not recommended, users can still use the original LayerDesign task operation.
Additional layers can be defined in the xml file by passing another taskoperation to get the residue selection. Only the residues that are marked as designable in the packer task are taken into consideration, any information about the available amino acids/rotamers selected by the taskoperation are not going to be considered. The amino acids to be used in each of this new layers has to be specified in the xml. Several taskoperations can be combined to the intersection between the different sets of designable residues.
LayerDesign, like all TaskOperations, obeys commutivity: the effect of applying another TaskOperation before LayerDesign is the same as the effect of applying it after LayerDesign. However, residues defined by PIKAA, NATAA, or NATRO operations in a resfile are often "special" residues that one would like to leave alone. The ignore_pikaa_natro=true option allows this, at the expense of breaking commutivity. If the user uses this option, and if a resfile is read before calling LayerDesign, the LayerDesign operation is not applied for the residues defined by PIKAA, NATAA or NATRO in the resfile.
Note that this task is ligand compatible. However, the user should set the ligand to be repackable but not designable with another TaskOperation.
<LayerDesign name="(&string layer)" layer="(&string core_boundary_surface)" pore_radius="(&real 2.0)" core="(&real 20.0)" surface="(&real 40.0)" ignore_pikaa_natro="(&bool 0)" repack_non_design="(&bool 1)" make_rasmol_script="(&bool 0)" make_pymol_script="(&bool 0)" use_sidechain_neighbors="(&bool 0)" use_symmetry="(&bool 1)" sc_neighbor_dist_midpoint="(9.0 &Real)" sc_neighbor_dist_exponent="(1.0 &Real)" sc_neighbor_angle_shift_factor="(0.5 &Real)" sc_neighbor_angle_exponent="(2.0 &Real)" sc_neighbor_denominator="(1.0 &Real)" >
<ATaskOperation name="task1" >
<all copy_layer="(&string layer)" append="(&string)" exclude="(&string)" specification="(&string 'designable')" operation="(&string 'design')" />
<SecStructType aas="(&string)" append(&string) exclude="(&string)" />
</ATaskOperation >
</LayerDesign>
Option list
TaskOperations can be combined together using the CombinedTasks tag, the nested tasks don't need to be named, just declared with type and parameters.
<CombinedTasks name=combined_task>
<ATaskOperation />
<AnotherTaskOperation />
</CombinedTasks>
*Currently Deprecated, new syntax for residue assignment coming soon! * After you combined tasks you need to assign residues, you can use the 'all' tag to assign residues for all the different secondary structure elements.
<combined_task>
<all copy_layer="(&string)" append="(&string)" exclude="(&string)" specification="(&string 'designable')" operation="(&string 'design')"/>
</combined_task>
The options for the "all" tag are the following:
After an all operation other definitions can be performed, for example:
<combined_task>
<all copy_layer=surface/>
<Strand append="F"/>
</combine_task>
copies the layer definition from surface and adds Phe to the available residue types only to the residues on the strands.
Below are the selected amino acid types for each layer, this can be overwritten in the xml:
core
boundary
surface
Nterm
Cterm
This example creates a new layer that combines BuildingBlockInterface(symmetric interface with SelectBySasa picking up the core of the complex
since applying task operations returns the intersection of the sets this combined task will return the buried residues of the symmetric interface.
<LayerDesign name=layer layer=other >
<CombinedTasks name=symmetric_interface_core>
<BuildingBlockInterface />
<SelectBySASA state=bound core=1 />
</CombinedTasks>
assign to the new layer for the interface core the same residues as for the surface and append for all possible secondary structures , append phe and a leu to all ss types.
<symmetric_interface_core>
<all copy_layer=surface append="FL"/>
</symmetric_interface_core>
</LayerDesign>
In its original implementation, LayerDesign could only work with symmetry if it were passed a symmetry-compatible TaskOperation (e.g. SelectBySASA, used in the example above). More recently, the use_symmetry
option has been added to permit LayerDesign to be symmetry-aware. If use_symmetry
is set to true (the default), layers are defined for symmetric poses using the full, symmetric pose. If use_symmetry
is set to false, then the old behaviour is preserved: the asymmetric unit is extracted and used in isolation to set up layers. Here is a very simple example in which LayerDesign is used to force valine in the core, alanine in the boundary layer, and serine at the surface for a symmetric pose, explicitly considering neighbours that might be in other asymmetric units in the symmetric pose.
<LayerDesign name=layerdes layer=core_boundary_surface use_sidechain_neighbors=true core=2 surface=1 use_symmetry=true >
<core>
<all aa="V" />
</core>
<boundary>
<all aa="A" />
</boundary>
<surface>
<all aa="S" />
</surface>
</LayerDesign>