Pyteomics documentation v4.7.1

pyteomics.achrom

Contents

Source code for pyteomics.achrom

"""
achrom - additive model of polypeptide chromatography
=====================================================

Summary
-------

The additive model of polypeptide chromatography, or achrom, is the most basic
model for peptide retention time prediction. The main equation behind
achrom has the following form:

.. math::

    RT = (1 + m\\,ln N) \\sum_{i=1}^{i=N}{RC_i n_i} + RT_0


Here, :math:`RC_i` is the retention coefficient of the amino acid
residues of the i-th type, :math:`n_i` corresponds to the number of amino acid
residues of type :math:`i` in the peptide sequence, N is the total number of
different *types* of amino acid residues present,
and :math:`RT_0` is a constant retention time shift.

In order to use achrom, one needs to find the retention
coeffcients, using experimentally determined retention times for a training set
of peptide retention times, i.e. to *calibrate* the model.

Calibration
-----------

  :py:func:`get_RCs` - find a set of retention coefficients using a
  given set of peptides with known retention times and a fixed value of
  length correction parameter.

  :py:func:`get_RCs_vary_lcp` - find the best length correction parameter
  and a set of retention coefficients for a given peptide sample.

Retention time calculation
--------------------------

  :py:func:`calculate_RT` - calculate the retention time of a peptide
  using a given set of retention coefficients.

Data
----

  :py:data:`RCs_guo_ph2_0` - a set of retention coefficients (RCs)
  from [#Guo1]_. Conditions: Synchropak RP-P C18 column (250 x 4.1 mm
  I.D.), gradient (A = 0.1% aq. TFA, pH 2.0; B = 0.1% TFA in acetonitrile) at
  1% B/min, flow rate 1 ml/min, 26 centigrades.

  :py:data:`RCs_guo_ph7_0` - a set of retention coefficients (RCs)
  from [#Guo1]_. Conditions: Synchropak RP-P C18 column (250 x 4.1 mm
  I.D.), gradient (A = aq. 10 mM (NH4)2HPO4 - 0.1 M NaClO4, pH 7.0; B
  = 0.1 M NaClO4 in 60% aq. acetonitrile) at 1.67% B/min, flow rate 1
  ml/min, 26 centigrades.

  :py:data:`RCs_meek_ph2_1` - a set of RCs from [#Meek]_. Conditions: Bio-Rad
  "ODS" column, gradient (A = 0.1 M NaClO4, 0.1% phosphoric acid in
  water; B = 0.1 M NaClO4, 0.1% phosphoric acid in 60%
  aq. acetonitrile) at 1.25% B/min, room temperature.

  :py:data:`RCs_meek_ph7_4` - a set of RCs from [#Meek]_. Conditions: Bio-Rad
  "ODS" column, gradient (A = 0.1 M NaClO4, 5 mM phosphate buffer in
  water; B = 0.1 M NaClO4, 5 mM phosphate buffer in 60%
  aq. acetonitrile) at 1.25% B/min, room temperature.

  :py:data:`RCs_browne_tfa` - a set of RCs found in
  [#Browne]_. Conditions: Waters mjuBondapak C18 column, gradient (A =
  0.1% aq. TFA, B = 0.1% TFA in acetonitrile) at 0.33% B/min, flow
  rate 1.5 ml/min.

  :py:data:`RCs_browne_hfba` - a set of RCs found in
  [#Browne]_. Conditions: Waters mjuBondapak C18 column, gradient (A =
  0.13% aq. HFBA, B = 0.13% HFBA in acetonitrile) at 0.33% B/min, flow
  rate 1.5 ml/min.

  :py:data:`RCs_palmblad` - a set of RCs from
  [#Palmblad]_. Conditions: a fused silica column (80-100 x 0.200 mm
  I.D.) packed in-house with C18 ODS-AQ; solvent A = 0.5% aq. HAc,
  B = 0.5% HAc in acetonitrile.

  :py:data:`RCs_yoshida` - a set of RCs for normal phase chromatography
  from [#Yoshida]_. Conditions:
  TSK gel Amide-80 column (250 x 4.6 mm I.D.), gradient (A = 0.1% TFA
  in ACN-water (90:10); B = 0.1% TFA in ACN-water (55:45)) at 0.6%
  water/min, flow rate 1.0 ml/min, 40 centigrades.

  :py:data:`RCs_yoshida_lc` - a set of length-corrected RCs for normal phase
  chromatography. The set was calculated in [#Moskovets]_ for the data from
  [#Yoshida]_.
  Conditions:
  TSK gel Amide-80 column (250 x 4.6 mm I.D.), gradient (A = 0.1% TFA
  in ACN-water (90:10); B = 0.1% TFA in ACN-water (55:45)) at 0.6%
  water/min, flow rate 1.0 ml/min, 40 centigrades.

  :py:data:`RCs_zubarev` - a set of length-corrected RCs calculated
  on a dataset used in [#Goloborodko]_.
  Conditions: Reprosil-Pur C18-AQ column (150 x 0.075 mm I.D.), gradient (A =
  0.5% AA in water; B = 0.5% AA in ACN-water (90:10)) at
  0.5% water/min, flow rate 200.0 nl/min, room temperature.

  :py:data:`RCs_gilar_atlantis_ph3_0` - a set of retention coefficients obtained
  in [#Gilar]_.
  Conditions: Atlantis HILIC silica column, (150 x 2.1 mm I.D.), 3 um, 100 A,
  gradient (A = water, B = ACN, C = 200 mM ammonium formate):
  0 min, 5% A, 90% B, 5% C; 62.5 min, 55% A, 40% B, 5% C
  at 0.2 ml/min, temperature 40 C, pH 3.0

  :py:data:`RCs_gilar_atlantis_ph4_5` - a set of retention coefficients obtained
  in [#Gilar]_.
  Conditions: Atlantis HILIC silica column, (150 x 2.1 mm I.D.), 3 um, 100 A,
  gradient (A = water, B = ACN, C = 200 mM ammonium formate):
  0 min, 5% A, 90% B, 5% C; 62.5 min, 55% A, 40% B, 5% C
  at 0.2 ml/min, temperature 40 C, pH 4.5

  :py:data:`RCs_gilar_atlantis_ph10_0` - a set of retention coefficients
  obtained in [#Gilar]_.
  Conditions: Atlantis HILIC silica column, (150 x 2.1 mm I.D.), 3 um, 100 A,
  gradient (A = water, B = ACN, C = 200 mM ammonium formate):
  0 min, 5% A, 90% B, 5% C; 62.5 min, 55% A, 40% B, 5% C
  at 0.2 ml/min, temperature 40 C, pH 10.0

  :py:data:`RCs_gilar_beh` - a set of retention coefficients obtained in
  [#Gilar]_.
  Conditions: ACQUITY UPLC BEH HILIC column (150 x 2.1 mm I.D.), 1.7 um, 130 A,
  Mobile phase A: 10 mM ammonium formate buffer, pH 4.5 prepared by
  titrating 10 mM solution of FA with ammonium hydroxide. Mobile phase B:
  90% ACN, 10% mobile phase A (v:v).
  Gradient: 90-60% B in 50 min.

  :py:data:`RCs_gilar_beh_amide` - a set of retention coefficients obtained in
  [#Gilar]_.
  Conditions: ACQUITY UPLC BEH glycan column (150 x 2.1 mm I.D.), 1.7 um, 130 A,
  Mobile phase A: 10 mM ammonium formate buffer, pH 4.5 prepared by
  titrating 10 mM solution of FA with ammonium hydroxide. Mobile phase B:
  90% ACN, 10% mobile phase A (v:v).
  Gradient: 90-60% B in 50 min.

  :py:data:`RCs_gilar_rp` - a set of retention coefficients obtained in
  [#Gilar]_.
  Conditions: ACQUITY UPLC BEH C18 column (100 mm x 2.1 mm I.D.), 1.7 um, 130 A.
  Mobile phase A: 0.02% TFA in water, mobile phase B: 0.018% TFA in ACN.
  Gradient: 0 to 50% B in 50 min, flow rate 0.2 ml/min, temperature 40 C.,
  pH 2.6.

  :py:data:`RCs_krokhin_100A_fa` - a set of retention coefficients obtained in
  [#Krokhin]_.
  Conditions: 300 um x 150mm PepMap100 (Dionex, 0.1% FA), packed with
  5-um Luna C18(2) (Phenomenex, Torrance, CA), pH=2.0.
  Both eluents A (2% ACN in water) and B (98% ACN) contained
  0.1% FA as ion-pairing modifier. 0.33% ACN/min
  linear gradient (0-30% B).

  :py:data:`RCs_krokhin_100A_tfa` - a set of retention coefficients obtained in
  [#Krokhin]_.
  Conditions: 300 um x 150mm PepMap100 (Dionex, 0.1% TFA), packed with
  5-um Luna C18(2) (Phenomenex, Torrance, CA), pH=2.0.
  Both eluents A (2% ACN in water) and B (98% ACN) contained
  0.1% TFA as ion-pairing modifier. 0.33% ACN/min
  linear gradient (0-30% B).

Theory
------

The additive model of polypeptide chromatography, or the model of
retention coefficients was the earliest attempt to describe the dependence of
retention time of a polypeptide in liquid chromatography on its sequence
[#Meek]_, [#Guo1]_. In this model, each amino acid is assigned a number, or
a *retention coefficient* (RC) describing its retention properties. The
retention time (RT) during a gradient elution is then calculated as:

.. math::

    RT = \\sum_{i=1}^{i=N}{RC_i \\cdot n_i} + RT_0,

which is the sum of retention coefficients of all amino acid residues in a
polypeptide. This equation can also be expressed in terms of linear
algebra:

.. math::

    RT = \\bar{aa} \\cdot \\bar{RC} + RT_0,

where :math:`\\bar{aa}` is a vector of amino acid composition,
i.e. :math:`\\bar{aa}_i` is the number of amino acid residues of i-th
type in a polypeptide; :math:`\\bar{RC}` is a vector of respective
retention coefficients.

In this formulation, it is clear that additive model gives the same results for
any two peptides with different sequences but the same amino acid
composition. In other words, **additive model is not sequence-specific**.

The additive model has two advantages over all other models of chromatography
- it is easy to understand and use. The rule behind the additive model is as
simple as it could be: **each amino acid residue shifts retention time by a
fixed value, depending only on its type**. This rule allows geometrical
interpretation. Each peptide may be represented by a point in 21-dimensional
space, with first 20 coordinates equal to the amounts of corresponding amino
acid residues in the peptide and 21-st coordinate equal to RT. The additive
model assumes that a line may be drawn through these points. Of course, this
assumption is valid only partially, and most points would not lie on the
line. But the line would describe the main trend and could be used to estimate
retention time for peptides with known amino acid composition.

This best fit line is described by retention coefficients and :math:`RT_0`.
The procedure of finding these coefficients is called *calibration*. There is
`an analytical solution to calibration of linear models
<http://en.wikipedia.org/wiki/Linear_regression>`_, which makes them
especially useful in real applications.

Several attempts were made in order to improve the accuracy of prediction by
the additive model (for a review of the field we suggest to read [#Baczek]_
and [#Babushok]_). The two implemented in this module are the logarithmic
length correction term described in [#MantLogLen]_ and additional sets of
retention coefficients for terminal amino acid residues [#Tripet]_.

Logarithmic length correction
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This enhancement was firstly described in [#MantLogLen]_. Briefly, it was
found that the following equation better describes the dependence of RT on the
peptide sequence:

.. math::

    RT = \\sum_{i=1}^{i=N}{RC_i} + m\\,ln N \\sum_{i=1}^{i=N}{RC_i} + RT_0

We would call the second term :math:`m\\,ln N \\sum_{i=1}^{i=N}{RC_i}` *the
length correction term* and m - *the length correction parameter*. The
simplified and vectorized form of this equation would be:

.. math::

    RT = (1 + m\\,ln N) \\, \\bar{RC} \\cdot \\bar{aa} + RT_0

This equation may be reduced to a linear form and solved by the standard
methods.

Terminal retention coefficients
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Another significant improvement may be obtained through introduction of
separate sets of retention coefficients for terminal amino acid residues
[#Tripet]_.

References
----------

.. [#Meek] Meek, J. L. `Prediction of peptide retention times in high-pressure
   liquid chromatography on the basis of amino acid composition.
   <http://www.ncbi.nlm.nih.gov/pubmed/6929513>`_
   PNAS, 1980, 77 (3), 1632-1636.

.. [#Guo1] Guo, D.; Mant, C. T.; Taneja, A. K.; Parker, J. M. R.; Hodges,
   R. S.  `Prediction of peptide retention times in reversed-phase
   high-performance liquid chromatography I. Determination of retention
   coefficients of amino acid residues of model synthetic peptides.
   <http://dx.doi.org/10.1016/0021-9673(86)80102-9>`_
   Journal of Chromatography A, 1986, 359, 499-518.

.. [#Baczek] Baczek, T.; Kaliszan, R. `Predictions of peptides' retention times
   in reversed-phase liquid chromatography as a new supportive tool to improve
   protein identification in proteomics.
   <http://dx.doi.org/10.1002/pmic.200800544>`_
   Proteomics, 2009, 9 (4), 835-47.

.. [#Babushok] Babushok, V. I.; Zenkevich, I. G. `Retention Characteristics of
   Peptides in RP-LC: Peptide Retention Prediction.
   <http://dx.doi.org/10.1365/s10337-010-1721-8>`_
   Chromatographia, 2010, 72 (9-10), 781-797.

.. [#MantLogLen] Mant, C. T.; Zhou, N. E.; Hodges, R. S. `Correlation of
   protein retention times in reversed-phase chromatography with polypeptide
   chain length and hydrophobicity.
   <http://dx.doi.org/10.1016/S0021-9673(01)93882-8>`_
   Journal of Chromatography A, 1989, 476, 363-375.

.. [#Tripet] Tripet, B.; Cepeniene, D.; Kovacs, J. M.; Mant, C. T.; Krokhin,
   O. V.; Hodges, R. S. `Requirements for prediction of peptide retention time
   in reversed-phase high-performance liquid chromatography:
   hydrophilicity/hydrophobicity of side-chains at the N- and C-termini of
   peptides are dramatically affected by the end-groups and location.
   <http://dx.doi.org/10.1016/j.chroma.2006.12.024>`_
   Journal of chromatography A, 2007, 1141 (2), 212-25.

.. [#Browne] Browne, C. A.; Bennett, H. P. J.; Solomon, S. `The
   isolation of peptides by high-performance liquid chromatography
   using predicted elution positions
   <http://www.sciencedirect.com/science/article/pii/000326978290238X>`_.
   Analytical Biochemistry, 1982, 124 (1), 201-208.

.. [#Palmblad] Palmblad, M.; Ramstrom, M.; Markides, K. E.; Hakansson,
   P.; Bergquist, J. `Prediction of Chromatographic Retention and
   Protein Identification in Liquid Chromatography/Mass
   Spectrometry
   <http://pubs.acs.org/doi/abs/10.1021/ac0256890>`_.
   Analytical Chemistry, 2002, 74 (22), 5826-5830.

.. [#Yoshida] Yoshida, T. Calculation of peptide retention
   coefficients in normal-phase liquid chromatography. Journal of
   Chromatography A, 1998, 808 (1-2), 105-112.

.. [#Moskovets] Moskovets, E.; Goloborodko A. A.; Gorshkov A. V.; Gorshkov M.V.
   `Limitation of predictive 2-D liquid chromatography in reducing the database
   search space in shotgun proteomics: In silico studies.
   <http://dx.doi.org/10.1002/jssc.201100798>`_
   Journal of Separation Science, 2012, 35 (14), 1771-1778.

.. [#Goloborodko] Goloborodko A. A.; Mayerhofer C.; Zubarev A. R.;
   Tarasova I. A.; Gorshkov A. V.; Zubarev, R. A.; Gorshkov, M. V.
   `Empirical approach to false discovery rate
   estimation in shotgun proteomics. <http://dx.doi.org/10.1002/rcm.4417>`_
   Rapid communications in mass spectrometry, 2010, 24(4), 454-62.

.. [#Gilar] Gilar, M., & Jaworski, A. (2011). `Retention behavior of peptides in
    hydrophilic-interaction chromatography.
    <http://dx.doi.org/10.1016/j.chroma.2011.04.005>`_
    Journal of chromatography A, 1218(49), 8890-6.

.. [#Krokhin] Dwivedi, R. C.; Spicer, V.; Harder, M.; Antonovici, M.; Ens, W.;
    Standing, K. G.; Wilkins, J. A.; Krokhin, O. V. (2008). `Practical
    implementation of 2D HPLC scheme with accurate peptide retention prediction
    in both dimensions for high-throughput bottom-up proteomics
    <http://pubs.acs.org/doi/abs/10.1021/ac800984n>`_.
    Analytical Chemistry, 80(18), 7036-42.

Dependencies
------------

This module requires :py:mod:`numpy` and, optionally, :py:mod:`scikit-learn`
(for MAE regression).

--------------------------------------------------------------------------------
"""

