Back to Filters page.
Maximum number of buried unsatisfied polar atoms allowed. This filter was significantly updated Dec 18, 2017: users can choose different reporting behaviors, and the default is to return the number of buried heavy-atom donors/acceptors that do not participate in any h-bonds. The old behavior was to count all unsats as equal, and to use a ddG-style calculation (subtract #unsat unbound from #unsat bound); these options are still available but no longer the default. The filter now by default uses a more generous definition of h-bonds (previously, many legit h-bonds were excluded because of sfxn exceptions); users can now choose between legacy SASA and VSASA for burial (Andrew's VSASA varsoldist is default); poses with more than 3 chains are now supported; the Filter is now Symmetry compatible, and users can pass sym_dof_names as in Jacob Bale's SymUnsatHbondsFilter . The old filter behavior can be restored by setting use_legacy_options="true", but this is only recommended for benchmarking purposes
For a survey of buried polar atoms in native protein structures, see HBond-Preferences-Of-Buried-Polars.
If use_legacy_options="true"
then the filter works exactly like before and expects the same options, behaving as follows:
If a jump number is specified (default=1), then this number is calculated across the interface of that jump. If jump_number=0, then the filter is calculated for a monomer. Note that #unsat for monomers is often much higher than 20. Notice that water is not assumed in these calculations. By specifying task_operations you can decide which residues will be used to compute the statistic. ONly residues that are defined as repackable (or designable) will be used for computing. Others will be ignored. A tricky aspect is that backbone unsatisfied hbonds will also only be counted for residues that are mentioned in the task_operations, so this is somewhat inconsistent.
Can include multiple instances to report different metrics: All info about all unsat types is reported to log, and can be printed to pdb file output:
# old filter, recapitulates results of this filter before Dec 16 2017
<BuriedUnsatHbonds use_legacy_options="true" name="(&string)" scorefxn="(&string)" jump_number="(1 &Size)" cutoff="(20 &Size)" task_operations="(&string)"/>
# report number of backbone (bb) heavy-atom buns, using residue selector:
# many native and de novo backbones have at least a couple of legit buried unsats in the backbone; most occur in loops or other flexible regions, but setting this to 0 will throw out potentially good designs; best to set cutoff to a few, or use confidence="0"
<BuriedUnsatHbonds name="new_buns_bb_heavy" residue_selector="(&string)" report_bb_heavy_atom_unsats="true" scorefxn="(&string)" cutoff="4" residue_surface_cutoff="20.0" ignore_surface_res="true" print_out_info_to_pdb="true" />
# report the number of sidechain (sc) heavy-atom buns, using a residue selector
# if doing design, and residue selector is design space, you want this to be 0
<BuriedUnsatHbonds name="new_buns_sc_heavy" residue_selector="(&string)" report_sc_heavy_atom_unsats="true" scorefxn="(&string)" cutoff="0" residue_surface_cutoff="20.0" ignore_surface_res="true" print_out_info_to_pdb="true" />
This section is more of a story about the progression of buried unsat filters in the Baker lab during 2018
The story begins with the buried unsat filter examples in the section above: "Recommended usage examples". These were in use at the beginning of 2018 and the combined BB+SC versions are given below:
2018 buns that HAVE the rotation bug
<BuriedUnsatHbonds name="new_buns_all_heavy" residue_selector="(&string)" report_all_heavy_atom_unsats="true" scorefxn="(&string)" cutoff="4" residue_surface_cutoff="20.0" ignore_surface_res="true" print_out_info_to_pdb="true" confidence="0" />
<BuriedUnsatHbonds name="new_buns_all_heavy_interface" residue_selector="(&string)" report_all_heavy_atom_unsats="true" scorefxn="(&string)" cutoff="4" ignore_surface_res="false" print_out_info_to_pdb="true" use_ddG_style="true" confidence="0" />
However, during 2018, a long-known fact about the buried unsat filter was rediscovered: If the pose rotates in space, the number of buried unsats will change. In a simple test case, a pose was seen to have 0-4 buried unsats depending on its orientation. The exact mechanism for this is the approximate nature of the default SASA calculator. A collection of molecular dots are generated around each atom and SASA calculated based on the dots. But there are a discrete number of dots and their position does not rotate with the pose. As a result, different orientations lead to different SASA balls being generated.
The solution was to use the analytic SASA method in the DAlphaBall executable originally used for Holes. DAlphaBall may be generated by navigating to Rosetta/main/source/external/DAlpahBall
and typing make
. Please make sure to put the compiler libraries in accessible directories, e.g. on Mac OSX, conda install -c anaconda gfortran_osx-64 gmp
then ln -s ~/miniconda3/lib/libgfortran.* /usr/local/lib
.
2018 buns that DO NOT HAVE the rotation bug
# Both of these examples require the following commandline flag:
-holes:dalphaball Rosetta/main/source/external/DAlpahBall/DAlphaBall.macgcc
# Additionally, a bit of testing shows that a probe_radius≈1.1 best correlates with new_buns_all_heavy
<BuriedUnsatHbonds name="buns_all_heavy_ball" residue_selector="(&string)" report_all_heavy_atom_unsats="true" scorefxn="(&string)" cutoff="4" residue_surface_cutoff="20.0" ignore_surface_res="true" print_out_info_to_pdb="true" dalphaball_sasa="1" probe_radius="1.1" confidence="0" />
<BuriedUnsatHbonds name="buns_all_heavy_ball_interface" residue_selector="(&string)" report_all_heavy_atom_unsats="true" scorefxn="(&string)" cutoff="4" ignore_surface_res="false" print_out_info_to_pdb="true" use_ddG_style="true" dalphaball_sasa="1" probe_radius="1.1" confidence="0" />
With a more precise definition of buried unsats, it was now possible to examine them in greater detail. David Baker noted that perhaps one should be less concerned with buried unsats near the surface and more concerned with buried unsats deep in the core; a concept which he termed "very buried unsats". With this definition in mind, Brian Coventry proposed the following two types of buried unsats:
VBUNS
# burial_cutoff is set arbitrarily high so that every atom deeper than 5.5 is considered buried
<BuriedUnsatHbonds name="vbuns_all_heavy" residue_selector="(&string)" report_all_heavy_atom_unsats="true" scorefxn="(&string)" ignore_surface_res="false" print_out_info_to_pdb="true" atomic_depth_selection="5.5" burial_cutoff="1000" confidence="0" />
# we must define a burial cutoff for the apo form because otherwise, we may accidentally count buried unsats present in the monomer that are not caused by complex formation
# Requires the following commandline flag:
-holes:dalphaball Rosetta/main/source/external/DAlpahBall/DAlphaBall.macgcc
<BuriedUnsatHbonds name="vbuns_all_heavy_interface" residue_selector="(&string)" report_all_heavy_atom_unsats="true" scorefxn="(&string)" ignore_surface_res="false" print_out_info_to_pdb="true" atomic_depth_selection="5.5" burial_cutoff="1000" use_ddG_style="true" burial_cutoff_apo="0.2" dalphaball_sasa="true" probe_radius="1.1" confidence="0" />
SBUNS
BUNS ≈ VBUNS + SBUNS
, due to the unconditional burial of VBUNS, in general: BUNS <= VBUNS + SBUNS
# This is the same as buns_all_heavy_ball but using atomic_depth to only select the surface
# We set atomic_depth_deeper_than="false" to select surface
<BuriedUnsatHbonds name="sbuns_all_heavy_ball" residue_selector="(&string)" report_all_heavy_atom_unsats="true" scorefxn="(&string)" cutoff="4" residue_surface_cutoff="20.0" ignore_surface_res="true" print_out_info_to_pdb="true" dalphaball_sasa="1" probe_radius="1.1" atomic_depth_selection="5.5" atomic_depth_deeper_than="false" confidence="0" />
# This is the same as buns_all_heavy_ball_interface but using atomic_depth to only select the surface
# We set atomic_depth_deeper_than="false" to select surface
<BuriedUnsatHbonds name="sbuns_all_heavy_interface" residue_selector="(&string)" report_all_heavy_atom_unsats="true" scorefxn="(&string)" cutoff="4" ignore_surface_res="false" print_out_info_to_pdb="true" use_ddG_style="true" dalphaball_sasa="1" probe_radius="1.1" atomic_depth_selection="5.5" atomic_depth_deeper_than="false" confidence="0" />
See this_page for python code to visualize the burial region (the link works even though it's red).
The filter is now Symmetry aware. The default for Symmetric case is that symmetry is auto-detected and will only count totals for the ASU. If use_ddG_style="true"
it's expected that users define sym_dof_names
, and if sym_dof_names="true"
, ddG-style is used by default; this behaves the same way as Jacob Bale's SymUnsatHbondsFilter for multicomponent symmetry; if use_ddG_style="true"
and sym_dof_names
not defined, then will search at symmetric interface residue (only_interface="true"
). Search space can also be defined by residue_selector.