30 #include <basic/options/option.hh>
31 #include <basic/options/after_opts.hh>
32 #include <basic/options/option_macros.hh>
33 #include <basic/options/keys/mc.OptionKeys.gen.hh>
34 #include <basic/options/keys/out.OptionKeys.gen.hh>
36 #include <basic/options/keys/loops.OptionKeys.gen.hh>
37 #include <basic/options/keys/canonical_sampling.OptionKeys.gen.hh>
38 #include <basic/options/keys/constraints.OptionKeys.gen.hh>
39 #include <utility/file/file_sys_util.hh>
40 #include <utility/file/PathName.hh>
41 #include <utility/file/gzip_util.hh>
52 #include <basic/Tracer.hh>
53 #include <basic/prof.hh>
56 #include <utility/io/ozstream.hh>
57 #include <utility/io/izstream.hh>
58 #include <ObjexxFCL/format.hh>
59 #include <ObjexxFCL/Fmath.hh>
69 #include <utility/vector0.hh>
70 #include <utility/vector1.hh>
106 namespace canonical_sampling {
108 static basic::Tracer
tr(
"protocols.canonical_sampling.CanonicalSamplingMover");
113 using namespace protocols::moves;
114 using namespace basic::options;
115 using namespace basic::options::OptionKeys;
116 using namespace core::pack::task;
119 OPT( mc::known_structures);
120 OPT( out::path::path );
121 OPT(canonical_sampling::sampling::no_detailed_balance);
122 OPT(canonical_sampling::sampling::ntrials);
123 OPT(canonical_sampling::sampling::mc_kt);
124 OPT(canonical_sampling::sampling::interval_pose_dump);
125 OPT(canonical_sampling::sampling::interval_data_dump);
126 OPT(canonical_sampling::sampling::output_only_cluster_transitions);
127 OPT(canonical_sampling::sampling::transition_threshold);
128 OPT(canonical_sampling::out::new_structures);
129 OPT(canonical_sampling::sampling::max_files_per_dir);
130 OPT(canonical_sampling::sampling::save_loops_only);
131 OPT(canonical_sampling::sampling::dump_loops_only);
163 Mover(
"CanonicalSamplingMover"),
187 Mover(
"CanonicalSamplingMover"),
188 mc_(new protocols::moves::
MonteCarlo( *sfxn, basic::options::option[ basic::options::OptionKeys::canonical_sampling::sampling::mc_kt ]() ) ),
192 interval_posedump_(1000),
193 interval_transitiondump_(100),
195 detailed_balance_(true),
196 MPI_synchronize_pools_(false),
197 use_hierarchical_clustering_(false),
198 save_loops_only_(false),
199 dump_loops_only_(false),
200 output_only_cluster_transition_(false),
201 temperature_( basic::options::option[ basic::options::OptionKeys::canonical_sampling::sampling::mc_kt ]() ),
205 runtime_assert( sfxn );
209 using namespace basic::options;
210 using namespace basic::options::OptionKeys;
214 ntrials( option[ basic::options::OptionKeys::canonical_sampling::sampling::ntrials ] );
215 detailed_balance( !option[ basic::options::OptionKeys::canonical_sampling::sampling::no_detailed_balance ] );
217 set_interval_pose_dump( option[ basic::options::OptionKeys::canonical_sampling::sampling::interval_pose_dump ] );
218 set_interval_data_dump( option[ basic::options::OptionKeys::canonical_sampling::sampling::interval_data_dump ] );
219 transition_threshold_ = option[ basic::options::OptionKeys::canonical_sampling::sampling::transition_threshold ]();
222 save_loops_only_ = option[ basic::options::OptionKeys::canonical_sampling::sampling::save_loops_only ]();
223 dump_loops_only_ = option[ basic::options::OptionKeys::canonical_sampling::sampling::dump_loops_only ]();
226 if( option[ run::protocol ].user() && option[run::protocol]() ==
"canonical_sampling") {
247 using namespace ObjexxFCL;
249 return ( ( a >= halfx || a < -halfx ) ? mod( mod( a, x ) + ( x + halfx ), x ) - halfx : a );
258 for(
core::Size ii = itr->start(); ii <= itr->stop(); ii++ ){
266 if ( std::abs( omega ) < 90 ) {
267 position_assignment=
"O";
268 }
else if ( phi >= 0.0 ) {
269 if ( -100 < psi && psi <= 100 ) {
270 position_assignment=
"G";
272 position_assignment=
"E";
275 if ( -125 < psi && psi <= 50 ) {
276 position_assignment=
"A";
278 position_assignment=
"B";
281 ABGEO_assignment = ABGEO_assignment + position_assignment;
283 ABGEO_assignment = ABGEO_assignment +
",";
285 return ABGEO_assignment;
323 for(
unsigned int itr_res_i = 1; itr_res_i <= pose.
total_residue(); itr_res_i++){
324 for(
unsigned int itr_res_j = 1; itr_res_j <= pose.
total_residue(); itr_res_j++){
327 core::Real const CA_dist = ( CA_i - CA_j ).length();
328 if( CA_dist < CA_cutoff ){
351 utility::file::PathName output_path = basic::options::option[ basic::options::OptionKeys::out::path::path ];
353 output_path.name() +
"/" +
355 ObjexxFCL::lead_zero_string_of( job_id % nr_dirs, 4 ) +
"/"
357 utility::file::create_directory_recursive( dir_name );
383 PROF_START( basic::CANONICALMOVER_WRITE_TO_FILE );
391 using namespace ObjexxFCL;
400 score_dump_str=
"."+lead_zero_string_of( score_dump100, 3 );
412 + lead_zero_string_of( itrial_100, 8 ) +
"."
413 + lead_zero_string_of( rest100_10, 1 ) +
"."
414 + lead_zero_string_of( rest100_rest10, 1)
423 ss->fill_struct(looponly, decoy_tag);
428 ss->fill_struct(pose, decoy_tag);
430 ss->add_energy(
"itrial", i_trial );
431 if ( i_trial == 0 ) {
432 ss->print_header( os );
436 PROF_STOP( basic::CANONICALMOVER_WRITE_TO_FILE );
441 using namespace ObjexxFCL::fmt;
442 using namespace basic::options;
443 using namespace basic::options::OptionKeys;
447 utility_exit_with_message(
"did you forget -in:file:silent ? Need to start CanonicalSamplingMover with a valid pose" );
452 PROF_START( basic::MPICANONICALSAMPLING );
460 if( option[basic::options::OptionKeys::loops::loop_file].user() ) {
461 std::string loopfile = option[basic::options::OptionKeys::loops::loop_file]()[1];
465 if( option[ constraints::cst_file ].user() ) {
472 MPI_Comm_size( MPI_COMM_WORLD, (
int* )( &n_nodes ) );
476 mpi_pool_rms->set_discovered_out( (option[ basic::options::OptionKeys::canonical_sampling::out::new_structures ]()).
name() );
480 mpi_pool_rms->set_reserve_size( n_nodes );
483 utility_exit_with_message(
"cast to MPIBPool_RMSD failed! fatal error!");
488 mpi_pool_rms->set_discovered_out( (option[ basic::options::OptionKeys::canonical_sampling::out::new_structures ]()).
name() );
491 mpi_pool_rms->set_reserve_size( n_nodes );
492 mpi_pool_rms->set_reserve_size( n_nodes );
496 utility_exit_with_message(
"cast to MPIPool_RMSD failed! fatal error!");
500 mpi_pool_rms->set_discovered_out( (option[ basic::options::OptionKeys::canonical_sampling::out::new_structures ]()).
name() );
503 mpi_pool_rms->set_reserve_size( n_nodes );
504 mpi_pool_rms->set_reserve_size( n_nodes );
507 tr.Debug <<
"about to begin sampling with MPIHPool " << std::endl;
509 utility_exit_with_message(
"cast to MPIPool_RMSD failed! fatal error!");
527 core::Size nr_dirs( nr_jobs / option[ basic::options::OptionKeys::canonical_sampling::sampling::max_files_per_dir ]() + 1 );
530 std::ofstream transition_file;
533 transition_file.open( transition_filename.c_str() );
542 traj_filename =
jobname_dirhash(
"trajectories", nr_dirs ) + jobname +
".traj.out";
543 traj_scorefile =
jobname_dirhash(
"trajectories", nr_dirs ) + jobname +
".traj.sc";
545 traj_filename = jobname +
".traj.out";
546 traj_scorefile = jobname +
".traj.sc";
548 std::ofstream traj_file( traj_filename.c_str(), std::ios_base::app );
549 std::ofstream traj_sc( traj_scorefile.c_str(), std::ios_base::app );
563 tr <<
"output file exists and is gzipped... moving on to the next one!" << std::endl;
570 existing_output.
read_file( traj_filename );
573 tr <<
"number of tags found in " << traj_filename <<
" is " << existing_tags.size() << std::endl;
575 if( existing_tags.size() > 1 ) {
576 existing_ss = existing_output[ existing_tags[ existing_tags.size() - 1 ] ];
577 tr <<
"existing output: " << traj_file <<
" exists, filling pose with last-structure found: " << existing_tags[ existing_tags.size()-1 ] << std::endl;
578 if( existing_ss->has_energy(
"itrial") ) {
579 i_trial = (
core::Size)existing_ss->get_energy(
"itrial");
580 tr <<
"last trial recorded: " << i_trial << std::endl;
583 tr.Warning <<
" no last trial found.. cannot restart from last structure" << std::endl;
602 core::Real starting_temp = option[ basic::options::OptionKeys::canonical_sampling::sampling::mc_kt ];
603 core::Real ending_temp = option[ basic::options::OptionKeys::canonical_sampling::sampling::mc_kt ];
604 bool constrain_structure =
false;
625 transition_file <<
"I_TRIAL SCORE RG CLUSTER RMS_TO_CLUSTER RMS_TO_START" << std::endl;
627 transition_file <<
"I_TRIAL STEPS_SINCE_TRANSITON SCORE RG CLUSTER RMS_TO_CLUSTER RMS_TO_START" << std::endl;
631 runtime_assert(
mc_ );
642 Size current_cluster_first_seen( 0 );
644 if( constrain_structure ){
650 #ifdef BOINC_GRAPHICS
651 boinc::Boinc::attach_graphics_current_pose_observer( pose );
657 if( existing_ss->nres() > 0 ) {
658 existing_ss->fill_pose( pose );
660 for ( ; i_trial <
ntrials_; i_trial++ ) {
667 proposal_density_ratio =
randmove_->last_proposal_density_ratio();
670 mc_->boltzmann( pose,
randmove_->type(), proposal_density_ratio );
674 mc_->temperature() < ending_temp &&
675 ( i_trial % interval_inc_temp ) == 0 ){
677 if( constrain_structure ){
681 mc_->set_temperature(
mc_->temperature() + 0.1 );
684 constrain_structure &&
686 (i_trial % (interval_inc_temp/10) == 0)
714 hpool_ptr->evaluate( looponly, cluster_center, rms_to_cluster, address );
716 hpool_ptr->evaluate( pose, cluster_center, rms_to_cluster, address );
719 bool above_threshold =
false;
720 for(
core::Size ii = 1; ii <= rms_to_cluster.size(); ii++ ) {
721 if( rms_to_cluster[ ii ] > level_n->radius() ) {
722 above_threshold =
true;
723 new_level_start = ii;
725 level_n = (level_n->next_level());
728 if( above_threshold ){
731 hpool_ptr->add_new( looponly, newtag, address,
true, new_level_start );
733 hpool_ptr->add_new( pose, newtag, address,
true, new_level_start );
739 runtime_assert( hpool_ptr != 0 );
744 hpool_ptr->evaluate_and_add( looponly, cluster_center, rms_to_cluster);
746 hpool_ptr->evaluate_and_add( pose, cluster_center, rms_to_cluster );
765 PROF_START( basic::MPICANONICALSAMPLING );
769 transition_file << i_trial <<
" "
770 << F(width,precision,
mc_->temperature()) <<
" "
771 << F(width,precision,(*
sfxn_)( pose )) <<
" "
772 << F(width,precision,rge.calculate_rg_score( pose )) <<
" "
773 << cluster_center <<
" "
775 << F(width,precision,rms_to_cluster) <<
" "
776 << F(width,precision,rms_to_start) <<
" "
779 PROF_STOP( basic::MPICANONICALSAMPLING );
782 if ( current_cluster_center.compare(
"") == 0 ) {
784 current_cluster_center = cluster_center;
785 }
else if (current_cluster_center.compare( cluster_center ) != 0 ) {
786 PROF_START( basic::MPICANONICALSAMPLING );
789 transition_file << i_trial <<
" "
790 << i_trial-current_cluster_first_seen <<
" "
791 << F(width,precision,
mc_->temperature()) <<
" "
792 << F(width,precision,(*
sfxn_)( pose )) <<
" "
793 << F(width,precision,rge.calculate_rg_score( pose )) <<
" "
794 << cluster_center <<
" "
796 << F(width,precision,rms_to_cluster) <<
" "
797 << F(width,precision,rms_to_start) <<
" "
800 current_cluster_center = cluster_center;
801 current_cluster_first_seen = i_trial;
802 PROF_STOP( basic::MPICANONICALSAMPLING );
835 return "CanonicalSamplingMover";