#   Copyright 2012 Anton Goloborodko, Lev Levitsky
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

import numpy as np
from .auxiliary import linear_regression, PyteomicsError
try:
    from sklearn.linear_model import QuantileRegressor
except ImportError:
    QuantileRegressor = None

from . import parser

[docs] def get_RCs(sequences, RTs, lcp=-0.21, term_aa=False, metric='mse', **kwargs): """Calculate the retention coefficients of amino acids using retention times of a peptide sample and a fixed value of length correction parameter. Parameters ---------- sequences : list of str List of peptide sequences. RTs: list of float List of corresponding retention times. lcp : float, optional A multiplier before ln(L) term in the equation for the retention time of a peptide. Set to -0.21 by default. term_aa : bool, optional If :py:const:`True`, terminal amino acids are treated as being modified with 'ntermX'/'ctermX' modifications. :py:const:`False` by default. metric : str, optional Metric for the regression problem. Set to "mse" (mean squared error) by default. Alternative: "mae" (mean absolute error), which uses quantile regression. .. note :: `"mae"` requires :py:mod:`scikit-learn` for `quantile regression <https://scikit-learn.org/stable/auto_examples/linear_model/plot_quantile_regression.html>`_. labels : list of str, optional List of all possible amino acids and terminal groups If not given, any modX labels are allowed. Returns ------- RC_dict : dict Dictionary with the calculated retention coefficients. - RC_dict['aa'] -- amino acid retention coefficients. - RC_dict['const'] -- constant retention time shift. - RC_dict['lcp'] -- length correction parameter. Examples -------- >>> RCs = get_RCs(['A','AA'], [1.0, 2.0], 0.0, labels=['A']) >>> abs(RCs['aa']['A'] - 1) < 1e-6 and abs(RCs['const']) < 1e-6 True >>> RCs = get_RCs(['A','AA','B'], [1.0, 2.0, 2.0], 0.0, labels=['A','B']) >>> abs(RCs['aa']['A'] - 1) + abs(RCs['aa']['B'] - 2) + \ abs(RCs['const']) < 1e-6 True """ labels = kwargs.get('labels') # Make a list of all amino acids present in the sample. peptide_dicts = [ parser.amino_acid_composition(peptide, False, term_aa, allow_unknown_modifications=True, labels=labels) if not isinstance(peptide, dict) else peptide for peptide in sequences] detected_amino_acids = {aa for peptide_dict in peptide_dicts for aa in peptide_dict} # Determine retention coefficients using multidimensional linear # regression. composition_array = [] for pdict in peptide_dicts: loglen = np.log(parser.length(pdict)) composition_array.append([pdict.get(aa, 0.) * (1. + lcp * loglen) for aa in detected_amino_acids] + [1.]) # Add normalizing conditions for terminal retention coefficients. The # condition we are using here is quite arbitrary. It implies that the sum # of N- or C-terminal RCs minus the sum of corresponding internal RCs must # be equal to zero. if term_aa: for term_label in ['nterm', 'cterm']: normalizing_peptide = [] for aa in detected_amino_acids: if aa.startswith(term_label): normalizing_peptide.append(1.0) elif (term_label+aa) in detected_amino_acids: normalizing_peptide.append(-1.0) else: normalizing_peptide.append(0.0) normalizing_peptide.append(0.0) composition_array.append(normalizing_peptide) RTs.append(0.0) if metric == 'mse': # # Use least square linear regression. RCs, _, _, _ = np.linalg.lstsq(np.array(composition_array), np.array(RTs), rcond=None) elif metric == 'mae': if QuantileRegressor is None: raise PyteomicsError("`metric='mae'` requires scikit-learn.") # Use Quantile regression. QR = QuantileRegressor(fit_intercept=False, alpha=0, solver='highs') QR.fit(np.array(composition_array), np.array(RTs)) RCs = QR.coef_ else: raise PyteomicsError('Invalid metric "{}". Must be "mse" or "mae".'.format(metric)) # Remove normalizing elements from the RTs vector. if term_aa: for term_label in ['nterm', 'cterm']: RTs.pop() # Form output. RC_dict = {} RC_dict['aa'] = dict( zip(list(detected_amino_acids), RCs[:len(detected_amino_acids)])) RC_dict['aa'][parser.std_nterm] = 0.0 RC_dict['aa'][parser.std_cterm] = 0.0 RC_dict['const'] = RCs[len(detected_amino_acids)] RC_dict['lcp'] = lcp # Find remaining terminal RCs. if term_aa: for term_label in ['nterm', 'cterm']: # Check if there are terminal RCs remaining undefined. undefined_term_RCs = [aa for aa in RC_dict['aa'] if aa[1:5] != 'term' and term_label + aa not in RC_dict['aa']] if not undefined_term_RCs: continue # Find a linear relationship between internal and terminal RCs. defined_term_RCs = [aa for aa in RC_dict['aa'] if aa[1:5] != 'term' and term_label + aa in RC_dict['aa']] a, b, r, stderr = linear_regression( [RC_dict['aa'][aa] for aa in defined_term_RCs], [RC_dict['aa'][term_label+aa] for aa in defined_term_RCs]) # Define missing terminal RCs using this linear equation. for aa in undefined_term_RCs: RC_dict['aa'][term_label + aa] = a * RC_dict['aa'][aa] + b return RC_dict
[docs] def get_RCs_vary_lcp(sequences, RTs, term_aa=False, lcp_range=(-1.0, 1.0), metric='mse', **kwargs): """Find the best combination of a length correction parameter and retention coefficients for a given peptide sample. Parameters ---------- sequences : list of str List of peptide sequences. RTs : list of float List of corresponding retention times. term_aa : bool, optional If True, terminal amino acids are treated as being modified with 'ntermX'/'ctermX' modifications. False by default. metric : str, optional Metric for the regression problem. Set to "mse" (mean squared error) by default. Alternative: "mae" (mean absolute error). .. note :: `"mae"` requires :py:mod:`scikit-learn` for `quantile regression <https://scikit-learn.org/stable/auto_examples/linear_model/plot_quantile_regression.html>`_. lcp_range : 2-tuple of float, optional Range of possible values of the length correction parameter. labels : list of str, optional List of labels for all possible amino acids and terminal groups If not given, any modX labels are allowed. lcp_accuracy : float, optional The accuracy of the length correction parameter calculation. Returns ------- RC_dict : dict Dictionary with the calculated retention coefficients. - RC_dict['aa'] -- amino acid retention coefficients. - RC_dict['const'] -- constant retention time shift. - RC_dict['lcp'] -- length correction parameter. Examples -------- >>> RCs = get_RCs_vary_lcp(['A', 'AA', 'AAA'], \ [1.0, 2.0, 3.0], \ labels=['A']) >>> abs(RCs['aa']['A'] - 1) + abs(RCs['lcp']) + abs(RCs['const']) < 1e-6 True """ labels = kwargs.get('labels') best_r = -1.1 best_RC_dict = {} lcp_accuracy = kwargs.get('lcp_accuracy', 0.1) min_lcp = lcp_range[0] max_lcp = lcp_range[1] step = (max_lcp - min_lcp) / 10.0 peptide_dicts = [ parser.amino_acid_composition(peptide, False, term_aa, allow_unknown_modifications=True, labels=labels) if not isinstance(peptide, dict) else peptide for peptide in sequences] while step > lcp_accuracy: lcp_grid = np.arange(min_lcp, max_lcp, (max_lcp - min_lcp) / 10.0) for lcp in lcp_grid: RC_dict = get_RCs(peptide_dicts, RTs, lcp, term_aa, labels=labels, metric=metric) regression_coeffs = linear_regression( RTs, [calculate_RT(peptide, RC_dict) for peptide in peptide_dicts]) if regression_coeffs[2] > best_r: best_r = regression_coeffs[2] best_RC_dict = dict(RC_dict) min_lcp = best_RC_dict['lcp'] - step max_lcp = best_RC_dict['lcp'] + step step = (max_lcp - min_lcp) / 10.0 return best_RC_dict
[docs] def calculate_RT(peptide, RC_dict, raise_no_mod=True): """Calculate the retention time of a peptide using a given set of retention coefficients. Parameters ---------- peptide : str or dict A peptide sequence or amino acid composition. RC_dict : dict A set of retention coefficients, length correction parameter and a fixed retention time shift. Keys are: 'aa', 'lcp' and 'const'. raise_no_mod : bool, optional If :py:const:`True` then an exception is raised when a modified amino acid from `peptides` is not found in `RC_dict`. If :py:const:`False`, then the retention coefficient for the non-modified amino acid residue is used instead. :py:const:`True` by default. Returns ------- RT : float Calculated retention time. Examples -------- >>> RT = calculate_RT('AA', {'aa': {'A': 1.1}, 'lcp':0.0, 'const': 0.1}) >>> abs(RT - 2.3) < 1e-6 # Float comparison True >>> RT = calculate_RT('AAA', {'aa': {'ntermA': 1.0, 'A': 1.1, 'ctermA': 1.2},\ 'lcp': 0.0, 'const':0.1}) >>> abs(RT - 3.4) < 1e-6 # Float comparison True >>> RT = calculate_RT({'A': 3}, {'aa': {'ntermA': 1.0, 'A': 1.1, 'ctermA': 1.2},\ 'lcp': 0.0, 'const':0.1}) >>> abs(RT - 3.4) < 1e-6 # Float comparison True """ amino_acids = [aa for aa in RC_dict['aa'] if not (aa[:5] == 'nterm' or aa[:5] == 'cterm')] # Check if there are retention coefficients for terminal amino acids. term_aa = False for aa in RC_dict['aa']: if aa[:5] == 'nterm' or aa[:5] == 'cterm': term_aa = True break # Calculate retention time. if isinstance(peptide, dict): peptide_dict = peptide else: peptide_dict = parser.amino_acid_composition(peptide, False, term_aa, allow_unknown_modifications=True, labels=amino_acids) RT = 0.0 for aa in peptide_dict: if aa not in RC_dict['aa']: if len(aa) == 1: raise PyteomicsError('No RC for residue "{}".'.format(aa)) if (not raise_no_mod) and aa[-1] in RC_dict['aa']: RT += peptide_dict[aa] * RC_dict['aa'][aa[-1]] else: raise PyteomicsError( 'Residue "{0}" not found in RC_dict. '.format(aa) + 'Set raise_no_mod=False to ignore this error ' + 'and use the RC for "{0}"" instead.'.format(aa[-1])) else: RT += peptide_dict[aa] * RC_dict['aa'][aa] length_correction_term = ( 1.0 + RC_dict.get('lcp', 0) * np.log(parser.length(peptide_dict))) RT *= length_correction_term RT += RC_dict.get('const', 0) return RT
RCs_guo_ph2_0 = {'aa':{'K': -2.1, 'G': -0.2, 'L': 8.1, 'A': 2.0, 'C': 2.6, 'E': 1.1, 'D': 0.2, 'F': 8.1, 'I': 7.4, 'H': -2.1, 'M': 5.5, 'N': -0.6, 'Q': 0.0, 'P': 2.0, 'S': -0.2, 'R': -0.6, 'T': 0.6, 'W': 8.8, 'V': 5.0, 'Y': 4.5, 'H-': 0.0, '-OH':0.0}, 'lcp': 0.0, 'const': 0.0} """A set of retention coefficients from Guo, D.; Mant, C. T.; Taneja, A. K.; Parker, J. M. R.; Hodges, R. S. Prediction of peptide retention times in reversed-phase high-performance liquid chromatography I. Determination of retention coefficients of amino acid residues of model synthetic peptides. Journal of Chromatography A, 1986, 359, 499-518. Conditions: Synchropak RP-P C18 column (250 x 4.1 mm I.D.), gradient (A = 0.1% aq. TFA, pH 2.0; B = 0.1% TFA in acetonitrile) at 1% B/min, flow rate 1 ml/min, 26 centigrades. """ RCs_guo_ph7_0 = {'aa':{'K': -0.2, 'G': -0.2, 'L': 9.0, 'A': 2.2, 'C': 2.6, 'E': -1.3, 'D': -2.6, 'F': 9.0, 'I': 8.3, 'H': 2.2, 'M': 6.0, 'N': -0.8, 'Q': 0.0, 'P': 2.2, 'S': -0.5, 'R': 0.9, 'T': 0.3, 'W': 9.5, 'V': 5.7, 'Y': 4.6, 'H-': 0.0, '-OH':0.0}, 'lcp': 0.0, 'const': 0.0} """A set of retention coefficients from Guo, D.; Mant, C. T.; Taneja, A. K.; Parker, J. M. R.; Hodges, R. S. Prediction of peptide retention times in reversed-phase high-performance liquid chromatography I. Determination of retention coefficients of amino acid residues of model synthetic peptides. Journal of Chromatography A, 1986, 359, 499-518. Conditions: Synchropak RP-P C18 column (250 x 4.1 mm I.D.), gradient (A = aq. 10 mM (NH4)2HPO4 - 0.1 M NaClO4, pH 7.0; B = 0.1 M NaClO4 in 60% aq. acetonitrile) at 1.67% B/min, flow rate 1 ml/min, 26 centigrades. """ RCs_meek_ph2_1 = {'aa':{'K': -3.2, 'G': -0.5, 'L': 10.0, 'A': -0.1, 'C': -2.2, 'E': -7.5, 'D': -2.8, 'F': 13.9, 'I': 11.8, 'H': 0.8, 'M': 7.1, 'N': -1.6, 'Q': -2.5, 'P': 8.0, 'S': -3.7, 'R': -4.5, 'T': 1.5, 'W': 18.1, 'V': 3.3, 'Y': 8.2, 'H-': 0.0, '-OH':0.0}, 'lcp': 0.0, 'const': 0.0} """A set of retention coefficients determined in Meek, J. L. Prediction of peptide retention times in high-pressure liquid chromatography on the basis of amino acid composition. PNAS, 1980, 77 (3), 1632-1636. .. note :: C stands for Cystine. Conditions: Bio-Rad "ODS" column, gradient (A = 0.1 M NaClO4, 0.1% phosphoric acid in water; B = 0.1 M NaClO4, 0.1% phosphoric acid in 60% aq. acetonitrile) at 1.25% B/min, room temperature. """ RCs_meek_ph7_4 = {'aa':{'K': 0.1, 'G': 0.0, 'L': 8.8, 'A': 0.5, 'C': -6.8, 'E':-16.9, 'D': -8.2, 'F': 13.2, 'I': 13.9, 'H': -3.5, 'M': 4.8, 'N': 0.8, 'Q': -4.8, 'P': 6.1, 'S': 1.2, 'R': 0.8, 'T': 2.7, 'W': 14.9, 'V': 2.7, 'Y': 6.1, 'H-': 0.0, '-OH':0.0}, 'lcp': 0.0, 'const': 0.0} """A set of retention coefficients determined in Meek, J. L. Prediction of peptide retention times in high-pressure liquid chromatography on the basis of amino acid composition. PNAS, 1980, 77 (3), 1632-1636. .. note :: C stands for Cystine. Conditions: Bio-Rad "ODS" column, gradient (A = 0.1 M NaClO4, 5 mM phosphate buffer in water; B = 0.1 M NaClO4, 5 mM phosphate buffer in 60% aq. acetonitrile) at 1.25% B/min, room temperature. """ RCs_browne_tfa = {'aa':{'K': -3.7, 'G': -1.2, 'L': 20.0, 'A': 7.3, 'C': -9.2, 'E': -7.1, 'D': -2.9, 'F': 19.2, 'I': 6.6, 'H': -2.1, 'M': 5.6, 'N': -5.7, 'Q': -0.3, 'P': 5.1, 'S': -4.1, 'pS':-6.5, 'R': -3.6, 'T': 0.8, 'pT':-1.6, 'W': 16.3, 'V': 3.5, 'Y': 5.9, 'pY': 3.5, 'H-': 0.0, '-OH':0.0}, 'lcp': 0.0, 'const': 0.0} """A set of retention coefficients determined in Browne, C. A.; Bennett, H. P. J.; Solomon, S. The isolation of peptides by high-performance liquid chromatography using predicted elution positions. Analytical Biochemistry, 1982, 124 (1), 201-208. Conditions: Waters mjuBondapak C18 column, gradient (A = 0.1% aq. TFA, B = 0.1% TFA in acetonitrile) at 0.33% B/min, flow rate 1.5 ml/min. """ RCs_browne_hfba = {'aa':{'K': -2.5, 'G': -2.3, 'L': 15.0, 'A': 3.9, 'C':-14.3, 'E': -7.5, 'D': -2.8, 'F': 14.7, 'I': 11.0, 'H': 2.0, 'M': 4.1, 'N': -2.8, 'Q': 1.8, 'P': 5.6, 'S': -3.5, 'pS':-7.6, 'R': 3.2, 'T': 1.1, 'pT':-3.0, 'W': 17.8, 'V': 2.1, 'Y': 3.8, 'pY':-0.3, 'H-': 0.0, '-OH':0.0}, 'lcp': 0.0, 'const': 0.0} """A set of retention coefficients determined in Browne, C. A.; Bennett, H. P. J.; Solomon, S. The isolation of peptides by high-performance liquid chromatography using predicted elution positions. Analytical Biochemistry, 1982, 124 (1), 201-208. Conditions: Waters mjuBondapak C18 column, gradient (A = 0.13% aq. HFBA, B = 0.13% HFBA in acetonitrile) at 0.33% B/min, flow rate 1.5 ml/min. """ RCs_palmblad = {'aa':{'K': -0.66, 'G': -0.29, 'L': 2.28, 'A': 0.41, 'C': -1.32, 'E': -0.26, 'D': 0.04, 'F': 2.68, 'I': 2.70, 'H': 0.57, 'M': 0.98, 'N': -0.54, 'Q': 1.02, 'P': 0.97, 'S': -0.71, 'R': -0.76, 'T': 0.37, 'W': 4.68, 'V': 2.44, 'Y': 2.78, 'H-': 0.0, '-OH':0.0}, 'lcp': 0.0, 'const': 0.0} """A set of retention coefficients determined in Palmblad, M.; Ramstrom, M.; Markides, K. E.; Hakansson, P.; Bergquist, J. Prediction of Chromatographic Retention and Protein Identification in Liquid Chromatography/Mass Spectrometry. Analytical Chemistry, 2002, 74 (22), 5826-5830. Conditions: a fused silica column (80-100 x 0.200 mm I.D.) packed in-house with C18 ODS-AQ; solvent A = 0.5% aq. HAc, B = 0.5% HAc in acetonitrile. """ RCs_yoshida = {'aa':{'K': 2.77, 'G': -0.16, 'L': -2.31, 'A': 0.28, 'C': 0.80, 'camC': 0.80, 'E': 1.58, 'D': 2.45, 'F': -2.94, 'I': -1.34, 'H': 3.44, 'M': -0.14, 'N': 3.25, 'Q': 2.35, 'P': 0.77, 'S': 2.53, 'R': 3.90, 'T': 1.73, 'W': -1.80, 'V': -2.19, 'Y': -0.11, 'H-': 0.0, '-OH':0.0}, 'lcp': 0.0, 'const': 0.0} """A set of retention coefficients determined in Yoshida, T. Calculation of peptide retention coefficients in normal-phase liquid chromatography. Journal of Chromatography A, 1998, 808 (1-2), 105-112. .. note:: Cysteine is Carboxymethylated. Conditions: TSK gel Amide-80 column (250 x 4.6 mm I.D.), gradient (A = 0.1% TFA in ACN-water (90:10); B = 0.1% TFA in ACN-water (55:45)) at 0.6% water/min, flow rate 1.0 ml/min, 40 centigrades. """ RCs_yoshida_lc = {'aa': {'A': 1.29, 'C': 0.94, 'camC': 0.94, 'D': 3.89, 'E': 4.40, 'F': -4.18, 'G': 1.29, 'H': 7.57, 'I': -2.65, 'K': 7.33, 'L': -3.93, 'M': -1.48, 'N': 6.65, 'P': 1.03, 'Q': 6.68, 'R': 7.08, 'S': 5.09, 'T': 3.46, 'V': -2.52, 'W': -1.87, 'Y': -0.46, 'H-': 0.0, '-OH': 0.0}, 'const': 0.0, 'lcp': -0.2} """A set of retention coefficients from the length-corrected model of normal-phase peptide chromatography. The dataset comes from Yoshida, T. Calculation of peptide retention coefficients in normal-phase liquid chromatography. Journal of Chromatography A, 1998, 808 (1-2), 105-112. The RCs were calculated in Moskovets, E.; Goloborodko A. A.; Gorshkov A. V.; Gorshkov M.V. Limitation of predictive 2-D liquid chromatography in reducing the database search space in shotgun proteomics: In silico studies. Journal of Separation Science, 2012, 35 (14), 1771-1778. .. note:: Cysteine is Carboxymethylated. Conditions: TSK gel Amide-80 column (250 x 4.6 mm I.D.), gradient (A = 0.1% TFA in ACN-water (90:10); B = 0.1% TFA in ACN-water (55:45)) at 0.6% water/min, flow rate 1.0 ml/min, 40 centigrades. """ RCs_zubarev = {'aa': {'A': 6.73, 'E': 5.66, 'C': 3.25, 'D': 5.64, 'G': 2.35, 'F': 27.43, 'I': 20.50, 'H': -0.66, 'K': -4.47, 'M': 17.39, 'L': 23.38, 'N': 2.57, 'Q': 2.93, 'P': 5.66, 'S': 3.58, 'R': -2.55, 'T': 4.88, 'Y': 13.22, 'W': 31.27, 'V': 13.05, 'camC': 3.25, 'C': 3.25, 'oxM': -7.61, '-OH': 0.0, 'H-': 0.0}, 'const': 0.53, 'lcp': -0.21} """A set of retention coefficients from the length-corrected model of reversed-phase peptide chromatography. The dataset was taken from Goloborodko A. A.; Mayerhofer C.; Zubarev A. R.; Tarasova I. A.; Gorshkov A. V.; Zubarev, R. A.; Gorshkov, M. V. Empirical approach to false discovery rate estimation in shotgun proteomics. Rapid communications in mass spectrometry, 2010, 24(4), 454-62. .. note:: Cysteine is Carbamidomethylated. Conditions: Reprosil-Pur C18-AQ column (150 x 0.075 mm I.D.), gradient (A = 0.5% AA in water; B = 0.5% AA in ACN-water (90:10)) at 0.5% water/min, flow rate 200.0 nl/min, room temperature. """ RCs_gilar_atlantis_ph3_0 = {'aa': {'K': 15.90, 'R': 13.64, 'H': 12.94, 'E': 2.97, 'P': 4.77, 'Q': 5.43, 'D': 3.20, 'C*': 4.87, 'C': 4.87, 'N': 3.91, 'A': 3.34, 'G': 3.33, 'S': 3.04, 'T': 2.71, 'V': 1.75, 'I': 0.65, 'M': 1.13, 'L': 0.13, 'F': -1.17, 'Y': -0.22, 'W': -2.47}, 'lcp': 0.0, 'const': 21.33} """A set of retention coefficients for normal phase chromatography obtained in Gilar, M., & Jaworski, A. (2011). Retention behavior of peptides in hydrophilic-interaction chromatography. Journal of chromatography A, 1218(49), 8890-6. .. note:: Cysteine is Carbamidomethylated. Conditions: Atlantis HILIC silica column (150 x 2.1 mm I.D.), 3 um, 100 A, gradient (A = water, B = ACN, C = 200 mM ammonium formate): 0 min, 5% A, 90% B, 5% C; 62.5 min, 55% A, 40% B, 5% C at 0.2 ml/min, temperature 40 C, pH 3.0""" RCs_gilar_atlantis_ph4_5 = {'aa': {'K': 15.49, 'R': 13.33, 'H': 12.19, 'E': 6.93, 'P': 5.89, 'Q': 5.68, 'D': 5.31, 'C*': 5.23, 'C': 5.23, 'N': 4.07, 'A': 3.6, 'G': 3.46, 'S': 2.62, 'T': 2.33, 'V': 1.42, 'I': 0.84, 'M': 0.34, 'L': 0.29, 'F': -1.21, 'Y': -1.62, 'W': -2.08}, 'lcp': 0.0, 'const': 23.95} """A set of retention coefficients for normal phase chromatography obtained in Gilar, M., & Jaworski, A. (2011). Retention behavior of peptides in hydrophilic-interaction chromatography. Journal of chromatography A, 1218(49), 8890-6. .. note:: Cysteine is Carbamidomethylated. Conditions: Atlantis HILIC silica column (150 x 2.1 mm I.D.), 3 um, 100 A, gradient (A = water, B = ACN, C = 200 mM ammonium formate): 0 min, 5% A, 90% B, 5% C; 62.5 min, 55% A, 40% B, 5% C at 0.2 ml/min, temperature 40 C, pH 4.5""" RCs_gilar_atlantis_ph10_0 = {'aa': {'K': 25.23, 'R': 23.38, 'H': 5.94, 'E': 0.59, 'P': 4.00, 'Q': 3.53, 'D': -0.84, 'C*': 3.52, 'C': 3.52, 'N': 3.26, 'A': 3.64, 'G': 3.02, 'S': 2.28, 'T': 1.74, 'V': 1.05, 'I': 1.51, 'M': -0.61, 'L': 0.25, 'F': -0.17, 'Y': -0.79, 'W': 0.23}, 'lcp': 0.0, 'const': 13.78} """A set of retention coefficients for normal phase chromatography obtained in Gilar, M., & Jaworski, A. (2011). Retention behavior of peptides in hydrophilic-interaction chromatography. Journal of chromatography A, 1218(49), 8890-6. .. note:: Cysteine is Carbamidomethylated. Conditions: Atlantis HILIC silica column (150 x 2.1 mm I.D.), 3 um, 100 A, gradient (A = water, B = ACN, C = 200 mM ammonium formate): 0 min, 5% A, 90% B, 5% C; 62.5 min, 55% A, 40% B, 5% C at 0.2 ml/min, temperature 40 C, pH 10.0""" RCs_gilar_beh = {'aa': {'K': 9.49, 'R': 8.56, 'H': 8.40, 'E': 5.95, 'P': 4.73, 'Q': 4.65, 'D': 4.97, 'C': 3.47, 'C*': 3.47, 'N': 3.50, 'A': 2.90, 'G': 2.63, 'S': 2.14, 'T': 2.19, 'V': 1.71, 'I': 1.30, 'M': 1.40, 'L': 0.73, 'F': -0.09, 'Y': -0.40, 'W': 0.11}, 'lcp': 0.0, 'const': 18.41} """A set of retention coefficients for normal phase chromatography obtained in Gilar, M., & Jaworski, A. (2011). Retention behavior of peptides in hydrophilic-interaction chromatography. Journal of chromatography A, 1218(49), 8890-6. .. note:: Cysteine is Carbamidomethylated. Conditions: ACQUITY UPLC BEH HILIC column (150 x 2.1 mm I.D.), 1.7 um, 130 A, Mobile phase A: 10 mM ammonium formate buffer, pH 4.5 prepared by titrating 10 mM solution of FA with ammonium hydroxide. Mobile phase B: 90% ACN, 10% mobile phase A (v:v). Gradient: 90-60% B in 50 min.""" RCs_gilar_beh_amide = {'aa': {'K': 7.19, 'R': 6.68, 'H': 6.16, 'E': 6.11, 'P': 3.18, 'Q': 5.19, 'D': 6.02, 'C*': 3.71, 'C': 3.71, 'N': 4.16, 'A': 2.64, 'G': 3.12, 'S': 3.17, 'T': 3.41, 'V': 0.83, 'I': -0.69, 'M': -0.12, 'L': -1.24, 'F': -1.93, 'Y': 0.46, 'W': -2.11}, 'lcp': 0.0, 'const': 24.26} """A set of retention coefficients for normal phase chromatography obtained in Gilar, M., & Jaworski, A. (2011). Retention behavior of peptides in hydrophilic-interaction chromatography. Journal of chromatography A, 1218(49), 8890-6. .. note:: Cysteine is Carbamidomethylated. Conditions: ACQUITY UPLC BEH glycan column (150 x 2.1 mm I.D.), 1.7 um, 130 A, Mobile phase A: 10 mM ammonium formate buffer, pH 4.5 prepared by titrating 10 mM solution of FA with ammonium hydroxide. Mobile phase B: 90% ACN, 10% mobile phase A (v:v). Gradient: 90-60% B in 50 min.""" RCs_gilar_rp = {'aa': {'K': -1.015, 'R': -0.681, 'H': -1.937, 'E': 1.475, 'P': 3.496, 'Q': 1.228, 'D': 1.326, 'C': 1.832, 'C*': 1.832, 'N': 0.299, 'A': 2.322, 'G': 1.172, 'S': 1.165, 'T': 1.894, 'V': 5.695, 'I': 8.343, 'M': 5.128, 'L': 9.069, 'F': 10.877, 'Y': 5.603, 'W': 12.183}, 'lcp': 0.0, 'const': -3.696} """A set of retention coefficients for normal phase chromatography obtained in Gilar, M., & Jaworski, A. (2011). Retention behavior of peptides in hydrophilic-interaction chromatography. Journal of chromatography A, 1218(49), 8890-6. .. note:: Cysteine is Carbamidomethylated. Conditions: ACQUITY UPLC BEH C18 column (100 mm x 2.1 mm I.D.), 1.7 um, 130 A. Mobile phase A: 0.02% TFA in water, mobile phase B: 0.018% TFA in ACN. Gradient: 0 to 50% B in 50 min, flow rate 0.2 ml/min, temperature 40 C., pH 2.6. """ RCs_krokhin_100A_fa = {'aa':{'K': -5.08, 'G': -0.07, 'L': 9.89, 'A': 1.63, 'C': 0.7, 'camC': 0.7, 'E': 1.75, 'D': 0.95, 'F': 11.92, 'I': 9.06, 'H': -5.05, 'M': 6.96, 'N': -0.59, 'Q': 0.2, 'P': 1.98, 'S': 0.27, 'R': -3.55, 'T': 1.37, 'W': 13.67, 'V': 5.72, 'Y': 5.97}, 'lcf': 0.0, 'const': 0.0} """A set of retention coefficients from R.C. Dwivedi, V. Spicer, M. Harder, M. Antonovici, W. Ens, K.G. Standing, J.A. Wilkins, and O.V. Krokhin; Analytical Chemistry 2008 80 (18), 7036-7042. Practical Implementation of 2D HPLC Scheme with Accurate Peptide Retention Prediction in Both Dimensions for High-Throughput Bottom-Up Proteomics. .. note:: Cysteine is Carbamidomethylated. Conditions: 300 um x 150mm PepMap100 (Dionex, 0.1% FA), packed with 5-um Luna C18(2) (Phenomenex, Torrance, CA), pore size 100A, pH=2.0. Both eluents A (2% ACN in water) and B (98% ACN) contained 0.1% FA as ion-pairing modifier. 0.33% ACN/min linear gradient (0-30% B). """ RCs_krokhin_100A_tfa = {'aa':{'K': -3.53, 'G': -0.35, 'L': 9.44, 'A': 1.11, 'C': 0.04, 'camC': 0.04, 'E': 1.08, 'D': -0.22, 'F': 11.34, 'I': 7.86, 'H': -3.04, 'M': 6.57, 'N': -1.44, 'Q': -0.53, 'P': 1.62, 'S': -0.33, 'R': -2.58, 'T': 0.48, 'W': 13.12, 'V': 4.86, 'Y': 5.4}, 'lcf': 0.0, 'const': 0.0} """A set of retention coefficients from R.C. Dwivedi, V. Spicer, M. Harder, M. Antonovici, W. Ens, K.G. Standing, J.A. Wilkins, and O.V. Krokhin; Analytical Chemistry 2008 80 (18), 7036-7042. Practical Implementation of 2D HPLC Scheme with Accurate Peptide Retention Prediction in Both Dimensions for High-Throughput Bottom-Up Proteomics. .. note :: Cysteine is Carbamidomethylated. Conditions: 300 um x 150mm PepMap100 (Dionex, 0.1% TFA), packed with 5-um Luna C18(2) (Phenomenex, Torrance, CA), pore size 100 A, pH=2.0. Both eluents A (2% ACN in water) and B (98% ACN) contained 0.1% TFA as ion-pairing modifier. 0.33% ACN/min linear gradient (0-30% B). """ if __name__ == "__main__": import doctest doctest.testmod()

Contents