Skip to content

Commit 32f6282

Browse files
committed
Refactor citeseq/hashing to use pre-computed count matrix
1 parent 4d8171b commit 32f6282

20 files changed

+1260
-3276
lines changed

singlecell/api-src/org/labkey/api/singlecell/CellHashingService.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,9 @@ static public void setInstance(CellHashingService instance)
4545
_instance = instance;
4646
}
4747

48-
abstract public void prepareHashingAndCiteSeqFilesIfNeeded(File sourceDir, PipelineJob job, SequenceAnalysisJobSupport support, String filterField, final boolean skipFailedCdna, boolean failIfNoHashing, boolean failIfNoCiteSeq) throws PipelineJobException;
48+
abstract public void prepareHashingAndCiteSeqFilesIfNeeded(File sourceDir, PipelineJob job, SequenceAnalysisJobSupport support, String filterField, boolean failIfNoHashing, boolean failIfNoCiteSeq) throws PipelineJobException;
4949

50-
abstract public File processCellHashingOrCiteSeq(SequenceOutputHandler.JobContext ctx, CellHashingParameters parameters) throws PipelineJobException;
51-
52-
abstract public File processCellHashingOrCiteSeq(PipelineOutputTracker output, File outputDir, File webserverPipelineDir, Logger log, CellHashingParameters parameters) throws PipelineJobException;
53-
54-
abstract public File processCellHashingOrCiteSeqForParent(Readset parentReadset, PipelineOutputTracker output, SequenceOutputHandler.JobContext ctx, CellHashingParameters parameters) throws PipelineJobException;
50+
abstract public File generateHashingCallsForRawMatrix(Readset parentReadset, PipelineOutputTracker output, SequenceOutputHandler.JobContext ctx, CellHashingParameters parameters, File rawCountMatrixDir) throws PipelineJobException;
5551

5652
abstract public File getCDNAInfoFile(File sourceDir);
5753

@@ -71,10 +67,12 @@ static public void setInstance(CellHashingService instance)
7167

7268
abstract public boolean usesCiteSeq(SequenceAnalysisJobSupport support, List<SequenceOutputFile> inputFiles) throws PipelineJobException;
7369

74-
abstract public List<ToolParameterDescriptor> getDefaultHashingParams(boolean includeExcludeFailedcDNA, BARCODE_TYPE type);
70+
abstract public List<ToolParameterDescriptor> getHashingCallingParams();
7571

7672
abstract public Set<String> getHtosForParentReadset(Integer parentReadsetId, File webserverJobDir, SequenceAnalysisJobSupport support) throws PipelineJobException;
7773

