35 #include <numeric/random/random.hh>
36 #include <numeric/random/WeightedSampler.hh>
39 #include <basic/options/option.hh>
40 #include <basic/options/keys/cm.OptionKeys.gen.hh>
43 #include <utility/vector1.hh>
44 #include <ObjexxFCL/format.hh>
45 #include <basic/Tracer.hh>
47 static basic::Tracer
TR(
"protocols.hybridization.DomainAssembly" );
48 static numeric::random::RandomGenerator
RG(546131);
52 namespace hybridization {
56 std::list <Size>
const & residue_list,
57 std::list <Size>
const & ref_residue_list) {
59 string seq_pose, seq_ref, aligned;
65 tm_align.
apply(aligned_pose, ref_pose, residue_list, ref_residue_list);
66 tm_align.
alignment2AtomMap(aligned_pose, ref_pose, residue_list, ref_residue_list, n_mapped_residues, atom_map);
70 using namespace ObjexxFCL::fmt;
71 TR <<
"Align domain with TMscore of " << F(8,3,TMscore) << std::endl;
72 TR << seq_pose << std::endl;
73 TR << aligned << std::endl;
74 TR << seq_ref << std::endl;
76 std::list <Size> full_residue_list;
78 full_residue_list.push_back(ires);
81 if (n_mapped_residues >= 6) {
83 aln_cutoffs.push_back(6);
84 aln_cutoffs.push_back(4);
85 aln_cutoffs.push_back(3);
86 aln_cutoffs.push_back(2);
87 aln_cutoffs.push_back(1.5);
88 aln_cutoffs.push_back(1);
90 partial_align(aligned_pose, ref_pose, atom_map, full_residue_list,
true, aln_cutoffs, min_coverage);
105 for (
Size i=1; i<=poses.size(); ++i) {
106 pose_index_to_add.push_back(i);
108 while (pose_index_to_add.size() > 0) {
111 for (
Size i=1; i<=pose_index_to_add.size(); ++i) {
112 Size k_pose = pose_index_to_add[i];
113 sum_weight += domain_assembly_weights[k_pose];
114 weights_work.push_back(domain_assembly_weights[k_pose]);
117 if (sum_weight > 1e-6) {
118 numeric::random::WeightedSampler weighted_sampler_;
119 weighted_sampler_.weights(weights_work);
120 ipose = pose_index_to_add[weighted_sampler_.random_sample(
RG)];
123 ipose = pose_index_to_add[
RG.random_range(1,pose_index_to_add.size())];
126 poses_.push_back(poses[ipose]);
127 pose_index_added.push_back(ipose);
129 pose_index_to_add.clear();
130 for (
Size ipose=1; ipose<=poses.size(); ++ipose) {
132 for (
Size j=1; j<=pose_index_added.size(); ++j) {
133 if (ipose == pose_index_added[j]) {
139 pose_index_to_add.push_back(ipose);
149 remaining_resnum.clear();
152 bool deleting =
false;
153 for (
Size jres=1; jres<=resnum_list.size(); ++jres) {
154 if (resnum_list[jres] == pose.
pdb_info()->number(ires)) {
156 delete_list.push_back(ires);
161 remaining_resnum.push_back(pose.
pdb_info()->number(ires));
165 for (
Size i=delete_list.size(); i>=1; --i) {
176 for (
Size i=1; i<=covered_residues.size(); ++i) {
177 if ( pose.
pdb_info()->number(ires) == (
int)covered_residues[i] ) {
183 uncovered_residues.push_back(ires);
187 return uncovered_residues;
205 return gap_torr_0;
break;
207 return gap_torr_1;
break;
209 return gap_torr_2;
break;
211 return gap_torr_3;
break;
213 return gap_torr_4;
break;
215 return gap_torr_5;
break;
217 return gap_torr_6;
break;
219 return gap_torr_7;
break;
221 return gap_torr_8;
break;
231 if (
poses_.size() < 2)
return;
236 int range_start =
poses_[1]->pdb_info()->number(1);
237 int range_end =
poses_[1]->pdb_info()->number(1);
238 for (
Size ires = 1; ires <=
poses_[1]->total_residue(); ++ires) {
239 if (
poses_[1]->pdb_info()->number(ires) < range_start) {
240 range_start =
poses_[1]->pdb_info()->number(ires);
242 if (
poses_[1]->pdb_info()->number(ires) > range_end) {
243 range_end =
poses_[1]->pdb_info()->number(ires);
246 coverage_start.push_back(range_start);
247 coverage_end.push_back(range_end);
249 for (
Size ipose = 2; ipose <=
poses_.size(); ++ipose) {
251 range_start =
poses_[ipose]->pdb_info()->number(1);
252 range_end =
poses_[ipose]->pdb_info()->number(1);
253 for (
Size ires = 1; ires <=
poses_[ipose]->total_residue(); ++ires) {
254 if (
poses_[ipose]->pdb_info()->number(ires) < range_start) {
255 range_start =
poses_[ipose]->pdb_info()->number(ires);
257 if (
poses_[ipose]->pdb_info()->number(ires) > range_end) {
258 range_end =
poses_[ipose]->pdb_info()->number(ires);
261 coverage_start.push_back(range_start);
262 coverage_end.push_back(range_end);
264 bool align_success(
false);
265 for (
Size jpose = 1; jpose < ipose; ++jpose) {
266 int covered_size = coverage_end[jpose] - coverage_start[jpose] + 1;
267 int overlap_start = range_start > coverage_start[jpose] ? range_start:coverage_start[jpose];
268 int overlap_end = range_end < coverage_end[jpose] ? range_end:coverage_end[jpose];
269 int overlap = overlap_end - overlap_start;
270 Size normalize_length = covered_size < (
int)
poses_[ipose]->total_residue() ? covered_size:
poses_[ipose]->total_residue();
273 if (overlap > 0.3 * normalize_length) {
275 std::list <Size> i_residue_list;
276 std::list <Size> full_residue_list;
277 for (
Size ires = 1; ires <=
poses_[ipose]->total_residue(); ++ires) {
278 full_residue_list.push_back(ires);
279 if (
poses_[ipose]->pdb_info()->number(ires) >= overlap_start &&
280 poses_[ipose]->pdb_info()->number(ires) <= overlap_end) {
281 i_residue_list.push_back(ires);
287 std::list <Size> j_residue_list;
288 for (
Size jres = 1; jres <=
poses_[jpose]->total_residue(); ++jres) {
289 if (
poses_[jpose]->pdb_info()->number(jres) >= overlap_start &&
290 poses_[jpose]->pdb_info()->number(jres) <= overlap_end) {
291 j_residue_list.push_back(jres);
294 if (j_residue_list.size() < 0.3 * normalize_length)
continue;
297 string seq_pose, seq_ref, aligned;
307 using namespace ObjexxFCL::fmt;
308 TR <<
"Align domain with TMscore of " << F(8,3,TMscore) << std::endl;
309 TR << seq_pose << std::endl;
310 TR << aligned << std::endl;
311 TR << seq_ref << std::endl;
313 if (TMscore > 0.35) {
314 if (n_mapped_residues >= 6) {
316 aln_cutoffs.push_back(6);
317 aln_cutoffs.push_back(4);
318 aln_cutoffs.push_back(3);
319 aln_cutoffs.push_back(2);
320 aln_cutoffs.push_back(1.5);
321 aln_cutoffs.push_back(1);
324 align_success =
true;
328 if (align_success)
break;
333 if (!align_success) {
334 using namespace ObjexxFCL::fmt;
340 for (
Size ires=1; ires<=
poses_[ipose]->total_residue(); ++ires) {
341 covered_resnum.push_back(
poses_[ipose]->pdb_info()->number(ires));
343 for (
Size jpose = 1; jpose < ipose; ++jpose) {
345 if (uncovered_residues.size() == 0)
continue;
350 for (
Size i=1;i<=remaining_resnum.size();++i) resnum.push_back(remaining_resnum[i]);
351 for (
Size i=1;i<=remaining_resnum.size();++i) covered_resnum.push_back(remaining_resnum[i]);
356 full_length_pose->pdb_info(pdb_info);
359 Size njump = full_length_pose->fold_tree().num_jump();
360 full_length_pose->conformation().insert_conformation_by_jump( inserted_pose.
conformation(),
361 full_length_pose->total_residue() + 1, njump+1,
362 full_length_pose->total_residue() );
367 Size nres_domain1 = full_length_pose->total_residue();
369 for (
Size ires=1;ires<=
poses_[ipose]->total_residue();++ires) resnum.push_back(
poses_[ipose]->pdb_info()->number(ires));
371 Size jump_num = full_length_pose->fold_tree().num_jump()+1;
372 full_length_pose->conformation().insert_conformation_by_jump(
poses_[ipose]->conformation(),
373 full_length_pose->total_residue() + 1, jump_num,
374 full_length_pose->total_residue() );
378 for (
Size ires=1; ires <= nres_domain1; ++ires) {
379 for (
Size jres=nres_domain1+1; jres <= full_length_pose->total_residue(); ++jres) {
380 Size seq_sep = abs(resnum[ires] - resnum[jres]);
381 if (seq_sep>=6 && seq_sep <=8) {
383 Size iatom = full_length_pose->residue_type(ires).atom_index(
"CA");
384 Size jatom = full_length_pose->residue_type(jres).atom_index(
"CA");
386 TR.Debug <<
"Adding constraints to residue " << ires <<
" and " << jres << std::endl;
387 full_length_pose->add_constraint(
480 using namespace basic::options;
481 using namespace basic::options::OptionKeys;
483 "score4_smooth",
"" );
488 rb_mover->apply(*full_length_pose);
495 translate->step_size( 1000. );
497 translate->trans_axis(translation_axis);
498 translate->apply( *full_length_pose );
500 core::Real unbound_score = (*simple_scorefxn)(*full_length_pose);
503 translate->trans_axis(translation_axis);
504 translate->apply( *full_length_pose );
508 while ((*simple_scorefxn)(*full_length_pose) > unbound_score+10.) {
510 translate->step_size( max_step_size*
RG.uniform() );
512 translate->trans_axis(translation_axis);
513 translate->apply( *full_length_pose );
516 max_step_size *= 1.5;
524 docking_mover->set_outer_cycles(20);
525 docking_mover->apply(*full_length_pose);
530 std::list <Size> residue_list1;
531 std::list <Size> residue_list2;
532 for (
Size ires = 1; ires <=
poses_[1]->total_residue(); ++ires) {
533 residue_list1.push_back(ires);
534 residue_list2.push_back(ires);
540 residue_list1.clear();
541 residue_list2.clear();
542 for (
Size ires = 1; ires <=
poses_[ipose]->total_residue(); ++ires) {
543 residue_list1.push_back(ires);
544 residue_list2.push_back(nres_domain1+ires);
566 int jump_pos1 =
RG.random_range(1, lower_pose->total_residue());
567 int jump_pos2 =
RG.random_range(lower_pose->total_residue()+1, lower_pose->total_residue()+higher_pose->total_residue());
570 int jump_num = ft.
new_jump(jump_pos1, jump_pos2, (
int)lower_pose->total_residue()+1);
573 pose.
copy_segment(lower_pose->total_residue(), *lower_pose, 1, 1);
574 pose.
copy_segment(higher_pose->total_residue(), *higher_pose, lower_pose->total_residue()+1, 1);
578 if (lower_pose->total_residue() > 3 ) {
579 gap_start = lower_pose->total_residue() - 3;
586 if (higher_pose->total_residue() > 3 ) {
590 gap_stop = higher_pose->total_residue();
595 if (!lower_pose->residue_type(gap_start).is_protein()) utility_exit_with_message(
"Error! not an amino acid!");
596 if (!higher_pose->residue_type(gap_stop ).is_protein()) utility_exit_with_message(
"Error! not an amino acid!");
598 Size jatom = pose.
residue_type(lower_pose->total_residue()+gap_stop ).atom_index(
"CA");
599 TR <<
"Adding constraints to residue " << gap_start <<
" and " << lower_pose->total_residue()+gap_stop << std::endl;
609 docking_mover->apply(pose);