Merge pull request #158 from RosettaCommons/vmullig/betahelix
Vmullig/betahelix into master
This introduces a MakeBundle mover to create helical bundles using the Crick equations. This has several advantages over the existing workflow (which used an external Python script to place backbone elements that then had to be Cartesian-minimizaed):
- No need for any minimization (ideal geometry is generated). This is because all backbone atoms are placed using the Crick equations (not just alpha carbons), permitting direct conversion of Crick parameters to mainchain torsions.
- Fully generalized (works with helices or sheets, or with arbitrary helices made with noncanonical amino acids). Construction of beta-barrels seems to work as well as helices of helices.
- Permits parameter sampling (not possible with the external generator) during design.
- A framework is started to allow parameter-space minimization (rather than relying on torsion-space minimization) during design.
- Minor helix Crick parameters can be fit using the fitting app (also added with this pull request), permitting precise determination of these parameter values for an arbitrary heteropolymer in an arbitrary helical conformation. (This tricks the Minimizer into acting like a nonlinear least squares fitter, operating on an ideal helix built of subunits with repeating user-specified mainchain torsion values.)
- Crick parameters for alpha-helices, beta-strands, and beta-amino acid 14-helices are now stored in the database, and do not have to be entered by hand.
I plan to make this work with @tlinsky's component framework, which permits individual secondary structure components of arbitrary length generated by arbitrary generators to be linked up, with linkage patterns sampled in an iterative manner.
My checklist:
- Added HelixParams and BundleParams to numeric/crick_equations (functions that compute the equations and their derivatives).
- Created FitSimpleHelix mover, FitSimpleHelixMultiFunc (to trick the Minimizer into nonlinear least squares fitting of parameters) and fit_helicalparams pilot app.
- Created write function for .crick_params files.
- Created read function for .crick_params files.
- Created MakeBundleHelix mover and test_makebundlehelix_mover pilot app.
- Created MakeBundle mover and test_makebundle_mover pilot app.
- Added RosettaScripts links to MakeBundle mover. (NEEDS TO BE DOCUMENTED!)
- Added functionality to MakeBundle mover for reading .crick_params files from the database easily.
- Added Crick parameters for alpha-helix, beta-sheet, and (beta-amino acid) 14-helix to the database.
- Added fit_helixparams and helical_bundle integration tests.
- Reworked the math a bit to avoid divide-by-zero errors and to handle the omega0 = 0 case, which was initially causing NaNs in the output pdb.
- Checked everything with the owning pointer changes. (I was still developing on the pre-owning pointer change background, and had to fix a few small things about the way in which I was using owning pointers.)
- Ensured elegant failure (rather than segfault) when Crick parameters are provided that result in no sensible structure.
This merge also brings in a few incidental changes:
- A few more crosslinkers added to the database.
- A small change to the MinMover that fully implements TaskOperation-based selection of residues, particularly for setting non-PHI degrees of freedom. Previously, this was globally setting the DOF setting, which was a bug. Now, all DOFs of a given type within a residue are set by the packability given by the task operation. Whoever started implementing this never documented the feature, but it's a powerful one. (No changes to documented functionality are expected.)