37 #include <basic/Tracer.hh>
38 #include <utility/vector1.hh>
41 #include <ObjexxFCL/string.functions.hh>
46 static basic::Tracer
tr(
"core.pose");
49 using namespace core::conformation;
66 bool const auto_termini
71 using namespace core::chemical;
73 if ( !sequence_in.size() )
return requested_types;
79 std::vector< Size > oneletter_to_fullname_index;
82 std::string one_letter_sequence = sequence_in.substr( 0,1 );
84 bool in_bracket =
false;
86 for (
Size seqpos = 1; seqpos < sequence_in.length(); ++seqpos ) {
88 char aa = sequence_in[ seqpos ];
96 }
else if ( sequence_in[ seqpos ] ==
']' ) {
98 fullname_list.push_back( fullname );
99 last_index = fullname_list.size();
107 one_letter_sequence += aa;
108 oneletter_to_fullname_index.push_back( last_index );
113 oneletter_to_fullname_index.push_back( last_index );
114 tr.Debug <<
"one_letter: " << one_letter_sequence << std::endl;
115 tr.Debug <<
"seq_in: " << sequence_in << std::endl;
118 for (
Size seqpos = 1; seqpos <= one_letter_sequence.length(); ++seqpos ) {
119 char aa = one_letter_sequence[ seqpos-1 ];
122 bool is_lower_terminus(
false), is_upper_terminus(
false);
125 Size index = oneletter_to_fullname_index[ seqpos-1 ];
129 requested_types.push_back( &residue_set.
name_map( fullname_list[ index ] ) );
136 is_lower_terminus = auto_termini && ( seqpos == 1 );
137 is_upper_terminus = auto_termini && ( seqpos == one_letter_sequence.length() );
138 bool const is_terminus( is_lower_terminus || is_upper_terminus );
142 for (
Size j = 1; j <= rsd_type_list.size(); ++j ) {
145 bool const is_polymer( rsd_type.
is_polymer() );
148 if ( is_polymer && ( is_terminus && ( nvariants == 0 ) ) )
continue;
155 if ( !best_index ) utility_exit_with_message(
" can't find residue type at pos " + ObjexxFCL::string_of(seqpos) +
156 "in sequence "+ sequence_in);
158 requested_types.push_back( rsd_type_list[ best_index ] );
161 tr.Trace <<
"residue_types_from_sequence(): seqpos: " << seqpos <<
" aa " << aa <<
" " << my_aa << std::endl;
165 return requested_types;
196 using namespace chemical;
197 using namespace carbohydrates;
201 if (!sequence.size()) {
202 return residue_types;
206 string sequence_with_hyphen = sequence +
'-';
209 uint const sequence_end = sequence_with_hyphen.length();
211 string morpheme =
"";
212 string residue_type_name =
"";
213 bool linkage_assigned =
false;
214 bool anomer_assigned =
false;
215 bool L_or_D_assigned =
false;
216 for (
uint chr_num = 0; chr_num < sequence_end; ++chr_num) {
217 character = sequence_with_hyphen[chr_num];
219 if (character !=
'-') {
220 morpheme += character;
223 if (morpheme[0] ==
'(') {
227 }
else if (morpheme[0] ==
'>') {
228 if (anomer_assigned || L_or_D_assigned) {
229 utility_exit_with_message(
"Saccharide sequence input error: "
230 "the linkage notation must precede other prefixes.");
232 residue_type_name +=
'-' + morpheme +
'-';
233 linkage_assigned =
true;
238 }
else if (morpheme ==
"alpha" || morpheme ==
"beta") {
239 if (L_or_D_assigned) {
240 utility_exit_with_message(
"Saccharide sequence input error: "
241 "alpha/beta notation must precede L- or D- prefixes.");
244 if (!linkage_assigned) {
245 residue_type_name +=
"->4)-";
246 linkage_assigned =
true;
248 residue_type_name += morpheme +
'-';
249 anomer_assigned =
true;
254 }
else if (morpheme ==
"L" || morpheme ==
"D") {
256 if (!linkage_assigned) {
257 residue_type_name +=
"->4)-";
258 linkage_assigned =
true;
260 if (!anomer_assigned) {
261 residue_type_name +=
"alpha-";
262 anomer_assigned =
true;
264 residue_type_name += morpheme +
'-';
265 L_or_D_assigned =
true;
269 }
else if (morpheme.length() >= 3 &&
270 CarbohydrateInfo::CODE_TO_ROOT_MAP.count(morpheme.substr(0, 3))) {
272 if (!linkage_assigned) {
273 residue_type_name +=
"->4)-";
275 if (!anomer_assigned) {
276 residue_type_name +=
"alpha-";
278 if (!L_or_D_assigned) {
279 residue_type_name +=
"D-";
283 residue_type_name += morpheme.substr(0, 3);
286 if (morpheme.length() == 4) {
287 char suffix = morpheme[3];
288 if (suffix ==
'f' || suffix ==
'p' || suffix ==
's') {
289 residue_type_name += suffix;
291 utility_exit_with_message(
"Saccharide sequence input error: "
292 "Rosetta currently only supports 5-, 6-, or 7-membered rings.");
294 }
else if (morpheme.length() > 4) {
295 utility_exit_with_message(
"Saccharide sequence input error: "
296 "Unrecognized modified sugar indicated by suffix.");
300 residue_types.push_back(& residue_set.
name_map(residue_type_name));
304 residue_type_name =
"";
305 linkage_assigned =
false;
306 anomer_assigned =
false;
307 L_or_D_assigned =
false;
311 utility_exit_with_message(
"Saccharide sequence input error: "
312 "Unrecognized sugar and/or notation in sequence.");
317 return residue_types;
337 bool const auto_termini
348 bool jump_to_next =
false;
349 for (
Size i = 1, ie = requested_types.size(); i <= ie; ++i ) {
367 tr.Trace <<
"make_pose_from_sequence(): seqpos: " << i <<
" " << new_rsd->aa() << std::endl;
388 }
else if ( jump_to_next ) {
389 jump_to_next =
false;
391 tr.Warning <<
"Residue following X, Z, or an upper terminus is _not_ a lower terminus type! Continuing ..." << std::endl;
403 tr.Debug <<
"sequence in pose: " << pose.
sequence() << std::endl;
419 bool const auto_termini
458 bool const auto_termini)
461 using namespace chemical;
462 using namespace conformation;
473 uint last_index = residue_types.size();
474 for (
uint i = last_index; i >= 1; --i) {
479 if (i == last_index) {
497 tr.Debug <<
"Created carbohydrate pose with sequence: " << pose.
chain_sequence(1) << endl;
508 bool const auto_termini )
510 using namespace chemical;
521 bool const auto_termini )
523 using namespace pose;
538 for (
Size i = 0; i < annotated_seq.length(); ++i ) {
539 if ( annotated_seq.at(i) ==
'[' ) add =
false;
540 if ( add ) oneletter_seq += annotated_seq.at(i);
541 if ( annotated_seq.at(i) ==
']' ) add =
true;
544 return oneletter_seq;