    ==============================================================================
    ===  TO DO  ==================================================================
    ==============================================================================
        Weird PDBs:
            1ACX - weird geom leads to weird bonding patterns
            We could modify AtomGroup.connectHeavyAtoms()
            to keep only the N shortest bonds...
        N-to-C or 5'-to-3' coloring crayon: offer for C-alphas / pseudobackbone?
            ribbons could be nicer if we had xyz for center of nextRes, prevRes
        GUI for: only A alts? only atoms with B -lt 30? Q -gt 0.66?
        Element color map should be pluggable, not from Util (VdWLogic.printAtomBalls)
        The case for ribbon to ball-and-stick communication:
            BnS sidechains should draw to a ribbon guidepoint -- which residues,
            and how to get out the guidepoint coordinates?
            Sidechains should just generate the guidepoints for themselves!
        H checkbox should be disabled when no H are present!
        pointIDs should include file names and occupancies (if not zero?)
        doesn't make any ribbons for PDB 1wej:F (horse cytochrome c) -- why not?
        Ribbon code still slightly off on 2vy1 chain W res 2-4.  Something to do with
             contiguous residues list not getting made correctly.

    ==============================================================================
    ===  CHANGE LOG  =============================================================
    ==============================================================================
    ### 1.04 ###
    - Fix for bug in modified RNA bases where CM2 methyl wasn't getting hydrogens
      drawn.  Turns out CM2 is both a mainchain and a sidechain atom!
    - DAK added AltConfNetworkCrayon and modified BallAndStickLogic accordingly.
    - DAK added methods with states argument for printHets/Metals/Waters to
      BallAndStickLogic, and helper methods to ensure backwards compatibility.
    - DAK made changes to Util, StickPrinter, and BallAndStickLogic to allow the
      client to print a kinemage for some residues and provide flanking residues
      so the "ligating" bonds are also drawn.

    ### 1.03 ###
    - Quick fix to AtomGraph to re-enable drawing of disulfides.  Sidechains still
      bond to mainchain if too close.
    - Change to BallAndStickLogic to not require model names to only be numbers.

    ### 1.02 ###
    - Modified ballandsticklogic and datacache to take alternate states, for use
      with RNA rotamer tool.
    - Added pinktint back into list of backbone colors, per Jane's request.
    - Changed masters all throughout Molikin to match new consensus with Prekin
    - Change in AtomGraph to hopefully prevent extraneous bonds being drawn between
      sidechains.
    - Added new kin vs. append to current options to Quickin (dak)
    - Added public width variable for vectorlists to BallAndStickLogic (dak)
    - Added calculation of ribbon sidedness (inside of helix and uniform strand
      sidedness across a sheet) in RibbonPrinter.printFancyRibbon()
    - Made Quickin lots include waters, as in Prekin ... then undid that (DAK)

    ### 1.01 ###
    - Modified drop pdb to do CA by default for lots.
    - Modified ribbon code to do fancy coil edges, using new rear and fore keywords
    - Moved PDB file suffixes to CoordinateFile.

    ### 1.00 ###
    - Raising molikin to version 1.00 to prepare for deployment at PDB.
    - Added capability for doing only one model.
    - Added warning to Quickin if input file is large and running as applet.
    - Fixed bug where PNA cif files were not getting drawn.
    - Fixed bug where NA cif files weren't getting recognized as NA.

    ### 0.22 ###
    - removed untwist ribbon checkbox from gui
    - Added quick kin tool, with lots, ribbons, ca trace, separate residues, ribb+lots.
    - Added a few quickin options to mac's drag and drop of pdb files.
    - Added Ctrl+I to molikin plugin.
    - Added loading of files from king cmdline to quickin.
    - Fixed bug with ribbon code where if an nucl acid started with certain partial
      resides, then whole chains would not be drawn.
    - Added initial cmdliner, with lots and ribbons.
    - Fixed bug where if a nuc acid chain ended without C4', then NullPointerExcept thrown.
    - Fixed various bugs if file was CA only with UNK atoms (see 1hr3).
    - Fixed odd bug with ribbon code hiccupping on NA residues missing P (see 2vy1 and 1e3o).
    - Added gz file reading.

    ### 0.21 ###
    - added capability for appending pdb id to end of point id.
    - fixed bug where occupancy wasn't being put in point id.

    ### 0.20 ###
    - Improved compatibility with nucleic acids pdbv3.x.

    ### 0.19 ###
    - Changed error reporting email to vbc.

    ### 0.18 ###
    - Fixed rainbow colors, they were reversed.
    - Fixed PDB file filter so it assumes a file is PDB format if not CIF.

    ### 0.17 ###
    - Fix in ResRanger, I think for the new Hybrid-36 stuff.

    ### 0.16 ###
    - Fixed a bug where molikin wasn't able to handle models with different chainIDs.
    - added support for half-bond coloring to ball-and-stick mode.
      Only Bad People would actually want such a thing, of course  ;)

    ### 0.15 ###
    - added pointIDs for ribbons.  Currently NOT pluggable, and method of switching
      from protein rules to RNA/DNA rules is very kludgy.

    ### 0.14 ###
    - Molikin uses chain IDs (conservatively) to avoid cross-chains bonds in EM
      structures.  Still errs on the side of too many bonds instead of too few.
    - added ResTypeCrayon; requested by members of BCH 222
    - added option to color sidechains/bases by residue type using ResTypeCrayon
    - fixed color-by-residue type bug: "if" instead of "else if" caused stick
      drawing to fail!
    - fixed ribbon code to not die on C-alpha only protein chains (e.g. 2MYS)
    - fixed "CA-only" bug in guide points for nucleic acids too (if it ever occurs)
    - tried to color N to C by breaking ribbons into pieces, but you end up with
      arrowheads in random places and the pieces never quite fit together right.
    - wrote hack crayon for N to C coloring, added it to ribbon GUI

    ### 0.13 ###
    - added option to draw disulfides all in yellow
    - disulfides as part of general sc drawing now can cross chains
    - MolikinWindow is now better positioned relative to the main KiNG window
    - moved ball-and-stick and VDW rendering into ___Logic classes.
    - added crayons: composite, B-factor, occupancy, disulfides
    - enabled "color by" logic for VdW and sticks
    - changed DecimalFormat instances to always follow US locale
    - now Molikin handles Drag-n-Drop of PDB, CIF files

    ### 0.12 ###
    - changed how Crayons work, to allow them to also filter atoms/bonds
    - changed StickPrinter to honor Crayon.shouldPrint()
    - matched AltConfCrayon and ProteinSecStructCrayon to the new Crayon interface
    - changed ConstCrayon to the new Crayon interface
    - changed extra digits in ___Printer classes to be optional
    - added variable width output to skeined ribbons
    - added methods for 1, 2, 3, and 5-skeined ribbons
    - moved drawing logic from gui.RibbonPane into logic.RibbonLogic.
      This will facilitate building a command-line UI later on.
    - set black-edged ribbons as the default output of RibbonLogic
    - fixed higher/lower in wholebond printer
    - got nucleic acid ribbons working
    - nucleic acid ribbons now match Prekin for B. Golden's "twort" structure
    - protein ribbons still match Prekin for 1UBQ
    - removed ProteinSecStructCrayon
    - changed arguements for RibbonCrayons
    - fancy ribbon now uses crayons, though not for breaks
    - fancy ribbons now use colorsets

    ### 0.11 ###
    - plugin now marks kin as modified on Append, but not on New (may be throwaway)
    - started Ribbons.get(Protein|NucAcid)Contigs()
    - added classes GuidePoint, RibbonPrinter, and RibbonPane
    - updated MainGuiPane to include ribbons option
    - added GuidePoint.prevRes and .nextRes
    - added RibbonCrayon and ProteinSecStructCrayon; ribbons are now colored by SS
    - added [+] and [-] icons to the MainGuiPane interface
    - merged BondOptimizer code into Bond to reduce total number of classes

    ### 0.10 ###
    - removed all the justifyLeft()'s from PrekinIDer after profiling showed that
      to be a hotspot. Formatting numbers and lowercasing are still expensive.
    - made waters peachtint, 0.15 to match Prekin
    - added AltConfCrayon to handle alt conf pointmasters; set it in GUI
    - added CompositeCrayon to allow multiple crayons to play well together
    - made changes in driftwood.moldb2 to fix alt conf problem with 1US0, etc.
      C conf had few atoms; fill-in with duplication created many extra A copies.
      Drawing still seems to work fine now that fill-in is done without cloning.
    - complexified Util.getElement() b/c 1US0 has junk letters in 1st atom name pos
    - removed Util.is(H|Q|CNO|S|Disulfide) b/c they suffer from the same problems.
    - 1US0 still doesn't quite work b/c "AC.." is a valid element name!
    - removed Util.getElement() b/c we now have moldb2.Atom.getElement()
    - this has finally fixed the problems with rendering 1US0
    - Calphas / pseudo-backbone is "off" if we're also doing mainchain
    - added a few more NA names based on Prekin's NAList
    - added _CM2 and _O3P for tr0001 to Util.isMainchain()
    - modified gui.SelectorPane to show chains/models only if there are multiple
    - fixed insets on SelectorPane's text field for residue numbers
    - B factor is only printed in point ID if != 0

    ### 0.09 ###
    - modified the GUI to iterate models, chains at top level; not per panel
      This keeps colors consistent and pieces grouped together.
      Changes to moldb2.Model make the chains come out in order, too.
    - changed defaults for BallAndStickPane
    - tr0001 OMC 32 caught a possible endless loop in BondOptimizer.extendLeft()
    - added pluggable point IDs and matched default to Prekin output
    - added check for whether half-bond midpoint is actually needed
    - added ability to remove a DrawingPane from the GUI, or to remove all
    - added Util.getVdwRadius(), based on Probe's atomprops.h
    - added gui.VanDerWaalsPane to do ball/sphere vdW renderings
    - created much nicer interface for KiNG plugin; removed old one
    - tweaked layout on MainGuiPane

    ### 0.08 ###
    - changed sort order of Bonds to work better with:
    - added Util.optimizeBondSequence() for cleaner kinemages
    - experimenting with up-front optimization of the set of all bonds shows this
      doesn't improve kinemage connectivity once bonds are broken into mc, sc, etc.
    - added Bond.reverse() to facilitate optimizing the connectivity. Is this a good idea???
    - NO! added "mirror" field to Bond instead, so they remain immutable.
    - elaborated on Util.selectBondsBetween() based on StickPrinter experience
    - added BondOptimizer, which can now truly maximize the connectedness
      Adding calls to this from StickPrinter actually speeds things up, as well as
      reduces the size of the kinemage file.
    - streamlined the operation of BallAndStickPane a bit
    - added PseudoBackbone for doing C-alpha traces and DNA/RNA pseudo bb.
    - finished implementation of pseudo-backbone and C-alpha traces
    - mocked up a (non-functional) full GUI screen
    - finished work on main GUI screen (for the time being); it seems to work well

    ### 0.07 ###
    - simplified StickPrinter and made it significantly faster (!)
    - added halfbond capability to StickPrinter
    - Oops! Putative speed-up was just a bug (not drawing any sidechains).
      Still, StickPrinter is simplified with no measurable performance penalty.
    - improved SelectorPane layout constraints
    - added BallAndStickPane; controls are not functional yet
    - changed selection API slightly in SelectorPane
    - added DataCache for caching calculated geometry data for each model
    - added Sets of Residues to ResClassifier
    - started moving printing logic out of Test and into BallAndStickPane;
      protein drawing is now working in BallAndStickPane
    - simplified BallPrinter
    - completed all drawing in BallAndStickPane except pseudobb and atom balls
    - added getElement() and getElementColor() to Util
    - added BallAndStickPane.printAtomBalls() and hooked it up to the GUI
    - moved the "covalent" naming out of AtomGraph and into DataCache.
      This allows us to easily make AtomGraph an abstract class in the future,
      instances of which might concern covalent bonds, H-bonds, etc etc.

    ### 0.06 ###
    - fixed isX() typo bugs in Util
    - added BallPrinter
    - further subdivided atoms in AtomClassifier
    - added BondCrayon, AtomCrayon, and ConstCrayon
    - modified BallPrinter and StickPrinter to take a Crayon object
    - added primitive SelectorPane and tested it for selecting sc to draw
    - added ResRanger for managing range selection statements
    - added range support to SelectorPane and coupled List to TextField
    - fixed inclusive/exclusive index issue with BitSet in ResRanger
    - text field selections are now coupled to the list
    - testing against 1RTU, 1EMA: the protein MODRES is pink (het) but still
      connected as it should be ... this seems like a reasonable result.
      Plus, I can't fix it without screwing up other hets!

    ### 0.05 ###
    - added isProtein, isNucleicAcid, and isIon to Util
    - added ResClassifier to decide protein/nucleic/ion/water/het
    - added AtomClassifier to decide bb/sc and heavy/H
    - added BondClassifier to get standard kinemage groupings (bb/sc, prot/het)
    - added some extra sets to AtomClassifier for convenience
    - rewrote Test in terms of the new classes -- shorter and cleaner
    - removed BondClassifier; on further thought, it's not necessary

    ### 0.04 ###
    - string interning in moldb seems to have sped things up across the board,
      though I'm not sure why -- maybe faster comparisons somewhere?
    - updated Test b/c driftwood.moldb2.ModelGroup became CoordinateFile

    ### 0.03 ###
    - refactored Test to accept either PDB or mmCIF input
    - stopped Test from printing xxxlists when there is no content
    - created KingMoleculeImporter as a plugin to load PDBs/mmCIFs directly in KiNG
      It uses Test to do its drawing and (at the moment) is not configurable.
    - changed AtomGraph and Util.selectBondsBetween() to return a Collection of
      Bond objects, rather than a SortedSet. AtomGraph still uses TreeSet, but
      Util uses ArrayList b/c it's faster/cheaper and the Bonds are already sorted.
    - tested importing 1JJ2 (lg. ribosomal subunit) into KiNG -- works pretty well,
      except that some hets are "bonded" to protein (same for 1BOV and others...)

    ### 0.02 ###
    - added isSS(), isDisulfide() to Util
    - added selectBondsBetween() to Util
    - added getCovalentUnbonded() to AtomGraph
    - added segregation by atom type and lots-like drawing to Test

    ### 0.01 ###
    - created AtomGraph, Bond, Util
    - created Test to do quick-and-dirty tests of the basic functions
    - using Unix TIME, tested vs. Prekin on 1JJ2 -- comparable speed.
      Slower on 1UBQ, probably due to JITing (and other overhead?)