![]() |
Rosetta Protocols
2014.16.56682
|
choose a stub based on mc sampling, and place it on the pose. Iterates over stubs until one matches criteria. More...
#include <PlaceStubMover.hh>
Public Member Functions | |
| PlaceStubMover () | |
| PlaceStubMover (protocols::hotspot_hashing::HotspotStubSetOP stub_set, core::Real score_threshold, core::Size const host_chain, protocols::filters::FilterOP final_filter, bool const hurry=false, bool const triage_positions=true, core::Real stub_energy_threshold=1.0) | |
| virtual | ~PlaceStubMover () |
| protocols::moves::MoverOP | clone () const |
| Return a clone of the Mover object. More... | |
| protocols::moves::MoverOP | fresh_instance () const |
| Generates a new Mover object freshly created with the default ctor. More... | |
| void | stub_minimize_movers (utility::vector1< DesignMoverRealPair > const &dmrp) |
| utility::vector1 < DesignMoverRealPair > const & | stub_minimize_movers () const |
| virtual void | apply (core::pose::Pose &pose) |
| virtual std::string | get_name () const |
| Each derived class must specify its name. The class name. More... | |
| virtual void | parse_my_tag (utility::tag::TagCOP tag, basic::datacache::DataMap &, protocols::filters::Filters_map const &, protocols::moves::Movers_map const &, core::pose::Pose const &) |
| Called by MoverFactory when constructing new Movers. Takes care of the specific mover's parsing. More... | |
Public Member Functions inherited from protocols::simple_moves::DesignRepackMover | |
| DesignRepackMover () | |
| DesignRepackMover (std::string const name) | |
| void | setup_packer_and_movemap (core::pose::Pose const &pose) |
| void | min_rb (utility::vector1< bool > const min_rb) |
| void | min_rb (bool const min_rb) |
| in most cases, there would only be one rb dof making it useful to have a non-vector accessor to min_rb_. However, if the pose has multiple jumps, setting min_rb_ in this way might cause trouble in other parts of the code. More... | |
| utility::vector1< bool > const & | min_rb () const |
| bool | min_rb_set () const |
| void | min_sc (utility::vector1< bool > const &min_sc) |
| utility::vector1< bool > const & | min_sc () const |
| bool | min_sc_set () const |
| void | min_bb (utility::vector1< bool > const &min_bb) |
| utility::vector1< bool > const & | min_bb () const |
| bool | min_bb_set () const |
| bool | optimize_foldtree () const |
| void | optimize_foldtree (bool const opt) |
| void | prevent_repacking (utility::vector1< core::Size > const p) |
| utility::vector1< core::Size > const & | prevent_repacking () const |
| void | restrict_to_repacking (utility::vector1< core::Size > const p) |
| utility::vector1< core::Size > const & | restrict_to_repacking () const |
| void | design (bool const des) |
| bool | design () const |
| void | set_scorefxn_repack (core::scoring::ScoreFunctionCOP scorefxn) |
| void | set_scorefxn_minimize (core::scoring::ScoreFunctionCOP scorefxn) |
| core::scoring::ScoreFunctionOP | scorefxn_repack () const |
| core::scoring::ScoreFunctionOP | scorefxn_minimize () const |
| core::pack::task::PackerTaskCOP | task () const |
| core::pack::task::PackerTaskOP & | task () |
| void | clear_task () |
| after fiddling with a task from outside this mover, clear it, or else, on the next iteration through the mover the changes will be remembered More... | |
| void | clear_task_factory () |
| void | use_preset_task (bool const bt) |
| bool | use_preset_task () const |
| void | task_factory (core::pack::task::TaskFactoryOP p) |
| core::pack::task::TaskFactoryOP & | task_factory () |
| core::pack::task::TaskFactoryOP | task_factory () const |
| virtual | ~DesignRepackMover () |
Public Member Functions inherited from protocols::moves::Mover | |
| Mover () | |
| virtual | ~Mover () |
| virtual MoverSP | create () |
| virtual void | apply (core::io::serialization::PipeMap &pmap) |
| virtual void | parse_state (SerializableState const &state) |
| virtual void | parse_def (utility::lua::LuaObject const &def, utility::lua::LuaObject const &score_fxns, utility::lua::LuaObject const &tasks, MoverCacheSP cache) |
| virtual void | save_state (SerializableState &state) |
| Mover (std::string const &type_name) | |
| sets the type for a mover; name_ has been removed (2010/05/14) More... | |
| Mover (Mover const &other) | |
| Mover & | operator= (Mover const &other) |
| assignment operator More... | |
| virtual core::Real | last_proposal_density_ratio () |
| std::string const & | type () const |
| std::string | get_current_tag () const |
| A tag is a unique identifier used to identify structures produced by this Mover. get_current_tag() returns the tag, and set_current_tag( std::string tag ) sets the tag. This functionality is not intended for use with the 2008 job distributor. More... | |
| void | set_current_tag (std::string const &new_tag) |
| virtual void | set_input_pose (PoseCOP pose) |
| setter for poses contained for rms More... | |
| virtual void | set_native_pose (PoseCOP pose) |
| setter for native poses contained for rms -— we should get rid of this method? it is widely used, but a bit unsafe More... | |
| PoseCOP | get_input_pose () const |
| PoseCOP | get_native_pose () const |
| virtual void | test_move (Pose &pose) |
| : Unit test support function. Apply one move to a given pose. Allows extra test specific functions to be called before applying More... | |
| void | type (const std::string &type_in) |
| std::string | get_type () const |
| MoverStatus | get_last_move_status () const |
| end parser interface, start Job Distributor interface///////////// More... | |
| void | reset_status () |
| resets status to SUCCESS, meant to be used before an apply(). The job distributor (august 08 vintage) uses this to ensure non-accumulation of status across apply()s. More... | |
| virtual core::pose::PoseOP | get_additional_output () |
| Mechanism by which a mover may return multiple output poses from a single input pose. More... | |
| virtual void | clear_info () |
| Strings container can be used to return miscellaneous info (as std::string) from a mover, such as notes about the results of apply(). The job distributor (Apr 09 vintage) will check this function to see if your protocol wants to add string info to the Job that ran this mover. One way this can be useful is that later, a JobOutputter may include/append this info to an output file. More... | |
| virtual Strings & | info () |
| non-const accessor More... | |
| virtual Strings const & | info () const |
| const accessor More... | |
| virtual bool | reinitialize_for_each_job () const |
| Inform the Job Distributor (August '08 vintage) whether this object needs to be freshly regenerated on each use. More... | |
| virtual bool | reinitialize_for_new_input () const |
| Inform the Job Distributor (August '08 vintage) whether this object needs to be regenerated when the input pose is about to change, (for example, if the Mover has special code on the first apply() that is only valid for that one input pose). More... | |
| void | set_current_job (protocols::jobdist::BasicJobCOP job) |
| jobdist::BasicJobCOP | get_current_job () const |
| virtual void | show (std::ostream &output=std::cout) const |
| Outputs details about the Mover, including current settings. More... | |
Private Member Functions | |
| void | place_stub (core::pose::Pose &pose, core::conformation::Residue const res_stub, core::Size const res_num) |
| void | stub_based_atom_tree (core::pose::Pose &pose, core::conformation::Residue const res_stub, core::Real const cst_sdev) |
| bool | SelectStubIteratively (protocols::hotspot_hashing::HotspotStubSet::Hs_vec::const_iterator stub_it) |
| bool | StubMinimize (core::pose::Pose &pose, protocols::hotspot_hashing::HotspotStubCOP=NULL, core::Size const host_res=0, bool const hurry=false) |
| void | refresh_coordinate_constraints (core::pose::Pose &pose, core::Real const sdev) |
| void | cst_cleanup (core::pose::Pose &pose) |
| resets pose's constraints upon stub failure remove constraints if they exist. To be used on failure More... | |
| void | final_cleanup (core::pose::Pose &pose) |
| clean everything before exiting More... | |
choose a stub based on mc sampling, and place it on the pose. Iterates over stubs until one matches criteria.
| typedef std::pair< simple_moves::DesignRepackMoverOP, bool > protocols::protein_interface_design::movers::PlaceStubMover::DesignMoverFoldTreePair |
| typedef std::pair< simple_moves::DesignRepackMoverOP, core::Real > protocols::protein_interface_design::movers::PlaceStubMover::DesignMoverRealPair |
| protocols::protein_interface_design::movers::PlaceStubMover::PlaceStubMover | ( | ) |
References coord_cst_std_, curr_coordinate_constraints_, design_movers_, disallowed_host_pos_, placed_stubs_, previous_coordinate_constraints_, saved_bb_constraints_, saved_placed_stubs_, and stub_minimize_movers_.
Referenced by clone().
| protocols::protein_interface_design::movers::PlaceStubMover::PlaceStubMover | ( | protocols::hotspot_hashing::HotspotStubSetOP | stub_set, |
| core::Real | score_threshold, | ||
| core::Size const | host_chain, | ||
| protocols::filters::FilterOP | final_filter, | ||
| bool const | hurry = false, |
||
| bool const | triage_positions = true, |
||
| core::Real | stub_energy_threshold = 1.0 |
||
| ) |
References protocols::filters::Filter::clone(), final_filter_, and stub_set_.
|
virtual |
|
virtual |
Placing a stub in the context of a complex by putting a stub on top of the scaffold. The following steps are taken: 0. minimization of rb dofs in a bb_stub_constraint-dominated force field. Only the constraints implied by the stubset associated with this placestub mover will be applied.
Reimplemented from protocols::simple_moves::DesignRepackMover.
References protocols::jd2::Job::add_string_string_pair(), after_placement_filter_, basic::options::OptionKeys::hotspot::allow_proline, protocols::protein_interface_design::movers::BuildAlaPose::apply(), core::scoring::backbone_stub_constraint, begin, protocols::hotspot_hashing::HotspotStubSet::begin(), core::conformation::Conformation::chain_begin(), core::conformation::Conformation::chain_end(), core::pack::task::TaskFactory::clear(), protocols::filters::Filter::clone(), core::pose::Pose::conformation(), core::pose::Pose::constraint_set(), coord_cst_func_, coord_cst_std_, coord_cst_weight, coordinate_constraint, core::scoring::ScoreFunctionFactory::create_score_function(), cst_cleanup(), curr_coordinate_constraints_, protocols::nonlocal::current_job(), default_fold_tree_, design_movers_, disallowed_host_pos_, distance(), empty, end, protocols::hotspot_hashing::HotspotStubSet::end(), core::scoring::fa_rep, protocols::moves::FAIL_RETRY, protocols::hotspot_hashing::HotspotStubSet::filter(), final_cleanup(), final_filter_, core::pose::Pose::fold_tree(), protocols::jd2::JobDistributor::get_instance(), core::scoring::getScoreFunction(), host_chain_, hurry_, core::pack::task::operation::PreventRepacking::include_residue(), max_cb_cb_dist_, protocols::moves::modify_ResId_based_object(), protocols::moves::MS_SUCCESS, core::conformation::Residue::name3(), basic::datacache::DataMapObj< class >::obj, basic::options::option, place_scaffold_, place_stub(), placed_stubs_, protocols::simple_moves::DesignRepackMover::prevent_repacking(), protocols::simple_moves::DesignRepackMover::prevent_repacking_, core::pack::task::TaskFactory::push_back(), numeric::random::random_permutation(), refresh_coordinate_constraints(), protocols::hotspot_hashing::remove_hotspot_constraints_from_pose(), core::pose::Pose::residue(), residue_level_tasks_for_placed_hotspots_, residue_numbers_, protocols::rosetta_scripts::residue_packer_states(), protocols::protein_interface_design::movers::RG, runtime_assert, saved_bb_constraints_, saved_placed_stubs_, saved_prevent_repacking_, SelectStubIteratively(), protocols::moves::Mover::set_last_move_status(), core::pack::task::TaskFactory::size(), size(), soft_rep, SOFT_REP_DESIGN_WTS, stats_TR, stub_energy_threshold_, stub_set_, StubMinimize(), protocols::simple_moves::DesignRepackMover::task_factory(), protocols::protein_interface_design::movers::test_res_res_aln(), core::scoring::total_score, protocols::protein_interface_design::movers::TR, TR_debug, triage_positions_, and user_defined_name_.
|
virtual |
Return a clone of the Mover object.
clone is meant to return an OP'ed deep copy of this object. This really should be a pure virtual in the base class, but adding pure virtuals to Mover would massively disrupt the code. This default implementation crashes at runtime instead of compiletime if you try to call it. If this code is causing you problems, your Mover needs to override this function.
Implements protocols::simple_moves::DesignRepackMover.
References PlaceStubMover().
|
private |
resets pose's constraints upon stub failure remove constraints if they exist. To be used on failure
reapply saved coord constraints and refresh placed_stubs and prevent_repacking Nov09 changed logic: curr_coordinate constraints are removed only
References curr_coordinate_constraints_, placed_stubs_, protocols::simple_moves::DesignRepackMover::prevent_repacking_, core::pose::Pose::remove_constraints(), saved_placed_stubs_, saved_prevent_repacking_, protocols::protein_interface_design::movers::TR, and core::pose::Pose::update_residue_neighbors().
Referenced by apply(), and final_cleanup().
|
private |
clean everything before exiting
This should be called before exiting placestub.
References core::pose::Pose::add_constraints(), cst_cleanup(), curr_coordinate_constraints_, protocols::moves::Mover::get_last_move_status(), leave_coord_csts_after_placement_, protocols::moves::MS_SUCCESS, placed_stubs_, post_placement_sdev_, protocols::simple_moves::DesignRepackMover::prevent_repacking_, previous_coordinate_constraints_, refresh_coordinate_constraints(), protocols::simple_moves::DesignRepackMover::restrict_to_repacking_, runtime_assert, saved_bb_constraints_, and protocols::protein_interface_design::movers::TR.
Referenced by apply().
|
inlinevirtual |
Generates a new Mover object freshly created with the default ctor.
fresh_instance is meant to return a new object of this class, created with the default constructor. This really should be a pure virtual in the base class, but adding pure virtuals to Mover would massively disrupt the code. This default implementation crashes at runtime instead of compiletime if you try to call it. If this code is causing you problems, your Mover needs to override this function. This is used by the August 08 job distributor.
Implements protocols::simple_moves::DesignRepackMover.
|
virtual |
Each derived class must specify its name. The class name.
Reimplemented from protocols::simple_moves::DesignRepackMover.
References protocols::protein_interface_design::movers::PlaceStubMoverCreator::mover_name().
|
virtual |
Called by MoverFactory when constructing new Movers. Takes care of the specific mover's parsing.
Some movers need not be parsed, so we shouldn't stop executions. This, however, calls attention to the lack of this method, which could be due to something as silly as a wrong parameters definition.
Reimplemented from protocols::simple_moves::DesignRepackMover.
References core::conformation::Residue::aa(), add_constraints_, after_placement_filter_, basic::options::OptionKeys::hotspot::allow_proline, core::conformation::Conformation::chain_begin(), core::conformation::Conformation::chain_end(), protocols::filters::Filter::clone(), core::pose::Pose::conformation(), coord_cst_std_, design_movers_, disallowed_host_pos_, final_filter_, protocols::protein_interface_design::movers::generate_taskfactory_and_add_task_awareness(), basic::datacache::DataMap::get(), core::pose::get_resnum_list(), getScoreFunction(), basic::datacache::DataMap::has(), host_chain_, hurry_, core::pack::task::PackerTask::initialize_from_command_line(), core::conformation::Residue::is_protein(), leave_coord_csts_after_placement_, max_cb_cb_dist_, protocols::simple_moves::DesignRepackMover::min_rb(), core::pack::task::PackerTask::nonconst_residue_task(), basic::options::option, core::pack::task::PackerTask::or_include_current(), protocols::hotspot_hashing::HotspotStubSet::pair_with_scaffold(), core::pack::task::parse_resfile(), protocols::rosetta_scripts::parse_task_operations(), place_scaffold_, post_placement_sdev_, core::pack::task::ResidueLevelTask::prevent_repacking(), basic::options::OptionKeys::packing::resfile, core::pose::Pose::residue(), residue_level_tasks_for_placed_hotspots_, residue_numbers_, core::pack::task::ResidueLevelTask::restrict_absent_canonical_aas(), restype, runtime_assert, score_threshold_, stub_energy_threshold_, stub_minimize_movers_, stub_set_, protocols::simple_moves::DesignRepackMover::task(), protocols::simple_moves::DesignRepackMover::task_factory(), core::pose::Pose::total_residue(), protocols::protein_interface_design::movers::TR, triage_positions_, user, user_defined_name_, and utility_exit_with_message.
|
private |
References add_constraints_, core::kinematics::FoldTree::add_edge(), core::conformation::Residue::atom_type(), core::conformation::Conformation::chain_begin(), core::conformation::Conformation::chain_end(), core::kinematics::FoldTree::clear(), core::pose::Pose::conformation(), default_fold_tree_, core::pose::Pose::fold_tree(), host_chain_, core::conformation::Residue::nbr_atom(), core::kinematics::Edge::PEPTIDE, place_scaffold_, placed_stubs_, core::pose::remove_lower_terminus_type_from_pose_residue(), core::pose::remove_upper_terminus_type_from_pose_residue(), core::pose::Pose::replace_residue(), core::pose::Pose::residue(), runtime_assert, core::pose::Pose::set_jump(), core::kinematics::FoldTree::set_jump_atoms(), core::pose::Pose::split_by_chain(), stub_based_atom_tree(), core::pose::Pose::total_residue(), TR_debug, core::conformation::Conformation::update_polymeric_connection(), and core::pose::Pose::update_residue_neighbors().
Referenced by apply().
|
private |
remove all coordinate constraints from pose and then reapply them, changing the HarmonicFunc's sdev to a new value Nov09 Changing of previous logic. Now, only changing the sdev associated with the coordinate constraints.
References coord_cst_func_.
Referenced by apply(), and final_cleanup().
|
private |
selects stubs by iterating over the stub_set_. Returns the status of stub selection
References protocols::hotspot_hashing::HotspotStubSet::end(), score_threshold_, stub_set_, and protocols::protein_interface_design::movers::TR.
Referenced by apply().
|
private |
changes the pose's fold-tree to connect the nearest residue on the target to the stub on the scaffold. The foldtree connects the last carbon atom before the stub's functional group. That can be useful in minimization of the pose, b/c the stub's interaction with the target will not be lost due to minimization. Notice that the pose's fold tree changes in the process and so it is usually a good idea to save the old foldtree and reinstate it after minimization. Can work with multiple stubs. In that case, rb jumps are introduced between the target and each of the stubs and a cutpoint is introduced in the putative circle that has just been formed in the fold tree. Alternatively, if the current stub is to be added via a constraint, then a coordinate constraint is set up for this stub
References protocols::protein_interface_design::movers::add_coordinate_constraints(), coord_cst_func_, protocols::protein_interface_design::movers::SetAtomTree::create_atom_tree(), curr_coordinate_constraints_, core::pose::Pose::fold_tree(), host_chain_, placed_stubs_, and protocols::protein_interface_design::movers::TR.
Referenced by place_stub().
|
inline |
References stub_minimize_movers_.
|
inline |
References stub_minimize_movers_.
|
private |
minimize the rb orientation in the presence of a strong bb_stub_constraint potential, while reducing all other attractive scores. fa_sol is also reduced to avoid blowing up the structure. Returns false if current pose has no backbone_stub_constraint score. Removes stub constraints after minimization. If more than one stub has already been placed then the jumps are held rigid during minimization If a stub is specified, then a custom-made hotspot constraint is used
References core::pose::Pose::add_constraints(), protocols::hotspot_hashing::HotspotStubSet::add_hotspot_constraints_to_pose(), core::conformation::Residue::atom_index(), backbone_stub_constraint, core::conformation::Conformation::chain_begin(), core::conformation::Conformation::chain_end(), chainbreak, protocols::simple_filters::ScoreTypeFilter::compute(), core::pose::Pose::conformation(), core::pose::Pose::constraint_set(), constraints, protocols::hotspot_hashing::HotspotStubSet::constraints(), coordinate_constraint, cst, distance(), numeric::xyzVector< class >::distance(), end, fa_atr, fa_dun, fa_pair, fa_rep, fa_sol, fixed_res, getScoreFunction(), hbond_bb_sc, hbond_lr_bb, hbond_sc, hbond_sr_bb, host_chain_, protocols::simple_moves::DesignRepackMover::min_rb(), MinimizeInterface(), protocols::antibody::design::no_min, core::pose::Pose::num_jump(), pi, placed_stubs_, protocols::hotspot_hashing::HotspotStubSet::prepare_hashing_packer_task_(), protocols::simple_moves::DesignRepackMover::prevent_repacking(), protocols::simple_moves::DesignRepackMover::prevent_repacking_, core::pose::Pose::remove_constraints(), protocols::hotspot_hashing::remove_hotspot_constraints_from_pose(), resi, core::pose::Pose::residue(), core::conformation::Conformation::residue(), runtime_assert, sc_min, stats_TR, stub_minimize_movers_, stub_set_, protocols::protein_interface_design::movers::test_res_res_aln(), core::pose::Pose::total_residue(), protocols::protein_interface_design::movers::TR, TR_debug, and core::conformation::Residue::xyz().
Referenced by apply().
|
private |
or use fold tree rb jump.
Referenced by parse_my_tag(), and place_stub().
|
private |
immediately after placement + minimization
Referenced by apply(), and parse_my_tag().
|
private |
Referenced by apply(), refresh_coordinate_constraints(), and stub_based_atom_tree().
|
private |
what std to use for coordinate cst in each design mover
dflt false
Referenced by apply(), parse_my_tag(), and PlaceStubMover().
|
private |
saves the coordinate constraints that this mover has associated with the pose. At the end of the run, they should be removed
Referenced by apply(), cst_cleanup(), final_cleanup(), PlaceStubMover(), and stub_based_atom_tree().
|
private |
this is the foldtree with which we come into the first PlaceStubMover. It will be passed between movers for the user to decide that it should be used.
Referenced by apply(), and place_stub().
|
private |
utility::vector1< core::Real > coord_cst_std_stub_minimize_;
Referenced by apply(), parse_my_tag(), and PlaceStubMover().
|
private |
Locations where stubs are not allowed to be placed
Referenced by apply(), parse_my_tag(), and PlaceStubMover().
|
private |
a filter at the last stage of placement. Defaults to TrueFilter
Referenced by apply(), parse_my_tag(), and PlaceStubMover().
|
private |
where is the stub to be placed
Referenced by apply(), parse_my_tag(), place_stub(), stub_based_atom_tree(), and StubMinimize().
|
private |
Should we speed up StubMinimize at the expense of accuracy?
Referenced by apply(), and parse_my_tag().
|
private |
Referenced by final_cleanup(), and parse_my_tag().
|
private |
the maximum distance for a stub to be considered a a neighbour to a host residue
Referenced by apply(), and parse_my_tag().
|
private |
use inverse rotamers to place the scaffold
Referenced by apply(), parse_my_tag(), and place_stub().
|
private |
where stubs were placed and whether they use constraints. vector is necessary to maintain the order of the placed stubs
Referenced by apply(), cst_cleanup(), final_cleanup(), place_stub(), PlaceStubMover(), stub_based_atom_tree(), and StubMinimize().
|
private |
Referenced by final_cleanup(), and parse_my_tag().
|
private |
Referenced by final_cleanup(), and PlaceStubMover().
|
private |
This task factory is used by placed stubs to add prevent repacking instructions to design movers that would be invoked after PlaceStub finishes successfully. It's a way to communicate the placements that should not be changed to design movers down stream. Note that this is a different implementation than the one used in PlaceSimultaneously.
Referenced by apply(), and parse_my_tag().
|
private |
Referenced by apply(), and parse_my_tag().
|
private |
Referenced by apply(), final_cleanup(), and PlaceStubMover().
|
private |
Referenced by apply(), cst_cleanup(), and PlaceStubMover().
|
private |
Referenced by apply(), and cst_cleanup().
|
private |
maximum bonus_value for accepting a stub
Referenced by parse_my_tag(), and SelectStubIteratively().
|
private |
Maximum per-residue energy the placed stub can have to be saved.
Referenced by apply(), and parse_my_tag().
|
private |
movers for stub minimization, vector of pairs of movers and whether or not to apply bb constraints during the mover
Referenced by parse_my_tag(), PlaceStubMover(), stub_minimize_movers(), and StubMinimize().
|
private |
stub set we're choosing from
Referenced by apply(), parse_my_tag(), PlaceStubMover(), SelectStubIteratively(), and StubMinimize().
|
private |
Should we triage host positions based on smart criteria, such as current position? Leave false if partners have not already been docked.
Referenced by apply(), and parse_my_tag().
|
private |
dflt NULL; a vector of residue numbers placed on the basic::datacache::DataMap which specifies all the placed residues. Useful to communicate between movers and filters, without the pesky NotifyMovers strategy
Referenced by apply(), and parse_my_tag().
1.8.7