summarylogtreecommitdiffstats
path: root/CHANGELOG
blob: ae7bcfd51f05141836c5d1c30f31424162032c17 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
3.4.2
-----

 - New module :py:mod:`pyteomics.ms1` for parsing of MS1 files.

 - :py:class:`mass.Composition` constructor now accepts `ion_type` and `charge` parameters.

 - New functions :py:func:`pyteomics.mzid.DataFrame` and :py:func:`pyteomics.mzid.filter_df`.
   Their behavior may be refined later on.

 - Changes in behavior of :py:func:`pyteomics.auxiliary.filter` and :py:func:`pyteomics.auxiliary.qvalues`:

   - both functions now always return DataFrames with :py:class:`pandas.DataFrame` input and `full_output=True`.

   - string values of `key`, `is_decoy` and `pep` are substituted with simple itemgetter functions for
     non-pandas, non-numpy input;

   - additional parameters `score_label`, `decoy_label`, `pep_label`, and `q_label` for output control.

 - Performance optimizations in XML parsing code.

3.4.1
-----

 - Add selenocysteine ("U") and pyrrolysine ("O") to :py:data:`pyteomics.mass.std_aa_mass` and
   :py:data:`pyteomics.mass.std_aa_comp`.

 - An optional parameter `encoding` is now accepted by text file readers (:py:func:`pyteomics.mgf.read`
   and :py:func:`pyteomics.fasta.read`). This can be useful for MGF files with non-ASCII spectrum
   titles or comments.

 - New function :py:func:`pyteomics.mass.mass.isotopologues`.

 - Performance improvements in :py:func:`pyteomics.electrochem.pI`.

 - Fix the issue in :py:mod:`pyteomics.xml` which resulted in very long processing times for indexed XML files
   with a byte ordering mark (BOM).

 - Support all standard and non-standard data array names in :py:mod:`pyteomics.mzml`.

 - Change default value of ``retrieve_refs`` in :py:func:`pyteomics.mzid.read` to :py:const:`True`.

 - Preserve unit information extracted from cvParam tags in PSI XML files.

 - Fix in :py:mod:`pyteomics.mzxml`, other minor fixes.

3.4
---

 - New module :py:mod:`pyteomics.mzxml` for parsing of MzXML files.

 - New parameter `dtype` in :py:func:`pyteomics.mgf.read`, :py:func:`pyteomics.mzml.read`
   and :py:func:`pyteomics.mzxml.read`
   allows changing the dtype of arrays yielded by the parsers.

 - :py:mod:`pyteomics.featurexml` moved into a subpackage :py:mod:`pyteomics.openms`.

 - New module :py:mod:`pyteomics.openms.trafoxml` for OpenMS transformation files.

 - Bugfix in XML indexing code to make it work on Python 3.x versions prior to 3.5.

 - Bugfix in :py:func:`pyteomics.pylab_aux.scatter_trend` (support for lists and other non-ndarrays).

 - Performance improvements in :py:mod:`pyteomics.achrom` calibration functions.

3.3.1
-----

New submodule :py:mod:`pyteomics.featurexml` with a parser for OpenMS **featureXML** files.

3.3
---

 - mzML and mzIdentML parsers can now create an index of element offsets.
   This allows quick random access to elements by unique ID.

 - mzML parsers now come in two flavors: :py:class:`pyteomics.mzml.MzML` and
   :py:class:`pyteomics.mzml.PreIndexedMzML`. The latter uses the byte offsets
   listed at the end of the file.

 - New parameters `convert_arrays` and `read_charges` in :py:func:`mgf.read`
   allow using it without :py:mod:`numpy` and possibly improve performance.
   The default behavior is retained.

 - Performance optimizations in :py:func:`mgf.read` and :py:func:`parser.cleave`.

 - New decoy generation mode called "fused decoy", described in the paper accepted to JASMS.

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

 - :py:func:`pyteomics.parser.cleave` no longer accepts the `labels` argument.
   It is emphasized that the input sequences are expected to be in plain one-letter
   notation, but no checks are performed.

 - :py:func:`DataFrame` functions in :py:mod:`pepxml` and :py:mod:`tandem` now
   extract more protein-related information. The list-like protein-related values
   can be reported as lists or packed into strings, depending on the optional
   paramter `sep`. Some column names have changed as a result.

 - Call signatures of :py:func:`pyteomics.fasta.decoy_sequence` and the functions using it
   are slightly changed. Standard modes are now also exposed as individual functions.

3.2
---

