diff --git a/SequenceAnalysis/api-src/org/labkey/api/sequenceanalysis/RefNtSequenceModel.java b/SequenceAnalysis/api-src/org/labkey/api/sequenceanalysis/RefNtSequenceModel.java
index 71d236c70..3ae8eab22 100644
--- a/SequenceAnalysis/api-src/org/labkey/api/sequenceanalysis/RefNtSequenceModel.java
+++ b/SequenceAnalysis/api-src/org/labkey/api/sequenceanalysis/RefNtSequenceModel.java
@@ -418,7 +418,7 @@ public byte[] getSequenceBases()
public void createFileForSequence(User u, String sequence, @Nullable File outDir) throws IOException
{
- File output = getExpectedSequenceFile();
+ File output = getExpectedSequenceFile(outDir);
if (output.exists())
{
output.delete();
@@ -443,9 +443,9 @@ public void createFileForSequence(User u, String sequence, @Nullable File outDir
Table.update(u, ti, this, _rowid);
}
- public File getExpectedSequenceFile() throws IllegalArgumentException
+ public File getExpectedSequenceFile(@Nullable File outDir) throws IllegalArgumentException
{
- return FileUtil.appendName(getHashedDir(true), _rowid + ".txt.gz");
+ return FileUtil.appendName(getSequenceFileBaseDir(outDir, true), _rowid + ".txt.gz");
}
private Container getLabKeyContainer()
@@ -553,23 +553,15 @@ public File getOffsetsFile()
return FileUtil.appendName(d.getFile().getParentFile(), getRowid() + "_offsets.txt");
}
- private File getHashedDir(boolean create)
+ private File getSequenceFileBaseDir(@Nullable File outDir, boolean create)
{
- File baseDir = getBaseSequenceDir();
- String digest = Crypt.MD5.digest(String.valueOf(getRowid()));
+ outDir = outDir == null ? getBaseSequenceDir() : outDir;
- baseDir = FileUtil.appendName(baseDir, digest.substring(0,4));
- baseDir = FileUtil.appendName(baseDir, digest.substring(4,8));
- baseDir = FileUtil.appendName(baseDir, digest.substring(8,12));
- baseDir = FileUtil.appendName(baseDir, digest.substring(12,20));
- baseDir = FileUtil.appendName(baseDir, digest.substring(20,28));
- baseDir = FileUtil.appendName(baseDir, digest.substring(28,32));
-
- if (create)
+ if (create && !outDir.exists())
{
- baseDir.mkdirs();
+ outDir.mkdirs();
}
- return baseDir;
+ return outDir;
}
}
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.query.xml b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.query.xml
index f4f2e91b2..d78f3a033 100644
--- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.query.xml
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.query.xml
@@ -9,6 +9,14 @@
truetrue
+
+ Analysis Id
+
+ sequenceanalysis
+ sequence_analyses
+ rowid
+
+ 150
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.sql b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.sql
index 7ab8394a5..544b2d361 100644
--- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.sql
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage.sql
@@ -1,51 +1,45 @@
-PARAMETERS(AnalysisId INTEGER)
-
-select
- (CAST(AnalysisId as varchar) || '<>' || a.lineages) as key,
- a.analysis_id,
- a.lineages,
- max(a.totalLineages) as totalLineages,
- a.loci,
-
- sum(a.total) as total,
- max(a.total_reads) as total_reads,
- 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 = 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 = 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
+SELECT
+ t.*,
+ CASE WHEN t.total_reads_from_locus = 0 THEN 0 ELSE round(100 * (cast(t.total_reads as float) / cast(t.total_reads_from_locus as float)), 2) END as percent_from_locus,
FROM (
-
- select
- a.analysis_id,
- a.rowid,
-
- group_concat(distinct coalesce(j.ref_nt_id.lineage, j.ref_nt_id.name), chr(10)) as lineages,
- count(distinct j.ref_nt_id.lineage) as totalLineages,
- 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 = 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.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
-
-GROUP BY a.analysis_id, a.lineages, a.loci
+ SELECT
+ (CAST(a.analysis_id as varchar) || '<>' || a.lineages) as key,
+ a.analysis_id,
+ max(a.lineages) as lineages,
+ coalesce(max(a.totalLineages), 0) as totalLineages,
+ a.loci,
+
+ sum(a.total) as total_reads,
+ max(a.total_reads_in_analysis) as total_reads_in_analysis,
+ CASE WHEN max(a.total_reads_in_analysis) = 0 THEN 0 ELSE round(100 * (cast(sum(a.total) as float) / cast(max(a.total_reads_in_analysis) as float)), 2) END as percent,
+
+ group_concat(a.rowid, ',') as rowids,
+ group_concat(distinct a.haplotypesWithAllele) as haplotypesWithAllele,
+
+ max(a.total_reads_from_locus) as total_reads_from_locus,
+ max(a.lastModified) as lastModified,
+ count(distinct a.rowid) as nAlignments
+
+ FROM (
+
+ select
+ ac.analysis_id,
+ ac.rowid,
+
+ group_concat(distinct coalesce(ac.lineage, ac.ntName), chr(10)) as lineages,
+ count(distinct ac.lineage) as totalLineages,
+ group_concat(distinct coalesce(ac.locus, ac.ntName), chr(10)) as loci,
+
+ group_concat(distinct haplotypesWithAllele, chr(10)) as haplotypesWithAllele,
+
+ max(ac.total) as total,
+ max(ac.total_reads_in_analysis) as total_reads_in_analysis,
+ max(ac.total_reads_from_locus) as total_reads_from_locus,
+ max(ac.modified) as lastModified
+ from sequenceanalysis.alignment_summary_combined ac
+ group by ac.analysis_id, ac.rowid, ac.total
+ ) a
+
+ GROUP BY a.analysis_id, a.lineages, a.loci
+) t
\ No newline at end of file
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage/.qview.xml b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage/.qview.xml
index 7b6dac64b..9c03eeb42 100644
--- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage/.qview.xml
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage/.qview.xml
@@ -19,8 +19,8 @@
-
+
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage/With Haplotype Matches.qview.xml b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage/With Haplotype Matches.qview.xml
index 1b4726c31..185a76068 100644
--- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage/With Haplotype Matches.qview.xml
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage/With Haplotype Matches.qview.xml
@@ -19,8 +19,8 @@
-
+
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_orig.sql b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_orig.sql
new file mode 100644
index 000000000..7ab8394a5
--- /dev/null
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_by_lineage_orig.sql
@@ -0,0 +1,51 @@
+PARAMETERS(AnalysisId INTEGER)
+
+select
+ (CAST(AnalysisId as varchar) || '<>' || a.lineages) as key,
+ a.analysis_id,
+ a.lineages,
+ max(a.totalLineages) as totalLineages,
+ a.loci,
+
+ sum(a.total) as total,
+ max(a.total_reads) as total_reads,
+ 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 = 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 = 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
+
+FROM (
+
+ select
+ a.analysis_id,
+ a.rowid,
+
+ group_concat(distinct coalesce(j.ref_nt_id.lineage, j.ref_nt_id.name), chr(10)) as lineages,
+ count(distinct j.ref_nt_id.lineage) as totalLineages,
+ 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 = 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.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
+
+GROUP BY a.analysis_id, a.lineages, a.loci
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_combined.query.xml b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_combined.query.xml
new file mode 100644
index 000000000..b96e6d860
--- /dev/null
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_combined.query.xml
@@ -0,0 +1,23 @@
+
+
+
+
+ Alignment Summary, Combined
+
+
+ Total First-Mate Reads
+ The column shows the number of alignments that contain a first-mate or singleton read
+
+
+ Total Second-Mate Reads
+ The column shows the number of alignments that contain a second-mate read
+
+
+ Total Valid Pairs
+ The column shows the number of alignments that contain valid paired reads (both forward and reverse)
+
+
+
+
+
+
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.query.xml b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.query.xml
index 4f755a30e..9eb153f0d 100644
--- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.query.xml
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.query.xml
@@ -6,6 +6,14 @@
Alignment Summaryrowids
+
+ Analysis Id
+
+ sequenceanalysis
+ sequence_analyses
+ rowid
+
+ RowIdstrue
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.sql b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.sql
index ee61c695e..62f16b6e4 100644
--- a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.sql
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped.sql
@@ -1,70 +1,55 @@
-PARAMETERS(AnalysisId INTEGER)
-
-select
- a.analysis_id,
- a.alleles,
- a.alleleIds,
- max(a.lineages) as lineages,
- coalesce(max(a.totalLineages), 0) as totalLineages,
- a.loci,
-
- sum(a.total) as total_reads,
- sum(a.total_forward) as total_forward,
- sum(a.total_reverse) as total_reverse,
- sum(a.valid_pairs) as valid_pairs,
- max(cast(a.total_reads as integer)) as total_reads_in_analysis,
- --max(a.loci_total_reads) as total_reads_in_analysis_from_locus,
- CASE WHEN max(a.total_reads) = 0 THEN 0 ELSE round(100 * (cast(sum(a.total) as float) / cast(max(a.total_reads) as float)), 2) END as percent,
--- case
--- when (cast(sum(a.total) as float) / cast(max(a.total_reads) as float)) >= .04 THEN 'Major'
--- else 'Minor'
--- end as category,
-
- 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 = 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 = 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,
- count(distinct a.rowid) as nAlignments,
- max(a.nloci) as nLoci
+SELECT
+ t.*,
+ CASE WHEN t.total_reads_from_locus = 0 THEN 0 ELSE round(100 * (cast(t.total_reads as float) / cast(t.total_reads_from_locus as float)), 2) END as percent_from_locus,
FROM (
-
- select
- a.analysis_id,
- a.rowid,
-
- group_concat(distinct j.ref_nt_id) as alleleIds,
- group_concat(distinct j.ref_nt_id.name, chr(10)) as alleles,
- group_concat(distinct j.ref_nt_id.lineage, chr(10)) as lineages,
- count(distinct j.ref_nt_id.lineage) as totalLineages,
- group_concat(distinct j.ref_nt_id.locus, chr(10)) as loci,
- count(distinct j.ref_nt_id.locus) as nloci,
- group_concat(distinct hs.haplotype, chr(10)) as haplotypesWithAllele,
-
- total,
- total_forward,
- total_reverse,
- valid_pairs,
- (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.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
-
-GROUP BY a.analysis_id, a.alleles, a.alleleIds, a.loci
+ SELECT
+ a.analysis_id,
+ a.alleles,
+ a.alleleIds,
+ max(a.lineages) as lineages,
+ coalesce(max(a.totalLineages), 0) as totalLineages,
+ a.loci,
+
+ sum(a.total) as total_reads,
+ sum(a.total_forward) as total_forward,
+ sum(a.total_reverse) as total_reverse,
+ sum(a.valid_pairs) as valid_pairs,
+ max(a.total_reads_in_analysis) as total_reads_in_analysis,
+ CASE WHEN max(a.total_reads_in_analysis) = 0 THEN 0 ELSE round(100 * (cast(sum(a.total) as float) / cast(max(a.total_reads_in_analysis) as float)), 2) END as percent,
+
+ group_concat(a.rowid, ',') as rowids,
+ group_concat(distinct a.haplotypesWithAllele) as haplotypesWithAllele,
+
+ max(a.total_reads_from_locus) as total_reads_from_locus,
+ max(a.lastModified) as lastModified,
+ count(distinct a.rowid) as nAlignments,
+ max(a.nloci) as nLoci
+
+ FROM (
+
+ select
+ ac.analysis_id,
+ ac.rowid,
+
+ group_concat(distinct ac.ref_nt_id) as alleleIds,
+ group_concat(distinct ac.ntName, chr(10)) as alleles,
+ group_concat(distinct ac.lineage, chr(10)) as lineages,
+ count(distinct ac.lineage) as totalLineages,
+ group_concat(distinct ac.locus, chr(10)) as loci,
+ count(distinct ac.locus) as nloci,
+ group_concat(distinct haplotypesWithAllele, chr(10)) as haplotypesWithAllele,
+
+ max(ac.total) as total,
+ max(ac.total_forward) as total_forward,
+ max(ac.total_reverse) as total_reverse,
+ max(ac.valid_pairs) as valid_pairs,
+ max(ac.total_reads_in_analysis) as total_reads_in_analysis,
+ max(ac.total_reads_from_locus) as total_reads_from_locus,
+ max(ac.modified) as lastModified
+ from sequenceanalysis.alignment_summary_combined ac
+ group by ac.analysis_id, ac.rowid
+ ) a
+
+ GROUP BY a.analysis_id, a.alleles, a.alleleIds, a.loci
+) t
\ No newline at end of file
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped_orig.sql b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped_orig.sql
new file mode 100644
index 000000000..ee61c695e
--- /dev/null
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/alignment_summary_grouped_orig.sql
@@ -0,0 +1,70 @@
+PARAMETERS(AnalysisId INTEGER)
+
+select
+ a.analysis_id,
+ a.alleles,
+ a.alleleIds,
+ max(a.lineages) as lineages,
+ coalesce(max(a.totalLineages), 0) as totalLineages,
+ a.loci,
+
+ sum(a.total) as total_reads,
+ sum(a.total_forward) as total_forward,
+ sum(a.total_reverse) as total_reverse,
+ sum(a.valid_pairs) as valid_pairs,
+ max(cast(a.total_reads as integer)) as total_reads_in_analysis,
+ --max(a.loci_total_reads) as total_reads_in_analysis_from_locus,
+ CASE WHEN max(a.total_reads) = 0 THEN 0 ELSE round(100 * (cast(sum(a.total) as float) / cast(max(a.total_reads) as float)), 2) END as percent,
+-- case
+-- when (cast(sum(a.total) as float) / cast(max(a.total_reads) as float)) >= .04 THEN 'Major'
+-- else 'Minor'
+-- end as category,
+
+ 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 = 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 = 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,
+ count(distinct a.rowid) as nAlignments,
+ max(a.nloci) as nLoci
+
+FROM (
+
+ select
+ a.analysis_id,
+ a.rowid,
+
+ group_concat(distinct j.ref_nt_id) as alleleIds,
+ group_concat(distinct j.ref_nt_id.name, chr(10)) as alleles,
+ group_concat(distinct j.ref_nt_id.lineage, chr(10)) as lineages,
+ count(distinct j.ref_nt_id.lineage) as totalLineages,
+ group_concat(distinct j.ref_nt_id.locus, chr(10)) as loci,
+ count(distinct j.ref_nt_id.locus) as nloci,
+ group_concat(distinct hs.haplotype, chr(10)) as haplotypesWithAllele,
+
+ total,
+ total_forward,
+ total_reverse,
+ valid_pairs,
+ (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.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
+
+GROUP BY a.analysis_id, a.alleles, a.alleleIds, a.loci
diff --git a/SequenceAnalysis/resources/queries/sequenceanalysis/ref_nt_sequences.js b/SequenceAnalysis/resources/queries/sequenceanalysis/ref_nt_sequences.js
index 8da0548d5..3bd8bd62d 100644
--- a/SequenceAnalysis/resources/queries/sequenceanalysis/ref_nt_sequences.js
+++ b/SequenceAnalysis/resources/queries/sequenceanalysis/ref_nt_sequences.js
@@ -61,4 +61,21 @@ function beforeDelete(row, errors){
if (!this.extraContext.deleteFromServer) {
errors._form = 'You cannot directly delete reference sequences. To delete these records, use the delete button above the sequences grid.';
}
+ else {
+ const errorMessage = triggerHelper.canDeleteNtRecord(row.rowid);
+ if (errorMessage) {
+ errors._form = 'The sequence ' + row.rowid + ' cannot be deleted: ' + errorMessage;
+ }
+ }
+}
+
+function afterDelete(row, errors){
+ if (this.extraContext.deleteFromServer) {
+ // Ensure no genomes use this, and then delete the sequence file:
+ triggerHelper.safeDeleteNtRecord(row.rowid)
+ }
+ else {
+ // This should be blocked in beforeDelete
+ errors._form = 'You cannot directly delete reference sequences. To delete these records, use the delete button above the sequences grid.';
+ }
}
diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java
index 63ce77d1b..25a8b5268 100644
--- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java
+++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisController.java
@@ -157,6 +157,7 @@
import org.labkey.sequenceanalysis.pipeline.SequenceAlignmentJob;
import org.labkey.sequenceanalysis.pipeline.SequenceConcatPipelineJob;
import org.labkey.sequenceanalysis.pipeline.SequenceJob;
+import org.labkey.sequenceanalysis.pipeline.SequenceMigrationPipelineJob;
import org.labkey.sequenceanalysis.pipeline.SequenceOutputHandlerJob;
import org.labkey.sequenceanalysis.pipeline.SequenceReadsetHandlerJob;
import org.labkey.sequenceanalysis.pipeline.SequenceTaskHelper;
@@ -5251,4 +5252,39 @@ public void setDataFileUrl(String dataFileUrl)
_dataFileUrl = dataFileUrl;
}
}
+
+ @UtilityAction(label = "Migrate Sequence Files", description = "This will start a background process to migrate sequence files from the flat .sequences folder into a hashed multi-folder scheme")
+ @RequiresSiteAdmin
+ public static class MigrateSequenceFilesAction extends ConfirmAction