24 #include <basic/options/option.hh>
26 #include <basic/datacache/BasicDataCache.hh>
31 #include <basic/Tracer.hh>
34 #include <ObjexxFCL/format.hh>
42 #include <utility/excn/Exceptions.hh>
43 #include <utility/io/izstream.hh>
44 #include <utility/io/ozstream.hh>
48 #include <basic/options/keys/in.OptionKeys.gen.hh>
49 #include <basic/options/keys/csa.OptionKeys.gen.hh>
51 #include <numeric/random/random.hh>
53 #include <numeric/xyz.functions.hh>
54 #include <numeric/xyzVector.hh>
55 #include <numeric/xyzMatrix.hh>
62 static basic::Tracer
tr(
"core.scoring.ChemicalShiftAnisotropy");
93 out <<
"CSA "<<++ct <<
" ";
94 out << (*it) << std::endl;
99 using namespace ObjexxFCL::fmt;
114 basic::datacache::CacheableData(other) {
121 basic::datacache::CacheableData::operator=(other);
129 utility::io::izstream infile(filename.c_str());
131 if ( !infile.good() ) {
132 throw( utility::excn::EXCN_FileNotFound( filename ) );
136 while (getline(infile, line)) {
137 std::istringstream line_stream(line);
140 Real sigma1, sigma2, sigma3, weight;
142 line_stream >> res1 >> atom1 >> sigma1 >> sigma2 >> sigma3 >> CSAval >> CSAerr;
143 weight=3.0/(sigma1+sigma2+sigma3);
145 if ( line_stream.fail() ) {
146 tr.Error <<
"couldn't read line " << line <<
" in csa-file " << filename << std::endl;
147 throw( utility::excn::EXCN_BadInput(
" invalid line "+line+
" in csa-file "+filename));
150 if ( atom1==
"N" && sigma1<=sigma2 && sigma2<=sigma3 && res1>1 ) {
151 All_CSA_lines_.push_back(
CSA(res1,atom1,sigma1,sigma2,sigma3,CSAval,CSAerr,weight));
154 throw( utility::excn::EXCN_BadInput(
"only N15 CSA is supported, not yet for " ));
156 throw( utility::excn::EXCN_BadInput(
"residue id needs to be greater than 1" ));
157 if ( sigma1>sigma2 || sigma1>sigma2 || sigma2>sigma3)
158 throw( utility::excn::EXCN_BadInput(
"sigma1 < sigma2 < sigma3" ));
165 using namespace basic::options;
166 using namespace basic::options::OptionKeys;
168 tr.Warning <<
"no CSA file specified" << std::endl;
182 if ( basic::options::option[ basic::options::OptionKeys::csa::useZ].user() ) {
191 tr.Trace <<
"memnorm.x(): " << memnorm.x() <<
" memnorm.y() " << memnorm.y() <<
" memnorm.z() " << memnorm.z() << std::endl;
217 Real compCSA=it->CSAval_computed_=dot_product(memnorm,numeric::product(PAF*sigmas*PAF.transposed(),memnorm));
220 Real devCSA = fabs(compCSA - it->CSAval()) < it->CSAerr() ? 0.0 : fabs(fabs(compCSA - it->CSAval())-it->CSAerr());
222 total_dev+=it->weight()*devCSA*devCSA;
224 if (
tr.Trace.visible() ) {
225 tr.Trace <<
"resi: " << it->res1() <<
" compCSA: " << compCSA <<
" expCSA: " << it->CSAval() <<
" expErr " << it->CSAerr() <<
" devCSA: " << devCSA <<
" total_dev "<< total_dev << std::endl;
243 Real dcompCSA_dx=0.0;
257 if ( fabs(compCSA - it->CSAval()) <= it->CSAerr() ) {
268 }
else if ( compCSA - it->CSAval() > it->CSAerr() ) {
273 du1_dx=-vx/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,-vx);
274 du2_dx=-vx/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,-vx);
275 p=dot_product(u1,cross_product(b,du1_dx));
276 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
277 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
280 dPAF_dx=dF_dx*mbeta*malpha;
281 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
282 dE_xA=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
288 du1_dx=-vy/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,-vy);
289 du2_dx=-vy/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,-vy);
290 p=dot_product(u1,cross_product(b,du1_dx));
291 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
292 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
295 dPAF_dx=dF_dx*mbeta*malpha;
296 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
297 dE_yA=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
303 du1_dx=-vz/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,-vz);
304 du2_dx=-vz/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,-vz);
305 p=dot_product(u1,cross_product(b,du1_dx));
306 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
307 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
310 dPAF_dx=dF_dx*mbeta*malpha;
311 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
312 dE_zA=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
318 du1_dx=vx/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,vx);
319 du2_dx=v0/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,v0);
320 p=dot_product(u1,cross_product(b,du1_dx));
321 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
322 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
325 dPAF_dx=dF_dx*mbeta*malpha;
326 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
327 dE_xB=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
333 du1_dx=vy/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,vy);
334 du2_dx=v0/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,v0);
335 p=dot_product(u1,cross_product(b,du1_dx));
336 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
337 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
340 dPAF_dx=dF_dx*mbeta*malpha;
341 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
342 dE_yB=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
348 du1_dx=vz/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,vz);
349 du2_dx=v0/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,v0);
350 p=dot_product(u1,cross_product(b,du1_dx));
351 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
352 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
355 dPAF_dx=dF_dx*mbeta*malpha;
356 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
357 dE_zB=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
363 du1_dx=v0/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,v0);
364 du2_dx=vx/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,vx);
365 p=dot_product(u1,cross_product(b,du1_dx));
366 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
367 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
370 dPAF_dx=dF_dx*mbeta*malpha;
371 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
372 dE_xC=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
378 du1_dx=v0/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,v0);
379 du2_dx=vy/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,vy);
380 p=dot_product(u1,cross_product(b,du1_dx));
381 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
382 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
385 dPAF_dx=dF_dx*mbeta*malpha;
386 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
387 dE_yC=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
393 du1_dx=v0/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,v0);
394 du2_dx=vz/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,vz);
395 p=dot_product(u1,cross_product(b,du1_dx));
396 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
397 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
400 dPAF_dx=dF_dx*mbeta*malpha;
401 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
402 dE_zC=it->weight()*2*( compCSA - it->CSAval() - it->CSAerr() )*dcompCSA_dx;
411 du1_dx=-vx/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,-vx);
412 du2_dx=-vx/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,-vx);
413 p=dot_product(u1,cross_product(b,du1_dx));
414 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
415 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
418 dPAF_dx=dF_dx*mbeta*malpha;
419 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
420 dE_xA=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;
426 du1_dx=-vy/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,-vy);
427 du2_dx=-vy/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,-vy);
428 p=dot_product(u1,cross_product(b,du1_dx));
429 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
430 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
433 dPAF_dx=dF_dx*mbeta*malpha;
434 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
435 dE_yA=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;
441 du1_dx=-vz/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,-vz);
442 du2_dx=-vz/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,-vz);
443 p=dot_product(u1,cross_product(b,du1_dx));
444 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
445 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
448 dPAF_dx=dF_dx*mbeta*malpha;
449 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
450 dE_zA=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;
456 du1_dx=vx/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,vx);
457 du2_dx=v0/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,v0);
458 p=dot_product(u1,cross_product(b,du1_dx));
459 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
460 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
463 dPAF_dx=dF_dx*mbeta*malpha;
464 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
465 dE_xB=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;
471 du1_dx=vy/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,vy);
472 du2_dx=v0/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,v0);
473 p=dot_product(u1,cross_product(b,du1_dx));
474 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
475 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
478 dPAF_dx=dF_dx*mbeta*malpha;
479 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
480 dE_yB=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;
486 du1_dx=vz/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,vz);
487 du2_dx=v0/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,v0);
488 p=dot_product(u1,cross_product(b,du1_dx));
489 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
490 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
493 dPAF_dx=dF_dx*mbeta*malpha;
494 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
495 dE_zB=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;
501 du1_dx=v0/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,v0);
502 du2_dx=vx/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,vx);
503 p=dot_product(u1,cross_product(b,du1_dx));
504 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
505 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
508 dPAF_dx=dF_dx*mbeta*malpha;
509 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
510 dE_xC=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;
516 du1_dx=v0/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,v0);
517 du2_dx=vy/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,vy);
518 p=dot_product(u1,cross_product(b,du1_dx));
519 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
520 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
523 dPAF_dx=dF_dx*mbeta*malpha;
524 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
525 dE_yC=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;
531 du1_dx=v0/v1.length()-v1*(1/(v1.length()*v1.length()*v1.length()))*dot_product(v1,v0);
532 du2_dx=vz/v2.length()-v2*(1/(v2.length()*v2.length()*v2.length()))*dot_product(v2,vz);
533 p=dot_product(u1,cross_product(b,du1_dx));
534 q=(1/cross_product(u2,u1).length())*dot_product(u1,cross_product(u2,du1_dx));
535 r=(1/cross_product(u2,u1).length())*dot_product(n,cross_product(du2_dx,u1)+cross_product(u2,du1_dx));
538 dPAF_dx=dF_dx*mbeta*malpha;
539 dcompCSA_dx=2*dot_product(memnorm,numeric::product(dPAF_dx*sigmas*PAF.transposed(),memnorm));
540 dE_zC=it->weight()*2*( compCSA - it->CSAval() + it->CSAerr() )*dcompCSA_dx;