Hopefully a fairly simple foldtree problem:
I have a two chain protein complex where the end of the floppy tail of domain B also happens to be the root of domain B.
Since the interaction with domain A is significant I'd like to re-root and sample according to something like:
FOLD_TREE EDGE 1 645 -1 EDGE 1 646 1 EDGE 646 1500 -1
FOLD_TREE EDGE 1 645 -1 EDGE 1 646 1 EDGE 1400 646 -1 EDGE 1400 1500 -1
So I use:
ft = FoldTree()
Two problems immediately come up from this though:
(1) that torsional changes in residues 1400-646 now affect chain A for some reason.
(2) the structure resulting from the above code is not the same as the input structure.
Basically all I want is to re-root my second kinematic chain somewhere inside of Domain B and continue to let domain A move completely independently both kinematically and as a rigid body.
Also, why does a new fold_tree not preserve structure?
Everything moves relative to the fold tree root. I assume A = 1-645 and B = 646-1500. With this fold tree, any movement between 1400 and 646 will propagate to A, because A depends on 646. I think what you want is for your Jump (the 1 edge) to be from 1 to 1400, not 1 to 646. This will keep A from moving in space relative to the fold tree root (assuming that Jump isn't otherwise modified).
You haven't mentioned what executable you are using; it's also possible that the Jump is free in minimization or in other code and is getting modified directly, beyond simply transmitting kinematic dependence. That's a MoveMap issue not a FoldTree issue.
I'm not sure what "Also, why does a new fold_tree not preserve structure?" quite means. Replacing jump objects within the tree will have effects on structure, but the FoldTree itself just tells Rosetta how to perform refolds, it won't change the DOFs. Are you dumping a pose immediately before/after a fold tree change and seeing coordinate differences?
If this isn't the solution you needed, let me know - I'm pretty good with fold tree wrangling (or at least I think I am), but I'm not entirely sure I understand what you want.
I like to do:
FoldTree ft = pose.fold_tree();
This ensures that the fold tree has nres right from the beginning. I'm not positive that all values for the tree are set properly with the new construction you describe.
Thanks for the detailed reply.
I'm using the c++ interface for rosetta directly and I'm definitely directly manipulating the jump translation/rotation explicitly.
At present I load the PDB from a file, create the fold_tree from the old one as you described, clear it, then add the edges as per the last post.
At this point the relative rotations of the two chains are now changed, even before I begin to change parameters.
The only change that I can think may be occurring so far is that the first jump orientation is extracted, saved, then reloaded (i.e. identity).
What's most strange is that the jump parameters don't seem to have changed between the two fold-tree definitions, in spite of the new kinematic origin.
Thanks again for your help on this, the FoldTree documentation online is a little sparse. :)
Found the problem, apparently I wasn't correctly fixing the end points with an added jump:
FOLD_TREE EDGE 1 645 -1 EDGE 645 1400 1 EDGE 1400 646 -1 EDGE 1400 1500 -1
did the trick perfectly.