17 #include <boost/foreach.hpp>
18 #include <boost/algorithm/string/join.hpp>
20 #include <ObjexxFCL/FArray1D.hh>
21 #include <basic/Tracer.hh>
32 #include <utility/tag/Tag.hh>
47 namespace protein_interface_design {
50 static basic::Tracer
TR(
"protocols.protein_interface_design.filters.AtomicContactCountFilter");
54 protocols::filters::
Filter(
"AtomicContactCount" ),
61 Filter(
"AtomicContactCount" ),
62 distance_cutoff_(distance_cutoff)
69 task_factory_(src.task_factory_),
70 distance_cutoff_(src.distance_cutoff_),
71 filter_mode_(src.filter_mode_),
72 normalize_by_sasa_(src.normalize_by_sasa_),
74 sym_dof_name_(src.sym_dof_name_)
126 if (specified_mode ==
"none")
130 else if (specified_mode ==
"jump")
134 tag->getOption<
std::string >(
"sym_dof_name",
"" ),
136 specified_normalized_by_sasa !=
"0");
138 else if (specified_mode ==
"chain")
143 specified_normalized_by_sasa !=
"0",
144 specified_normalized_by_sasa ==
"detect_by_task");
149 TR.Error <<
"Must specify jump or chain partition mode in AtomicContactFilter with normalize_by_sasa: " << tag << std::endl;
150 utility_exit_with_message(
"Must specify jump or chain partition mode in AtomicContactFilter with normalize_by_sasa.");
153 TR.Debug <<
"Parsed AtomicContactCount filter: <AtomicContactCount" <<
167 task =
task_factory_->create_task_and_apply_taskoperations( pose );
168 TR.Debug <<
"Initializing from packer task." << std::endl;
172 TR.Debug <<
"No packer task specified, using default task." << std::endl;
186 if( task->pack_residue(resi) )
188 target.push_back(resi);
192 if (TR.Debug.visible())
194 TR.Debug <<
"Targets from task: ";
195 std::copy(target.begin(), target.end(), std::ostream_iterator<core::Size>(TR.Debug,
","));
196 TR.Debug << std::endl;
205 TR.Debug <<
"Partitioning by residue number." << std::endl;
209 residue_partition.push_back(i);
214 TR.Debug <<
"Partitioning by residue chain." << std::endl;
218 residue_partition.push_back(pose.
chain(i));
223 TR.Debug <<
"Partitioning by jump." << std::endl;
228 }
else if (!symmetric) {
229 target_jumps.push_back(
jump_ );
233 for (
Size j = 1; j <= nslidedofs; j++)
238 ObjexxFCL::FArray1D<bool> jump_partition ( pose.
total_residue(), false );
248 residue_partition.push_back(jump_partition(i));
252 if (TR.Trace.visible())
254 TR.Trace <<
"Residue partitions from task: ";
255 for (
core::Size i = 1; i <= residue_partition.size(); ++i)
257 TR.Trace << i <<
":" << residue_partition[i] <<
",";
259 TR.Trace << std::endl;
268 indy_resis = symm_info->independent_residues();
271 for (
core::Size i = 1; i <= target.size(); i++)
278 if (!indy_resis[target[i]] || residue_partition[target[i]])
continue;
280 for (
core::Size j = i+1; j <= target.size(); j++)
282 if (residue_partition[target[i]] != residue_partition[target[j]])
303 TR.Debug <<
"select (resi " << target[i] <<
" and name " << residue_i.
atom_name(atom_i) <<
") + (resi " << target[j] <<
"and name " << residue_j.
atom_name(atom_j) <<
")" << std::endl;
312 TR.Debug <<
"Found cross partition contacts:" << contact_count << std::endl;
316 TR.Debug <<
"Normalizing cross partition contacts by sasa." << std::endl;
322 utility_exit_with_message(
"AtomicContactCount filter unable to normalize by sasa in all-contact mode.");
327 std::set<core::Size> interface_chains;
332 for (
core::Size i = 1; i <= target.size(); ++i)
334 interface_chains.insert(pose.
chain(target[i]));
342 interface_chains.insert(i);
346 TR.Debug <<
"Identified interface chains:";
347 std::copy(interface_chains.begin(), interface_chains.end(), std::ostream_iterator<core::Size>(TR.Debug,
","));
348 TR.Debug << std::endl;
352 TR.Debug <<
"Pruning target pose to interface chains.";
358 if (interface_chains.count(i) == 0)
360 TR.Debug <<
"Pruning target pose chain: " << i <<
370 if (TR.Trace.visible())
372 TR.Trace <<
"Pruned pose:" << std::endl << interface_pose << std::endl;
380 TR.Debug <<
"Adding jump to sasa filter: " << i << std::endl;
381 sasa_jumps.push_back(i);
383 sasa_filter.
jumps(sasa_jumps);
385 interface_sasa = sasa_filter.
compute(interface_pose);
389 TR.Debug <<
"Using original pose, interface chains include entire pose." << std::endl;
396 TR.Debug <<
"Adding jump to sasa filter: " << i << std::endl;
397 sasa_jumps.push_back(i);
399 sasa_filter.
jumps(sasa_jumps);
400 interface_sasa = sasa_filter.
compute(pose);
405 TR.Debug <<
"Normalizing on jump." << std::endl;
410 TR.Debug <<
"Adding jump to sasa filter: " << target_jumps[1] << std::endl;
417 sasa_filter.
jumps(target_jumps);
419 interface_sasa = sasa_filter.
compute(pose);
422 TR.Debug <<
"Calculated interface sasa: " << interface_sasa << std::endl;
424 if (interface_sasa != 0)
426 return contact_count / interface_sasa;
435 return contact_count;