New submodule :py:mod:`pyteomics.mass.unimod` contains rewritten machinery
for handling of Unimod relational databases (contributed by Joshua Klein).
This is a substitution and extension for the old :py:class:`mass.Unimod` class.
:py:mod:`pyteomics.mass.unimod` requires SQLAlchemy.

Other changes:

 - New function :py:func:`pyteomics.auxiliary.linear_regression_perpendicular`
   provides a linear fit minimizing distances from data points to the fit line
   (as opposed to :py:func:`pyteomics.auxiliary.linear_regression`, which
   minimizes vertical distances).

 - Both new and old linear regression functions now accept a single array of shape (N, 2).

 - :py:func:`pyteomics.pylab_aux.scatter_trend` now has an optional parameter
   `regression` which can be a callable performing the regression.
   Also, the regression equation is now the label of the regression line, not
   the scatter plot.

 - Another two new parameters for :py:func:`pyteomics.pylab_aux.scatter_trend`
   are `sigma_kwargs` and `sigma_values`.

 - :py:mod:`pyteomics.pylab_aux` functions :py:func:`plot_line` and
   :py:func:`scatter_trend` now return the objects they create.

 - Writer functions (:py:func:`pyteomics.mgf.write`, :py:func:`pyteomics.fasta.write`,
   :py:func:`pyteomics.fasta.write_decoy_db`) now accept a `file_mode` argument that
   overrides the mode in which the file is opened.

 - In :py:func:`pyteomics.mgf.write` one can now override the format spec for fragment m/z,
   intensity and charge values using the optinal `fragment_format` argument. Key order and
   key-value parameter formatters are now also handled via optional arguments.

 - :py:func:`pyteomics.fasta.decoy_db` now supports `ignore_comments` and `parser` arguments.


3.1.1
-----

 - Bugfix in :py:mod:`pyteomics.auxiliary`.

 - New parameter `show_legend` in :py:func:`pyteomics.pylab_aux.scatter_trend`.

 - Performance improvements in :py:mod:`pyteomics.parser`.

3.1
---

This release offers integration with the great :py:mod:`pandas` library.
Working with :py:func:`qvalues` and :py:func:`!filter` functions
is now much easier if you have your PSMs in a :py:class:`DataFrame`.
Many search engines use CSV as their output format, allowing direct
creation of :py:class:`DataFrame` objects. New functions
:py:func:`pyteomics.tandem.DataFrame` and :py:func:`pyteomics.pepxml.DataFrame`
faciliatate creation of DataFrames from corresponding formats.

Also, :py:func:`qvalues`, :py:func:`!filter` and :py:func:`fdr` functions can now use
posterior error probabilities (PEPs) instead of using decoys for q-value calculation.

 - In :py:func:`qvalues` and :py:func:`!filter` functions,
   `key` and `is_decoy` can now be array-like objects or strings
   (as well as functions and iterators).
   If a string is given, it is used as a field name in the PSM array
   or :py:class:`DataFrame`. :py:func:`fdr` functions also support strings
   and iterables as arguments.

 - New parameter `pep` in :py:func:`qvalues`, :py:func:`!filter` and :py:func:`fdr` functions.
   It can be callable, array-like, or iterator. Conflicts with decoy-related
   parameters. Compatible with `key`, but makes it optional.

 - Fixed the behavior of :py:func:`filter.chain` functions. They now treat
   the `full_output` argument the same way as :py:func:`!filter` functions.

 - Fixed the issue that caused exceptions when calling :py:func:`fasta.decoy_db`
   and :py:func:`fasta.write_decoy_db` with explicitly given `mode` (signature
   for creation of :py:class:`pyteomics.auxiliary.FileReader` objects slightly changed).

 - Pyteomics now uses `setuptools` and is a namespace package.

 - Minor fixes.


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

- Default value of `remove_decoy` in :py:func:`qvalues` is now :py:const:`False`.

3.0.1
-----

 - Added `legend_kwargs` as a keyword argument to
   :py:func:`pyteomics.pylab_aux.scatter_trend`.

 - Minor fixes.

