Rosetta 3.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
DDomainParse.cc
Go to the documentation of this file.
1 // -*- mode:c++;tab-width:2;indent-tabs-mode:t;show-trailing-whitespace:t;rm-trailing-spaces:t -*-
2 // vi: set ts=2 noet:
3 //
4 // (c) Copyright Rosetta Commons Member Institutions.
5 // (c) This file is part of the Rosetta software suite and is made available under license.
6 // (c) The Rosetta software is developed by the contributing members of the Rosetta Commons.
7 // (c) For more information, see http://www.rosettacommons.org. Questions about this can be
8 // (c) addressed to University of Washington UW TechTransfer, email: license@u.washington.edu.
9 
10 /// @file
11 /// @brief A reimplementation of DDomain domain parsing algorithm, Protein Sci.16,947--955 (2007)
12 /// @author Frank DiMaio
13 
15 
16 #include <core/pose/Pose.hh>
19 
21 #include <core/kinematics/Jump.hh>
22 #include <core/kinematics/Edge.hh>
23 #include <core/types.hh>
24 
32 #include <core/pose/PDBInfo.hh>
33 
34 // symmetry
41 
42 #include <list>
43 
44 namespace protocols {
45 //namespace comparative_modeling {
46 namespace hybridization {
47 
48 // parameters
49 //const core::Real DDomainParse::pcut_ = 0.81;
50 //const core::Real DDomainParse::hcut_ = 0.18;
51 //const core::Real DDomainParse::length_ = 38;
52 
53 void
54 DDomainParse::pulldomain( int isize0, int ist, int ilast, utility::vector1< core::Real > &resect, int &idip) {
55  idip = 1;
56 
57  utility::vector1< int> maxe1(mseq_), maxe2(mseq_);
58  core::Real /*tmp0 = -100.0,*/ tmp10 = 100.0, tmp20 = 100.0;
59  //int ikp = 1;
60  //int i0 = 0, idip0 = 1, kk1 = 0, kk2 = 0;
61 
62  for (int i=isize0; i<=ilast-isize0; ++i) {
63  core::Real tmp = resect[i];
64 
65  maxe1[i] = i;
66  core::Real tmp1 = tmp;
67  for (int j=ist; j<=i; ++j) {
68  core::Real tmp2 = resect[j];
69  if (tmp2 > tmp1) {
70  tmp1 = tmp2;
71  maxe1[i] = j;
72  }
73  }
74  maxe2[i] = i;
75  tmp1 = tmp;
76  for (int j=i; j<=ilast-1; ++j) {
77  core::Real tmp2 = resect[j];
78  if (tmp2 > tmp1) {
79  tmp1 = tmp2;
80  maxe2[i] = j;
81  }
82  }
83 
84  core::Size k1 = 0;
85  for (int k=maxe1[i]; k<=i; ++k) {
86  core::Real de1 = resect[k] - tmp;
87  if (de1 > hcut_)
88  k1++;
89  else
90  break;
91  }
92  for (int k=maxe1[i]; k>=ist; --k) {
93  core::Real de1 = resect[k] - tmp;
94  if (de1 > hcut_)
95  k1++;
96  else
97  break;
98  }
99 
100  core::Size k2 = 0;
101  for (int k=maxe2[i]; k<=ilast; ++k) {
102  core::Real de1 = resect[k] - tmp;
103  if (de1 > hcut_)
104  k2++;
105  else
106  break;
107 
108  }
109  for (int k=maxe2[i]; k>=i; --k) {
110  core::Real de1 = resect[k] - tmp;
111  if (de1 > hcut_)
112  k2++;
113  else
114  break;
115  }
116 
117 
118  core::Real de1 = resect[maxe1[i]] - tmp;
119  core::Real de2 = resect[maxe2[i]] - tmp;
120 
121  if (tmp < tmp20 && de1 > hcut_ && de2 > hcut_) {
122  //ikp = i; // set but never used ~Labonte
123  tmp20 = tmp;
124  }
125  if ((k1 > length_ && k2 > length_)) {
126  if (tmp < tmp10) {
127  tmp10 = tmp;
128  idip = i;
129  //kk1 = k1; // set but never used ~Labonte
130  //kk2 = k2; // set but never used ~Labonte
131  }
132  }
133  }
134 
135 
136  if (resect[idip] > pcut_) {
137  idip = ist;
138  }
139 
140  int i1 = idip;
141  int i2 = ilast - idip;
142  if (i1 > isize0 && i2 > isize0) {
143  // do nothing
144  } else {
145  idip = ist;
146  }
147 }
148 
149 
150 void
152  int, int ndom, int id,
153  utility::vector1<int> &ipdom, int &ist, int &ilast)
154 {
155  if (ndom > 1) {
156  if (id == 1) {
157  ist = 1;
158  ilast = ipdom[id];
159  } else if (id == ndom) {
160  ist = ipdom[id - 1] + 1;
161  ilast = nseq_;
162  } else {
163  ist = ipdom[id - 1] + 1;
164  ilast = ipdom[id];
165  }
166  }
167 }
168 
169 void
171  int ist, int ilast, int imid, int i,
172  int &ista, int &ilasta)
173 {
174  if (i == 1) {
175  ista = ist;
176  ilasta = imid;
177  } else {
178  ista = imid + 1;
179  ilasta = ilast;
180  }
181 }
182 
183 void
185  int const& mdom,
186  int const& ipdd,
187  utility::vector1<int> &ipdom)
188 {
189  int imin = 0, ip = 0;
190  utility::vector1<int> ifg_min(mdom, 0);
191  utility::vector1<int> itmp(mdom, 0);
192 
193  for (int id=1; id<=ipdd; ++id) {
194  imin = 100000;
195  for (int i=1; i<=ipdd; ++i) {
196  if (ifg_min[i] == 0) {
197  if (ipdom[i] < imin) {
198  imin = ipdom[i];
199  ip = i;
200  }
201  }
202  }
203  ifg_min[ip] = 1;
204  itmp[id] = imin;
205  }
206  for (int i=1; i<=ipdd; ++i) {
207  ipdom[i] = itmp[i];
208  }
209 }
210 
211 
212 void
214  int ist, int ilast,
217 {
219 
220  for (int i=ist; i<=ilast-1; ++i) {
221  for (int j=i+1; j<=ilast; ++j) {
222  dij[i][j] = dij[j][i] = xs[i].distance( xs[j] );
223  }
224  }
225 }
226 
227 void
229  core::Real pw, int ist, int ilast,
232 {
233  resect.resize(mseq_);
234 
235  core::Real ave = 0.0, rcut = 6.5, /*ect = 0,*/ dr = 0;
236  int ipt1 = 0, ipt2 = 0;
237  for (int k=ist; k<=ilast - 1; ++k) {
238  core::Real ect = 0.0;
239  for (int i=ist; i<=k; ++i) {
240  for (int j=k+1; j<=ilast; ++j) {
241  dr = dij[i][j];
242  if (dr < rcut)
243  ect -= 1.0;
244  }
245  }
246  ipt1 = k - ist + 1;
247  ipt2 = (ilast - 1) - k + 1;
248 
249  ect /= std::pow((ipt1 * ipt2), pw);
250  resect[k] = ect;
251  ave += ect;
252  }
253  core::Real tmp = ave / ((ilast - ist + 1) - 1);
254  for (int k=ist; k<=ilast - 1; ++k) {
255  resect[k] /= tmp;
256  }
257 }
258 
261  runtime_assert( nres >= templ.total_residue() );
262 
264 
265  std::string fname;
266  mseq_ = templ.total_residue();
267  nseq_ = templ.total_residue();
268 
269  utility::vector1<int> ipdom(mseq_,0);
273 
274  // grab "centroid" from pose
275  // use same definition as DDomain
276  for (core::Size i=1; i<=mseq_; ++i) {
277  core::conformation::Residue const &rsd_i = templ.residue(i);
278  core::Size nsc=0;
279  if (rsd_i.aa() == core::chemical::aa_gly) {
280  xs[i] = rsd_i.atom(2).xyz();
281  nsc++;
282  }
283  for (int j=rsd_i.first_sidechain_atom(); j<=(int)rsd_i.nheavyatoms(); ++j) {
284  if (rsd_i.aa() == core::chemical::aa_pro && j==(int)rsd_i.nheavyatoms()) continue;
285  xs[i] += rsd_i.atom(j).xyz();
286  nsc++;
287  }
288  xs[i] /= nsc;
289  }
290 
291  const int mdom = 20; // maximum domains
292 
293  core::Real pw = 0.43f;
294  int isize0 = 40;
295  int ist=1, ilast=nseq_, ndom=1, idom=1, ipdd=0, ifg_dom=0;
296  int imid=0, istx=0, ilastx=0, imidx=0;
297 
298  bool done=false;
299 
300  while (!done) {
301  done = true;
302  for (int id=1; id <= ndom; ++id) {
303  findpos(mdom, ndom, id, ipdom, ist, ilast);
304  distance(ist, ilast, xs, dij);
305  ddomain_pot(pw, ist, ilast, dij, resect);
306  pulldomain(isize0, ist, ilast, resect, imid);
307 
308  if (imid > ist && imid < ilast) {
309  idom++;
310  if (idom > mdom) {
311  std::cerr << "DDomainParse::split(): idom > mdom [1]";
312  ifg_dom = 0;
313  break;
314  }
315  ipdd++;
316  ipdom[ipdd] = imid;
317  ifg_dom = 1;
318 
319  for (int i=1; i<=2; ++i) {
320  findpos2(ist, ilast, imid, i, istx, ilastx);
321  if (ilastx - istx >= isize0) {
322  distance(istx, ilastx, xs, dij);
323  ddomain_pot(pw, istx, ilastx, dij, resect);
324  pulldomain(isize0, istx, ilastx, resect, imidx);
325  if (imidx > istx && imidx < ilastx) {
326  idom++;
327  if (idom > mdom) {
328  std::cerr << "DDomainParse::split(): idom > mdom [2]";
329  ifg_dom = 0;
330  break;
331  }
332  ipdd++;
333  ipdom[ipdd] = imidx;
334  ifg_dom = 1;
335  }
336  }
337  }
338  }
339  }
340 
341  if (ifg_dom == 1) {
342  ndom = idom;
343  ifg_dom = 0;
344  small_big(mdom, ipdd, ipdom);
345  done=false;
346  }
347  }
348 
349  for (int i=1; i<=ndom; ++i) {
350  if (ndom == 1) {
351  loops::Loops newloops;
352  newloops.add_loop( 1, nseq_ );
353  retval.push_back( newloops );
354  }
355  else {
356  if (i == 1) {
357  loops::Loops newloops;
358  newloops.add_loop( 1, ipdom[i] );
359  retval.push_back( newloops );
360  }
361  else if (i == ndom) {
362  loops::Loops newloops;
363  newloops.add_loop( ipdom[i-1]+1, nseq_ );
364  retval.push_back( newloops );
365  }
366  else {
367  loops::Loops newloops;
368  newloops.add_loop( ipdom[i-1]+1, ipdom[i] );
369  retval.push_back( newloops );
370  }
371  }
372  }
373 
374  return retval;
375 }
376 
377 } // hybridize
378 //} // comparative_modeling
379 } // protocols