34 #include <basic/interpolate.hh>
38 #include <numeric/constants.hh>
39 #include <numeric/angle.functions.hh>
40 #include <numeric/random/random.hh>
56 #include <basic/Tracer.hh>
57 #include <basic/basic.hh>
60 #include <utility/vector1.hh>
66 static basic::Tracer
TR(
"core.pack.dunbrack");
103 assert( dxp >= 0 && dxp < 1.0 );
104 assert( dyp >= 0 && dyp < 1.0 );
107 Real binwx_over6 = binwx/6;
108 Real binwy_over6 = binwy/6;
109 Real dx3p = ( dxp*dxp*dxp - dxp) * binwx*binwx_over6;
110 Real dx3m = ( dxm*dxm*dxm - dxm) * binwx*binwx_over6;
111 Real dy3p = ( dyp*dyp*dyp - dyp) * binwy*binwy_over6;
112 Real dy3m = ( dym*dym*dym - dym) * binwy*binwy_over6;
113 Real invbinwx = 1/binwx;
114 Real invbinwy = 1/binwy;
126 dxm * ( dym * v00 + dyp * v01 )
127 + dxp * ( dym * v10 + dyp * v11 )
128 +dx3m * ( dym * d2dx200 + dyp * d2dx201 )
129 +dx3p * ( dym * d2dx210 + dyp * d2dx211 )
130 + dxm * ( dy3m * d2dy200 + dy3p * d2dy201 )
131 + dxp * ( dy3m * d2dy210 + dy3p * d2dy211 )
132 +dx3m * ( dy3m * d4dx2y200 + dy3p * d4dx2y201 )
133 +dx3p * ( dy3m * d4dx2y210 + dy3p * d4dx2y211 );
145 -( dym * v00 + dyp * v01 ) * invbinwx
146 +( dym * v10 + dyp * v11 ) * invbinwx
147 - ( 3 * dxm * dxm - 1) * binwx_over6 *( dym * d2dx200 + dyp * d2dx201 )
148 + ( 3 * dxp * dxp - 1) * binwx_over6 *( dym * d2dx210 + dyp * d2dx211 )
149 -( dy3m * d2dy200 + dy3p * d2dy201 ) * invbinwx
150 +( dy3m * d2dy210 + dy3p * d2dy211 ) * invbinwx
151 - ( 3 * dxm * dxm - 1) * binwx_over6 *( dy3m * d4dx2y200 + dy3p * d4dx2y201 )
152 + ( 3 * dxp * dxp - 1) * binwx_over6 *( dy3m * d4dx2y210 + dy3p * d4dx2y211 );
165 dxm *( -v00 + v01 ) * invbinwy
166 + dxp *( -v10 + v11 ) * invbinwy
167 +dx3m *( -d2dx200 + d2dx201) * invbinwy
168 +dx3p *( -d2dx210 + d2dx211) * invbinwy
169 + dxm *( -( 3 * dym * dym - 1) * d2dy200 + ( 3 * dyp * dyp - 1) * d2dy201 ) * binwy_over6
170 + dxp *( -( 3 * dym * dym - 1) * d2dy210 + ( 3 * dyp * dyp - 1) * d2dy211 ) * binwy_over6
171 +dx3m *( -( 3 * dym * dym - 1) * d4dx2y200 + ( 3 * dyp * dyp - 1) * d4dx2y201 ) * binwy_over6
172 +dx3p *( -( 3 * dym * dym - 1) * d4dx2y210 + ( 3 * dyp * dyp - 1) * d4dx2y211 ) * binwy_over6;
196 Real const invbinwx(1/binwx), invbinwy(1/binwy), invbinwz(1/binwz);
197 Real const binwx_over_6(binwx/6), binwy_over_6(binwy/6), binwz_over_6(binwz/6);
198 Real const dxm( 1-dxp), dym(1-dyp), dzm(1-dzp);
200 Real const dx3p( ( dxp * dxp * dxp - dxp) * binwx * binwx_over_6 );
201 Real const dx3m( ( dxm * dxm * dxm - dxm) * binwx * binwx_over_6 );
202 Real const dy3p( ( dyp * dyp * dyp - dyp) * binwy * binwy_over_6 );
203 Real const dy3m( ( dym * dym * dym - dym) * binwy * binwy_over_6 );
204 Real const dz3p( ( dzp * dzp * dzp - dzp) * binwz * binwz_over_6 );
205 Real const dz3m( ( dzm * dzm * dzm - dzm) * binwz * binwz_over_6 );
209 *(dxm*(dym*v000+dyp*v010)
210 +dxp*(dym*v100+dyp*v110)
211 +dx3m*(dym*dvdx000+dyp*dvdx010)
212 +dx3p*(dym*dvdx100+dyp*dvdx110)
213 +dxm*(dy3m*dvdy000+dy3p*dvdy010)
214 +dxp*(dy3m*dvdy100+dy3p*dvdy110)
215 +dx3m*(dy3m*dvdxy000+dy3p*dvdxy010)
216 +dx3p*(dy3m*dvdxy100+dy3p*dvdxy110))
219 *(dxm*(dym*v001+dyp*v011)
220 +dxp*(dym*v101+dyp*v111)
221 +dx3m*(dym*dvdx001+dyp*dvdx011)
222 +dx3p*(dym*dvdx101+dyp*dvdx111)
223 +dxm*(dy3m*dvdy001+dy3p*dvdy011)
224 +dxp*(dy3m*dvdy101+dy3p*dvdy111)
225 +dx3m*(dy3m*dvdxy001+dy3p*dvdxy011)
226 +dx3p*(dy3m*dvdxy101+dy3p*dvdxy111))
229 *(dxm*(dym*dvdz000+dyp*dvdz010)
230 +dxp*(dym*dvdz100+dyp*dvdz110)
231 +dx3m*(dym*dvdxz000+dyp*dvdxz010)
232 +dx3p*(dym*dvdxz100+dyp*dvdxz110)
233 +dxm*(dy3m*dvdyz000+dy3p*dvdyz010)
234 +dxp*(dy3m*dvdyz100+dy3p*dvdyz110)
235 +dx3m*(dy3m*dvdxyz000+dy3p*dvdxyz010)
236 +dx3p*(dy3m*dvdxyz100+dy3p*dvdxyz110))
239 *(dxm*(dym*dvdz001+dyp*dvdz011)
240 +dxp*(dym*dvdz101+dyp*dvdz111)
241 +dx3m*(dym*dvdxz001+dyp*dvdxz011)
242 +dx3p*(dym*dvdxz101+dyp*dvdxz111)
243 +dxm*(dy3m*dvdyz001+dy3p*dvdyz011)
244 +dxp*(dy3m*dvdyz101+dy3p*dvdyz111)
245 +dx3m*(dy3m*dvdxyz001+dy3p*dvdxyz011)
246 +dx3p*(dy3m*dvdxyz101+dy3p*dvdxyz111));
251 -(dym*v000+dyp*v010)*invbinwx
252 +(dym*v100+dyp*v110)*invbinwx
253 -(3*dxm*dxm-1)*binwx_over_6*(dym*dvdx000+dyp*dvdx010)
254 +(3*dxp*dxp-1)*binwx_over_6*(dym*dvdx100+dyp*dvdx110)
255 -(dy3m*dvdy000+dy3p*dvdy010)*invbinwx
256 +(dy3m*dvdy100+dy3p*dvdy110)*invbinwx
257 -(3*dxm*dxm-1)*binwx_over_6*(dy3m*dvdxy000+dy3p*dvdxy010)
258 +(3*dxp*dxp-1)*binwx_over_6*(dy3m*dvdxy100+dy3p*dvdxy110)
263 -(dym*v001+dyp*v011)*invbinwx
264 +(dym*v101+dyp*v111)*invbinwx
265 -(3*dxm*dxm-1)*binwx_over_6*(dym*dvdx001+dyp*dvdx011)
266 +(3*dxp*dxp-1)*binwx_over_6*(dym*dvdx101+dyp*dvdx111)
267 -(dy3m*dvdy001+dy3p*dvdy011)*invbinwx
268 +(dy3m*dvdy101+dy3p*dvdy111)*invbinwx
269 -(3*dxm*dxm-1)*binwx_over_6*(dy3m*dvdxy001+dy3p*dvdxy011)
270 +(3*dxp*dxp-1)*binwx_over_6*(dy3m*dvdxy101+dy3p*dvdxy111)
275 -(dym*dvdz000+dyp*dvdz010)*invbinwx
276 +(dym*dvdz100+dyp*dvdz110)*invbinwx
277 -(3*dxm*dxm-1)*binwx_over_6*(dym*dvdxz000+dyp*dvdxz010)
278 +(3*dxp*dxp-1)*binwx_over_6*(dym*dvdxz100+dyp*dvdxz110)
279 -(dy3m*dvdyz000+dy3p*dvdyz010)*invbinwx
280 +(dy3m*dvdyz100+dy3p*dvdyz110)*invbinwx
281 -(3*dxm*dxm-1)*binwx_over_6*(dy3m*dvdxyz000+dy3p*dvdxyz010)
282 +(3*dxp*dxp-1)*binwx_over_6*(dy3m*dvdxyz100+dy3p*dvdxyz110)
287 -(dym*dvdz001+dyp*dvdz011)*invbinwx
288 +(dym*dvdz101+dyp*dvdz111)*invbinwx
289 -(3*dxm*dxm-1)*binwx_over_6*(dym*dvdxz001+dyp*dvdxz011)
290 +(3*dxp*dxp-1)*binwx_over_6*(dym*dvdxz101+dyp*dvdxz111)
291 -(dy3m*dvdyz001+dy3p*dvdyz011)*invbinwx
292 +(dy3m*dvdyz101+dy3p*dvdyz111)*invbinwx
293 -(3*dxm*dxm-1)*binwx_over_6*(dy3m*dvdxyz001+dy3p*dvdxyz011)
294 +(3*dxp*dxp-1)*binwx_over_6*(dy3m*dvdxyz101+dy3p*dvdxyz111));
299 dxm*(-v000+v010)*invbinwy
300 +dxp*(-v100+v110)*invbinwy
301 +dx3m*(-dvdx000+dvdx010)*invbinwy
302 +dx3p*(-dvdx100+dvdx110)*invbinwy
303 +dxm*(-(3*dym*dym-1)*dvdy000+(3*dyp*dyp-1)*dvdy010)*binwy_over_6
304 +dxp*(-(3*dym*dym-1)*dvdy100+(3*dyp*dyp-1)*dvdy110)*binwy_over_6
305 +dx3m*(-(3*dym*dym-1)*dvdxy000+(3*dyp*dyp-1)*dvdxy010)*binwy_over_6
306 +dx3p*(-(3*dym*dym-1)*dvdxy100+(3*dyp*dyp-1)*dvdxy110)*binwy_over_6
311 dxm*(-v001+v011)*invbinwy
312 +dxp*(-v101+v111)*invbinwy
313 +dx3m*(-dvdx001+dvdx011)*invbinwy
314 +dx3p*(-dvdx101+dvdx111)*invbinwy
315 +dxm*(-(3*dym*dym-1)*dvdy001+(3*dyp*dyp-1)*dvdy011)*binwy_over_6
316 +dxp*(-(3*dym*dym-1)*dvdy101+(3*dyp*dyp-1)*dvdy111)*binwy_over_6
317 +dx3m*(-(3*dym*dym-1)*dvdxy001+(3*dyp*dyp-1)*dvdxy011)*binwy_over_6
318 +dx3p*(-(3*dym*dym-1)*dvdxy101+(3*dyp*dyp-1)*dvdxy111)*binwy_over_6
323 dxm*(-dvdz000+dvdz010)*invbinwy
324 +dxp*(-dvdz100+dvdz110)*invbinwy
325 +dx3m*(-dvdxz000+dvdxz010)*invbinwy
326 +dx3p*(-dvdxz100+dvdxz110)*invbinwy
327 +dxm*(-(3*dym*dym-1)*dvdyz000+(3*dyp*dyp-1)*dvdyz010)*binwy_over_6
328 +dxp*(-(3*dym*dym-1)*dvdyz100+(3*dyp*dyp-1)*dvdyz110)*binwy_over_6
329 +dx3m*(-(3*dym*dym-1)*dvdxyz000+(3*dyp*dyp-1)*dvdxyz010)*binwy_over_6
330 +dx3p*(-(3*dym*dym-1)*dvdxyz100+(3*dyp*dyp-1)*dvdxyz110)*binwy_over_6
335 dxm*(-dvdz001+dvdz011)*invbinwy
336 +dxp*(-dvdz101+dvdz111)*invbinwy
337 +dx3m*(-dvdxz001+dvdxz011)*invbinwy
338 +dx3p*(-dvdxz101+dvdxz111)*invbinwy
339 +dxm*(-(3*dym*dym-1)*dvdyz001+(3*dyp*dyp-1)*dvdyz011)*binwy_over_6
340 +dxp*(-(3*dym*dym-1)*dvdyz101+(3*dyp*dyp-1)*dvdyz111)*binwy_over_6
341 +dx3m*(-(3*dym*dym-1)*dvdxyz001+(3*dyp*dyp-1)*dvdxyz011)*binwy_over_6
342 +dx3p*(-(3*dym*dym-1)*dvdxyz101+(3*dyp*dyp-1)*dvdxyz111)*binwy_over_6);
345 -(dxm*(dym*v000+dyp*v010)
346 +dxp*(dym*v100+dyp*v110)
347 +dx3m*(dym*dvdx000+dyp*dvdx010)
348 +dx3p*(dym*dvdx100+dyp*dvdx110)
349 +dxm*(dy3m*dvdy000+dy3p*dvdy010)
350 +dxp*(dy3m*dvdy100+dy3p*dvdy110)
351 +dx3m*(dy3m*dvdxy000+dy3p*dvdxy010)
352 +dx3p*(dy3m*dvdxy100+dy3p*dvdxy110))
355 +(dxm*(dym*v001+dyp*v011)
356 +dxp*(dym*v101+dyp*v111)
357 +dx3m*(dym*dvdx001+dyp*dvdx011)
358 +dx3p*(dym*dvdx101+dyp*dvdx111)
359 +dxm*(dy3m*dvdy001+dy3p*dvdy011)
360 +dxp*(dy3m*dvdy101+dy3p*dvdy111)
361 +dx3m*(dy3m*dvdxy001+dy3p*dvdxy011)
362 +dx3p*(dy3m*dvdxy101+dy3p*dvdxy111))
365 -(3*dzm*dzm-1)*binwz_over_6
366 *(dxm*(dym*dvdz000+dyp*dvdz010)
367 +dxp*(dym*dvdz100+dyp*dvdz110)
368 +dx3m*(dym*dvdxz000+dyp*dvdxz010)
369 +dx3p*(dym*dvdxz100+dyp*dvdxz110)
370 +dxm*(dy3m*dvdyz000+dy3p*dvdyz010)
371 +dxp*(dy3m*dvdyz100+dy3p*dvdyz110)
372 +dx3m*(dy3m*dvdxyz000+dy3p*dvdxyz010)
373 +dx3p*(dy3m*dvdxyz100+dy3p*dvdxyz110))
375 +(3*dzp*dzp-1)*binwz_over_6
376 *(dxm*(dym*dvdz001+dyp*dvdz011)
377 +dxp*(dym*dvdz101+dyp*dvdz111)
378 +dx3m*(dym*dvdxz001+dyp*dvdxz011)
379 +dx3p*(dym*dvdxz101+dyp*dvdxz111)
380 +dxm*(dy3m*dvdyz001+dy3p*dvdyz011)
381 +dxp*(dy3m*dvdyz101+dy3p*dvdyz111)
382 +dx3m*(dy3m*dvdxyz001+dy3p*dvdxyz011)
383 +dx3p*(dy3m*dvdxyz101+dy3p*dvdxyz111));
399 using basic::interpolate_bilinear_by_value;
403 for (
Size i = 1; i <= nchi_aa; ++i ) {
406 Real interpolated_value;
407 interpolate_bilinear_by_value(
408 static_cast< Real > (rot00.
chi_mean(i)),
409 static_cast< Real > (rot10.
chi_mean(i)),
410 static_cast< Real > (rot01.
chi_mean(i)),
411 static_cast< Real > (rot11.
chi_mean(i)),
412 phi_err, psi_err, binrange,
true ,
413 interpolated_value, tmp1, tmp2 );
415 interpolated_rotamer.
chi_mean( i, interpolated_value );
418 interpolate_bilinear_by_value(
419 static_cast< Real > (rot00.
chi_sd(i)),
420 static_cast< Real > (rot10.
chi_sd(i)),
421 static_cast< Real > (rot01.
chi_sd(i)),
422 static_cast< Real > (rot11.
chi_sd(i)),
423 phi_err, psi_err, binrange,
false ,
424 interpolated_value, tmp1, tmp2 );
426 interpolated_rotamer.
chi_sd( i, interpolated_value );
431 if ( interpolated_rotamer.
chi_sd(i) < 0.0 ) {
432 utility_exit_with_message(
"interpolated_rotamer.chi_sd < 0 in fill_chi_set" );
437 Real interpolated_prob;
438 interpolate_bilinear_by_value(
443 phi_err, psi_err, binrange,
false ,
444 interpolated_prob, tmp1, tmp2 );
459 using namespace pack::task;
471 Size chi_id = concrete_residue->proton_chi_2_chi( proton_chi );
475 Size nsamples = samples.size() * ( 1 + ( include_extra ? extra_samples.size() * 2 : 0 ) );
479 for (
Size ii = 1; ii <= nsamples; ++ii ) {
480 Size offset = (ii-1) * chi_set_vector.size();
481 for (
Size jj = 1; jj <= chi_set_vector.size(); ++jj ) {
488 for (
Size ii = 1; ii <= samples.size(); ++ii ) {
489 Real ii_sample = samples[ ii ];
490 for (
Size jj = 1; jj <= chi_set_vector.size(); ++jj ) {
491 newchi_vect[ count ]->chi[ chi_id ] = ii_sample;
493 if ( include_extra ) {
494 for (
Size kk = 1; kk <= extra_samples.size(); ++kk ) {
495 newchi_vect[ count ]->chi[ chi_id ] = ii_sample + extra_samples[ kk ];
497 newchi_vect[ count ]->chi[ chi_id ] = ii_sample - extra_samples[ kk ];
504 assert( count - 1 == nsamples * chi_set_vector.size() );
505 chi_set_vector = newchi_vect;
518 using namespace pack::task;
527 assert( samples.size() > 0 );
532 Size chi_id = concrete_residue->proton_chi_2_chi( proton_chi );
536 Size nsamples = samples.size() * ( 1 + ( include_extra ? extra_samples.size() * 2 : 0 ) );
537 chi_set_vector.reserve( nsamples * chi_set_vector.size() );
541 Size nr_of_old_elem = chi_set_vector.size();
542 for (
Size jj = 1; jj <= nr_of_old_elem; ++jj ) {
543 for (
Size ii = 1; ii <= samples.size(); ++ii ) {
544 Real ii_sample = samples[ ii ];
546 base_chi_vec = new_chi_vec = chi_set_vector[ jj ];
549 chi_set_vector.push_back( new_chi_vec );
551 new_chi_vec->chi[ chi_id ] = ii_sample;
553 if ( include_extra ) {
554 for (
Size kk = 1; kk <= extra_samples.size(); ++kk ) {
556 new_chi_vec->chi[ chi_id ] = ii_sample + extra_samples[ kk ];
558 new_chi_vec->chi[ chi_id ] = ii_sample - extra_samples[ kk ];
564 assert( chi_set_vector.size() == nsamples * nr_of_old_elem );
570 nrchi_sample_( false ),
573 nrchi_lower_boundary_( 0.0 ),
574 nrchi_upper_boundary_( 0.0 ),
575 nrchi_probability_( 0.0 )
579 nrchi_sample_( is_nrchi_sample ),
582 nrchi_lower_boundary_( 0.0 ),
583 nrchi_upper_boundary_( 0.0 ),
584 nrchi_probability_( 0.0 )
601 assert( chi_index > 0 && chi_index <=
nchi_ );
609 std::copy( rotwell.begin(), rotwell.end(),
rot_well_.begin() );
614 assert( chi_index > 0 && chi_index <=
nchi_ );
620 assert( chi_index > 0 && chi_index <=
nchi_ );
650 numeric::random::RandomGenerator &
RG,
654 assert( chi_angles.size() >=
nchi() );
661 chi_angles[ ii ] = basic::periodic_range(
chi_mean_[ii] + RG.gaussian() *
chi_sd_[ii] * temperature, 360.0 );
667 chi_angles[ ii ] = basic::periodic_range( RG.uniform()*360.0 - 180.0, 360.0 );
677 assert( chi_angles.size() >=
nchi() );
678 Real const norm_gauss( std::sqrt( numeric::constants::r::pi_2 ) );
681 for (
Size ii = 1; ii <=
nchi(); ++ii ) {
689 Real const variance( sd*sd );
690 prob *= std::exp( -(angle_diff*angle_diff)/(2*variance) ) / sd / norm_gauss;
694 for (
Size ii =
nchi()+1; ii <= chi_angles.size(); ++ii ) {