33 #include <basic/Tracer.hh>
40 #include <utility/string_util.hh>
41 #include <utility/pointer/ReferenceCount.hh>
44 #include <numeric/random/random.hh>
49 #include <utility/vector1.hh>
56 static basic::Tracer
TR(
"protocols.match.output.PDBWriter" );
59 coordinate_cacher_(NULL),
60 write_matchres_only_(false),
94 std::map< core::Size, core::Size > redundant_upstream_res;
97 for (
Size ii = 1; ii <= m.size(); ++ii ) {
100 upstream_matchres.push_back( conf );
101 ex_geom_ids_for_upstream_res.push_back( m[ ii ].external_geom_id() );
104 downstream_poses.push_back(
dsbuilders_[ ii ]->downstream_pose_from_hit( m[ii] ) );
106 utility_exit_with_message(
"Cannot output downstream pose for geomcst id " +
107 utility::to_string( ii ) +
" which does not have a downstream builder!" );
113 upstream_matchres, redundant_upstream_res, ex_geom_ids_for_upstream_res );
117 for (
Size ii = 1; ii <= m.size(); ++ii ) {
119 std::string this_tag = outtag +
"_" + utility::to_string( ii ) +
".pdb";
122 std::ofstream file_out( this_tag.c_str() );
125 up_outpose->dump_pdb( file_out );
127 downstream_poses[ outcounter ]->dump_pdb( file_out );
150 utility_exit_with_message(
"Cannot output downstream pose for geomcst id " +
152 " which does not have a downstream builder!" );
161 downstream_pose_from_hit( fullhit );
166 std::map< core::Size, core::Size > redundant_upstream_res;
172 upstream_matchres.push_back( conf );
179 upstream_matchres, redundant_upstream_res, ex_geom_ids_for_upstream_res );
184 std::ofstream file_out( this_tag.c_str() );
185 up_outpose->dump_pdb( file_out );
186 downstream_pose->dump_pdb( file_out );
223 for (
core::Size i = 1; i <= mtask->geom_csts_downstream_output().size(); ++i ) {
228 cstfile_name_ = (utility::string_split( cst_path[ cst_path.size() ] ,
'.' ) )[1];
245 std::map< core::Size, core::Size >
const & redundant_upstream_res,
250 using namespace core::io::pdb;
256 for (
core::Size i = 1; i <= upstream_matchres.size(); ++i ) {
260 std::string upname3( upstream_matchres[ i ]->name3() );
261 std::map< core::Size, core::Size >::const_iterator red_it = redundant_upstream_res.find( i );
262 if( red_it != redundant_upstream_res.end() ){
263 upname3 = upstream_matchres[ red_it->second ]->name3();
272 targ_resname = upstream_matchres[ upstream_only_it->second ]->name3();
273 targ_chain = utility::to_string(
orig_upstream_pose_->pdb_info()->chain( upstream_matchres[ upstream_only_it->second ]->seqpos() ) );
274 targ_seqpos =
orig_upstream_pose_->pdb_info()->number( upstream_matchres[ upstream_only_it->second ]->seqpos() );
277 targ_chain, targ_resname, targ_seqpos, upres_chain, upname3,
orig_upstream_pose_->pdb_info()->number( upstream_matchres[ i ]->seqpos() ), i , ex_geom_ids_for_upstream_res[ i ] );
278 rems.push_back( ri );
282 outpose.
pdb_info()->remarks( rems );
290 std::map< core::Size, core::Size >
const & redundant_upstream_res,
294 runtime_assert( ex_geom_ids_for_upstream_res.size() == upstream_matchres.size() );
303 outpose->pdb_info( pdbinf );
308 for (
core::Size i = 1; i <= upstream_matchres.size(); ++i ) {
309 if( redundant_upstream_res.find( i ) != redundant_upstream_res.end() )
continue;
313 outpose->append_residue_by_jump( *(upstream_matchres[i]), 1 );
315 outpose->append_residue_by_bond( *(upstream_matchres[i]) );
317 outpose->pdb_info()->chain( i,
orig_upstream_pose_->pdb_info()->chain( upstream_matchres[i]->seqpos() ) );
318 outpose->pdb_info()->number( i,
orig_upstream_pose_->pdb_info()->number( upstream_matchres[i]->seqpos() ) );
320 outpose->replace_residue( upstream_matchres[i]->seqpos(), *(upstream_matchres[i]),
false );
325 assemble_remark_lines( *outpose, upstream_matchres, redundant_upstream_res, ex_geom_ids_for_upstream_res );
328 outpose->pdb_info()->obsolete(
false );
339 for (
core::Size i =1; i <= upstream_matchres.size(); ++i ){
340 signature = signature + upstream_matchres[i]->name1() +
341 utility::to_string(
orig_upstream_pose_->pdb_info()->number( upstream_matchres[i]->seqpos() ) );
396 std::map< std::string, SizePair >::iterator map_it =
signature_map_.find( signature );
402 map_it->second.second++;
405 std::string unique_string( utility::to_string( map_it->second.first ) +
"_" +
406 signature +
"_" + utility::to_string( map_it->second.second ) );
436 TR <<
"CloudPDBWriter beginning to output matches for " <<
match_groups_ushits_.size() <<
" match groups." << std::endl;
437 core::Size total_ushit_count(0), total_dshit_count(0);
444 TR <<
"A total of " << total_ushit_count <<
" upstream hits and " << total_dshit_count <<
" downstream hits were recorded." << std::endl;
467 for (
Size ii = 1; ii <= m.size(); ++ii ) {
469 upstream_matchres.push_back( conf );
504 utility_exit_with_message(
"not implemented yet");
513 TR <<
"beginning writing cloud for group " << ii << std::endl;
520 std::map< core::Size, core::Size > redundant_upstream_res;
531 upstream_matchres.push_back( conf );
532 ex_geom_ids_for_upstream_res.push_back( rep_match.
upstream_hits[jj].external_geom_id() );
534 if( redundant_upstream_res.find( jj ) != redundant_upstream_res.end() ){
539 upstream_matchres, redundant_upstream_res, ex_geom_ids_for_upstream_res );
543 if( !file_out.is_open() ) utility_exit_with_message(
"Could not open file with name " +
unique_match_names_[ii] +
"_1.pdb for outputting matches.");
545 file_out <<
"MODEL 1\n";
546 up_outpose->dump_pdb( file_out );
547 downstream_pose->dump_pdb( file_out );
548 file_out <<
"ENDMDL \n";
551 core::Size allmodelcount(0), num_files_this_group(1), modelcount(2), atomcounter(0);
552 bool all_hitset_iterators_at_end(
false );
554 while( ! all_hitset_iterators_at_end ){
555 all_hitset_iterators_at_end =
true;
556 bool modeltag_written(
false );
560 all_hitset_iterators_at_end =
false;
562 if( !modeltag_written ){
563 file_out <<
"MODEL "+utility::to_string( modelcount++ )+
"\n";
564 modeltag_written =
true;
575 all_hitset_iterators_at_end =
false;
576 if( !modeltag_written ){
577 file_out <<
"MODEL "+utility::to_string( modelcount++ )+
"\n";
578 modeltag_written =
true;
585 if( modeltag_written ) file_out <<
"ENDMDL \n";
590 if( modelcount == 101 && (! all_hitset_iterators_at_end ) ){
593 allmodelcount += (modelcount - 2);
595 num_files_this_group++;
596 file_out.open( (
unique_match_names_[ii] +
"_"+utility::to_string( num_files_this_group ) +
".pdb").c_str() );
597 file_out <<
"MODEL 1\n";
598 up_outpose->dump_pdb( file_out );
599 downstream_pose->dump_pdb( file_out );
600 file_out <<
"ENDMDL \n";
604 allmodelcount += modelcount;
605 TR <<
"A total of " << allmodelcount - 1 <<
" models were written for " <<
" match group " << ii <<
" in " << num_files_this_group <<
" files." << std::endl;
669 runtime_assert( us_hitset_ref.size() == ds_hitset_ref.size() );
670 for(
core::Size ii = 1; ii <= us_hitset_ref.size(); ++ii ){
699 std::map< core::Size, core::Size > redundant_upstream_res;
711 upstream_matchres.push_back( conf );
712 ex_geom_ids_for_upstream_res.push_back(
full_hit( rep_match).external_geom_id() );
713 if( redundant_upstream_res.find( jj ) == redundant_upstream_res.end() ){
719 assemble_remark_lines( pose, upstream_matchres, redundant_upstream_res, ex_geom_ids_for_upstream_res );
724 if( downstream_pose->total_residue() == 1 ){
733 for( std::set< downstream_hit >::const_iterator ds_hits_it(
match_groups_dshits()[match_group][i].begin()), ds_hits_end(
match_groups_dshits()[match_group][i].
end() ); ds_hits_it != ds_hits_end; ++ds_hits_it){
734 additional_lig_confs.push_back( &(
dsbuilders()[i]->downstream_pose_from_hit(
fake_hit(*(ds_hits_it)) )->residue(1) ) );
735 if( additional_lig_confs.size() > 99 )
break;
737 if( additional_lig_confs.size() > 99 )
break;
739 if( additional_lig_confs.size() > 1 ){
743 else utility_exit_with_message(
"PoseMatchOutputWriter not set up to put a downstream pose containing more than one ligand into the upstream pose");
752 if( num_match_groups > 1 ){
753 core::Size mgroup( numeric::random::random_range( 1, num_match_groups ) );
754 TR <<
"WARNING: Matcher produced " << num_match_groups <<
" unique match groups, randomly picked " << mgroup <<
" to be inserted into the pose." << std::endl;
759 TR <<
"Apparently no matches were found, so it's impossible to insert a match into the pose." << std::endl;