Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
6843559
Fix HTML
bbimber Aug 27, 2026
49b17e8
Support RecoverUnassignedCells()
bbimber Aug 28, 2026
968d402
Switch from waitForCompletion to Future.get()
bbimber Aug 31, 2026
ba788cc
Prefer samtools merge over picard for speed
bbimber Aug 31, 2026
ed67eec
Update samtools merge argument order
bbimber Aug 31, 2026
303bc6d
Bugfix to samtools merge
bbimber Sep 1, 2026
fcec9d9
Try to reduce I/O in SequenceAnalysisMaintenanceTask
bbimber Sep 1, 2026
223b851
Only use samtools merge when the inputs are sorted
bbimber Sep 1, 2026
11629bd
Bugfix to readset permission check
bbimber Sep 2, 2026
2c48fc5
Bump react-router-dom from 6.30.4 to 6.30.6 in /jbrowse (#420)
dependabot[bot] Sep 3, 2026
5bf7883
Bump the npm_and_yarn group across 1 directory with 3 updates (#419)
dependabot[bot] Sep 3, 2026
aac7980
Bump fast-uri in /jbrowse in the npm_and_yarn group across 1 director…
dependabot[bot] Sep 3, 2026
aeba6ad
Increase logging in SequenceAnalysisMaintenanceTask
bbimber Sep 3, 2026
1d5c271
Debug SequenceAnalysisMaintenanceTask
bbimber Sep 4, 2026
7c6b6d1
Properly drop constraint
bbimber Sep 4, 2026
238cf5f
Bugfix to SequenceAnalysisMaintenanceTask
bbimber Sep 4, 2026
9201aaf
Bugfix to ArchiveReadsetsAction
bbimber Sep 7, 2026
fd3a611
Update @labkey packages
bbimber Sep 29, 2026
d2b1d12
JBrowse/npm audit fix
bbimber Sep 29, 2026
f2354fd
Update JBrowse dependencies
bbimber Sep 29, 2026
fda48eb
Update jbrowse package-lock
bbimber Sep 30, 2026
62ffcda
Fix JB build
bbimber Sep 30, 2026
07db9c4
Fix JB build
bbimber Sep 30, 2026
d13739b
Fix merge conflicts
bbimber Sep 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TABLE sequenceanalysis.barcodes DROP CONSTRAINT IF EXISTS UNIQUE_barcodes;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ALTER TABLE sequenceanalysis.barcodes DROP CONSTRAINT IF EXISTS UNIQUE_barcodes;
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.zip.GZIPInputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
Expand Down Expand Up @@ -717,7 +718,7 @@ else if (SequenceAnalysisSchema.TABLE_OUTPUTFILES.equals(_table.getName()))
msg.append("Folder: ").unsafeAppend("<a href='" + url.toString() + "' target='_blank'>" + h(target.getPath()) + "</a><br><input type='hidden' name='jobIds' value='" + h(sf.getRowId()) + "'/>");
}
}
msg.append("<br>");
msg.unsafeAppend("<br>");
}
}
}
Expand Down Expand Up @@ -1914,7 +1915,7 @@ else if (!d.getFile().exists())
{
throw new PipelineValidationException("Missing file for data: " + o.get("dataId"));
}
else if (d.getContainer().hasPermission(u, ReadPermission.class))
else if (!d.getContainer().hasPermission(u, ReadPermission.class))
{
throw new UnauthorizedException("You do not have permission to read data: " + o.get("dataId"));
}
Expand Down Expand Up @@ -5161,14 +5162,13 @@ public ApiResponse execute(ArchiveReadsetsForm form, BindException errors) throw

if (!toUpdate.isEmpty())
{
List<Map<String, Object>> keys = new ArrayList<>();
toUpdate.forEach(row -> {
keys.add(new CaseInsensitiveHashMap<>(Map.of("rowid", row.get("rowid"))));
});
// Remove duplicates:
List<Map<String, Object>> uniqueToUpdate = toUpdate.stream().distinct().toList();
List<Map<String, Object>> keys = uniqueToUpdate.stream().map(row -> new CaseInsensitiveHashMap<>(Map.of("rowid", row.get("rowid")))).collect(Collectors.toList());

try
{
readData.getUpdateService().updateRows(getUser(), getContainer(), toUpdate, keys, null, null);
readData.getUpdateService().updateRows(getUser(), getContainer(), uniqueToUpdate, keys, null, null);
}
catch (Exception e)
{
Expand Down

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ public String getName()
@Override
public Double getSchemaVersion()
{
return 12.333;
return 12.334;
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;

import static org.labkey.api.util.IntegerUtils.asInteger;

Expand Down Expand Up @@ -467,7 +468,7 @@ public RecordedActionSet run() throws PipelineJobException
{
getJob().getLogger().info("running genome trigger: " + t.getName());
final int libraryId = rowId;
jr.execute(new Job()
Future<?> future = jr.execute(new Job()
{
@Override
public void run()
Expand All @@ -481,11 +482,12 @@ public void run()
t.onRecreate(getJob().getContainer(), getJob().getUser(), getJob().getLogger(), libraryId);
}
}
});
}, 0);

// Wait for this job:
future.get();
}
}

