36 #include <numeric/interpolation/spline/Interpolator.hh>
37 #include <numeric/interpolation/spline/SplineGenerator.hh>
40 #include <basic/options/option.hh>
41 #include <basic/options/keys/OptionKeys.hh>
42 #include <basic/options/keys/in.OptionKeys.gen.hh>
43 #include <basic/options/keys/score.OptionKeys.gen.hh>
50 #include <basic/database/open.hh>
51 #include <basic/Tracer.hh>
52 #include <utility/io/izstream.hh>
58 #include <utility/vector1.hh>
67 static basic::Tracer
trSAXSEnergy(
"core.scoring.saxs.SAXSEnergy");
89 using namespace basic::options;
90 using namespace basic::options::OptionKeys;
93 trSAXSEnergy.Warning <<
"SAXS score setup : " << the_variant << std::endl;
103 trSAXSEnergy <<
"Reading reference spectrum: " << file << std::endl;
106 if ( basic::options::option[in::file::native].user() ) {
108 trSAXSEnergy <<
"Using "<<basic::options::option[in::file::native]()<<
" as a reference for SAXS energy"<<std::endl;
112 trSAXSEnergy <<
"Calculated reference spectrum from a native: "
113 << basic::options::option[in::file::native]() << std::endl;
135 using namespace basic::options;
136 using namespace basic::options::OptionKeys;
138 Real s_min_ = basic::options::option[score::saxs::q_min]();
139 Real s_max_ = basic::options::option[score::saxs::q_max]();
140 Real s_step_ = basic::options::option[score::saxs::q_step]();
142 for(
Real s=s_min_;s<=s_max_;s+=s_step_)
147 trSAXSEnergy.Warning <<
"SAXS score q-set : " <<
q_.size() <<
" points from a file given at cmdline"<< std::endl;
152 q_.resize( source_q.size() );
153 for(
Size i=1;i<=
q_.size();i++)
157 trSAXSEnergy.Warning <<
"SAXS score q-set : " <<
q_.size() <<
" points as a deep copy"<< std::endl;
162 using namespace basic::options;
163 using namespace basic::options::OptionKeys;
166 if ( basic::options::option[score::saxs::custom_ff].user() ) {
167 trSAXSEnergy <<
"Loading custom FF from "<<basic::options::option[score::saxs::custom_ff]()<<std::endl;
202 utility::io::izstream input(file_name.c_str());
204 utility_exit_with_message(
"Unable to open reference spectrum file: " + file_name );
206 while( getline( input, line ) ) {
207 if ( line.substr(0,1) ==
"#" )
continue;
208 if ( line.length() < 4 )
continue;
209 std::istringstream line_stream( line );
210 line_stream >> tX >> tY;
213 trSAXSEnergy.Trace <<
"Reference SAXS data: "<<tX<<
" "<<tY<<std::endl;
225 for(
Size i=2;i<=q.size();i++) {
226 if(q[i] < minX) minX = q[i];
227 if(q[i] > maxX) maxX = q[i];
228 if(I[i] < minY) minY = I[i];
229 if(I[i] > maxY) maxY = I[i];
233 numeric::interpolation::spline::SplineGenerator gen( minX-delta, minY-delta, 0, maxX+delta, maxY+delta, 0 );
234 for (
Size i = 1; i <= q.size(); ++i) {
235 gen.add_known_value( q[i],I[i] );
239 if( result.size() !=
q_.size() ) {
241 result.resize(
q_.size() );
244 for(
Size i_s=1;i_s<=
q_.size();++i_s) {
246 spline_interpolator->interpolate(
q_[i_s], r, dy);
264 std::set<FormFactorOP> ff_set;
284 std::set<FormFactorOP>::iterator it;
288 for (it=ff_set.begin(); it!=ff_set.end(); it++) {
289 ff_map_.insert( std::pair<FormFactorOP,Size>(*it,i) );
336 for (
Size j = 1; j < i; ++j ) {
342 dhist_[ ti ][ tj ]->insert(d);
344 dhist_[ tj ][ ti ]->insert(d);
360 for(
Size i_s=1;i_s<=
q_.size();++i_s) {
366 for (
Size j = 1; j <= i; ++j ) {
369 for(
Size i_r=1;i_r<= dh->last_nonempty_bin();++i_r) {
370 Size dn = dh->get( i_r );
372 sum += fij * dn * sin_x_by_x_->
evaluate( dh->distance( i_r ) * val_s );
399 assert( saxs_scored.size() == saxs_reference.size() );
400 for(
Size i=1;i<=saxs_scored.size();++i)
401 sum += saxs_reference[i] / saxs_scored[i];
402 Real lambda = sum / ((
Real) saxs_scored.size());
406 for(
Size i=1;i<=saxs_reference.size();++i) {
407 Real tmp = saxs_scored[i] * lambda - saxs_reference[i];
408 trSAXSEnergy.Trace << i<<
" " << saxs_scored[i] * lambda <<
" "<< saxs_reference[i] <<
"\n";
409 if( fabs(tmp) > chi )
414 trSAXSEnergy.Debug <<
"\nSAXS energy: " << chi << std::endl;
422 assert( saxs_scored.size() == saxs_reference.size() );
426 trSAXSEnergy.Trace <<
" q pose pose*lambda reference\n";
427 for(
Size i=1;i<=saxs_reference.size();++i) {
428 Real tmp = saxs_scored[i] - saxs_reference[i];
431 <<
" " << (saxs_scored[i] /
zero_ - saxs_reference[i]/
zero_) <<
"\n";
432 chi += tmp*tmp / saxs_reference[i] *
zero_;
435 chi /= ((
Real)
q_.size()) ;
448 assert( saxs_scored.size() == saxs_reference.size() );
449 for(
Size i=1;i<=saxs_scored.size();++i)
450 sum += saxs_reference[i] / saxs_scored[i];
451 Real lambda = sum / ((
Real) saxs_scored.size());
456 trSAXSEnergy.Trace <<
" q pose pose*lambda reference\n";
457 for(
Size i=1;i<=saxs_reference.size();++i) {
458 Real tmp = saxs_scored[i] * lambda /
zero_ - saxs_reference[i] /
zero_;
459 trSAXSEnergy.Trace << i<<
" " << saxs_scored[i]<<
" "<<saxs_scored[i] * lambda/
zero_ <<
" "<< saxs_reference[i]/
zero_
460 <<
" " << (saxs_scored[i] * lambda /
zero_ - saxs_reference[i]/
zero_) <<
"\n";
464 chi /= ((
Real)
q_.size());