Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SameSequenceGrouper.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 // :noTabs=false:tabSize=4:indentSize=4:
4 //
5 // (c) Copyright Rosetta Commons Member Institutions.
6 // (c) This file is part of the Rosetta software suite and is made available under license.
7 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
8 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
9 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
10 
11 /// @file protocols/match/output/SameSequenceGrouper.cc
12 /// @brief
13 /// @author Alex Zanghellini (zanghell@u.washington.edu)
14 /// @author Andrew Leaver-Fay (aleaverfay@gmail.com), porting to mini
15 
16 // Unit headers
18 
19 // Package headers
20 #include <protocols/match/Hit.hh>
23 
24 // Project headers
26 #include <core/id/AtomID.hh>
27 
28 // Utility headers
29 #include <utility/exit.hh>
30 
31 #include <utility/OrderedTuple.hh>
32 #include <utility/vector1.hh>
33 
34 
35 namespace protocols {
36 namespace match {
37 namespace output {
38 
39 SameSequenceGrouper::SameSequenceGrouper() : n_geometric_constraints_( 0 ) {}
40 SameSequenceGrouper::SameSequenceGrouper( Size ncst ) : n_geometric_constraints_( ncst ) {}
41 
43 
46  match const & m
47 )
48 {
49  return assign_group_for_match( match_dspos1( m, 1 ) );
50 }
51 
54  match_dspos1 const & m
55 )
56 {
57  runtime_assert( m.upstream_hits.size() == n_geometric_constraints_ );
58 
60  for ( Size ii = 1; ii <= n_geometric_constraints_; ++ii ) {
61  seq_vector[ ii ] = m.upstream_hits[ ii ].scaffold_build_id();
62  seq_vector[ n_geometric_constraints_ + ii ] =
63  hit_cacher_->upstream_conformation_for_hit( ii, fake_hit( m.upstream_hits[ ii ] ) )->aa();
64  }
65 
66  SequenceMap::const_iterator iter = sequence_indexer_.find( seq_vector );
67  if ( iter == sequence_indexer_.end() ) {
68  Size next_index = sequence_indexer_.size() + 1;
69  sequence_indexer_[ seq_vector ] = next_index;
70  return next_index;
71  } else {
72  return iter->second;
73  }
74 }
75 
76 void
78 {
79  sequence_indexer_.clear();
80 }
81 
82 void
84 {
85  n_geometric_constraints_ = n_csts;
86 }
87 
88 void
90 {
91  hit_cacher_ = cacher;
92 }
93 
94 
96  SameSequenceGrouper(), rms_group_cutoff_(1.0) {}
98  SameSequenceGrouper( ncst ), rms_group_cutoff_(1.0)
99 {
100  dsbuilders_.resize( ncst, NULL );
101 }
102 
104 
105 void
107 {
109  dsbuilders_.resize( n_csts );
110 }
111 
112 void
114 {
115  rms_group_cutoff_ = cutoff;
116 }
117 
118 
121  match_dspos1 const & m
122 ){
123  //std::cout << "seq ds assigning group for match " << std::endl;
124  Size sequence_group( parent::assign_group_for_match( m ) );
126  std::pair< Size, Size > seq_dspos_pair( sequence_group, ds_group );
127 
128  std::map< std::pair< Size, Size >, Size >::iterator seqpos_it = sequence_pos_map_.find( seq_dspos_pair );
129  if( seqpos_it == sequence_pos_map_.end() ){
130  Size newgroup( sequence_pos_map_.size() + 1 );
131  sequence_pos_map_.insert( std::make_pair( seq_dspos_pair, newgroup ) );
132  return newgroup;
133  }
134  return seqpos_it->second;
135 }
136 
137 
138 void
140 {
141  parent::reset();
142  sequence_pos_map_.clear();
143  representative_dspos_.clear();
144 }
145 
146 void
148  utility::vector1< core::id::AtomID > const & relevant_atom_ids
149 )
150 {
151  relevant_atom_ids_ = relevant_atom_ids;
152 }
153 
154 void
156  Size geomcst_id,
158 )
159 {
160  runtime_assert( dsbuilders_.size() >= geomcst_id );
161  dsbuilders_[geomcst_id] = dsbuilder;
162 }
163 
164 
167  match_dspos1 const & m
168 ){
169  utility::vector1< Vector > dspos_coords( relevant_atom_ids_.size() );
170  Hit fullhit = full_hit( m );
171  dsbuilders_[ m.originating_geom_cst_for_dspos ]->coordinates_from_hit( fullhit, relevant_atom_ids_, dspos_coords );
172  runtime_assert( dspos_coords.size() == relevant_atom_ids_.size() );
173  Real lowest_rms( 1000000.0 );
174 
175  for( core::Size ii = 1; ii <= representative_dspos_.size(); ++ii ){
176  //calculate rms without superposition
177  Real cur_rms(0.0);
178  for( core::Size jj = 1; jj <= relevant_atom_ids_.size(); ++jj ){
179  Vector diff = dspos_coords[jj] - representative_dspos_[ii][jj];
180  cur_rms += diff.length_squared();
181  }
182  Real rms = std::sqrt(cur_rms / relevant_atom_ids_.size() );
183  if( rms < lowest_rms ) lowest_rms = rms;
184  if( rms <= rms_group_cutoff_ ) return ii;
185  }
186  //if we've made it till here, that means this ds position is new
187  //std::cout << "found new group with lowest rms of " << lowest_rms << " to previous one." << std::endl;
188  representative_dspos_.push_back( dspos_coords );
189  return representative_dspos_.size();
190 }
191 
192 } //namespace output
193 } //namespace match
194 } //namespace protocols