28 #include <basic/database/open.hh>
34 #include <numeric/xyz.functions.hh>
35 #include <utility/exit.hh>
38 #include <numeric/constants.hh>
39 #include <numeric/interpolation/Histogram.hh>
41 #include <basic/Tracer.hh>
43 #include <utility/vector1.hh>
50 static basic::Tracer
TR(
"core.scoring.disulfides.FullatomDisulfidePotential");
54 namespace disulfides {
147 disulf_ssdist_cutoff_( 3.0 ),
159 using namespace numeric::constants::d;
160 for (
Real angle = -360.0; angle <= 360.0; angle = angle + 0.1) {
162 std::cout <<
"ANGLE: " << angle
196 Energy & distance_score_this_disulfide,
197 Energy & csangles_score_this_disulfide,
198 Energy & dihedral_score_this_disulfide,
199 Energy & ca_dihedral_sc_this_disulf,
200 bool & truefalse_fa_disulf
207 Real csang_1(-1),csang_2(-1);
211 Real disulf_ca_dihedral_angle_1(360);
213 Real disulf_ca_dihedral_angle_2(360);
217 ssdist,csang_1,csang_2,dihed,disulf_ca_dihedral_angle_1,disulf_ca_dihedral_angle_2);
219 distance_score_this_disulfide = 0;
220 csangles_score_this_disulfide = 0;
221 dihedral_score_this_disulfide = 0;
222 ca_dihedral_sc_this_disulf = 0;
223 truefalse_fa_disulf =
false;
232 runtime_assert_msg( ! ( csang_1 > 180. || csang_2 > 180. ) ,
"Error csang > 180" );
234 using namespace numeric::constants::d;
237 csangles_score_this_disulfide = (csang_1_score+csang_2_score)*0.5;
247 ca_dihedral_sc_this_disulf =
cbsg_dihedral_func_->func(disulf_ca_dihedral_angle_1*degrees_to_radians);
248 ca_dihedral_sc_this_disulf +=
cbsg_dihedral_func_->func(disulf_ca_dihedral_angle_2*degrees_to_radians);
250 ca_dihedral_sc_this_disulf *= .5 ;
265 truefalse_fa_disulf =
true;
283 using namespace constraints;
286 Vector f1( 0.0 ), f2( 0.0 );
291 AtomID( at1, res1.
seqpos() ),
296 dihedral_ang_cst.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
304 AtomID( at1, res1.
seqpos() ),
308 ang_cst.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
315 AtomID( at1, res1.
seqpos() ),
319 dihedral_ang_cst.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
325 AtomID( at1, res1.
seqpos() ),
330 ss_dihedral_ang_cst.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
337 apc.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
344 AtomID( at1, res1.
seqpos() ),
347 ang_cst1.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
353 AtomID( at1, res1.
seqpos() ),
357 ang_cst2.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
365 AtomID( at1, res1.
seqpos() ),
368 dihedral_ang_cst1.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
377 AtomID( at1, res1.
seqpos() ),
379 dihedral_ang_cst2.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
386 AtomID( at1, res1.
seqpos() ),
390 ss_dihedral_ang_cst.
fill_f1_f2( AtomID( at1, res1.
seqpos() ), respairxyz, f1, f2, weights );
428 Real & cs_bond_angle_1,
429 Real & cs_bond_angle_2,
430 Real & disulf_dihedral_angle,
431 Real & disulf_ca_dihedral_angle_1,
433 Real & disulf_ca_dihedral_angle_2
436 using namespace numeric::constants::d;
445 dist_between_sulfurs = sulfur_1.distance( sulfur_2 );
446 cs_bond_angle_1 = angle_of( cbeta_1, sulfur_1, sulfur_2);
447 cs_bond_angle_2 = angle_of( cbeta_2, sulfur_2, sulfur_1);
448 cs_bond_angle_1 *= radians_to_degrees;
449 cs_bond_angle_2 *= radians_to_degrees;
450 disulf_dihedral_angle = dihedral_degrees(cbeta_1,sulfur_1,sulfur_2,cbeta_2);
451 disulf_ca_dihedral_angle_1 = dihedral_degrees(calpha_1,cbeta_1,sulfur_1,sulfur_2);
452 disulf_ca_dihedral_angle_2 = dihedral_degrees(calpha_2,cbeta_2,sulfur_2,sulfur_1);
467 csf_cbang1_(0.1,0.9,10,0.0),
468 csf_cbang2_(1.35,1.1,-5,0.0),
469 csf_cbang3_(-1.25,1.5,-5,0.0)
520 csf_cbang1a_( 1.641426, 0.25, -2.3, 0.0),
521 csf_cbang2a_( 1.641426, 0.9, -20, 0.0),
522 csf_cbang1b_(-1.517302, 0.25, -2.3, 0.0),
523 csf_cbang2b_(-1.517302, 0.9, -20, 0.0)
590 csf_cbang1_( 1.819120, 0.208961, -200, 0.0),
591 csf_cbang2_( 1.819120, 0.208961, -50, 0.0)
691 Real distance_score_this_disulfide( 0.0 );
693 numeric::interpolation::HistogramCOP<Real,Real>::Type scores =
695 Real ssdist_min_range( scores->minimum() );
696 Real ssdist_max_range( scores->maximum() );
698 if ( ssdist >= ssdist_max_range ) {
699 Real ssdist_score_at_max(0);
700 scores->interpolate(ssdist_max_range,ssdist_score_at_max);
701 Real ssdist_max_tail_slope(0);
702 scores->derivative(ssdist_max_range-scores->step_size(),ssdist_max_tail_slope);
704 distance_score_this_disulfide = ssdist_score_at_max + ( ssdist - ssdist_max_range ) * ssdist_max_tail_slope;
705 }
else if ( ssdist <= ssdist_min_range ) {
706 Real ssdist_score_at_min(0);
707 scores->interpolate(ssdist_min_range,ssdist_score_at_min);
708 Real ssdist_min_tail_slope(0);
709 scores->derivative(ssdist_min_range,ssdist_min_tail_slope);
711 distance_score_this_disulfide = ssdist_score_at_min + ( ssdist - ssdist_min_range ) * ssdist_min_tail_slope;
716 return distance_score_this_disulfide;
722 Real d_distance_score_this_disulfide_ddis( 0.0 );
724 numeric::interpolation::HistogramCOP<Real,Real>::Type scores =
726 Real ssdist_min_range( scores->minimum() );
727 Real ssdist_max_range( scores->maximum() );
728 if ( ssdist >= ssdist_max_range ) {
729 scores->derivative(ssdist_max_range-scores->step_size(),d_distance_score_this_disulfide_ddis);
730 }
else if ( ssdist <= ssdist_min_range ) {
731 scores->derivative(ssdist_min_range,d_distance_score_this_disulfide_ddis);
735 return d_distance_score_this_disulfide_ddis;
739 numeric::interpolation::HistogramCOP<core::Real,core::Real>::Type
742 using namespace numeric::interpolation;
743 static HistogramCOP<Real,Real>::Type scores(0);
745 utility::io::izstream scores_stream;
746 basic::database::open( scores_stream,
"scoring/score_functions/disulfides/fa_SS_distance_score");
747 scores =
new Histogram<Real,Real>( scores_stream() );
748 scores_stream.close();