From 38b4aaf27086b4f584263255a3651bda1fde6db2 Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 14 Dec 2023 09:26:11 -0800 Subject: [PATCH 01/16] Correct operator for Rare Variants filter --- jbrowse/src/org/labkey/jbrowse/JBrowseLuceneSearch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jbrowse/src/org/labkey/jbrowse/JBrowseLuceneSearch.java b/jbrowse/src/org/labkey/jbrowse/JBrowseLuceneSearch.java index 4d3e3dac6..5176ddcdc 100644 --- a/jbrowse/src/org/labkey/jbrowse/JBrowseLuceneSearch.java +++ b/jbrowse/src/org/labkey/jbrowse/JBrowseLuceneSearch.java @@ -297,7 +297,7 @@ public List getPromotedFilters(Collection indexedFields, Contain List ret = new ArrayList<>(); if (indexedFields.contains("AF")) { - ret.add("Rare Variants|AF,>,0.05"); + ret.add("Rare Variants|AF,<,0.05"); } return ret; From 008794468bbb94dc1f79ee117d0368f6dad26096 Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 14 Dec 2023 12:40:19 -0800 Subject: [PATCH 02/16] Support additional lucene/VCF fields --- .../org/labkey/jbrowse/JBrowseController.java | 2 +- .../org/labkey/jbrowse/JBrowseFieldUtils.java | 43 ++++++++++++++----- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/jbrowse/src/org/labkey/jbrowse/JBrowseController.java b/jbrowse/src/org/labkey/jbrowse/JBrowseController.java index acd5afd92..3ddfd7be9 100644 --- a/jbrowse/src/org/labkey/jbrowse/JBrowseController.java +++ b/jbrowse/src/org/labkey/jbrowse/JBrowseController.java @@ -861,7 +861,7 @@ public ApiResponse execute(ResolveVcfFieldsForm form, BindException errors) if (form.isIncludeDefaultFields()) { JBrowseFieldUtils.DEFAULT_FIELDS.forEach((key, val) -> ret.put(key, val.toJSON())); - ret.put(JBrowseFieldUtils.VARIABLE_SAMPLES, JBrowseFieldUtils.getVariableSamplesField(null).toJSON()); + JBrowseFieldUtils.getGenotypeDependentFields(null).forEach((key, val) -> ret.put(key, val.toJSON())); } for (String key : form.getInfoKeys()) diff --git a/jbrowse/src/org/labkey/jbrowse/JBrowseFieldUtils.java b/jbrowse/src/org/labkey/jbrowse/JBrowseFieldUtils.java index f7eab9802..0633774f2 100644 --- a/jbrowse/src/org/labkey/jbrowse/JBrowseFieldUtils.java +++ b/jbrowse/src/org/labkey/jbrowse/JBrowseFieldUtils.java @@ -4,8 +4,8 @@ import htsjdk.variant.vcf.VCFHeader; import htsjdk.variant.vcf.VCFHeaderLineType; import htsjdk.variant.vcf.VCFInfoHeaderLine; -import org.jetbrains.annotations.Nullable; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.Nullable; import org.labkey.api.data.Container; import org.labkey.api.jbrowse.JBrowseFieldDescriptor; import org.labkey.api.security.User; @@ -14,7 +14,7 @@ import org.labkey.jbrowse.model.JsonFile; import java.io.File; -import java.util.Arrays; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -23,6 +23,11 @@ public class JBrowseFieldUtils private static final Logger _log = LogHelper.getLogger(JBrowseFieldUtils.class, "Logger for JBrowseFieldUtils"); public static final String VARIABLE_SAMPLES = "variableSamples"; + public static final String N_HET = "nHet"; + public static final String N_HOMVAR = "nHomVar"; + public static final String N_CALLED = "nCalled"; + public static final String FRACTION_HET = "fractionHet"; + // These fields are always indexed in DISCVRSeq, and present in all VCFs (or created client-side in ExtendedVariantAdapter public static final Map DEFAULT_FIELDS = new LinkedHashMap<>() {{ @@ -37,7 +42,7 @@ public class JBrowseFieldUtils public static Map getIndexedFields(JsonFile jsonFile, User u, Container c) { Map ret = new LinkedHashMap<>(DEFAULT_FIELDS); - ret.put(VARIABLE_SAMPLES, getVariableSamplesField(jsonFile)); + ret.putAll(getGenotypeDependentFields(jsonFile)); File vcf = jsonFile.getTrackFile(); if (!vcf.exists()) @@ -67,22 +72,40 @@ public static Map getIndexedFields(JsonFile json return ret; } - public static JBrowseFieldDescriptor getVariableSamplesField(@Nullable JsonFile jsonFile) { - JBrowseFieldDescriptor field = new JBrowseFieldDescriptor(VARIABLE_SAMPLES, "All samples with this variant", true, true, VCFHeaderLineType.Character, 7).multiValued(true).label("Samples With Variant"); + public static Map getGenotypeDependentFields(@Nullable JsonFile jsonFile) { + Map ret = new HashMap<>(); + ret.put(VARIABLE_SAMPLES, new JBrowseFieldDescriptor(VARIABLE_SAMPLES, "All samples with this variant", true, true, VCFHeaderLineType.Character, 7).multiValued(true).label("Samples With Variant")); + + // TODO: restore these once existing indexes are regenerated: + // ret.put(N_HET, new JBrowseFieldDescriptor(N_HET, "The number of samples with this allele that are heterozygous", false, true, VCFHeaderLineType.Integer, 9).label("# Heterozygotes")); + // ret.put(N_HOMVAR, new JBrowseFieldDescriptor(N_HOMVAR, "The number of samples with this allele that are homozygous", false, true, VCFHeaderLineType.Integer, 9).label("# Homozygous Variant")); + // ret.put(N_CALLED, new JBrowseFieldDescriptor(N_CALLED, "The number of samples with called genotypes at this position", false, true, VCFHeaderLineType.Integer, 9).label("# Genotypes Called")); + // ret.put(FRACTION_HET, new JBrowseFieldDescriptor(FRACTION_HET, "The fraction of samples with this allele that are heterozygous", false, true, VCFHeaderLineType.Float, 9).label("Fraction Heterozygotes")); + if (jsonFile != null) { File vcf = jsonFile.getTrackFile(); if (vcf == null || !vcf.exists()) { String msg = "Unable to find VCF file for track: " + jsonFile.getObjectId(); _log.error(msg + ", expected: " + (vcf == null ? "null" : vcf.getPath())); - return null; } - - try (VCFFileReader reader = new VCFFileReader(vcf)) { - field.allowableValues(reader.getHeader().getSampleNamesInOrder()); + else + { + try (VCFFileReader reader = new VCFFileReader(vcf)) + { + VCFHeader header = reader.getHeader(); + if (!header.hasGenotypingData()) + { + ret.clear(); + } + else + { + ret.get(VARIABLE_SAMPLES).allowableValues(header.getSampleNamesInOrder()); + } + } } } - return field; + return ret; } From f67beacae95ea3344aa69b26291653ecd814b96d Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 14 Dec 2023 13:51:18 -0800 Subject: [PATCH 03/16] Add step for bcftools/fill-tags --- .../SequenceAnalysisModule.java | 2 + .../run/analysis/BcftoolsFillTagsStep.java | 117 ++++++++++++++++++ .../run/variant/VariantAnnotatorStep.java | 2 +- 3 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisModule.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisModule.java index 529f2227a..f392f46b5 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisModule.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisModule.java @@ -78,6 +78,7 @@ import org.labkey.sequenceanalysis.run.alignment.StarWrapper; import org.labkey.sequenceanalysis.run.alignment.VulcanWrapper; import org.labkey.sequenceanalysis.run.analysis.BamIterator; +import org.labkey.sequenceanalysis.run.analysis.BcftoolsFillTagsStep; import org.labkey.sequenceanalysis.run.analysis.ExportOverlappingReadsAnalysis; import org.labkey.sequenceanalysis.run.analysis.GenrichStep; import org.labkey.sequenceanalysis.run.analysis.HaplotypeCallerAnalysis; @@ -312,6 +313,7 @@ public static void registerPipelineSteps() SequencePipelineService.get().registerPipelineStep(new KingInferenceStep.Provider()); SequencePipelineService.get().registerPipelineStep(new MendelianViolationReportStep.Provider()); SequencePipelineService.get().registerPipelineStep(new SummarizeGenotypeQualityStep.Provider()); + SequencePipelineService.get().registerPipelineStep(new BcftoolsFillTagsStep.Provider()); //handlers SequenceAnalysisService.get().registerFileHandler(new LiftoverHandler()); diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java new file mode 100644 index 000000000..bdbb1fcd0 --- /dev/null +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java @@ -0,0 +1,117 @@ +package org.labkey.sequenceanalysis.run.analysis; + +import htsjdk.samtools.util.Interval; +import org.apache.commons.lang3.StringUtils; +import org.json.JSONObject; +import org.labkey.api.pipeline.PipelineJobException; +import org.labkey.api.sequenceanalysis.pipeline.AbstractVariantProcessingStepProvider; +import org.labkey.api.sequenceanalysis.pipeline.BcftoolsRunner; +import org.labkey.api.sequenceanalysis.pipeline.PipelineContext; +import org.labkey.api.sequenceanalysis.pipeline.PipelineStepProvider; +import org.labkey.api.sequenceanalysis.pipeline.ReferenceGenome; +import org.labkey.api.sequenceanalysis.pipeline.SequencePipelineService; +import org.labkey.api.sequenceanalysis.pipeline.ToolParameterDescriptor; +import org.labkey.api.sequenceanalysis.pipeline.VariantProcessingStep; +import org.labkey.api.sequenceanalysis.pipeline.VariantProcessingStepOutputImpl; +import org.labkey.api.sequenceanalysis.run.AbstractCommandPipelineStep; +import org.labkey.sequenceanalysis.pipeline.SequenceTaskHelper; +import org.labkey.sequenceanalysis.run.variant.VariantAnnotatorStep; + +import javax.annotation.Nullable; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class BcftoolsFillTagsStep extends AbstractCommandPipelineStep implements VariantProcessingStep +{ + public BcftoolsFillTagsStep(PipelineStepProvider provider, PipelineContext ctx) + { + super(provider, ctx, new BcftoolsRunner(ctx.getLogger())); + } + + public static class Provider extends AbstractVariantProcessingStepProvider implements VariantProcessingStep.RequiresPedigree, VariantProcessingStep.SupportsScatterGather + { + public Provider() + { + super("BcftoolsFillTagsStep", "Bcftools Fill-tags", "bcftools", "Annotate variants using bcftools fill-tags", Arrays.asList( + ToolParameterDescriptor.create("hwe", "HWE", "If selected, HWE will be annotated", "checkbox", new JSONObject(){{ + put("checked", false); + }}, null), + ToolParameterDescriptor.create("exchet", "Excess Het", "If selected, ExcHet will be annotated.", "checkbox", new JSONObject(){{ + put("checked", true); + }}, null) + ), null, ""); + } + + @Override + public VariantAnnotatorStep create(PipelineContext ctx) + { + return new VariantAnnotatorStep(this, ctx); + } + } + + @Override + public VariantProcessingStep.Output processVariants(File inputVCF, File outputDirectory, ReferenceGenome genome, @Nullable List intervals) throws PipelineJobException + { + VariantProcessingStepOutputImpl output = new VariantProcessingStepOutputImpl(); + + List options = new ArrayList<>(); + options.add(getWrapper().getBcfToolsPath().getPath()); + options.add("+fill-tags"); + + options.add(inputVCF.getPath()); + + if (intervals != null) + { + options.add("--regions"); + options.add(intervals.stream().map(interval -> interval.getContig() + ":" + interval.getStart() + "-" + interval.getEnd()).collect(Collectors.joining(","))); + } + + options.add("-O"); + options.add("z9"); + + Integer threads = SequencePipelineService.get().getMaxThreads(getPipelineCtx().getLogger()); + if (threads != null) + { + options.add("--threads"); + options.add(threads.toString()); + } + + File outputVcf = new File(outputDirectory, SequenceTaskHelper.getUnzippedBaseName(inputVCF) + ".ft.vcf.gz"); + options.add("-o"); + options.add(outputVcf.getPath()); + + List annotations = new ArrayList<>(); + if (getProvider().getParameterByName("hwe").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Boolean.class, false)) + { + annotations.add("hwe"); + } + + if (getProvider().getParameterByName("exchet").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Boolean.class, false)) + { + annotations.add("exchet"); + } + + if (annotations.isEmpty()) + { + throw new PipelineJobException("No annotations were selected"); + } + + options.add("-T"); + options.add(StringUtils.join(annotations, ",")); + + options.add("--write-index"); + + getWrapper().execute(options); + if (!outputVcf.exists()) + { + throw new PipelineJobException("output not found: " + outputVcf); + } + + output.setVcf(outputVcf); + + return output; + } +} diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/variant/VariantAnnotatorStep.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/variant/VariantAnnotatorStep.java index 3fd6bef0c..80a56457b 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/variant/VariantAnnotatorStep.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/variant/VariantAnnotatorStep.java @@ -28,7 +28,7 @@ */ public class VariantAnnotatorStep extends AbstractCommandPipelineStep implements VariantProcessingStep { - public VariantAnnotatorStep(PipelineStepProvider provider, PipelineContext ctx) + public VariantAnnotatorStep(PipelineStepProvider provider, PipelineContext ctx) { super(provider, ctx, new VariantAnnotatorWrapper(ctx.getLogger())); } From 5f1d17915b62eaf8b5bec5d3cbf69d3c5fc8dbd0 Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 14 Dec 2023 15:21:30 -0800 Subject: [PATCH 04/16] Add ManageVersion: false --- QueryExtensions/module.properties | 1 + Studies/module.properties | 1 + 2 files changed, 2 insertions(+) diff --git a/QueryExtensions/module.properties b/QueryExtensions/module.properties index 3044be8be..332aea9fe 100644 --- a/QueryExtensions/module.properties +++ b/QueryExtensions/module.properties @@ -1,4 +1,5 @@ ModuleClass: org.labkey.queryextensions.QueryExtensionsModule +ManageVersion: false Label: Query Extensions Description: This module contains low-level extensions to the LabKey Query layer License: Apache 2.0 diff --git a/Studies/module.properties b/Studies/module.properties index 917308d33..2ea06c569 100644 --- a/Studies/module.properties +++ b/Studies/module.properties @@ -3,3 +3,4 @@ Label: Studies Description: Extensions to the study framework, designed to more flexibly manage multiple study designs from one source of data License: Apache 2.0 LicenseURL: http://www.apache.org/licenses/LICENSE-2.0 +ManageVersion: false \ No newline at end of file From d508c9a242393d35bf0cc93384884f218716f379 Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 14 Dec 2023 16:12:06 -0800 Subject: [PATCH 05/16] Add option to output variant table from LoFreq --- .../run/analysis/LofreqAnalysis.java | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java index 561b7cf7d..0a6306843 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java @@ -110,9 +110,22 @@ public Provider() put("width", 400); put("allowBlank", true); }}, null), + ToolParameterDescriptor.create("generateConsensus", "Generate Consensus", "If selected, a FASTA with the simple majority consensus will be generated.", "checkbox", new JSONObject() + {{ + + }}, false), ToolParameterDescriptor.create("minCoverage", "Min Coverage For Consensus", "If provided, a consensus will only be called over regions with at least this depth", "ldk-integerfield", new JSONObject(){{ put("minValue", 0); }}, 25), + ToolParameterDescriptor.create("generateTable", "Generate Variant Table", "If selected, a TSV listing variants above the given threshold will be generated.", "checkbox", new JSONObject() + {{ + + }}, false), + ToolParameterDescriptor.create("minFractionForTable", "Min Fraction for Table", "If the option to generate a table output is used, only variants with frequency of this threshold will be included", "ldk-numberfield", new JSONObject(){{ + put("minValue", 0); + put("maxValue", 0); + put("decimalPrecision", 3); + }}, 0.01), ToolParameterDescriptor.createExpDataParam("primerBedFile", "Primer Sites (BED File)", "This is a BED file specifying the primer binding sites, which will be used to flag variants. Strandedness is ignored.", "ldk-expdatafield", new JSONObject() {{ put("allowBlank", true); @@ -470,6 +483,10 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc } double minFractionForConsensus = getProvider().getParameterByName("minFractionForConsensus").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Double.class, 0.0); + boolean generateConsensus = getProvider().getParameterByName("generateConsensus").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Boolean.class, false); + + boolean generateTable = getProvider().getParameterByName("generateTable").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Boolean.class, false); + double minFractionForTable = getProvider().getParameterByName("minFractionForTable").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Double.class, 0.0); Integer primerDataId = getProvider().getParameterByName("primerBedFile").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Integer.class); List primerIntervals = new ArrayList<>(); @@ -517,11 +534,12 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc File loFreqConsensusVcf = getConsensusVcf(outputDir, inputBam); File loFreqAllVcf = getAllVcf(outputDir, inputBam); + File tableFile = getTableFile(outputDir, inputBam); Double strandBiasRecoveryAF = getProvider().getParameterByName("strandBiasRecoveryAF").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Double.class, 1.0); SAMSequenceDictionary dict = SAMSequenceDictionaryExtractor.extractDictionary(referenceGenome.getSequenceDictionary().toPath()); VariantContextWriterBuilder writerBuilderConsensus = new VariantContextWriterBuilder().setOutputFile(loFreqConsensusVcf).setReferenceDictionary(dict); VariantContextWriterBuilder writerBuilderAll = new VariantContextWriterBuilder().setOutputFile(loFreqAllVcf).setReferenceDictionary(dict); - try (VCFFileReader reader = new VCFFileReader(activeVCF);CloseableIterator it = reader.iterator();VariantContextWriter writerConsensus = writerBuilderConsensus.build();VariantContextWriter writerAll = writerBuilderAll.build()) + try (VCFFileReader reader = new VCFFileReader(activeVCF);CloseableIterator it = reader.iterator();VariantContextWriter writerConsensus = writerBuilderConsensus.build();VariantContextWriter writerAll = writerBuilderAll.build();CSVWriter variantTableWriter = generateTable ? new CSVWriter(PrintWriters.getPrintWriter(tableFile), '\t') : null) { VCFHeader header = reader.getFileHeader(); @@ -532,6 +550,11 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc writerConsensus.writeHeader(header); writerAll.writeHeader(header); + if (generateTable) + { + variantTableWriter.writeNext(new String[]{"Contig", "Start", "End", "Reference", "Alt", "Frequency", "AlleleDepth", "TotalDepth"}); + } + SortingCollection allVariants = getVariantSorter(header); SortingCollection consensusVariants = getVariantSorter(header); while (it.hasNext()) @@ -571,6 +594,16 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc } } + if (generateTable) + { + if (vc.hasAttribute("AF") && vc.getAttributeAsDouble("AF", 0.0) > minFractionForTable) + { + List depths = vc.getAttributeAsIntList("DP4", 0); + int alleleDepth = depths.get(2) + depths.get(3); + variantTableWriter.writeNext(new String[]{vc.getContig(), String.valueOf(vc.getStart()), String.valueOf(vc.getEnd()), vc.getReference().getBaseString(), vc.getAlternateAllele(0).getBaseString(), String.valueOf(vc.getAttributeAsDouble("AF", 0.0)), String.valueOf(alleleDepth), String.valueOf(vc.getAttributeAsInt("DP", 0))}); + } + } + totalVariants++; if (vc.hasAttribute("AF") && vc.getAttributeAsDouble("AF", 0.0) > 0.01) { @@ -672,6 +705,10 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc } consensusVariants.cleanup(); } + catch (IOException e) + { + throw new PipelineJobException(e); + } NumberFormat fmt = NumberFormat.getPercentInstance(); fmt.setMaximumFractionDigits(2); @@ -720,12 +757,24 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc } output.addSequenceOutput(coverageOut, "Depth of Coverage: " + rs.getName(), "Depth of Coverage", rs.getReadsetId(), null, referenceGenome.getGenomeId(), null); - output.addSequenceOutput(consensusFastaLoFreq, "Consensus: " + rs.getName(), "Viral Consensus Sequence", rs.getReadsetId(), null, referenceGenome.getGenomeId(), description); + if (generateConsensus) + { + output.addSequenceOutput(consensusFastaLoFreq, "Consensus: " + rs.getName(), "Viral Consensus Sequence", rs.getReadsetId(), null, referenceGenome.getGenomeId(), description); + } boolean runPangolinAndNextClade = getProvider().getParameterByName("runPangolin").extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx(), Boolean.class, false); output.addSequenceOutput(loFreqAllVcf, "LoFreq: " + rs.getName(), CATEGORY, rs.getReadsetId(), null, referenceGenome.getGenomeId(), description); + if (generateTable) + { + if (!tableFile.exists()) + { + + } + output.addSequenceOutput(tableFile, "LoFreq: " + rs.getName(), "LoFreq Variant Table", rs.getReadsetId(), null, referenceGenome.getGenomeId(), description); + } + Map pangolinData = null; if (runPangolinAndNextClade) { @@ -781,6 +830,11 @@ private File getAllVcf(File outputDir, File inputBam) return new File(outputDir, FileUtil.getBaseName(inputBam) + ".lofreq.all.vcf.gz"); } + private File getTableFile(File outputDir, File inputBam) + { + return new File(outputDir, FileUtil.getBaseName(inputBam) + ".lofreq.txt"); + } + private Set runBcftools(File inputBam, ReferenceGenome referenceGenome, File mask, int minCoverage) throws PipelineJobException { Set variantsBcftools = new HashSet<>(); From 214db1bf007939d41436e783158b6e4f402e52e3 Mon Sep 17 00:00:00 2001 From: bbimber Date: Thu, 14 Dec 2023 16:51:53 -0800 Subject: [PATCH 06/16] Correct typo in BcftoolsFillTagsStep --- .../run/analysis/BcftoolsFillTagsStep.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java index bdbb1fcd0..109952802 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java @@ -15,7 +15,6 @@ import org.labkey.api.sequenceanalysis.pipeline.VariantProcessingStepOutputImpl; import org.labkey.api.sequenceanalysis.run.AbstractCommandPipelineStep; import org.labkey.sequenceanalysis.pipeline.SequenceTaskHelper; -import org.labkey.sequenceanalysis.run.variant.VariantAnnotatorStep; import javax.annotation.Nullable; import java.io.File; @@ -31,24 +30,24 @@ public BcftoolsFillTagsStep(PipelineStepProvider provider, PipelineContext ct super(provider, ctx, new BcftoolsRunner(ctx.getLogger())); } - public static class Provider extends AbstractVariantProcessingStepProvider implements VariantProcessingStep.RequiresPedigree, VariantProcessingStep.SupportsScatterGather + public static class Provider extends AbstractVariantProcessingStepProvider implements VariantProcessingStep.RequiresPedigree, VariantProcessingStep.SupportsScatterGather { public Provider() { super("BcftoolsFillTagsStep", "Bcftools Fill-tags", "bcftools", "Annotate variants using bcftools fill-tags", Arrays.asList( ToolParameterDescriptor.create("hwe", "HWE", "If selected, HWE will be annotated", "checkbox", new JSONObject(){{ - put("checked", false); - }}, null), + put("checked", true); + }}, true), ToolParameterDescriptor.create("exchet", "Excess Het", "If selected, ExcHet will be annotated.", "checkbox", new JSONObject(){{ put("checked", true); - }}, null) + }}, true) ), null, ""); } @Override - public VariantAnnotatorStep create(PipelineContext ctx) + public BcftoolsFillTagsStep create(PipelineContext ctx) { - return new VariantAnnotatorStep(this, ctx); + return new BcftoolsFillTagsStep(this, ctx); } } From 1d71a5971511a87a6463092e5ccc41d0e002cfb7 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 15 Dec 2023 09:06:38 -0800 Subject: [PATCH 07/16] Fix typo in BcftoolsFillTagsStep --- .../sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java index 109952802..d4a2142de 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java @@ -98,7 +98,7 @@ public VariantProcessingStep.Output processVariants(File inputVCF, File outputDi throw new PipelineJobException("No annotations were selected"); } - options.add("-T"); + options.add("-t"); options.add(StringUtils.join(annotations, ",")); options.add("--write-index"); From 5a43a30bcf0f09b7a87e9967ad9c7919a6748a25 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 15 Dec 2023 10:40:11 -0800 Subject: [PATCH 08/16] skipExcessHetAndInbreeding field should be a checkbox --- .../web/SequenceAnalysis/panel/VariantProcessingPanel.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SequenceAnalysis/resources/web/SequenceAnalysis/panel/VariantProcessingPanel.js b/SequenceAnalysis/resources/web/SequenceAnalysis/panel/VariantProcessingPanel.js index 283557819..c76c39f89 100644 --- a/SequenceAnalysis/resources/web/SequenceAnalysis/panel/VariantProcessingPanel.js +++ b/SequenceAnalysis/resources/web/SequenceAnalysis/panel/VariantProcessingPanel.js @@ -269,7 +269,7 @@ Ext4.define('SequenceAnalysis.panel.VariantProcessingPanel', { description: 'A BED or similar file with intervals to skip', defaultValue: null },{ - fieldXtype: 'ldk-expdatafield', + fieldXtype: 'checkbox', name: 'skipExcessHetAndInbreeding', label: 'Skip Excess Het And Inbreeding', description: 'If checked, the ExcessHet and InbreedingCoeff annotations will be skipped, which can be important when using force-output-intervals', From c6a0869e5ef05b58c96a2c3a2f0be08efc6d9d28 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 15 Dec 2023 11:15:29 -0800 Subject: [PATCH 09/16] Use tabix index for bcftools output --- .../run/analysis/BcftoolsFillTagsStep.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java index d4a2142de..93e4efb5d 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java @@ -4,6 +4,7 @@ import org.apache.commons.lang3.StringUtils; import org.json.JSONObject; import org.labkey.api.pipeline.PipelineJobException; +import org.labkey.api.sequenceanalysis.SequenceAnalysisService; import org.labkey.api.sequenceanalysis.pipeline.AbstractVariantProcessingStepProvider; import org.labkey.api.sequenceanalysis.pipeline.BcftoolsRunner; import org.labkey.api.sequenceanalysis.pipeline.PipelineContext; @@ -18,6 +19,7 @@ import javax.annotation.Nullable; import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -101,14 +103,21 @@ public VariantProcessingStep.Output processVariants(File inputVCF, File outputDi options.add("-t"); options.add(StringUtils.join(annotations, ",")); - options.add("--write-index"); - getWrapper().execute(options); if (!outputVcf.exists()) { throw new PipelineJobException("output not found: " + outputVcf); } + try + { + SequenceAnalysisService.get().ensureVcfIndex(outputVcf, getWrapper().getLogger()); + } + catch (IOException e) + { + throw new PipelineJobException(e); + } + output.setVcf(outputVcf); return output; From 40c39a7f28898d10a9aea254f2651d7451d1d171 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 15 Dec 2023 11:19:48 -0800 Subject: [PATCH 10/16] Pass BCFTOOLS_PLUGINS to command line --- .../run/analysis/BcftoolsFillTagsStep.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java index 93e4efb5d..3016cf2c0 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/BcftoolsFillTagsStep.java @@ -103,7 +103,16 @@ public VariantProcessingStep.Output processVariants(File inputVCF, File outputDi options.add("-t"); options.add(StringUtils.join(annotations, ",")); - getWrapper().execute(options); + BcftoolsRunner wrapper = getWrapper(); + + String bcfPluginDir = StringUtils.trimToNull(System.getenv("BCFTOOLS_PLUGINS")); + if (bcfPluginDir != null) + { + getPipelineCtx().getLogger().debug("Setting BCFTOOLS_PLUGINS environment variable: " + bcfPluginDir); + wrapper.addToEnvironment("BCFTOOLS_PLUGINS", bcfPluginDir); + } + + wrapper.execute(options); if (!outputVcf.exists()) { throw new PipelineJobException("output not found: " + outputVcf); From 225edeee88ef5ee155506a0dc37007c370c0e611 Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 15 Dec 2023 14:58:40 -0600 Subject: [PATCH 11/16] Attempt to fix JBrowseTest timing (#255) * Attempt to fix JBrowseTest timing --- .../labkey/test/tests/external/labModules/JBrowseTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java b/jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java index 7661f9f11..d948b63db 100644 --- a/jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java +++ b/jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java @@ -1506,8 +1506,9 @@ private void testVariantTableComparators() throws Exception { } private void clearFilterDialog(String filter_text) { - waitForElement(Locator.tagWithText("button", filter_text)).click(); - waitForElement(Locator.tagWithText("button", "Remove Filter")).click(); + waitForElementToDisappear(Locator.tagWithClass("div", "MuiBackdrop-root").notHidden()); + waitAndClick(Locator.tagWithText("button", filter_text)); + waitAndClick(Locator.tagWithText("button", "Remove Filter")); waitAndClick(Locator.tagWithText("button", "Search").index(1)); waitForElement(Locator.tagWithText("span", "2")); } From f8ecbb81733289072514c92dab8a3cf443ff275e Mon Sep 17 00:00:00 2001 From: bbimber Date: Fri, 15 Dec 2023 13:34:50 -0800 Subject: [PATCH 12/16] Fix error in maxValue for LoFreq analysis --- .../labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java index 0a6306843..dc1f43a6c 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/run/analysis/LofreqAnalysis.java @@ -123,7 +123,7 @@ public Provider() }}, false), ToolParameterDescriptor.create("minFractionForTable", "Min Fraction for Table", "If the option to generate a table output is used, only variants with frequency of this threshold will be included", "ldk-numberfield", new JSONObject(){{ put("minValue", 0); - put("maxValue", 0); + put("maxValue", 1); put("decimalPrecision", 3); }}, 0.01), ToolParameterDescriptor.createExpDataParam("primerBedFile", "Primer Sites (BED File)", "This is a BED file specifying the primer binding sites, which will be used to flag variants. Strandedness is ignored.", "ldk-expdatafield", new JSONObject() @@ -539,7 +539,7 @@ public Output performAnalysisPerSampleRemote(Readset rs, File inputBam, Referenc SAMSequenceDictionary dict = SAMSequenceDictionaryExtractor.extractDictionary(referenceGenome.getSequenceDictionary().toPath()); VariantContextWriterBuilder writerBuilderConsensus = new VariantContextWriterBuilder().setOutputFile(loFreqConsensusVcf).setReferenceDictionary(dict); VariantContextWriterBuilder writerBuilderAll = new VariantContextWriterBuilder().setOutputFile(loFreqAllVcf).setReferenceDictionary(dict); - try (VCFFileReader reader = new VCFFileReader(activeVCF);CloseableIterator it = reader.iterator();VariantContextWriter writerConsensus = writerBuilderConsensus.build();VariantContextWriter writerAll = writerBuilderAll.build();CSVWriter variantTableWriter = generateTable ? new CSVWriter(PrintWriters.getPrintWriter(tableFile), '\t') : null) + try (VCFFileReader reader = new VCFFileReader(activeVCF);CloseableIterator it = reader.iterator();VariantContextWriter writerConsensus = writerBuilderConsensus.build();VariantContextWriter writerAll = writerBuilderAll.build();CSVWriter variantTableWriter = generateTable ? new CSVWriter(PrintWriters.getPrintWriter(tableFile), '\t', CSVWriter.NO_QUOTE_CHARACTER) : null) { VCFHeader header = reader.getFileHeader(); From 652459fbb52aa884d44d8cab02451282465c14b9 Mon Sep 17 00:00:00 2001 From: hextraza Date: Tue, 19 Dec 2023 14:57:01 -0800 Subject: [PATCH 13/16] Lower allowableValues threshold to display multiSelect (#256) * Lower allowableValues threshold to display multiSelect * Add IMPACT test --------- Co-authored-by: Sebastian Benjamin Co-authored-by: bbimber --- .../VariantSearch/components/FilterForm.tsx | 3 ++- .../org/labkey/jbrowse/JBrowseController.java | 1 - .../external/labModules/JBrowseTest.java | 19 +++++++++++++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/jbrowse/src/client/JBrowse/VariantSearch/components/FilterForm.tsx b/jbrowse/src/client/JBrowse/VariantSearch/components/FilterForm.tsx index 977324dc7..f455b0431 100644 --- a/jbrowse/src/client/JBrowse/VariantSearch/components/FilterForm.tsx +++ b/jbrowse/src/client/JBrowse/VariantSearch/components/FilterForm.tsx @@ -276,7 +276,7 @@ const FilterForm = (props: FilterFormProps ) => { ))} - ) : fieldTypeInfo.find(obj => obj.name === filter.field)?.allowableValues?.length > 10 ? ( + ) : fieldTypeInfo.find(obj => obj.name === filter.field)?.allowableValues?.length > 1 ? ( { menuShouldBlockScroll={true} styles={{menuPortal: base => ({...base, zIndex: 9999})}} isMulti={fieldTypeInfo.find(obj => obj.name === filter.field)?.isMultiValued} + defaultOptions={fieldTypeInfo.find(obj => obj.name === filter.field)?.allowableValues?.length < 20} loadOptions={(inputValue, callback) => { const fieldInfo = fieldTypeInfo.find(obj => obj.name === filter.field); diff --git a/jbrowse/src/org/labkey/jbrowse/JBrowseController.java b/jbrowse/src/org/labkey/jbrowse/JBrowseController.java index 3ddfd7be9..ada6cbbd5 100644 --- a/jbrowse/src/org/labkey/jbrowse/JBrowseController.java +++ b/jbrowse/src/org/labkey/jbrowse/JBrowseController.java @@ -20,7 +20,6 @@ import htsjdk.variant.variantcontext.Genotype; import htsjdk.variant.variantcontext.VariantContext; import htsjdk.variant.vcf.VCFFileReader; -import htsjdk.variant.vcf.VCFHeaderLineType; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.NotNull; diff --git a/jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java b/jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java index d948b63db..4b8704d2b 100644 --- a/jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java +++ b/jbrowse/test/src/org/labkey/test/tests/external/labModules/JBrowseTest.java @@ -1713,8 +1713,8 @@ private void testLuceneSearchUI(String sessionId) waitForElement(Locator.tagWithText("li", "Impact on Protein Coding")).click(); waitForElement(Locator.tagWithAttribute("div", "aria-labelledby", "operator-label")).click(); waitForElement(Locator.tagWithText("li", "equals")).click(); - waitForElement(Locator.tagWithId("div", "value-select-0")).click(); - waitForElement(Locator.tagWithText("li", "HIGH")).click(); + waitForElement(Locator.tagWithId("input", "value-select-0")).sendKeys("HI"); + waitForElement(Locator.tagWithId("input", "value-select-0")).sendKeys(Keys.ENTER); waitAndClick(Locator.tagWithClass("button", "filter-form-select-button")); waitForElementToDisappear(Locator.tagWithText("span", "4")); clearFilterDialog("IMPACT equals HIGH"); @@ -1798,5 +1798,20 @@ private void testLuceneSearchUI(String sessionId) waitAndClick(Locator.tagWithClass("button", "filter-form-select-button")); waitForElement(Locator.tagWithText("span", "914")); clearFilterDialog("IMPACT is not empty"); + + // IMPACT HIGH+MODERATE + waitAndClick(Locator.tagWithText("button", "Search")); + waitForElement(Locator.tagWithAttribute("div", "aria-labelledby", "field-label")).click(); + waitForElement(Locator.tagWithText("li", "Impact on Protein Coding")).click(); + waitForElement(Locator.tagWithAttribute("div", "aria-labelledby", "operator-label")).click(); + waitForElement(Locator.tagWithText("li", "equals")).click(); + waitForElement(Locator.tagWithId("input", "value-select-0")).sendKeys("HI"); + waitForElement(Locator.tagWithId("input", "value-select-0")).sendKeys(Keys.ENTER); + waitForElement(Locator.tagWithId("input", "value-select-0")).sendKeys("MO"); + waitForElement(Locator.tagWithId("input", "value-select-0")).sendKeys(Keys.ENTER); + waitAndClick(Locator.tagWithClass("button", "filter-form-select-button")); + waitForElement(Locator.tagWithText("span", "0.029")); + + clearFilterDialog("IMPACT equals HIGH,MODERATE"); } } \ No newline at end of file From eb7d896b5345529cdbe81118a3297a3574130fa4 Mon Sep 17 00:00:00 2001 From: bbimber Date: Wed, 20 Dec 2023 08:26:59 -0600 Subject: [PATCH 14/16] Update jbrowse packages after npm audit (#257) --- jbrowse/package-lock.json | 401 +++++++++++++++++++------------------- 1 file changed, 205 insertions(+), 196 deletions(-) diff --git a/jbrowse/package-lock.json b/jbrowse/package-lock.json index ccc9fda86..1b9cf0ee5 100644 --- a/jbrowse/package-lock.json +++ b/jbrowse/package-lock.json @@ -56,9 +56,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.1.tgz", - "integrity": "sha512-/62yikz7NLScCGAAST5SHdnjaDJQBDq0M2muyRTpf2VQhw6StBg2ALiu73zSJQ4fMVLA+0uBhBHAle7Wg+2kSg==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", + "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", @@ -2253,6 +2253,20 @@ "@floating-ui/utils": "^0.1.3" } }, + "node_modules/@floating-ui/react": { + "version": "0.26.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.4.tgz", + "integrity": "sha512-pRiEz+SiPyfTcckAtLkEf3KJ/sUbB4X4fWMcDm27HT2kfAq+dH+hMc2VoOkNaGpDE35a2PKo688ugWeHaToL3g==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.3", + "@floating-ui/utils": "^0.1.5", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@floating-ui/react-dom": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", @@ -2351,20 +2365,20 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/@gmod/cram": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@gmod/cram/-/cram-1.7.3.tgz", - "integrity": "sha512-EtGln6OEK41zNAoCNMItcsi7d+rhnVtQFJzvrtMcTSwnOrJueN0w74H2m5PNvQvK6ZHkt3rqWNKZHVV8X4UJ8g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@gmod/cram/-/cram-2.0.0.tgz", + "integrity": "sha512-rw1Wp2DnDiV2dr70Wjr9w2APzKhOS+PG7I0HGauFptkhW6UTx97hsPQeYBt+ursv8axLFKFgU4o/wN5ptvNPyQ==", "dependencies": { "@gmod/binary-parser": "^1.3.5", "@jkbonfield/htscodecs": "^0.5.1", "abortable-promise-cache": "^1.2.0", "buffer-crc32": "^0.2.13", "bzip2": "^0.1.1", - "cross-fetch": "^3.0.0", "long": "^4.0.0", "md5": "^2.2.1", "pako": "^1.0.4", - "quick-lru": "^4.0.1" + "quick-lru": "^4.0.1", + "xz-decompress": "^0.2.1" }, "engines": { "node": ">=6" @@ -2457,9 +2471,9 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/@gmod/ucsc-hub": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@gmod/ucsc-hub/-/ucsc-hub-0.1.7.tgz", - "integrity": "sha512-FHCgRLOYn5wjCGVDkGnW0wda7UAIFqVrKE5+0lh1EpUOu/UM1kfaidsJnha4Jc9V0+KCevSl4haVv0ZaMWqw2w==" + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@gmod/ucsc-hub/-/ucsc-hub-0.3.0.tgz", + "integrity": "sha512-M8r1rpmNOVH6UHwUTSOR5Z86upWEhvI3BKbyYVq8imTS+nZAq8Gr9RJTBsGlL0sgX7fmLSXms8/pTyp7e3YAQA==" }, "node_modules/@gmod/vcf": { "version": "5.0.10", @@ -2608,9 +2622,9 @@ } }, "node_modules/@jbrowse/core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/core/-/core-2.8.0.tgz", - "integrity": "sha512-7TciR+FZcJZ8n5+z9ZfT9MVKKUFFpRktRZ13orRsPz9E9pW5PFCuuF2iDcJVmvphEwei7JsT3h1eJbBcVT+T1Q==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/core/-/core-2.10.0.tgz", + "integrity": "sha512-rlArn8dkP+yDA9T1EBGXFGF0fCbyqpjiq98D5wbcNdMID3UEES6sSSJn7GT51hSBc4p8zZLDmG0AlYqgzf+RlA==", "dependencies": { "@babel/runtime": "^7.17.9", "@gmod/bgzf-filehandle": "^1.4.3", @@ -2620,7 +2634,6 @@ "canvas-sequencer": "^3.1.0", "canvas2svg": "^1.0.16", "clone": "^2.1.2", - "clsx": "^2.0.0", "colord": "^2.9.3", "copy-to-clipboard": "^3.3.1", "deepmerge": "^4.2.2", @@ -2632,7 +2645,6 @@ "http-range-fetcher": "^2.0.0", "is-object": "^1.0.1", "jexl": "^2.3.0", - "json-stable-stringify": "^1.0.1", "librpc-web-mod": "^1.1.5", "load-script": "^2.0.0", "material-ui-popup-state": "^5.0.0", @@ -2655,12 +2667,12 @@ } }, "node_modules/@jbrowse/plugin-alignments": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-alignments/-/plugin-alignments-2.8.0.tgz", - "integrity": "sha512-IYPGFJ7/Y4Q/cDglrwHXEiU5lQIMaCt83jCqHBOuj9/MbpdBPvwSxyIvesCuS4D8B3NCOT8+0fHw6EtKb4Ll0g==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-alignments/-/plugin-alignments-2.10.0.tgz", + "integrity": "sha512-Cp+nWuJMDw6iqHzfAOSYR852fG4Varb7Bi91wUmNCsrylGw9B6T/W7zpVKsBPaDuk8hkwIbvzylOUK1ng0wrsw==", "dependencies": { "@gmod/bam": "^2.0.0", - "@gmod/cram": "^1.7.1", + "@gmod/cram": "^2.0.0", "@mui/icons-material": "^5.0.1", "canvas2svg": "^1.0.16", "clone": "^2.1.2", @@ -2681,10 +2693,42 @@ "tss-react": "^4.0.0" } }, + "node_modules/@jbrowse/plugin-arc": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-arc/-/plugin-arc-2.10.0.tgz", + "integrity": "sha512-fR+jsh54iLO+zAqIRnU63un0CCy4ztNE3h0YkoT4LzZNPReCHKXI/3o5EwdpFx5CD7jPDJezvMHJ93wv7XVacA==", + "dependencies": { + "react-svg-tooltip": "^0.0.11" + }, + "peerDependencies": { + "@jbrowse/core": "^2.0.0", + "@jbrowse/plugin-linear-genome-view": "^2.0.0", + "@jbrowse/plugin-wiggle": "^2.0.0", + "@mui/material": "^5.0.0", + "mobx": "^6.0.0", + "mobx-react": "^9.0.0", + "mobx-state-tree": "^5.0.0", + "react": ">=16.8.0", + "react-dom": ">=16.8.0", + "rxjs": "^7.0.0" + } + }, + "node_modules/@jbrowse/plugin-arc/node_modules/react-svg-tooltip": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/react-svg-tooltip/-/react-svg-tooltip-0.0.11.tgz", + "integrity": "sha512-iK7C7Ay5UCQL0Ert9xo1fQVjl+QplaA7VoR+pi+J7Uz25HqkyR3ksY+puHE2O7KVmuIxxre0e2hLWEr+jAv7XQ==", + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "react": "^16.3.0", + "react-dom": "^16.3.0" + } + }, "node_modules/@jbrowse/plugin-authentication": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-authentication/-/plugin-authentication-2.8.0.tgz", - "integrity": "sha512-FUCuoJYYbBF+j6eJNxNk2yKnfN/AX4mxstNKkur2gxO1HvevA0heGMUppaYpGvWYFu7JoWJvl0u2dm5qGUFaLw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-authentication/-/plugin-authentication-2.10.0.tgz", + "integrity": "sha512-z6h5lboqqcqRvDU+T16shVlzifvY0QF1LK23YcaU9BTLN1Ek9vldWvLrZZVK5tqrNEkVCJRQteVI1Xx0m+Di8Q==", "dependencies": { "crypto-js": "^4.2.0", "generic-filehandle": "^3.0.0" @@ -2701,9 +2745,9 @@ } }, "node_modules/@jbrowse/plugin-bed": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-bed/-/plugin-bed-2.8.0.tgz", - "integrity": "sha512-PeWYlnjFXWZAYn4EdtgMt9vPYa/av/+w7TT8/Ch7wI2UmhfGX1mpdRuMoNods3TVZ7pGAQoVhD/vmC+F3Tq12A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-bed/-/plugin-bed-2.10.0.tgz", + "integrity": "sha512-IvHxsbyl8nODbYecNJDQkZhoyQcbEur1nsRxdPTO6AqCzu+Cwb8Kx6iGR1PFUtCbRr+nojoSh7AKHVthXxckbg==", "dependencies": { "@flatten-js/interval-tree": "^1.0.15", "@gmod/bbi": "^4.0.0", @@ -2720,9 +2764,9 @@ } }, "node_modules/@jbrowse/plugin-circular-view": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-circular-view/-/plugin-circular-view-2.8.0.tgz", - "integrity": "sha512-I5giVPuAkn0ukmhQTKH09UaJUlxcxe/3nU8fzley05enFSxHFNrifk+1JYGtMLS8knlMQCA95omKHFs3kCTJ1A==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-circular-view/-/plugin-circular-view-2.10.0.tgz", + "integrity": "sha512-QAqBMJ6kF9M7BYwmbxqu6nXrIfnWYk1mK3699K0dra0wayk/1oxjwV6gYn4etzmvouSIWwic0gWwUDYRQ2A9Eg==", "dependencies": { "@mui/icons-material": "^5.0.1", "@types/file-saver": "^2.0.0", @@ -2741,9 +2785,9 @@ } }, "node_modules/@jbrowse/plugin-config": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-config/-/plugin-config-2.8.0.tgz", - "integrity": "sha512-pyIuU8YXfDdLKWQqigpEOWZSqnED03+yszmeHzAIaudhhn8MGr1yYdk8e/kU2LoxGETZsAOVEV5j1a6uSH1kSQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-config/-/plugin-config-2.10.0.tgz", + "integrity": "sha512-PyoRbMxcRLbU3ULAC8EyLQP3BlhxKGrwh+81TAbqh4NYv2mUAsc4raMDdrXufE+eVu7E+RDgK/HtNLgzdME4Bg==", "dependencies": { "@mui/icons-material": "^5.0.1", "pluralize": "^8.0.0" @@ -2761,14 +2805,13 @@ } }, "node_modules/@jbrowse/plugin-data-management": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-data-management/-/plugin-data-management-2.8.0.tgz", - "integrity": "sha512-OKjxLAQkhv1Sw+7K3yi59GpwVpo2zA9xK+TrGfEgTcmG5NlTH/pyL4SKJbY4yK+HFAPwl3J0Sj4WVpcF0m03gA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-data-management/-/plugin-data-management-2.10.0.tgz", + "integrity": "sha512-rjZN/zmmCBpV/qyKVuf1ousD3S84nV7ajIKnScHcvnAWWjrnd+ZevRlB/XCRTFPu++Si42xMLzkriSh8q/g3uQ==", "dependencies": { - "@gmod/ucsc-hub": "^0.1.6", + "@gmod/ucsc-hub": "^0.3.0", "@mui/icons-material": "^5.0.1", "@mui/x-data-grid": "^6.0.1", - "clsx": "^2.0.0", "react-virtualized-auto-sizer": "^1.0.2", "react-vtree": "^3.0.0-beta.1", "react-window": "^1.8.6" @@ -2830,9 +2873,9 @@ } }, "node_modules/@jbrowse/plugin-gccontent": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-gccontent/-/plugin-gccontent-2.8.0.tgz", - "integrity": "sha512-jWb1QOxTarPTmspKOHoHZYxbJ2vBNnDP4Z1k/+MDro3IUDqR36b8eEqAjqMEpNW8sxatP4ZOue7cI3oIPTGFTw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-gccontent/-/plugin-gccontent-2.10.0.tgz", + "integrity": "sha512-JEsHLoiw/d3hIN6YrSpkS3DU6i05kTmr0wcM9f70Ff0fsGRLE16ffMhYMtQAgFLnrTOMYDu99Xdt9Z3B/8FvHA==", "peerDependencies": { "@jbrowse/core": "^2.0.0", "@jbrowse/plugin-linear-genome-view": "^2.0.0", @@ -2847,9 +2890,9 @@ } }, "node_modules/@jbrowse/plugin-gff3": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-gff3/-/plugin-gff3-2.8.0.tgz", - "integrity": "sha512-LoJr+gctZhjBWtoHI9k2n2PbawWsmfRPtqz5QjoKFJUcC9NSTJpY3xUp1dLAJ5ulyt2SYANRTiOk8BG5FH/Ung==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-gff3/-/plugin-gff3-2.10.0.tgz", + "integrity": "sha512-5KlBcpQxUp+dmYPntvDYQ4RlGiC9CjJ3q5fSQ46tBdOV9zMnipHBpZDo95GMtoF5FbD6OjzRBJXdotBCp5ba5g==", "dependencies": { "@flatten-js/interval-tree": "^1.0.15", "@gmod/bgzf-filehandle": "^1.4.3", @@ -2866,9 +2909,9 @@ } }, "node_modules/@jbrowse/plugin-legacy-jbrowse": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-legacy-jbrowse/-/plugin-legacy-jbrowse-2.8.0.tgz", - "integrity": "sha512-BWJDATDUnIh5s382lyhL6RH0EbbZMQXNCKspqM/xJc3VQpFhHiOADx1GTU3pWNmyim7bPFTryGsMbQs4RVb/VQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-legacy-jbrowse/-/plugin-legacy-jbrowse-2.10.0.tgz", + "integrity": "sha512-P47XPWx/aa2wVOzKHkQgc5LBb6NYkcrKzUibdy4/kGQmjO9wMLGLBcZ7XlvnEoWr5nEHyXNN0WffHoH5MYW1JA==", "dependencies": { "@gmod/nclist": "^0.2.1", "buffer-crc32": "^0.2.13", @@ -2885,22 +2928,20 @@ } }, "node_modules/@jbrowse/plugin-linear-genome-view": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-linear-genome-view/-/plugin-linear-genome-view-2.8.0.tgz", - "integrity": "sha512-lVz95J4cRPk+qtImVaYx4eZcSiFJrHRtUL/z7mQiNzeOlQi0F9NH2kOMAAyA/Z5yzkkNJIGrylhoQmNaFSpalg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-linear-genome-view/-/plugin-linear-genome-view-2.10.0.tgz", + "integrity": "sha512-+ATddmdCk4Tw5Ws/9+hnYzKnGLYJ6YEeW7ytSZmpSd7v9iAVENYvZkbJFuCm4ZQIzsxFMBqmVjxTwdQbAqHL3A==", "dependencies": { + "@floating-ui/react": "^0.26.3", "@mui/icons-material": "^5.0.1", - "@popperjs/core": "^2.11.0", "@types/file-saver": "^2.0.1", "@types/normalize-wheel": "^1.0.0", "clone": "^2.1.2", - "clsx": "^2.0.0", "copy-to-clipboard": "^3.3.1", "file-saver": "^2.0.0", "material-ui-popup-state": "^5.0.0", "normalize-wheel": "^1.0.1", - "react-error-boundary": "^4.0.3", - "react-popper": "^2.0.0" + "react-error-boundary": "^4.0.3" }, "peerDependencies": { "@jbrowse/core": "^2.0.0", @@ -2914,9 +2955,9 @@ } }, "node_modules/@jbrowse/plugin-sequence": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-sequence/-/plugin-sequence-2.8.0.tgz", - "integrity": "sha512-Ymtw7I6qgya6RlgcYvni83zwIbUNoEOT0BkAlRgW2TKNOAxty2T94zaWZQw1ve+KiqIBOJkHhiDWej/VPXE4AA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-sequence/-/plugin-sequence-2.10.0.tgz", + "integrity": "sha512-7RJymCYnq7gj4yLEdPHlFSRQSwO/Ophbca1EM/SXveDt3qLkX48YueRkLSRi95rzhwqktBqTUoTaxahP6mSyRA==", "dependencies": { "@gmod/indexedfasta": "^2.0.2", "@gmod/twobit": "^1.1.12", @@ -2935,9 +2976,9 @@ } }, "node_modules/@jbrowse/plugin-svg": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-svg/-/plugin-svg-2.8.0.tgz", - "integrity": "sha512-gzO3NPIRIX07ILnzR4AWAAFlqJP6HGU9or0lFxaoe1wYSEDtG/oEzeHDnm/r77M2zvR1AJp1Q2XA0CsLiiXjNA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-svg/-/plugin-svg-2.10.0.tgz", + "integrity": "sha512-ZGlHCftSdj9GiNRPKX3iPAfMM1NmwRDiib+b7LtXdSjjcZ0VbO0zyTyzifoTJg/8Rm5yeIUPXMcRgl3deb2CDQ==", "peerDependencies": { "@jbrowse/core": "^2.0.0", "@mui/material": "^5.0.0", @@ -2948,9 +2989,9 @@ } }, "node_modules/@jbrowse/plugin-trix": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-trix/-/plugin-trix-2.8.0.tgz", - "integrity": "sha512-qofZDRW3vnUYkuvsIXQu0thP/V4sHRQs+Yzb737S4YGtWsrQffz60vN4szh1Jufk0Zz43tB5JoBhhIX7tdbghQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-trix/-/plugin-trix-2.10.0.tgz", + "integrity": "sha512-onjR0iFjW8LRvxtfzeGn+Zf8CvtvpyZDAFy4GpPQIHt3ts36toCOE/I47ixurAJ3FPae4jMzrKSTX1GJUc7KUg==", "dependencies": { "@gmod/trix": "^2.0.4" }, @@ -2964,9 +3005,9 @@ } }, "node_modules/@jbrowse/plugin-variants": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-variants/-/plugin-variants-2.8.0.tgz", - "integrity": "sha512-2tdTceNFNM/E+IEVdj8c1VBx0tCtE5KCOlO5DRKvs4Ojp2a5RsLoV3f8o03Trhiacmq4OomPvKxoxQwcvSQ7cA==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-variants/-/plugin-variants-2.10.0.tgz", + "integrity": "sha512-cIvbjK0p+QXhZs16kIDH/s3rkr0q2UOUJwYqXZiv0btPCjCLUeLDKQLIAfdIJaJOu3FN1kI6ccfkQFwZXC+rcw==", "dependencies": { "@flatten-js/interval-tree": "^1.0.15", "@gmod/bgzf-filehandle": "^1.4.3", @@ -2991,21 +3032,20 @@ } }, "node_modules/@jbrowse/plugin-wiggle": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/plugin-wiggle/-/plugin-wiggle-2.8.0.tgz", - "integrity": "sha512-AYq6+CDL5CLHyUqz1+y6Vp9RydgOR2iSea0O1DXgE03h8eY1piZ9WhcSX/ernUl9L/vuUPf+HOhRyZzdAB6oRw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/plugin-wiggle/-/plugin-wiggle-2.10.0.tgz", + "integrity": "sha512-+TaQk5hyYhohrGzLeq/xtlZHLtq4jBoOwazdc35q3VtKoVVGfGqPn9mYM9Mk/kc5cLHin1ITl35FmRKXdSeNMg==", "dependencies": { + "@floating-ui/react": "^0.26.3", "@gmod/bbi": "^4.0.0", "@mui/icons-material": "^5.0.2", - "@popperjs/core": "^2.11.0", "clone": "^2.1.2", "d3-color": "^3.0.2", "d3-scale": "^3.0.2", "fast-deep-equal": "^3.1.3", "is-object": "^1.0.1", "react-d3-axis-mod": "^0.1.9", - "react-draggable": "^4.4.5", - "react-popper": "^2.0.0" + "react-draggable": "^4.4.5" }, "peerDependencies": { "@jbrowse/core": "^2.0.0", @@ -3043,12 +3083,12 @@ } }, "node_modules/@jbrowse/product-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/product-core/-/product-core-2.8.0.tgz", - "integrity": "sha512-bhdX2QMGyCxxOlWIDvwuiQfOIHoIi3eSKAwnIxBLvJLo3SkCDR20lyNdUsVrfu5rIxTKBmXOrFwwIymLC1pkjw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/product-core/-/product-core-2.10.0.tgz", + "integrity": "sha512-y1oY5IB7Sk7LTRSnwC7RICAFJXOnjx5W5BxS/3fQnI99NDL63hme9wb4sHWpGpKgpNAN2BS2raW7tWqjYTc49w==", "dependencies": { "@babel/runtime": "^7.16.3", - "@jbrowse/core": "^2.8.0", + "@jbrowse/core": "^2.10.0", "@mui/icons-material": "^5.0.0", "@mui/material": "^5.10.17", "copy-to-clipboard": "^3.3.1", @@ -3067,35 +3107,35 @@ } }, "node_modules/@jbrowse/react-linear-genome-view": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/react-linear-genome-view/-/react-linear-genome-view-2.8.0.tgz", - "integrity": "sha512-hAemHIwtqkgIM8DGtGM6KscstDvzeFCl/V8wG9JkAHFuFBWoBhP2KdY3ztzEZKE8xplFzy3Oa40cdvFjgjgU+Q==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/react-linear-genome-view/-/react-linear-genome-view-2.10.0.tgz", + "integrity": "sha512-gAzR+YMnqZaQu1F1JcGOK4abI9i9xN3wM6gLAzfFf4WUnOyZChPqGjnxLRllhIRnLpXG2a6P8LRoPDxQJlErCg==", "dependencies": { "@babel/runtime": "^7.17.9", "@emotion/cache": "^11.7.1", "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@jbrowse/core": "^2.8.0", - "@jbrowse/embedded-core": "^2.8.0", - "@jbrowse/plugin-alignments": "^2.8.0", - "@jbrowse/plugin-authentication": "^2.8.0", - "@jbrowse/plugin-bed": "^2.8.0", - "@jbrowse/plugin-circular-view": "^2.8.0", - "@jbrowse/plugin-config": "^2.8.0", - "@jbrowse/plugin-data-management": "^2.8.0", - "@jbrowse/plugin-gccontent": "^2.8.0", - "@jbrowse/plugin-gff3": "^2.8.0", - "@jbrowse/plugin-legacy-jbrowse": "^2.8.0", - "@jbrowse/plugin-linear-genome-view": "^2.8.0", - "@jbrowse/plugin-sequence": "^2.8.0", - "@jbrowse/plugin-svg": "^2.8.0", - "@jbrowse/plugin-trix": "^2.8.0", - "@jbrowse/plugin-variants": "^2.8.0", - "@jbrowse/plugin-wiggle": "^2.8.0", - "@jbrowse/product-core": "^2.8.0", + "@jbrowse/core": "^2.10.0", + "@jbrowse/embedded-core": "^2.10.0", + "@jbrowse/plugin-alignments": "^2.10.0", + "@jbrowse/plugin-arc": "^2.10.0", + "@jbrowse/plugin-authentication": "^2.10.0", + "@jbrowse/plugin-bed": "^2.10.0", + "@jbrowse/plugin-circular-view": "^2.10.0", + "@jbrowse/plugin-config": "^2.10.0", + "@jbrowse/plugin-data-management": "^2.10.0", + "@jbrowse/plugin-gccontent": "^2.10.0", + "@jbrowse/plugin-gff3": "^2.10.0", + "@jbrowse/plugin-legacy-jbrowse": "^2.10.0", + "@jbrowse/plugin-linear-genome-view": "^2.10.0", + "@jbrowse/plugin-sequence": "^2.10.0", + "@jbrowse/plugin-svg": "^2.10.0", + "@jbrowse/plugin-trix": "^2.10.0", + "@jbrowse/plugin-variants": "^2.10.0", + "@jbrowse/plugin-wiggle": "^2.10.0", + "@jbrowse/product-core": "^2.10.0", "@mui/icons-material": "^5.0.0", "@mui/material": "^5.10.17", - "@r2wc/react-to-web-component": "^2.0.3", "buffer": "^6.0.3", "mobx": "^6.6.0", "mobx-react": "^9.0.0", @@ -3109,12 +3149,12 @@ } }, "node_modules/@jbrowse/react-linear-genome-view/node_modules/@jbrowse/embedded-core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@jbrowse/embedded-core/-/embedded-core-2.8.0.tgz", - "integrity": "sha512-ckqK4u7ajsQttwJRQfTQdLOv1zFG77K8vyZCjwxxncenmURbDfE6eEHUgD0IMUtE9kuJkF6OMpxLD7Z6b9sihw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@jbrowse/embedded-core/-/embedded-core-2.10.0.tgz", + "integrity": "sha512-z+O+lyAkposnRqvBBeAoKqBsOIPqfpZWLMTj2Jw6C5/cYpLM2rsnIBbsSm5AzAPfnkUrFSqpzTI/32szyn+mtA==", "dependencies": { "@babel/runtime": "^7.16.3", - "@jbrowse/product-core": "^2.8.0", + "@jbrowse/product-core": "^2.10.0", "@mui/icons-material": "^5.0.0", "@mui/material": "^5.10.17", "copy-to-clipboard": "^3.3.1", @@ -3130,18 +3170,6 @@ "tss-react": "^4.0.0" } }, - "node_modules/@jbrowse/react-linear-genome-view/node_modules/@r2wc/react-to-web-component": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@r2wc/react-to-web-component/-/react-to-web-component-2.0.3.tgz", - "integrity": "sha512-nlDJ0LHiWLG/EFB5tBtA+9KLF2oMBeDSAXL08NUzAuj/ac+V0NkMl/RvCFdDFnyrPQqpzpD9uOvOY2E5IFpdCQ==", - "dependencies": { - "@r2wc/core": "^1.0.0" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, "node_modules/@jbrowse/react-linear-genome-view/node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -4303,14 +4331,14 @@ "integrity": "sha512-vhPlbRwAKQC80h0k74tsOkMKIidZtqlFSOHRzCvC8n7Va9rzMDwpG26Pm84dAt0ZuGK0g1UEfPzxDiYo9ZQBrg==" }, "node_modules/@mui/base": { - "version": "5.0.0-beta.25", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.25.tgz", - "integrity": "sha512-Iiv+IcappRRv6IBlknIVmLkXxfp51NEX1+l9f+dIbBuPU4PaRULegr1lCeHKsC45KU5ruxM5xMg4R/de03aJQg==", + "version": "5.0.0-beta.28", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.28.tgz", + "integrity": "sha512-KIoSc5sUFceeCaZTq5MQBapFzhHqMo4kj+4azWaCAjorduhcRQtN+BCgVHmo+gvEjix74bUfxwTqGifnu2fNTg==", "dependencies": { - "@babel/runtime": "^7.23.4", + "@babel/runtime": "^7.23.5", "@floating-ui/react-dom": "^2.0.4", - "@mui/types": "^7.2.10", - "@mui/utils": "^5.14.19", + "@mui/types": "^7.2.11", + "@mui/utils": "^5.15.1", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "prop-types": "^15.8.1" @@ -4334,9 +4362,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.14.19", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.19.tgz", - "integrity": "sha512-y4JseIen5pmZs1n9hHy95HKKioKco8f6N2lford2AmjJigVJOv0KsU0qryiCpyuEUZmi/xCduVilHsK9DSkPcA==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.1.tgz", + "integrity": "sha512-y/nUEsWHyBzaKYp9zLtqJKrLod/zMNEWpMj488FuQY9QTmqBiyUhI2uh7PVaLqLewXRtdmG6JV0b6T5exyuYRw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" @@ -4368,17 +4396,17 @@ } }, "node_modules/@mui/material": { - "version": "5.14.19", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.19.tgz", - "integrity": "sha512-jSPLXst/YPgDGolhiu4rbethKjLVrI1IkoK8YrFUv8ygxDuhQdsE6+ZqjSSRXk3ytTMf6ghPnQ88OFRk4XjpNw==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@mui/base": "5.0.0-beta.25", - "@mui/core-downloads-tracker": "^5.14.19", - "@mui/system": "^5.14.19", - "@mui/types": "^7.2.10", - "@mui/utils": "^5.14.19", - "@types/react-transition-group": "^4.4.9", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.1.tgz", + "integrity": "sha512-WA5DVyvacxDakVyAhNqu/rRT28ppuuUFFw1bLpmRzrCJ4uw/zLTATcd4WB3YbB+7MdZNEGG/SJNWTDLEIyn3xQ==", + "dependencies": { + "@babel/runtime": "^7.23.5", + "@mui/base": "5.0.0-beta.28", + "@mui/core-downloads-tracker": "^5.15.1", + "@mui/system": "^5.15.1", + "@mui/types": "^7.2.11", + "@mui/utils": "^5.15.1", + "@types/react-transition-group": "^4.4.10", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1", @@ -4412,12 +4440,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.14.19", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.19.tgz", - "integrity": "sha512-U9w39VpXLGVM8wZlUU/47YGTsBSk60ZQRRxQZtdqPfN1N7OVllQeN4cEKZKR8PjqqR3aYRcSciQ4dc6CttRoXQ==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.1.tgz", + "integrity": "sha512-wTbzuy5KjSvCPE9UVJktWHJ0b/tD5biavY9wvF+OpYDLPpdXK52vc1hTDxSbdkHIFMkJExzrwO9GvpVAHZBnFQ==", "dependencies": { - "@babel/runtime": "^7.23.4", - "@mui/utils": "^5.14.19", + "@babel/runtime": "^7.23.5", + "@mui/utils": "^5.15.1", "prop-types": "^15.8.1" }, "engines": { @@ -4438,11 +4466,11 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.14.19", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.19.tgz", - "integrity": "sha512-jtj/Pyn/bS8PM7NXdFNTHWZfE3p+vItO4/HoQbUeAv3u+cnWXcTBGHHY/xdIn446lYGFDczTh1YyX8G4Ts0Rtg==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.1.tgz", + "integrity": "sha512-7WDZTJLqGexWDjqE9oAgjU8ak6hEtUw2yQU7SIYID5kLVO2Nj/Wi/KicbLsXnTsJNvSqePIlUIWTBSXwWJCPZw==", "dependencies": { - "@babel/runtime": "^7.23.4", + "@babel/runtime": "^7.23.5", "@emotion/cache": "^11.11.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -4469,15 +4497,15 @@ } }, "node_modules/@mui/system": { - "version": "5.14.19", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.19.tgz", - "integrity": "sha512-4e3Q+2nx+vgEsd0h5ftxlZGB7XtkkPos/zWqCqnxUs1l/T70s0lF2YNrWHHdSQ7LgtBu0eQ0qweZG2pR7KwkAw==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@mui/private-theming": "^5.14.19", - "@mui/styled-engine": "^5.14.19", - "@mui/types": "^7.2.10", - "@mui/utils": "^5.14.19", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.1.tgz", + "integrity": "sha512-LAnP0ls69rqW9eBgI29phIx/lppv+WDGI7b3EJN7VZIqw0RezA0GD7NRpV12BgEYJABEii6z5Q9B5tg7dsX0Iw==", + "dependencies": { + "@babel/runtime": "^7.23.5", + "@mui/private-theming": "^5.15.1", + "@mui/styled-engine": "^5.15.1", + "@mui/types": "^7.2.11", + "@mui/utils": "^5.15.1", "clsx": "^2.0.0", "csstype": "^3.1.2", "prop-types": "^15.8.1" @@ -4508,9 +4536,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.10", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.10.tgz", - "integrity": "sha512-wX1vbDC+lzF7FlhT6A3ffRZgEoKWPF8VqRoTu4lZwouFX2t90KyCMsgepMw5DxLak1BSp/KP86CmtZttikb/gQ==", + "version": "7.2.11", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.11.tgz", + "integrity": "sha512-KWe/QTEsFFlFSH+qRYf3zoFEj3z67s+qAuSnMMg+gFwbxG7P96Hm6g300inQL1Wy///gSRb8juX7Wafvp93m3w==", "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" }, @@ -4521,11 +4549,11 @@ } }, "node_modules/@mui/utils": { - "version": "5.14.19", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.19.tgz", - "integrity": "sha512-qAHvTXzk7basbyqPvhgWqN6JbmI2wLB/mf97GkSlz5c76MiKYV6Ffjvw9BjKZQ1YRb8rDX9kgdjRezOcoB91oQ==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.1.tgz", + "integrity": "sha512-V1/d0E3Bju5YdB59HJf2G0tnHrFEvWLN+f8hAXp9+JSNy/LC2zKyqUfPPahflR6qsI681P8G9r4mEZte/SrrYA==", "dependencies": { - "@babel/runtime": "^7.23.4", + "@babel/runtime": "^7.23.5", "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" @@ -4548,9 +4576,9 @@ } }, "node_modules/@mui/x-data-grid": { - "version": "6.18.2", - "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-6.18.2.tgz", - "integrity": "sha512-XsVX8OCcYRbSoDVfjoX6gi+KfBitTkUvlMZnI/YkWOyms+pEValJQousvwjhGN1coWp15Yoz9YTGmSGCBxo2HA==", + "version": "6.18.5", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-6.18.5.tgz", + "integrity": "sha512-EEVJfQGXNmfLMVgj30ZpUSwx9Q8CZ/qGAYzLoARpLFOvrkGtbG8q5t4/WClkQ8MoDi7kO7TWOQ0AZz1C9/sh5g==", "dependencies": { "@babel/runtime": "^7.23.2", "@mui/utils": "^5.14.16", @@ -4629,11 +4657,6 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@r2wc/core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@r2wc/core/-/core-1.0.1.tgz", - "integrity": "sha512-3Q/IEvGoJ8E+wy8Y6vo+Hot35z89Ei0Ghr7WAhprxz1LhuCAaA2BIYXY8GjaCvJLGhiOLuiPMWb8DKfbrUzEMg==" - }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -5327,9 +5350,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", - "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dependencies": { "@types/react": "*" } @@ -7584,14 +7607,6 @@ "yarn": ">=1" } }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -12616,17 +12631,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/json-stable-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz", - "integrity": "sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==", - "dependencies": { - "jsonify": "^0.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -12649,14 +12653,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/jspdf": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/jspdf/-/jspdf-2.5.1.tgz", @@ -17102,6 +17098,11 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -18618,6 +18619,14 @@ "node": ">=0.4" } }, + "node_modules/xz-decompress": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xz-decompress/-/xz-decompress-0.2.1.tgz", + "integrity": "sha512-vgpc2zPchALa6D2lc+IFRrcAB3L4I40KmgUcPV7G70CfeMWzVdmlfDpyEczvsE435WgtH6WYYT/11Um57u7s6A==", + "engines": { + "node": ">=16" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", From abfa28d81d3f76827668505c816963e7852c45e0 Mon Sep 17 00:00:00 2001 From: bbimber Date: Wed, 20 Dec 2023 07:37:30 -0800 Subject: [PATCH 15/16] Restore prior logging level in SequenceAnalysisMaintenanceTask --- .../sequenceanalysis/SequenceAnalysisMaintenanceTask.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java index 8a0d749c0..637752206 100644 --- a/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java +++ b/SequenceAnalysis/src/org/labkey/sequenceanalysis/SequenceAnalysisMaintenanceTask.java @@ -172,8 +172,7 @@ else if (!d.getFile().exists()) { if (d != null && d.getFile() != null && d.getFile().exists()) { - // NOTE: ultimately remove this: - log.info("ReadData marked as archived, but file exists: " + rd.getRowid() + ", " + rd.getFileId1() + ", " + d.getFile().getPath() + " for container: " + (c == null ? rd.getContainer() : c.getPath())); + log.error("ReadData marked as archived, but file exists: " + rd.getRowid() + ", " + rd.getFileId1() + ", " + d.getFile().getPath() + " for container: " + (c == null ? rd.getContainer() : c.getPath())); } } } From 6382513e9c87b095a8b8b640795cf067ce5e3e5c Mon Sep 17 00:00:00 2001 From: bbimber Date: Wed, 20 Dec 2023 09:27:26 -0800 Subject: [PATCH 16/16] Add memory argument to nimble --- singlecell/src/org/labkey/singlecell/run/NimbleHelper.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/singlecell/src/org/labkey/singlecell/run/NimbleHelper.java b/singlecell/src/org/labkey/singlecell/run/NimbleHelper.java index 99274666b..f8b1133ee 100644 --- a/singlecell/src/org/labkey/singlecell/run/NimbleHelper.java +++ b/singlecell/src/org/labkey/singlecell/run/NimbleHelper.java @@ -451,6 +451,13 @@ private Map doAlignment(List genomes, List