==============================================================================
===  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?)