48 #include <basic/basic.hh>
49 #include <basic/Tracer.hh>
57 #include <ObjexxFCL/string.functions.hh>
60 #include <numeric/random/random.hh>
63 #include <ObjexxFCL/format.hh>
66 #include <utility/vector1.hh>
74 using namespace ObjexxFCL;
76 static numeric::random::RandomGenerator
RG(76223);
77 static basic::Tracer
TR(
"protocols.idealize" );
85 Real & avg_bb_angle_dev,
86 Real & max_bb_angle_dev,
87 Real & avg_chi_angle_dev,
88 Real & max_chi_angle_dev
90 using basic::subtract_degree_angles;
92 avg_bb_angle_dev = 0.0;
93 max_bb_angle_dev = 0.0;
95 avg_chi_angle_dev = 0.0;
96 max_chi_angle_dev = 0.0;
98 Size nchi_dihedrals(0), nbb_dihedrals(0);
101 if ( ! use_pos[ pos ] )
continue;
106 if ( !rsd1.is_polymer() )
continue;
108 Size const nbb ( rsd1.n_mainchain_atoms() );
109 Size const nchi( rsd1.nchi() );
110 runtime_assert( rsd2.is_polymer() && rsd2.nchi() == nchi && rsd2.n_mainchain_atoms() == nbb );
113 for (
Size i=1; i<= nbb; ++i ) {
114 if ( ( i == 1 && rsd1.is_lower_terminus() ) ||
115 ( i >= nbb-1 && rsd1.is_upper_terminus() ) ) {
118 Real const dev( std::abs( subtract_degree_angles( rsd1.mainchain_torsion( i ), rsd2.mainchain_torsion(i) ) ) );
121 avg_bb_angle_dev += dev;
123 max_bb_angle_dev = std::max( max_bb_angle_dev, dev );
126 for (
Size i=1; i<= nchi; ++i ) {
127 Real const dev( std::abs( subtract_degree_angles( rsd1.chi( i ), rsd2.chi( i ) ) ) );
128 avg_chi_angle_dev += dev;
130 max_chi_angle_dev = std::max( max_chi_angle_dev, dev );
134 avg_bb_angle_dev /= nbb_dihedrals;
135 avg_chi_angle_dev /= nchi_dihedrals;
146 bool const chainbreaks
148 using namespace optimization;
149 using namespace optimization::symmetry;
151 using namespace ObjexxFCL::fmt;
154 Size const window_width( 3 );
164 Real const chain_break_cutoff = { 4.0 };
167 bool new_cutpoint =
false;
170 for (
Size i = 1; i < nres; ++i ) {
171 if ( f.is_cutpoint(i) )
continue;
172 bool chain_break =
false;
174 if ( pdbinfo->number(i)+1 != pdbinfo->number(j) ) {
175 TR.Info <<
"non-sequential at res nums " << i <<
'-' << j << std::endl;
176 TR.Info <<
"non-sequential pdb res nums " << pdbinfo->number(i) << pdbinfo->chain(i) <<
177 '-' << pdbinfo->number(j) << pdbinfo->chain(j) << std::endl;
184 if (dist_squared > chain_break_cutoff) {
185 TR.Info <<
"chain break at res nums: " << i <<
'-' << j <<
' ' << std::sqrt(dist_squared) << std::endl;
186 TR.Info <<
"chain break pdb res nums: " << pdbinfo->number(i) << pdbinfo->chain(i) <<
187 '-' << pdbinfo->number(j) << pdbinfo->chain(j) << std::endl;
189 }
else if ( dist_squared < 0.1 ) {
190 TR.Info <<
"zero length bond at res nums: " << i <<
'-' << j << std::endl;
191 TR.Info <<
"zero length bond pdb res nums: " << pdbinfo->number(i) << pdbinfo->chain(i) <<
192 '-' << pdbinfo->number(j) << pdbinfo->chain(j) << std::endl;
199 f.new_jump( i, j, i );
203 TR.Info <<
"added cutpoint at: " << i << std::endl;
212 MinimizerOptions options(
"dfpmin", 0.001,
true ,
false );
216 bool const lastjumpmin (
221 TR.Info <<
"lastjumpmin: " << lastjumpmin << std::endl;
227 TR.Info <<
"setting up symmetric idealize " << std::endl;
229 dynamic_cast<core::conformation::symmetry::SymmetricConformation &> ( pose.
conformation()) );
233 while ( !pos_list.empty() ) {
234 Size const seqpos( pos_list[ static_cast< Size >( RG.uniform() * pos_list.size() + 1 ) ] );
235 pos_list.erase( std::find( pos_list.begin(), pos_list.end(), seqpos ) );
242 idealized[ seqpos ] =
true;
246 for (
Size i=seqpos; i >= seqpos-window_width; --i ) {
247 window.push_back( i );
250 for (
Size i=seqpos; i <= seqpos+window_width; ++i ) {
251 window.push_back( i );
257 local_mm.
set_chi( seqpos,
true );
258 final_mm.set_chi( seqpos,
true );
259 for (
Size ii=1; ii<= window.size(); ++ii ) {
260 Size const i( window[ ii ] );
261 local_mm.
set_bb( i,
true );
262 final_mm.set_bb( i,
true );
281 TR.Info <<
"forced ideal geometry on seqpos " << seqpos << std::endl;
285 Real max_bb_angle_dev, avg_bb_angle_dev, max_chi_angle_dev, avg_chi_angle_dev;
287 dihedral_distance( pose, start_pose, idealized, avg_bb_angle_dev, max_bb_angle_dev,
288 avg_chi_angle_dev, max_chi_angle_dev );
290 TR.Info <<
"premin: (pos,rmsd,avg-bb,max-bb,avg-chi,max-chi,score) " <<
292 F(9,3,avg_bb_angle_dev) << F(9,3,max_bb_angle_dev) <<
293 F(9,3,avg_chi_angle_dev) << F(9,3,max_chi_angle_dev) <<
294 F(12,3,scorefxn( pose ) ) << std::endl;
297 SymAtomTreeMinimizer().run( pose, local_mm, scorefxn, options );
299 AtomTreeMinimizer().run( pose, local_mm, scorefxn, options );
302 dihedral_distance( pose, start_pose, idealized, avg_bb_angle_dev, max_bb_angle_dev,
303 avg_chi_angle_dev, max_chi_angle_dev );
305 TR.Info <<
"postmin: (pos,rmsd,avg-bb,max-bb,avg-chi,max-chi,score) " <<
307 F(9,3,avg_bb_angle_dev) << F(9,3,max_bb_angle_dev) <<
308 F(9,3,avg_chi_angle_dev) << F(9,3,max_chi_angle_dev) <<
309 F(12,3,scorefxn( pose ) ) << std::endl;
310 scorefxn.
show( TR, pose );
313 if ( lastjumpmin ) final_mm.set_jump( pose.
num_jump(), true );
319 final_mm.set_jump(
true );
324 Real max_bb_angle_dev, avg_bb_angle_dev, max_chi_angle_dev, avg_chi_angle_dev;
325 dihedral_distance( pose, start_pose, idealized, avg_bb_angle_dev, max_bb_angle_dev,
326 avg_chi_angle_dev, max_chi_angle_dev );
328 TR.Info <<
"pre-finalmin: (pos,rmsd,avg-bb,max-bb,avg-chi,max-chi,score) " <<
330 F(9,3,avg_bb_angle_dev) << F(9,3,max_bb_angle_dev) <<
331 F(9,3,avg_chi_angle_dev) << F(9,3,max_chi_angle_dev) <<
332 F(12,3,scorefxn( pose ) ) << std::endl;
335 SymAtomTreeMinimizer().run( pose, final_mm, scorefxn, options );
337 AtomTreeMinimizer().run( pose, final_mm, scorefxn, options );
339 dihedral_distance( pose, start_pose, idealized, avg_bb_angle_dev, max_bb_angle_dev,
340 avg_chi_angle_dev, max_chi_angle_dev );
342 TR.Info <<
"post-finalmin: (pos,rmsd,avg-bb,max-bb,avg-chi,max-chi,score) " <<
344 F(9,3,avg_bb_angle_dev) << F(9,3,max_bb_angle_dev) <<
345 F(9,3,avg_chi_angle_dev) << F(9,3,max_chi_angle_dev) <<
346 F(12,3,scorefxn( pose ) ) << std::endl;
348 scorefxn.
show( TR.Info, pose );
349 TR.Info << std::endl;