35 #include <basic/datacache/BasicDataCache.hh>
36 #include <basic/prof.hh>
39 #include <utility/exit.hh>
44 #include <utility/vector1.hh>
45 #include <ObjexxFCL/FArray1D.hh>
86 for (
Size i=1; i<= natoms; ++i ) {
102 for (
Size i=1; i<= src_size; ++i ) {
126 for (
Size i=1; i<= nres; ++i ) {
160 for (
Size i=1; i<= nrot; ++i ) {
182 for (
int atm1 = 1, atm1e = rsd1.
natoms(); atm1 <= atm1e; ++atm1 ) {
185 for (
int atm2 = 1, atm2e = rsd2.
natoms(); atm2 <= atm2e; ++atm2 ) {
190 for (
int atm1 = 1, atm1e = rsd1.
natoms(); atm1 <= atm1e; ++atm1 ) {
191 Real const rad1 = atm_radii1[ atm1 ];
193 Real const inv_r1 = 1.0/rwork1;
196 for (
int atm2 = 1, atm2e = rsd2.
natoms(); atm2 <= atm2e; ++atm2 ) {
197 Real const rwork2 = atm_radii2[ atm2 ];
198 Real const dis2( xyz1.distance_squared( rsd2.
xyz( atm2 ) ) );
199 Real const dis = std::sqrt(dis2);
200 Real const inv_dis = 1.0/(dis+1.0e-6);
201 Real const rwork2_sq = rwork2*rwork2;
203 if ( same_res && (atm1 == atm2) )
continue;
205 if ( dis > (3.5 * rwork2) ) {
206 Real const inv_dis2 = inv_dis * inv_dis;
207 Real const tmpsd = rwork2_sq * inv_dis2;
209 gb1.
born_radius( atm1 ) -= rwork2_sq*rwork2*inv_dis2*inv_dis2*dumbo;
211 }
else if ( dis > (rwork1 + rwork2)) {
212 gb1.
born_radius( atm1 ) -= (0.5*(rwork2/(dis2 - rwork2_sq) +
213 0.5*inv_dis*std::log((dis-rwork2)/(dis+rwork2))));
215 }
else if ( dis > std::abs( rwork1 - rwork2 ) ) {
216 Real const theta = 0.5*inv_r1*inv_dis*(dis2+rwork1*rwork1 - rwork2_sq);
217 Real const U12 = 1.0/(dis+rwork2);
218 gb1.
born_radius( atm1 ) -= 0.25*(inv_r1 * (2.0-theta) - U12 + inv_dis*std::log(rwork1*U12));
220 }
else if ( rwork1 < rwork2 ) {
221 gb1.
born_radius( atm1 ) -= 0.5*(rwork2/(dis2-rwork2_sq) + 2.0*inv_r1 +
222 0.5*inv_dis*std::log( (rwork2-dis)/(rwork2+dis)));
238 for (
Size atm=1; atm<= gb_info.
size(); ++atm ) {
242 Real const integral = (-1.0)*factor*br_save;
243 Real const inv_brad = (1.0/factor) - std::tanh( (
ParamD -
ParamB*integral +
244 ParamG*integral*integral)*integral)/radius;
259 PROF_START( basic::GB_GET_ALL_BORN_RADII );
279 gb_info->initialize( pose );
283 for (
Size res1 = 1; res1 <= nres; ++res1 ) {
286 assert( std::abs( gb1.born_radius(1) ) < 1e-3 );
287 for (
Size res2 = 1; res2 <= nres; ++res2 ) {
294 for (
Size res1 = 1; res1 <= nres; ++res1 ) {
300 PROF_STOP( basic::GB_GET_ALL_BORN_RADII );
318 PROF_START( basic::GB_SETUP_FOR_PACKING );
330 gb_info->initialize( pose );
333 gb_info->set_repack_list( repacking_residues );
341 PROF_STOP( basic::GB_SETUP_FOR_PACKING );
358 for (
Size i=1; i<= nres; ++i ) {
362 if ( existing_rsd.is_protein() ) {
365 if ( existing_rsd.is_lower_terminus() ) {
366 protein_placeholder_residue_type =
367 &(residue_set.get_residue_type_with_variant_added( *protein_placeholder_residue_type,
370 if ( existing_rsd.is_upper_terminus() ) {
371 protein_placeholder_residue_type =
372 &(residue_set.get_residue_type_with_variant_added( *protein_placeholder_residue_type,
381 Size const dummy_index( rsd->atom_index(
"DUMM") );
383 rsd_info->scale_factor ( dummy_index ) =
dummy_scale;
386 assert( std::abs( rsd->xyz(
"CA").distance( rsd->xyz( dummy_index )) -
dummy_distance ) < 1e-2 );
390 std::cout <<
"WARNING: no mechanism for building genborn placeholders at non-protein positions\n" <<
391 "Using existing residue coords" << std::endl;
411 assert( gb_info.
size() == nres );
413 for (
Size i=1; i<= nres; ++i ) {
417 assert( rsd1.natoms()<1 || std::abs( gb1.born_radius(1) ) < 1e-3 );
418 for (
Size j=1; j<= nres; ++j ) {
429 for (
Size i=1; i<= nres; ++i ) {
451 gb.initialize( rsd );
518 using namespace etable::count_pair;
520 int natoms1 = rsd1.
natoms();
521 int natoms2 = rsd2.
natoms();
523 Real const inv_Ep = 1.0/
Ep;
525 bool const same_res = ( rsd1.
seqpos() == rsd2.
seqpos() );
529 cpfxn = CountPairFactory::create_intrares_count_pair_function( rsd1,
CP_CROSSOVER_3 );
536 cpfxn = CountPairFactory::create_count_pair_function( rsd1, rsd2,
CP_CROSSOVER_3 );
540 for (
int atm1 = 1; atm1 <= natoms1; ++atm1 ) {
543 if( std::fabs( q1 ) < 0.00001 )
continue;
549 for (
int atm2 = 1; atm2 <= natoms2; ++atm2 ) {
551 if( std::fabs( q2 ) < 0.0001 )
continue;
555 Real const dis2( xyz1.distance_squared( rsd2.
xyz( atm2 ) ) );
556 Real const exparg = (-dis2)/(4.0 * brad1 * brad2 );
557 Real const denom = std::sqrt( dis2 + brad1 * brad2 * std::exp( exparg ) );
561 this_intx = (-166.0)*tau*q1*q2/denom;
563 this_intx = (-332.0)*tau*q1*q2/denom;
571 if ( !cpfxn || cpfxn->count( atm1, atm2, weight, path_dist ) ) {
573 Real const dis = std::sqrt( dis2 );
575 this_intx = 166.0 *
gb_shell_intxn( inv_Ep * q1, r1, q2, r2, dis);
576 if (!same_res) this_intx *= 2.0;
606 if (dist >= (rai+rbi))
607 return (qai * qbi /dist);
628 if (((ra+rb) > dist) && (dist > (rb - ra))) {
631 fout = 0.5 * (1.0+0.5*dist/ra);
633 fout = 0.5*(1.0 + 0.5*(ra*ra - rb*rb)/(ra*dist) + 0.5*dist/ra);
635 Real fin = 1.0 - fout;
636 return qa*qb*(fin/rb + fout*2.0/(dist+ra+rb));
653 if (dist >= (rai+rbi))
654 return (-1.0 * qai * qbi / ( dist * dist ) );
676 if (((ra+rb) > dist) && (dist > (rb - ra))) {
680 fout = 0.5 * (1.0+0.5*dist/ra);
683 fout = 0.5*(1.0 + 0.5*(ra*ra - rb*rb)/(ra*dist) + 0.5*dist/ra);
684 dfout = 0.25*(rb*rb - ra*ra)/(ra*dist*dist) + 0.25/ra;
686 Real dfin = -1.0*dfout;
687 return qa*qb*(dfin/rb -
688 2.0*fout/( (dist+ra+rb)*(dist+ra+rb) ) +
689 2.0*dfout/( dist + ra + rb ) );
703 bool const exclude_DNA_DNA,
708 using namespace etable::count_pair;
711 Size const i(
id.rsd() ), ii(
id.atomno() );
721 int const i_map( domain_map( i ) );
722 bool const i_fixed( i_map != 0 );
724 Vector const & xyzi( rsd1.xyz( ii ) );
730 Real const q1 = rsd1.atomic_charge( ii );
731 Real const b1 = gb1.born_radius( ii );
733 for (
Size j=1; j<= nres; ++j ) {
735 if ( i_fixed && domain_map( j ) == i_map )
continue;
736 if ( exclude_DNA_DNA && rsd1.is_DNA() && rsd2.is_DNA() )
continue;
742 cpfxn = CountPairFactory::create_intrares_count_pair_function( rsd1,
CP_CROSSOVER_3 );
743 }
else if ( rsd1.is_bonded( rsd2 ) || rsd1.is_pseudo_bonded( rsd2 ) ) {
744 cpfxn = CountPairFactory::create_count_pair_function( rsd1, rsd2,
CP_CROSSOVER_3 );
748 for (
Size jj=1, jj_end=rsd2.natoms(); jj<= jj_end; ++jj ) {
751 if ( cpfxn && !cpfxn->count( ii, jj, cp_weight, path_dist ) )
continue;
754 assert( j != i || jj != ii );
756 Vector const & xyzj( rsd2.xyz(jj) );
757 Vector const f2( xyzi - xyzj );
759 Real const dis2( f2.length_squared() );
760 Real const dis = std::sqrt( dis2 );
763 Real const q2 = rsd2.atomic_charge( jj );
764 Real const b2 = gb2.born_radius( jj );
766 Real const exparg = (-dis2)/(4.0*b1*b2);
767 Real const expon = std::exp( exparg );
768 Real const denom = 1.0 / ( std::sqrt( dis2 + b1*b2*expon ) );
769 Real const deriv_denom = denom * denom * denom;
772 ( +166.0*tau*q1*q2*dis * ( 2.0 - 0.5*expon ) * deriv_denom );
774 Real const r1( gb1.atomic_radius(ii) );
775 Real const r2( gb2.atomic_radius(jj) );
779 dE_dR += 332.0*dE_dR_coul/
Ep;
784 Real const factor( weight * dE_dR / dis );
785 Vector const f1( xyzi.cross( xyzj ) );