2.4.0
-----

New functions for filtering to a certain FDR level based on target-decoy
strategy, as well as for FDR estimation, in :py:mod:`pyteomics.tandem`,
:py:mod:`pyteomics.pepxml` and :py:mod:`pyteomics.mzid`. The functions are
called :py:func:`!filter` (beware of shadowing the built-in function) and
:py:func:`fdr` (in each of the modules). Chained versions
:py:func:`filter.chain` and :py:func:`filter.chain.from_iterable` are
also available. See `Data Access <data.html#general-notes>`_ for more info.

New function :py:func:`pyteomics.parser.coverage` for sequence coverage
calculation.

New function :py:func:`pyteomics.fasta.decoy_chain`, a chained version of
:py:func:`pyteomics.fasta.decoy_db`.

New elements in :py:data:`pyteomics.mass.nist_mass`. Pretty much all elements
are there now.

Fix in :py:func:`pyteomics.parser.parse` to cover some fancy corner cases.

Bugfix in :py:mod:`tandem`: modification info is now fully extracted.

In :py:mod:`mass`, :py:func:`isotopic_composition_abundance` is now able to
calculate abundances for larger molecules.

.. note::
    Rounding errors may be significant in this case.

2.3.0
-----

New parameter "read_schema" in :py:func:`read` functions of XML parsing modules.
When set to :py:const:`False`, disables the attempts to fetch an auxiliary file
and obtain structure information about the file being parsed.

New function :py:func:`chain` in all modules that have a :py:func:`read`
function, for convenient chaining of multiple files. :py:func:`chain` only
works as a context manager. Use :py:func:`itertools.chain` in other cases.
The ``chain.from_iterable`` form is also available as a context manager.

New function :py:func:`pyteomics.auxiliary.print_tree` for exploration of
complex nested dicts produced by XML parsers.

New sets of retention coefficients in :py:mod:`pyteomics.achrom`.

Bugfix in :py:mod:`pyteomics.pepxml`. The bug caused an exception when parsing
some pepXML files.

The output of :py:func:`pyteomics.mgf.read` now always contains a masked
array of charges.

Other minor fixes.

API change
..........

In :py:func:`pyteomics.mgf.read` the precursor charge is now always represented
by a list of ints (a :py:class:`ChargeList` object).

2.2.2
-----

Bugfix in :py:mod:`pyteomics.tandem`. The info about all proteins is now
extracted.

2.2.1
-----

Update parsers for FASTA headers.

NamedTuple for FASTA entries is now defined globally, which should solve
pickling problems.

2.2.0
-----

New module :py:mod:`pyteomics.tandem` for reading output files of X!Tandem
search engine.

2.1.6
-----

Fix in :py:mod:`pepxml`. pepXML files generated by TPP are now processed
without errors.


2.1.5
-----

Fix in :py:mod:`pepxml`. 'modified_peptide' is now always available.

