24 #include <basic/options/option.hh>
26 #include <basic/datacache/BasicDataCache.hh>
31 #include <basic/Tracer.hh>
35 #include <ObjexxFCL/format.hh>
43 #include <utility/excn/Exceptions.hh>
44 #include <utility/io/izstream.hh>
45 #include <utility/io/ozstream.hh>
49 #include <basic/options/keys/in.OptionKeys.gen.hh>
50 #include <basic/options/keys/dc.OptionKeys.gen.hh>
52 #include <numeric/random/random.hh>
54 #include <numeric/xyz.functions.hh>
55 #include <numeric/xyzVector.hh>
56 #include <numeric/xyzMatrix.hh>
63 static basic::Tracer
tr(
"core.scoring.DipolarCoupling");
94 out <<
"DC "<<++ct <<
" ";
95 out << (*it) << std::endl;
100 using namespace ObjexxFCL::fmt;
115 basic::datacache::CacheableData(other) {
122 basic::datacache::CacheableData::operator=(other);
130 utility::io::izstream infile(filename.c_str());
132 if ( !infile.good() ) {
133 throw( utility::excn::EXCN_FileNotFound( filename ) );
136 tr.Info <<
"Reading DC file " << filename << std::endl;
137 while (getline(infile, line)) {
138 std::istringstream line_stream(line);
143 line_stream >> res1 >> atom1 >> res2 >> atom2 >> DCval >> DCerr;
146 if ( line_stream.fail() ) {
147 tr.Error <<
"couldn't read line " << line <<
" in dc-file " << filename << std::endl;
148 throw( utility::excn::EXCN_BadInput(
" invalid line "+line+
" in dc-file "+filename));
156 using namespace basic::options;
157 using namespace basic::options::OptionKeys;
159 tr.Warning <<
"no DC file specified" << std::endl;
169 if (atom ==
"HN" || atom ==
"H" || atom ==
"HA")
171 if (atom ==
"C" || atom ==
"CA")
175 throw(utility::excn::EXCN_BadInput(
"unknown atom for DC: " + atom));
186 if ((elem1 ==
"N" && elem2 ==
"H") || (elem1 ==
"H" && elem2 ==
"N"))
187 DC_type = DC_TYPE_NH;
188 else if ((elem1 ==
"C" && elem2 ==
"H") || (elem1 ==
"H" && elem2 ==
"C"))
189 DC_type = DC_TYPE_CH;
190 else if ((elem1 ==
"C" && elem2 ==
"N") || (elem1 ==
"N" && elem2 ==
"C"))
191 DC_type = DC_TYPE_NC;
192 else if ((elem1 ==
"C" && elem2 ==
"C"))
193 DC_type = DC_TYPE_CC;
195 throw(utility::excn::EXCN_BadInput(
196 "unknown combination of atoms for DC " + atom1 +
" " + atom2));
205 if ( basic::options::option[ basic::options::OptionKeys::dc::useZ].user() ) {
213 tr.Trace <<
"memnorm.x(): " << memnorm.x() <<
" memnorm.y() " << memnorm.y() <<
" memnorm.z() " << memnorm.z() << std::endl;
221 Real costheta=dot_product(u1,memnorm);
224 Real compDC=it->DCval_computed_=it->Dconst()*(3*costheta*costheta-1);
244 if ( it->DCval()<=it->Dconst() ) {
247 if (fabs(fabs(compDC) - it->DCval()) <= it->DCerr()) {
255 }
else if ( fabs(compDC) - it->DCval()>it->DCerr() ) {
256 devDC=fabs(compDC) - it->DCval() - it->DCerr();
257 dcos_dxA= ( -memnorm.x()/v1.length()+dot_product(v1,memnorm)*v1.x()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
258 dcos_dyA= ( -memnorm.y()/v1.length()+dot_product(v1,memnorm)*v1.y()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
259 dcos_dzA= ( -memnorm.z()/v1.length()+dot_product(v1,memnorm)*v1.z()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
260 dcos_dxB= ( memnorm.x()/v1.length()-dot_product(v1,memnorm)*v1.x()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
261 dcos_dyB= ( memnorm.y()/v1.length()-dot_product(v1,memnorm)*v1.y()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
262 dcos_dzB= ( memnorm.z()/v1.length()-dot_product(v1,memnorm)*v1.z()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
264 dv_xA=6*it->Dconst()*costheta*dcos_dxA;
265 dv_yA=6*it->Dconst()*costheta*dcos_dyA;
266 dv_zA=6*it->Dconst()*costheta*dcos_dzA;
267 dv_xB=6*it->Dconst()*costheta*dcos_dxB;
268 dv_yB=6*it->Dconst()*costheta*dcos_dyB;
269 dv_zB=6*it->Dconst()*costheta*dcos_dzB;
271 dc.
f1ij_[0] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_xA;
272 dc.
f1ij_[1] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_yA;
273 dc.
f1ij_[2] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_zA;
274 dc.
f2ij_[0] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_xB;
275 dc.
f2ij_[1] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_yB;
276 dc.
f2ij_[2] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_zB;
278 devDC=fabs(compDC) - it->DCval() + it->DCerr();
279 dcos_dxA= ( -memnorm.x()/v1.length()+dot_product(v1,memnorm)*v1.x()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
280 dcos_dyA= ( -memnorm.y()/v1.length()+dot_product(v1,memnorm)*v1.y()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
281 dcos_dzA= ( -memnorm.z()/v1.length()+dot_product(v1,memnorm)*v1.z()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
282 dcos_dxB= ( memnorm.x()/v1.length()-dot_product(v1,memnorm)*v1.x()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
283 dcos_dyB= ( memnorm.y()/v1.length()-dot_product(v1,memnorm)*v1.y()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
284 dcos_dzB= ( memnorm.z()/v1.length()-dot_product(v1,memnorm)*v1.z()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
286 dv_xA=6*it->Dconst()*costheta*dcos_dxA;
287 dv_yA=6*it->Dconst()*costheta*dcos_dyA;
288 dv_zA=6*it->Dconst()*costheta*dcos_dzA;
289 dv_xB=6*it->Dconst()*costheta*dcos_dxB;
290 dv_yB=6*it->Dconst()*costheta*dcos_dyB;
291 dv_zB=6*it->Dconst()*costheta*dcos_dzB;
293 dc.
f1ij_[0] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_xA;
294 dc.
f1ij_[1] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_yA;
295 dc.
f1ij_[2] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_zA;
296 dc.
f2ij_[0] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_xB;
297 dc.
f2ij_[1] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_yB;
298 dc.
f2ij_[2] = it->weight()*numeric::sign(3*costheta*costheta-1)*2*devDC*dv_zB;
302 else if ( it->DCval()>it->Dconst() && it->DCval()<=2*it->Dconst() ) {
303 if (fabs(compDC- it->DCval()) <= it->DCerr()) {
311 }
else if ( compDC- it->DCval()>it->DCerr() ) {
312 devDC=compDC- it->DCval() - it->DCerr();
313 dcos_dxA= ( -memnorm.x()/v1.length()+dot_product(v1,memnorm)*v1.x()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
314 dcos_dyA= ( -memnorm.y()/v1.length()+dot_product(v1,memnorm)*v1.y()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
315 dcos_dzA= ( -memnorm.z()/v1.length()+dot_product(v1,memnorm)*v1.z()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
316 dcos_dxB= ( memnorm.x()/v1.length()-dot_product(v1,memnorm)*v1.x()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
317 dcos_dyB= ( memnorm.y()/v1.length()-dot_product(v1,memnorm)*v1.y()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
318 dcos_dzB= ( memnorm.z()/v1.length()-dot_product(v1,memnorm)*v1.z()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
320 dv_xA=6*it->Dconst()*costheta*dcos_dxA;
321 dv_yA=6*it->Dconst()*costheta*dcos_dyA;
322 dv_zA=6*it->Dconst()*costheta*dcos_dzA;
323 dv_xB=6*it->Dconst()*costheta*dcos_dxB;
324 dv_yB=6*it->Dconst()*costheta*dcos_dyB;
325 dv_zB=6*it->Dconst()*costheta*dcos_dzB;
327 dc.
f1ij_[0] = it->weight()*2*devDC*dv_xA;
328 dc.
f1ij_[1] = it->weight()*2*devDC*dv_yA;
329 dc.
f1ij_[2] = it->weight()*2*devDC*dv_zA;
330 dc.
f2ij_[0] = it->weight()*2*devDC*dv_xB;
331 dc.
f2ij_[1] = it->weight()*2*devDC*dv_yB;
332 dc.
f2ij_[2] = it->weight()*2*devDC*dv_zB;
334 devDC=compDC- it->DCval() + it->DCerr();
335 dcos_dxA= ( -memnorm.x()/v1.length()+dot_product(v1,memnorm)*v1.x()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
336 dcos_dyA= ( -memnorm.y()/v1.length()+dot_product(v1,memnorm)*v1.y()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
337 dcos_dzA= ( -memnorm.z()/v1.length()+dot_product(v1,memnorm)*v1.z()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
338 dcos_dxB= ( memnorm.x()/v1.length()-dot_product(v1,memnorm)*v1.x()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
339 dcos_dyB= ( memnorm.y()/v1.length()-dot_product(v1,memnorm)*v1.y()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
340 dcos_dzB= ( memnorm.z()/v1.length()-dot_product(v1,memnorm)*v1.z()/(v1.length()*v1.length()*v1.length()) ) / memnorm.length();
342 dv_xA=6*it->Dconst()*costheta*dcos_dxA;
343 dv_yA=6*it->Dconst()*costheta*dcos_dyA;
344 dv_zA=6*it->Dconst()*costheta*dcos_dzA;
345 dv_xB=6*it->Dconst()*costheta*dcos_dxB;
346 dv_yB=6*it->Dconst()*costheta*dcos_dyB;
347 dv_zB=6*it->Dconst()*costheta*dcos_dzB;
349 dc.
f1ij_[0] = it->weight()*2*devDC*dv_xA;
350 dc.
f1ij_[1] = it->weight()*2*devDC*dv_yA;
351 dc.
f1ij_[2] = it->weight()*2*devDC*dv_zA;
352 dc.
f2ij_[0] = it->weight()*2*devDC*dv_xB;
353 dc.
f2ij_[1] = it->weight()*2*devDC*dv_yB;
354 dc.
f2ij_[2] = it->weight()*2*devDC*dv_zB;
358 throw(utility::excn::EXCN_BadInput(
"DC value not in resonable range"));
361 total_dev+=it->weight()*devDC*devDC;
363 if (
tr.Trace.visible() ) {
364 tr.Trace <<
"resi: " << it->res1() <<
" compDC: " << compDC <<
" expDC: " << it->DCval() <<
" expErr " << it->DCerr() <<
" devDC: " << devDC <<
" total_dev "<< total_dev << std::endl;