    ==============================================================================
    ===  TO DO  ==================================================================
    ==============================================================================
        Add outline to Rama PDF instead of thumbs
        Add kinemage, raw, and stat-summary output to Ramalyze
        Add other outputs, inputs to Rotalyze
        Summary info can be preformatted, data should be parsable
        Provide both 4-in-1  PDF and 4 separate jpegs
        Allow "slop" around rota and Rama contours
        Make ModelManager support loading from/saving to URLs
        Make sidechain refitting support two naming conventions for SeMet
        Make a KiNG tool that uses the foos (KingFooTool)
        Think on defn of "wet" foos (water touches edge? center?)
        Show histogram of cluster sizes for SequenceSpacer (maybe in kin text?)
        Make USER MODs in ModelManager2 undoable by storing them in ModelStatePair
      ? How does molten state interact with replacing the Model frequently?
        Bugs:  Stuart has issues saving when using Backrub and sidechain rotator at
        the same time.  When you open sidechain rotator from backrub, make changes,
        doesn't save changes when you close it. (Snaps back to original backrub
        coords).  Multiple sequential backrubs open at once seems to have similar
        issues.
        Bug: ModelManager2 frozen model kin: alt 'b' master affects alt 'a' model

    ==============================================================================
    ===  CHANGE LOG  =============================================================
    ==============================================================================

    ### 1.11 ###
    vbc3
    -Modified rota to use Top8000 ultimate rotamers.

    ### 1.10 ###
    DAK
    - Added more generic detector of residue pairs in beta sheets
    vbc3
    - Added -quiet

    ### 1.09 ###
    DAK
    - Rama update to use 6 (not 4) categories, with distros now from Top8000; may
      need further tweaks, but looks to actually be working, even for PDF output!
    - Renamed resource rama & rota to reflect Top#### origins, for posterity
      (Top500 Rama is lost to history, though, at least in this code base)
    - For some reason, Rotalyze needed a tweak to remember we use chi1 only for Pro
    - Added BackboneMoveFinder2, spinoff of Ian's BackrubFinder2 but also for shears
    - Made Ramalyze "improve" residue names only for -pdf output, not -raw output,
      to match old hless output for MolProbity
    - Added convenience method for SubImpose.getChains for null set of chain IDs
    - Added kin output to Ramalyze; matches old hless output as closely as possible
    - Made Ramalyze default to raw output (like Rotalyze) instead of old PDF output
    - Added model # masters for multi-model (e.g. NMR) PDBs in Ramalyze kin output
    - Changed -kin to -kinplot and added -kinmarkup in Ramalyze for green CA trace
      Rama outlier markups for MolP multikins
    - Updated Ramalyze help file to reflect ^
    - ShearFit now tries w/ & w/o peptide rotations for backrubs alone, shears
      alone, & the 2 in combination, and can fit iteratively instead of requiring
      a predetermined # of trials
    - Added -kin option & loop over ED map sigma levels to AnisoOxygenSearch
    - Fixed bug in PhiPsiWindow: changed phi & psi in wrong direction!

    ### 1.08 ### dak
    - Altered Shear/BackrubPioneer multi-epsilon behavior
    - Tweaks to SubImpose & SupKitchen stderr messaging
    - Added BackboneMoveFinder (a la BackrubFinder2) to find shears and/or backrubs
      within ensembles
    - Synced method signatures so SubImpose & ScMcSwapper play nice together
    - Added method to ModelManager2 to make relative occupancies of remodeled atoms
      sensible
    - Tried & aborted several ways of splitting ' ' into alts during backrub or
      shear in ModelManager2; realized that IWD's "Choose alt conf" & "Create alt
      conf" options are enough!
    - Added routine to ModelManager2.adjustAltConfLabels(..) to avoid non-het atoms
      with only one alt (e.g. A but no B or C); non-het only b/c I think waters can
      have only one alt if they correspond only to one alt (not the other) of a sc
    - Added MethylRotator tool for aa types with methyl groups (Met, Val, Thr, etc.)
    - Added AvgStrucGenerator3, which should supercede both previous versions
    - Added option to provide manual alignment file in SubImpose
    - Aborted attempt to force middle peptide near original orientation in CaShear;
      code still there & commented out
    - Consolidated changes to ModelManager2.adjustAltConfLabels()
    - Minor change to SupKitchen in response to extra arg for SubImpose.getChains()

    ### 1.07 ### dak
    - Added ShearTool, etc.: prototype for (helix) shear backbone changes
    - Added Turn, TightTurn, PseudoTurn, & TurnFinder for finding tight turns &
      pseudo-turns
    - Added i,i+3 HB recognition (was just i,i+2) to differentiate helix caps vs.
      pseudo-turns
    - Fixed TightTurn sequence register bug & "regularized" turn H-bond notation
    - Added -shuffle option to SubImpose: permutes selected atoms to find best
      superposition, but retains sequence order (so permutes w/in residues)
    - Improved ShearTool geometry (each peptide now separate) & GUI
    - Added AltConfShearFinder & ShearFit (like AltConfBackrubFinder & HingeFit)
    - Added ModelManager2.repairAltConfs to address a "bug" / logic error where
      remodeling (backrub/shear) at junction between single alt & multiple alts did
      not extend the remodeled conformation and its alternative(s) as it "should"
    - Made CB idealization aa-specific with parameters straight from Prekin/Dangle
      [but those programs still report deviations on KiNG's "ideal" CBs - WHY?!]
    - Minor tweaks to AnisoOxygenSearch to opt'ly make output more shear-centric
    - Updated KiNG tools manual with shear tool [but PDF still needs to be made!]
    - Added bond length checks to ShearWindow
    - Added ShearPioneer and BackrubPioneer (kinda replaces for BackrubRama)
    - Replaced ideal helix/strand resource PDBs with longer 12-residue versions
    - Removed old Top5200 cis & trans Pro .ndft resource files (never used anyway)

    ### 1.06 ### dak
    - LocalRotarama now uses driftwood's Neighborhood and has new output options
    - Added -rmsdgoal to SubImpose: iterative Lesk sieving until rmsd goal reached
    - Added -d (show distances) output option to SubImpose
    - Fixed bug in SidechainIdealizer where docking non-Pro onto Pro (e.g. after
      Pro->Xaa mutation) left non-planar amide H
    - Can now restrict mobile region to +/- n residues in Tweak phi/psi tool
    - Rearranged innards of SubImpose - should work basically the same
    - Moved SupKitchenTool from Structural biology to Specialty tools menu to be
      safe for upcoming KiNG update on website
    - Added Tweak phi/psi tool entry to tools manual
    - Fixed SubImpose bug with -rmsd[max/cutoff]=# flag
    - Allowed 2nd file in LocalRotaRama; scores are then file1-file2 differences
    - Generalized SheetBuilder & BetaArom functionality (& cleaned up significantly)
    - Added AvgStrucGenerator2 for beta aroms; should be better in general
    - Improved error messages in CaspRotCor

    ### 1.05 ### dak
    - Added -chains1, -chains2 flags to SubImpose to restrict initial sequence
      alignment so subsequent structure superposition can be better controlled
    - Fixed some Exception-handling bugs in SupKitchen
    - Fixed PhiPsiRotation bug where C=O oxygen didn't move for psi downstream
    - Fixed RotamerCorrectness bug with "mdl(s)" field when last char is "/"
    - Re-wrote RotamerCorrectness as RotCor to make more generalizable (with
      concurrent loss of some detail in output)
    - Wrote CaspRotCor2 (extends RotCor) to be more specific to CASP, e.g. handles
      segment combination internally
    - Renamed CaspRotCor2 to CaspRotCor - will be distributed & users don't care
      about the existence of previous prototypes
    - RotCor now correctly ignores OUTLIERs for output rotamer counts
    - Fixed RotCor NMR target treatment - now counts rotamers OK & recognizes Pro
    - Added warning message when D-aa button clicked in SidechainRotator as per
      JSR's request
    - Made a SubImpose method static so usable by outside classes
    - Added SidechainMainchainSwapper class to identify places where two models
      diverge such that the sc of one takes the same path as the mc of the other
    - Tweaks to SidechainMainchainSwapper, e.g. added Lys, Met
    - Added LocalRotarama: first take on expression of *local* model quality

    ### 1.04 ###
    dak
    - Added public static getRotNames & getRotEvals methods to Rotalyze so outside
      classes, e.g. in cmdline, can get rotamer names & evaluations from a Model and
      use them for whatever purpose
    - Added RotamerCorrectness (corRot from CASP8) which uses ^
    - Tweaks to RotamerCorrectness to handle single model files vs. directories,
      multi-MODEL targets (e.g. NMR), and summary vs. per-residue output
    - Added RotamerCorrectness.help so future CASP9+ assessors can actually
      use the program correctly
    - Added -raw documentation for Ramalyze, which I realized we never added a
      while back
    - Added version & build # output to RotamerCorrectness help
    - Fixed -dcamin flag bug in VariableRegions
    - Incremented version to 1.04 for all RotamerCorrectness stuff
    - Fixed target ID and backbone-only bugs in RotamerCorrectness
    - Fixed model count and target count for RotamerCorrectness -summ mode
    - Added default behavior to SubImpose: best 90% of sequence-aligned CAs
    - Fixed bug in SimpleNonWaterResAligner nested class in SubImpose. Previously
      only water-water pairs were unrewarded (0) in alignments; now water-water and
      water-amino-acid pairs are penalized (-1). Result: better, more intuitive,
      more protein-centric alignments!
    vbc3
    - changed modelplotter to use molikin code, mainly for RNA rotamer tool.
    - comment out adjustAltConfLabels(m); line in modelmanager (line 586); I don't
      remember exactly why, but I think maybe due to an esoteric bug found by
      Stuart.

    ### 1.03 ### dak
    - Added SupKitchenTool for "cooking up" superpositions of sets of PDB files
      and analyzing them based on PCA
    - Added molikin package import to build.xml to allow drawing kinemages to the
      screen more easily. Seems not to make chiropraxis.jar too much bigger
    - Made some methods & inner classes in SubImpose public & static so they can
      be called from SupKitchenTool, so don't have to duplicate that code
    - Some tweaks to DihedralPlotter, like scaling of balls'  radii based on value
      for visual effect
    - Added -pdbs=[dir] output & hard rmsd cutoff options to SupKitchen
    - Fixed some chain-separation bugs/problems in SupKitchen
    - Added & subtracted GUI options to & from SupKitchenTool
    - Made DihedralPlotter not plot stuff below Rama general outlier level of
      99.95% - cleans up look of resulting kins
    - Uncommented original residue alignment method in SubImpose as alternative
      if newer, non-chain-boundary-crossing method fails (usually when ref is
      shorter than mobile?)
    - Added SubImpose.SimpleNonWaterResAligner class for eliminating the HOH-HOH
      residue pairings that annoyingly often screw up alignments & thus super-
      positions.  Makes SubImpose less generalized but hopefully much more usable!
    - Totally minor: changed variable name in @param statement in mc.SupKitchen

    ### 1.02 ### dak
    - Added PhiPsiTool (shows up as "Tweak phi/psi tool" in KiNG) to kingtools

    ### 1.01 ### dak
    - Added sc.SidechainsLtoD for making D-amino acid versions of regular L-amino
      acid PDB files
    - Minor change to forcefield.StateManager: uncommented a testing segment
    - New option in SidechainRotator for using D-amino acids.

    ### 1.00 ### vbc3
    - Changed RamaPdfWriter to use new iText code.

    ### 0.99 ### dak
    - Separated out dangle to its own package (now standalone program)

    ### 0.98 ### vbc3
    - Fixed bug in sidechainangles2 which prevented rotating Proline angles correctly.

    ### 0.97 ### (dak)
    - Added tau(arom_i-1,i,i+1) measurements to mc.SheetBuilder and mc.BetaArom
    - Added counter-rotation functionality and ability to use resource file for
      ideal alpha & beta starting coordinates to mc.BackrubRama
    - Added sc.DisulfSampler to make PDB format disulfides from Top5200 dihedrals
    - Added sc.DihedralPlotter to make multi-D kins of pct and rotasamp values
      and see where the sampled rotamers fall
    - Added mc.AvgStrucGenerator to calc avg coords over local region for set
      of PDBs; for comparison of representatives from ensembles
    - Fixed some minor bugs in VariableRegions

    ### 0.96 ### (dak)
    - Added beta aromatic tau measurement to mc.SheetBuilder
    - Added -chi234 flag to sc.RotamerSampler to be used in conjunction with
      -plotchis for 4-chi sidechains (Arg, Lys)
    - Added mc.BackrubRama class to perform backrub central and counter-rotations
      and see effects on phi,psi

    ### 0.95 ### (dak)
    - Completed implementation in Dangle of including hets that should be
      considered part of chain
    - Changed style of measurement specifications in Parkinson file to PDB v3;
      affects output header (aesthetic)
    - Changed internal treatment of RNA phosphate oxygens to handle PDB v2.3 and
      v3 (func'l)
    - Added base-P perpendicular ('pperp') built-in measurement to Dangle
    - Set up Dangle to decide whether each RNA ribose is 2' or 3' pucker based on
      the base-phosph perp and use the appropriate mean and sigma values for a
      subset of lengths and angles (new values aren't in yet though...)
    - Added -parcoor flag for model-by-row output for Jeremy's NMR stuff
    - Added -res=(#-# | #,#,...) flag to Dangle; applies to all output modes

    ### 0.94 ### (dak)
    - Put res type exceptions in Dangle that should be considered part of chain
      even if labeled as hets, e.g. selenoMet (not yet fully operational...)
    - Updated mc.VariableRegions kinemage portions to draw only the most variable
      parts and draw fans better

    ### 0.93 ### (dak)
    (Lots of stuff this time!)
    - Modified mc.VariableRegions to plot kinemage fans and arrows for bb mvmts;
      maybe still some problems
    - Replaced old Top500 Rama NDFTs with Top5200 versions, including cis/trans
      Pro files for future use
    - Put comments in Ramachandran, Ramalyze, and RamaPdfWriter to accomodate cis/
      trans Pro in the future, but currently should still run as before
    - Added -plotchis option for sc.RotamerSampler to allow visualization of sample
      points on kinNDcont kins

    ### 0.92 ### (dak)
    - Added mc.VariableRegions to examine relationship btw d(phi,psi) and d(Ca) for
      pairs of related structures or alt conf loops in a single structure
    - Several other additions/changes since 0.91 -- see svn log

    ### 0.91 ### (dak)
    - Made some changes to mc.DsspHelixBuilder to handle proline NH's and do
      output slightly differently

    ### 0.90 ### (dak)
    - Added mc.DsspHelixBuilder class to complement HelixBuilder (works more akin
      to DSSP algorithm, but not exactly like it for some reason...)

    ### 0.89 ### (dak)
    - Modified mc.HelixBuilder, mc.Helix to accommodate new mc.Ncap class
    - Added a -super2 flag to mc.SubImpose to allow a resrange in one pdb
      to be superimposed onto another resrange from a second pdb

    ### 0.88 ### (dak)
    - Added some measurements to mc.HelixBuilder to puzzle out what we're actually
      detecting with the Ca(i,i+1,i-1) plane's normal to the helix axis
    - Added support for multiple rounds of local helix axis smoothing to
      mc.HelixBuilder
    - Added HelixBuilder.help

    ### 0.87 ### (dak)
    - Fixed oppRes bug in mc.SheetBuilder
    - Added some measures for BetaArom to SheetBuilder

    ### 0.86 ### (dak)
    - Fixed some 'nRes vs. cRes' confusion in mc.HelixBuilder and mc.SheetBuilder

    ### 0.85 ### (dak)
    - Actually svn add'd mc.BetaArom (forgot before)

    ### 0.84 ### (dak)
    - Added BetaArom class to mc for analyzing aromatics in beta sheets and their
      local environs for evidence of backrubs with Ed Triplett
    - Modified mc.SheetBuilder to make BetaAroms from a pdb

    ### 0.83 ### (dak)
    - Added -verbose/-v flag to HelixBuilder for testing purposes
    - Added new, simple ncapAngle output too

    ### 0.82 ### (dak)
    - I now agree w/ all Ncaps HelixBuilder finds in 1amu (despite it reporting
      weird phiN, psiC...)
    - Does smoothed helical axes for nice backrub plane comparison!

    ### 0.81 ### (dak)
    - Completed a version of Ncap-finding method, but needs correct Residues in
      Helix to be useful (not happening now...)
    - Added local helix axes to Helix and HelixBuilder

    ### 0.80 ### (dak)
    - Added new Helix class to fxn w/ HelixBuilder
    - Working on Ncap-finding method (incomplete...) in HelixBuilder

    ### 0.79 ### (dak)
    - Added new mc.HelixBuilder class a la Ian's mc.SheetBuilder
    - Will use to overlay helices, identify Ncaps, compare Asn/Asp vs. Ser/Thr
      at Ncaps to find backrubs, and use in helix cap protein design

    ### 0.78 ### (dak)
    - svn added Dangle.changes (didn't before...)

    ### 0.77 ### (dak)
    - Added -changes flag and Dangle.changes resource file
    - Added versionNumber as a variable in Dangle.java which is printed out
      for -help or -changes at bottom (will need to update manually every time
      code is changed...)

    ### 0.76 ### (dak)
    - Fixed small bug w/ regard to -hets flag
    - Fixed particular Measurement line in Parkinson resource file for -rna (noted
      in the file)

    ### 0.75 ### (dak)
    - Added -hets flag to Dangle (default: doesn't address hets)

    ### 0.74 ###
    - Multiple changes aimed at getting Modeling tools compatible with PDB v3 format.
    - changed SidechainAngles2.areParentandChild to try to be compatible with both v23 and v3 formats.
       Hope it still give proper behavior.
    - changed angles.props and SidechainAngles2 so dihedrals can have alternate atom names.
    - SidechainIdealizer changed to read in two different idealized residue pdbs, and use the proper one,
       depending on the input PDB.
    - ScMutTool has an option for making the mutated residue in either PDB v3 or PDB v23 format.
    - singleres.pdb and singlesc.pdb converted to pdb v3, new singleres-v23.pdb added (v23 format).
    - sc-connect.props changed to have both pdb v23 and pdb v3 connections.
    - fixed a bug in Ramalyze where "MODE_PDF" was giving an error, even when PDFs were being generated.

    ### 0.73 ### (dak)
    - fixed a bug that prevented running multiple PDBs with -rna or rnabb
    - added SubImpose for superimposing subsets of atoms in PDB files

    ### 0.72 ### (dak)
    - added -raw flag to rotarama.Ramalyze to replicate the raw data output
      functionality in hless (was on IWD's to-do list)

    ### 0.71 ### (dak)
    - amended spring drawings in dangle.GeomKinSmith so ideal distance = 6 turns
      and each sigma deviation = +/- 0.25 turn
    - changed rotarama.Rotalyze so OUTLIERs are output as 0 to 360, not -180
      to 180

    ### 0.70 ### (dak)
    - added information about the changes below to Dangle.help

    ### 0.69 ### (dak)
    - added -sub flag to Dangle, which makes GeomKinSmith output be @subgroup
      instead of @group
    - removed a print line from GeomKinSmith that I had accidentally left in for
      debugging

    ### 0.68 ### (dak)
    - fixed a stupid bug I had just committed

    ### 0.67 ### (dak)
    - fixed bug that was messing up i-1,i dist viz's in GeomKinSmith
    - modified Dangle output methods and GeomKinSmith so DNA automatically dist-
      inguished from RNA if use -rna flag *or* rnabb SuperBuiltin; works if using
      -validate or a flag for geom dev viz's (e.g. -geomkin)

    ### 0.66 ### (dak)
    - changed rnabb SuperBuiltin so results are output only for RNA residues
    - involved changes in Dangle.fullOutput(), Dangle.parseArguments(),
      Measurement.newBuiltin(), Measurement.newSuperBuiltin(), and Parser

    ### 0.65 ### (dak)
    - fixed handling of Measurement.Groups in GeomKinSmith so that it can handle N19
      "ambiguities" between purines and pyrimidines, so now works with RNA

    ### 0.64 ### (dak)
    - added GeomKinSmith.java for making kins of angle and distance outlier
      visualizations
    - edited Dangle.java's Main method so if new geometry flags are true,
      visualization kinemage is made
    - added some "get" methods to Measurement.Angle and .Distance

    ### 0.63 ### (dak)
    - fixed a bug I had just submitted in which I had accidentally deleted the
      "# label:model:chain:number:ins:type" line at the top of Dangle.java

    ### 0.62 ### (dak)
    - renamed labels for pucker amplitude and pucker pseudorotation angle to be more
      concise

    ### 0.61 ### (dak)
    - added suitefit as new SUPERBLTN and suitefit measures as new BUILTINs
    - added new subclasses for RNA ring pucker called PuckerAng (calculates P from
      Altona et al, JACS, 1972) and PuckerAmp (calculates tau_m from Rao et al,
      Acta Cryst, 1981)
    - keyword 'pucker' within Dangle command outputs the above two pucker measures

    ### 0.60 ###
    - fixed Dangle parsing error for "+" residue specifiers like "i+1"

    ### 0.59 ###
    - changed to Java 1.5 in compiling (needed by Dangle)
    - created dangle.XyzSpec as superclass of AtomSpec
    - implemented XyzSpec.Average and XyzSpec.IdealTetrahedral
    - removed old CbDev class and added new cbdev builtin
    - added new "planarity" measurement
    - added "vector_angle" measurement
    - added "vector()" and "normal()" functions
    - added -sigma flag
    - caught up on Dangle documentation

    ### 0.58 ###
    - switched Dangle to use driftwood.parser for tokenization
    - updated documentation to include "for" syntax and -protein/-rna/-dna flags
    - added new cbdev measurement to Dangle

    ### 0.57 ###
    - Dangle: added "rnabb" super-builtin for Jane
    - Dangle: changed default to be all builtins
    - added "maxb" and "minq" to Dangle
    - added "ideal MEAN SIGMA" syntax to distance and angle definitions.
      This will probably suffice only for very simple validation!
    - added a "for ..." prefix to measurements to aid validation scripting
    - started entering Engh and Huber parameters
    - discovered "for ..." clause needed to be able to refer to prev/next residue
    - implemented "for [i|i[+-][1-9]] [cis] RES ..."
    - added outliers-only output format
    - changed -validate output to pure colon-separated
    - added -protein, -rna, -dna flags for loading parameters
    - added slightly more helpful syntax error messages to Parser

    ### 0.56 ###
    - added Rotamer.identify() based on a dumb "boxes" approach for rotamer naming.
    - allowed Rotamer.identify() and .evaluate() to act on String + angles too
    - finished initial version of rotarama.Rotalyze for sc rotamer analysis in MolP
    - in Rotamer, added provision to not mark as outliers truncated sidechains
    - in BgKinRunner, made changes to bounding box, res list when 0 residues
    - added more nucleic acid builtins to dangle
    - added way to specify alternate definitions like RNA chi angles: just define
      measurements that share the same name (label).
    - added -360 flag to make Dangle dihedrals fall on 0 - 360

    ### 0.55 ###
    - updated KiNG plugins to work with 2.0 code changes
    - added Dangle for calculating molecular geometry on demand
    - added built-ins to grammar
    - added support for regular expression atom names
    - split res CNIT into four fields (for better mmCIF compatibility)
    - added nucleic acid built-ins
    - wrote Dangle man page
    - added -cif and -pdb flags
    - added distance check for connectivity (N--C and O3'--P)
    - added "chi" built-in for nucleic acid sidechains (two possibilities)
      There is NOT (yet) a way of specifying this case in the grammar.

    ### 0.54 ###
    - started on BackrubFinder2
    - updated Suppose, AlignChains, and BackrubFinder2 to new SuperPoser API
    - bug fix: SidechainRotator gave wrong rotamer evals (from prev. conformation)
    - added "update" button to Probe dots in ModelManager [requested by JSR]
    - bug fix: Probe dots cause mc, sc, H to be turned off? (in multikin)
        If the masters were already off, mc/sc/H are turned off in molten/frozen.
        This is a normal part of kinemage merging.
        We could either (1) not label the rotatable groups with those masters
        or (2) turn those masters on when we create rotatable groups.
      I opted for (1), prefixing the rotatable master names with "refit".
    - added utility for superimposing peptide libraries formatted for RESOVLE
    - updated NDFTs to match data from top500-angles and PHENIX Python code
    - backrub tool now defaults to NOT idealizing sidechains

    ### 0.53 ###
    - started modifying ModelManager2 to allow switching alts and defining new alts
    - it seems to basically work now, except that change logging is broken
    - improved interface: save chooser doesn't switch dirs, current alt is shown
    - started BackrubFinder
    - updated forcefield.NonbondedTerm to be configurable
    - added change logging to ModelManager2 the dumb way -- not undoable right now

    ### 0.52 ###
    - added "S" rotamer sample points to Phe, Tyr, Asp, Asn, Gln, and Glu.
      It *seems* that everything still works...
    - commented out timing println() statements in BgKinRunner
    - added mc.AlignChains for quick comparisons of NCS related subunits
    - adjusted for driftwood.moldb2.Model.getStates() now returning a Map

    ### 0.51 ###
    - added an "Overview" view to the output of SequenceSpacer
    - experimented with alternate tree layout; I think it's more useful now
    - also added sequence diversity displays to aggregate tree nodes
    - ScMutTool now launches a SidechainRotator afterwards...
    - timed all portions of BgKinRunner to see why Probe dots are slow on OS X.
      Can't find anything definitive, but stdin/stdout seems slow vs Probe alone.
      This could be the streams or could be a threading/timeslicing issue.

    ### 0.50 ###
    - restored mouse wheel zooming for Backrub tool
    - refactored rotarama.Ramalyze to allow stream I/O for benefit of PDB usage
    - added website and Lovell '03 citations to Ramachandran PDF template
    - changed 11 files for ModelGroup-to-CoordinateFile name change: ModelManager2,
      ScMutTool, AltConfBackrubFinder, AnisoOxygenSearch, HingeFit, Ramalyze,
      PeptideFlipFinder, SheetBuilder, Suppose, RotamerSampler, SidechainIdealizer

    ### 0.49 ###
    - added neighbor discovery to SequenceSpacer and hyperlinked views
    - added aspects to connections between sequences
    - added print-out of mutations to other neighbors
    - BgKinRunner converted to bounding box instead of centroid
    - fixed driftwood.gui.ReclickListSelectionModel bug that caused multiple Probe
      runs every time a user selected a rotamer from the list.

    ### 0.48 ###
    - modified dezymer.SequenceTree to (1) use a radial layout and (2) use BLOSUM-
      based spacing between single sequences around the perimeter.
    - added {centroid} and {radius} to BgKinRunner to support Probe within # of ...
      This makes Probe dots substantially faster, though I'm not totally sure why.
    - dezymer.SequenceSpacer now finds graphs of connected sequences, but doesn't
      do anything with them yet.

    ### 0.47 ###
    - implemented face-centered cubic lattice and breadth first search for KingFoo
    - added KingFooCLI as a cmd-line interface to KingFoo
    - renamed chiropraxis.minimize to the more appropriate chiropraxis.dezymer
    - added get/setState() variants to forcefield.StateManager
    - converted SequenceSpacer to use chiropraxis.forcefield implementation instead
      of its own custom minimizer. ~2x slower, but more robust and maintainable.

    ### 0.46 ###
    - made Backrub tool into BackrubWindow, so multiple can be open at once.
    - BackrubTool and ScRotTool windows can now launch the other for same residue.

    ### 0.45 ###
    - modified KingFoo to use Probe for rapid placement of foos
    - ScRotTool, ScMutTool, and HingeTool now use ptID to say "use middle click!"
    - commented out "Simulate experiments" button from NOE panel
    - added BackrubTool, derived from HingeTool and PeptideTwister2. Seems to work.
    - updated tools manual for new Backrub tool

    ### 0.44 ###
    - added kingtools.KingFoo
    - KingFoo works; places foos and dots in cavities of proteins
    - optimized bin size for speed of searching
    - remove solvent accessible foos
    - converted KingFoo main() to autodetect the protein volume
    - wrote mc.PeptideFlipFinder to find pep flips in Backrub alt conf library

    ### 0.43 ###
    - accomodated ResidueException becoming a checked exception
    - accomodated AtomException becoming a checked exception
    - changed ModelManager's alt selection to let altID be a String (CIF compat)
    - accomodated changing Residue chain and insCode to Strings (CIF)
    - accomodated converting Residue sequence number to a String (CIF)
    - after light testing and a few bug fixes, the KiNG tools *seem* to still work

    ### 0.42 ###
    - changed rotamer list to update even when same rotamer is picked again

    ### 0.41 ###
    - did a lot of work on r71 to improve the SSWING tool
    - removed unneeded GUI code, improved background thread mgmt
    - these (massive) changes became r73
    - had to edit sswing line 80 to remove $dir."/".
      This breaks compatibility with absolute file paths.

    ### 0.40 ###
    - recompiled to incorporate with changes to driftwood.moldb2.PdbWriter
    - changed B-factor on ideal sidechains / residues to 30 instead of zero
    - checked on Shuren's repairs to the ModelManager: only one menu was broken.
      Several unused variables were also removed.

    ### 0.39 ###
    - added translucent balls to the output of SequenceSpacer
    - found missing-comma bug in BLOSUM code of SequenceSpacer
    - added a scaling factor to the BLOSUM code so ball radii come out right
    - wrote minimize.SequenceTree to do another analysis of Dezymer sequences
    - added "Fast model open" to ModelManager. Some layout issues still remain.
    - created some pieces of a MM force field in chiropraxis.forcefield
    - stupid bug in AngleTerm was assigning to gradient instead of adding to it
    - fixed a bug in Brent's method of GradientMinimizer (wrong endpoint b)
    - fixed confusion between search path and gradient in GradientMinimizer
    - changed (now correct) Fletcher-Reeves algorithm to Polak-Ribiere; works better
    - added RubberBand tool for KiNG
    - implemented both simple (all-against-all) and fancy (hash table / 3-D bins)
      approaches to neighbor detection for nonbonded terms. Fancy is preferrable.
    - made some changes to line-min in GradMin to keep things from getting stuck
    - made separate categories with separate weightings for energy terms in StateMan
      The weightings do make gradient calculation somewhat less efficient, so we may
      want to remove them later if there's no real benefit or use.
    - added some GUI controls to the rubber band tool to make it more fun

    ### 0.38 ###
    - wrote AnisoOxygenSearch
    - modified build.xml to include all of driftwood including Jama

    ### 0.37 ###
    - created a LyX document for the tools
    - updated ModellingTool to use help URL from this JAR
    - recompiled kingtools b/c BasicTool.overpaintCanvas() changed signature

    ### 0.36 ###
    - moved all the KiNG remodelling tools into the kingtools package

    ### 0.35 ###
    - added SidechainAngles2.getAllRotamers(String)
    - added sc.RotamersForTerwilliger to produce rotamer files from Penultimate Lib.

    ### 0.34 ###
    - SidechainAngles.setAllAngles() now ignores the NaN's that can be produced
      by measureAllAngles().
    - SidechainIdealizer.idealizeSidechain() now uses all angles instead of chis.
      Hopefully, this will remove some of the remaining bugs (e.g. for prolines)
    - fixing the proline idealization bug also required redefining pchi3 using 1HD.

    ### 0.33 ###
    - started H-bond network analysis in beta sheet
    - allowed peptides to be incomplete
    - connected up peptides into beta-sheet network
    - calculated planes, sheet normals, and local coordinate systems
    - added visualization of planes in addition to their normal vectors
    - added parallel/antiparallel flags to Peptide
    - fixed build.xml to clean up itext.jar and jama.jar
    - added "deploy-local-mp" target to deploy to MolProbity3
    - Ramalyze now reads PDB filename from cmd line params
    - moved LsqPlane to driftwood and removed explicit Jama dependency
    - added mc.AltConfBackrubFinder to speed the search for alt-conf examples
    - fixed SidechainIdealizer.idealizeSidechain() so it doesn't leave
      Ala's hydrogens oriented randomly.
    - migrated to using version.props AND buildnum.props to simplify version control

    ### 0.32 ###
    - started working on RamaPdfWriter to test out how we could create multi-page
      PDF Ramachandran plots for multiple-model NMR structures.
    - added rotarama.Ramalyze and hooked it up to RamaPdfWriter
    - changed mc.CaRotation to idealize whole sidechains instead of just C-betas.
    - added jama.jar to the build process
    - gave Rama plots more sensible residues names (chain, seg ID only if needed)
    - PDF writer now collects and reuses templates for each model
    - missing hashCode() in Ramalyze.RamaEval led to duplications with alt confs
    - added summary statistics and outlier list for all models and model-by-model
    - stats are now 1 column or 2
    - model numbers appear in residue labels
    - model number and file name are now printed on each page
    - basic command line switches and help information added to Ramalyze
    - added itext.jar and jama.jar to the Manifest

    ### 0.31 ###
    - made CB idealization optional for CaRotation.makeConformation()
    - did the same for CaRotation.twistPeptides()

    ### 0.30 ###
    - fixed typo for Trp m95 rotamer (+/- problem)

    ### 0.29 ###
    - changed build.xml so the default target is "dist"

    ### 0.28 ###
    - modified sc.SidechainAngles2 to use driftwood.data instead of driftwood.gnutil
    - fixed MSE SE naming incompatibility between angle-naming code and ideal geom residues
    - fixed bug in sc.SidechainAngles2.areParentAndChild()
      It was recognized that MSE SE did not have a remoteness indicator, BUT
      there was a logical error in the code because it had never been tested.

    ### 0.27 ###
    - created TauByPhiPsi to evaluate tau by Ramachandran position,
      using initial data from P. A. Karplus' 1996 "Hidden Strain" paper.
    - added facilities for constructing mutations into SidechainIdealizer

    ### 0.26 ###
    - Changes to Ramachandran, CaRotation, and Suppose
      to accomodate changes in driftwood.moldb2 ver. 0.48
    - RotamerSampler can now create copies of the template residue and re-index them.
      A small benefit here, but it lays the foundation for mutations, etc. in KiNG.
    - bug fix: removed the mysterious N-epsilon from definitions of Pro rotamers
    - added a chi-angles/all-angles distinction to RotamerSampler
    - changed the scheme for weights in Q to make best use of the space available
    - bug-fix: using all angles read the weight from the wrong field

    ### 0.25 ###
    - added NdftToPgm for converting NDFTs to Portable Gray Map files.
      Can use the UNIX utility 'pnmtopng' to get a PNG file from this.
    - fixed NDFloatTable bug that zeros out realcount when reading from a NDFT file.
    - created sc.RotamerSampler for generating PDB models of sampled conformers

    ### 0.24 ###
    - added sequence-distance scoring based on the BLOSUM 62 matrix (-blosum)
    - added mc.HingeFit, which searches for a series of Backrub-like hinges
      that reduce RMSD between two related loops.
    - I was frustrated that I couldn't seem to find the minimum
      around the axis of rotation in an analytic way.
    - made sc.SidechainAngles2.measure{All,Chi}Angles() return Double.NaN
      for ill-defined angles instead of throwing AtomException.

    ### 0.23 ###
    - started minimize package to do Cartesian-space minimizations
    - built a simple harmonic potential to put "springs" between points
    - built a steepest-descent minimizer with arbitrary step length
    - optimizations (caching) in the potential function gave better than 2x speed improvement.
      This is good for dense networks (force b/t every pair) but not for sparse.
    - built a dual-purpose steepest-descent/conjugate gradient minimizer.
      It still takes arbitrary steps though, so there's less advantage from CG.
    - improved the visualization kinemage
    - added line-search option to find true minimum along each gradient/search path
    - renamed to GradientMinimizer
    - added code to check for numerical instabilities (NaN)
    - determined that box size for initial placement has no effect on outcome
    === MAJOR REORGANIZATION OF PACKAGE STRUCTURES ===
    - removed the backrub package! (no longer used by anything...)
    - removed the failed 'nmr' package; not needed since Coggins' noe-display
    - merged the cairo package into the mc package

    ### 0.22 ###
    - fixed typos in defining Met/Sme rotamers ttt and mmt

    ### 0.21 ###
    - added idealizeSidechain() to SidechainIdealizer.
    - fixed a problem in CaRotation.transformAtoms() where an AtomException
      could cause the transform to fail for all atoms.

    ### 0.20 ###
    - modified rotarama.Rotamer to also work with moldb2

    ### 0.19 ###
    - converted SidechainAngles to SidechainAngles2 (moldb to moldb2)

    ### 0.18 ###
    - made Lesk sieve into a sorting procedure
    - dropped correlation/dot product kinemages
    - renamed VectorDiffDist to Suppose
    - wrote help file for Suppose
    - added switches to select size of superpositioned subset
    - calculated RMSDs in-line and added IWUSDD to Lesk plot for comparison

    ### 0.17 ###
    - wrote VectorDiffDist
    - discovered iteration (using prev values as weights) improves signal-to-noise
    - unsigned sum of diff dists seems to work better than vectors (but no 3-D info)
    - I think all the vectors get biased towards the center-of-mass of the structure.
      So far, plots of dot products haven't been helpful in confirming this.
    - implemented Lesk's least-squares "sieving" procedure using driftwood.r3.SuperPoser
    - added Lesk plot to VectorDiffDist

    ### 0.16 ###
    - Fixed a bug in CaRotation.twistPeptides() that only kept the last twist
    - Checked SidechainIdealizer for the same bug; it's clean

    ### 0.15 ###
    - added nmr package with NoeConstraints and DyanaReader
    - started trying to test it out, but the names are all screwed up!

    ### 0.14 ###
    - added ability to rotate lots of peptides to CaRotation

    ### 0.13 ###
    - removed artificial ceiling on residue separation in CaRotation

    ### 0.12 ###
    - migrates Cairo over to using MolDB2
    - created sc.SidechainIdealizer to idealize C-betas in MolDB2
    - made Cairo fix the C-betas
    - changed sc.SidechainAngle to use GnuLinkedHashMap/Set classes

    ### 0.11 ###
    - updated Rotamer and angles.props to treat MSE (seleno-Met)
    - sc.SidechainAngles.areParentAndChild() would fail on MSE b/c SE
      has no remoteness indicator; workaround added.
      Not tested yet b/c Reduce doesn't add all the appropriate H.
    - created package 'cairo' to handle Ca-Ca rotations
    - wrote (first draft of) CaRotation for use by KiNG

    ### 0.10 ###
    - made Ramachandran follow the Singleton pattern (with optional workaround)
      to conserve memory without requiring explicit caching by the programmer.
    - added means to assess rotamer quality (rotarama.Rotamer)

    ### 0.09 ###
    - created sc.RotamerDef to simplify rotamer management
    - added frequency data to angles.props

    ### 0.08 ###
    - renamed packages
    - added sc.SidechainAngles for dealing with rotatable sidechains,
      and for measuring chi angles for future rotamer analysis.
    - finished describing all DoF for each side chain
    - started listing canonical rotamers from Lovell et al.
    - finished listing all rotamers

    ### 0.07 ###
    - changed Backrub to optimize conformations based on RMSD(tau) rather than
      worst tau. Using the worst causes insensitivity to the other taus, leading
      to random (and usually worse) conformations there!

    ### 0.06 ###
    - major rotation now also swings side chain of central atom (Backrub)
    - IdealSidechain now corrects the whole sidechain position when idealizing the C-beta
    - made Backrub update ("liken") sidechain atoms too

    ### 0.05 ###
    - added rama.Ramachandran and rama.NDFloatTable
      I think this is better than trying to build a general-purpose Ramachandran
      library function, at least for the moment.
    - rewrote NDFloatTable.valueAt() to eliminate extra memory allocations

    ### 0.04 ###
    - created IdealSidechain. This may belong in a different top-level package,
      but better to move it later on...
    - made some changes to the API of Backrub

    ### 0.03 ###
    - started in on the real Backrub class that will be used in production
    - wrote peptide-orientation optimizing routines for Backrub
    - modified TryTrio to use Backrub, got nice improvements in tau (!)

    ### 0.02 ###
    - created backrub.TryTrio as proof of concept

    ### 0.01 ###
    - started with chiropraxis.backrub.* to do simple two-peptide motion
      using three degrees of freedom in the azimuthal C-alpha trace