15 #include <core/scoring/rms_util.hh>
16 #include <core/types.hh>
17 #include <core/conformation/Residue.hh>
18 #include <core/conformation/ResidueFactory.hh>
19 #include <core/chemical/ChemicalManager.hh>
20 #include <core/import_pose/import_pose.hh>
21 #include <core/kinematics/FoldTree.hh>
22 #include <core/pose/Pose.hh>
23 #include <core/pose/annotated_sequence.hh>
24 #include <core/pose/PDBInfo.hh>
25 #include <core/pose/util.hh>
26 #include <core/pose/rna/util.hh>
27 #include <protocols/farna/util.hh>
28 #include <protocols/farna/movers/RNA_LoopCloser.hh>
29 #include <protocols/stepwise/modeler/align/util.hh>
30 #include <protocols/viewer/viewers.hh>
32 #include <core/io/pdb/pose_io.hh>
45 #include <basic/options/keys/out.OptionKeys.gen.hh>
46 #include <basic/options/keys/in.OptionKeys.gen.hh>
47 #include <basic/options/keys/chemical.OptionKeys.gen.hh>
51 using namespace basic;
52 using namespace protocols;
53 using namespace basic::options::OptionKeys;
57 using io::pdb::dump_pdb;
74 OPT_KEY( IntegerVector, superimpose_res )
75 OPT_KEY( IntegerVector, graft_res )
76 OPT_KEY( IntegerVector, unvirtualize_phosphate_res )
77 OPT_KEY( Boolean, graft_backbone_only )
83 for (
Size n = 1; n <= pose.total_residue(); n++ ) {
84 if ( !unvirtualize_phosphate_residues.has_value( pose.pdb_info()->number( n ) ) )
continue;
85 core::pose::remove_variant_type_from_pose_residue( pose, core::chemical::VIRTUAL_PHOSPHATE, n );
95 using namespace core::chemical;
97 using namespace protocols::farna;
99 ResidueTypeSetCOP rsd_set;
100 rsd_set = core::chemical::ChemicalManager::get_instance()->residue_type_set( FA_STANDARD );
102 import_pose::pose_from_pdb( pose, *rsd_set, pdb_file );
104 core::pose::rna::figure_out_reasonable_rna_fold_tree( pose );
105 core::pose::rna::virtualize_5prime_phosphates( pose );
108 PDBInfoOP pdb_info = pose.pdb_info();
109 for (
Size n = 1; n <= pose.total_residue(); n++ ) resnum.push_back( pdb_info->number(n) );
117 for (
Size n = 1; n <= vec.size(); n++ ) {
118 if ( val == vec[n] )
return n;
127 for (
Size n = 1; n <= vec_sub.size(); n++ ) {
128 if ( !
find_index(vec_sub[n], vec_big) )
return false;
135 std::map< Size, Size >
143 std::map< Size, Size > res_map;
145 for (
Size n = 1; n <= superimpose_resnum.size(); n++ ) {
170 superimpose_resnum =
option[ superimpose_res ]();
173 for (
Size n = 1; n <= resnum1.size(); n++ ) {
175 if ( n2 == 0 )
continue;
176 superimpose_resnum.push_back( resnum1[n] );
178 if ( pose1.aa(n) != pose2.aa(n2) ) {
179 std::cout <<
"Mismatch in sequence? " << std::endl;
180 std::cout <<
" residue " << resnum1[n] <<
" " << pose1.sequence()[n -1] <<
" at pose position " << n << std::endl;
181 std::cout <<
" residue " << resnum2[n2] <<
" " << pose2.sequence()[n2-1] <<
" at pose position " << n2 << std::endl;
187 if ( superimpose_resnum.size() > 0 ) {
189 std::map< Size, Size > superimpose_res_map =
calculate_res_map( superimpose_resnum, resnum2, resnum1 );
192 id::AtomID_Map< id::AtomID >
const & alignment_atom_id_map_native =
193 protocols::stepwise::modeler::align::create_alignment_id_map_legacy( pose2, pose1, superimpose_res_map );
194 core::scoring::superimpose_pose( pose2, pose1, alignment_atom_id_map_native );
196 std::cout <<
"WARNING: no overlap residues found or specified (by -superimpose_res)!!!! " << std::endl;
211 std::string
outfile = pdb_file2;
213 std::string::size_type
pos = pdb_file2.find(
".pdb", 0 );
214 std::string
const new_prefix =
".sup.pdb";
215 if (
pos == std::string::npos ) {
218 outfile.replace(
pos, new_prefix.length(), new_prefix );
233 bool const graft_backbone_only){
235 using namespace core::conformation;
236 using namespace core::id;
238 for (
Size i = 1; i <= pose1.total_residue(); i++ ) {
241 if ( q == 0 )
continue;
243 if ( resnum_graft.size() > 0 ) {
245 if ( r == 0 )
continue;
248 Residue
const & rsd_i = pose1.residue(i);
250 for (
Size ii = 1;
ii <= rsd_i.natoms();
ii++ ) {
252 if ( rsd_i.is_virtual(
ii ) )
continue;
253 if ( graft_backbone_only &&
254 ( (
ii >= rsd_i.first_sidechain_atom() &&
ii <= rsd_i.nheavyatoms() ) ||
255 (
ii >= rsd_i.first_sidechain_hydrogen() &&
ii <= rsd_i.natoms() ) ) )
continue;
256 std::string
const & atom_name = rsd_i.atom_name(
ii ) ;
258 if ( !pose_target.residue( q ).has( atom_name ) )
continue;
259 Size const qq = pose_target.residue( q ).atom_index( atom_name );
260 pose_target.set_xyz( AtomID(qq, q), rsd_i.xyz(
ii ) );
275 graft_in_positions( pose1, pose_target, resnum1, resnum_target, resnum_dummy,
false );
284 using namespace core::kinematics;
287 for (
Size n = 2; n <= resnum.size(); n++ ) {
288 if ( resnum[n] == resnum[n-1] + 1 ) {
289 if ( ( pose.residue( n-1 ).xyz(
" O3'" ) - pose.residue( n ).xyz(
" P " ) ).
length() > 2.0 ) {
290 FoldTree
f = pose.fold_tree();
291 f.new_jump( n-1, n, n-1 );
292 f.set_jump_atoms( f.num_jump(),
293 core::chemical::rna::chi1_torsion_atom( pose.residue( n-1 ) ),
294 core::chemical::rna::chi1_torsion_atom( pose.residue( n ) ) );
296 correctly_add_cutpoint_variants( pose, n-1 );
297 cutpoints.push_back( n-1 );
302 protocols::farna::movers::RNA_LoopCloser rna_loop_closer;
303 rna_loop_closer.apply( pose, cutpoints );
315 using namespace core::chemical;
316 using namespace core::kinematics;
318 using namespace protocols::farna;
321 resnum_target.clear();
328 graft_resnum =
option[ graft_res ]();
330 graft_resnum = resnum2;
333 std::list< std::pair< Size, char > > resnum_seq_list;
335 for (
Size n = 1; n <= pose1.total_residue(); n++ ) {
336 if ( !
find_index( resnum1[n], graft_resnum ) ) {
337 resnum_seq_list.push_back( std::make_pair( resnum1[n], pose1.sequence()[ n-1 ] ) );
341 for (
Size n = 1; n <= pose2.total_residue(); n++ ) {
342 if (
find_index( resnum2[n], graft_resnum ) ) {
343 resnum_seq_list.push_back( std::make_pair( resnum2[n], pose2.sequence()[ n-1 ] ) );
347 resnum_seq_list.sort();
349 std::string sequence_target;
350 for ( std::list< std::pair< Size, char > >::
const_iterator iter = resnum_seq_list.begin(),
351 end = resnum_seq_list.end(); iter !=
end; ++iter ) {
352 resnum_target.push_back( iter->first );
353 sequence_target += iter->second;
356 ResidueTypeSetCOP rsd_set;
357 rsd_set = core::chemical::ChemicalManager::get_instance()->residue_type_set( FA_STANDARD );
358 make_pose_from_sequence( pose_target, sequence_target, *rsd_set );
369 core::pose::rna::figure_out_reasonable_rna_fold_tree( pose_target );
370 core::pose::rna::virtualize_5prime_phosphates( pose_target );
374 for (
Size n = 1; n <= resnum_target.size(); n++ ) {
375 if ( n == 1 || ( resnum_target[n] > resnum_target[n-1] + 1 ) ) {
376 add_variant_type_to_pose_residue( pose_target, core::chemical::VIRTUAL_PHOSPHATE, n );
381 PDBInfoOP pdb_info(
new PDBInfo( pose_target ) );
382 pdb_info->set_numbering( resnum_target );
383 pose_target.pdb_info( pdb_info );
384 std::cout << pose_target.annotated_sequence() << std::endl;
386 std::cout << pose_target.annotated_sequence() << std::endl;
388 std::string
outfile =
"graft.pdb";
392 pose_target.dump_pdb(
outfile );
412 for (
Size i = 2; i <= pdb_files.size(); i++ ) {
418 graft_pdb( pose1,
pose2, resnum1, resnum2, pose_target, resnum_target );
420 resnum1 = resnum_target;
443 main(
int argc,
char * argv [] )
453 NEW_OPT( superimpose_res,
"residues over which to superimpose second pose onto first pose", blank_size_vector );
454 NEW_OPT( graft_res,
"residues to graft from second pose", blank_size_vector );
455 NEW_OPT( unvirtualize_phosphate_res,
"do not virtualize these phosphate (useful for cdiAMP)", blank_size_vector );
456 NEW_OPT( graft_backbone_only,
"only graft backbone from 2nd PDB",
false );
467 protocols::viewer::viewer_main(
my_main );
471 std::cout <<
"caught exception " << e.
msg() << std::endl;
#define utility_exit_with_message(m)
Exit with file + line + message.
void superimpose_pdb(pose::Pose &pose1, pose::Pose &pose2, utility::vector1< Size > const &resnum1, utility::vector1< Size > const &resnum2)
void output_superimposed_pdb(pose::Pose const &pose2, std::string const &pdb_file2)
virtual std::string const msg() const
void close_loops(core::pose::Pose &pose, utility::vector1< Size > const &resnum)
utility::keys::KeyLookup< KeyType >::const_iterator const_iterator
Key collection iterators.
void init(int argc, char *argv[])
Command line init() version.
BooleanOptionKey const user("options:user")
Size find_index(Size const val, utility::vector1< Size > const &vec)
utility::keys::lookup::end< KeyType > const end
#define runtime_assert(_Expression)
Assert that the condition holds. Evaluated for both debug and release builds.
void graft_pdb(pose::Pose const &pose1, pose::Pose const &pose2, utility::vector1< Size > const &resnum1, utility::vector1< Size > const &resnum2, pose::Pose &pose_target, utility::vector1< Size > &resnum_target)
void rna_superimpose_and_graft_test()
numeric::xyzMatrix< Real > Matrix
bool is_subset(utility::vector1< Size > const &vec_sub, utility::vector1< Size >const &vec_big)
std::vector with 1-based indexing
rule< Scanner, options_closure::context_t > options
#define OPT_KEY(type, key)
list resnum
if line_edit[13:14]=='P': #Nucleic acid? Skip.
std::map< Size, Size > calculate_res_map(utility::vector1< Size > const &superimpose_resnum, utility::vector1< Size > const &resnum1, utility::vector1< Size > const &resnum2)
#define NEW_OPT(akey, help, adef)
ocstream cout(std::cout)
Wrapper around std::cout.
BooleanOptionKey const exit("options:exit")
vector1: std::vector with 1-based indexing
xyzMatrix: Fast 3x3 xyz matrix template
void graft_in_positions(pose::Pose const &pose1, pose::Pose &pose_target, utility::vector1< Size > const &resnum1, utility::vector1< Size > const &resnum_target, utility::vector1< Size > const &resnum_graft, bool const graft_backbone_only)
int main(int argc, char *argv[])
void unvirtualize_phosphates(pose::Pose &pose, utility::vector1< Size > const &unvirtualize_phosphate_residues)
void get_pose_and_numbering(std::string const &pdb_file, pose::Pose &pose, utility::vector1< Size > &resnum)
rule< Scanner, option_closure::context_t > option