Changes in Release 2.11.1
--------------------------------------------------------------------------------
 * Bugfix release to resolve a critical issue in the scoring action.
   If the reference structure was provided in mmCIF format, model chains were
   mapped to the reference using residue number alignments, even when the
   residue-number-alignments flag was diabled. This could cause mapping failures
   when model chains were not numbered consistently with the reference.
   This bug was introduced in 2.10.0.
 * Minor bugfixes in SDF io

Changes in Release 2.11.0
--------------------------------------------------------------------------------

 * Scoring actions:
   * Relaxed strict requirement for mmCIF files to contain _entity.type and SEQRES
     information with fallbacks available in fault tolerant mode.
   * Replaced allow_heuristic_conn flag with fault_tolerant.
   * Improved logging
 * Several bug fixes and improvements.

Changes in Release 2.10.0
--------------------------------------------------------------------------------

 * Fixed a bug in Molck where atoms in unknown residues would not be cleaned up
   with rm_unk_atoms=True.
 * Changed default MolckSettings so that rm_unk_atoms defaults to True.
 * Chain mapping updates:
   * In a first step, groups of identical chains need to be indentified in the
     reference structure. The default is sequence based clustering. Now this
     can be set explicitely and the compare-structures/compare-ligand-structures
     actions extract this information from the mmCIF entity record if the
     structure is provided as mmCIF file.
   * Model chains need to be assigned to any of these groups which is done
     by maximum sequence identity upon alignment. Previous behavior: use
     max sequence identity to force an assignment. New behavior: specify a
     minimum sequence identity below which a model chain is considered
     unassigned. The comparison actions use 70%.
   * Add chain mapping method described by AF2-Multimer
     (https://doi.org/10.1101/2021.10.04.463034). Available as
     ChainMapper.GetAFMMapping.
   * Remove "greedy_fast" strategies in ChainMapper.GetlDDTMapping\
     ChainMapper.GetQSScoreMapping
 * OMF updates:
   * Construct assemblies
   * Getters for residue numbers, backbone traces and occupancies
   * OMF support in mmCIF writer
 * Added details in documentation for Molck.
 * add lDDTScorer.DRMSD - Distance RMSD that operates on distance differences.
 * Remove custom boost configuration code . Use preferred way of boost provided
   configuration files for newer cmake/boost versions.
 * Silence CMake warnings
 * Several bug fixes and improvements.


Changes in Release 2.9.3
--------------------------------------------------------------------------------
 * Bugfix release to enable OpenStructure in Python 3.13
 * tags in Docker/Singularity remain deliberately on 2.9.2


Changes in Release 2.9.2
--------------------------------------------------------------------------------
 * Examples for comparing macromolecular complexes
 * Documentation updates


Changes in Release 2.9.1
--------------------------------------------------------------------------------

 * Enhanced structure cleanup in ligand scoring to avoid issues when non-
   standard atoms are present in reference/ model structures. Cleanup is logged
   and available as output in the compare-ligand-structures action.
 * Disabled automatic ligand extraction from PDB files. For mmCIF this is still
   possible and strictly uses the _entity.type item "polymer" to identify
   receptor chains and "non-polymer" to identify ligands.
 * OMF bugfix: avoid potentially endless loop in OMF parsing


Changes in Release 2.9.0
--------------------------------------------------------------------------------

 * lDDT-PLI now penalizes added model contacts by default.
 * Updated unassigned reasons (model and target) to better reflect changes
   to ligand scoring made in OST 2.8.0.
 * Added CSV output (--output-format csv) and by model (rather than target)
   ligand output (--by-model-ligand-output) to compare-ligand-structures
   action.
 * Improved logging and output of compare-ligand-structures action.
 * Residue SetChemType() is now exposed in Python.
 * Allow reading of BIRD compounds in PRDCC format in the compound library.
   Compounds in PRD formats cannot be read and are rejected cleanly.
 * The chemdict_tool executable now exits with an error status if no compound
   were imported.
 * The SDF writer populates the program name and time line (2) as per SDF
   specification.
 * The mmCIF reader now refuses to read in files with multiple data blocks
   (except in fault tolerant mode), and warns about mmCIF files containing
   more than one model (atom_site.pdbx_PDB_model_num).
 * GDT produces slightly higher scores. It's an optimization problem in the
   end to find the highest possible fraction of CA atoms that superpose within
   a specified threshold. OpenStructure GDTTS scores are now on average 0.21
   points lower (range [0, 100]) than LGA when computed on all CASP15 TS models.
 * Enable DockQ on protein-nucleotide and nucleotide-nucleotide interfaces.
 * Enable per-atom lDDT scores.
 * Optionally compute ICS/IPS scores on trimmed model. Reason for that is
   scoring with incomplete target structures. The full ICS/IPS scores may
   consider contacts between residues that are not resolved as false positives,
   even though there is no experimental evidence. The approach with trimmed
   models removes any model residue that cannot be mapped to the target
   structure before scoring.
 * The SDF reader is now aware of IOProfiles and can read files with invalid
   bond types (order) from RDKit in fault tolerant mode.
 * Several bug fixes and improvements.

Changes in Release 2.8.0
--------------------------------------------------------------------------------

 * heavy water (DOD) is now recognised as 'water' instead of 'non-polymer' by
   the compounds library.
 * Added a '--version' argument to the 'ost' executable
 * SEQRES information is now read from the entity_poly_seq category in mmCIF.
   The canonical as well as semi-canonical (with 3 letter-codes in bracket)
   SEQRES are now available from the MMCifInfo object. The
   (Get|Set)ReadCanonicalSeqRes (Get|Set)ReadSeqRes methods no longer exist.
 * Disabled numpy support in C++ layer to simplify build system. Some exotic
   OST functionality directly accessed Python numpy arrays from the C++ layer
   which required to compile against numpy headers.
 * Introduce GDT score which is equivalent to LGA (99.2% of CASP15 TS models
   score within 3 GDTTS points when compared to LGA results).
   Oligo/RNA support comes for free when using the ost.mol.alg.scoring.Scorer
   object.
 * Introduce ilDDT score in scoring.Scorer and compare-structures action.
   It's an all atom lDDT score which only considers interface contacts.
 * Rigid superposition based scores (RMSD, GDT) in ost.mol.alg.scoring.Scorer
   now use RMSD based chain mapping when scoring oligos.
 * scoring.Scorer and compare-structures action can now optionally enable
   peptide specific parameterizations as defined by the CAPRI community for
   DockQ related scores (fnat, fnonnat, irmsd, lrmsd). 
 * Ligand scoring refactoring. lDDT-PLI and symmetry corrected RMSD are now
   completely separated and this comes with API changes. This also affects
   trg/mdl ligand assignment which now differs between the two. lDDT-PLI
   definition has been changed and slightly different results can be
   expected.
 * Breaking changes in compare-ligand-structures action output - run
   'ost compare-ligand-structures -h' for more information.
 * Added 'full_bs_search' argument in ligand scoring. Binding sites for
   symmetry corrected RMSD computation are now searched by only considering
   polymer chains in proximity of ligands to speed up computations on large
   complexes. The old behavior can be restored by enabling this flag.
 * Added model contacts in lDDT. lDDT is not symmetric in a sense that
   added/wrong contacts in the model do not penalize the score. lDDT now comes
   with a flag to add such contacts, i.e. contacts between atom pairs in the
   model that are within the specified lDDT threshold (usually 15A), IF the
   respective atom pair is also present in the target.
 * lDDT-PLI can optionally use the new added mdl contacts feature. Think of
   nasty loops that interact with the ligand in the model which would not be
   penalized by classic lDDT!
 * Remove seq.alg.MATCH and seq.alg.IDENTITY preset substitution matrices
 * Enable parasail (https://github.com/jeffdaily/parasail) as drop-in
   replacement for naive LocalAlign/GlobalAlign/SemiGlobalAlign implementations.
   Must be enabled at compile time - see installation instructions.
 * Alignments in ChainMapper now use SemiGlobalAlign instead of GlobalAlign
   strategy in order to improve the alignment of terminal regions. 
 * ChainMapper.GetMapping now uses backbone only lDDT with inclusion radius
   30A as target function if nucleotide chains are present. Protein only
   structures still use QS-score as target function as before.
 * Remove ost.io.IoProfile.quack_mode property
 * Several bug fixes and improvements.

Changes in Release 2.7.0
--------------------------------------------------------------------------------

 * mmCIF writing support.
 * Added a SaveSDF function (avoids having to use SaveEntity to save an SDF
   file).
 * Support for reading EM resolution from mmCIF files in MMCifInfo.
 * Chemical components marked as obsoleted or reserved (which will never be
   used in the PDB, namely DRG, INH, LIG and the range 01 - 99) can now be
   optionally excluded from the compound library (see the -o and -r arguments
   to the chemdict_tool).
 * The number of symmetries explored in the ligand scoring can now be limited
   with the max_symmetries argument. Compounds with too many symmetries will
   be treated like they are not matching, and reported as unassigned with the
   new 'symmetries' reason. This allows avoiding extremely long execution
   times with some highly symmetrical ligands.
 * Several bug fixes and improvements.

Changes in Release 2.6.1
--------------------------------------------------------------------------------

 * Bugfix in DockQ computation when using ost.mol.scoring

Changes in Release 2.6.0
--------------------------------------------------------------------------------

 * Reporting of unassigned ligands in the LigandScorer.
 * Experimental support for V3000 SDF files.
 * Rotamer based compression in OMF file format.
 * Chain mapping updates. Default chain mapping strategy now uses increased
   sampling - only marginal runtime increase.
 * The compound library now knows about SMILES strings, atom charges, and
   contain information that a compound is obsolete (including the replacement,
   if available). Compound libraries created by OST 1.5.0 or later can still be
   read (SMILES will be empty, charges set to 0, no information about the
   obsolete status of compounds, with warnings). Older files are no
   longer supported.
 * New FindCompounds method of CompoundLib to query compounds by SMILES
   string, InChI code, InChI key or formula.
 * The compound library now reads the "InChI=" part of InChI codes.
 * Implemented ICS/IPS scores to assess oligomeric complexes.
 * Several bug fixes and improvements.

Changes in Release 2.5.0
--------------------------------------------------------------------------------

 * A default compound library is set and the rule-base processor is set as the
   default processor when the ost module is imported. As a result, OpenStructure
   will behave more like a script run with the `ost` command in python scripts,
   Jupyter notebooks, ipython sessions, etc.
 * Global chain mapping and assignment based on RMSD only are available for
   ligand scoring (both with the action and module).
 * Additional chain and residue properties are read from mmCIF allowing basic
   mapping between label and author chain and residue numbers.
 * USalign support - as binding that calls external USalign executable or
   direct injection of macromolecules on the C++ level.
 * Added functionality in compare-structures action: backbone only lDDT,
   flag to disable stereochemistry checks for lDDT, TMscore (including
   associated chain mapping) computed by USalign, make residues/atoms uniquely
   identifiable (also considering residue number insertion codes).
 * Read atom charges if present from PDB/mmCIF/SDF files
 * Several bug fixes and improvements.

Changes in Release 2.4.0
--------------------------------------------------------------------------------

 * Add fast and flexible lDDT implementation. The new code is purely Python
   based, natively supports complexes and is able to score DNA/RNA. The
   deprecated lDDT implementation remains for consistency.
 * Add algorithms to establish one to one mappings between chains in a reference
   structure and a model. Chain mappings can be derived by optimizing oligomeric
   lDDT, RMSD or QS-score. 
 * Substitution matrixes for RNA/DNA to compute alignments: seq.alg.IDENTITY and
   seq.alg.NUC44.
 * Add binding to DockQ (https://github.com/bjornwallner/DockQ) as well as an
   OpenStructure specific implementation of it. Also allows to extract CAPRI
   specific oligo scores (fnat, fnonnat, irmsd, lrmsd etc.)
 * Reimplentation of QS-score in mol.alg.qsscore. Implements speedups and
   heavy caching which benefits heavy enumeration approaches in chain mapping.
 * Stereochemistry related algorithms in mol.alg.stereochemistry. Identifies 
   clashes and non-sensible bond lengths/angles based on parameterizations from
   CCP4 MON_LIB.
 * Add non-polymer/small molecule ligand scoring algorithm with lDDT-PLI and
   symmetry-corrected ligand RMSD scores that were used in CASP15.
 * Better compression in OMF structure format.
 * Two central scoring objects to access to all OpenStructure specific scoring
   capabilities. Tertiary and quaternary structures and interactions, including
   required pre-processing of model/reference (cleanup, stereochemistry checks,
   chain mapping etc.) with mol.alg.scoring.Scorer.
   Non-polymer/small molecule ligands with mol.alg.ligand_scoring.LigandScorer.
 * Re-write of compare-structures action to include newly developed chain
   mapping and scores. The old action is available as compare-structures-legacy.
 * Add compare-ligand-structures action which computes lDDT-PLI and
   symmetry-corrected ligand RMSD scores in protein complexes.
 * Several minor bug fixes and improvements.

Changes in Release 2.3.1
--------------------------------------------------------------------------------

 * Simplify Dockerfile - remove MSMS
 * Enable OpenMM 7.7.0
 * Resolve segfault in DNG observed in Python 3.9

Changes in Release 2.3.0
--------------------------------------------------------------------------------

 * Add AAindex databases (Kawashima et al., 2000)
 * Added experimental molecular structure format OMF (OpenStructure Minimal 
   Format)
 * Removed GUI components in containers
 * Support to call external DSSP program has been deprecated.
   ost.bindings.dssp.AssignDSSP still exists with the "old" interface but mimics
   the equivalent behaviour with the OpenStructure internal secondary structure
   and solvent accessibility algorithms.
 * mol.alg.PDBize does not turn plain polymer chains (not marked peptide or
   nucleotide) into ligand chains anymore
 * Remove ENABLE_IMG flag in cmake build system - img module is always built now
 * Several minor bug fixes and improvements.

Changes in Release 2.2.0
--------------------------------------------------------------------------------

 * Introduced CreateMeanlDDTHA function to evaluate the consistency of a
   structure with a full ensemble of structures.
 * FindMembrane algorithm returns additional intermediate results.
 * Detect Boost and Python using functionality provided by CMake instead of our 
   own code. You might have to adapt CMake flags when building OpenStructure to 
   variables specified here: 
   https://cmake.org/cmake/help/latest/module/FindPython.html
 * Update container base image from ubuntu:18.04 to ubuntu:20.04
 * Several minor bug fixes and improvements.

Changes in Release 2.1.0
--------------------------------------------------------------------------------

 * Use the newer Voronota implementation as default in CAD-score binding
 * Added HHblits3 support - HHblits2 still supported but considered deprecated
 * HMMScore: HMM-HMM alignment score as it is optimized in HHblits searches
 * Support for the new carbohydrate-extension in the mmCIF file format
   (https://www.wwpdb.org/documentation/carbohydrate-remediation)
 * Several minor bug fixes and improvements.

Changes in Release 2.0.0
--------------------------------------------------------------------------------

 * Port OpenStructure to Python 3 (3.6).
 * Updated versions of dependencies
 * Reduced amount of warnings during compilation.
 * Removed OpenMM density plugin and out-dated bindings (3dcomb, MMalign).
 * Several minor bug fixes and improvements.

Changes in Release 1.11.0
--------------------------------------------------------------------------------

 * This is expected to be the last release supporting Python 2.
 * Read revision version numbers from mmCIF files.
 * Several minor bug fixes and improvements.

Changes in Release 1.10.0
--------------------------------------------------------------------------------

 * Use system provided SQLite3 library.
 * Port from Qt4 to Qt5.
 * C++ wrapper around C++ implementation of TMalign.
 * Database for efficient in-memory lookup of coordinates and sequences.
 * Updated CAD score binding with change in result format, check documentation
   for further details.
 * Improved support for recent compilers and libraries.
 * Removed support for USE_MESA.
 * Bugfix of string representation of ResNum which now includes insertion code.
 * Several minor bug fixes and improvements.

Changes in Release 1.9.0
--------------------------------------------------------------------------------

 * Improved compare-structures action (chain mapping handling and documentation).
 * Improved handling of citations read from mmCIF files (mainly for books).
 * Several minor bug fixes and improvements.

Changes in Release 1.8.0
--------------------------------------------------------------------------------

  * Introduced recipes to generate Docker and Singularity images.
  * Moved "nonstandard" functions from ost.conop to ost.mol.alg. Mapping
    functions CopyResidue, CopyConserved and CopyNonConserved that were
    previousely imported from ost.conop are now to be imported from ost.mol.alg.
  * Removed habit of changing secondary structure of entities when loading
    from mmCIF PDB files. Before, OST would turn secondary structure 'EEH'
    into 'ECH' to make it look nicer in DNG. Now, 'EEH' stays 'EEH'.
  * Added Molck API to the ost.mol.alg module.
  * Extended lDDT API in ost.mol.alg module to reproduce functionality of lddt
    binary and fixed issues in stereo chemistry checks there.
  * Added `actions` interface including one action to compare structures.
  * Updated HHblits binding (minor changes for optional arguments).
  * Added functionality to find optimal membrane position of protein.
  * Support for recent compilers which use C++-11 by default.
  * Several minor bug fixes, improvements, and speed-ups.

Changes in Release 1.7.1
--------------------------------------------------------------------------------

  * Fixed an issue that could cause the star format parser (mmCIF, chemical
    components dictionary) to enter an infinite loop
  * Chemical components dictionary was extended by new chemical classes
    introduced by PDB
  * Fixed unit tests
  * Improved documentation

Changes in Release 1.7.0
--------------------------------------------------------------------------------

  * Removed Qt dependency for non-GUI compilation and fixed issues with recent
    gcc and boost versions
  * Added Quaternary Structure (QS) scoring module
  * Fixed mmCIF parser to work with mmCIF dictionary version 5 (now with useful
    revision data) and add r_free, r_work and entity.id to MMCifInfo
  * Added fast accessibility and secondary structure (mimicking naccess & dssp)
    computation (Accessibility & AssignSecStruct in mol.alg)
  * Changed behaviour of mol.alg.Superpose with match = 'local-aln' or
    'global-aln' which used to fail for chains without peptide bonds (e.g.
    CA-only)
  * Large updates for documentation
  * Several minor bug fixes, improvements, and speed-ups

Changes in Release 1.6.0
--------------------------------------------------------------------------------

  * Added code to compare structures attached to a multiple seq. aln.
  * Incorporated Antechamber based force-field parameter generation for mm mod.

Changes in Release 1.5.0
--------------------------------------------------------------------------------

  * Added binding to 3DComb (structural alignment)
  * Added functions to predict contacts from multiple sequence alignments
  * Added some functions to analyze MD trajectories (pairwise distance matrices,
    pairwise distance fluctuations, RMSD matrix etc.)
  * Support of non-orthogonal unit cells for wrapping entities
  * Flexible implementation of HBPlus
  * Updated dependencies (Eigen2 to Eigen3, Boost 1.47 to 1.53)
  * Wrapper for OpenMM. This allows for direct access to molecular mechanics
    functionality from within OST.
  * The compoundslib now features InChI and InChIKeys (machine readable InChI
    hash)
  * Names of compounds are also stored in the compoundslib now
  * Added seq.ProfileHandle class and io.LoadSequenceProfile to work with 
    sequence profiles.
  * Added a wrapper to HHblits.
  * Removed levenberg_marquardt.h in img/alg

Changes in Release 1.4.0
--------------------------------------------------------------------------------

  * Feasibility check set to off by default, atoms in compounds are now
    connected by the Builder irrespective of the distance between them
  * Speed improvement for bracketed within selections up to a factor of 20
  * refactored and streamlined the conop interface. The builder classes
    have been replaced by processors (HeuristicProcessor, RuleBasedProcessor)

Changes In Release 1.3.3
--------------------------------------------------------------------------------

  * fix context menu/main menu for newer Qt versions 
  * CreateEntityFromView remembers chemical type (BZDNG-430)
  * fix gfx.PrimList.SetLineWidth
  * Fix remote=true for MMCIF loader (BZDNG-449)
  * made CreateViewFromAtoms more flexible (BZDNG-408)

Changes In Release 1.3.2
--------------------------------------------------------------------------------

  * Fixed atom ordering in the GetFrameFromEntity() function in the 
    structure_analysis.py module.
  * Fix atom indices generated by CoordGroup::Filter()
  * small tweaks to lDDT output
  * small tweaks to molck
  * Repaired bio unit parsing from mmCIF file/ PDBizing bio units, before
    chains with different transformations were ignored
  * use new remote loader written in Python to work around crash on Mountain 
    Lion

Changes In Release 1.3.1
--------------------------------------------------------------------------------

  * Export missing default argument for AligmentHandle.ToString
  * Automatically attach entity view in SequenceFromChain
  * Export GetMatchingBackboneViews to Python
  * Fix compilation with boost 1.33.1
  * Allow renumbering of single chain

Changes In Release 1.3.0
--------------------------------------------------------------------------------

  * Scene background can now be set to a gradient or an image
  * Better Handling of HSV colors
  * Table: direct access to columns tab['x'] is also available as tab.x
  * Table: Export to ConTeXt and HTML tables
  * Table: Barplot interface
  * The BLAST binding supports newer versions of BLAST
  * Bindings for CAD score
  * Update directory layout of OST to be more conformant with the site-package
    system of Python: Instead of storing the modules in lib{64}/ost/ost, they
    are now in lib{64}/python{{VERSION}}/site-packages/ost
  * Added molck, the molecular checker. A small command-line tool to clean PDB 
    files, e.g. remove atoms with zero occupancy, "virtual atoms", hydrogens 
    etc.

Changes In Release 1.2.3
--------------------------------------------------------------------------------

  * PDBWriter: Prevent writing of out-of-bounds atom coordinates.

Changes in Release 1.2.2
--------------------------------------------------------------------------------
  * Fixed loop indentation in the PDBize function for bio units, leading to
    exponential running time/ memory consumption. This problem only affected a
    fraction of PDB entries.

Changes in Release 1.2.1
--------------------------------------------------------------------------------

  * Use RPATH for linux bundles. No longer requires LD_LIBRARY_PATH to be set
    for chemdict_tool and lddt [BZDNG-385]
  * "install command line tools" also symlinks lddt, and chemdict_tool
    [BZDNG-386]
  * Fixed broken the_hammer.py example [BZDNG-387]
  * MacOS X: Make sure to use python2.6, not python as pyexec [BZDNG-388]
  * Fix example directory path for MacOS X bundle [BZDNG-389]
  * PDBWriter: Insert newline after END [BZDNG-391]
  * Added missing documentation for a few AlignmentHandle methods
  * Workaround for naccess which was failing when directory contains dots.
  * Fixed superposition dialog for unnamed chains
  * Fixed byte-swapping issue for DCD trajectories
  * Fixed FFT panel update after switching data in main viewer
  * Added missing pdbx_struct_assembly.id export
  * lDDT: Updated default angle and bond tolerance parameters from 8 stddev to 12 
    stddev.

Changes in Release 1.2.0 (since 1.1.0)
--------------------------------------------------------------------------------

 * added mmCIF parser to enable loading of mmCIF files. The following categories
   are currently understood:
   atom_site, entity, entity_poly, citation, citation_author, exptl, refine,
   pdbx_struct_assembly, pdbx_struct_assembly_gen, pdbx_struct_oper_list,
   struct, struct_conf, struct_sheet_range, pdbx_database_PDB_obs_spr,
   struct_ref, struct_ref_seq, struct_ref_seq_dif

 * trajectory analysis support

 * better intergration with numpy

 * added Smith-Waterman local align and Needleman-Wunsch global align algorithms

 * static linking of C++ executables

 * support for building OST library with no gfx, gui, info libraries. This leads
   to a compact application bundle that can easily be deployed

 * work around compiler bugs in gcc-4.1 enabling compilation with CentOS 5.5's
   default compiler and libraries

 * introducing the new table class, supporting all kinds of analyses on tabular
   data, including plotting and statistical analyses.

 * added stereochemical plausibility checks and support for multiple references
   to lDDT

 * new superposition dialog in DNG
