38 #include <basic/Tracer.hh>
41 #include <utility/pointer/ReferenceCount.hh>
48 #include <boost/unordered_map.hpp>
50 #include <utility/OrderedTuple.hh>
51 #include <utility/vector1.hh>
56 namespace downstream {
58 static basic::Tracer
TR(
"protocols.match.downstream.SecondaryMatcherToUpstreamResidue" );
63 return ( 271 * uphit.data()[ 1 ] + uphit.data()[ 2 ] ) % 1699;
72 target_geomcst_id_( 0 ),
73 count_rotamers_per_target_restype_( false ),
74 last_seen_restype_index_( 0 ),
75 count_rotamer_for_lastseen_restype_( 0 ),
76 n_viable_target_hits_since_last_pruning_( 0 )
130 for (
Size ii = 1; ii <= target_build_points.size(); ++ii ) {
138 Size ii_total_found_matches( 0 );
139 #pragma omp parallel for reduction( + : ii_total_found_matches )
140 for (
Size jj = 1; jj <= my_build_points.size(); ++jj ) {
146 ii_total_found_matches += jj_hits.size();
147 hits[ jj ].splice( hits[ jj ].
end(), jj_hits );
150 TR <<
"Secondary matching against geomcst " <<
target_geomcst_id_ <<
" hits from protein build point " << target_build_points[ ii ]->original_insertion_point() <<
" produced " << ii_total_found_matches <<
" hits " << std::endl;
153 std::list< Hit > all_hits;
155 for (
Size ii = 1; ii <= my_build_points.size(); ++ii ) {
156 hits[ ii ].sort( compare );
157 all_hits.splice( all_hits.end(), hits[ ii ] );
175 boost::unordered_map< Size2Tuple, bool, hash_upstream_hit > targets_hits_matched;
178 iter != iter_end; ++iter ) {
180 target_hit[ 1 ] =
static_cast< Size > ( iter->second()[ 1 ] );
181 target_hit[ 2 ] =
static_cast< Size > ( iter->second()[ 2 ] );
182 boost::unordered_map< Size2Tuple, bool, hash_upstream_hit >::const_iterator
183 hash_iter = targets_hits_matched.find( target_hit );
184 if ( hash_iter == targets_hits_matched.end() ) {
185 targets_hits_matched[ target_hit ] =
true;
192 Size drop_count( 0 );
193 while ( target_hit_iter != target_hit_iter_end ) {
195 ++target_hit_iter_next;
198 target_hit[ 1 ] =
static_cast< Size > ( target_hit_iter->first()[ 1 ] );
199 target_hit[ 2 ] =
static_cast< Size > ( target_hit_iter->first()[ 2 ] );
200 boost::unordered_map< Size2Tuple, bool, hash_upstream_hit >::const_iterator
201 hash_iter = targets_hits_matched.find( target_hit );
202 if ( hash_iter == targets_hits_matched.end() ) {
207 target_hit_iter = target_hit_iter_next;
230 boost::unordered_map< Size2Tuple, bool, hash_upstream_hit > target_hit_hash;
233 iter != iter_end; ++iter ) {
235 target_hit[ 1 ] = iter->first()[ 1 ];
236 target_hit[ 2 ] = iter->first()[ 2 ];
237 boost::unordered_map< Size2Tuple, bool, hash_upstream_hit >::const_iterator
238 hash_iter = target_hit_hash.find( target_hit );
239 if ( hash_iter == target_hit_hash.end() ) {
240 target_hit_hash[ target_hit ] =
true;
247 Size drop_count( 0 );
248 while ( hit_iter != hit_iter_end ) {
253 target_hit[ 1 ] =
static_cast< Size > ( hit_iter->second()[ 1 ] );
254 target_hit[ 2 ] =
static_cast< Size > ( hit_iter->second()[ 2 ] );
255 boost::unordered_map< Size2Tuple, bool, hash_upstream_hit >::const_iterator
256 hash_iter = target_hit_hash.find( target_hit );
257 if ( hash_iter == target_hit_hash.end() ) {
262 hit_iter = hit_iter_next;
282 Size const scaffold_build_point_id,
283 Size const upstream_conf_id,
287 std::list< Hit > hits;
300 for (
Size kk = 1; kk <= ii_natoms; ++kk ) {
301 target_residue.set_xyz(
308 eval_iter != eval_iter_end; ++eval_iter ) {
310 if ( eval_iter->first->evaluate_residues( upstream_residue, target_residue ) ) {
316 hit.
first()[ 1 ] = scaffold_build_point_id;
317 hit.
first()[ 2 ] = upstream_conf_id;
318 hit.
first()[ 3 ] = eval_iter->second;
319 hit.
first()[ 4 ] = 1;
326 hits.push_back( hit );
358 iter != iter_end; ++iter ) {
360 target_hit[ 1 ] =
static_cast< Size > ( iter->second()[ 1 ] );
361 target_hit[ 2 ] =
static_cast< Size > ( iter->second()[ 2 ] );
362 std::map< Size2Tuple, HitPtrListOP >::const_iterator list_iter =
369 list_iter->second->val().push_back( & (*iter ) );
383 std::map< Size2Tuple, HitPtrListOP >::const_iterator list_iter =
386 hitptrlist = list_iter->second;
388 std::cerr <<
"fetch failed! " << target_hit[ 1 ] <<
" " << target_hit[ 2 ] << std::endl;
389 std::cerr <<
"something weird happened!" << std::endl;
425 Size mcfi_id_for_evaluator
433 std::make_pair( evaluator, mcfi_id_for_evaluator ));
454 TR <<
"Preparing for hit generation" << std::endl;
463 Size n_target_restypes = usbuilder->n_restypes_to_build();
468 std::list< SecondaryMatcherToUpstreamResidueOP > secmatch_algs;
469 for ( std::list< DownstreamAlgorithmOP >::const_iterator iter = dsalgs.begin(),
470 iter_end = dsalgs.end(); iter != iter_end; ++iter ) {
473 runtime_assert( secmatcher );
475 secmatch_algs.push_back( secmatcher );
476 secmatcher->reorder_restypes( *usbuilder );
479 for (
Size ii = 1; ii <= n_target_restypes; ++ii ) {
484 bool any_evaluator_requires_all_atoms(
false );
485 for ( std::list< SecondaryMatcherToUpstreamResidueOP >::const_iterator iter = secmatch_algs.begin(),
486 iter_end = secmatch_algs.end(); iter != iter_end; ++iter ) {
488 for ( EvaluatorSet::const_iterator eval_iter = (*iter)->respair_evaluators_[ ii ].begin(),
489 eval_iter_end = (*iter)->respair_evaluators_[ ii ].end();
490 eval_iter != eval_iter_end; ++eval_iter ) {
491 if ( eval_iter->first->require_all_target_residue_atom_coordinates() ) {
492 any_evaluator_requires_all_atoms =
true;
496 if ( any_evaluator_requires_all_atoms )
break;
498 if ( any_evaluator_requires_all_atoms ) {
499 std::fill( atom_required.begin(), atom_required.end(), true );
501 for (
Size jj = 1; jj <= iirestype->natoms(); ++jj ) {
502 for ( std::list< SecondaryMatcherToUpstreamResidueOP >::const_iterator iter = secmatch_algs.begin(),
503 iter_end = secmatch_algs.end(); iter != iter_end; ++iter ) {
505 for ( EvaluatorSet::const_iterator eval_iter = (*iter)->respair_evaluators_[ ii ].begin(),
506 eval_iter_end = (*iter)->respair_evaluators_[ ii ].end();
507 eval_iter != eval_iter_end; ++eval_iter ) {
509 if ( eval_iter->first->require_target_atom_coordinate( jj ) ) {
510 atom_required[ jj ] =
true;
514 if ( atom_required[ jj ] )
break;
530 Size target_build_id = target_build_point.
index();
542 Size count_target_hits( 0 );
556 std::list< Hit > unique_upstream_hits;
557 Size last_conf_id( 0 );
561 if ( last_conf_id != iter->upstream_conf_id() ) {
562 unique_upstream_hits.push_back( *iter );
563 last_conf_id = iter->upstream_conf_id();
574 unique_upstream_hits.begin(), unique_upstream_hits.end(),
575 target_build_point, proc );
585 unique_upstream_hits.begin(), unique_upstream_hits.end(),
586 target_build_point, proc );
592 for ( std::list< DownstreamAlgorithmOP >::const_iterator
593 iter = dsalgs.begin(), iter_end = dsalgs.end();
594 iter != iter_end; ++iter ) {
595 if ( iter->get() != this ) {
598 runtime_assert( other );
606 TR <<
"Examining " << count_target_hits <<
" hits built from scaffold build point "
608 <<
" unique upstream rotamers" << std::endl;
663 hit, upstream_conformation );
674 std::map< core::chemical::ResidueTypeCOP, Size >::const_iterator
678 old_2_new[ olditer->second ] = ii;
681 runtime_assert( old_2_new[ ii ] != 0 );
723 Size count_required( 0 );
724 runtime_assert( atom_required.size() ==
target_restypes_[ restype_index ]->natoms() );
726 for (
Size ii = 1; ii <= atom_required.size(); ++ii )
if ( atom_required[ ii ] ) ++count_required;
729 for (
Size ii = 1; ii <= atom_required.size(); ++ii ) {
730 if ( atom_required[ ii ] ) {
742 runtime_assert( n_rotamers_per_target_restype.size() ==
target_restypes_.size() );
744 for (
Size ii = 1; ii <= n_rotamers_per_target_restype.size(); ++ii ) {
745 n_rots_total_ += n_rotamers_per_target_restype[ ii ];
746 if ( n_rotamers_per_target_restype[ ii ] != 0 ) {
749 hit_data_[ ii ].resize( n_rotamers_per_target_restype[ ii ] );
759 Size target_restype_id,
764 if (
coords_.size() == 1 && target_restype_id == 1 ) {
767 if ( n_rotamers != 0 ) {
770 hit_data_[ target_restype_id ].resize( n_rotamers );
772 coords_[ target_restype_id ].clear();
799 sec_matcher_( sec_matcher )