37 #include <basic/Tracer.hh>
40 #include <ObjexxFCL/FArray1D.hh>
41 #include <ObjexxFCL/FArray1A.hh>
42 #include <ObjexxFCL/FArray2A.hh>
43 #include <ObjexxFCL/FArray3D.hh>
44 #include <ObjexxFCL/StaticIndexRange.hh>
45 #include <ObjexxFCL/format.hh>
48 #include <numeric/random/random.hh>
49 #include <numeric/numeric.functions.hh>
54 #include <utility/vector1.hh>
57 static basic::Tracer
tr(
"protocols.jumping");
58 static numeric::random::RandomGenerator
RG(14934);
63 using namespace ObjexxFCL;
64 using namespace ObjexxFCL::fmt;
131 total_residue_( ss->total_residue() ),
132 pairings_( pairings ),
134 secondary_structure_( ss ),
135 sheet_sizes_( sheet_topol ),
136 bForceSingleSheet_( true )
142 total_residue_( other.total_residue_ ),
143 pairings_( other.pairings_ ),
144 same_strand_( other.same_strand_ ),
145 secondary_structure_( other.secondary_structure_ ),
146 sheet_sizes_( other.sheet_sizes_ ),
147 bForceSingleSheet_( other.bForceSingleSheet_ )
156 int const p =
static_cast< int >(
RG.uniform() *
pairings_.size() ) + 1;
158 runtime_assert( p>=1 && p<= (
int)
pairings_.size() );
161 sheet_pairing( 1, pairing, sheet ) =
pairings_[ p ].Pos1();
162 sheet_pairing( 2, pairing, sheet ) =
pairings_[ p ].Pos2();
163 sheet_pairing( 3, pairing, sheet ) =
pairings_[ p ].Orientation();
164 sheet_pairing( 4, pairing, sheet ) =
pairings_[ p ].Pleating();
175 for (
int i = 1; i <= 2; ++i ) {
176 for (
int j = 1; j <= 2; ++j ) {
187 FArray2A_int pairing_list,
188 const int last_pairing,
189 const bool force_single_sheet
192 if ( last_pairing < 2 )
return true;
194 const int max_sheet_size( 40 );
195 pairing_list.dimension( 4, max_sheet_size );
197 int total_common_strands( 0 );
198 for (
int i = 1; i <= last_pairing-1; ++i ) {
199 int common_strands(0);
203 pairing_list(1,i), common_strands ) );
207 if ( !ok || common_strands > 1 )
return false;
210 total_common_strands += common_strands;
213 return ( ( total_common_strands >= 1 || !force_single_sheet ) &&
214 ( total_common_strands < 2 ) );
222 FArray1A_int pairing1,
223 FArray1A_int pairing2,
227 pairing1.dimension(4);
228 pairing2.dimension(4);
261 const int seqsep_mod2( numeric::mod( std::abs( (
int) p1.
Pos1() - (
int) p2.
Pos1() ), 2) );
263 return ( ( common_strands == 0 ) ||
264 ( common_strands == 1 && seqsep_mod2 == 0 && p1.
Pleating() != p2.
Pleating() ) ||
265 ( common_strands == 1 && seqsep_mod2 == 1 && p1.
Pleating() == p2.
Pleating() ) ||
266 ( common_strands == 2 && seqsep_mod2 == 0 && p1.
Pleating() == p2.
Pleating() ) ||
267 ( common_strands == 2 && seqsep_mod2 == 1 && p1.
Pleating() != p2.
Pleating() ) );
272 for (
Size ii = 1; ii<=2; ii++ ) {
273 Size pos = sheet_pairings( ii, pairing, sheet );
279 for (
int prev_sheet = 1; prev_sheet <= (
int) sheet - 1; ++prev_sheet ) {
281 for (
int prev_pairing = 1; prev_pairing <= num_pairings; ++prev_pairing ) {
283 sheet_pairings( 1, pairing, sheet ) ) ) {
291 sheet_pairings( 1, 1, sheet ),
298 for (
int trial = 1; trial < 30; trial ++ ) {
302 tr.Warning <<
"redo builder_loop failed, will try " << 10-trial <<
" more times" << std::endl;
327 if ( jumps.
is_valid() )
return jumps;
336 Size const max_sheet_size( 40 );
337 Size const max_sheets( 40 );
340 FArray3D_int sheet_pairing( 4, max_sheet_size, max_sheets );
341 tr.Info <<
"Start Sheet Building for " << num_sheets <<
" sheets of size ";
342 for (
int ii = 1; ii <= num_sheets; ii++ )
tr.Info <<
sheet_sizes_[ ii ] <<
" ";
343 tr.Info << std::endl;
344 bool success =
false;
346 for (
int tries1 = 0; tries1 < 30 && !success; ++tries1 ) {
348 for (
int tries2 = 0; tries2 < 30 && !success; ++tries2 ) {
349 tr.Debug <<
"SheetBuilder-loop round: " << tries1 <<
"/" << tries2 << std::endl;
354 int const max_tries3 ( 1000 );
361 for (
int s = 1; s<=
sheet; s++ ) {
362 for (
int p =1; p<=pairing; p ++ ) {
370 for (
int s = 1; s<=
sheet; s++ ) {
371 for (
int p =1; p<=pairing; p ++ ) {
385 tr.Info <<
"redo same_strand: too many tries with this one!" <<
386 fmt::SS( tries1 ) << std::endl;
397 if ( failed_once )
tr.Warning <<
"figured out a valid strand after " << failed_once <<
" outer loop iterations " << std::endl;
399 jump_pairings.clear();
404 jump_pairings.push_back( p );