31 #include <basic/Tracer.hh>
33 #include <basic/options/option.hh>
34 #include <basic/options/keys/score.OptionKeys.gen.hh>
36 #include <utility/file/file_sys_util.hh>
37 #include <utility/io/izstream.hh>
38 #include <ObjexxFCL/format.hh>
43 #include <numeric/xyzVector.hh>
52 static basic::Tracer
TR(
"core.scoring.rna.chemical_shift.RNA_ChemicalShiftPotential");
57 namespace chemical_shift {
65 include_ring_current_effect_(true),
66 include_magnetic_anisotropy_effect_(true),
67 total_exp_chemical_shift_data_points_( 0 )
71 std::cout <<
"include_ring_current_effect_= true " << std::endl;
73 std::cout <<
"include_ring_current_effect_= false " << std::endl;
77 std::cout <<
"include_magnetic_anisotropy_effect_= true " << std::endl;
79 std::cout <<
"include_magnetic_anisotropy_effect_= false " << std::endl;
82 if( basic::options::option[ basic::options::OptionKeys::score::rna_chemical_shift_exp_data].user()==
false ){
83 utility_exit_with_message(
"User need to pass in score:rna_chemical_shift_exp_data");
86 std::string const exp_CS_data_filename=basic::options::option[ basic::options::OptionKeys::score::rna_chemical_shift_exp_data]();
90 if( basic::options::option[ basic::options::OptionKeys::score::rna_chemical_shift_include_res].user()){
91 include_res_list=basic::options::option[ basic::options::OptionKeys::score::rna_chemical_shift_include_res]();
93 TR <<
"User did not pass in score:rna_chemical_shift_include_res, including all residue!" << std::endl;
94 if(include_res_list.size()!=0) utility_exit_with_message(
"User did not pass in score:rna_chemical_shift_include_res option but include_res_list.size()!=0!");
97 if( basic::options::option[ basic::options::OptionKeys::score::rna_chemical_shift_H5_prime_mode].user()){
98 H5_prime_mode_=basic::options::option[ basic::options::OptionKeys::score::rna_chemical_shift_H5_prime_mode]();
99 TR <<
"Using user-specified H5_prime_mode_= " <<
H5_prime_mode_ << std::endl;
118 proton_entry_list.push_back(
string_list(
"1H5*",
"2H5*"));
121 utility_exit_with_message(
"Invalid H5_prime_mode_ (" +
H5_prime_mode_ +
")!");
149 }
else if(BASE_name==
"A"){
153 }
else if(BASE_name==
"C"){
157 }
else if(BASE_name==
"U"){
162 utility_exit_with_message(
"Invalid BASE_name (" +BASE_name+
") | line= (" +text_line+
")");
175 for(
Size n=0; n<in_atom_name.size(); n++){
177 if(in_atom_name[n]!=
' ') out_atom_name+=in_atom_name[n];
181 return out_atom_name;
189 if(input_atom_name==
"2HO*" || input_atom_name==
"HO2'")
return true;
191 if(input_atom_name==
"1H2" || input_atom_name==
"H21")
return true;
193 if(input_atom_name==
"2H2" || input_atom_name==
"H22")
return true;
195 if(input_atom_name==
"1H4" || input_atom_name==
"H41")
return true;
197 if(input_atom_name==
"2H4" || input_atom_name==
"H42")
return true;
199 if(input_atom_name==
"1H6" || input_atom_name==
"H61")
return true;
201 if(input_atom_name==
"2H6" || input_atom_name==
"H62")
return true;
203 if(input_atom_name==
"H1")
return true;
205 if(input_atom_name==
"H3")
return true;
207 if(input_atom_name==
"HO3'")
return true;
209 if(input_atom_name==
"HO5'")
return true;
219 using namespace ObjexxFCL;
224 if(input_atom_name==
"H1'"){
225 rosetta_atom_name=
"H1*";
227 }
else if(input_atom_name==
"H2'"){
228 rosetta_atom_name=
"1H2*";
230 }
else if(input_atom_name==
"H3'"){
231 rosetta_atom_name=
"H3*";
233 }
else if(input_atom_name==
"H4'"){
234 rosetta_atom_name=
"H4*";
236 }
else if(input_atom_name==
"H5'"){
237 rosetta_atom_name=
"1H5*";
239 }
else if(input_atom_name==
"H5''"){
240 rosetta_atom_name=
"2H5*";
242 rosetta_atom_name=input_atom_name;
245 Size num_matching_atom_name=0;
247 for(
Size ii=1; ii<=flat_proton_entry_list.size(); ii++){
248 if(rosetta_atom_name==flat_proton_entry_list[ii]) num_matching_atom_name++;
251 if(num_matching_atom_name!=1){
252 std::cout <<
"ERROR: num_matching_atom_name=" << num_matching_atom_name << std::endl;
253 std::cout <<
"ERROR: input_atom_name=" << input_atom_name << std::endl;
254 std::cout <<
"ERROR: rosetta_atom_name=" << rosetta_atom_name << std::endl;
255 utility_exit_with_message(
"num_matching_atom_name!=1 for input_atom_name (" + input_atom_name +
") | text_line (" + text_line +
")");
258 return rosetta_atom_name;
267 std::cout << prestring <<
"seq_num=" << std::setw(3) << CS_data.
seq_num;
269 std::cout <<
" | atom_name=" << std::setw(5) << CS_data.
atom_name;
271 std::cout <<
" | exp_shift=" << std::setw(8) << CS_data.
exp_shift;
272 if(print_data_line) std::cout <<
" | data_line=" << CS_data.
data_line;
273 std::cout << std::endl;
282 std::stringstream ss (std::stringstream::in | std::stringstream::out);
286 if(ss.fail()) utility_exit_with_message(
"In string_to_real(): ss.fail() for ss << input_string | string ("+input_string+
")");
290 if(ss.fail()) utility_exit_with_message(
"In string_to_real(): ss.fail() for ss >> int_of_string | string ("+input_string+
")");
292 return int_of_string;
300 std::stringstream ss (std::stringstream::in | std::stringstream::out);
304 if(ss.fail()) utility_exit_with_message(
"In string_to_real(): ss.fail() for ss << input_string | string ("+input_string+
")");
306 ss >> real_of_string;
308 if(ss.fail()) utility_exit_with_message(
"In string_to_real(): ss.fail() for ss >> real_of_string | string ("+input_string+
")");
310 return real_of_string;
317 for(
Size j=1; j<=residue_list.size(); j++){
318 if(seq_num==residue_list[j]) {
332 for(
Size ii=1; ii<=flat_EXP_chem_shift_data_list.size(); ii++){
336 if(CS_data.
seq_num!=seq_num)
continue;
338 Size num_matching_atom_name=0;
340 for(
Size jj=1; jj<=proton_entry.size(); jj++){
341 if(proton_entry[jj]==CS_data.
atom_name) num_matching_atom_name++;
344 if(num_matching_atom_name>1) utility_exit_with_message(
"num_matching_atom_name>1!");
346 if(num_matching_atom_name==1) filtered_CS_data_list.push_back(CS_data);
350 if(filtered_CS_data_list.size()>0){
352 if(filtered_CS_data_list.size()!=proton_entry.size()){
353 std::cout <<
"ERROR: filtered_CS_data_list.size()>0 at seq_num=" << seq_num <<
" proton_entry: ";
354 for(
Size jj=1; jj<=proton_entry.size(); jj++){
355 std::cout <<
"# " << jj <<
" :" << proton_entry[jj] <<std::endl;
357 std::cout <<
"ERROR: filtered_CS_data_list: " << std::endl;
358 for(
Size jj=1; jj<=filtered_CS_data_list.size(); jj++){
362 utility_exit_with_message(
"filtered_CS_data_list.size()>0 BUT filtered_CS_data_list.size()!=proton_entry.size()!");
366 return filtered_CS_data_list;
387 string_list.push_back(string_one);
399 string_list.push_back(string_one);
400 string_list.push_back(string_two);
410 using namespace ObjexxFCL;
418 Size num_matching_atom_name=0;
420 Size realatomdata_index=0;
422 for(
Size count=1; count<=maxatoms; count++){
424 if(rna_cs_rsd_params.get_atomname(count)==atom_name){
425 num_matching_atom_name++;
426 realatomdata_index=count;
431 if(num_matching_atom_name!=1) utility_exit_with_message(
"num_matching_atom_name=("+ string_of(num_matching_atom_name)+
")!=1 | atom_name ("+ atom_name+
")!");
433 return realatomdata_index;
442 using namespace ObjexxFCL;
447 utility_exit_with_message(
"CS_data.atom_name==\"H8\" but CS_data.res_aa!=na_rgu && CS_data.res_aa!=na_rad!");
453 utility_exit_with_message(
"CS_data.atom_name==\"" +CS_data.
atom_name +
"\" but CS_data.res_aa!=na_rcy && CS_data.res_aa!=na_ura!");
458 if( CS_data.
res_aa!=
chemical::na_rad ) utility_exit_with_message(
"CS_data.atom_name==\"H2\" but CS_data.res_aa!=na_rad!");
464 if( CS_data.
res_aa!=
chemical::na_rgu ) utility_exit_with_message(
"CS_data.atom_name==\"H1\" but CS_data.res_aa!=na_rgu!");
468 if( CS_data.
res_aa!=
chemical::na_ura) utility_exit_with_message(
"CS_data.atom_name==\"H3\" but CS_data.res_aa!=na_ura!");
473 utility_exit_with_message(
"CS_data.atom_name==\"" + CS_data.
atom_name +
"\" but CS_data.res_aa!=na_rgu!");
479 utility_exit_with_message(
"CS_data.atom_name==\"" + CS_data.
atom_name +
"\" but CS_data.res_aa!=na_rcy!");
485 utility_exit_with_message(
"CS_data.atom_name==\"" + CS_data.
atom_name +
"\" but CS_data.res_aa!=na_rad!");
495 utility_exit_with_message(
"CS_data.realatomdata_index ("+string_of(CS_data.
realatomdata_index)+
") | CS_data.atom_name ("+ CS_data.
atom_name+
") is not a calc_chem_shift_atom!");
506 using namespace ObjexxFCL;
514 bool const Is_MA_source_atom= (
dround( rna_cs_rsd_params.atom_data(realatomdata_index,
maca) ) == 1 );
516 return Is_MA_source_atom;
524 using namespace ObjexxFCL;
526 Size num_matching_CS_data=0;
538 if(CS_data.
seq_num!=seq_num)
continue;
540 if(CS_data.
atom_name!=atom_name)
continue;
542 num_matching_CS_data++;
547 if(num_matching_CS_data>1) utility_exit_with_message(
"num_matching_CS_data>1 for seq_num= ("+string_of(seq_num)+
") | atom_name= ("+atom_name+
")");
549 return (num_matching_CS_data==1);
558 using namespace ObjexxFCL;
560 Size num_matching_CS_data=0;
562 Size matching_outer_data_ID=0;
572 if(CS_data.
seq_num!=seq_num)
continue;
574 if(CS_data.
atom_name!=atom_name)
continue;
576 num_matching_CS_data++;
578 matching_outer_data_ID=outer_data_ID;
584 if(num_matching_CS_data!=1) utility_exit_with_message(
"num_matching_CS_data!=1 for seq_num= ("+string_of(seq_num)+
") | atom_name= ("+atom_name+
")");
596 using namespace ObjexxFCL;
601 utility_exit_with_message(
"exp_CS_data_filename " + exp_CS_data_filename +
" doesn't exist!" );
604 utility::io::izstream data( exp_CS_data_filename );
606 utility_exit_with_message(
"Unable to open exp_CS_data_file: "+exp_CS_data_filename);
608 std::cout <<
"Successfully opened open exp_CS_data_file: \"" << exp_CS_data_filename<<
"\" !" << std::endl;
614 for(
Size ii=1; ii<=proton_entry_list.size(); ii++){
615 for(
Size jj=1; jj<=proton_entry_list[ii].size(); jj++){
616 flat_proton_entry_list.push_back(proton_entry_list[ii][jj]);
626 while( getline( data, text_line ) ){
628 std::istringstream text_stream( text_line );
636 text_stream >> str_element;
638 if(text_stream.fail())
break;
640 text_line_list.push_back(str_element);
643 if(text_line_list.size()!=9){
644 utility_exit_with_message(
"text_line_list.size()!=9 for line (" + text_line +
")");
648 if(text_line_list[2]!=text_line_list[3]){
649 utility_exit_with_message(
"text_line_list[2]=("+ text_line_list[2] +
")!=("+ text_line_list[3] +
")=text_line_list[3]");
658 std::string const input_atom_name=text_line_list[5];
660 size_t found=input_atom_name.find(
"H");
662 if(found==std::string::npos){
663 if(
false) std::cout <<
"Ignoring non-hydrogen chemical shift line (" << text_line <<
")" << std::endl;
668 if(
false) std::cout <<
"Ignoring polar hydrogen chemical shift line (" << text_line <<
")" << std::endl;
679 ChemicalShiftData const chem_shift_data( seq_num, res_aa, atom_name, realatomdata_index, exp_shift, text_line);
683 flat_EXP_chem_shift_data_list.push_back(chem_shift_data);
685 if(max_seq_num<seq_num) max_seq_num=seq_num;
690 if(include_res_list.size()==0){
691 TR <<
"User did not pass in score:rna_chemical_shift_include_res, including all residue:";
692 for(
Size seq_num=1; seq_num<=max_seq_num; seq_num++){
693 include_res_list.push_back(seq_num);
694 TR <<
" " << seq_num;
698 TR <<
"User pass in score:rna_chemical_shift_include_res:";
699 for(
Size res_ID=1; res_ID<=include_res_list.size(); res_ID++){
700 TR <<
" " << include_res_list[res_ID];
708 for(
Size proton_entry_ID=1; proton_entry_ID<=proton_entry_list.size(); proton_entry_ID++){
710 for(
Size res_ID=1; res_ID<=include_res_list.size(); res_ID++){
712 Size const seq_num=include_res_list[res_ID];
717 if(filterd_CS_data_list.size()!=0){
732 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
733 mock_calc_chem_shift_entry.push_back(0.0);
742 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
744 if(do_include_CS_data[inner_data_ID]==
false)
continue;
757 std::cout <<
"------------------Imported exp_chem_shift_data_list------------------" << std::endl;
762 std::string const prefix=
"#" + lead_zero_string_of(ii, 3) +
"." + lead_zero_string_of(jj, 1) +
" | count= " + lead_zero_string_of(data_count, 3) +
" :";
767 std::cout <<
"---------------------------------------------------------------------" << std::endl;
778 std::cout <<
"ERROR: CS_data.seq_num=" << CS_data.
seq_num << std::endl;
779 std::cout <<
"ERROR: pose.total_residue()=" << pose.
total_residue() << std::endl;
780 utility_exit_with_message(
"(CS_data.seq_num<1) || (CS_data.seq_num>pose.total_residue())");
784 std::cout <<
"ERROR: CS_data.res_aa=" << CS_data.
res_aa << std::endl;
785 std::cout <<
"ERROR: CS_data.seq_num=" << CS_data.
seq_num << std::endl;
786 std::cout <<
"ERROR: pose.residue(CS_data.seq_num).aa()=" << pose.
residue(CS_data.
seq_num).
aa() << std::endl;
787 utility_exit_with_message(
"chem_shift_data.res_aa!=pose1.residue(CS_data.seq_num).aa()");
790 Real calc_chem_shift=0.0;
802 bool curr_atom_is_base=(curr_atom_is_sugar==
false);
812 if( (CS_data.
seq_num == seq_num) && (curr_atom_is_base) )
continue;
824 std::cout <<
"duetores : rc ma\n";
831 std::cout <<
" " << source_rsd_CS_params.
base_name() <<
" " << seq_num <<
" : ";
833 if( (CS_data.
seq_num == seq_num) && (curr_atom_is_base) ){
834 std::cout <<
"0 0\n";
842 std::cout <<
"charge effect : " << 0.0 <<
"\n\n\n";
845 return calc_chem_shift;
853 calc_chem_shift_list.clear();
857 calc_chem_shift_entry.clear();
865 calc_chem_shift_entry.push_back(calc_chem_shift);
869 calc_chem_shift_list.push_back(calc_chem_shift_entry);
874 utility_exit_with_message(
"calc_chem_shift_list.size()!=EXP_chem_shift_data_list_.size()");
879 utility_exit_with_message(
"EXP_chem_shift_data_list_[ii].size()!=calc_chem_shift_list[ii].size()");
892 using namespace ObjexxFCL;
894 actual_exp_chem_shift_entry.clear();
895 do_include_CS_data.clear();
897 if(EXP_chem_shift_data_entry.size()!=calc_chem_shift_entry.size()){
898 utility_exit_with_message(
"EXP_chem_shift_data_entry.size()!=calc_chem_shift_entry.size()");
902 if(EXP_chem_shift_data_entry.size()==2){
911 Real const calc_shift_one=calc_chem_shift_entry[1];
912 Real const calc_shift_two=calc_chem_shift_entry[2];
915 if(CS_data_one.
seq_num!=CS_data_two.
seq_num) utility_exit_with_message(
"CS_data_one.seq_num!=CS_data_two.seq_num");
917 Size num_matching_atom_pairs_found=0;
919 if(CS_data_one.
atom_name==
"1H5*" && CS_data_two.
atom_name==
"2H5*") num_matching_atom_pairs_found++;
921 if(CS_data_one.
atom_name==
"2H5*" && CS_data_two.
atom_name==
"1H5*") num_matching_atom_pairs_found++;
923 if(num_matching_atom_pairs_found!=1) utility_exit_with_message(
"num_matching_atom_pairs_found=(" +string_of(num_matching_atom_pairs_found)+
")!=1");
929 if( std::pow(calc_shift_one-CS_data_one.
exp_shift, 2) < std::pow(calc_shift_two-CS_data_two.
exp_shift, 2) ){
932 std::cout <<
"---------------------------------------------------" << std::endl;
933 std::cout <<
"Keeping the better_fit of the duplicated H5_prime data | calc_shift_one=" << calc_shift_one;
print_chemical_shift_data(
"CS_data_one:", CS_data_one,
true);
934 std::cout <<
"Ignoring the worst_fit of the duplicated H5_prime data | calc_shift_two=" << calc_shift_two;
print_chemical_shift_data(
"CS_data_two:", CS_data_two,
true);
935 std::cout <<
"---------------------------------------------------" << std::endl;
938 do_include_CS_data.push_back(
true);
939 do_include_CS_data.push_back(
false);
940 actual_exp_chem_shift_entry.push_back(CS_data_one.
exp_shift);
941 actual_exp_chem_shift_entry.push_back(0.0);
947 std::cout <<
"---------------------------------------------------" << std::endl;
948 std::cout <<
"Keeping the better_fit of the duplicated H5_prime data | calc_shift_two=" << calc_shift_two;
print_chemical_shift_data(
"CS_data_two:", CS_data_two,
true);
949 std::cout <<
"Ignoring the worst_fit of the duplicated H5_prime data | calc_shift_one=" << calc_shift_one;
print_chemical_shift_data(
"CS_data_one:", CS_data_one,
true);
950 std::cout <<
"---------------------------------------------------" << std::endl;
954 do_include_CS_data.push_back(
false);
955 do_include_CS_data.push_back(
true);
956 actual_exp_chem_shift_entry.push_back(0.0);
957 actual_exp_chem_shift_entry.push_back(CS_data_one.
exp_shift);
963 do_include_CS_data.push_back(
true);
964 do_include_CS_data.push_back(
true);
966 Real const sum_error_square_choice_one= std::pow(calc_shift_one-CS_data_one.
exp_shift, 2) + std::pow(calc_shift_two-CS_data_two.
exp_shift, 2);
967 Real const sum_error_square_choice_two= std::pow(calc_shift_one-CS_data_two.
exp_shift, 2) + std::pow(calc_shift_two-CS_data_one.
exp_shift, 2);
969 if(sum_error_square_choice_one<sum_error_square_choice_two){
970 actual_exp_chem_shift_entry.push_back(CS_data_one.
exp_shift);
971 actual_exp_chem_shift_entry.push_back(CS_data_two.
exp_shift);
973 actual_exp_chem_shift_entry.push_back(CS_data_two.
exp_shift);
974 actual_exp_chem_shift_entry.push_back(CS_data_one.
exp_shift);
978 }
else if(EXP_chem_shift_data_entry.size()==1){
980 do_include_CS_data.push_back(
true);
981 actual_exp_chem_shift_entry.push_back(EXP_chem_shift_data_entry[1].exp_shift);
984 std::cout <<
"ERROR: EXP_chem_shift_data_entry.size()= " << EXP_chem_shift_data_entry.size() << std::endl;
985 utility_exit_with_message(
"EXP_chem_shift_data_entry.size()!=1 and EXP_chem_shift_data_entry.size()!=2");
995 using namespace ObjexxFCL;
999 utility_exit_with_message(
"cal_chem_shift_list.size()!=EXP_chem_shift_data_list_.size()");
1002 Real chem_shift_energy=0.0;
1014 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1016 if(do_include_CS_data[inner_data_ID]==
false)
continue;
1018 Real const exp_chem_shift=actual_exp_chem_shift_entry[inner_data_ID];
1020 Real const calc_chem_shift=calc_chem_shift_entry[inner_data_ID];
1022 chem_shift_energy+=std::pow(calc_chem_shift-exp_chem_shift, 2);
1028 return chem_shift_energy;
1034 using namespace conformation;
1041 cal_chem_shift_list.clear();
1060 Size const CS_data_atomno,
1065 using namespace ObjexxFCL;
1072 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1075 calc_chem_shift_entry.push_back(calc_chem_shift);
1085 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1087 ChemicalShiftData const & possible_CS_data=EXP_chem_shift_data_entry[inner_data_ID];
1089 if(EXP_chem_shift_data_entry.size()!=1){
1090 if(CS_data_atom_name!=possible_CS_data.
atom_name)
continue;
1096 if(do_include_CS_data[inner_data_ID]==
false)
continue;
1098 Real const calc_chem_shift= calc_chem_shift_entry[inner_data_ID];
1100 Real const act_exp_chem_shift= actual_exp_chem_shift_entry[inner_data_ID];
1103 std::string const pre_string =
"get_deriv_for_chemical_shift_data_atom | jj= " + string_of(inner_data_ID) +
" | EXP_CS_data_entry.size()= " + string_of(EXP_chem_shift_data_entry.size()) +
": ";
1109 std::cout <<
"ERROR: pose.residue(CS_data.seq_num).aa()=" << pose.
residue(CS_data.
seq_num).
aa() << std::endl;
1110 utility_exit_with_message(
"CS_data.res_aa!=pose1.residue(CS_data.seq_num).aa()");
1118 bool const CS_data_atom_is_base=(CS_data_atom_is_sugar==
false);
1124 for(
Size source_seq_num=1; source_seq_num<=pose.
total_residue(); source_seq_num++){
1130 if( (CS_data.
seq_num == source_seq_num) && (CS_data_atom_is_base) )
continue;
1134 for(
Size ring_ID=1; ring_ID<=source_rsd_CS_params.
num_rings(); ring_ID++){
1141 f1+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f1_calc_chem_shift);
1142 f2+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f2_calc_chem_shift);
1153 for(
Size source_realatomdata_index=1; source_realatomdata_index<=source_rsd_maxatoms; source_realatomdata_index++){
1155 if(
dround(source_rsd_CS_params.
atom_data(source_realatomdata_index,
maca)) != 1 )
continue;
1167 f1+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f1_calc_chem_shift);
1168 f2+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f2_calc_chem_shift);
1191 Size const chi1_torsion_atomnno,
1198 Size const rc_source_seq_num=rc_source_rsd.
seqpos();
1205 std::cout <<
"get_deriv_for_ring_current_center for chi1_torsion_atomn_name=" << chi1_torsion_atomn_name;
1206 std::cout <<
" | name_from_aa(rc_source_rsd.aa())= " <<
name_from_aa(rc_source_rsd.
aa());
1207 std::cout <<
" | rc_source_seq_num= " << rc_source_seq_num;
1216 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1220 calc_chem_shift_entry.push_back(calc_chem_shift);
1228 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1230 if(do_include_CS_data[inner_data_ID]==
false)
continue;
1234 Real const calc_chem_shift= calc_chem_shift_entry[inner_data_ID];
1236 Real const act_exp_chem_shift= actual_exp_chem_shift_entry[inner_data_ID];
1248 bool const CS_data_atom_is_base=(CS_data_atom_is_sugar==
false);
1250 if( (CS_data.
seq_num == rc_source_seq_num) && (CS_data_atom_is_base) )
continue;
1252 for(
Size rc_source_ring_ID=1; rc_source_ring_ID<=rc_source_rsd_CS_params.
num_rings(); rc_source_ring_ID++){
1259 f1+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f1_calc_chem_shift);
1260 f2+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f2_calc_chem_shift);
1274 Size const chi1_torsion_atomno,
1281 Size const ma_source_seq_num=ma_source_rsd.
seqpos();
1292 std::cout <<
"get_deriv_for_magnetic_anisotropy_src_atom for chi1_torsion_atom_name=" << chi1_torsion_atom_name;
1293 std::cout <<
" | name_from_aa(ma_source_rsd.aa())= " <<
name_from_aa(ma_source_rsd.
aa());
1294 std::cout <<
" | ma_source_seq_num= " << ma_source_seq_num << std::endl;
1303 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1307 calc_chem_shift_entry.push_back(calc_chem_shift);
1317 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1319 if(do_include_CS_data[inner_data_ID]==
false)
continue;
1323 Real const calc_chem_shift= calc_chem_shift_entry[inner_data_ID];
1325 Real const act_exp_chem_shift= actual_exp_chem_shift_entry[inner_data_ID];
1337 bool const CS_data_atom_is_base=(CS_data_atom_is_sugar==
false);
1339 if( (CS_data.
seq_num == ma_source_seq_num) && (CS_data_atom_is_base) )
continue;
1341 for(
Size source_realatomdata_index=1; source_realatomdata_index<=ma_source_rsd_maxatoms; source_realatomdata_index++){
1343 if(
dround(ma_source_rsd_CS_params.
atom_data(source_realatomdata_index,
maca)) != 1 )
continue;
1355 f1+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f1_calc_chem_shift);
1356 f2+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f2_calc_chem_shift);
1372 Size const ma_source_atomno,
1379 Size const ma_source_seq_num=ma_source_rsd.
seqpos();
1392 utility_exit_with_message(
"dround(ma_source_rsd_CS_params.atom_data(ma_source_realatomdata_index, maca)) != 1");
1396 std::cout <<
"get_deriv_for_magnetic_anisotropy_src_atom for ma_source_atom_name=" << ma_source_atom_name;
1397 std::cout <<
" | name_from_aa(ma_source_rsd.aa())= " <<
name_from_aa(ma_source_rsd.
aa());
1398 std::cout <<
" | ma_source_seq_num= " << ma_source_seq_num << std::endl;
1407 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1411 calc_chem_shift_entry.push_back(calc_chem_shift);
1421 for(
Size inner_data_ID=1; inner_data_ID<=EXP_chem_shift_data_entry.size(); inner_data_ID++){
1423 if(do_include_CS_data[inner_data_ID]==
false)
continue;
1427 Real const calc_chem_shift= calc_chem_shift_entry[inner_data_ID];
1429 Real const act_exp_chem_shift= actual_exp_chem_shift_entry[inner_data_ID];
1441 bool const CS_data_atom_is_base=(CS_data_atom_is_sugar==
false);
1443 if( (CS_data.
seq_num == ma_source_seq_num) && (CS_data_atom_is_base) )
continue;
1453 f1+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f1_calc_chem_shift);
1454 f2+= 2.0*(calc_chem_shift-act_exp_chem_shift)*(f2_calc_chem_shift);
1476 using namespace conformation;
1478 Size const seq_num = atom_id.
rsd();
1482 if ( !rsd.is_RNA() )
return;
1494 std::cout <<
"eval_atom_derivative() for name_from_aa(rsd.aa())= " <<
name_from_aa(rsd.aa());
1495 std::cout <<
" | seq_num= " << seq_num;
1496 std::cout <<
" | atomno= " << atomno;
1497 std::cout <<
" | atom_name= " << rsd.atom_name(atomno);
1498 std::cout << std::endl;