[med-svn] [Git][med-team/augur][upstream] New upstream version 17.1.0
Andreas Tille (@tille)
gitlab at salsa.debian.org
Mon Aug 22 13:57:32 BST 2022
Andreas Tille pushed to branch upstream at Debian Med / augur
Commits:
90e77bba by Andreas Tille at 2022-08-22T14:52:21+02:00
New upstream version 17.1.0
- - - - -
11 changed files:
- CHANGES.md
- augur/__version__.py
- augur/dates.py
- augur/export_v1.py
- augur/refine.py
- augur/tree.py
- setup.py
- tests/builds/tb_drm/data/drm.vcf.gz
- tests/functional/translate/data/tb/aa_muts.json
- tests/functional/translate/data/zika/nt_muts.json
- tests/test_dates.py
Changes:
=====================================
CHANGES.md
=====================================
@@ -3,6 +3,25 @@
## __NEXT__
+## 17.1.0 (19 August 2022)
+
+### Features
+
+* refine: Upgrade TreeTime from 0.8.6 to >= 0.9.2 which enables a speedup of timetree inference in marginal mode due to the use of Fast Fourier Transforms [#1018][]. (@rneher and @anna-parker)
+
+### Bug Fixes
+
+* refine, export v1: Use pandas.DataFrame.at instead of .loc for single values [#979][]. (@victorlin)
+* refine: Gracefully handle all exceptions from TreeTime [#1023][]. (@anna-parker)
+* refine: Document branch length units `treetime` expects [#1024][]. (@anna-parker)
+* dates: Raise an error when metadata to `get_numerical_dates()` is not a pandas DataFrame [#1026][]. (@victorlin)
+
+[#979]: https://github.com/nextstrain/augur/pull/979
+[#1018]: https://github.com/nextstrain/augur/pull/1018
+[#1023]: https://github.com/nextstrain/augur/pull/1023
+[#1024]: https://github.com/nextstrain/augur/pull/1024
+[#1026]: https://github.com/nextstrain/augur/pull/1026
+
## 17.0.0 (9 August 2022)
### Major Changes
=====================================
augur/__version__.py
=====================================
@@ -1,4 +1,4 @@
-__version__ = '17.0.0'
+__version__ = '17.1.0'
def is_augur_version_compatible(version):
=====================================
augur/dates.py
=====================================
@@ -5,6 +5,7 @@ import isodate
import pandas as pd
import re
import treetime.utils
+from .errors import AugurError
from augur.util_support.date_disambiguator import DateDisambiguator
@@ -122,7 +123,7 @@ def get_numerical_date_from_value(value, fmt=None, min_max_year=None):
def get_numerical_dates(metadata:pd.DataFrame, name_col = None, date_col='date', fmt=None, min_max_year=None):
if not isinstance(metadata, pd.DataFrame):
- return {}
+ raise AugurError("Metadata should be a pandas.DataFrame.")
if fmt:
strains = metadata.index.values
dates = metadata[date_col].apply(
=====================================
augur/export_v1.py
=====================================
@@ -269,8 +269,8 @@ def add_tsv_metadata_to_nodes(nodes, meta_tsv, meta_json, extra_fields=['authors
continue
for field in fields:
# Allow fields to have value of 0! - but prevent from having value of "" (breaks auspice v1)
- if field not in node and field in meta_tsv.columns and (meta_tsv.loc[strain, field] or meta_tsv.loc[strain, field]==0):
- node[field] = meta_tsv.loc[strain, field]
+ if field not in node and field in meta_tsv.columns and (meta_tsv.at[strain, field] or meta_tsv.at[strain, field]==0):
+ node[field] = meta_tsv.at[strain, field]
def get_root_sequence(root_node, ref=None, translations=None):
=====================================
augur/refine.py
=====================================
@@ -2,17 +2,18 @@
Refine an initial tree using sequence metadata.
"""
import numpy as np
-import os, shutil, time, sys
+import sys
from Bio import Phylo
from .dates import get_numerical_dates
from .io import read_metadata
from .utils import read_tree, write_json, InvalidTreeError
+from .errors import AugurError
from treetime.vcf_utils import read_vcf, write_vcf
from treetime.seq_utils import profile_maps
def refine(tree=None, aln=None, ref=None, dates=None, branch_length_inference='auto',
confidence=False, resolve_polytomies=True, max_iter=2, precision='auto',
- infer_gtr=True, Tc=0.01, reroot=None, use_marginal=False, fixed_pi=None,
+ infer_gtr=True, Tc=0.01, reroot=None, use_marginal='always', fixed_pi=None, use_fft=True,
clock_rate=None, clock_std=None, clock_filter_iqd=None, verbosity=1, covariance=True, **kwarks):
from treetime import TreeTime
@@ -35,7 +36,7 @@ def refine(tree=None, aln=None, ref=None, dates=None, branch_length_inference='a
branch_length_inference = 'joint'
#send ref, if is None, does no harm
- tt = TreeTime(tree=tree, aln=aln, ref=ref, dates=dates,
+ tt = TreeTime(tree=tree, aln=aln, ref=ref, dates=dates, use_fft=use_fft,
verbose=verbosity, gtr='JC69', precision=precision)
# conditionally run clock-filter and remove bad tips
@@ -99,7 +100,8 @@ def register_parser(parent_subparsers):
parser.add_argument('--metadata', type=str, metavar="FILE", help="sequence metadata, as CSV or TSV")
parser.add_argument('--output-tree', type=str, help='file name to write tree to')
parser.add_argument('--output-node-data', type=str, help='file name to write branch lengths as node data')
- parser.add_argument('--timetree', action="store_true", help="produce timetree using treetime")
+ parser.add_argument('--use-fft', action="store_true", help="produce timetree using FFT for convolutions")
+ parser.add_argument('--timetree', action="store_true", help="produce timetree using treetime, requires tree where branch length is in units of average number of nucleotide or protein substitutions per site (and branch lengths do not exceed 4)")
parser.add_argument('--coalescent', help="coalescent time scale in units of inverse clock rate (float), optimize as scalar ('opt'), or skyline ('skyline')")
parser.add_argument('--gen-per-year', default=50, type=float, help="number of generations per year, relevant for skyline output('skyline')")
parser.add_argument('--clock-rate', type=float, help="fixed clock rate")
@@ -209,17 +211,24 @@ def run(args):
# save input state string for later export
for n in T.get_terminals():
if n.name in metadata.index and 'date' in metadata.columns:
- n.raw_date = metadata.loc[n.name, 'date']
-
- tt = refine(tree=T, aln=aln, ref=ref, dates=dates, confidence=args.date_confidence,
- reroot=args.root, # or 'best', # We now have a default in param spec - this just adds confusion.
- Tc=0.01 if args.coalescent is None else args.coalescent, #use 0.01 as default coalescent time scale
- use_marginal = args.date_inference == 'marginal',
- branch_length_inference = args.branch_length_inference or 'auto',
- precision = 'auto' if args.precision is None else args.precision,
- clock_rate=args.clock_rate, clock_std=args.clock_std_dev,
- clock_filter_iqd=args.clock_filter_iqd,
- covariance=args.covariance, resolve_polytomies=(not args.keep_polytomies))
+ n.raw_date = metadata.at[n.name, 'date']
+
+ if args.date_confidence:
+ time_inference_mode = 'always' if args.date_inference=='marginal' else 'only-final'
+ else:
+ time_inference_mode = 'always' if args.date_inference=='marginal' else 'never'
+ try:
+ tt = refine(tree=T, aln=aln, ref=ref, dates=dates, confidence=args.date_confidence,
+ reroot=args.root, # or 'best', # We now have a default in param spec - this just adds confusion.
+ Tc=0.01 if args.coalescent is None else args.coalescent, #use 0.01 as default coalescent time scale
+ use_marginal = time_inference_mode, use_fft=args.use_fft,
+ branch_length_inference = args.branch_length_inference or 'auto',
+ precision = 'auto' if args.precision is None else args.precision,
+ clock_rate=args.clock_rate, clock_std=args.clock_std_dev,
+ clock_filter_iqd=args.clock_filter_iqd,
+ covariance=args.covariance, resolve_polytomies=(not args.keep_polytomies))
+ except BaseException as err:
+ raise AugurError(f"Was unable to refine time trees:\n\n{err}")
node_data['clock'] = {'rate': tt.date2dist.clock_rate,
'intercept': tt.date2dist.intercept,
=====================================
augur/tree.py
=====================================
@@ -330,6 +330,10 @@ def write_out_informative_fasta(compress_seq, alignment, stripFile=None):
#Rotate and convert to SeqRecord
sites = np.asarray(sites)
+ if len(sites.shape)!=2:
+ print("ERROR: NO VALID SITES REMAIN AFTER IGNORING UNCALLED SITES")
+ raise Exception
+
align = np.rot90(sites)
seqNamesCorr = list(reversed(seqNames))
toFasta = [ SeqRecord(id=seqNamesCorr[i], seq=Seq("".join(align[i])), description='') for i in range(len(sequences.keys()))]
=====================================
setup.py
=====================================
@@ -58,7 +58,7 @@ setuptools.setup(
"networkx >= 2.5, ==2.*",
"packaging >=19.2",
"pandas >=1.0.0, ==1.*",
- "phylo-treetime ==0.8.*",
+ "phylo-treetime >=0.9.2, ==0.9.*",
"xopen >=1.0.1, ==1.*"
],
extras_require = {
=====================================
tests/builds/tb_drm/data/drm.vcf.gz
=====================================
Binary files a/tests/builds/tb_drm/data/drm.vcf.gz and b/tests/builds/tb_drm/data/drm.vcf.gz differ
=====================================
tests/functional/translate/data/tb/aa_muts.json
=====================================
@@ -1319,7 +1319,7 @@
},
"generated_by": {
"program": "augur",
- "version": "10.0.2"
+ "version": "17.0.0"
},
"nodes": {
"G22574": {
@@ -1360,7 +1360,7 @@
"Rv1129c": [],
"Rv2752c": [],
"Rv3087": [
- "S227A"
+ "X227A"
],
"cobS": [],
"cycA": [],
@@ -1631,8 +1631,11 @@
"Rv1129c": [
"S480P"
],
- "Rv2752c": [],
+ "Rv2752c": [
+ "V533X"
+ ],
"Rv3087": [
+ "S227X",
"V447L"
],
"cobS": [
@@ -1661,7 +1664,9 @@
"esxM": [
"K59*"
],
- "esxU": [],
+ "esxU": [
+ "W62X"
+ ],
"fadE5": [
"V522F"
],
@@ -1758,7 +1763,7 @@
"Rv0909": [],
"Rv1129c": [],
"Rv2752c": [
- "V533M"
+ "X533M"
],
"Rv3087": [],
"cobS": [],
@@ -1770,7 +1775,7 @@
"esxD": [],
"esxM": [],
"esxU": [
- "W62S"
+ "X62S"
],
"fadE5": [],
"hsdS": [],
@@ -1811,4 +1816,4 @@
"rpoC": "VLDVNFFDELRIGLATAEDIRQWSYGEVKKPETINYRTLKPEKDGLFCEKIFGPTRDWECYCGKYKRVRFKGIICERCGVEVTRAKVRRERMGHIELAAPVTHIWYFKGVPSRLGYLLDLAPKDLEKIIYFAAYVITSVDEEMRHNELSTLEAEMAVERKAVEDQRDGELEARAQKLEADLAELEAEGAKADARRKVRDGGEREMRQIRDRAQRELDRLEDIWSTFTKLAPKQLIVDENLYRELVDRYGEYFTGAMGAESIQKLIENFDIDAEAESLRDVIRNGKGQKKLRALKRLKVVAAFQQSGNSPMGMVLDAVPVIPPELRPMVQLDGGRFATSDLNDLYRRVINRNNRLKRLIDLGAPEIIVNNEKRMLQESVDALFDNGRRGRPVTGPGNRPLKSLSDLLKGKQGRFRQNLLGKRVDYSGRSVIVVGPQLKLHQCGLPKLMALELFKPFVMKRLVDLNHAQNIKSAKRMVERQRPQVWDVLEEVIAEHPVLLNRAPTLHRLGIQAFEPMLVEGKAIQLHPLVCEAFNADFDGDQMAVHLPLSAEAQAEARILMLSSNNILSPASGRPLAMPRLDMVTGLYYLTTEVPGDTGEYQPASGDHPETGVYSSPAEAIMAADRGVLSVRAKIKVRLTQLRPPVEIEAELFGHSGWQPGDAWMAETTLGRVMFNELLPLGYPFVNKQMHKKVQAAIINDLAERYPMIVVAQTVDKLKDAGFYWATRSGVTVSMADVLVPPRKKEILDHYEERADKVEKQFQRGALNHDERNEALVEIWKEATDEVGQALREHYPDDNPIITIVDSGATGNFTQTRTLAGMKGLVTNPKGEFIPRPVKSSFREGLTVLEYFINTHGARKGLADTALRTADSGYLTRRLVDVSQDVIVREHDCQTERGIVVELAERAPDGTLIRDPYIETSAYARTLGTDAVDEAGNVIVERGQDLGDPEIDALLAAGITQVKVRSVLTCATSTGVCATCYGRSMATGKLVDIGEAVGIVAAQSIGEPGTQLTMRTFHQGGVGEDITGGLPRVQELFEARVPRGKAPIADVTGRVRLEDGERFYKITIVPDDGGEEVVYDKISKRQRLRVFKHEDGSERVLSDGDHVEVGQQLMEGSADPHEVLRVQGPREVQIHLVREVQEVYRAQGVSIHDKHIEVIVRQMLRRVTIIDSGSTEFLPGSLIDRAEFEAENRRVVAEGGEPAAGRPVLMGITKASLATDSWLSAASFQETTRVLTDAAINCRSDKLNGLKENVIIGKLIPAGTGINRYRNIAVQPTEEARAAAYTIPSYEDQYYSPDFGAATGAAVPLDDYGYSDYR*",
"ubiA": "MSEDVVTQPPANLVAGVVKAIRPRQWVKNVLVLAAPLAALGGGVRYDYVEVLSKVSMAFVVFSLAASAVYLVNDVRDVEADREHPTKRFRPIAAGVVPEWLAYTVAVVLGVTSLAGAWMLTPNLALVMVVYLAMQLAYCFGLKHQAVVDICVVSSAYLIRAIAGGVATKIPLSKWFLLIMAFGSLFMVAGKRYAELHLAERTGAAIRKSLESYTSTYLRFVWTLSATAVVLCYGLWAFERDGYSGSWFAVSMIPFTIAILRYAVDVDGGLAGEPEDIALRDRVLQLLALAWIATVGAAVAFG*"
}
-}
+}
\ No newline at end of file
=====================================
tests/functional/translate/data/zika/nt_muts.json
=====================================
@@ -6,10 +6,6 @@
"strand": "+"
}
},
- "generated_by": {
- "program": "augur",
- "version": "16.0.3"
- },
"mask": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"nodes": {
"BRA/2016/FC_6706": {
=====================================
tests/test_dates.py
=====================================
@@ -1,6 +1,8 @@
import datetime
+import pytest
from freezegun import freeze_time
from augur import dates
+from augur.errors import AugurError
class TestDates:
@@ -57,3 +59,14 @@ class TestDates:
# Test incomplete date strings without ambiguous dates for the requested fields.
assert not dates.is_date_ambiguous("2019", "year")
assert not dates.is_date_ambiguous("2019-10", "month")
+
+ def test_get_numerical_dates_dict_error(self):
+ """Using get_numerical_dates with metadata represented as a dict should raise an error."""
+ metadata = {
+ "example": {
+ "strain": "example",
+ "date": "2000-03-29"
+ }
+ }
+ with pytest.raises(AugurError):
+ dates.get_numerical_dates(metadata)
View it on GitLab: https://salsa.debian.org/med-team/augur/-/commit/90e77bba20818aa5c80f3f1403838471a74f0088
--
View it on GitLab: https://salsa.debian.org/med-team/augur/-/commit/90e77bba20818aa5c80f3f1403838471a74f0088
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-med-commit/attachments/20220822/516d2aee/attachment-0001.htm>
More information about the debian-med-commit
mailing list