From bbca30c14beaf9c4aab1d3b7f73c4dd57766b7ac Mon Sep 17 00:00:00 2001 From: Aaron Petkau Date: Tue, 16 Mar 2021 14:45:32 -0500 Subject: [PATCH 1/6] Fixed so that metadata with missing RGI results still gets written --- .../amrdetection/AMRDetectionUpdater.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java index 4fd183c..629bd84 100644 --- a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java +++ b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java @@ -194,24 +194,31 @@ private Map getRgiResults(Path rgiFilePat line = reader.readLine(); } - if (!genotypes.isEmpty()) { + String genotypesString = "-"; + String drugsString = "-"; + + if (genotypes.isEmpty()) { + logger.info("No genotype results found in rgi output file [" + rgiFilePath + "], for analysis submission " + analysis); + } else { Collections.sort(genotypes); - String genotypesString = joiner.join(genotypes); + genotypesString = joiner.join(genotypes); + } + if (drugs.isEmpty()) { + logger.info("No drug results found in rgi output file [" + rgiFilePath + "], for analysis submission " + analysis); + } else { Set drugsSet = Sets.newTreeSet(); drugs.forEach(t -> drugsSet.addAll(Lists.newArrayList(t.split(DRUG_CLASS_SPLIT)))); - String drugsString = joiner.join(drugsSet); + drugsString = joiner.join(drugsSet); + } - Map results = new HashMap<>(); - results.put(RGI_GENE, new PipelineProvidedMetadataEntry(genotypesString, "text", analysis)); - results.put(RGI_DRUG_CLASS, new PipelineProvidedMetadataEntry(drugsString, "text", analysis)); + Map results = new HashMap<>(); + results.put(RGI_GENE, new PipelineProvidedMetadataEntry(genotypesString, "text", analysis)); + results.put(RGI_DRUG_CLASS, new PipelineProvidedMetadataEntry(drugsString, "text", analysis)); - return results; - } else { - throw new PostProcessingException("No results found in rgi output file [" + rgiFilePath + "]"); - } + return results; } /** From 926e701498d913d4b11b8b8b373c8764c7a3e152 Mon Sep 17 00:00:00 2001 From: Aaron Petkau Date: Wed, 17 Mar 2021 15:27:09 -0500 Subject: [PATCH 2/6] Updated so staramr results get written even if there's no empty results --- .../amrdetection/AMRDetectionUpdater.java | 95 +++++++++++-------- 1 file changed, 54 insertions(+), 41 deletions(-) diff --git a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java index 629bd84..15a1a62 100644 --- a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java +++ b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java @@ -4,6 +4,7 @@ import java.io.FileReader; import java.io.IOException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -19,6 +20,7 @@ import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.google.common.collect.ImmutableMap; import ca.corefacility.bioinformatics.irida.exceptions.IridaWorkflowNotFoundException; import ca.corefacility.bioinformatics.irida.exceptions.PostProcessingException; @@ -47,17 +49,25 @@ public class AMRDetectionUpdater implements AnalysisSampleUpdater { private static final String RGI_DRUG_CLASS = "rgi/drug-class"; private static final String RGI_GENE = "rgi/gene"; + // + // The "Number of Contigs" column is a special case since the name can change + // (e.g., the full name is like "Number of Contigs Greater Than Or Equal To 300 bp" where "300 bp" can change). + private static final String STARAMR_RESULTS_CONTIGS_PREFIX = "Number of Contigs Greater Than Or Equal To"; + + // Maps IRIDA metadata field name to the column name of the staramr results (e.g., "staramr/quality" => "Quality Module") + private static final Map STARAMR_RESULTS_METADATA_MAP = ImmutableMap.builder() + .put("staramr/quality" , "Quality Module") + .put("staramr/gene" , "Genotype") + .put("staramr/drug-class" , "Predicted Phenotype") + .put("staramr/plasmid" , "Plasmid") + .put("staramr/mlst-scheme" , "Scheme") + .put("staramr/mlst-sequence-type", "Sequence Type") + .put("staramr/genome-length" , "Genome Length") + .put("staramr/n50" , "N50 value") + .put("staramr/quality-feedback" , "Quality Module Feedback") + .put("staramr/number-contigs" , STARAMR_RESULTS_CONTIGS_PREFIX) + .build(); - private static final String STARAMR_QUALITY_MODULE = "staramr/quality"; - private static final String STARAMR_GENE = "staramr/gene"; - private static final String STARAMR_DRUG_CLASS = "staramr/drug-class"; - private static final String STARAMR_PLASMID = "staramr/plasmid"; - private static final String STARAMR_MLST_SCHEME = "staramr/mlst-scheme"; - private static final String STARAMR_MLST_TYPE = "staramr/mlst-sequence-type"; - private static final String STARAMR_GENOME_LENGTH = "staramr/genome-length"; - private static final String STARAMR_N50 = "staramr/n50"; - private static final String STARAMR_NUMBER_CONTIGS = "staramr/number-contigs"; - private static final String STARAMR_QUALITY_FEEDBACK = "staramr/quality-feedback"; private MetadataTemplateService metadataTemplateService; private SampleService sampleService; @@ -89,47 +99,50 @@ public AMRDetectionUpdater(MetadataTemplateService metadataTemplateService, Samp */ private Map getStarAMRResults(Path staramrFilePath, AnalysisSubmission analysis) throws IOException, PostProcessingException { - final int QUALITY_MODULE = 1; - final int GENOTYPE = 2; - final int DRUG = 3; - final int PLASMID = 4; - final int MLST_SCHEME = 5; - final int MLST_SEQUENCE_TYPE = 6; - final int GENOME_LENGTH = 7; - final int N50 = 8; - final int NUMBER_CONTIGS = 9; - final int QUALITY_FEEDBACK = 10; - - final int MAX_TOKENS = 11; + final int MIN_TOKENS = 2; Map results = new HashMap<>(); + Map dataMap = new HashMap<>(); @SuppressWarnings("resource") BufferedReader reader = new BufferedReader(new FileReader(staramrFilePath.toFile())); String line = reader.readLine(); - List tokens = SPLITTER.splitToList(line); - if (tokens.size() != MAX_TOKENS) { + List columnNames = SPLITTER.splitToList(line); + if (columnNames.size() < MIN_TOKENS) { throw new PostProcessingException("Invalid number of columns in staramr results file [" + staramrFilePath - + "], expected [" + MAX_TOKENS + "] got [" + tokens.size() + "]"); + + "], expected at least [" + MIN_TOKENS + "] got [" + columnNames.size() + "]"); } line = reader.readLine(); - tokens = SPLITTER.splitToList(line); - results.put(STARAMR_QUALITY_MODULE, - new PipelineProvidedMetadataEntry(tokens.get(QUALITY_MODULE), "text", analysis)); - results.put(STARAMR_GENE, new PipelineProvidedMetadataEntry(tokens.get(GENOTYPE), "text", analysis)); - results.put(STARAMR_DRUG_CLASS, new PipelineProvidedMetadataEntry(tokens.get(DRUG), "text", analysis)); - results.put(STARAMR_PLASMID, new PipelineProvidedMetadataEntry(tokens.get(PLASMID), "text", analysis)); - results.put(STARAMR_MLST_SCHEME, new PipelineProvidedMetadataEntry(tokens.get(MLST_SCHEME), "text", analysis)); - results.put(STARAMR_MLST_TYPE, - new PipelineProvidedMetadataEntry(tokens.get(MLST_SEQUENCE_TYPE), "text", analysis)); - results.put(STARAMR_GENOME_LENGTH, - new PipelineProvidedMetadataEntry(tokens.get(GENOME_LENGTH), "text", analysis)); - results.put(STARAMR_N50, new PipelineProvidedMetadataEntry(tokens.get(N50), "text", analysis)); - results.put(STARAMR_NUMBER_CONTIGS, - new PipelineProvidedMetadataEntry(tokens.get(NUMBER_CONTIGS), "text", analysis)); - results.put(STARAMR_QUALITY_FEEDBACK, - new PipelineProvidedMetadataEntry(tokens.get(QUALITY_FEEDBACK), "text", analysis)); + + List values = new ArrayList<>(); + if (line == null || line.length() == 0) { + logger.info("Got empty results for staramr file [" + staramrFilePath + "] for analysis submission " + analysis); + } else { + values = SPLITTER.splitToList(line); + + if (columnNames.size() != values.size()) { + throw new PostProcessingException("Mismatch in number of column names [" + columnNames.size() + "] and number of files [" + values.size() + "] in staramr results file [" + staramrFilePath + "]"); + } + + for (int i = 0; i < columnNames.size(); i++) { + String column = columnNames.get(i); + String value = values.get(i); + + if (column.startsWith(STARAMR_RESULTS_CONTIGS_PREFIX)) { + dataMap.put(STARAMR_RESULTS_CONTIGS_PREFIX, value); + } else { + dataMap.put(column, value); + } + } + } + + for (String resultsFieldName: STARAMR_RESULTS_METADATA_MAP.keySet()) { + String staramrColumnName = STARAMR_RESULTS_METADATA_MAP.get(resultsFieldName); + String value = dataMap.containsKey(staramrColumnName) ? dataMap.get(staramrColumnName) : "-"; + + results.put(resultsFieldName, new PipelineProvidedMetadataEntry(value, "text", analysis)); + } line = reader.readLine(); From d359e27251d1a3f160b79da347b1a2398462e76d Mon Sep 17 00:00:00 2001 From: Aaron Petkau Date: Wed, 17 Mar 2021 16:15:25 -0500 Subject: [PATCH 3/6] Fixed up formatting --- CHANGELOG.md | 1 + .../amrdetection/AMRDetectionUpdater.java | 32 ++++++++++++------- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d2d8821..40d82db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * The plugin will now save the additional fields provided by the newer staramr version in the metadata table. * Updated RGI version to `5.1.1`. * Updated Shovill to version `1.1.0`. +* Fixed bug where empty RGI results would lead to metadata not being written (#8) # 0.1.0 diff --git a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java index 15a1a62..e50fd11 100644 --- a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java +++ b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java @@ -51,10 +51,13 @@ public class AMRDetectionUpdater implements AnalysisSampleUpdater { private static final String RGI_GENE = "rgi/gene"; // // The "Number of Contigs" column is a special case since the name can change - // (e.g., the full name is like "Number of Contigs Greater Than Or Equal To 300 bp" where "300 bp" can change). + // (e.g., the full name is like "Number of Contigs Greater Than Or Equal To 300 + // bp" where "300 bp" can change). private static final String STARAMR_RESULTS_CONTIGS_PREFIX = "Number of Contigs Greater Than Or Equal To"; - // Maps IRIDA metadata field name to the column name of the staramr results (e.g., "staramr/quality" => "Quality Module") + // Maps IRIDA metadata field name to the column name of the staramr results + // (e.g., "staramr/quality" => "Quality Module") + //@formatter:off private static final Map STARAMR_RESULTS_METADATA_MAP = ImmutableMap.builder() .put("staramr/quality" , "Quality Module") .put("staramr/gene" , "Genotype") @@ -67,7 +70,7 @@ public class AMRDetectionUpdater implements AnalysisSampleUpdater { .put("staramr/quality-feedback" , "Quality Module Feedback") .put("staramr/number-contigs" , STARAMR_RESULTS_CONTIGS_PREFIX) .build(); - + //@formatter:on private MetadataTemplateService metadataTemplateService; private SampleService sampleService; @@ -102,7 +105,7 @@ private Map getStarAMRResults(Path staram final int MIN_TOKENS = 2; Map results = new HashMap<>(); - Map dataMap = new HashMap<>(); + Map dataMap = new HashMap<>(); @SuppressWarnings("resource") BufferedReader reader = new BufferedReader(new FileReader(staramrFilePath.toFile())); @@ -117,18 +120,21 @@ private Map getStarAMRResults(Path staram List values = new ArrayList<>(); if (line == null || line.length() == 0) { - logger.info("Got empty results for staramr file [" + staramrFilePath + "] for analysis submission " + analysis); - } else { + logger.info( + "Got empty results for staramr file [" + staramrFilePath + "] for analysis submission " + analysis); + } else { values = SPLITTER.splitToList(line); - + if (columnNames.size() != values.size()) { - throw new PostProcessingException("Mismatch in number of column names [" + columnNames.size() + "] and number of files [" + values.size() + "] in staramr results file [" + staramrFilePath + "]"); + throw new PostProcessingException( + "Mismatch in number of column names [" + columnNames.size() + "] and number of files [" + + values.size() + "] in staramr results file [" + staramrFilePath + "]"); } for (int i = 0; i < columnNames.size(); i++) { String column = columnNames.get(i); String value = values.get(i); - + if (column.startsWith(STARAMR_RESULTS_CONTIGS_PREFIX)) { dataMap.put(STARAMR_RESULTS_CONTIGS_PREFIX, value); } else { @@ -137,7 +143,7 @@ private Map getStarAMRResults(Path staram } } - for (String resultsFieldName: STARAMR_RESULTS_METADATA_MAP.keySet()) { + for (String resultsFieldName : STARAMR_RESULTS_METADATA_MAP.keySet()) { String staramrColumnName = STARAMR_RESULTS_METADATA_MAP.get(resultsFieldName); String value = dataMap.containsKey(staramrColumnName) ? dataMap.get(staramrColumnName) : "-"; @@ -211,7 +217,8 @@ private Map getRgiResults(Path rgiFilePat String drugsString = "-"; if (genotypes.isEmpty()) { - logger.info("No genotype results found in rgi output file [" + rgiFilePath + "], for analysis submission " + analysis); + logger.info("No genotype results found in rgi output file [" + rgiFilePath + "], for analysis submission " + + analysis); } else { Collections.sort(genotypes); @@ -219,7 +226,8 @@ private Map getRgiResults(Path rgiFilePat } if (drugs.isEmpty()) { - logger.info("No drug results found in rgi output file [" + rgiFilePath + "], for analysis submission " + analysis); + logger.info("No drug results found in rgi output file [" + rgiFilePath + "], for analysis submission " + + analysis); } else { Set drugsSet = Sets.newTreeSet(); drugs.forEach(t -> drugsSet.addAll(Lists.newArrayList(t.split(DRUG_CLASS_SPLIT)))); From e6f95f2dc0406cb00d645f8214027e20c47e7aa8 Mon Sep 17 00:00:00 2001 From: Aaron Petkau Date: Wed, 17 Mar 2021 16:36:52 -0500 Subject: [PATCH 4/6] Refactored method for parsing staramr results --- .../amrdetection/AMRDetectionUpdater.java | 67 +++++++++++++------ 1 file changed, 45 insertions(+), 22 deletions(-) diff --git a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java index e50fd11..c74cb73 100644 --- a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java +++ b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java @@ -4,7 +4,6 @@ import java.io.FileReader; import java.io.IOException; import java.nio.file.Path; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -18,9 +17,9 @@ import com.google.common.base.Joiner; import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; -import com.google.common.collect.ImmutableMap; import ca.corefacility.bioinformatics.irida.exceptions.IridaWorkflowNotFoundException; import ca.corefacility.bioinformatics.irida.exceptions.PostProcessingException; @@ -90,6 +89,47 @@ public AMRDetectionUpdater(MetadataTemplateService metadataTemplateService, Samp this.iridaWorkflowsService = iridaWorkflowsService; } + /** + * Parses a line of the results file and gets a Map linking the column to the + * value in the line. (e.g., "N50 value" => "100"). + * + * @param columnNames A List of names of the columns in the results file. + * @param line The line to parse. + * @param singleColumnPrefix A prefix for a special case in the staramr results + * where the column prefix is constant but the suffix + * changes. Set to null to ignore. + * @param resultsFile The specific file being parsed (for error + * messages). + * @param analysis The analysis submission being parsed (for error + * messages). + * @return A Map linking the column to the value for the line. + * @throws PostProcessingException If there was an error parsing the results. + */ + private Map getDataMapForLine(List columnNames, String line, String singleColumnPrefix, + Path resultsFile, AnalysisSubmission analysis) throws PostProcessingException { + Map dataMap = new HashMap<>(); + + List values = SPLITTER.splitToList(line); + + if (columnNames.size() != values.size()) { + throw new PostProcessingException("Mismatch in number of column names [" + columnNames.size() + + "] and number of files [" + values.size() + "] in results file [" + resultsFile + "]"); + } + + for (int i = 0; i < columnNames.size(); i++) { + String column = columnNames.get(i); + String value = values.get(i); + + if (singleColumnPrefix != null && column.startsWith(singleColumnPrefix)) { + dataMap.put(singleColumnPrefix, value); + } else { + dataMap.put(column, value); + } + } + + return dataMap; + } + /** * Gets the staramr results from the given output file. * @@ -105,7 +145,7 @@ private Map getStarAMRResults(Path staram final int MIN_TOKENS = 2; Map results = new HashMap<>(); - Map dataMap = new HashMap<>(); + Map dataMap; @SuppressWarnings("resource") BufferedReader reader = new BufferedReader(new FileReader(staramrFilePath.toFile())); @@ -118,29 +158,12 @@ private Map getStarAMRResults(Path staram line = reader.readLine(); - List values = new ArrayList<>(); if (line == null || line.length() == 0) { + dataMap = new HashMap<>(); logger.info( "Got empty results for staramr file [" + staramrFilePath + "] for analysis submission " + analysis); } else { - values = SPLITTER.splitToList(line); - - if (columnNames.size() != values.size()) { - throw new PostProcessingException( - "Mismatch in number of column names [" + columnNames.size() + "] and number of files [" - + values.size() + "] in staramr results file [" + staramrFilePath + "]"); - } - - for (int i = 0; i < columnNames.size(); i++) { - String column = columnNames.get(i); - String value = values.get(i); - - if (column.startsWith(STARAMR_RESULTS_CONTIGS_PREFIX)) { - dataMap.put(STARAMR_RESULTS_CONTIGS_PREFIX, value); - } else { - dataMap.put(column, value); - } - } + dataMap = getDataMapForLine(columnNames, line, STARAMR_RESULTS_CONTIGS_PREFIX, staramrFilePath, analysis); } for (String resultsFieldName : STARAMR_RESULTS_METADATA_MAP.keySet()) { From 10e2679446e4e10e17c2d3a2777f9dfe5acb4118 Mon Sep 17 00:00:00 2001 From: Aaron Petkau Date: Wed, 17 Mar 2021 17:06:09 -0500 Subject: [PATCH 5/6] Refactored how I parse RGI results --- .../amrdetection/AMRDetectionUpdater.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java index c74cb73..4f81dd0 100644 --- a/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java +++ b/src/main/java/ca/corefacility/bioinformatics/irida/plugin/amrdetection/AMRDetectionUpdater.java @@ -70,6 +70,15 @@ public class AMRDetectionUpdater implements AnalysisSampleUpdater { .put("staramr/number-contigs" , STARAMR_RESULTS_CONTIGS_PREFIX) .build(); //@formatter:on + + // Maps IRIDA metadata field name to the column name of the RGI results + // (e.g., "rgi/gene" => "Best_Hit_ARO") + //@formatter:off + private static final Map RGI_RESULTS_METADATA_MAP = ImmutableMap.builder() + .put(RGI_GENE , "Best_Hit_ARO") + .put(RGI_DRUG_CLASS, "Drug Class") + .build(); + //@formatter:on private MetadataTemplateService metadataTemplateService; private SampleService sampleService; @@ -195,11 +204,6 @@ private Map getStarAMRResults(Path staram */ private Map getRgiResults(Path rgiFilePath, AnalysisSubmission analysis) throws IOException, PostProcessingException { - final int MAX_TOKENS = 25; - - final int BEST_HIT_ARO_INDEX = 8; - final int DRUG_CLASS_INDEX = 14; - final String DRUG_CLASS_SPLIT = ";"; final Joiner joiner = Joiner.on(", "); @@ -212,26 +216,22 @@ private Map getRgiResults(Path rgiFilePat String line = reader.readLine(); - List tokens = SPLITTER.splitToList(line); - if (tokens.size() != MAX_TOKENS) { - throw new PostProcessingException("Invalid number of columns in RGI results file [" + rgiFilePath - + "], expected [" + MAX_TOKENS + "] got [" + tokens.size() + "]"); + List columnNames = SPLITTER.splitToList(line); + if (columnNames.isEmpty()) { + logger.warn("Missing columns in RGI results file [" + rgiFilePath + "] for analysis submission " + analysis); } line = reader.readLine(); while (line != null) { - tokens = SPLITTER.splitToList(line); - - if (tokens.size() != MAX_TOKENS) { - line = reader.readLine(); - continue; + Map lineDataMap = getDataMapForLine(columnNames, line, null, rgiFilePath, analysis); + + if (lineDataMap.containsKey(RGI_RESULTS_METADATA_MAP.get(RGI_GENE))) { + genotypes.add(lineDataMap.get(RGI_RESULTS_METADATA_MAP.get(RGI_GENE))); + } + + if (lineDataMap.containsKey(RGI_RESULTS_METADATA_MAP.get(RGI_DRUG_CLASS))) { + drugs.add(lineDataMap.get(RGI_RESULTS_METADATA_MAP.get(RGI_DRUG_CLASS))); } - - String genotype = tokens.get(BEST_HIT_ARO_INDEX); - String drugClass = tokens.get(DRUG_CLASS_INDEX); - - genotypes.add(genotype); - drugs.add(drugClass); line = reader.readLine(); } From 702ed2028382e8379510f12af1d8b4565af9ba8f Mon Sep 17 00:00:00 2001 From: Aaron Petkau Date: Wed, 17 Mar 2021 23:51:03 -0500 Subject: [PATCH 6/6] Switch version back to 0.2.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index c9a38fb..521109b 100644 --- a/pom.xml +++ b/pom.xml @@ -6,12 +6,12 @@ ca.corefacility.bioinformatics.irida amr-detection - 0.3.0-SNAPSHOT + 0.2.0 amr-detection ca.corefacility.bioinformatics.irida.plugin.amrdetection.AMRDetectionPlugin - 0.3.0 + 0.2.0 Aaron Petkau 1.1.0