Fix in :py:mod:`mass` (issue #2 in the bug tracker). Improved arithmetics
for :py:class:`Composition` objects.

2.1.4
-----

In :py:mod:`fasta`, :py:func:`decoy_db` now doesn't write to file, but returns
an iterator over FASTA records. The old :py:func:`decoy_db` is now called
:py:func:`write_decoy_db`, which is equivalent to :py:func:`decoy_db` combined
with :py:func:`write`.

Bugfixes:

 - in :py:func:`mgf.read`: the charges, if present, are returned as a
   masked array now. Previously, an exception occurred if charges were missing
   for some of the fragments;
 - values in :py:data:`mass.nist_mass` corrected;
 - other minor corrections.

2.1.3
-----

Adjust the behavior affected by the bug fixed in 2.1.2. `name` attributes
of `<cvParam>` elements in the absence of `value` attributes are now collected
in a list under the `'name'` key.

Add support for overlapping matches in :py:func:`parser.cleave`.

2.1.2
-----

Bugfix in XML parsers. The bug caused the mzML parser break on some files.
The fix can slightly change the format of the output.

2.1.1
-----

Rename keys in the dicts returned by :py:func:`mgf.read` to facilitate
writing code working with both MGF and mzML.

The items yielded by :py:func:`fasta.read` now have attributes `description`
and `sequence`.

2.1.0
-----

New sets of retention coefficients in :py:mod:`achrom`.

:py:class:`mass.Composition` now only stores non-zero ints.

:py:mod:`fasta` now has tools for parsing of FASTA headers.

File parsers now implement the `context manager protocol
<http://docs.python.org/reference/datamodel.html#with-statement-context-managers>`_.
We recommend using `with` statements to avoid resource leaks.

API changes
...........

 - 'pepmass' is now a tuple in the output of :py:func:`mgf.read` (to allow
   reading precursor intensities).

 - new function :py:func:`fasta.parse` for convenient parsing of FASTA headers.

 - :py:data:`fasta.std_parsers` stores parsers for common UniProt header formats.

 - new parameter *parser* in :py:func:`fasta.read` allows to apply parsing while
   reading a FASTA file.

 - `close` parameter removed in all functions that do file I/O. The unified
   behavior is: if the parameter is a file object, it won't be closed by the
   function. If a file path is given, the file object will be created and closed
   inside the corresponding function.

2.0.3
-----

Added new class :py:class:`Unimod` in :py:mod:`mass`. The interface is
experimental and may change.

Improved :py:func:`iterfind` function in XML-reading modules.

:py:class:`mass.Composition` objects now support multiplication by int.

Bugfix in :py:func:`auxiliary.linear_regression`.

2.0.2
-----

Added new function :py:func:`iterfind` in :py:mod:`mzid`, :py:mod:`pepxml` and
:py:mod:`mzml`.

2.0.1
-----

API changes
...........

 - :py:func:`parser.peptide_length` is renamed to :py:func:`length`.

2.0.0
-----

Added :py:mod:`mzid` module for parsing of mzIdentML files.

Fixed bugs, improved tests.

API changes
...........

 - top-module functions in :py:mod:`fasta`, :py:mod:`mgf`, :py:mod:`mzml`,
   :py:mod:`pepxml`, as well as :py:mod:`mzid`, are now called :py:func:`read`.

 - in :py:mod:`parser`, :py:func:`parse_sequence` renamed to :py:func:`parse`.
   It now accepts an optional parameter `allow_unknown_modifications`.

 - :py:func:`mgf.write_mgf` and :py:func:`fasta.write_fasta` renamed to
   :py:func:`write`.

 - the output format of all :py:func:`read` functions has changed.

1.2.5
-----

Include Apache license version 2.0:
http://www.opensource.org/licenses/Apache-2.0

Minor bugfix in :py:mod:`fasta`.

1.2.4
-----

Changes in :py:mod:`mass`.

API changes
...........

 - :py:class:`Composition` objects can be created using positional first
   argument, which will be treated as a sequence or (upon failure) as a formula.
   This means that all functions relying on Composition
   (:py:func:`calculate_mass`, :py:func:`most_probable_isotopic_composition`,
   :py:func:`isotopic_composition_abundance`) allow that as well. However, it's
   of no use for the latter.

 - :py:class:`Composition` entries for modifications can be added to *aa_comp*
   and used in composition and mass calculations. This way the specified group
   will be added to any residue bearing this modification.

 - That being said, the :py:func:`add_modifications` function is not needed
   anymore and has been removed.

 - Addition and subtraction of :py:class:`Composition` objects now produces a
   :py:class:`Composition` object, allowing addition/subtraction of multiple
   objects.

 - :py:class:`Composition` is now a subclass of
   :py:class:`collections.defaultdict` so one can safely retrieve values
   without checking if a key exists.

1.2.3
-----

:py:func:`parser.isoforms` now allows terminal modifications.

Bugfixes in :py:func:`parser.parse_sequence`.

New function :py:func:`parser.tostring` converts parsed sequences to strings.
Helper function :py:func:`parser.is_modX` added to check *modX* labels.

API changes
...........

 - :py:func:`parser.isoforms` now returns a generator object

1.2.2
-----

Bugfix in :py:mod:`pepxml`: modification info is now extracted.
New optional bool argument 'split' in :py:func:`parser.parse_sequence()` allows
to generate a list of tuples where modifications are separated from the residues
instead of a regular list of labels. In *labels* not only *modX* labels are
now allowed, but also separate *mod* prefixes. Such modificatiuons are assumed
to be applicable to any residue.


1.2.1
-----

Memory usage **significantly** decreased when parsing large mzML and pepXML
files.

1.2.0
-----

Added support for Python 3. Python 2.7 is still supported, Python 2.6 is not.

1.1.1
-----

New function called :py:func:`add_modifications()` added in
:py:mod:`pyteomics.mass`. It updates *aa_comp*. Also,
:py:func:`isoforms()` is a new function in :py:mod:`parser` to get all possible
modified sequences of a peptide.

1.1.0
-----

New module added - :py:mod:`pyteomics.mgf`. It is intended for reading and
writing files in Mascot Generic Format.

1.0.2
-----

In :py:mod:`pepxml` module, now all search hits are read from file (not only the
top hit).

API changes:
............

 - :py:func:`pepxml.read`: information specific to search hits is now stored in
   a list under the 'search_hits' key. The list is sorted by hit rank.


1.0.1
-----

Fix compatibility issues in :py:mod:`pepxml` module.

1.0.0
-----

The first public release of Pyteomics.

API changes:
............

 - :py:mod:`achrom`: rename 'length correction factor' to 'length correction
   parameter'. :py:func:`pyteomics.achrom.get_RCs_vary_lcf` was renamed to
   :py:func:`pyteomics.achrom.get_RCs_vary_lcp`, `length_correction_factor`
   keyword argument of achrom.get_RCs() was renamed to `lcp`.

