I would like to add a filter to my XML Rosetta design script that allows me to implement negative design.
Specifically, I want a filter that can take my designed and minimized input structure, apply a symmetry operation to it (i.e. rotate & translate a domain), minimized the transformed structure and compare the energy to the unmodified input structure. Is this possible with the XML-based Rosetta scripts (I couldn't find a filter operation that allowed me to modify a structure, apply a minimization mover while "remembering" the input structure).
I could do something similar in two separate steps: step 1 (design, minimize and write to disk), followed by step 2, read in structures from disk (computed in step 1), apply symmetry operation, minimize and then compare to the input structure. However, this is not particularly satisfactory as I would like to use the negative design filter to guide a simulated annealing search of sequence space to find sequences that show a strong preference for the desired binding mode.
The code will allow what you want to do, although there are no existing Filters/Movers that do precisely that. Off the top of my head, the only significant difference between Mover and Filter is that Mover's apply does not return a boolean, and Filter's apply takes a const ref pose, not just a reference (so changes can't be made).
In your case, you could write a filter that took your input pose (const), immediately made a local copy (nonconst), did whatever you wanted to the local copy, then reported its filter pass/fail based on your local modified pose. This is quite possible and I suspect there are a lot of filters that already do this; the binding energy filters are a pretty safe bet (they have to modify a local copy to pull the chains apart to calculate binding).
I don't know that there's a way to do this without writing new C++, though.
You probably want to use the MoveBeforeFilter and the Delta filter.
The MoveBeforeFilter will allow you to apply a mover (probably a ParsedProtocol mover containing your multi-step protocol) prior to calculating a metric with another filter.
You then probably want to use the Delta filter, which allows comparison to the filter value of another pose. By default it calculates it to the input pose (the pose at the very start of the protocol), but there is an undocumented option to change that. Simply use the SavePoseMover(*) to set a reference pose, and then set the reference pose for Delta filter with the "reference_name=(&string)" option of the Delta filter.
*) <SavePoseMover name=native restore_pose=(1, &bool) reference_name="specialpose" />
This mover allows one to save a pose at any time point through out a trajectory or from disk, and recall it any time point again to replace a current pose. Can also just be used with filter, eg. delta filters.
restore_pose - if you want to replace it
reference_name - is what the pose gets saved under. so to recall that one specific pose, just re-call it under the name given when first called.