16 #include <ObjexxFCL/format.hh>
17 #include <numeric/xyzMatrix.hh>
25 namespace chemical_shift {
36 if( rsd.
aa()!= rna_cs_rsd_params.
aa() ) utility_exit_with_message(
"rsd.aa()!= rna_cs_rsd_params.aa()!");
40 for (
Size count = 1; count < maxatoms; count++){
51 utility_exit_with_message(
"(ring_ID!=1) && (ring_ID!=2), ring_ID=("+ ObjexxFCL::string_of(ring_ID)+
")!");
56 ring_center+=rsd.
xyz(atom_index);
61 if(atom_count==0) utility_exit_with_message(
"atom_count==0!");
63 ring_center=ring_center/atom_count;
74 Real const ak0 = 1.38629436112;
75 Real const ak1 = 0.09666344259;
76 Real const ak2 = 0.03590092383;
77 Real const ak3 = 0.03742563713;
78 Real const ak4 = 0.01451196212;
79 Real const bk0 = 0.5 ;
80 Real const bk1 = 0.12498593597;
81 Real const bk2 = 0.06880248576;
82 Real const bk3 = 0.03328355346;
83 Real const bk4 = 0.00441787012;
84 Real const mr = 1.0 - m;
85 Real const mr2 = mr * mr;
86 Real const mr3 = mr * mr * mr;
87 Real const mr4 = mr * mr * mr * mr;
89 Real const bd = bk0 + (bk1 * mr) + (bk2 * mr2) + (bk3 * mr3) + (bk4 * mr4);
90 Real const cd = std::log (1.0 / mr);
95 Real const dad_dm = -1.0 * ( ( ak1 + (2 * ak2 * mr) + (3 * ak3 * mr2) + (4 * ak4 * mr3) ) );
96 Real const dbd_dm = -1.0 * ( ( bk1 + (2 * bk2 * mr) + (3 * bk3 * mr2) + (4 * bk4 * mr3) ) );
97 Real const dcd_dm = +1.0 * ( 1.0 / mr );
99 return ( dad_dm + (bd * dcd_dm + dbd_dm * cd) );
108 Real const ae0 = 1.0 ;
109 Real const ae1 = 0.44325141463;
110 Real const ae2 = 0.06260601220;
111 Real const ae3 = 0.04757383546;
112 Real const ae4 = 0.01736506451;
113 Real const be0 = 0.0 ;
114 Real const be1 = 0.24998368310;
115 Real const be2 = 0.09200180037;
116 Real const be3 = 0.04069697526;
117 Real const be4 = 0.00526449639;
118 Real const mr = 1.0 - m;
119 Real const mr2 = mr * mr;
120 Real const mr3 = mr * mr * mr;
121 Real const mr4 = mr * mr * mr * mr;
123 Real const bd = be0 + (be1 * mr) + (be2 * mr2) + (be3 * mr3) + (be4 * mr4);
124 Real const cd = std::log(1.0 / mr);
129 Real const dad_dm = -1.0 * ( ( ae1 + (2 * ae2 * mr) + (3 * ae3 * mr2 ) + (4 * ae4 * mr3) ) );
130 Real const dbd_dm = -1.0 * ( ( be1 + (2 * be2 * mr) + (3 * be3 * mr2 ) + (4 * be4 * mr3) ) );
131 Real const dcd_dm = +1.0 * ( 1.0 / mr );
133 return ( dad_dm + (bd * dcd_dm + dbd_dm * cd) );
145 Real const ak0 = 1.38629436112;
146 Real const ak1 = 0.09666344259;
147 Real const ak2 = 0.03590092383;
148 Real const ak3 = 0.03742563713;
149 Real const ak4 = 0.01451196212;
150 Real const bk0 = 0.5 ;
151 Real const bk1 = 0.12498593597;
152 Real const bk2 = 0.06880248576;
153 Real const bk3 = 0.03328355346;
154 Real const bk4 = 0.00441787012;
155 Real const mr = 1.0 - m;
156 Real const mr2 = mr * mr;
157 Real const mr3 = mr * mr * mr;
158 Real const mr4 = mr * mr * mr * mr;
160 Real const ad = ak0 + (ak1 * mr) + (ak2 * mr2) + (ak3 * mr3) + (ak4 * mr4);
161 Real const bd = bk0 + (bk1 * mr) + (bk2 * mr2) + (bk3 * mr3) + (bk4 * mr4);
162 Real const cd = std::log (1.0 / mr);
164 return ( ad + (bd * cd) );
177 Real const ae0 = 1.0 ;
178 Real const ae1 = 0.44325141463;
179 Real const ae2 = 0.06260601220;
180 Real const ae3 = 0.04757383546;
181 Real const ae4 = 0.01736506451;
182 Real const be0 = 0.0 ;
183 Real const be1 = 0.24998368310;
184 Real const be2 = 0.09200180037;
185 Real const be3 = 0.04069697526;
186 Real const be4 = 0.00526449639;
187 Real const mr = 1.0 - m;
188 Real const mr2 = mr * mr;
189 Real const mr3 = mr * mr * mr;
190 Real const mr4 = mr * mr * mr * mr;
192 Real const ad = ae0 + (ae1 * mr) + (ae2 * mr2) + (ae3 * mr3) + (ae4 * mr4);
193 Real const bd = be0 + (be1 * mr) + (be2 * mr2) + (be3 * mr3) + (be4 * mr4);
194 Real const cd = std::log (1.0 / mr);
196 return ( ad + (bd * cd) );
207 Real const r_length = r_vector.length();
209 if(std::abs(base_z_axis.length() - 1.0) > 0.00001) utility_exit_with_message(
"std::abs(base_z_axis.length() - 1.0) > 0.00001 !!");
211 Real const dot_product = dot(r_vector, base_z_axis) / (r_length);
213 Real const angle = acos(dot_product);
215 rho = sin (angle) * r_length;
216 z = dot_product * r_length;
226 Real const d = rho / ring_radius;
227 Real const hp = (z - ring_z_offset) / ring_radius;
229 Real const hp2 = hp * hp;
231 Real const rp = ( (1.0 + d) * (1.0 + d) ) + hp2;
232 Real const sp = ( (1.0 - d) * (1.0 - d) ) + hp2;
233 Real const tp = (1.0 - (d * d) - hp2);
236 Real const mp = (4.0 * d) / rp;
238 Real const Fp =( 2.0 / std::sqrt (rp) );
239 Real const Gp =( tp / sp );
242 Real const term = ( Fp ) * ( Hp );
253 Real const d = rho / ring_radius;
254 Real const hp = (z - ring_z_offset) / ring_radius;
256 Real const hp2 = hp * hp;
258 Real const rp = ( (1.0 + d) * (1.0 + d) ) + hp2;
259 Real const sp = ( (1.0 - d) * (1.0 - d) ) + hp2;
260 Real const tp = (1.0 - (d * d) - hp2);
262 Real const rp2 = rp * rp;
263 Real const rp3 = rp * rp * rp;
265 Real const sp2 = sp * sp;
267 Real const mp = (4.0 * d) / rp;
269 Real const Fp =( 2.0 / std::sqrt (rp) );
270 Real const Gp =( tp / sp );
281 Real const dFp_drho = ( 1.0 / ring_radius ) * (-2.0 * (1.0 + d) ) * ( 1 / ( sqrt ( rp3 ) ) );
286 Real const dmp_drho = ( 1.0 / ring_radius ) * ( ( rp * 4.0 ) - ( ( 4.0 * d ) * ( 2.0 * (1.0 + d) ) ) ) * ( 1.0 / (rp2) );
288 Real const dGp_drho = ( 1.0 / ring_radius ) * ( ( sp * ( -2.0 * d ) ) - ( tp * (-2.0 * (1.0 - d) ) ) ) * ( 1.0 / (sp2) );
292 dterm_drho=(dFp_drho * Hp) + (Fp * dHp_drho);
301 Real const dFp_dz = ( 1.0 / ring_radius ) * (-2.0 * ( hp ) ) * ( 1 / ( sqrt ( rp3 ) ) );
306 Real const dmp_dz = ( 1.0 / ring_radius ) * ( (rp * 0.0 ) - ( ( 4.0 * d ) * ( 2.0 * hp ) ) ) * ( 1.0 / (rp2) );
308 Real const dGp_dz = ( 1.0 / ring_radius ) * ( ( sp * ( -2.0 * hp ) ) - ( tp * (2.0 * hp ) ) ) * ( 1.0 / (sp2) );
312 dterm_dz=(dFp_dz * Hp) + (Fp * dHp_dz);
337 get_rho_and_z(atom_xyz, molecular_ring_center, base_z_axis, rho, z);
343 return ( -1.0 * source_rsd_CS_params.
ring_current_coeff() * (rci / rca) * (mterm + pterm) );
351 Real chem_shift = 0.0;
355 if( source_rsd.
aa()!= rna_cs_rsd_params.
aa() ) utility_exit_with_message(
"rsd.aa()!= rna_cs_rsd_params.aa()!");
361 for (
Size ring_ID = 1; ring_ID <= rna_cs_rsd_params.
num_rings(); ring_ID++){
363 chem_shift +=
delta_ring_current(atom_xyz,
ring_pos(source_rsd, rna_cs_rsd_params, ring_ID), base_z_axis, rna_cs_rsd_params, ring_ID);
378 if( source_rsd.
aa()!= rna_cs_rsd_params.
aa() ) utility_exit_with_message(
"rsd.aa()!= rna_cs_rsd_params.aa()!");
384 Real const chem_shift =
delta_ring_current(atom_xyz,
ring_pos(source_rsd, rna_cs_rsd_params, source_ring_ID), base_z_axis, rna_cs_rsd_params, source_ring_ID);
408 if( source_rsd.
aa()!= source_rsd_CS_params.
aa() ) utility_exit_with_message(
"rsd.aa()!= source_rsd_CS_params.aa()!");
420 get_rho_and_z(CS_data_atom_xyz, molecular_ring_center, base_z_axis, rho, z);
428 Real const r_length = r_vector.length();
436 Real dmterm_drho=0.0;
438 Real dpterm_drho=0.0;
445 Real const dRC_drho = -1.0 * source_rsd_CS_params.
ring_current_coeff() * (rci / rca) * (dmterm_drho + dpterm_drho);
447 Real const dRC_dz = -1.0 * source_rsd_CS_params.
ring_current_coeff() * (rci / rca) * (dmterm_dz + dpterm_dz);
453 return analytical_gradient;
467 numeric::xyzVector<core::Real> const RC_rho_plus_xyz= CS_data_atom_xyz + (rho_norm * increment);
468 numeric::xyzVector<core::Real> const RC_rho_minus_xyz= CS_data_atom_xyz - (rho_norm * increment);
470 Real const RC_rho_plus_effect= ring_current_effect_individual_ring(RC_rho_plus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
471 Real const RC_rho_minus_effect= ring_current_effect_individual_ring(RC_rho_minus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
473 Real const dRC_drho_numerical = ( RC_rho_plus_effect - RC_rho_minus_effect ) / ( 2 * increment );
476 numeric::xyzVector<core::Real> const RC_z_plus_xyz= CS_data_atom_xyz + (z_norm * increment);
477 numeric::xyzVector<core::Real> const RC_z_minus_xyz= CS_data_atom_xyz - (z_norm * increment);
479 Real const RC_z_plus_effect= ring_current_effect_individual_ring(RC_z_plus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
480 Real const RC_z_minus_effect= ring_current_effect_individual_ring(RC_z_minus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
482 Real const dRC_dz_numerical = ( RC_z_plus_effect - RC_z_minus_effect ) / ( 2 * increment );
484 std::cout << "---------------------------------------------------------------------" << std::endl;
485 std::cout << "rho_norm=(" << rho_norm.x() << ", " << rho_norm.y() << ", " << rho_norm.z() << ") rho_norm.length()=" << rho_norm.length();
486 std::cout << " | z_norm =(" << z_norm.x() << ", " << z_norm.y() << ", " << z_norm.z() << ") dRC_drho.length()=" << z_norm.length();
487 std::cout << " | dot(rho_norm, z_norm)= " << dot(rho_norm, z_norm) << std::endl;
488 std::cout << "ring_current_deriv_numerical_check dRC_drho_analytical= " << dRC_drho << " | dRC_drho_numerical= " << dRC_drho_numerical;
489 std::cout << " | dRC_dz_analytical= " << dRC_dz << " | dRC_dz_numerical= " << dRC_dz_numerical << std::endl;
492 numeric::xyzVector<core::Real> const numerical_gradient_one=(dRC_drho_numerical * rho_norm) + (dRC_dz_numerical * z_norm);
495 numeric::xyzVector<core::Real> const rosetta_frame_x_vector(1.0, 0.0, 0.0);
496 numeric::xyzVector<core::Real> const rosetta_frame_y_vector(0.0, 1.0, 0.0);
497 numeric::xyzVector<core::Real> const rosetta_frame_z_vector(0.0, 0.0, 1.0);
499 numeric::xyzVector<core::Real> const RC_rosetta_frame_x_plus_xyz= CS_data_atom_xyz + (rosetta_frame_x_vector*increment);
500 numeric::xyzVector<core::Real> const RC_rosetta_frame_x_minus_xyz= CS_data_atom_xyz - (rosetta_frame_x_vector*increment);
502 Real const RC_rosetta_frame_x_plus_effect = ring_current_effect_individual_ring(RC_rosetta_frame_x_plus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
503 Real const RC_rosetta_frame_x_minus_effect = ring_current_effect_individual_ring(RC_rosetta_frame_x_minus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
505 Real const dRC_drosettax_numerical = (RC_rosetta_frame_x_plus_effect - RC_rosetta_frame_x_minus_effect ) / ( 2 * increment );
508 numeric::xyzVector<core::Real> const RC_rosetta_frame_y_plus_xyz= CS_data_atom_xyz + (rosetta_frame_y_vector*increment);
509 numeric::xyzVector<core::Real> const RC_rosetta_frame_y_minus_xyz= CS_data_atom_xyz - (rosetta_frame_y_vector*increment);
511 Real const RC_rosetta_frame_y_plus_effect = ring_current_effect_individual_ring(RC_rosetta_frame_y_plus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
512 Real const RC_rosetta_frame_y_minus_effect = ring_current_effect_individual_ring(RC_rosetta_frame_y_minus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
514 Real const dRC_drosettay_numerical = (RC_rosetta_frame_y_plus_effect - RC_rosetta_frame_y_minus_effect ) / ( 2 * increment );
517 numeric::xyzVector<core::Real> const RC_rosetta_frame_z_plus_xyz= CS_data_atom_xyz + (rosetta_frame_z_vector*increment);
518 numeric::xyzVector<core::Real> const RC_rosetta_frame_z_minus_xyz= CS_data_atom_xyz - (rosetta_frame_z_vector*increment);
520 Real const RC_rosetta_frame_z_plus_effect = ring_current_effect_individual_ring(RC_rosetta_frame_z_plus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
521 Real const RC_rosetta_frame_z_minus_effect = ring_current_effect_individual_ring(RC_rosetta_frame_z_minus_xyz, source_rsd, source_rsd_CS_params, source_ring_ID);
523 Real const dRC_drosettaz_numerical = (RC_rosetta_frame_z_plus_effect - RC_rosetta_frame_z_minus_effect ) / ( 2 * increment );
526 numeric::xyzVector<core::Real> const numerical_gradient_two=(dRC_drosettax_numerical * rosetta_frame_x_vector) + (dRC_drosettay_numerical * rosetta_frame_y_vector) + (dRC_drosettaz_numerical * rosetta_frame_z_vector);
528 std::cout << "analytical_gradient=( " << analytical_gradient.x() << " , " << analytical_gradient.y() << " , " << analytical_gradient.z() << " )";
529 std::cout << " | numerical_gradient_one=( " << numerical_gradient_one.x() << " , " << numerical_gradient_one.y() << " , " << numerical_gradient_one.z() << " )";
530 std::cout << " | numerical_gradient_two=( " << numerical_gradient_two.x() << " , " << numerical_gradient_two.y() << " , " << numerical_gradient_two.z() << " )" << std::endl;
531 std::cout << "---------------------------------------------------------------------" << std::endl;
533 if(use_numerical_deriv) return numerical_gradient_two;