74+
abstract public File getExistingFeatureBarcodeCountDir(Readset parentReadset, BARCODE_TYPE type, SequenceAnalysisJobSupport support) throws PipelineJobException;
75+
7876
public static class CellHashingParameters
7977
{
8078
public BARCODE_TYPE type;
@@ -281,11 +279,11 @@ public Set<String> getAllowableBarcodeNames() throws PipelineJobException
281279
public enum CALLING_METHOD
282280
{
283281
multiseq(true),
284-
htodemux(true),
282+
htodemux(false),
285283
dropletutils(true),
286284
threshold(false),
287-
peaknd(true),
288-
seqnd(true);
285+
peaknd(false),
286+
seqnd(false);
289287

290288
boolean isDefault;
291289

singlecell/resources/chunks/AppendCiteSeq.R

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ for (datasetId in names(seuratObjects)) {
1010
featureMetadata <- NULL
1111
if (datasetId %in% names(featureMetadataFiles) && !is.null(featureMetadataFiles[[datasetId]])) {
1212
featureMetadata <- read.table(featureMetadataFiles[[datasetId]], sep = '\t', header = T, fill = TRUE)
13-
featureMetadata$rowname <- paste0(featureMetadata$tagname, '-', featureMetadata$sequence) #NOTE: this is the format used by Cite-Seq-Count
13+
featureMetadata$rowname <- featureMetadata$tagname
1414
adtWhitelist <- featureMetadata$rowname
1515
}
1616

@@ -24,5 +24,6 @@ for (datasetId in names(seuratObjects)) {
2424
newSeuratObjects[[datasetId]] <- seuratObj
2525

2626
# Cleanup
27+
rm(seuratObj)
2728
gc()
2829
}

singlecell/src/org/labkey/singlecell/CellHashingServiceImpl.java

Lines changed: 187 additions & 606 deletions
Large diffs are not rendered by default.

singlecell/src/org/labkey/singlecell/SingleCellModule.java

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,10 @@
3131
import org.labkey.api.util.PageFlowUtil;
3232
import org.labkey.api.view.WebPartFactory;
3333
import org.labkey.singlecell.analysis.AbstractSingleCellHandler;
34-
import org.labkey.singlecell.analysis.CellHashingHandler;
3534
import org.labkey.singlecell.analysis.CellRangerRawDataHandler;
36-
import org.labkey.singlecell.analysis.CellRangerSeuratHandler;
37-
import org.labkey.singlecell.analysis.CiteSeqHandler;
38-
import org.labkey.singlecell.analysis.LoupeCellHashingHandler;
3935
import org.labkey.singlecell.analysis.ProcessSeuratObjectHandler;
4036
import org.labkey.singlecell.analysis.ProcessSingleCellHandler;
41-
import org.labkey.singlecell.analysis.SeuratCellHashingHandler;
42-
import org.labkey.singlecell.analysis.SeuratCiteSeqHandler;
43-
import org.labkey.singlecell.button.CellHashingButton;
44-
import org.labkey.singlecell.button.CiteSeqButton;
37+
import org.labkey.singlecell.button.FeatureBarcodeButton;
4538
import org.labkey.singlecell.pipeline.singlecell.AppendCiteSeq;
4639
import org.labkey.singlecell.pipeline.singlecell.AvgExpression;
4740
import org.labkey.singlecell.pipeline.singlecell.CiteSeqDimRedux;
@@ -59,8 +52,9 @@
5952
import org.labkey.singlecell.pipeline.singlecell.RunSingleR;
6053
import org.labkey.singlecell.pipeline.singlecell.SplitSeurat;
6154
import org.labkey.singlecell.pipeline.singlecell.SubsetSeurat;
55+
import org.labkey.singlecell.run.CellRangerFeatureBarcodeHandler;
56+
import org.labkey.singlecell.run.CellRangerGexCountStep;
6257
import org.labkey.singlecell.run.CellRangerVDJWrapper;
63-
import org.labkey.singlecell.run.CellRangerWrapper;
6458

6559
import java.util.Collection;
6660
import java.util.Collections;
@@ -129,8 +123,7 @@ protected void doStartupAfterSpringConfig(ModuleContext moduleContext)
129123
LaboratoryService.get().registerDataProvider(new SingleCellProvider(this));
130124
SequenceAnalysisService.get().registerDataProvider(new SingleCellProvider(this));
131125

132-
LDKService.get().registerQueryButton(new CellHashingButton(), SingleCellSchema.SEQUENCE_SCHEMA_NAME, SingleCellSchema.TABLE_READSETS);
133-
LDKService.get().registerQueryButton(new CiteSeqButton(), SingleCellSchema.SEQUENCE_SCHEMA_NAME, SingleCellSchema.TABLE_READSETS);
126+
LDKService.get().registerQueryButton(new FeatureBarcodeButton(), SingleCellSchema.SEQUENCE_SCHEMA_NAME, SingleCellSchema.TABLE_READSETS);
134127

135128
LaboratoryService.get().registerTableCustomizer(this, SingleCellTableCustomizer.class, SingleCellSchema.NAME, SingleCellSchema.TABLE_SAMPLES);
136129
LaboratoryService.get().registerTableCustomizer(this, SingleCellTableCustomizer.class, SingleCellSchema.NAME, SingleCellSchema.TABLE_SORTS);
@@ -145,16 +138,11 @@ public static void registerPipelineSteps()
145138
SequencePipelineService.get().registerPipelineStepType(SingleCellStep.class, SingleCellStep.STEP_TYPE);
146139
CellHashingService.setInstance(CellHashingServiceImpl.get());
147140

148-
SequencePipelineService.get().registerPipelineStep(new CellRangerWrapper.Provider());
141+
SequencePipelineService.get().registerPipelineStep(new CellRangerGexCountStep.Provider());
149142
SequencePipelineService.get().registerPipelineStep(new CellRangerVDJWrapper.VDJProvider());
150143

151-
SequenceAnalysisService.get().registerReadsetHandler(new CellHashingHandler());
152-
SequenceAnalysisService.get().registerReadsetHandler(new CiteSeqHandler());
144+
SequenceAnalysisService.get().registerReadsetHandler(new CellRangerFeatureBarcodeHandler());
153145

154-
SequenceAnalysisService.get().registerFileHandler(new LoupeCellHashingHandler());
155-
SequenceAnalysisService.get().registerFileHandler(new SeuratCellHashingHandler());
156-
SequenceAnalysisService.get().registerFileHandler(new SeuratCiteSeqHandler());
157-
SequenceAnalysisService.get().registerFileHandler(new CellRangerSeuratHandler());
158146
SequenceAnalysisService.get().registerFileHandler(new CellRangerRawDataHandler());
159147
SequenceAnalysisService.get().registerFileHandler(new ProcessSingleCellHandler());
160148
SequenceAnalysisService.get().registerFileHandler(new ProcessSeuratObjectHandler());

singlecell/src/org/labkey/singlecell/analysis/AbstractSingleCellHandler.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.labkey.api.util.FileUtil;
3333
import org.labkey.api.view.ActionURL;
3434
import org.labkey.api.writer.PrintWriters;
35+
import org.labkey.singlecell.CellHashingServiceImpl;
3536
import org.labkey.singlecell.SingleCellModule;
3637
import org.labkey.singlecell.pipeline.singlecell.AbstractCellMembraneStep;
3738
import org.labkey.singlecell.pipeline.singlecell.PrepareRawCounts;
@@ -166,7 +167,7 @@ public void init(JobContext ctx, List<SequenceOutputFile> inputFiles, List<Recor
166167

167168
if (requiresHashingOrCite)
168169
{
169-
CellHashingService.get().prepareHashingAndCiteSeqFilesIfNeeded(ctx.getSourceDirectory(), ctx.getJob(), ctx.getSequenceSupport(), "readsetId", false, false, false);
170+
CellHashingService.get().prepareHashingAndCiteSeqFilesIfNeeded(ctx.getSourceDirectory(), ctx.getJob(), ctx.getSequenceSupport(), "readsetId", false, false);
170171
}
171172
}
172173

@@ -289,7 +290,7 @@ else if (step.createsSeuratObjects())
289290
{
290291
currentFiles = new ArrayList<>(output.getSeuratObjects());
291292
_resumer.getFileManager().addIntermediateFiles(currentFiles.stream().map(SingleCellStep.SeuratObjectWrapper::getFile).collect(Collectors.toSet()));
292-
_resumer.getFileManager().addIntermediateFiles(currentFiles.stream().map(x -> SeuratCellHashingHandler.getCellBarcodesFromSeurat(x.getFile())).collect(Collectors.toSet()));
293+
_resumer.getFileManager().addIntermediateFiles(currentFiles.stream().map(x -> CellHashingServiceImpl.get().getCellBarcodesFromSeurat(x.getFile())).collect(Collectors.toSet()));
293294
}
294295
else if (step.createsSeuratObjects())
295296
{
@@ -314,7 +315,7 @@ else if (step.createsSeuratObjects())
314315
ctx.getLogger().debug("Removing intermediate file: " + seurat.getFile().getPath());
315316
ctx.getFileManager().removeIntermediateFile(seurat.getFile());
316317
_resumer.getFileManager().removeIntermediateFile(seurat.getFile());
317-
_resumer.getFileManager().removeIntermediateFile(SeuratCellHashingHandler.getCellBarcodesFromSeurat(seurat.getFile()));
318+
_resumer.getFileManager().removeIntermediateFile(CellHashingServiceImpl.get().getCellBarcodesFromSeurat(seurat.getFile()));
318319
}
319320
}
320321

@@ -469,7 +470,7 @@ private List<SingleCellStep.SeuratObjectWrapper> processRawCounts(JobContext ctx
469470
throw new PipelineJobException("No seurat objects produced by: " + prepareRawCounts.getProvider().getName());
470471
}
471472
currentFiles.stream().map(SingleCellStep.SeuratObjectWrapper::getFile).forEach(_resumer.getFileManager()::addIntermediateFile);
472-
_resumer.getFileManager().addIntermediateFiles(currentFiles.stream().map(x -> SeuratCellHashingHandler.getCellBarcodesFromSeurat(x.getFile())).collect(Collectors.toSet()));
473+
_resumer.getFileManager().addIntermediateFiles(currentFiles.stream().map(x -> CellHashingServiceImpl.get().getCellBarcodesFromSeurat(x.getFile())).collect(Collectors.toSet()));
473474

474475
_resumer.setStepComplete(ctx.getLogger(), prepareRawCounts, 0, action, output0.getSeuratObjects(), output0.getMarkdownFile(), output0.getHtmlFile());
475476
}

0 commit comments

Comments
 (0)