17 #include <basic/options/option.hh>
27 #include <numeric/xyz.functions.hh>
28 #include <numeric/statistics.functions.hh>
41 #include <basic/options/keys/edensity.OptionKeys.gen.hh>
46 #include <basic/Tracer.hh>
50 #include <utility/vector1.hh>
53 #define _USE_MATH_DEFINES
65 namespace electron_density {
85 using namespace core::scoring::methods;
87 static basic::Tracer
TR(
"core.scoring.electron_density.ElecDensEnergy");
99 TR.Debug << (
map_loaded?
"Map loaded." :
"Error loading map!") << std::endl;
144 for (
int i=1; i<=(
int)bbclones.size(); ++i)
146 bbclones[i], pose.
residue(bbclones[i]), pose, symminfo, true );
150 TR.Debug <<
"Average CC = " << ccsum/nressum <<
" ( " << nressum <<
" res)" << std::endl;
160 using namespace methods;
164 utility_exit_with_message(
"Density scoring function called but no map loaded.");
170 int virt_res_idx = root_edge.
start();
176 TR.Error <<
"Fold tree is not set properly for density scoring!" << std::endl;
183 bool create_new_lre_container(
false );
184 if ( energies.long_range_container( lr_type ) == 0 ) {
185 create_new_lre_container =
true;
190 if ( dec->size() != pose.
total_residue() || dec->fixed() != virt_res_idx ) {
191 create_new_lre_container =
true;
195 if ( create_new_lre_container ) {
196 TR <<
"Creating new one-to-all energy container (" << pose.
total_residue() <<
")" << std::endl;
198 energies.set_long_range_container( lr_type, new_dec );
236 using namespace numeric::statistics;
252 nsubunits = symminfo->subunits();
254 if (! symminfo->bb_is_independent( r ) )
return;
258 Real z_CC = cc / 0.1;
259 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
265 for (
int i=1; i<=(
int)bbclones.size(); ++i) {
267 bbclones[i], pose.
residue(bbclones[i]), pose, symminfo, false );
269 p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
270 edensScore += log ( p_null ) / ((
core::Real)nsubunits);
290 using namespace numeric::statistics;
292 int resid =
id.rsd();
293 int atmid =
id.atomno();
316 core::Size nres_per = symminfo->num_independent_residues();
317 bool remapSymm = basic::options::option[ basic::options::OptionKeys::edensity::score_symm_complex ]();
320 if (!remapSymm)
return;
323 if (atmid != 2)
return;
327 int nchildren = edges_i.size();
328 if (nchildren < 2)
return;
334 if (! symminfo->jump_is_independent( edge_incoming.
label() ) )
344 for (
int j=1; j<=nchildren; ++j) {
345 int basejump = edges_i[j].label();
346 if (! symminfo->jump_is_independent( basejump ) )
347 basejump = symminfo->jump_follows( basejump );
349 for (
int k=0; k<=(
int)jumpclones.size(); ++k) {
352 if (edges_j.size() > 1 && std::find( vrtclones.begin(), vrtclones.end(), upstream ) == vrtclones.end() ) {
353 vrtclones.push_back( upstream );
359 for (
int i=1; i<=(
int)vrtclones.size(); ++i) {
363 for (
int j=1; j<=nchildren; ++j) {
364 int downstream = edges_i[j].stop();
369 for (
int k=1; k<=(
int)nsubunits; ++k) {
370 if (mapping_j[k] == 0)
continue;
373 for (
int l=1, l_end=nres_per; l<=l_end; ++l) {
375 int source_res = (k-1)*nres_per+l;
376 int target_res = (mapping_j[k]-1)*nres_per+l;
384 Real z_CC = CC / 0.1;
385 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
388 exp(-
SQ( z_CC/sqrt(2.0) )) *
395 Vector const f1( atom_x.cross( atom_y ) );
408 for (
int k=1; k<=(
int)nsubunits; ++k) {
409 if (mapping_i[k] == 0)
continue;
412 for (
int l=1, l_end=nres_per; l<=l_end; ++l) {
414 int source_res = (k-1)*nres_per+l;
415 int target_res = (mapping_i[k]-1)*nres_per+l;
424 Real z_CC = CC / 0.1;
425 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
428 exp(-
SQ( z_CC/sqrt(2.0) )) *
435 Vector const f1( atom_x.cross( atom_y ) );
444 if (! symminfo->bb_is_independent( resid ) )
return;
447 for (
int i=0; i<=(
int)myClones.size(); ++i) {
452 atmid, (i==0)?resid:myClones[i], X_i, pose.
residue((i==0)?resid:myClones[i]), pose, dCCdx );
459 Real z_CC = CC / 0.1;
460 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
465 exp(-
SQ( z_CC/sqrt(2.0) )) *
472 Vector const f1( atom_x.cross( atom_y ) );
490 Real z_CC = CC / 0.1;
491 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
497 exp(-
SQ( z_CC/sqrt(2.0) )) *
504 Vector const f1( atom_x.cross( atom_y ) );