Louis BECQUEY

Removed support for BayesPairing & Jar3d

This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
...@@ -1142,178 +1142,9 @@ void MOIP::allowed_motifs_from_rin(args_of_parallel_func arg_struct) ...@@ -1142,178 +1142,9 @@ void MOIP::allowed_motifs_from_rin(args_of_parallel_func arg_struct)
1142 } 1142 }
1143 } 1143 }
1144 1144
1145 -
1146 -//Check if the sequence is a rna sequence (ATGC) and replace T by U or remove modified nucleotide if necessary
1147 -string check_motif_sequence(string seq) {
1148 - std::transform(seq.begin(), seq.end(), seq.begin(), ::toupper);
1149 - for (int i = seq.size(); i >= 0; i--) {
1150 - if(seq[i] == 'T') {
1151 - seq[i] = 'U';
1152 - } else if (!(seq [i] == 'A' || seq [i] == 'U' || seq [i] == '&'
1153 - || seq [i] == 'G' || seq [i] == 'C')) {
1154 - seq = seq.erase(i,1);
1155 - }
1156 - }
1157 - return seq;
1158 -}
1159 -
1160 -// Based on the 2d structure find all positions of the pairings.
1161 -vector<Link> search_pairing(string& struc, vector<Component>& v) {
1162 -
1163 - vector<Link> vec;
1164 - stack<uint> parentheses;
1165 - stack<uint> crochets;
1166 - stack<uint> accolades;
1167 - stack<uint> chevrons;
1168 -
1169 - uint count = 0;
1170 - uint debut = v[count].pos.first;
1171 - uint gap = 0;
1172 -
1173 - for (uint i = 0; i < struc.size(); i++) {
1174 - if (struc[i] == '(') {
1175 - parentheses.push(i + debut + gap - count);
1176 -
1177 - } else if (struc[i] == ')') {
1178 - Link l;
1179 - l.nts.first = parentheses.top();
1180 - l.nts.second = i + debut + gap - count;
1181 - vec.push_back(l);
1182 - parentheses.pop();
1183 -
1184 - } else if (struc[i] == '[') {
1185 - crochets.push(i + debut + gap - count);
1186 -
1187 - } else if (struc[i] == ']') {
1188 - Link l;
1189 - l.nts.first = crochets.top();
1190 - l.nts.second = i + debut + gap - count;
1191 - vec.push_back(l);
1192 - crochets.pop();
1193 -
1194 - } else if (struc[i] == '{') {
1195 - accolades.push(i + debut + gap - count);
1196 -
1197 - } else if (struc[i] == '}') {
1198 - Link l;
1199 - l.nts.first = accolades.top();
1200 - l.nts.second = i + debut + gap - count;
1201 - vec.push_back(l);
1202 - accolades.pop();
1203 -
1204 - } else if (struc[i] == '<') {
1205 - chevrons.push(i + debut + gap - count);
1206 -
1207 - } else if (struc[i] == '>') {
1208 - Link l;
1209 - l.nts.first = chevrons.top();
1210 - l.nts.second = i + debut + gap - count;
1211 - vec.push_back(l);
1212 - chevrons.pop();
1213 -
1214 - } else if (struc[i] == '&') {
1215 - count ++;
1216 - gap += v[count].pos.first - v[count - 1].pos.second - 1;
1217 - }
1218 - }
1219 - return vec;
1220 -}
1221 -
1222 -size_t count_contacts(string contacts) {
1223 -
1224 - size_t count = 0;
1225 - for (uint i = 0; i < contacts.size(); i++) {
1226 - if (contacts[i] == '*') {
1227 - count++;
1228 - }
1229 - }
1230 - return count;
1231 -}
1232 -
1233 -uint find_max_occurrences (string filepath) {
1234 - uint max = 0;
1235 - std::ifstream in = std::ifstream(filepath);
1236 - json js = json::parse(in);
1237 - string contacts_id;
1238 -
1239 - for(auto it = js.begin(); it != js.end(); ++it) {
1240 - contacts_id = it.key();
1241 - for(auto it2 = js[contacts_id].begin(); it2 != js[contacts_id].end(); ++it2) {
1242 - string test = it2.key();
1243 - if (!test.compare("occurences")) {
1244 - uint occ = it2.value();
1245 - if (occ > max) {
1246 - max = occ;
1247 - }
1248 - }
1249 - }
1250 - }
1251 - return max;
1252 -}
1253 -
1254 -uint find_max_sequence (string filepath) {
1255 - uint max = 0;
1256 - std::ifstream in = std::ifstream(filepath);
1257 - json js = json::parse(in);
1258 - string contacts_id;
1259 - string seq;
1260 -
1261 - for(auto it = js.begin(); it != js.end(); ++it) {
1262 - contacts_id = it.key();
1263 - for(auto it2 = js[contacts_id].begin(); it2 != js[contacts_id].end(); ++it2) {
1264 - string test = it2.key();
1265 - if (!test.compare("sequence")) {
1266 - seq = it2.value();
1267 - uint size = seq.size();
1268 - if (size > max) {
1269 - max = size;
1270 - }
1271 - }
1272 - }
1273 - }
1274 - return max;
1275 -}
1276 -
1277 -vector<string> find_components(string sequence, string delimiter) {
1278 - vector<string> list;
1279 - string seq = sequence;
1280 - string subseq;
1281 - uint fin = 0;
1282 -
1283 - while(seq.find(delimiter) != string::npos) {
1284 - fin = seq.find(delimiter);
1285 -
1286 - subseq = seq.substr(0, fin);
1287 - seq = seq.substr(fin + 1);
1288 - list.push_back(subseq); // new component sequence
1289 - }
1290 - if (!seq.empty()) {
1291 - list.push_back(seq);
1292 - }
1293 - return list;
1294 -}
1295 -
1296 -vector<uint> find_contacts(vector<string>& struc2d, vector<Component>& v) {
1297 - vector<uint> positions;
1298 - string delimiter = "*";
1299 - uint debut;
1300 - for (uint i = 0; i < v.size(); i++) {
1301 - debut = v[i].pos.first;
1302 - uint pos = struc2d[i].find(delimiter, 0);
1303 - while(pos != string::npos && pos <= struc2d[i].size())
1304 - {
1305 - positions.push_back(pos + debut);
1306 - pos = struc2d[i].find(delimiter, pos+1);
1307 - }
1308 - }
1309 - return positions;
1310 -}
1311 -
1312 void MOIP::allowed_motifs_from_json(args_of_parallel_func arg_struct, vector<pair<uint, char>> errors_id) 1145 void MOIP::allowed_motifs_from_json(args_of_parallel_func arg_struct, vector<pair<uint, char>> errors_id)
1313 { 1146 {
1314 - /* 1147 + // Searches where to place some JSON motifs in the RNA
1315 - Searches where to place some JSON motifs in the RNA
1316 - */
1317 path jsonfile = arg_struct.motif_file; 1148 path jsonfile = arg_struct.motif_file;
1318 mutex& posInsertionSites_access = arg_struct.posInsertionSites_mutex; 1149 mutex& posInsertionSites_access = arg_struct.posInsertionSites_mutex;
1319 1150
...@@ -1389,7 +1220,7 @@ void MOIP::allowed_motifs_from_json(args_of_parallel_func arg_struct, vector<pai ...@@ -1389,7 +1220,7 @@ void MOIP::allowed_motifs_from_json(args_of_parallel_func arg_struct, vector<pai
1389 if (verbose_) cout << "\t> Considering motif JSON " << contacts_id << "\t" << seq << ", " << struct2d << " "; 1220 if (verbose_) cout << "\t> Considering motif JSON " << contacts_id << "\t" << seq << ", " << struct2d << " ";
1390 1221
1391 Motif temp_motif = Motif(v, contacts_id, nb_contacts, tx_occurrences); 1222 Motif temp_motif = Motif(v, contacts_id, nb_contacts, tx_occurrences);
1392 - temp_motif.links_ = search_pairing(struct2d, v); 1223 + temp_motif.links_ = build_motif_pairs(struct2d, v);
1393 temp_motif.pos_contacts = find_contacts(component_contacts, v); 1224 temp_motif.pos_contacts = find_contacts(component_contacts, v);
1394 1225
1395 // Check if the motif can be inserted, checking the basepairs probabilities and theta 1226 // Check if the motif can be inserted, checking the basepairs probabilities and theta
...@@ -1421,4 +1252,4 @@ void MOIP::allowed_motifs_from_json(args_of_parallel_func arg_struct, vector<pai ...@@ -1421,4 +1252,4 @@ void MOIP::allowed_motifs_from_json(args_of_parallel_func arg_struct, vector<pai
1421 component_sequences.clear(); 1252 component_sequences.clear();
1422 } 1253 }
1423 1254
1424 -} 1255 +}
...\ No newline at end of file ...\ No newline at end of file
......
This diff is collapsed. Click to expand it.
...@@ -86,6 +86,18 @@ vector<Motif> load_json_folder(const string& path, const string& r ...@@ -86,6 +86,18 @@ vector<Motif> load_json_folder(const string& path, const string& r
86 vector<vector<Component>> find_next_ones_in(string rna, uint offset, vector<string>& vc); 86 vector<vector<Component>> find_next_ones_in(string rna, uint offset, vector<string>& vc);
87 vector<vector<Component>> json_find_next_ones_in(string rna, uint offset, vector<string>& vc); 87 vector<vector<Component>> json_find_next_ones_in(string rna, uint offset, vector<string>& vc);
88 88
89 +// utilities for Json motifs
90 +size_t count_nucleotide(string&);
91 +size_t count_delimiter(string&);
92 +size_t count_contacts(string&);
93 +string check_motif_sequence(string);
94 +bool checkSecondaryStructure(string);
95 +vector<Link> build_motif_pairs(string&, vector<Component>&);
96 +uint find_max_occurrences(string&);
97 +uint find_max_sequence(string&);
98 +vector<string> find_components(string&, string);
99 +vector<uint> find_contacts(vector<string>&, vector<Component>&);
100 +
89 // utilities to compare secondary structures: 101 // utilities to compare secondary structures:
90 bool operator==(const Motif& m1, const Motif& m2); 102 bool operator==(const Motif& m1, const Motif& m2);
91 bool operator!=(const Motif& m1, const Motif& m2); 103 bool operator!=(const Motif& m1, const Motif& m2);
......
...@@ -74,67 +74,57 @@ int main(int argc, char* argv[]) ...@@ -74,67 +74,57 @@ int main(int argc, char* argv[])
74 ("help,h", "Print the help message") 74 ("help,h", "Print the help message")
75 ("version", "Print the program version") 75 ("version", "Print the program version")
76 ("seq,s", po::value<string>(&inputName)->required(), "Fasta file containing the RNA sequence") 76 ("seq,s", po::value<string>(&inputName)->required(), "Fasta file containing the RNA sequence")
77 - ("descfolder,d", po::value<string>(&motifs_path_name), "A folder containing modules in .desc format, as produced by Djelloul & Denise's catalog program") 77 + ("descfolder,d", po::value<string>(&motifs_path_name), "A folder containing modules in .desc format, as produced by Djelloul & Denise's catalog program (deprecated)")
78 - ("rinfolder,x", po::value<string>(&motifs_path_name), "A folder containing CaRNAval's RINs in .txt format, as produced by script transform_caRNAval_pickle.py") 78 + ("rinfolder,r", po::value<string>(&motifs_path_name), "A folder containing CaRNAval's RINs in .txt format, as produced by script transform_caRNAval_pickle.py")
79 - ("jsonfolder,a", po::value<string>(&motifs_path_name), "A folder containing a custom motif library in .json format") 79 + ("jsonfolder,j", po::value<string>(&motifs_path_name), "A folder containing a custom motif library in .json format")
80 - 80 + ("pre-placed,x", po::value<string>(&motifs_path_name), "A CSV file providing motif insertion sites obtained with another tool.")
81 - ("jar3dcsv,j", po::value<string>(&motifs_path_name), "A file containing the output of JAR3D's search for motifs in the sequence, as produced by biorseo.py") 81 + ("function,f", po::value<char>(&obj_function_nbr)->default_value('B'),
82 - ("bayespaircsv,b", po::value<string>(&motifs_path_name), "A file containing the output of BayesPairing's search for motifs in the sequence, as produced by biorseo.py") 82 + "(A, B, C, D, E or F) Objective function to score module insertions:\n"
83 - ("first-objective,c", po::value<unsigned int>(&MOIP::obj_to_solve_)->default_value(2), "Objective to solve in the mono-objective portions of the algorithm") 83 + " (A) insert big modules\n (B) light, high-order modules\n"
84 + " (C) well-scored modules\n (D) light, high-order, well-scored\n modules\n"
85 + " (E, F) insert big modules with many\n contacts with proteins, different\n ponderations.\n"
86 + " C and D require position scores\n provided by --pre-placed.\n"
87 + " E and F require protein-contact\n information and should be\n used only with --jsonfolder.")
88 + ("mfe,E", "Minimize stacking energies\n (leads to MFE extimator)")
89 + ("mea,A", "(default) Maximize expected accuracy\n (leads to MEA estimator)")
90 + ("first-objective,c", po::value<unsigned int>(&MOIP::obj_to_solve_)->default_value(2),
91 + "(1 or 2) Objective to solve in the mono-objective portions of the algorithm.\n"
92 + " (1) is the module objective,\n given by --function\n"
93 + " (2) is energy-based objective,\n either MFE or MEA")
84 ("output,o", po::value<string>(&outputName), "A file to summarize the computation results") 94 ("output,o", po::value<string>(&outputName), "A file to summarize the computation results")
85 ("theta,t", po::value<float>(&theta_p_threshold)->default_value(1e-3, "0.001"), "Pairing probability threshold to consider or not the possibility of pairing") 95 ("theta,t", po::value<float>(&theta_p_threshold)->default_value(1e-3, "0.001"), "Pairing probability threshold to consider or not the possibility of pairing")
86 - ("function,f", po::value<char>(&obj_function_nbr)->default_value('B'), "What objective function to use to include motifs: square of motif size in nucleotides like "
87 - "RNA-MoIP (A), light motif size + high number of components (B), site score (C), light motif size + site score + high number of components (D)")
88 -
89 - ("mfe,E", "Minimize stacking energies as second criteria (should lead to MFE structure)")
90 - ("mea,A", "(default) Maximize expected accuracy as second criteria (should lead to MEA structure)")
91 -
92 ("disable-pseudoknots,n", "Add constraints forbidding the formation of pseudoknots") 96 ("disable-pseudoknots,n", "Add constraints forbidding the formation of pseudoknots")
93 ("limit,l", po::value<unsigned int>(&MOIP::max_sol_nbr_)->default_value(500), "Intermediate number of solutions in the Pareto set above which we give up the calculation.") 97 ("limit,l", po::value<unsigned int>(&MOIP::max_sol_nbr_)->default_value(500), "Intermediate number of solutions in the Pareto set above which we give up the calculation.")
94 - ("verbose,v", "Print what is happening to stdout"); 98 + ("verbose,v", "Print what is happening to console");
95 po::variables_map vm; 99 po::variables_map vm;
96 po::store(po::parse_command_line(argc, argv, desc), vm); 100 po::store(po::parse_command_line(argc, argv, desc), vm);
97 basename = remove_ext(inputName.c_str(), '.', '/'); 101 basename = remove_ext(inputName.c_str(), '.', '/');
98 102
99 try { 103 try {
100 po::store(po::parse_command_line(argc, argv, desc), vm); // can throw 104 po::store(po::parse_command_line(argc, argv, desc), vm); // can throw
101 - po::notify(vm);
102 105
103 if (vm.count("help") or vm.count("-h")) { 106 if (vm.count("help") or vm.count("-h")) {
104 - cout << "Biorseo, bio-objective integer linear programming framework to predict RNA secondary " 107 + cout << "Biorseo, Bi-Objective RNA Structure Efficient Optimizer" << endl
105 - "structures by including known RNA modules." 108 + << "Bio-objective integer linear programming framework to predict RNA secondary structures by including known RNA modules." << endl
106 - << endl 109 + << "Developped by Louis Becquey, 2018-2021\nLénaïc Durand, 2019\nNathalie Bernard, 2021" << endl << endl
107 - << "developped by Louis Becquey, 2018-2021" << endl 110 + << "Usage:\tYou must provide:\n\t1) a FASTA input file with -s," << endl
108 - << "Lénaïc Durand, 2019" << endl 111 + << "\t2) a module type with --rna3dmotifs, --carnaval, --contacts or --pre-placed," << endl
109 - << "Nathalie Bernard, 2021" << endl 112 + << "\t3) one module-based scoring function with --func A, B, C, D, E or F," << endl
110 - << endl 113 + << "\t4) one energy-based scoring function with --mfe or --mea," << endl
111 - << desc << endl; 114 + << "\t5) how to display results: in console (-v), or in a result file (-o)." << endl
115 + << endl
116 + << desc << endl;
112 return EXIT_SUCCESS; 117 return EXIT_SUCCESS;
113 } 118 }
114 if (vm.count("version")) { 119 if (vm.count("version")) {
115 cout << "Biorseo v2.1, dockerized, November 2021" << endl; 120 cout << "Biorseo v2.1, dockerized, November 2021" << endl;
116 return EXIT_SUCCESS; 121 return EXIT_SUCCESS;
117 } 122 }
123 + po::notify(vm); // throws on error, so do after help in case there are any problems
118 if (vm.count("mfe")) mea_or_mfe = 'a'; 124 if (vm.count("mfe")) mea_or_mfe = 'a';
119 if (vm.count("mea")) mea_or_mfe = 'b'; 125 if (vm.count("mea")) mea_or_mfe = 'b';
120 if (vm.count("verbose")) verbose = true; 126 if (vm.count("verbose")) verbose = true;
121 if (vm.count("disable-pseudoknots")) MOIP::allow_pk_ = false; 127 if (vm.count("disable-pseudoknots")) MOIP::allow_pk_ = false;
122 -
123 - if (!vm.count("jar3dcsv") and !vm.count("bayespaircsv") and !vm.count("descfolder") and !vm.count("rinfolder") and !vm.count("jsonfolder")) {
124 - cerr << "\033[31mYou must provide at least one of --descfolder, --rinfolder, --jsonfolder, --jar3dcsv or --bayespaircsv.\033[0m See --help "
125 - "for more information."
126 - << endl;
127 - return EXIT_FAILURE;
128 - }
129 -
130 - if ((vm.count("descfolder") or vm.count("jsonfolder") or vm.count("rinfolder")) and (obj_function_nbr == 'C' or obj_function_nbr == 'D')) {
131 - cerr << "\033[31mYou must provide --jar3dcsv or --bayespaircsv to use --function C or --function D.\033[0m See "
132 - "--help for more information."
133 - << endl;
134 - return EXIT_FAILURE;
135 - }
136 -
137 - po::notify(vm); // throws on error, so do after help in case there are any problems
138 } catch (po::error& e) { 128 } catch (po::error& e) {
139 cerr << "ERROR: \033[31m" << e.what() << "\033[0m" << endl; 129 cerr << "ERROR: \033[31m" << e.what() << "\033[0m" << endl;
140 cerr << desc << endl; 130 cerr << desc << endl;
...@@ -158,7 +148,7 @@ int main(int argc, char* argv[]) ...@@ -158,7 +148,7 @@ int main(int argc, char* argv[])
158 myRNA = RNA(fa->name(), fa->seq(), verbose); 148 myRNA = RNA(fa->name(), fa->seq(), verbose);
159 if (verbose) cout << "\t> " << inputName << " successfuly loaded (" << myRNA.get_RNA_length() << " nt)" << endl; 149 if (verbose) cout << "\t> " << inputName << " successfuly loaded (" << myRNA.get_RNA_length() << " nt)" << endl;
160 150
161 - // load CSV file 151 + // check motif folder exists
162 if (access(motifs_path_name.c_str(), F_OK) == -1) { 152 if (access(motifs_path_name.c_str(), F_OK) == -1) {
163 cerr << "\033[31m" << motifs_path_name << " not found\033[0m" << endl; 153 cerr << "\033[31m" << motifs_path_name << " not found\033[0m" << endl;
164 return EXIT_FAILURE; 154 return EXIT_FAILURE;
...@@ -167,16 +157,14 @@ int main(int argc, char* argv[]) ...@@ -167,16 +157,14 @@ int main(int argc, char* argv[])
167 157
168 /* FIND PARETO SET */ 158 /* FIND PARETO SET */
169 string source; 159 string source;
170 - if (vm.count("jar3dcsv")) 160 + if (vm.count("rinfolder"))
171 - source = "jar3dcsv";
172 - else if (vm.count("bayespaircsv"))
173 - source = "bayespaircsv";
174 - else if (vm.count("rinfolder"))
175 source = "rinfolder"; 161 source = "rinfolder";
176 else if (vm.count("descfolder")) 162 else if (vm.count("descfolder"))
177 source = "descfolder"; 163 source = "descfolder";
178 else if (vm.count("jsonfolder")) 164 else if (vm.count("jsonfolder"))
179 source = "jsonfolder"; 165 source = "jsonfolder";
166 + else if (vm.count("pre-placed"))
167 + source = "csvfile";
180 else 168 else
181 cerr << "ERR: no source of modules provided !" << endl; 169 cerr << "ERR: no source of modules provided !" << endl;
182 170
...@@ -254,22 +242,12 @@ int main(int argc, char* argv[]) ...@@ -254,22 +242,12 @@ int main(int argc, char* argv[])
254 if (verbose) cout << "Saving structures to " << outputName << "..." << endl; 242 if (verbose) cout << "Saving structures to " << outputName << "..." << endl;
255 outfile.open(outputName); 243 outfile.open(outputName);
256 outfile << fa->name() << endl << fa->seq() << endl; 244 outfile << fa->name() << endl << fa->seq() << endl;
245 +
257 for (uint i = 0; i < myMOIP.get_n_solutions(); i++) { 246 for (uint i = 0; i < myMOIP.get_n_solutions(); i++) {
258 outfile << myMOIP.solution(i).to_string() << endl << structure_with_contacts(myMOIP.solution(i)) << endl; 247 outfile << myMOIP.solution(i).to_string() << endl << structure_with_contacts(myMOIP.solution(i)) << endl;
259 string str1 = myMOIP.solution(i).to_string(); 248 string str1 = myMOIP.solution(i).to_string();
260 249
261 - // Check if the best score for obj2 is actually included in the results
262 - // string delimiter = "\t";
263 - // string obj2 = str1.substr(str1.find(delimiter) + delimiter.size());
264 - // obj2 = obj2.substr(0, obj2.find(delimiter));
265 - // if (obj2.compare(best_score) == 0)
266 - // flag = true;*/
267 } 250 }
268 - // if (!flag)
269 - // cout << "\033[1m\033[31mBest score not found for " << outputName << " !\033[0m" << endl;
270 - // else
271 - // cout << "OK for "<< outputName << "!" << endl;
272 -
273 outfile.close(); 251 outfile.close();
274 } 252 }
275 253
......
1 -__'CRYSTAL_STRUCTURE_OF_A_TIGHT-BINDING_GLUTAMINE_TRNA_BOUND_TO_GLUTAMINE_AMINOACYL_TRNA_SYNTHETASE_'_(PDB_00376)
2 -GGGGUAUCGCCAAGCGGUAAGGCACCGGAUUCUGAUUCCGGAGGUCGAGGUUCGAAUCCUCGUACCCCAGCCA
3 -(((((((((([..)))....(((.(((((.({..).))))).])))((((.(.}.).)))))))))))..... + JSON432 + JSON615 32.0000000 19.2280288
4 -................****.................................................****
5 -(((((((((([..)))....(((.((((((....).))))).])))((((.(...).)))))))))))..... + JSON169 + JSON432 + JSON615 48.0000000 19.2123884
6 -................****..........****...................................****
7 -(((((((.(([.....))..(((.(((((.({..).))))).])))((((.(.}.).)))))))))))..... + JSON322 + JSON478 52.0000000 18.3718588
8 -............****................**...................................****
9 -((((((((((...)))....(([.((((((....).)))))...))((((.(...).))))))))))).]... + JSON169 + JSON615 + JSON763 57.0000000 18.3583187
10 -................****..........****.......***...........................**
11 -(((((((((([..)))....(((.((((((....).))))).])))(((.........))))))))))..... + JSON169 + JSON386 + JSON432 + JSON615 64.0000000 18.2180422
12 -................****..........****...............****................****
13 -(((((([(((...))).)..(((.(((((.(...).))))).){))((((.(...).))))]})))))..... + JSON322 + JSON471 80.0000000 17.8060915
14 -........**.....................***................*...........*........**
15 -(((((([((([..))).)..((..((((((....).))))).]{))((((.(...).))))]})))))..... + JSON169 + JSON432 + JSON471 96.0000000 17.7717258
16 -........**............*.......****......................*.....*......****
17 -(((((.((((...)))....(((.(((((.[.....))))).){))((((.(..]).)))))})))))..... + JSON154 + JSON432 + JSON471 105.0000000 17.5888835
18 -........**......**.............****.....................*.....*......****
19 -(((((.(((([..)))....((..((((((....).))))).][))((((.(...).)))))])))))..... + JSON169 + JSON432 + JSON471 + JSON615 112.0000000 17.5772109
20 -........**......****..*.......****......................*.....*......****
21 -(((((.((((...)))....(((.((((([[.....))))).){))(((.....]]..))))})))))..... + JSON154 + JSON386 + JSON432 + JSON471 121.0000000 16.5955778
22 -........**......**.............****..............****...*.....*......****
23 -(((((.(((([..)))....((..((((((....).))))).][))(((.........))))])))))..... + JSON169 + JSON386 + JSON432 + JSON471 + JSON615 128.0000000 16.5828646
24 -........**......****..*.......****...............****...*.....*......****
25 -(((((.(.(([.........{)).(((((.(...).))))).][(}[[[[.[..)].]]]])])))))..... + JSON322 + JSON471 + JSON478 + JSON615 132.0000000 15.2549277
26 -........**..********...........***................*...........*......****
27 -(((((((.............(...((((((....).)))))....)(((.........))))))))))..... + JSON169 + JSON386 + JSON432 + JSON432 + JSON473 + JSON478 + JSON615 141.0000000 14.8831569
28 -........************.**.......****.......****....****...............*****
29 -((((((..(((.........))).(((((.......)))))....(((((.(...).)))))))))))..... + JSON38 2916.0000000 14.7452026
30 -*******.*******......*****.....******............................********
31 -((((((..(((.........))).(((((.......)))))....((((.........))))))))))..... + JSON38 + JSON386 2932.0000000 13.7508564
32 -*******.*******......*****.....******............****............********
33 -((((((..(((.........))).(((((.......)))))....((....(...)....))))))))..... + JSON38 + JSON473 2941.0000000 11.8254010
34 -*******.*******......*****.....******..........****...*..........********
35 -(((((((.............(...((((((....).)))))....)(((.........))))))))))..... + JSON169 + JSON386 + JSON432 + JSON432 + JSON473 + JSON478 + JSON615 141.0000000 14.8831569
36 -........************.**.......****.......****....****..*.............****
37 -(((((.(.(([.........{)).(((((.(...).))))).][(}[[[[.[..)].]]]])])))))..... + JSON322 + JSON471 + JSON478 + JSON615 132.0000000 15.2549277
38 -........**..********...........***......................*.....*......****
39 -(((((.(((([..)))....((..((((((....).))))).][))((((.(...).)))))])))))..... + JSON169 + JSON432 + JSON471 + JSON615 112.0000000 17.5772109
40 -........**......****..*.......****................*...........*......****
41 -(((((.((((...)))....(((.(((((.[.....))))).){))((((.(..]).)))))})))))..... + JSON154 + JSON432 + JSON471 105.0000000 17.5888835
42 -........**......**.............****...............*...........*......****
43 -(((((([((([..))).)..((..((((((....).))))).]{))((((.(...).))))]})))))..... + JSON169 + JSON432 + JSON471 96.0000000 17.7717258
44 -........**............*.......****................*...........*......****
45 -(((((([(((...))).)..(((.(((((.(...).))))).){))((((.(...).))))]})))))..... + JSON322 + JSON471 80.0000000 17.8060915
46 -........**.....................***......................*.....*........**
47 -(((((((((([..)))....(((.(((((.({..).))))).])))((((.(.}.).)))))))))))..... + JSON322 + JSON615 32.0000000 19.2280288
48 -................****............**.....................................**
1 -__'CRYSTAL_STRUCTURE_OF_A_TIGHT-BINDING_GLUTAMINE_TRNA_BOUND_TO_GLUTAMINE_AMINOACYL_TRNA_SYNTHETASE_'_(PDB_00376)
2 -GGGGUAUCGCCAAGCGGUAAGGCACCGGAUUCUGAUUCCGGAGGUCGAGGUUCGAAUCCUCGUACCCCAGCCA
3 -(((((((((([..)))....(((.(((((.({..).))))).])))((((.(.}.).)))))))))))..... + JSON322 + JSON615 1.5000000 19.2280288
4 -................****............**.....................................**
5 -(((((((((([..)))....(((.(((((.(...).))))).])))((((.(...).)))))))))))..... + JSON322 + JSON615 1.5000200 19.2269926
6 -................****............**.....................................**
7 -(((((((.(([.....))..(((.(((((.({..).))))).])))((((.(.}.).)))))))))))..... + JSON322 + JSON478 1.7737056 18.3718588
8 -............****................**...................................****
9 -((((((((((...)))....(([.((((((....).)))))...))((((.(...).))))))))))).]... + JSON169 + JSON615 + JSON763 1.8613531 18.3583187
10 -................****..........****.......***...........................**
11 -.((((((((([..)))....(((.(((((.({..).))))).])))((((.(.}.).))))))))))...... + JSON322 + JSON432 + JSON615 2.0000000 18.2455939
12 -................****............**.................................******
13 -(((((((((({..)))....(((.((((([([..).))))).})))(((....].]..))))))))))..... + JSON322 + JSON386 + JSON615 2.0000200 18.2347086
14 -................****............**...............****..................**
15 -(((((([(((...))).)..(((.(((((.(...).))))).){))((((.(...).))))]})))))..... + JSON322 + JSON471 3.0000000 17.8060915
16 -........**.....................***......................*.....*........**
17 -(((((.((((...)))....(((.(((((.(...).))))).)[))((((.(...).)))))])))))..... + JSON322 + JSON471 + JSON615 3.5000000 17.6115766
18 -........**......****...........***......................*.....*........**
19 -.((((.((((...)))....(((.(((((.(...).))))).)[))((((.(...).)))))]))))...... + JSON322 + JSON432 + JSON471 + JSON615 4.0000000 16.6291417
20 -........**......****...........***......................*.....*....******
21 -.((((.((((...)))....(((.((((([(...).))))).){))(((......]..))))}))))...... + JSON322 + JSON386 + JSON432 + JSON471 + JSON615 4.5000000 15.6358360
22 -........**......****...........***...............****...*.....*....******
23 -(((((.(.(([.........{)).(((((<(...).))))).][(}[[[.....)>..]]])])))))..... + JSON322 + JSON386 + JSON471 + JSON478 + JSON615 4.7737056 14.2616220
24 -........**..********...........***...............****...*.....*......****
25 -.((((.((((...)))....(((.(((((.(...).)))))[){))(....(...)...]))}))))...... + JSON322 + JSON432 + JSON471 + JSON473 + JSON615 4.8613531 13.7313706
26 -........**......****...........***.............****...*.*.....*....******
27 -.((((.((.....[[)....(]].((((([(...).)))))..{[)(((.....]]..))))}))))...... + JSON322 + JSON386 + JSON432 + JSON432 + JSON471 + JSON615 5.0000000 13.7177100
28 -........****.**.****...........***...............****...*.....*....******
29 -(((((.(.((..........[)).(((((.(...).)))))(({(][....[..)]..))])})))))..... + JSON322 + JSON471 + JSON473 + JSON478 + JSON615 5.1350587 12.3759713
30 -........**..********...........***.............****.....*.....*.....*****
31 -.((((.....(..[[)....(]]..(((([(...).))))...{[)(((.....]]..))).}))))...... + JSON322 + JSON386 + JSON432 + JSON471 + JSON615 + JSON632 5.2737056 11.9911280
32 -......****...**.****...**......***...............****...*.....*....******
33 -.((((.((.....[[)....(]].(((((.(...).)))))[[{.)(....(...)..]]))}))))...... + JSON322 + JSON432 + JSON432 + JSON471 + JSON473 + JSON615 5.3613531 11.8157013
34 -........****.**.****...........***.............****...*.*.....*....******
35 -.((....(.....[[)....(]].((((([(...).))))).{{[)(((.....]]..))).}.}))...... + JSON322 + JSON386 + JSON432 + JSON432 + JSON471 + JSON615 + JSON928 5.5000000 11.2444565
36 -...****.****.**.****...........***...............****...*.....*....******
37 -.(........(..[[)....(]].((((([(...).))))).{{[)(((.....]]..))).}..})...... + JSON322 + JSON386 + JSON432 + JSON433 + JSON471 + JSON615 + JSON632 5.7737056 10.1268257
38 -..********...**.****...........***...............****...*.....***..******
39 -.((....(.....[[)....(]].(((((.(...).)))))[[{[)(....(..])..]]).}..))...... + JSON322 + JSON432 + JSON432 + JSON471 + JSON473 + JSON615 + JSON928 5.8613531 9.3610813
40 -...****.****.**.****...........***.............****.....*.....**...******
41 -.((....(.....[[)....(]].((.[.[(...)....)).{{[)(((.....]].]))).}.}))...... + JSON156 + JSON322 + JSON386 + JSON432 + JSON432 + JSON471 + JSON615 + JSON928 6.0000000 8.2749650
42 -...****.****.**.****...........***.****..........****...*.....*....******
43 -.(........(..[[)....(]].(((((.(...).)))))[[{.)(....(...)..]]).}...)...... + JSON322 + JSON432 + JSON433 + JSON471 + JSON473 + JSON615 + JSON632 6.1350587 8.2098083
44 -..********...**.****...........***.............****...*.*.....***..******
45 -.(........(..[[)....(]].((.[.[(...)....)).{{[)(((.....]].]))).}..})...... + JSON156 + JSON322 + JSON386 + JSON432 + JSON433 + JSON471 + JSON615 + JSON632 6.2737056 7.1573341
46 -..********...**.****...........***.****..........****...*.....***..******
47 -.((....(.....[[)....(]].((.[..(...)....)){{<[)(....(..]).]}}).>..))...... + JSON156 + JSON322 + JSON432 + JSON432 + JSON471 + JSON473 + JSON615 + JSON928 6.3613531 6.3915897
48 -...****.****.**.****...........***.****........****.....*.....**...******
49 -.(........(..[[)....(]].((.[..(...)....)){{<.)(....(...).]}}).>...)...... + JSON156 + JSON322 + JSON432 + JSON433 + JSON471 + JSON473 + JSON615 + JSON632 6.6350587 5.2403168
50 -..********...**.****...........***.****........****...*.*.....***..******
51 -.((((.((((...)))....((..(((((.({..).)))))[[<))(....(.}.)..]]))>))))...... + JSON322 + JSON432 + JSON471 + JSON473 + JSON615 4.8613531 13.7314599
52 -........**......****..*.........**.............****...*.*.....*....******
53 -.((((.((((...)))....(((.(((((.(...).))))).)[))((((.(...).)))))]))))...... + JSON322 + JSON432 + JSON471 + JSON615 4.0000000 16.6291417
54 -........**......****...........***................*...........*....******
55 -(((((.((((...)))....(((.(((((.(...).))))).)[))((((.(...).)))))])))))..... + JSON322 + JSON471 + JSON615 3.5000000 17.6115766
56 -........**......****...........***................*...........*........**
57 -(((((([(((...))).)..(((.(((((.(...).))))).){))((((.(...).))))]})))))..... + JSON322 + JSON471 3.0000000 17.8060915
58 -........**.....................***................*...........*........**
1 -__'CRYSTAL_STRUCTURE_OF_A_TIGHT-BINDING_GLUTAMINE_TRNA_BOUND_TO_GLUTAMINE_AMINOACYL_TRNA_SYNTHETASE_'_(PDB_00376)
2 -GGGGUAUCGCCAAGCGGUAAGGCACCGGAUUCUGAUUCCGGAGGUCGAGGUUCGAAUCCUCGUACCCCAGCCA
3 -(((((((((([..)))....(((.(((((.({..).))))).])))((((.(.}.).)))))))))))..... 0.0000000 19.2280288
4 -.........................................................................
5 -(((((((((([..)))....(((.(((((.({..).))))).])))((((.(.}.).)))))))))))..... + JSON322 0.0000000 19.2280288
6 -................................**.....................................**