24 #include <basic/Tracer.hh>
38 #include <utility/vector1.hh>
45 namespace constraints {
48 static basic::Tracer
TR(
"core.scoring.constraints.BackboneStubConstraint");
55 AtomID const & fixed_atom_id,
61 superposition_bonus_( superposition_bonus ),
62 CB_force_constant_( CB_force_constant ),
64 fixed_atom_id_( fixed_atom_id )
70 TR <<
"ERROR - Gly residues cannot be used in BackboneStubConstraints." << std::endl;
82 assert( rsd.is_protein() );
84 TR <<
"ERROR - Gly residues cannot be used in BackboneStubConstraints." << std::endl;
124 if( !dynamic_cast< BackboneStubConstraint const * > ( &other_cst ) )
return false;
172 if ( weights[ this->
score_type() ] == 0 )
return;
180 if ( ref_dist > 1
E-8 ) {
181 TR <<
"ERROR - BackboneStubConstraint requires a fixed reference atom, but this atom has moved!!" << std::endl;
188 assert( cst_val < 0. );
205 TR <<
"ERROR - Gly residues cannot be used in BackboneStubConstraints." << std::endl;
209 CB_curr = curr_rsd.
xyz(
"CB");
213 if ( cst_val > 0. )
return;
226 if ( cst_val > -1
E-10 )
return;
234 if ( cst_val > -1
E-10 )
return;
248 if ( weights[ this->
score_type() ] == 0 )
return;
260 assert( cst_val < 0. );
275 TR <<
"ERROR - Gly residues cannot be used in BackboneStubConstraints." << std::endl;
285 cst_val += CB_pos_term;
286 if ( cst_val > -1
E-10 )
return;
292 if( CB_CA_angle_term <= 1
E-10 )
return;
299 if ( C_N_angle_term <= 1
E-10 )
return;
311 if ( CB_deriv != 0.0 && CB_dist != 0.0 ) {
313 F1 += ( ( CB_deriv / CB_dist ) * CB_f1 ) * CB_CA_angle_term * C_N_angle_term * constant_dist_term;
314 F2 += ( ( CB_deriv / CB_dist ) * CB_f2 ) * CB_CA_angle_term * C_N_angle_term * constant_dist_term;
318 Vector partial_F1(0.), partial_F2(0.);
320 F1 += partial_F1 * C_N_angle_term * constant_ang_term;
321 F2 += partial_F2 * C_N_angle_term * constant_ang_term;
328 Vector partial_F1(0.), partial_F2(0.);
329 ang_cst_->p1_deriv( CA_curr, CA_curr - CB_CA_curr, CA_curr +
CB_CA_target_ - CB_CA_curr, partial_F1, partial_F2 );
330 F1 += -partial_F1 * C_N_angle_term * constant_ang_term;
331 F2 += -partial_F2 * C_N_angle_term * constant_ang_term;
337 Vector partial_F1(0.), partial_F2(0.);
339 F1 += partial_F1 * CB_CA_angle_term * constant_ang_term;
340 F2 += partial_F2 * CB_CA_angle_term * constant_ang_term;
351 Vector partial_F1(0.), partial_F2(0.);
352 ang_cst_->p1_deriv( N_curr, N_curr - C_N_curr, N_curr +
C_N_target_ - C_N_curr, partial_F1, partial_F2 );
353 F1 += -partial_F1 * CB_CA_angle_term * constant_ang_term;
354 F2 += -partial_F2 * CB_CA_angle_term * constant_ang_term;
374 new_seqpos = (*smap)[
seqpos_ ];
376 if( new_seqpos == 0 )
return NULL;