31 #include <numeric/interpolation/spline/Interpolator.hh>
35 #include <basic/options/option.hh>
36 #include <basic/options/keys/OptionKeys.hh>
37 #include <basic/options/keys/in.OptionKeys.gen.hh>
38 #include <basic/options/keys/score.OptionKeys.gen.hh>
44 #include <basic/prof.hh>
46 #include <basic/Tracer.hh>
47 #include <utility/io/izstream.hh>
48 #include <utility/exit.hh>
56 #include <utility/vector1.hh>
64 static basic::Tracer
trPDDFEnergy(
"protocols.scoring.methods.saxs.PDDFEnergy");
83 for(
core::Size i=1;i<=reference_pddf.size();i++) {
84 d_.push_back( reference_d[i] );
97 using namespace basic::options;
98 using namespace basic::options::OptionKeys;
114 if( basic::options::option[score::saxs::fit_pddf_area]() )
117 core::Real min_d = basic::options::option[score::saxs::d_min]();
118 core::Real max_d = basic::options::option[score::saxs::d_max]();
119 core::Real bin_d = basic::options::option[score::saxs::d_step]();
121 if(option[score::saxs::ref_pddf].user()) {
122 std::string file = option[score::saxs::ref_pddf]();
124 trPDDFEnergy <<
"Reading reference PDDF: " << file << std::endl;
132 if(option[in::file::native].user()) {
135 trPDDFEnergy <<
"Using "<<basic::options::option[in::file::native]()<<
" as a reference"<<std::endl;
138 basic::options::option[ in::file::residue_type_set ]());
141 basic::options::option[in::file::native]());
149 utility_exit_with_message(
"[ERROR] Unable to load reference PDDF: " );
158 PROF_START( basic::SAXS );
162 PROF_STOP( basic::SAXS );
192 utility::io::izstream input(file_name.c_str());
194 utility_exit_with_message(
"Unable to open reference spectrum file: " + file_name );
197 while( getline( input, line ) ) {
198 if ( line.substr(0,1) ==
"#" )
continue;
199 if ( line.length() < 4 )
continue;
200 std::istringstream line_stream( line );
201 line_stream >> tX >> tY;
205 trPDDFEnergy.Trace <<
"Reference PDDF data: "<<tX<<
" "<<tY<<std::endl;
238 trPDDFEnergy.Debug <<
"computing PDDF based on "<<
r_ids_.size()<<
" atoms"<<std::endl;
267 trPDDFEnergy.Trace <<
"rehash: trying "<<resi.
atom_type(m).
name();
269 trPDDFEnergy.Trace <<
" rejected hydrogen"<<std::endl;
273 trPDDFEnergy.Trace <<
" rejected unknown"<<std::endl;
279 row.push_back(fi->ff(
d_[i_s]));
286 trPDDFEnergy.Trace <<
" .. is glob ..";
290 trPDDFEnergy.Trace <<
" .. is atom ..";
292 trPDDFEnergy.Trace <<
" OK."<<std::endl;
295 trPDDFEnergy.Trace <<
"Found "<<
factors_.size()<<
" atoms suitable for PDDF computations"<<std::endl;
321 assert( pddf_scored.size() == pddf_reference.size() );
323 sum += pddf_reference[i] / pddf_scored[i];
326 trPDDFEnergy.Trace <<
"Computing PDDF energy:\n";
327 trPDDFEnergy.Trace <<
" q pose reference\n";
328 for(
core::Size i=1;i<=pddf_reference.size();++i) {
329 core::Real tmp = pddf_scored[i] * lambda - pddf_reference[i];
330 if( fabs(tmp) > chi )
334 trPDDFEnergy.Debug <<
"\nPDDF energy: " << chi << std::endl;
342 assert( pddf_scored.size() == pddf_reference.size() );
348 sum_scored += pddf_scored[i];
349 sum_ref += pddf_reference[i];
351 lambda = sum_ref / sum_scored;
354 trPDDFEnergy.Trace <<
"Computing PDDF energy:\n";
355 trPDDFEnergy.Trace <<
" r_i pose reference avg delta-chi sum-chi\n";
358 if( (pddf_scored[i]<0.00001) && ( pddf_reference[i]<0.000001) )
361 core::Real avg = (pddf_scored[i] * lambda + pddf_reference[i]) / 2.0;
362 core::Real tmp = pddf_scored[i] * lambda - pddf_reference[i];
364 trPDDFEnergy.Trace << std::setw(9)<<std::setprecision(4)<<
d_[i]<<
" ";
365 trPDDFEnergy.Trace << std::setw(9)<<std::setprecision(4)<<pddf_scored[i]*lambda<<
" ";
366 trPDDFEnergy.Trace << std::setw(9)<<std::setprecision(4)<<pddf_reference[i]<<
" ";
367 trPDDFEnergy.Trace << std::setw(9)<<std::setprecision(4)<< avg<<
" ";
368 trPDDFEnergy.Trace << std::setw(9)<<std::setprecision(4)<< (tmp*tmp)/avg<<
" ";
369 trPDDFEnergy.Trace << std::setw(9)<<std::setprecision(4)<<chi<<
"\n";
373 trPDDFEnergy.Debug <<
"\nPDDF energy: " << chi << std::endl;