28 #include <numeric/xyz.functions.hh>
29 #include <numeric/statistics.functions.hh>
39 #include <basic/options/option.hh>
40 #include <basic/options/keys/edensity.OptionKeys.gen.hh>
45 #include <basic/Tracer.hh>
49 #include <utility/vector1.hh>
56 #define _USE_MATH_DEFINES
63 namespace electron_density {
83 static basic::Tracer
TR(
"core.scoring.methods.ElecDensEnergy");
138 using namespace methods;
142 utility_exit_with_message(
"Density scoring function called but no map loaded.");
147 int virt_res_idx = root_edge.
start();
153 TR.Error <<
"Fold tree is not set properly for density scoring!" << std::endl;
160 bool create_new_lre_container(
false );
162 if ( energies.long_range_container( lr_type ) == 0 ) {
163 create_new_lre_container =
true;
168 if ( dec->size() != pose.
total_residue() || dec->fixed() != virt_res_idx ) {
169 create_new_lre_container =
true;
173 if ( create_new_lre_container ) {
174 TR <<
"Creating new LRE container (" << pose.
total_residue() <<
")" << std::endl;
176 energies.set_long_range_container( lr_type, new_dec );
200 TR.Debug <<
"ElecDensAllAtomCenEnergy::setup_for_scoring() returns CC = " <<
structure_score << std::endl;
234 using namespace numeric::statistics;
243 Real z_CC = cc / 0.1;
244 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
245 Real edensScore = log ( p_null );
263 using namespace numeric::statistics;
265 int resid =
id.rsd();
266 int atmid =
id.atomno();
288 core::Size nres_per = symminfo->num_independent_residues();
289 bool remapSymm = basic::options::option[ basic::options::OptionKeys::edensity::score_symm_complex ]();
294 if (atmid != 2)
return;
298 int nchildren = edges_i.size();
299 if (nchildren < 2)
return;
305 if (! symminfo->jump_is_independent( edge_incoming.
label() ) )
315 for (
int j=1; j<=nchildren; ++j) {
316 int basejump = edges_i[j].label();
317 if (! symminfo->jump_is_independent( basejump ) )
318 basejump = symminfo->jump_follows( basejump );
320 for (
int k=0; k<=(
int)jumpclones.size(); ++k) {
323 if (edges_j.size() > 1 && std::find( vrtclones.begin(), vrtclones.end(), upstream ) == vrtclones.end() ) {
324 vrtclones.push_back( upstream );
330 for (
int i=1; i<=(
int)vrtclones.size(); ++i) {
334 for (
int j=1; j<=nchildren; ++j) {
335 int downstream = edges_i[j].stop();
340 for (
int k=1; k<=(
int)nsubunits; ++k) {
341 if (mapping_j[k] == 0)
continue;
344 for (
int l=1, l_end=nres_per; l<=l_end; ++l) {
346 int source_res = (k-1)*nres_per+l;
347 int target_res = (mapping_j[k]-1)*nres_per+l;
355 Real z_CC = CC / 0.1;
356 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
359 exp(-
SQ( z_CC/sqrt(2.0) )) *
366 Vector const f1( atom_x.cross( atom_y ) );
383 for (
int k=1; k<=(
int)nsubunits; ++k) {
384 if (mapping_i[k] == 0)
continue;
387 for (
int l=1, l_end=nres_per; l<=l_end; ++l) {
389 int source_res = (k-1)*nres_per+l;
390 int target_res = (mapping_i[k]-1)*nres_per+l;
398 Real z_CC = CC / 0.1;
399 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
402 exp(-
SQ( z_CC/sqrt(2.0) )) *
409 Vector const f1( atom_x.cross( atom_y ) );
422 if (! symminfo->bb_is_independent( resid ) )
return;
425 for (
int i=0; i<=(
int)myClones.size(); ++i) {
434 Real z_CC = CC / 0.1;
435 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
440 exp(-
SQ( z_CC/sqrt(2.0) )) *
447 Vector const f1( atom_x.cross( atom_y ) );
463 Real z_CC = CC / 0.1;
464 Real p_null = 0.5 * errfc( z_CC/sqrt(2.0) );
472 exp(-
SQ( z_CC/sqrt(2.0) )) *
480 Vector const f1( atom_x.cross( atom_y ) );