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 {
83 using namespace core::scoring::methods;
85 static basic::Tracer
TR(
"core.scoring.electron_density.FastDensEnergy");
134 using namespace methods;
138 utility_exit_with_message(
"Density scoring function called but no map loaded.");
143 int virt_res_idx = root_edge.
start();
148 TR.Error <<
"Fold tree is not set properly for density scoring!" << std::endl;
155 bool create_new_lre_container(
false );
157 if ( energies.long_range_container( lr_type ) == 0 ) {
158 create_new_lre_container =
true;
163 if ( dec->size() != pose.
total_residue() || dec->fixed() != virt_res_idx ) {
164 create_new_lre_container =
true;
168 if ( create_new_lre_container ) {
169 TR <<
"Creating new one-to-all energy container (" << pose.
total_residue() <<
")" << std::endl;
171 energies.set_long_range_container( lr_type, new_dec );
205 using namespace numeric::statistics;
221 nsubunits = symminfo->subunits();
222 if (! symminfo->bb_is_independent( r ) )
return;
234 for (
int i=1; i<=(
int)bbclones.size(); ++i) {
236 bbclones[i], pose.
residue(bbclones[i]), pose, symminfo );
260 using namespace numeric::statistics;
262 int resid =
id.rsd();
263 int atmid =
id.atomno();
286 core::Size nres_per = symminfo->num_independent_residues();
287 bool remapSymm = basic::options::option[ basic::options::OptionKeys::edensity::score_symm_complex ]();
292 if (atmid != 2)
return;
296 int nchildren = edges_i.size();
297 if (nchildren < 2)
return;
303 if (! symminfo->jump_is_independent( edge_incoming.
label() ) )
313 for (
int j=1; j<=nchildren; ++j) {
314 int basejump = edges_i[j].label();
315 if (! symminfo->jump_is_independent( basejump ) )
316 basejump = symminfo->jump_follows( basejump );
318 for (
int k=0; k<=(
int)jumpclones.size(); ++k) {
321 if (edges_j.size() > 1 && std::find( vrtclones.begin(), vrtclones.end(), upstream ) == vrtclones.end() ) {
322 vrtclones.push_back( upstream );
328 for (
int i=1; i<=(
int)vrtclones.size(); ++i) {
332 for (
int j=1; j<=nchildren; ++j) {
333 int downstream = edges_i[j].stop();
338 for (
int k=1; k<=(
int)nsubunits; ++k) {
339 if (mapping_j[k] == 0)
continue;
342 for (
int l=1, l_end=nres_per; l<=l_end; ++l) {
344 int source_res = (k-1)*nres_per+l;
345 int target_res = (mapping_j[k]-1)*nres_per+l;
362 ( m, source_res, X_lm_src, pose.
residue(source_res), pose, dCCdx );
369 Vector const f1( atom_x.cross( atom_y ) );
382 for (
int k=1; k<=(
int)nsubunits; ++k) {
383 if (mapping_i[k] == 0)
continue;
386 for (
int l=1, l_end=nres_per; l<=l_end; ++l) {
388 int source_res = (k-1)*nres_per+l;
389 int target_res = (mapping_i[k]-1)*nres_per+l;
396 ( m, source_res, X_lm_src, pose.
residue(source_res), pose, dCCdx );
410 Vector const f1( atom_x.cross( atom_y ) );
419 if (! symminfo->bb_is_independent( resid ) )
return;
422 for (
int i=0; i<=(
int)myClones.size(); ++i) {
425 ( atmid, (i==0)?resid:myClones[i], X_i, pose.
residue((i==0)?resid:myClones[i]), pose, dCCdx );
446 Vector const f1( atom_x.cross( atom_y ) );
480 Vector const f1( atom_x.cross( atom_y ) );