48 #include <basic/options/option.hh>
49 #include <basic/options/keys/match.OptionKeys.gen.hh>
50 #include <basic/Tracer.hh>
57 #include <utility/pointer/ReferenceCount.hh>
58 #include <utility/string_util.hh>
59 #include <utility/vector1.hh>
64 #include <utility/vector0.hh>
71 static basic::Tracer
TR(
"protocols.match.output.ProcessorFactory" );
87 if ( mtask->consolidate_matches() ) {
88 TR <<
"Matches will be consolidated before output." << std::endl;
89 if( mtask->output_writer_name() ==
"CloudPDB" )
TR <<
"NOTICE: match consolidation and CloudPDB writing are both active. This is fine but somewhat redundant. In this case, the -output_matches_per_group parameter should be set to a higher number than without cloud pdb writing, say 100 or so." << std::endl;
91 consolidator->set_grouper(
create_grouper( matcher, mtask, cacher ) );
94 consolidator->set_n_to_output_per_group( mtask->n_to_output_per_group() );
96 processor = consolidator;
102 processor = outputter;
105 std::list< MatchFilterOP > filters(
create_filters( matcher, mtask, cacher ) );
106 for ( std::list< MatchFilterOP >::const_iterator
107 iter = filters.begin(), iter_end = filters.end();
108 iter != iter_end; ++iter ) {
109 processor->add_filter( *iter );
122 if (mtask->grouper_name() ==
"SameChiBinComboGrouper" ) {
124 chibin_grouper->set_n_geometric_constraints( matcher->n_geometric_constraints() );
125 chibin_grouper->set_hit_cacher( cacher );
126 return chibin_grouper;
127 }
else if ( mtask->grouper_name() ==
"SameSequenceGrouper" ) {
129 seq_grouper->set_n_geometric_constraints( matcher->n_geometric_constraints() );
130 seq_grouper->set_hit_cacher( cacher );
132 }
else if ( mtask->grouper_name() ==
"SameSequenceAndDSPositionGrouper" ) {
134 seq_ds_grouper->set_n_geometric_constraints( matcher->n_geometric_constraints() );
135 seq_ds_grouper->set_hit_cacher( cacher );
136 for (
Size ii = 1; ii <= matcher->n_geometric_constraints() ; ++ii ) {
137 seq_ds_grouper->set_downstream_builder( ii, matcher->downstream_builder( ii ) );
139 seq_ds_grouper->set_relevant_atom_ids( mtask->relevant_downstream_atoms() );
140 seq_ds_grouper->set_rms_group_cutoff( mtask->grouper_ds_rmsd() );
141 return seq_ds_grouper;
142 }
else if ( mtask->grouper_name() ==
"SameRotamerComboGrouper" ) {
144 rot_grouper->set_n_geometric_constraints( matcher->n_geometric_constraints() );
147 utility_exit_with_message(
"Could not recognize requested MatchGrouper named: " + mtask->grouper_name() );
161 if ( mtask->evaluator_name() ==
"DownstreamRMSEvaluator" ) {
163 rms_eval->set_n_geometric_constraints( matcher->n_geometric_constraints() );
164 for (
Size ii = 1; ii <= matcher->n_geometric_constraints(); ++ii ) {
166 rms_eval->set_downstream_builder( ii, matcher->downstream_builder( ii ) );
168 rms_eval->set_downstream_pose(matcher->downstream_pose());
171 utility_exit_with_message(
"Could not recognize requested MatchEvaluator named: " + mtask->evaluator_name() );
176 std::list< MatchFilterOP >
183 if ( ! mtask->filter_names().empty() ) {
184 std::cerr <<
"ERROR: match::output::ProcessorFactory currently lacks logic to instantiate any of the desired filters" << std::endl;
185 for ( std::list< std::string >::const_iterator
186 filtiter = mtask->filter_names().begin(),
187 filtiter_end = mtask->filter_names().end();
188 filtiter != filtiter_end; ++filtiter ) {
189 std::cerr <<
"Requested filter '" << *filtiter <<
"' cannot be instantiated" << std::endl;
191 utility_exit_with_message(
"Processor factory cannot create requested filter(s)" );
195 std::list< MatchFilterOP > filter_list;
196 if ( mtask->filter_upstream_residue_collisions() ) {
198 if ( mtask->filter_upstream_collisions_by_score() ) {
199 collfilt->set_filter_by_lj(
true );
200 collfilt->set_lj_cutoff( mtask->upstream_residue_collision_score_cutoff() );
201 collfilt->set_lj_atr_weight( mtask->upstream_residue_collision_Wfa_atr() );
202 collfilt->set_lj_rep_weight( mtask->upstream_residue_collision_Wfa_rep() );
203 collfilt->set_lj_sol_weight( mtask->upstream_residue_collision_Wfa_sol() );
205 collfilt->set_tolerated_overlap( mtask->upstream_residue_collision_tolerance() );
207 filter_list.push_back( collfilt );
210 if ( mtask->filter_upstream_downstream_collisions() || matcher->has_upstream_only_geomcsts() ) {
212 if ( mtask->filter_upstream_downstream_collisions_by_score() ) {
213 collfilt->set_filter_by_lj(
true );
214 collfilt->set_lj_cutoff( mtask->upstream_downstream_residue_collision_score_cutoff() );
215 collfilt->set_lj_atr_weight( mtask->upstream_downstream_residue_collision_Wfa_atr() );
216 collfilt->set_lj_rep_weight( mtask->upstream_downstream_residue_collision_Wfa_rep() );
217 collfilt->set_lj_sol_weight( mtask->upstream_downstream_residue_collision_Wfa_sol() );
219 collfilt->set_tolerated_overlap( mtask->upstream_downstream_atom_collision_tolerance() );
221 collfilt->set_downstream_pose( * matcher->downstream_pose() );
222 collfilt->set_num_geometric_constraints( matcher->n_geometric_constraints() );
223 for (
Size ii = 1; ii <= matcher->n_geometric_constraints(); ++ii ) {
224 collfilt->set_downstream_builder( ii, matcher->downstream_builder( ii ) );
225 if ( mtask->enz_input_data()->mcfi_list( ii )->mcfi(1)->is_covalent() ) {
226 collfilt->set_chemical_bond_from_upstream_to_downstream( ii );
230 filter_list.push_back( collfilt );
244 using namespace basic::options;
247 if ( mtask->output_writer_name() ==
"KinWriter" ) {
252 kin_match_writer->set_n_geomcst( matcher->n_geometric_constraints() );
253 kin_match_writer->set_kin_writer( kin_hit_writer );
255 for (
Size ii = 1; ii <= matcher->n_geometric_constraints() ; ++ii ) {
257 if ( matcher->downstream_builder( ii ) ) {
259 downstream_writer->set_restype( & (mtask->downstream_pose()->residue(1).type()) );
260 downstream_writer->set_downstream_builder( matcher->downstream_builder( ii ) );
261 downstream_writer->set_downstream_master( mtask->downstream_pose()->residue(1).name3() );
263 kin_match_writer->set_downstream_writer( ii, downstream_writer );
266 kin_match_writer->set_coordinate_cacher( cacher );
267 return kin_match_writer;
269 }
else if ( (mtask->output_writer_name() ==
"PDB" ) || (mtask->output_writer_name() ==
"pdb" ) || (mtask->output_writer_name() ==
"CloudPDB" ) || ( mtask->output_writer_name() ==
"PoseMatchOutputWriter" ) ) {
271 if ( (mtask->output_writer_name() ==
"PDB" ) || (mtask->output_writer_name() ==
"pdb" ) ){
274 else if( mtask->output_writer_name() ==
"PoseMatchOutputWriter" ){
280 pdb_writer->set_coordinate_cacher( cacher );
281 pdb_writer->initialize_from_matcher_task( mtask );
283 if ( option[ OptionKeys::match::ligand_rotamer_index ].user() ) {
284 pdb_writer->set_prefix(
"UM_LIGROT_" +
285 utility::to_string( option[ OptionKeys::match::ligand_rotamer_index ]() ) +
289 runtime_assert( matcher->downstream_builder( 1 ) );
290 for (
Size ii = 1; ii <= matcher->n_geometric_constraints() ; ++ii ) {
291 pdb_writer->set_downstream_builder( ii, matcher->downstream_builder( ii ) );
297 utility_exit_with_message(
"Could not recognize requested OutputWriter named: '" + mtask->output_writer_name() +
"'" );