From ec71a72bd4093eb53a8e0db1baebfbd7c9f7d442 Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 15 Jan 2026 23:16:36 -0800 Subject: [PATCH 1/3] Use query parameters in alignment_summary queries --- .../alignment_summary_by_lineage.sql | 32 +- ...nment_summary_by_lineage_pivoted.query.xml | 9 - .../alignment_summary_by_lineage_pivoted.sql | 9 - .../alignment_summary_grouped.sql | 30 +- .../resources/schemas/sequenceanalysis.xml | 10 +- .../resources/views/sbtToGeneTable.html | 454 ------------------ .../resources/views/sbtToGeneTable.view.xml | 6 - .../SequenceAnalysisModule.java | 3 - .../analysis/SbtGeneCountHandler.java | 118 ----- 9 files changed, 20 insertions(+), 651 deletions(-) delete mode 100644 SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_pivoted.query.xml delete mode 100644 SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_pivoted.sql delete mode 100644 SequenceAnalysis/resources/views/sbtToGeneTable.html delete mode 100644 SequenceAnalysis/resources/views/sbtToGeneTable.view.xml delete mode 100644 SequenceAnalysis/src/org/labkey/sequenceanalysis/analysis/SbtGeneCountHandler.java diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.sql b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.sql index a89cd1f50..7ab8394a5 100644 --- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.sql +++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.sql @@ -1,20 +1,7 @@ -/* - * Copyright (c) 2012 LabKey Corporation - * - * 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. - */ +PARAMETERS(AnalysisId INTEGER) + select - (CAST(a.analysis_id as varchar) || '<>' || a.lineages) as key, + (CAST(AnalysisId as varchar) || '<>' || a.lineages) as key, a.analysis_id, a.lineages, max(a.totalLineages) as totalLineages, @@ -25,13 +12,13 @@ select round(100 * (cast(sum(a.total) as float) / cast(max(a.total_reads) as float)), 2) as percent, group_concat(distinct a.haplotypesWithAllele) as haplotypesWithAllele, - CAST((select sum(s.total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = a.analysis_id AND s.rowid IN ( - SELECT distinct asj.alignment_id from sequenceanalysis.alignment_summary_junction asj WHERE asj.ref_nt_id.locus = a.loci and asj.status = true + CAST((select sum(s.total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = AnalysisId AND s.rowid IN ( + SELECT distinct asj.alignment_id from sequenceanalysis.alignment_summary_junction asj WHERE asj.analysis_id = AnalysisId AND asj.ref_nt_id.locus = a.loci and asj.status = true ) ) as integer) as total_reads_from_locus, - round(100 * (cast(sum(a.total) as float) / cast((select sum(s.total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = a.analysis_id AND s.rowid IN ( - SELECT distinct asj.alignment_id from sequenceanalysis.alignment_summary_junction asj WHERE asj.ref_nt_id.locus = a.loci and asj.status = true + round(100 * (cast(sum(a.total) as float) / cast((select sum(s.total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = AnalysisId AND s.rowid IN ( + SELECT distinct asj.alignment_id from sequenceanalysis.alignment_summary_junction asj WHERE asj.analysis_id = AnalysisId AND asj.ref_nt_id.locus = a.loci and asj.status = true ) ) as float)), 2) as percent_from_locus, group_concat(distinct a.rowid, ',') as rowids @@ -47,15 +34,16 @@ FROM ( group_concat(distinct coalesce(j.ref_nt_id.locus, j.ref_nt_id.name), chr(10)) as loci, total, - cast((select sum(total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = a.analysis_id) as integer) as total_reads, + cast((select sum(total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = AnalysisId) as integer) as total_reads, group_concat(distinct hs.haplotype, chr(10)) as haplotypesWithAllele from sequenceanalysis.alignment_summary a - join sequenceanalysis.alignment_summary_junction j ON (j.alignment_id = a.rowid and j.status = true) + join sequenceanalysis.alignment_summary_junction j ON (j.analysis_id = AnalysisId AND j.alignment_id = a.rowid and j.status = true) left join sequenceanalysis.haplotype_sequences hs ON (( (hs.name = j.ref_nt_id.lineage AND hs.type = 'Lineage') OR (hs.name = j.ref_nt_id.name AND hs.type = 'Allele') ) AND hs.haplotype.datedisabled IS NULL) + WHERE a.analysis_id = AnalysisId group by a.analysis_id, a.rowid, a.total ) a diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_pivoted.query.xml b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_pivoted.query.xml deleted file mode 100644 index 2876baf89..000000000 --- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_pivoted.query.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - Alignment Summary By Lineage -
-
-
-
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_pivoted.sql b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_pivoted.sql deleted file mode 100644 index 13bb7d346..000000000 --- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_pivoted.sql +++ /dev/null @@ -1,9 +0,0 @@ -SELECT - a.analysis_id, - a.lineages, - sum(a.percent) as percent - -FROM sequenceanalysis.alignment_summary_by_lineage a - -GROUP BY a.analysis_id, a.lineages -PIVOT percent BY lineages \ No newline at end of file diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.sql b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.sql index 5bfff44a0..ee61c695e 100644 --- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.sql +++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.sql @@ -1,18 +1,5 @@ -/* - * Copyright (c) 2012 LabKey Corporation - * - * 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. - */ +PARAMETERS(AnalysisId INTEGER) + select a.analysis_id, a.alleles, @@ -36,13 +23,13 @@ select group_concat(a.rowid, ',') as rowids, group_concat(distinct a.haplotypesWithAllele) as haplotypesWithAllele, - CAST((select sum(s.total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = a.analysis_id AND s.rowid IN ( - SELECT distinct asj.alignment_id from sequenceanalysis.alignment_summary_junction asj WHERE asj.ref_nt_id.locus = a.loci and asj.status = true + CAST((select sum(s.total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = AnalysisId AND s.rowid IN ( + SELECT distinct asj.alignment_id from sequenceanalysis.alignment_summary_junction asj WHERE asj.analysis_id = AnalysisId AND asj.ref_nt_id.locus = a.loci and asj.status = true ) ) as INTEGER) as total_reads_from_locus, - round(100 * (cast(sum(a.total) as float) / CASE WHEN count(a.lineages) = 0 THEN max(a.total_reads) ELSE cast((select sum(s.total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = a.analysis_id AND s.rowid IN ( - SELECT distinct asj.alignment_id from sequenceanalysis.alignment_summary_junction asj WHERE asj.ref_nt_id.locus = a.loci and asj.status = true + round(100 * (cast(sum(a.total) as float) / CASE WHEN count(a.lineages) = 0 THEN max(a.total_reads) ELSE cast((select sum(s.total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = AnalysisId AND s.rowid IN ( + SELECT distinct asj.alignment_id from sequenceanalysis.alignment_summary_junction asj WHERE asj.analysis_id = AnalysisId AND asj.ref_nt_id.locus = a.loci and asj.status = true ) ) as float) END), 2) as percent_from_locus, max(lastModified) as lastModified, @@ -67,14 +54,15 @@ FROM ( total_forward, total_reverse, valid_pairs, - (select sum(total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = a.analysis_id) as total_reads, + (select sum(total) as total FROM sequenceanalysis.alignment_summary s WHERE s.analysis_id = AnalysisId) as total_reads, max(j.modified) as lastModified from sequenceanalysis.alignment_summary a - left join sequenceanalysis.alignment_summary_junction j ON (j.alignment_id = a.rowid and j.status = true) + left join sequenceanalysis.alignment_summary_junction j ON (j.analysis_id = AnalysisId AND j.alignment_id = a.rowid and j.status = true) left join sequenceanalysis.haplotype_sequences hs ON (( (hs.name = j.ref_nt_id.lineage AND hs.type = 'Lineage') OR (hs.name = j.ref_nt_id.name AND hs.type = 'Allele') ) AND hs.haplotype.datedisabled IS NULL) + WHERE a.analysis_id = AnalysisId group by a.analysis_id, a.rowid, a.total, total_forward, total_reverse, valid_pairs ) a diff --git a/SequenceAnalysis/resources/schemas/sequenceanalysis.xml b/SequenceAnalysis/resources/schemas/sequenceanalysis.xml index 5e420b38c..661dad13f 100644 --- a/SequenceAnalysis/resources/schemas/sequenceanalysis.xml +++ b/SequenceAnalysis/resources/schemas/sequenceanalysis.xml @@ -523,15 +523,7 @@ SequenceAnalysis.window.RunExportWindow.downloadFilesForAnalysis(dataRegionName); - - SequenceAnalysis.Buttons.viewQuery(dataRegionName, {queryName: 'alignment_summary_grouped'}) - - - SequenceAnalysis.Buttons.viewQuery(dataRegionName, {queryName: 'alignment_summary_by_lineage'}) - - - SequenceAnalysis.Buttons.viewAlignmentsPivoted(dataRegionName) - + SequenceAnalysis.Buttons.viewQuery(dataRegionName, {queryName: 'haplotypeMatches'}) diff --git a/SequenceAnalysis/resources/views/sbtToGeneTable.html b/SequenceAnalysis/resources/views/sbtToGeneTable.html deleted file mode 100644 index f506f9472..000000000 --- a/SequenceAnalysis/resources/views/sbtToGeneTable.html +++ /dev/null @@ -1,454 +0,0 @@ - \ No newline at end of file diff --git a/SequenceAnalysis/resources/views/sbtToGeneTable.view.xml b/SequenceAnalysis/resources/views/sbtToGeneTable.view.xml deleted file mode 100644 index e95eaf46b..000000000 --- a/SequenceAnalysis/resources/views/sbtToGeneTable.view.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisModule.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisModule.java index 3fc642130..e6ddc71b3 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisModule.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisModule.java @@ -57,7 +57,6 @@ import org.labkey.sequenceanalysis.analysis.PrintReadBackedHaplotypesHandler; import org.labkey.sequenceanalysis.analysis.RecalculateSequenceMetricsHandler; import org.labkey.sequenceanalysis.analysis.RnaSeqcHandler; -import org.labkey.sequenceanalysis.analysis.SbtGeneCountHandler; import org.labkey.sequenceanalysis.analysis.UnmappedSequenceBasedGenotypeHandler; import org.labkey.sequenceanalysis.analysis.UpdateReadsetFilesHandler; import org.labkey.sequenceanalysis.button.AddSraRunButton; @@ -189,7 +188,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.LinkedList; import java.util.Set; @@ -389,7 +387,6 @@ public static void registerPipelineSteps() SequenceAnalysisService.get().registerFileHandler(new RnaSeqcHandler()); SequenceAnalysisService.get().registerFileHandler(new CombineStarGeneCountsHandler()); SequenceAnalysisService.get().registerFileHandler(new CombineSubreadGeneCountsHandler()); - SequenceAnalysisService.get().registerFileHandler(new SbtGeneCountHandler()); SequenceAnalysisService.get().registerFileHandler(new ProcessVariantsHandler()); SequenceAnalysisService.get().registerFileHandler(new UnmappedReadExportHandler()); SequenceAnalysisService.get().registerFileHandler(new MergeVcfsAndGenotypesHandler()); diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/analysis/SbtGeneCountHandler.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/analysis/SbtGeneCountHandler.java deleted file mode 100644 index 0ebe5e999..000000000 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/analysis/SbtGeneCountHandler.java +++ /dev/null @@ -1,118 +0,0 @@ -package org.labkey.sequenceanalysis.analysis; - -import org.json.JSONObject; -import org.labkey.api.data.Container; -import org.labkey.api.module.Module; -import org.labkey.api.module.ModuleLoader; -import org.labkey.api.pipeline.PipelineJob; -import org.labkey.api.pipeline.PipelineJobException; -import org.labkey.api.pipeline.RecordedAction; -import org.labkey.api.query.DetailsURL; -import org.labkey.api.security.User; -import org.labkey.api.sequenceanalysis.SequenceOutputFile; -import org.labkey.api.sequenceanalysis.pipeline.SequenceAnalysisJobSupport; -import org.labkey.api.sequenceanalysis.pipeline.SequenceOutputHandler; -import org.labkey.api.util.FileType; -import org.labkey.api.view.ActionURL; -import org.labkey.sequenceanalysis.SequenceAnalysisModule; - -import java.io.File; -import java.util.LinkedHashSet; -import java.util.List; - -public class SbtGeneCountHandler implements SequenceOutputHandler -{ - private final FileType _txtType = new FileType(List.of(".txt"), ".txt", false, FileType.gzSupportLevel.NO_GZ); - - public SbtGeneCountHandler() - { - - } - - @Override - public String getName() - { - return "Append SBT To Gene Counts"; - } - - @Override - public String getDescription() - { - return "This will gather SBT data associated with the readsets used to make this combined gene table, and output them as a table suitable to append or analyze in concert with this table."; - } - - @Override - public String getButtonJSHandler() - { - return null; - } - - @Override - public ActionURL getButtonSuccessUrl(Container c, User u, List outputFileIds) - { - return DetailsURL.fromString("/sequenceanalysis/sbtToGeneTable.view?outputFileId=" + outputFileIds.iterator().next(), c).getActionURL(); - } - - @Override - public boolean useWorkbooks() - { - return true; - } - - @Override - public Module getOwningModule() - { - return ModuleLoader.getInstance().getModule(SequenceAnalysisModule.class); - } - - @Override - public LinkedHashSet getClientDependencies() - { - return null; - } - - @Override - public boolean canProcess(SequenceOutputFile f) - { - return f.getCategory() != null && f.getCategory().startsWith("Gene Count Table") && (_txtType.isType(f.getFile())); - } - - @Override - public boolean doRunRemote() - { - return false; - } - - @Override - public boolean doRunLocal() - { - return false; - } - - @Override - public SequenceOutputProcessor getProcessor() - { - return new Processor(); - } - - @Override - public boolean doSplitJobs() - { - return false; - } - - private static class Processor implements SequenceOutputProcessor - { - @Override - public void processFilesOnWebserver(PipelineJob job, SequenceAnalysisJobSupport support, List inputFiles, JSONObject params, File outputDir, List actions, List outputsToCreate) throws UnsupportedOperationException, PipelineJobException - { - - } - - @Override - public void processFilesRemote(List inputFiles, JobContext ctx) throws UnsupportedOperationException, PipelineJobException - { - - } - } -} From 35e3d2ce88849b8d7a14a347443f25b91c34e1ae Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 15 Jan 2026 23:29:23 -0800 Subject: [PATCH 2/3] Remove TODOs --- .../resources/schemas/sequenceanalysis.xml | 3 +-- .../web/SequenceAnalysis/sequenceanalysisButtons.js | 11 ++++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/SequenceAnalysis/resources/schemas/sequenceanalysis.xml b/SequenceAnalysis/resources/schemas/sequenceanalysis.xml index 661dad13f..322de8124 100644 --- a/SequenceAnalysis/resources/schemas/sequenceanalysis.xml +++ b/SequenceAnalysis/resources/schemas/sequenceanalysis.xml @@ -523,9 +523,8 @@ SequenceAnalysis.window.RunExportWindow.downloadFilesForAnalysis(dataRegionName); - - SequenceAnalysis.Buttons.viewQuery(dataRegionName, {queryName: 'haplotypeMatches'}) + SequenceAnalysis.Buttons.viewMatchingHaplotypes(dataRegionName) SequenceAnalysis.Buttons.viewQuery(dataRegionName, {queryName: 'sequence_coverage'}) diff --git a/SequenceAnalysis/resources/web/SequenceAnalysis/sequenceanalysisButtons.js b/SequenceAnalysis/resources/web/SequenceAnalysis/sequenceanalysisButtons.js index e2cd084f9..df68e755c 100644 --- a/SequenceAnalysis/resources/web/SequenceAnalysis/sequenceanalysisButtons.js +++ b/SequenceAnalysis/resources/web/SequenceAnalysis/sequenceanalysisButtons.js @@ -163,7 +163,7 @@ SequenceAnalysis.Buttons = new function(){ ); }, - viewAlignmentsPivoted: function(dataRegionName){ + viewMatchingHaplotypes: function(dataRegionName){ var dataRegion = LABKEY.DataRegions[dataRegionName]; var checked = dataRegion.getChecked(); if (!checked.length){ @@ -171,11 +171,16 @@ SequenceAnalysis.Buttons = new function(){ return; } + if (checked.length !== 1) { + alert('Only one row at a time can be selected'); + return; + } + window.location = LABKEY.ActionURL.buildURL( 'sequenceanalysis', - 'lineagePivot', + 'haplotypeMatches', dataRegion.containerPath, - {analysisIds: checked.join(';')} + {'query.param.AnalysisId': checked[0]} ); }, From 0dbaa41c8c9b3a1536a14e2a5ff79bc53f7c8bf6 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 16 Jan 2026 08:11:43 -0800 Subject: [PATCH 3/3] Bugfix --- .../analysis/SequenceBasedTypingAnalysis.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/SequenceBasedTypingAnalysis.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/SequenceBasedTypingAnalysis.java index c3d9343d7..1f7847b5f 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/SequenceBasedTypingAnalysis.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/SequenceBasedTypingAnalysis.java @@ -177,7 +177,7 @@ public static void prepareLineageMapFiles(SequenceAnalysisJobSupport support, Lo continue; } - File lineageMapFile = new File(sourceDirectory, genome.getGenomeId() + "_lineageMap.txt"); + File lineageMapFile = FileUtil.appendName(sourceDirectory, genome.getGenomeId() + "_lineageMap.txt"); try (final CSVWriter writer = new CSVWriter(PrintWriters.getPrintWriter(lineageMapFile), '\t', CSVWriter.NO_QUOTE_CHARACTER)) { log.info("writing lineage map file"); @@ -227,7 +227,7 @@ public Output performAnalysisPerSampleLocal(AnalysisModel model, File inputBam, throw new PipelineJobException("Genome not found: " + model.getLibraryId()); } - File lineageMapFile = new File(getPipelineCtx().getSourceDirectory(), referenceGenome.getGenomeId() + "_lineageMap.txt"); + File lineageMapFile = FileUtil.appendName(getPipelineCtx().getSourceDirectory(), referenceGenome.getGenomeId() + "_lineageMap.txt"); if (lineageMapFile.exists()) { getPipelineCtx().getLogger().debug("deleting lineage map file: " + lineageMapFile.getName()); @@ -264,8 +264,8 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc BamIterator bi = new BamIterator(inputBam, referenceGenome.getWorkingFastaFile(), getPipelineCtx().getLogger()); List aggregators = new ArrayList<>(); - File workDir = new File(getPipelineCtx().getSourceDirectory(), FileUtil.getBaseName(inputBam)); - File sbtOutputLog = new File(workDir, FileUtil.getBaseName(inputBam) + ".sbt.txt.gz"); + File workDir = FileUtil.appendName(getPipelineCtx().getSourceDirectory(), FileUtil.getBaseName(inputBam)); + File sbtOutputLog = FileUtil.appendName(workDir, FileUtil.getBaseName(inputBam) + ".sbt.txt.gz"); SequenceBasedTypingAlignmentAggregator agg = new SequenceBasedTypingAlignmentAggregator(getPipelineCtx().getLogger(), referenceGenome.getWorkingFastaFile(), avgBaseQualityAggregator, toolParams); if (getProvider().getParameterByName("writeLog").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Boolean.class, false)) @@ -277,7 +277,7 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc agg.setOutputLog(sbtOutputLog); } - File lineageMapFile = new File(getPipelineCtx().getSourceDirectory(), referenceGenome.getGenomeId() + "_lineageMap.txt"); + File lineageMapFile = FileUtil.appendName(getPipelineCtx().getSourceDirectory(), referenceGenome.getGenomeId() + "_lineageMap.txt"); if (lineageMapFile.exists()) { getPipelineCtx().getLogger().debug("using lineage map: " + lineageMapFile.getName()); @@ -371,7 +371,7 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc protected File getSBTSummaryFile(File outputDir, File bam) { - return new File(outputDir, FileUtil.getBaseName(bam) + ".sbt_hits.txt.gz"); + return FileUtil.appendName(outputDir, FileUtil.getBaseName(bam) + ".sbt_hits.txt.gz"); } public static class AlignmentGroupCompare @@ -383,7 +383,9 @@ public AlignmentGroupCompare(final long analysisId, Container c, User u) { this.analysisId = analysisId; - new TableSelector(QueryService.get().getUserSchema(u, c, "sequenceanalysis").getTable("alignment_summary_grouped"), PageFlowUtil.set("analysis_id", "alleles", "lineages", "totalLineages", "total_reads", "total_forward", "total_reverse", "valid_pairs", "rowids"), new SimpleFilter(FieldKey.fromString("analysis_id"), analysisId), null).forEachResults(rs -> { + TableSelector ts = new TableSelector(QueryService.get().getUserSchema(u, c, "sequenceanalysis").getTable("alignment_summary_grouped"), PageFlowUtil.set("analysis_id", "alleles", "lineages", "totalLineages", "total_reads", "total_forward", "total_reverse", "valid_pairs", "rowids"), new SimpleFilter(FieldKey.fromString("analysis_id"), analysisId), null); + ts.setNamedParameters(Map.of("AnalysisId", this.analysisId)); + ts.forEachResults(rs -> { if (rs.getString(FieldKey.fromString("alleles")) == null) { return;