3 #include <core/pose/Pose.hh>
4 #include <core/pose/PDBInfo.hh>
5 #include <core/pose/Pose.fwd.hh>
6 #include <core/pose/annotated_sequence.hh>
7 #include <core/pose/util.hh>
9 #include <core/import_pose/import_pose.hh>
11 #include <core/conformation/Residue.hh>
12 #include <core/conformation/util.hh>
14 #include <core/chemical/ChemicalManager.hh>
15 #include <core/chemical/ResidueTypeSet.hh>
17 #include <core/util/SwitchResidueTypeSet.hh>
19 #include <core/sequence/util.hh>
20 #include <core/sequence/Sequence.hh>
22 #include <core/conformation/ResidueFactory.hh>
25 #include <protocols/electron_density/util.hh>
26 #include <protocols/electron_density/SetupForDensityScoringMover.hh>
27 #include <protocols/electron_density/DockIntoDensityMover.hh>
28 #include <protocols/simple_moves/MinMover.hh>
29 #include <protocols/rigid/RB_geometry.hh>
31 #include <protocols/idealize/IdealizeMover.hh>
32 #include <protocols/idealize/IdealizeMover.fwd.hh>
34 #include <protocols/simple_moves/PackRotamersMover.hh>
35 #include <core/pack/task/operation/TaskOperations.hh>
36 #include <core/pack/task/operation/OptH.hh>
37 #include <core/pack/task/PackerTask.hh>
38 #include <core/pack/task/TaskFactory.hh>
40 #include <core/kinematics/MoveMap.hh>
41 #include <core/kinematics/FoldTree.hh>
42 #include <core/kinematics/Jump.hh>
43 #include <core/optimization/AtomTreeMinimizer.hh>
44 #include <core/optimization/CartesianMinimizer.hh>
45 #include <core/optimization/symmetry/SymAtomTreeMinimizer.hh>
46 #include <core/optimization/MinimizerOptions.hh>
49 #include <core/scoring/electron_density/ElectronDensity.hh>
50 #include <core/scoring/rms_util.hh>
51 #include <core/scoring/rms_util.tmpl.hh>
53 #include <core/scoring/ScoreFunction.hh>
54 #include <core/scoring/ScoreFunctionFactory.hh>
56 #include <core/fragment/util.hh>
57 #include <core/fragment/FragmentIO.hh>
58 #include <core/fragment/FragSet.hh>
59 #include <core/fragment/Frame.hh>
60 #include <core/fragment/FrameIterator.hh>
61 #include <core/fragment/FragData.hh>
62 #include <core/fragment/ConstantLengthFragSet.hh>
63 #include <core/fragment/BBTorsionSRFD.hh>
65 #include <core/io/silent/BinarySilentStruct.hh>
66 #include <core/io/silent/SilentFileData.hh>
71 #include <basic/options/keys/in.OptionKeys.gen.hh>
72 #include <basic/options/keys/out.OptionKeys.gen.hh>
73 #include <basic/options/keys/edensity.OptionKeys.gen.hh>
84 #include <boost/tuple/tuple.hpp>
85 #include <boost/tuple/tuple_comparison.hpp>
104 OPT_KEY( IntegerVector, designated_rank )
107 OPT_KEY( Boolean, min_pack_min )
109 OPT_KEY( Boolean, norm_scores )
111 OPT_KEY( Integer, n_to_search )
115 OPT_KEY( Boolean, native_placements )
119 OPT_KEY( Integer, clust_oversample )
122 OPT_KEY( IntegerVector, frag_len )
123 OPT_KEY( RealVector, assembly_weights )
125 OPT_KEY( Real, consensus_frac )
126 OPT_KEY( Real, consensus_stdev )
132 using
namespace basic::options::OptionKeys;
135 static basic::Tracer
TR("denovo_density");
142 std::ifstream inpdb(pdbfile.c_str());
146 if ( buf.substr(0,4)!=
"ATOM" && buf.substr(0,6)!=
"HETATM" )
continue;
147 if ( buf.substr(12,4) !=
" CA " )
continue;
150 atof(buf.substr(30,8).c_str()),
151 atof(buf.substr(38,8).c_str()),
152 atof(buf.substr(46,8).c_str())
155 cas.push_back( ca_i );
169 cas_.reserve( pose.total_residue() );
170 for (
int i=1; i<=(
int)pose.total_residue(); ++i ) {
171 if ( pose.residue(i).is_protein() )
cas_.push_back( pose.residue(i).xyz(2) );
216 core::fragment::FragSetOP
220 return "DockFragments";
243 return "ScoreFragmentSet";
264 return "FragmentAssembly";
291 return "ConsensusFragment";
301 return "SolutionRescore";
307 core::fragment::FragSetOP
312 core::fragment::FragSetOP fragments_clust = fragments->empty_clone();
314 for ( core::fragment::ConstFrameIterator it = fragments->begin(); it != fragments->end(); ++it ) {
315 core::fragment::Frame
frame = **it;
316 core::fragment::FrameOP filteredframe = frame.clone();
319 for (
core::Size i_frag=1; i_frag<=nfrags_i; i_frag++ ) {
320 core::fragment::FragDataCOP oldfrag = frame.fragment_ptr(i_frag);
323 core::Size storedfragcount = filteredframe->nr_frags();
324 for (
core::Size j_frag=1; j_frag<=storedfragcount && addfrag; j_frag++ ) {
325 core::fragment::FragDataCOP storedfrag = filteredframe->fragment_ptr(j_frag);
329 for (
core::Size i_res=1; i_res<=oldfrag->size(); ++i_res ) {
330 core::fragment::BBTorsionSRFD
const & frag_i =
331 dynamic_cast< core::fragment::BBTorsionSRFD
const &
> ( *(oldfrag->get_residue(i_res)) );
332 core::fragment::BBTorsionSRFD
const & frag_j =
333 dynamic_cast< core::fragment::BBTorsionSRFD
const &
> ( *(storedfrag->get_residue(i_res)) );
335 for (
core::Size i_tors=1; i_tors<=frag_i.nbb(); ++i_tors ) {
336 core::Real err_i = (frag_i.torsion(i_tors) - frag_j.torsion(i_tors));
337 error += err_i*err_i;
342 if ( RMS <= fragfilter ) addfrag=
false;
345 if ( addfrag ) filteredframe->add_fragment(oldfrag);
348 TR.
Debug <<
"pos " << (*it)->start() <<
" mer " << (*it)->length()
349 <<
" nfrags " << frame.nr_frags() <<
" -> " << filteredframe->nr_frags() << std::endl;
351 fragments_clust->add(filteredframe);
354 return fragments_clust;
363 core::fragment::FragSetOP fragments, fragments_small;
365 nmer_ = fragments->max_frag_length();
368 if ( nmer_target.size() == 0 ) {
369 nmer_target.push_back(
nmer_);
370 nmer_target.push_back(
nmer_);
377 if ( nmer_target_big<
nmer_ ) {
378 TR <<
"Chopping to " << nmer_target_big <<
" mers" << std::endl;
379 fragments_small = core::fragment::FragSetOP(
new core::fragment::ConstantLengthFragSet( nmer_target_big ) );
380 core::fragment::chop_fragments( *fragments, *fragments_small );
381 fragments = fragments_small->clone();
384 if ( nmer_target_small<nmer_target_big ) {
385 TR <<
"Chopping to " << nmer_target_small <<
" mers" << std::endl;
386 fragments_small = core::fragment::FragSetOP(
new core::fragment::ConstantLengthFragSet( nmer_target_small ) );
387 core::fragment::chop_fragments( *fragments, *fragments_small );
389 fragments_small = fragments->clone();
392 nmer_ = nmer_target_big;
395 core::fragment::FragSetOP fragclust =
cluster_frags( fragments );
396 core::fragment::FragSetOP fragsmallclust =
cluster_frags( fragments_small );
399 for ( core::fragment::ConstFrameIterator i = fragclust->begin(); i != fragclust->end(); ++i ) {
403 for ( core::fragment::ConstFrameIterator i = fragsmallclust->begin(); i != fragsmallclust->end(); ++i ) {
418 sequence = native_pose.sequence();
420 sequence = core::sequence::read_fasta_file(
option[ in::file::fasta ]()[1])[1]->sequence();
433 for (
core::Size i=1; i<=search_positions.size(); ++i ) {
434 search_positions[i] = (std::find( inpos.begin(), inpos.end(), i ) != inpos.end());
440 for ( std::map<core::Size, core::fragment::Frame>::iterator it=
library_.begin(); it!=
library_.end(); ++it ) {
442 core::fragment::Frame &
f = it->second;
446 for (
core::Size i=1; i<=f.nr_frags(); ++i ) {
447 core::fragment::FragData
const &f_i = f.fragment( i );
450 if ( f_i.secstruct(j) ==
'E' ) { nstrand++; }
455 if ( strand_frac > STRAND_LONGFRAG_CUT ) {
456 use_big[idx] =
false;
460 bool have_initial_pose =
option[ startmodel ].user();
462 std::map<int,int> initial_pose_seqmap;
464 if ( have_initial_pose ) {
465 core::import_pose::pose_from_pdb( initial_pose,
option[ startmodel ]() );
472 for (
int i=1; i<=(
int)initial_pose.total_residue(); ++i ) {
473 init_pose_covers[initial_pose.pdb_info()->number(i)] =
true;
474 initial_pose_seqmap[initial_pose.pdb_info()->number(i)] = i;
476 for (
int i=1; i<=(
int)search_positions.size(); ++i ) {
477 if ( !search_positions[i] )
continue;
480 bool frag_i_covered = init_pose_covers[i];
481 for (
int j=i+1; j<i+(
int)nmer && frag_i_covered; ++j ) {
482 frag_i_covered = frag_i_covered && init_pose_covers[j];
485 search_positions[i] = !frag_i_covered;
486 steal_positions[i] = frag_i_covered;
492 TR <<
"Searching positions:";
493 for (
int i=1; i<=(
int)search_positions.size(); ++i ) {
494 if ( search_positions[i] )
TR <<
" " << i;
498 TR <<
"Stealing positions:";
499 for (
int i=1; i<=(
int)search_positions.size(); ++i ) {
500 if ( steal_positions[i] )
TR <<
" " << i;
506 protocols::electron_density::DockIntoDensityMover dock;
507 dock.setDelR(
option[ delR ]);
515 dock.setB(
option[ bw ]() );
516 dock.setTopN(
option[ n_to_search ]() ,
option[ n_filtered ]() ,
option[ n_output ]() );
517 dock.setGridStep(
option[ movestep ]());
518 dock.setMinBackbone(
option[ min_bb ]());
519 dock.setNCyc(
option[ ncyc ]());
520 dock.setClusterRadius(
option[ clust_radius ]());
521 dock.setFragDens(
option[ frag_dens ]());
523 dock.setNormScores(
option[ norm_scores ]());
525 dock.setNormScores(
false );
527 dock.setClusterOversamp(
option[ clust_oversample ]());
528 dock.setMaxRotPerTrans( 1 );
531 dock.setOutputSilent( silent_fn );
537 dock.predefine_search(cas);
538 dock.setCenterOnMiddleCA(
true);
542 for ( std::map<core::Size, core::fragment::Frame>::iterator it=
library_.begin(); it!=
library_.end(); ++it ) {
544 core::fragment::Frame
frame;
545 if ( use_big[idx] ) {
553 if ( !search_positions[seq_pos] && !steal_positions[seq_pos] )
continue;
557 if ( native_pose.total_residue() > 0 ) {
559 core::kinematics::FoldTree
fold_tree( nmer_len );
560 for (
core::Size irsd=seq_pos; irsd<seq_pos+nmer_len; ++irsd ) { positions.push_back( irsd ); }
561 core::pose::create_subpose( native_pose, positions, fold_tree, *native_frag_pose );
564 dock.setNative( native_frag_pose );
567 std::string frag_seq = sequence.substr( seq_pos-1, nmer_len );
568 TR <<
"search for fragment: [" << seq_pos <<
"] " << frag_seq << std::endl;
572 if ( search_positions[seq_pos] ) {
573 dock.setPassThrough(
false );
574 dock.setDoRefine(
option[ min_pack_min ]());
578 core::pose::make_pose_from_sequence( frag_ref, frag_seq,
579 *( core::chemical::ChemicalManager::get_instance()->residue_type_set( core::chemical::CENTROID )) );
580 for (
core::Size j=1; j<=frame.nr_frags(); ++j ) {
582 frame.fragment( j ).apply( *frag_i, 1, nmer_len );
584 frags.push_back( frag_i );
586 }
else if ( steal_positions[seq_pos] ) {
587 dock.setPassThrough(
true );
588 dock.setDoRefine(
false );
593 core::kinematics::FoldTree
fold_tree( nmer_len );
594 for (
core::Size irsd=seq_pos; irsd<seq_pos+nmer_len; ++irsd ) {
595 positions.push_back( initial_pose_seqmap[irsd] );
597 core::pose::create_subpose( initial_pose, positions, fold_tree, *steal_pose );
599 dock.setNative( steal_pose );
600 frags.push_back( steal_pose );
604 dock.apply_multi(frags);
611 using core::scoring::electron_density::poseCoords;
612 using core::scoring::electron_density::poseCoord;
618 for (
int i = 1; i <= (
int)pose.total_residue(); ++i ) {
619 core::conformation::Residue
const & rsd_i ( pose.residue(i) );
620 bool skipres = ( rsd_i.aa() == core::chemical::aa_vrt );
621 for (
int j = i-(
int)edge_trim; j < (i+(
int)edge_trim) && !skipres; ++j ) {
622 if ( j>=1 && j<=(
int)pose.total_residue() && pose.fold_tree().is_cutpoint( j ) ) skipres=
true;
625 if ( skipres )
continue;
629 core::chemical::AtomTypeSet
const & atom_type_set( rsd_i.atom_type_set() );
631 coord_j.x_ = rsd_i.xyz( j );
632 coord_j.B_ = core::scoring::electron_density::getDensityMap().getEffectiveBfactor();
633 coord_j.elt_ = atom_type_set[ rsd_i.atom_type_index( j ) ].element();
634 litePose.push_back( coord_j );
638 core::scoring::electron_density::getDensityMap().calcRhoC( litePose, 0, rhoC, rhoMask, -1, 600, mask_radius );
642 for (
int z=1;
z<=(
int)densnew.
u3();
z++ ) {
643 for (
int y=1;
y<=(
int)densnew.
u2();
y++ ) {
644 for (
int x=1;
x<=(
int)densnew.
u1();
x++ ) {
645 densnew(
x,
y,
z) *= (1-rhoMask(
x,
y,
z));
649 core::scoring::electron_density::getDensityMap().set( densnew );
652 core::scoring::electron_density::getDensityMap().writeMRC(
"trimmed.mrc" );
703 core::io::silent::SilentFileData sfd;
704 for (
core::Size n=1; n<=insilent.size(); ++n ) {
705 sfd.read_file( insilent[n] );
709 for ( core::io::silent::SilentFileData::iterator iter = sfd.begin(),
end = sfd.end(); iter !=
end; ++iter ) {
710 std::string
tag = iter->decoy_tag();
712 core::Real score_i = iter->get_energy(
"dens_score" );
714 core::Real rank_i = iter->get_energy(
"dens_rank" );
716 if (
option[ n_matches ].
user() && (
option[ n_matches ]+0.5) < rank_i )
continue;
717 if (
option[ cheat ].
user() && rms_i > 2 )
continue;
719 if ( score_i<-999 ) score_i=1000.0;
723 TR.
Debug <<
"Processing " << tag << std::endl;
726 std::string fragtag = fields[1];
731 iter->fill_pose( frag );
733 CAtrace ca_i(frag,tag, -score_i, rms_i);
738 if ( all_frags.size() < resid ) all_frags.resize( resid );
739 if ( all_frags[resid].
size() < rank_i ) all_frags[resid].resize( rank_i );
740 all_frags[resid][rank_i] = ca_i;
747 std::ofstream outscore(
option[ scorefile ]().c_str(), std::ios::out | std::ios::binary );
749 TR <<
"1b: [" << i_res <<
"/" << nres <<
"]" <<
"\r" << std::flush;
751 for (
core::Size i_frag=1; i_frag<=nfrag_i; ++i_frag ) {
752 core::Real scalefactor = 9.0 / all_frags[i_res][i_frag].cas_.size();
754 core::Real dens_sc = scalefactor * all_frags[i_res][i_frag].dens_score_;
756 std::string
tag = all_frags[i_res][i_frag].tag_;
759 std::strncpy( tagstr, tag.c_str(), 31 );
762 outscore.write( (
char*)&
type ,
sizeof(
type) );
763 outscore.write( (
char*)tagstr , 32*
sizeof(
char) );
764 outscore.write( (
char*)&idx ,
sizeof(idx) );
765 outscore.write( (
char*)&i_res ,
sizeof(i_res) );
766 outscore.write( (
char*)&dens_sc ,
sizeof(dens_sc) );
767 outscore.write( (
char*)&rms ,
sizeof(rms) );
769 all_frags[i_res][i_frag].idx_ = idx++;
772 TR <<
"1b: [" << nres <<
"/" << nres <<
"]" << std::endl;
777 TR <<
"2b: [" << i_res <<
"/" << nres <<
"]" <<
"\r" << std::flush;
783 for (
core::Size i_frag=1; i_frag<=nfrag_i; ++i_frag ) {
784 for (
core::Size j_frag=1; j_frag<=nfrag_j; ++j_frag ) {
795 core::Size idxi = all_frags[i_res][i_frag].idx_;
796 core::Size idxj = all_frags[j_res][j_frag].idx_;
798 outscore.write( (
char*)&
type ,
sizeof(
type) );
799 outscore.write( (
char*)&i_res ,
sizeof(i_res) );
800 outscore.write( (
char*)&idxi ,
sizeof(idxi) );
801 outscore.write( (
char*)&j_res ,
sizeof(j_res) );
802 outscore.write( (
char*)&idxj ,
sizeof(idxj) );
803 outscore.write( (
char*)&clash_sc ,
sizeof(clash_sc) );
804 outscore.write( (
char*)&overlap_sc ,
sizeof(overlap_sc) );
805 outscore.write( (
char*)&closability_sc ,
sizeof(closability_sc) );
811 TR <<
"2b: [" << nres <<
"/" << nres <<
"]" << std::endl;
819 if ( offset<mersize ) {
820 for (
int i=(
int)(offset+1); i<=(
int)mersize; ++i ) {
825 if ( dist > 5.0 )
return 8.0;
829 for (
int i=1; i<=(
int)mersize; ++i ) {
830 for (
int j=1; j<=(
int)mersize; ++j ) {
831 int seqsep = offset-i+j;
832 if ( seqsep >= 5 || seqsep <= -5 ) {
844 overlap_ij += overlap_ij_xyz;
854 if ( offset >= mersize ) {
856 for (
int i=1; i<=(
int)mersize; ++i ) {
857 for (
int j=1; j<=(
int)mersize; ++j ) {
875 if ( offset < mersize )
return 0.0;
913 core::Real clash_i=0, overlap_i=0, close_i=0, dens_i=0, score_i=0, rms_i=0;
921 score_i =
scores_1b[ assigned_frags[i] ];
922 rms_i =
rmses[ assigned_frags[i] ];
925 if ( assigned_frags[j] != 0 ) {
926 score_i += 0.5*
scores_2b[ assigned_frags[i] ][ assigned_frags[j] ];
927 score_total += 0.5*
scores_2b[ assigned_frags[i] ][ assigned_frags[j] ];
935 if (
verbose )
TR <<
"res " << i <<
": " << rms_i <<
" " << score_i <<
" = " << clash_i <<
"/" << overlap_i <<
"/" << close_i <<
"/" << dens_i << std::endl;
944 TR <<
"Must specify an output file with -out::file::silent!" << std::endl;
949 std::ifstream inscore(
option[ scorefile ]().c_str(), std::ios::in | std::ios::binary );
950 TR <<
"reading scorefile" << std::endl;
951 while ( !inscore.eof() ) {
953 core::Real dens_sc,clash_sc,overlap_sc,closability_sc, rms_i;
960 rmses.reserve(50*1000);
963 inscore.read( (
char*)&type ,
sizeof(type) );
965 if ( inscore.eof() )
break;
969 inscore.read( (
char*)tagstr , 32*
sizeof(
char) );
970 inscore.read( (
char*)&idxi ,
sizeof(idxi) );
971 inscore.read( (
char*)&ires ,
sizeof(ires) );
972 inscore.read( (
char*)&dens_sc ,
sizeof(dens_sc) );
973 inscore.read( (
char*)&rms_i ,
sizeof(rms_i) );
977 FragID frag_i( ires, itag );
989 if ( idxi >
rmses.size() )
rmses.resize( idxi );
992 }
else if ( type==2 ) {
995 TR <<
"read " <<
allfrags.size() <<
" fragments" << std::endl;
996 TR <<
"reading 2b scores" << std::endl;
1005 inscore.read( (
char*)&ires ,
sizeof(ires) );
1006 inscore.read( (
char*)&idxi ,
sizeof(idxi) );
1007 inscore.read( (
char*)&jres ,
sizeof(jres) );
1008 inscore.read( (
char*)&idxj ,
sizeof(idxj) );
1009 inscore.read( (
char*)&clash_sc ,
sizeof(clash_sc) );
1010 inscore.read( (
char*)&overlap_sc ,
sizeof(overlap_sc) );
1011 inscore.read( (
char*)&closability_sc ,
sizeof(closability_sc) );
1034 core::io::silent::SilentFileData sfd;
1036 for (
core::Size n=1; n<=insilent.size(); ++n ) {
1037 sfd.read_file( insilent[n] );
1042 core::Real sa_start_temp = 500.0, sa_end_temp=1.0;
1045 for (
int rd=1; rd<=(
int)nstruct; ++rd ) {
1051 for (
int i=1; i<=(
int)nres; ++i ) {
1061 for (
core::Size temp_ctr=1; temp_ctr<=sa_nsteps; ++temp_ctr ) {
1062 for (
core::Size step=1; step<=mc_nsteps; ++step ) {
1070 core::Real best_frag_score = 1e30, prob_sum = 0.0;
1071 for (
int i=1; i<=(
int)n_frag_cands; ++i ) {
1073 if ( frag_cands[i] == 0 ) {
1076 frag_scores[i] =
scores_1b[ frag_cands[i] ];
1079 if ( assigned_fragidx != 0 && (
int)
pos != select_pos ) {
1080 frag_scores[i] +=
scores_2b[ frag_cands[i] ][ assigned_fragidx ];
1085 best_frag_score =
std::min( frag_scores[i], best_frag_score );
1088 for (
core::Size i=1; i<=n_frag_cands; ++i ) {
1089 frag_scores[i] -= best_frag_score;
1090 frag_scores[i] = std::exp( -
std::min( frag_scores[i]/temp, 100.0 ) );
1096 prob_sum += frag_scores[i];
1102 while ( fragpicker>=0 && picked<
int(n_frag_cands) ) {
1104 fragpicker -= frag_scores[picked];
1106 assert( fragpicker < 0 );
1113 TR <<
"Finished temp = " << temp <<
" : score = " << score_total <<
" [" << nassigned <<
" assigned]" << std::endl;
1123 TR <<
"Total score: " << score_total << std::endl;
1127 std::ostringstream oss;
1132 tag_indices.push_back( i );
1137 for ( core::io::silent::SilentFileData::iterator iter = sfd.begin(),
end = sfd.end(); iter !=
end; ++iter ) {
1138 std::string
tag = iter->decoy_tag();
1140 if ( tag_it == tags_to_fetch.end() )
continue;
1145 iter->fill_pose( *frag_i );
1146 frags_sel[ tag_indices[
index] ] = frag_i;
1152 core::io::silent::SilentFileData sfd_out( outfile,
false,
false,
"binary" );
1153 for (
core::Size i=1; i<=tags_to_fetch.size(); ++i ) {
1156 core::io::silent::BinarySilentStruct silent_stream( *(frags_sel[idx]), tags_to_fetch[i] );
1157 silent_stream.add_energy(
"pos", idx );
1158 silent_stream.add_energy(
"total_score", score_total );
1159 sfd.write_silent_struct( silent_stream, outfile );
1171 using namespace core::pack::task::operation;
1178 for (
core::Size n=1; n<=insilent.size(); ++n ) {
1179 core::io::silent::SilentFileData sfd;
1180 sfd.read_file( insilent[n] );
1183 std::map< core::Size, CAtrace > all_frags;
1185 for ( core::io::silent::SilentFileData::iterator iter = sfd.begin(),
end = sfd.end(); iter !=
end; ++iter ) {
1186 std::string
tag = iter->decoy_tag();
1189 core::Real score_i = iter->get_energy(
"dens_score" );
1190 core::Real rms_i = iter->get_energy(
"rms" );
1192 if ( fields.size() < 2 || fields[1] ==
"empty" ) {
1197 core::Size resid = atoi( fields[2].c_str() );
1199 TR.
Debug <<
"Processing " << tag << std::endl;
1201 iter->fill_pose( *frag_i );
1203 CAtrace ca_i(*frag_i, tag, -score_i, rms_i);
1206 all_frags.insert ( std::make_pair(resid,ca_i) );
1210 std::map< core::Size, CAtrace >::iterator iter1, iter2;
1215 core::Real overlap_wt = 4.0, clash_wt = 20.0, close_wt = 6.0, dens_wt = 0.85;
1217 overlap_wt =
option[ assembly_weights ]()[1];
1218 clash_wt =
option[ assembly_weights ]()[2];
1219 close_wt =
option[ assembly_weights ]()[3];
1222 core::Real score=0.0, clash_score=0.0, close_score=0.0, overlap_score=0.0, dens_score=0.0;
1224 for ( iter1 = all_frags.begin(); iter1 != all_frags.end(); iter1++ ) {
1228 core::Real dens_i = dens_wt * iter1->second.dens_score_;
1231 if ( rms < 2.0 ) ncorr++;
1233 dens_score += dens_i;
1236 for ( iter2 = all_frags.begin(); iter2 != all_frags.end(); iter2++ ) {
1237 if ( iter1->first == iter2->first )
continue;
1240 if ( iter2->first > iter1->first ) {
1241 core::Size offset = iter2->first-iter1->first;
1242 overlap_ij = scoring.
overlap_score(iter1->second, iter2->second, offset);
1243 clash_ij = scoring.
clash_score(iter1->second, iter2->second, offset);
1246 core::Size offset = iter1->first-iter2->first;
1247 overlap_ij = scoring.
overlap_score(iter2->second, iter1->second, offset);
1248 clash_ij = scoring.
clash_score(iter2->second, iter1->second, offset);
1252 overlap_i += 0.5*overlap_wt * overlap_ij;
1253 clash_i += 0.5*clash_wt * clash_ij;
1254 close_i += 0.5*close_wt * close_ij;
1260 overlap_score += overlap_i;
1261 clash_score += clash_i;
1262 close_score += close_i;
1263 TR << iter1->second.tag_ <<
": " << dens_i + overlap_i + clash_i + close_i <<
" " << dens_i <<
" / " << overlap_i <<
" / " << clash_i <<
" / " << close_i << std::endl;
1265 score = clash_score + close_score + overlap_score + dens_score;
1266 TR <<
"TOTAL: " << score <<
" [" << dens_score <<
" / " << overlap_score <<
" / " << clash_score <<
" / " << close_score <<
"] "
1267 << ncorr <<
" " << all_frags.size() << std::endl;
1276 using namespace core::pack::task::operation;
1282 std::map< core::Size, utility::vector1< core::pose::PoseOP > > all_frags;
1286 core::io::silent::SilentFileData sfd;
1287 for (
core::Size n=1; n<=insilent.size(); ++n ) {
1288 sfd.read_file( insilent[n] );
1291 for ( core::io::silent::SilentFileData::iterator iter = sfd.begin(),
end = sfd.end(); iter !=
end; ++iter ) {
1292 core::Real score_i = iter->get_energy(
"total_score" );
1293 allscores.push_back(score_i);
1295 std::sort( allscores.begin(), allscores.end() );
1296 core::Real score_cut = allscores[ (
int)std::floor(
option[energy_cut]*allscores.size() )+1 ];
1297 TR <<
"Score cut = " << score_cut <<
" (" << (
int)std::floor(
option[energy_cut]*allscores.size() ) <<
"/" << allscores.size() <<
")" << std::endl;
1299 for ( core::io::silent::SilentFileData::iterator iter = sfd.begin(),
end = sfd.end(); iter !=
end; ++iter ) {
1300 core::Real score_i = iter->get_energy(
"total_score" );
1301 if ( score_i > score_cut )
continue;
1303 std::string
tag = iter->decoy_tag();
1306 if ( fields.size() < 2 || fields[1] ==
"empty" ) {
1307 TR <<
"Skipping tag >" << tag <<
"<" << std::endl;
1311 core::Size resid = atoi( fields[2].c_str() );
1313 TR.
Debug <<
"Processing " << tag << std::endl;
1315 iter->fill_pose( *frag_i );
1317 all_frags[resid].push_back( frag_i );
1322 std::map< core::Size, utility::vector1< core::pose::PoseOP > >::iterator iter;
1323 for ( iter = all_frags.begin(); iter != all_frags.end(); iter++ ) {
1324 maxcount =
std::max( maxcount, iter->second.size() );
1326 TR <<
"Highest frequency = " << maxcount << std::endl;
1332 std::map< core::Size , numeric::xyzVector< core::Real > > ca_sum, c_sum, n_sum, o_sum;
1333 std::map< core::Size , numeric::xyzVector< core::Real > > ca_sum2;
1334 std::map< core::Size , core::Size > rescounts;
1336 for ( iter = all_frags.begin(); iter != all_frags.end(); iter++ ) {
1338 if ( iter->second.size() < maxcount )
continue;
1340 for (
int i=1; i<=(
int)iter->second.size(); ++i ) {
1341 core::pose::PoseOP frag_i = iter->second[i];
1342 for (
int j=1; j<=(
int)frag_i->total_residue(); ++j ) {
1343 if ( !frag_i->residue(j).is_protein() )
continue;
1345 if ( rescounts.find( resid_j ) == rescounts.end() ) {
1346 rescounts[resid_j] = 0;
1347 ca_sum[resid_j] = c_sum[resid_j] = n_sum[resid_j] = o_sum[resid_j]
1352 n_j = frag_i->residue(j).atom(1).xyz();
1353 ca_j = frag_i->residue(j).atom(2).xyz();
1354 c_j = frag_i->residue(j).atom(3).xyz();
1355 o_j = frag_i->residue(j).atom(4).xyz();
1357 rescounts[resid_j]++;
1358 n_sum[resid_j] += n_j;
1359 ca_sum[resid_j] += ca_j;
1360 c_sum[resid_j] += c_j;
1361 o_sum[resid_j] += o_j;
1364 ca_j[0]*ca_j[0], ca_j[1]*ca_j[1], ca_j[2]*ca_j[2]);
1370 std::map< core::Size , core::Size >::iterator res_iter;
1375 for ( res_iter = rescounts.begin(); res_iter != rescounts.end(); res_iter++ ) {
1378 n_sum[resid] /= rescounts[resid];
1379 ca_sum[resid] /= rescounts[resid];
1380 c_sum[resid] /= rescounts[resid];
1381 o_sum[resid] /= rescounts[resid];
1383 for (
int j=0; j<3; ++j ) {
1384 ca_sum2[resid][j] = ( ca_sum2[resid][j] / rescounts[resid] - ca_sum[resid][j]*ca_sum[resid][j] );
1387 TR <<
"Residue " << resid <<
" stdev = " << ca_var <<
" pose = " << ca_sum[resid] <<
" count = " << rescounts[resid] << std::endl;
1388 if ( ca_var >
option[ consensus_stdev ] )
continue;
1392 core::conformation::ResidueOP res_to_add;
1394 for ( iter = all_frags.begin(); iter != all_frags.end() && !done; iter++ ) {
1396 for (
int i=1; i<=(
int)iter->second.size() && !done; ++i ) {
1397 core::pose::PoseOP frag_i = iter->second[i];
1398 for (
int j=1; j<=(
int)frag_i->total_residue() && !done; ++j ) {
1399 if ( !frag_i->residue(j).is_protein() )
continue;
1400 int resid_j = resid_tgt+j-1;
1401 if ( resid_j == (
int)resid ) {
1404 core::conformation::Residue old_rsd = frag_i->residue(j);
1405 chemical::ResidueTypeSetCOP rsd_set( old_rsd.residue_type_set() );
1406 chemical::ResidueType
const & new_rsd_type(
1407 rsd_set->get_residue_type_with_variant_removed( old_rsd.type(),
1408 chemical::LOWERTERM_TRUNC_VARIANT ) );
1409 chemical::ResidueType
const & new2_rsd_type(
1410 rsd_set->get_residue_type_with_variant_removed( new_rsd_type,
1411 chemical::UPPERTERM_TRUNC_VARIANT ) );
1412 chemical::ResidueType
const & new3_rsd_type(
1413 rsd_set->get_residue_type_with_variant_removed( new2_rsd_type,
1414 chemical::UPPER_TERMINUS_VARIANT ) );
1415 chemical::ResidueType
const & new4_rsd_type(
1416 rsd_set->get_residue_type_with_variant_removed( new3_rsd_type,
1417 chemical::LOWER_TERMINUS_VARIANT ) );
1418 chemical::ResidueType
const & new5_rsd_type(
1419 rsd_set->get_residue_type_with_variant_removed( new4_rsd_type,
1420 chemical::DISULFIDE ) );
1422 res_to_add = conformation::ResidueFactory::create_residue( new5_rsd_type );
1423 res_to_add->atom(
"N").xyz(n_sum[resid_j]);
1424 res_to_add->atom(
"CA").xyz(ca_sum[resid_j]);
1425 res_to_add->atom(
"C").xyz(c_sum[resid_j]);
1426 res_to_add->atom(
"O").xyz(o_sum[resid_j]);
1432 if ( averaged_pose.total_residue() == 0 || resid != lastres-1 ) {
1433 averaged_pose.append_residue_by_bond( *res_to_add );
1435 core::conformation::add_variant_type_to_conformation_residue(
1436 averaged_pose.conformation(), chemical::UPPER_TERMINUS_VARIANT, averaged_pose.total_residue() );
1437 averaged_pose.append_residue_by_jump( *res_to_add, averaged_pose.total_residue() );
1438 core::conformation::add_variant_type_to_conformation_residue(
1439 averaged_pose.conformation(), chemical::LOWER_TERMINUS_VARIANT, averaged_pose.total_residue() );
1442 pdb_numbering.push_back(resid);
1443 pdb_chains.push_back(
'A');
1446 if ( averaged_pose.total_residue() == 0 ) {
1447 TR <<
"NO RESIDUES IN CONSENSUS ASSIGNMENT." << std::endl;
1450 core::pose::PDBInfoOP new_pdb_info(
new core::pose::PDBInfo(averaged_pose,
true) );
1451 new_pdb_info->set_numbering( pdb_numbering );
1452 new_pdb_info->set_chains( pdb_chains );
1453 averaged_pose.pdb_info( new_pdb_info );
1454 averaged_pose.pdb_info()->obsolete(
false );
1457 if ( !averaged_pose.residue_type(1).has_variant_type( chemical::LOWER_TERMINUS_VARIANT ) ) {
1458 core::pose::add_variant_type_to_pose_residue( averaged_pose, chemical::LOWER_TERMINUS_VARIANT, 1 );
1461 while ( !averaged_pose.residue(nres).is_protein() ) nres--;
1462 if ( !averaged_pose.residue_type(nres).has_variant_type( chemical::UPPER_TERMINUS_VARIANT ) ) {
1463 core::pose::add_variant_type_to_pose_residue( averaged_pose, chemical::UPPER_TERMINUS_VARIANT, nres );
1467 id::AtomID_Mask missing(
false );
1468 core::pose::initialize_atomid_map( missing, averaged_pose );
1469 for (
Size i=1; i<= averaged_pose.total_residue(); ++i ) {
1470 core::conformation::Residue
const & rsd( averaged_pose.residue(i) );
1471 for (
Size j=5; j<= rsd.natoms(); ++j ) {
1472 core::id::AtomID atom_id( j, i );
1473 missing[ atom_id ] =
true;
1476 averaged_pose.conformation().fill_missing_atoms( missing );
1479 core::scoring::ScoreFunctionOP
scorefxn = core::scoring::get_score_function();
1480 TaskFactoryOP
tf(
new TaskFactory() );
1481 tf->push_back(TaskOperationCOP(
new RestrictToRepacking() ));
1482 protocols::simple_moves::PackRotamersMoverOP pack_full_repack(
new protocols::simple_moves::PackRotamersMover( scorefxn ) );
1483 pack_full_repack->task_factory(tf);
1484 pack_full_repack->apply( averaged_pose );
1487 kinematics::MoveMap
mm;
1489 mm.set_chi (
true );
1490 mm.set_jump(
true );
1491 if ( scorefxn->get_weight( core::scoring::cart_bonded ) == 0 ) {
1492 scorefxn->set_weight( core::scoring::cart_bonded, 0.5 );
1494 if ( scorefxn->get_weight( core::scoring::pro_close ) != 0 ) {
1495 scorefxn->set_weight( core::scoring::pro_close, 0.0 );
1497 core::optimization::MinimizerOptions
options(
"lbfgs_armijo_nonmonotone", 0.00001,
true,
false,
false );
1498 core::optimization::CartesianMinimizer minimizer;
1501 averaged_pose.dump_pdb(
"S_0001.pdb" );
1512 NEW_OPT(
mode ,
"What mode to run (place, score, assemble, or consensus)",
"place" );
1516 NEW_OPT( ca_positions,
"CA positions to limit search",
"" );
1517 NEW_OPT( startmodel,
"A starting model for matching",
"" );
1518 NEW_OPT( fragfile,
"Fragfile name",
"" );
1519 NEW_OPT( num_frags,
"Number of fragments to use for each residue position", 25 );
1522 NEW_OPT( min_pack_min,
"Min fragment hits into density?",
true );
1523 NEW_OPT( movestep,
"The grid stepsize for translational search", 2 );
1524 NEW_OPT( ncyc,
"Min cycles", 1 );
1525 NEW_OPT( min_bb,
"Allow backbone minimization?",
false );
1526 NEW_OPT( norm_scores,
"Normalize scores over the map",
false );
1527 NEW_OPT( bw,
"spharm bandwidth", 16 );
1528 NEW_OPT( n_to_search,
"how many translations to search", 4000 );
1529 NEW_OPT( n_filtered,
"how many solutions to take to refinement", 2000 );
1530 NEW_OPT( n_output,
"how many solutions to output", 50 );
1531 NEW_OPT( clust_radius,
"Cluster radius", 3.0 );
1532 NEW_OPT( clust_oversample,
"Cluster oversampling", 2 );
1533 NEW_OPT( frag_dens,
"Radius to use for docking fragments", 0.7 );
1535 NEW_OPT( native_placements ,
"Generate native placements only",
false );
1538 NEW_OPT( scorefile,
"Scorefile name",
"fragscores.sc" );
1539 NEW_OPT( scale_cycles ,
"scale the number of cycles", 1.0 );
1541 NEW_OPT( null_weight ,
"Weight on null fragment", -150 );
1542 NEW_OPT( n_matches ,
"number of fragment matches", 0 );
1543 NEW_OPT( cheat ,
"Cheat in scoring/assembly",
false );
1546 NEW_OPT( delR ,
"del R for rotational search", 2.0 );
1547 NEW_OPT( consensus_frac ,
"Fraction of assigned models needed for consensus", 1.0 );
1548 NEW_OPT( consensus_stdev ,
"Max stdev of CAs for consensus", 2.5 );
1549 NEW_OPT( energy_cut ,
"Energy cut before consensus assembly", 0.05 );
1554 option[ in::missing_density_to_jump ].value(
true);
1555 option[ out::nooutput ].value(
true);
1565 }
else if (
option[
mode]() ==
"consensus" ) {
1573 std::cout <<
"caught exception " << e.
msg() << std::endl;
static basic::Tracer TR("denovo_density")
virtual std::string get_name() const
virtual std::string const msg() const
virtual std::string get_name() const
core::Real overlap_width_
utility::vector1< FragID > allfrags
std::istream & getline(std::istream &stream, Fstring &s)
Get Line from Stream.
utility::vector1< utility::vector1< float > > scores_2b
utility::vector1< core::Real > rmses
std::map< FragID, int > frag2idx
utility::vector1< utility::vector1< float > > clash2b
void init(int argc, char *argv[])
Command line init() version.
BooleanOptionKey const user("options:user")
utility::keys::lookup::end< KeyType > const end
CAtrace(core::pose::Pose pose, std::string tag, core::Real score, core::Real rms)
Platform independent operations on files (except I/O)
#define runtime_assert(_Expression)
Assert that the condition holds. Evaluated for both debug and release builds.
core::Real clash_score(CAtrace &pose1, CAtrace &pose2, core::Size offset)
xyzVector input/output functions
void cut_from_map(core::pose::Pose const &pose)
Random number generator system.
utility::vector1< std::string > string_split(std::string const &in, char splitchar)
std::map< core::Size, core::fragment::Frame > libsmall_
int random_range(int low, int high)
Return a number uniformly drawn from the inclusive range between low and high. Threadsafe since each ...
Fstring::size_type index(Fstring const &s, Fstring const &ss)
First Index Position of a Substring in an Fstring.
std::string right_string_of(T const &t, int const w, char const f= ' ')
Right-Justified string of a Template Argument Type Supporting Stream Output.
FragID(int pos, std::string tag)
utility::vector1< utility::vector1< float > > close2b
utility::vector1< utility::vector1< int > > pos2frags
basic::options::OptionKeys collection
std::map< core::Size, core::fragment::Frame > library_
bool operator<(const FragID &x, const FragID &y)
Input file stream wrapper for uncompressed and compressed files.
T abs(T const &x)
std::abs( x ) == | x |
std::vector with 1-based indexing
File name class supporting Windows and UN*X/Linux format names.
int u3() const
Upper Index of Dimension 3.
virtual std::string get_name() const
basic::options::IntegerOptionKey const nstruct("nstruct")
virtual std::string get_name() const
rule< Scanner, options_closure::context_t > options
T distance(MathVector< T > const &VECTOR_A, MathVector< T > const &VECTOR_B)
utility::vector1< core::Real > scores_1b
#define OPT_KEY(type, key)
utility::options::OptionCollection option
OptionCollection global.
Output file stream wrapper for uncompressed and compressed files.
int u2() const
Upper Index of Dimension 2.
utility::vector1< core::Real > gap_weights_
DimensionExpressionPow pow(Dimension const &dim1, Dimension const &dim2)
pow( Dimension, Dimension )
#define NEW_OPT(akey, help, adef)
core::Real unclosable_penalty_
virtual std::string get_name() const
ocstream cout(std::cout)
Wrapper around std::cout.
void ReadCAsFromPDB(std::string pdbfile, utility::vector1< numeric::xyzVector< core::Real > > &cas)
utility::vector1< core::Real > gap_lengths_
utility::vector1< utility::vector1< float > > overlap2b
int u1() const
Upper Index of Dimension 1.
utility::vector1< int > assigned_frags
int main(int argc, char *argv[])
core::fragment::FragSetOP cluster_frags(core::fragment::FragSetOP fragments)
rule< Scanner, string_closure::context_t > name
double uniform()
Generate a random number between 0 and 1. Threadsafe since each thread uses its own random generator...
std::string to_string(const T &t)
Some std::string helper functions.
Program options global and initialization function.
rule< Scanner, tag_closure::context_t > tag
core::Real closability_score(CAtrace &pose1, CAtrace &pose2, core::Size offset)
Fast (x,y,z)-coordinate numeric vector.
void frame(const utility::vector1< utility::vector1< Real > > &R, utility::vector1< utility::vector1< Real > > &U)
core::Real overlap_score(CAtrace &pose1, CAtrace &pose2, core::Size offset)
int const silent
Named verbosity levels.
utility::vector1< numeric::xyzVector< core::Real > > cas_
rule< Scanner, option_closure::context_t > option
FArray3D: Fortran-Compatible 3D Array.