9 #include <basic/Tracer.hh>
20 #include <basic/options/option.hh>
21 #include <basic/options/keys/OptionKeys.hh>
22 #include <basic/options/keys/remodel.OptionKeys.gen.hh>
55 #include <ObjexxFCL/FArray2D.hh>
83 #include <utility/vector1.hh>
99 static basic::Tracer
TR(
"REMODELw");
104 translate_index( rval.translate_index ),
107 copy_begin( rval.copy_begin ),
108 copy_end (rval.copy_end ),
109 src_begin (rval.src_begin),
110 src_end (rval.src_end),
111 manager( rval.manager ),
113 rvjump_pose( rval.rvjump_pose)
122 if (
this != & rval) {
151 using namespace basic::options;
156 bool NtermExt =
false;
157 bool CtermExt =
false;
165 if (option[ OptionKeys::remodel::repeat_structure].user()){
166 this->ss.append(this->ss);
180 std::cout <<
"N-terminal is extended" << std::endl;
185 if (last_ext == model_length -1) {
186 std::cout <<
"C-terminal is extended" << std::endl;
192 if (data.
blueprint[model_length-1].index != data.
blueprint[model_length-1].original_index) {
194 std::cout <<
"length change found" << std::endl;
199 if (option[ OptionKeys::remodel::repeat_structure].user() && CtermExt){
200 model_length = model_length * 2;
216 std::vector<protocols::forge::remodel::LineObject> temp_for_truncation;
219 for (
int i = 0, ie=(
int)data.
blueprint.size(); i < ie ; i++){
221 temp_for_truncation.push_back(data.
blueprint[i]);
226 for (
int i = 0, ie = (
int)temp_for_truncation.size(); i < ie; i++){
227 keep[temp_for_truncation[i].original_index] =
true;
229 if (temp_for_truncation[i].original_index != 0){
230 translate_index[temp_for_truncation[i].original_index] = i+1;
234 std::vector<protocols::forge::remodel::LineObject> temp_for_copy;
235 std::vector<protocols::forge::remodel::LineObject> temp;
236 std::vector<protocols::forge::remodel::Segment> segmentStorageVector;
237 std::vector<protocols::forge::remodel::Segment> segment_to_copyVector;
238 std::vector<protocols::forge::remodel::Segment> segment_to_copyNewIndex;
239 for (
int i = 0, ie = (
int)data.
blueprint.size(); i < ie; i++){
243 else if (data.
blueprint[i].sstype ==
"."){
244 temp_for_copy.push_back(data.
blueprint[i]);
247 std::cout <<
"assignment error" << std::endl;
251 if (option[ OptionKeys::remodel::repeat_structure].user()){
258 for (
int i = 0, ie = (
int)data.
blueprint.size(); i < ie; i++){
264 for (
int i = 0, ie = (
int)data.
blueprint.size(); i < ie; i++){
282 else if (data.
blueprint[i].sstype ==
"."){
286 std::cout <<
"assignment error" << std::endl;
292 if ( !temp_for_copy.empty() ){
293 safe_root_ = temp_for_copy.front().index;
301 for (
int i = 0, ie = (
int)temp.size()-1; i < ie ; i++) {
305 segment.residues.push_back(first.
index);
307 if (i+1 == (
int)temp.size()-1){
309 segment.residues.push_back(next.
index);
310 segmentStorageVector.push_back(segment);
311 segment.residues.clear();
314 else if (next.
index != first.
index+1 && (i+1) == (
int)temp.size()-1 ){
315 segment.residues.push_back(first.
index);
316 segmentStorageVector.push_back(segment);
317 segment.residues.clear();
318 segment.residues.push_back(next.
index);
319 segmentStorageVector.push_back(segment);
320 segment.residues.clear();
323 segment.residues.push_back(first.
index);
324 if (i+1 == (
int)temp.size()-1){
325 segment.residues.push_back(next.
index);
326 segmentStorageVector.push_back(segment);
327 segment.residues.clear();
330 segmentStorageVector.push_back(segment);
331 segment.residues.clear();
351 using namespace basic::options;
357 Size insertStartIndex =0;
358 Size insertEndIndex =0;
359 if (option[OptionKeys::remodel::domainFusion::insert_segment_from_pdb].user()){
360 TR <<
"Processing insertion SS info..." << std::endl;
363 TR <<
"debug: insertStartIndex: " << insertStartIndex <<
" insertEndIndex: " << insertEndIndex << std::endl;
375 String build_aa_type = option[OptionKeys::remodel::generic_aa];
377 runtime_assert (build_aa_type.size() == 1);
379 if (option[OptionKeys::remodel::use_blueprint_sequence].user()){
381 if ( data.
blueprint[i].resname.compare(
"x") == 0 || data.
blueprint[i].resname.compare(
"X") == 0 ){
382 aa.append(build_aa_type);
390 if (option[OptionKeys::remodel::repeat_structure].user()){
392 Size copies = option[OptionKeys::remodel::repeat_structure];
394 aa.append( monomer_seq );
400 if ( build_aa_type.compare(
"A") != 0){
404 aa.append(build_aa_type);
411 std::cout <<
"AA for build: " << aa << std::endl;
416 for (
int i = 0, ie = (
int)segmentStorageVector.size(); i < ie ; i++){
417 this->begin.push_back(segmentStorageVector[i].residues.front());
418 this->
end.push_back(segmentStorageVector[i].residues.back());
420 core::Size idFront = segmentStorageVector[i].residues.front();
421 core::Size idBack = segmentStorageVector[i].residues.back();
427 core::Size head = -1, tail = -1, headNew = -1, tailNew = -1;
430 if ( option[ OptionKeys::remodel::repeat_structure].user() && !temp_for_copy.empty()) {
435 if (idFront > seg_size && idBack > seg_size){
447 else if (idFront <= seg_size && idBack > seg_size){
448 if (idBack == 2*seg_size){
451 head = data.
blueprint[ idFront-1 ].original_index;
452 tail = data.
blueprint[ idBack-seg_size-1 ].original_index + data.
blueprint.back().original_index;
453 if (data.
blueprint.back().original_index == 0){
454 tail = data.
blueprint[ idBack-seg_size-1 ].original_index + seg_size;
456 headNew = data.
blueprint[ idFront-1 ].index;
457 tailNew = data.
blueprint[ idBack-seg_size-1 ].index + seg_size;
459 head = data.
blueprint[ idFront-1 ].original_index;
460 tail = data.
blueprint[ idBack-1 ].original_index;
461 headNew = data.
blueprint[ idFront-1 ].index;
462 tailNew = data.
blueprint[ idBack-1 ].index;
464 }
else if ( option[ OptionKeys::remodel::repeat_structure].user() && temp_for_copy.empty()) {
467 if (idBack >= range_limit){
469 idBack = range_limit;
470 head = data.
blueprint[ idFront-1 ].original_index;
471 tail = data.
blueprint[ idBack-1 ].original_index;
472 headNew = data.
blueprint[ idFront-1 ].index;
473 tailNew = data.
blueprint[ idBack-1 ].index;
476 head = data.
blueprint[ idFront-1 ].original_index;
477 tail = data.
blueprint[ idBack-1 ].original_index;
478 headNew = data.
blueprint[ idFront-1 ].index;
479 tailNew = data.
blueprint[ idBack-1 ].index;
482 int gap = idBack - idFront +1;
486 TR <<
"head " << head <<
":" << headNew <<
" tail " << tail <<
":" << tailNew <<
" gap " << gap <<
" ss " << DSSP.size() <<
" " << DSSP.substr( headNew-1, gap ) << std::endl;
488 this->loops.add_loop(segmentStorageVector[i].residues.front(), segmentStorageVector[i].residues.back(), segmentStorageVector[i].residues.front()+1, 0, 0);
491 if ( headNew <= insertStartIndex && tailNew >= insertEndIndex && ((insertEndIndex-insertStartIndex) != 0)){
492 TR <<
"segment contain insertion, skip normal SegmentRebuild instructions, use SegmentInsert instructions instead" << std::endl;
493 String beforeInsert = DSSP.substr(headNew-1, insertStartIndex-head+1);
494 String afterInsert = DSSP.substr(insertEndIndex+1, tailNew-insertEndIndex-1);
495 TR <<
"DEBUG beforeInsert: " << beforeInsert << std::endl;
496 TR <<
"DEBUG afterInsert: " << afterInsert << std::endl;
504 std::string insert_SS_string = beforeInsert + blank + afterInsert;
505 TR <<
"DEBUG insert_SS_string: " << insert_SS_string << std::endl;
510 segIns =
new SegmentInsert( Interval(head,tail), insert_SS_string , data.
insertPose,
false , connection_scheme);
511 this->manager.add(segIns);
515 if (head == 0 && segmentStorageVector[i].residues.front() == 1 ){
516 TR <<
"debug: N-term ext" << std::endl;
517 this->manager.add(
new SegmentRebuild( Interval(1,tail), DSSP.substr( headNew-1, gap ), aa.substr( headNew-1,gap )) );
519 else if (tail ==0 && segmentStorageVector[i].residues.back() == model_length){
520 TR <<
"debug: C-term ext" << std::endl;
521 gap = (
int)data.
blueprint.size()-segmentStorageVector[i].residues.front()+1;
522 this->manager.add(
new SegmentRebuild( Interval(head,input_pose.
total_residue()), DSSP.substr( segmentStorageVector[i].residues.front()-1, gap ), aa.substr( segmentStorageVector[i].residues.front()-1, gap )) );
524 else if (head != 0 && headNew == 1 && segmentStorageVector[i].residues.front() == 1 ){
525 TR <<
"debug: N-term deletion" << std::endl;
526 this->manager.add(
new SegmentRebuild( Interval(1,tail), DSSP.substr( headNew-1, gap ), aa.substr( headNew-1,gap )) );
528 else if (tail != input_pose.
total_residue() && tailNew == (
Size)model_length && headNew == 1 && segmentStorageVector[i].residues.back() == model_length ){
529 gap = (
int)data.
blueprint.size()-segmentStorageVector[i].residues.front()+1;
530 TR <<
"debug: C-term deletion" << std::endl;
531 this->manager.add(
new SegmentRebuild( Interval(head,input_pose.
total_residue()), DSSP.substr( segmentStorageVector[i].residues.front()-1, gap ), aa.substr( segmentStorageVector[i].residues.front()-1, gap )) );
533 TR <<
"debug: normal rebuild" << std::endl;
534 this->manager.add(
new SegmentRebuild( Interval(head, tail), DSSP.substr( headNew-1, gap ), aa.substr( headNew-1, gap )) );
630 this->task = TF->create_task_and_apply_taskoperations( built_pose );