jr.waitForCompletion();
}
}
catch (Exception e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.Future;

import static org.labkey.api.util.IntegerUtils.asInteger;

Expand Down Expand Up @@ -163,18 +164,19 @@ public boolean isJobComplete(PipelineJob job)
if (t.isAvailable(genomeContainer))
{
getJob().getLogger().info("running genome trigger: " + t.getName());
jr.execute(new Job()
Future<?> future = jr.execute(new Job()
{
@Override
public void run()
{
t.onTrackAdd(genomeContainer, getJob().getUser(), getJob().getLogger(), libraryId, trackId);
}
});
}, 0);

// Wait for the job:
future.get();
}
}

jr.waitForCompletion();
}

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
import org.labkey.sequenceanalysis.ReadDataImpl;
import org.labkey.sequenceanalysis.SequenceReadsetImpl;
import org.labkey.sequenceanalysis.run.RestoreSraDataHandler;
import org.labkey.sequenceanalysis.run.SamtoolsMerger;
import org.labkey.sequenceanalysis.run.bampostprocessing.SortSamStep;
import org.labkey.sequenceanalysis.run.preprocessing.TrimmomaticWrapper;
import org.labkey.sequenceanalysis.run.util.AddOrReplaceReadGroupsWrapper;
Expand Down Expand Up @@ -1306,7 +1307,6 @@ private File doAlignThenMerge(ReferenceGenome referenceGenome, Readset rs, Map<R
RecordedAction mergeAction = new RecordedAction(MERGE_ALIGNMENT_ACTIONNAME);
Date start = new Date();
mergeAction.setStartTime(start);
MergeSamFilesWrapper mergeSamFilesWrapper = new MergeSamFilesWrapper(getJob().getLogger());
List<File> bams = new ArrayList<>();
for (File o : alignOutputs)
{
Expand All @@ -1316,20 +1316,45 @@ private File doAlignThenMerge(ReferenceGenome referenceGenome, Readset rs, Map<R
getHelper().getFileManager().addIntermediateFile(SequenceAnalysisService.get().getExpectedBamOrCramIndex(o));
}

bam = new File(alignOutputs.get(0).getParent(), FileUtil.getBaseName(alignOutputs.get(0).getName()) + ".merged.bam");
bam = new File(alignOutputs.getFirst().getParent(), FileUtil.getBaseName(alignOutputs.getFirst().getName()) + ".merged.bam");
getHelper().getFileManager().addOutput(mergeAction, "Merged BAM", bam);
Set<SAMFileHeader.SortOrder> sortOrders = alignOutputs.stream().map(x -> {
try
{
return SequenceUtil.getBamSortOrder(x);
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}).collect(Collectors.toSet());

//NOTE: merged BAMs will be deleted as intermediate files, and if we delete too early this breaks job resume
mergeSamFilesWrapper.execute(bams, bam, false);
getHelper().getFileManager().addCommandsToAction(mergeSamFilesWrapper.getCommandsExecuted(), mergeAction);
String toolName;
if (sortOrders.size() > 1 || sortOrders.iterator().next() != SAMFileHeader.SortOrder.coordinate)
{
toolName = "MergeSamFiles";
MergeSamFilesWrapper merger = new MergeSamFilesWrapper(getPipelineJob().getLogger());
merger.execute(bams, bam, false);
getHelper().getFileManager().addCommandsToAction(merger.getCommandsExecuted(), mergeAction);
}
else
{
// This will be faster, but requires sorted input:
toolName = "Samtools merge";
SamtoolsMerger merger = new SamtoolsMerger(getPipelineJob().getLogger());
merger.mergeBams(bams, bam);
getHelper().getFileManager().addCommandsToAction(merger.getCommandsExecuted(), mergeAction);
}

Date end = new Date();
mergeAction.setEndTime(end);
getJob().getLogger().info("MergeSamFiles Duration: " + DurationFormatUtils.formatDurationWords(end.getTime() - start.getTime(), true, true));
getJob().getLogger().info(toolName + " Duration: " + DurationFormatUtils.formatDurationWords(end.getTime() - start.getTime(), true, true));
alignActions.add(mergeAction);
}
else
{
bam = alignOutputs.get(0);
bam = alignOutputs.getFirst();
}

return bam;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package org.labkey.sequenceanalysis.run;

import org.apache.logging.log4j.Logger;
import org.labkey.api.pipeline.PipelineJobException;
import org.labkey.api.sequenceanalysis.pipeline.SamtoolsRunner;
import org.labkey.api.sequenceanalysis.pipeline.SequencePipelineService;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class SamtoolsMerger extends SamtoolsRunner
{
private static final String COMMAND = "merge";

public SamtoolsMerger(Logger log)
{
super(log);
}

public File mergeBams(List<File> inputBams, File outputFile) throws PipelineJobException
{
getLogger().info("Merging SAM/BAM(s):");

List<String> params = new ArrayList<>();
params.add(getSamtoolsPath().getPath());
params.add(COMMAND);

Integer threads = SequencePipelineService.get().getMaxThreads(getLogger());
if (threads != null)
{
params.add("--threads");
params.add(String.valueOf(threads));
}

params.add("-o");
params.add(outputFile.getPath());

inputBams.forEach(f -> params.add(f.getPath()));

execute(params);

File idx = SequencePipelineService.get().ensureBamIndex(outputFile, getLogger(), false);
if (!idx.exists())
{
throw new PipelineJobException("Unable to find BAM index: " + idx.getPath());
}

return outputFile;
}
}
Loading
Loading