3.0.0
-----

 - XML parsers are now implemented as objects, each format has its own class.
   Those classes can be instantiated using the same arguments as :py:func:`read`
   functions accepted, and support direct iteration and the ``with`` syntax.
   The :py:func:`read` functions are now simple aliases to the corresponding
   constructors.

 - As a result, functions :py:func:`iterfind`, :py:func:`version_info` and
   :py:func:`get_by_id` functions are now deprecated in favor of methods
   :py:meth:`iterfind` and :py:meth:`get_by_id` and attribute
   :py:attr:`version_info` of corresponding instances.

 - In :py:func:`pyteomics.mgf.write`, the order of keys and the format of values
   are now controlled via module-level variables.

 - In :py:mod:`pyteomics.electrochem`, correction for pK of terminal groups
   depending on the terminal residue is implemented; example set of pK and
   corrected pK added.

 - Imports of external dependencies are delayed where possible, so that
   unnecessary :py:exc:`ImportErrors` do not occur.

 - :py:func:`local_fdr` renamed to :py:func:`qvalues` in :py:mod:`pepxml`,
   :py:mod:`mzid`, :py:mod:`tandem` and :py:mod:`auxiliary`.
   :py:func:`local_fdr` did not reflect the semantics of the function.
   The algorithm has been also corrected so that the array of q-values
   is always sorted (as it should be by definition).

 - :py:func:`qvalues` now also accepts a parameter `full_output` which keeps the
   PSMs alongside their scores and associated q-values.

 - All :py:func:`fdr`, :py:func:`qvalues`, and :py:func:`!filter` functions
   now accept a new parameter `correction`. It is used for more accurate
   estimation of the number of false positives using TDA (`paper with explanation
   <http://dx.doi.org/10.1021/acs.jproteome.6b00144>`_).

 - :py:func:`!filter` functions now support both iterator protocol and context
   manager protocol. They now also accept the `full_output` parameter, which has
   the following meaning: if :py:const:`True` (default), then an array of PSMs
   is directly returned by the function. Otherwise, an iterator is returned, as
   before. The array takes some memory, but this way is usually around 2x faster.

 - New function :py:func:`pyteomics.pylab_aux.plot_qvalue_curve`.

 - :py:class:`pyteomics.mass.Composition` objects now have a :py:meth:`mass`
   method (equivalent to :py:func:`pyteomics.mass.calculate_mass`.

 - Also, :py:class:`Composition` and objects returned by
   :py:func:`pyteomics.parser.amino_acid_composition` now inherit from
   :py:class:`collections.defaultdict` **and** :py:class:`collections.Counter`.

 - Decoy-related functions in :py:mod:`pyteomics.fasta` now accept a new parameter
   `keep_nterm` that preserves the N-terminal residue in the generated decoy
   sequences.

 - Minor fixes.

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

 - In :py:func:`pyteomics.pylab_aux.scatter_trend`, keyword arguments for
   :py:func:`pylab.scatter` and :py:func:`pylab.plot` are now accepted as dicts
   `scatter_kwargs` and `plot_kwargs`. Keyword argument `alpha` is now not
   accepted and should be put in the appropriate dict.
 - In :py:func:`pyteomics.pylab_aux.plot_function_3d` and
   :py:func:`pyteomics.pylab_aux.plot_function_contour`, arbitrary kwargs can
   now also be passed to the plotting function.
 - :py:func:`!filter` functions do not support context manager protocol by
   default. To keep using them as iterators / context managers, specify
   ``full_output=False`` (see above for details).

2.5.5
-----

Fix for a memory leak in :py:func:`pyteomics.mzid.get_by_id`, which affects
:py:func:`pyteomics.mzid.read` with ``retrieve_refs=True``.

2.5.4
-----

 - New functions :py:func:`local_fdr` in :py:mod:`pepxml`, :py:mod:`mzid`, and
   :py:mod:`tandem`. The function returns a NumPy array with PSM scores and
   corresponding values of local FDR.

 - New parameter `iterative` in :py:func:`read` functions of XML parsing
   modules. Parsing of mzIdentML files with ``retrieve_refs=True`` got
   significantly faster.

2.5.3
-----

 - Universally applicable modifications are now allowed in
   :py:func:`pyteomics.parser.isoforms`.
 - It is now also possible to specify non-terminal modifications which are
   only applicable to terminal residues.
 - Fix in :py:func:`pyteomics.parser.parse`: if the `labels` argument is
   provided, it needs to contain standard terminal groups if they are present
   in the sequence or if `show_unmodified_termini` is set to :py:const:`True`.
 - :py:class:`pyteomics.mass.Composition` instances are now pickleable.
 - Performance improvements.

2.5.2
-----

 - New parameter `reverse` in all :py:func:`!filter` functions.
 - New function :py:func:`pyteomics.mass.fast_mass2`, which is analogous to
   :py:func:`pyteomicsmass.fast_mass`, but supports full *modX* notation and
   is several times slower.
 - Fix in :py:func:`pyteomics.pepxml.read` for compatibility with files
   produced with Mascot2XML utility.
 - Unknown labels now allowed in :py:mod:`pyteomics.electrochem` and
   :py:mod:`pyteomics.achrom` functions in accordance with new general policy.

2.5.1
-----

 - Bugfixes in :py:func:`pyteomics.parser.isoforms`:

   - handling of the `labels` argument is now in accordance with new policy
   - solved memory problems when using `max_mods`

 - :py:func:`pyteomics.parser.cleave` does not require a valid *modX* sequence
   by default.

2.5.0
-----

 - :py:func:`pyteomics.parser.amino_acid_composition` now accepts "split"
   parsed sequences.

 - Cleavage rules in :py:data:`pyteomics.parser.expasy_rules` updated.

 - Helper function :py:func:`pyteomics.parser.num_sites` counts the number
   of cleavage sites in a sequence.

 - Helper function :py:func:`pyteomics.parser.match_modX` does essentially
   the same as :py:func:`pyteomics.parser.is_modX`, but returns a
   :py:class:`re.match` object or :py:const:`None` instead of a :py:class:`bool`.

 - Bugfix in :py:func:`pyteomics.auxiliary.filter`, which didn't work correctly
   with iterators.

 - Added a new parameter ``max_mods`` in :py:func:`pyteomics.parser.isoforms`.

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

 - The boolean ``overlap`` parameter in :py:func:`pyteomics.parser.cleave` is
   replaced with an integer ``min_length``. Since ``min_length`` uses
   :py:func:`pyteomics.parser.length`, the ``labels`` keyword argument is now
   accepted by :py:func:`cleave` and :py:func:`num_sites`, if needed. With
   carefully designed cleavage rules, all cleavage functions work
   with *modX* sequences.

 - The ``labels`` argument in :py:func:`pyteomics.parser.parse` and related
   functions has changed its meaning. :py:func:`parse` won't raise an exception
   for non-standard labels in sequences if the ``labels`` keyword argument is
   not given.

 - The *modX* notation specification is now more strict to avoid ambiguity:
   only zero or two terminal groups can be present in a *modX* sequence.
   Sequences with one terminal group specified will be supported where possible,
   but be advised that sequences such as "H-OH" are intrinsically ambiguous.

2.4.3
-----

 - Added the ``ratio`` keyword argument for FDR calculation.

 - Minor changes in :py:func:`iterfind` functions of file parsers.

 - Bugfix in :py:func:`pyteomics.mgf.write` (duplication of pepmass key).

 - Removed non-functional parameter ``read_schema`` for
   :py:func:`pyteomics.tandem.read`.

2.4.2
-----

 - Bugfix in :py:func:`pyteomics.mass.most_probable_isotopic_composition`.
   The bug manifested itself after version **2.4.0**, when
   :py:data:`pyteomics.mass.nist_mass` was expanded. Also, the format of the
   returned value is now in accordance with the documentation.

2.4.1
-----

 - New function :py:func:`pyteomics.auxiliary.filter` for filtering lists
   of PSMs not coming directly from files in supported formats.

 - Also, a format-agnostic helper function :py:func:`pyteomics.auxiliary.fdr`.

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:`pyteomics.tandem`: modification info is now fully extracted.

 - :py:func:`pyteomics.mass.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:`pyteomics.pepxml`. pepXML files generated by TPP are now
   processed without errors.


2.1.5
-----

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

 - Fix in :py:mod:`pyteomics.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:`pyteomics.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:`pyteomics.mass.Unimod`. The interface is
   experimental and may change.

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

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

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

2.0.2
-----

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

2.0.1
-----

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

 - :py:func:`pyteomics.parser.peptide_length` is renamed to
   :py:func:`pyteomics.parser.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:`pyteomics.fasta`.

1.2.4
-----

 - Changes in :py:mod:`pyteomics.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:`pyteomics.parser.isoforms` now allows terminal modifications.

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

 - New function :py:func:`pyteomics.parser.tostring` converts parsed sequences
   to strings.

 - Helper function :py:func:`pyteomics.parser.is_modX` added to check *modX* labels.

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

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

1.2.2
-----

 - Bugfix in :py:mod:`pyteomics.pepxml`: modification info is now extracted.
 - New optional bool argument 'split' in :py:func:`pyteomics.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 modifications 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:`pyteomics.parser.isoforms` is a new function 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:`pyteomics.pepxml` module, now all search hits are read from file
   (not only the top hit).

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

 - :py:func:`pyteomics.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:`pyteomics.pepxml` module.

1.0.0
-----

 - The first public release of Pyteomics.

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

 - :py:mod:`pyteomics.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
     :py:func:`pyteomics.achrom.get_RCs` was renamed to `lcp`.