23 #include <utility/io/izstream.hh>
24 #include <utility/excn/Exceptions.hh>
34 #include <basic/Tracer.hh>
37 #include <utility/options/keys/BooleanOptionKey.hh>
41 namespace frag_picker {
44 #define ROTATE(a,i,j,k,l) g=a[i][j];h=a[k][l];a[i][j]=g-s*(h+g*tau); a[k][l]=h+s*(g-h*tau);
58 static basic::Tracer
trRDCScore(
"fragment.picking.scores.RDCScore");
67 rdc_atoms(),
"RDCScore") {
81 utility::io::izstream infile(filename.c_str());
84 trRDCScore.Info <<
"Reading RDC file " << filename << std::endl;
86 while (getline(infile, line)) {
87 std::istringstream line_stream(line);
91 line_stream >> res1 >> atom1 >> res2 >> atom2 >> Jdipolar;
97 if (res1 == 1 && atom1 ==
"H")
99 if (res2 == 1 && atom2 ==
"H")
101 if (line_stream.fail()) {
102 trRDCScore.Error <<
"couldn't read line " << line
103 <<
" in rdc-file " << filename <<
"\n";
104 throw(utility::excn::EXCN_BadInput(
" invalid line " + line
105 +
" in rdc-file " + filename));
109 line_stream >> weight;
110 if (line_stream.fail()) {
111 trRDCScore.Debug <<
" set weight for RDC " << res1 <<
" to 1.0 "
116 Jdipolar, weight, exp_id - 1 ));
121 <<
" data points acquired from " << filename << std::endl;
125 Real md[5][5], v[5][5];
129 int nzero, i, j, k, nrot;
130 for (i = 0; i < n; i++)
131 for (j = 0; j < n; j++)
135 for (i = 0; i < n; i++)
136 tol += fabs(md[i][i]);
137 tol = 1e-6 * tol / n;
139 jacobi(md, eig, v, &nrot);
142 for (i = 0; i < n; i++)
143 if (fabs(eig[i]) < tol) {
147 eig[i] = 1.0 / eig[i];
149 for (i = 0; i < n; i++)
150 for (j = 0; j < n; j++) {
152 for (k = 0; k < n; k++)
153 s += eig[k] * v[i][k] * v[j][k];
163 Real tresh, theta, tau,
t, sm, s, h, g,
c;
167 for (ip = 0; ip < n; ip++) {
168 for (iq = 0; iq < n; iq++)
172 for (ip = 0; ip < n; ip++) {
173 b[ip] = d[ip] = a[ip][ip];
177 for (i = 1; i <= 50; i++) {
179 for (ip = 0; ip < n - 1; ip++) {
180 for (iq = ip + 1; iq < n; iq++)
181 sm += fabs(a[ip][iq]);
187 tresh = 0.2 * sm / (n * n);
190 for (ip = 0; ip < n - 1; ip++) {
191 for (iq = ip + 1; iq < n; iq++) {
192 g = 100.0 * fabs(a[ip][iq]);
193 if (i > 4 && fabs(d[ip]) + g == fabs(d[ip]) && fabs(d[iq]) + g
196 else if (fabs(a[ip][iq]) > tresh) {
198 if (fabs(h) + g == fabs(h))
201 theta = 0.5 * h / (a[ip][iq]);
202 t = 1.0 / (fabs(theta) + sqrt(1.0 + theta * theta));
206 c = 1.0 / sqrt(1 + t * t);
215 for (j = 0; j < ip; j++) {
218 for (j = ip + 1; j < iq; j++) {
221 for (j = iq + 1; j < n; j++) {
224 for (j = 0; j < n; j++) {
231 for (ip = 0; ip < n; ip++) {
238 throw(utility::excn::EXCN_BadInput(
239 " too many iterations in Jacobi when compute RDC tensor"));
245 Size frag_len = f->get_length();
246 empty_map->set_score_component(total_score,
id_ + frag_len - frag_len);