13 #include <protocols/genetic_algorithm/GeneticAlgorithm.hh>
14 #include <protocols/multistate_design/MultiStatePacker.hh>
15 #include <protocols/multistate_design/PackingState.hh>
16 #include <protocols/multistate_design/MetricCalculatorFitnessFunction.hh>
17 #include <protocols/multistate_design/MultiStateEntity.hh>
18 #include <protocols/toolbox/pose_metric_calculators/DecomposeAndReweightEnergiesCalculator.hh>
19 #include <protocols/toolbox/pose_metric_calculators/ResidueDecompositionByChainCalculator.hh>
20 #include <core/pose/metrics/simple_calculators/SasaCalculatorLegacy.hh>
21 #include <protocols/toolbox/pose_metric_calculators/NumberHBondsCalculator.hh>
22 #include <protocols/toolbox/pose_metric_calculators/BuriedUnsatisfiedPolarsCalculator.hh>
23 #include <protocols/toolbox/pose_metric_calculators/SurfaceCalculator.hh>
24 #include <protocols/toolbox/pose_metric_calculators/MetricValueGetter.hh>
25 using namespace protocols::genetic_algorithm;
26 using namespace protocols::multistate_design;
29 #include <protocols/dna/PDBOutput.hh>
32 #include <protocols/dna/util.hh>
35 #include <protocols/viewer/viewers.hh>
38 #include <core/types.hh>
39 #include <core/chemical/ResidueType.hh>
41 #include <core/pack/task/PackerTask.hh>
42 #include <core/pack/task/TaskFactory.hh>
43 #include <core/pack/task/operation/TaskOperations.hh>
44 #include <core/pose/Pose.hh>
45 #include <core/pose/metrics/CalculatorFactory.hh>
46 #include <core/scoring/ScoreFunction.hh>
47 #include <core/scoring/ScoreFunctionFactory.hh>
68 #include <basic/options/keys/out.OptionKeys.gen.hh>
69 #include <basic/options/keys/in.OptionKeys.gen.hh>
70 #include <basic/options/keys/ms.OptionKeys.gen.hh>
71 #include <basic/options/keys/packing.OptionKeys.gen.hh>
75 using namespace pose::metrics;
76 using namespace conformation;
77 using namespace chemical;
80 using namespace operation;
81 using namespace scoring;
82 using namespace ObjexxFCL;
84 using namespace protocols::toolbox::pose_metric_calculators;
88 #include <core/import_pose/import_pose.hh>
93 OPT_1GRP_KEY(RealVector, seq_tol, fitness_master_weights)
101 main(
int argc,
char * argv[] )
105 NEW_OPT(seq_tol::unsat_polars,
"calculate the number of buried unsatisfied polar atoms",
false);
110 std::cout <<
"caught exception " << e.
msg() << std::endl;
117 template <
typename A,
typename B>
118 bool cmpscnd( std::pair<A,B>
const &
a, std::pair<A,B>
const &
b )
120 return a.second < b.second;
127 using namespace basic::options::OptionKeys;
139 core::import_pose::pose_from_pdb( *pose,
pdbnames.front() );
140 protocols::dna::add_constraints_from_file( *pose );
144 ga.set_max_generations(
option[ ms::generations ] );
145 ga.set_max_pop_size(
option[ ms::pop_size ]() );
146 ga.set_num_to_propagate( 1 );
147 ga.set_frac_by_recomb(
option[ ms::fraction_by_recombination ]() );
150 Entity::OP entity_template(
new protocols::multistate_design::MultiStateEntity );
151 ga.set_entity_template(entity_template);
154 ga.set_checkpoint_prefix(
option[ ms::checkpoint::prefix ]() );
155 ga.set_checkpoint_write_interval(
option[ ms::checkpoint::interval ]() );
156 ga.set_checkpoint_gzip(
option[ ms::checkpoint::gz ]() );
157 ga.set_checkpoint_rename(
option[ ms::checkpoint::rename ]() );
158 ga.read_checkpoint();
161 PositionSpecificRandomizer::OP rand(
new PositionSpecificRandomizer );
162 rand->set_mutation_rate(
option[ ms::mutate_rate ]() );
163 rand->set_entity_template(entity_template);
165 TaskFactoryOP taskfactory(
new TaskFactory );
166 taskfactory->push_back( TaskOperationCOP(
new operation::InitializeFromCommandline ) );
168 taskfactory->push_back( TaskOperationCOP(
new operation::ReadResfile ) );
170 PackerTaskOP ptask = taskfactory->create_task_and_apply_taskoperations( *pose );
174 for (
Size i(1),
end( ptask->total_residue() ); i <=
end; ++i ) {
176 if ( !pose->residue_type(i).is_protein() )
continue;
177 ResidueLevelTask
const & rtask( ptask->residue_task(i) );
178 if ( rtask.being_designed() ) {
179 design_positions.push_back(i);
181 EntityElements choices;
183 std::set< core::chemical::AA > aaset;
184 std::list< ResidueTypeCOP >
const & allowed( rtask.allowed_residue_types() );
187 core::chemical::AA aa( (*t)->aa() );
189 if ( aaset.find( aa ) != aaset.end() )
continue;
191 TR(
t_debug) <<
"adding choice " << aa << std::endl;
192 choices.push_back( protocols::genetic_algorithm::EntityElementOP(
new PosType( i, aa ) ) );
194 rand->append_choices( choices );
202 MultiStatePackerOP func(
new MultiStatePacker(
option[ ms::num_packs ]()) );
203 func->set_aggregate_function(MultiStateAggregateFunction::COP( MultiStateAggregateFunction::OP(
new MultiStateAggregateFunction() ) ));
204 ScoreFunctionOP score_function( core::scoring::get_score_function() );
205 func->set_scorefxn( score_function );
208 core::pose::metrics::CalculatorFactory & calculator_factory(core::pose::metrics::CalculatorFactory::Instance());
210 ResidueDecompositionByChainCalculatorOP res_decomp_calculator(
new ResidueDecompositionByChainCalculator() );
211 calculator_factory.register_calculator(
"residue_decomposition", res_decomp_calculator);
213 DecomposeAndReweightEnergiesCalculatorOP decomp_reweight_calculator(
new DecomposeAndReweightEnergiesCalculator(
"residue_decomposition") );
214 if (
option[ seq_tol::fitness_master_weights ].
user() ) {
215 decomp_reweight_calculator->master_weight_vector(
option[ seq_tol::fitness_master_weights ]());
217 calculator_factory.register_calculator(
"fitness", decomp_reweight_calculator);
220 protocols::multistate_design::MetricCalculatorFitnessFunctionOP metric_fitness_function(
new protocols::multistate_design::MetricCalculatorFitnessFunction(
"fitness",
"weighted_total") );
223 func->scorefxn()->score(*pose);
224 TR(
t_info) <<
"Residue Decomposition: " << pose->print_metric(
"residue_decomposition",
"residue_decomposition") << std::endl;
225 TR(
t_info) <<
"Fitness Function Master Weights: " << pose->print_metric(
"fitness",
"master_weight_vector") << std::endl;
226 TR(
t_info) <<
"Fitness of Starting Structure: " <<
'\n' << pose->print_metric(
"fitness",
"summary") << std::endl;
229 func->add_metric_value_getter(
234 if (
option[ seq_tol::unsat_polars ] ) {
236 calculator_factory.register_calculator(
"sasa", PoseMetricCalculatorOP(
new core::pose::metrics::simple_calculators::SasaCalculatorLegacy() ));
237 calculator_factory.register_calculator(
"num_hbonds", PoseMetricCalculatorOP(
new NumberHBondsCalculator() ));
238 calculator_factory.register_calculator(
"unsat_polars", PoseMetricCalculatorOP(
new BuriedUnsatisfiedPolarsCalculator(
"sasa",
"num_hbonds") ));
239 func->add_metric_value_getter(
247 calculator_factory.register_calculator(
"surface", PoseMetricCalculatorOP(
new SurfaceCalculator() ));
248 func->add_metric_value_getter(
255 PackingStateOP target_state(
new PackingState( *pose,
true ) );
256 target_state->fitness_function( metric_fitness_function );
257 target_state->create_packer_data( func->scorefxn(), ptask );
258 func->add_state( target_state );
260 TR(
t_info) <<
"There are " << func->num_positive_states() <<
" positive states and "
261 << func->num_negative_states() <<
" negative states" << std::endl;
264 func->single_state_design();
270 if ( ga.population(ga.current_generation()).
size() == 0 ) {
272 SingleStateCOPs states( func->positive_states() );
273 TR(
t_info) <<
"Adding single-state design entities:" << std::endl;
275 EntityElements traits;
277 end( design_positions.end() ); i !=
end; ++i ) {
278 PosType pt( *i, (*s)->pose().residue_type(*i).aa() );
279 traits.push_back( protocols::genetic_algorithm::EntityElementOP(
new PosType( pt ) ) );
280 TR(
t_info) << pt.to_string() <<
" ";
282 ga.add_entity( traits );
283 ga.add_parent_entity( traits );
288 ga.fill_by_mutation(
option[ ms::pop_from_ss ]() );
290 ga.fill_with_random_entities();
296 while ( !ga.complete() ) {
297 if ( ga.current_generation_complete() ) ga.evolve_next_generation();
298 TR(
t_info) <<
"Generation " << ga.current_generation() <<
":" << std::endl;
299 ga.evaluate_fitnesses();
300 ga.print_generation_statistics(
TR(
t_info), ga.current_generation());
304 protocols::dna::PDBOutputOP pdboutput(
new protocols::dna::PDBOutput );
305 pdboutput->reference_pose( *pose );
306 pdboutput->score_function( *score_function );
308 std::string prefix(
"result");
309 if (
option[ OptionKeys::out::prefix ].
user() ) prefix =
option[ out::prefix ]();
312 typedef GeneticAlgorithm::TraitEntityHashMap TraitEntityHashMap;
313 TraitEntityHashMap
const & cache( ga.entity_cache() );
317 sortable.push_back( it->second );
319 std::sort( sortable.begin(), sortable.end(), lt_OP_deref< Entity > );
321 TR(
t_info) <<
"Evaluated " << sortable.size() <<
" sequences out of " << rand->library_size()
322 <<
" possible.\nBest sequences:\n";
327 protocols::genetic_algorithm::Entity & entity(**it);
329 func->evaluate_positive_states( entity );
331 pose::Pose solution_pose = func->positive_states().front()->pose();
333 std::string traitstring;
334 for (
core::Size traitnum = 1; traitnum <= entity.traits().size(); ++traitnum ) {
335 PosTypeCOP postype = utility::pointer::dynamic_pointer_cast< protocols::multistate_design::PosType
const > ( entity.traits()[traitnum] );
337 utility_exit_with_message(
"PosType dynamic cast failed for entity element with name " + entity.traits()[traitnum]->name() );
339 traitstring += core::chemical::oneletter_code_from_aa( postype->type() );
342 std::list< std::string > extra_lines;
343 std::ostringstream ms_info;
344 ms_info <<
"MultiState Fitness: " <<
F(5,4,entity.fitness());
345 extra_lines.push_back( ms_info.str() );
347 ms_info <<
"MultiState Fitness Offset: " <<
F(5,4,entity.fitness() - (*(sortable.begin()))->fitness());
348 extra_lines.push_back( ms_info.str() );
350 ms_info <<
"MultiState Fitness Offset: " <<
F(5,4,entity.fitness() - (*(sortable.begin()))->fitness());
351 extra_lines.push_back( ms_info.str() );
353 ms_info <<
"MultiState Sequence:";
355 pos( entity.traits().begin() ),
end( entity.traits().end() );
357 ms_info <<
" " << (*pos)->to_string();
358 TR(
t_info) << (*pos)->to_string() <<
" ";
360 TR(
t_info) <<
"fitness " <<
F(5,4,entity.fitness()) <<
'\n';
361 extra_lines.push_back( ms_info.str() );
362 pdboutput->add_info(
"multistate_design", extra_lines,
false );
363 (*pdboutput)( solution_pose,
pdbname );
#define utility_exit_with_message(m)
Exit with file + line + message.
virtual std::string const msg() const
std::string lead_zero_string_of(T const &t, int const w)
Leading-Zero Right-Justified string of a Template Argument Type Supporting Stream Output...
utility::keys::KeyLookup< KeyType >::const_iterator const_iterator
Key collection iterators.
vector0: std::vector with assert-checked bounds
void init(int argc, char *argv[])
Command line init() version.
BooleanOptionKey const user("options:user")
utility::keys::lookup::end< KeyType > const end
static THREAD_LOCAL basic::Tracer TR("app.sequence_tolerance")
int main(int argc, char *argv[])
common derived classes for thrown exceptions
void * sequence_tolerance_main(void *)
File name class supporting Windows and UN*X/Linux format names.
rule< Scanner, options_closure::context_t > options
super::const_iterator const_iterator
utility::pointer::shared_ptr< MetricValueBase const > MetricValueBaseCOP
#define NEW_OPT(akey, help, adef)
ocstream cout(std::cout)
Wrapper around std::cout.
vector1: std::vector with 1-based indexing
Class for handling user debug/warnings/errors. Use instance of this class instead of 'std::cout' for ...
utility::pointer::shared_ptr< MetricValueBase > MetricValueBaseOP
#define OPT_1GRP_KEY(type, grp, key)
bool cmpscnd(std::pair< A, B > const &a, std::pair< A, B > const &b)
Program options global and initialization function.
rule< Scanner, option_closure::context_t > option