Skip to content

Commit 0cd109c

Browse files
committed
Enable CITE-seq processing
1 parent 964ca03 commit 0cd109c

File tree

4 files changed

+83
-12
lines changed

4 files changed

+83
-12
lines changed

singlecell/api-src/org/labkey/api/singlecell/pipeline/AbstractSingleCellPipelineStep.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -415,11 +415,11 @@ protected Chunk createFinalChunk() throws PipelineJobException
415415

416416
public static class Chunk
417417
{
418-
String header;
419-
String extraText;
420-
String chunkName;
421-
String chunkOpts;
422-
List<String> bodyLines;
418+
public String header;
419+
public String extraText;
420+
public String chunkName;
421+
public String chunkOpts;
422+
public List<String> bodyLines;
423423

424424
public Chunk(String chunkName, @Nullable String header, @Nullable String extraText, List<String> bodyLines)
425425
{

singlecell/resources/chunks/AppendCiteSeq.R

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,20 @@ for (datasetId in names(seuratObjects)) {
55
stop(paste0('No CITE-seq information found for datasetId: ', datasetId))
66
}
77

8-
# callFile <- featureData[[datasetId]]
9-
# if (!is.null(callFile)) {
10-
# seuratObj <- CellMembrane::AppendCiteSeq(seuratObj, barcodeCallFile = callFile, barcodePrefix = datasetId)
11-
# }
8+
adtWhitelist <- NULL
9+
featureMetadata <- NULL
10+
if (datasetId %in% names(featureMetadataFiles) && !is.null(featureMetadataFiles[[datasetId]])) {
11+
featureMetadata <- read.table(featureMetadataFiles[[datasetId]], sep = '\t', header = T)
12+
featureMetadata$rowname <- paste0(featureMetadata$tagname, '-', featureMetadata$sequence)
13+
adtWhitelist <- featureMetadata$rowname
14+
}
15+
16+
matrixDir <- featureData[[datasetId]]
17+
if (!is.null(matrixDir)) {
18+
seuratObj <- CellMembrane::AppendCiteSeq(seuratObj, unfilteredMatrixDir = matrixDir, normalizeMethod = normalizeMethod, datasetId = datasetId, featureMetadata = featureMetadata, adtWhitelist = adtWhitelist)
19+
} else {
20+
print('matrixDir was NULL, skipping CITE-seq')
21+
}
1222

1323
newSeuratObjects[[datasetId]] <- seuratObj
1424

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1360,6 +1360,11 @@ public Map<String, Object> executeCiteSeqCount(File outputDir, String basename,
13601360
baseArgs.add("-cells");
13611361
baseArgs.add(parameters.cells == null ? "0" : String.valueOf(parameters.cells));
13621362
}
1363+
else if (parameters.cells != null)
1364+
{
1365+
baseArgs.add("-cells");
1366+
baseArgs.add(String.valueOf(parameters.cells));
1367+
}
13631368

13641369
Integer cores = SequencePipelineService.get().getMaxThreads(log);
13651370
if (cores != null)
@@ -1370,7 +1375,7 @@ public Map<String, Object> executeCiteSeqCount(File outputDir, String basename,
13701375

13711376
for (ToolParameterDescriptor param : CellHashingHandler.getDefaultParams(parameters.type))
13721377
{
1373-
if (parameters.cellBarcodeWhitelistFile != null && param.getName().equals("cells"))
1378+
if ((parameters.cellBarcodeWhitelistFile != null || parameters.cells != null) && param.getName().equals("cells"))
13741379
{
13751380
continue;
13761381
}

singlecell/src/org/labkey/singlecell/pipeline/singlecell/AppendCiteSeq.java

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.labkey.singlecell.pipeline.singlecell;
22

3+
import org.apache.commons.io.FileUtils;
34
import org.json.JSONObject;
45
import org.labkey.api.pipeline.PipelineJobException;
56
import org.labkey.api.sequenceanalysis.SequenceOutputFile;
@@ -13,11 +14,13 @@
1314
import org.labkey.api.singlecell.pipeline.SingleCellOutput;
1415
import org.labkey.api.singlecell.pipeline.SingleCellStep;
1516
import org.labkey.api.util.PageFlowUtil;
17+
import org.labkey.singlecell.CellHashingServiceImpl;
1618
import org.labkey.singlecell.analysis.CellRangerSeuratHandler;
1719
import org.labkey.singlecell.analysis.SeuratCellHashingHandler;
1820
import org.labkey.singlecell.analysis.SeuratCiteSeqHandler;
1921

2022
import java.io.File;
23+
import java.io.IOException;
2124
import java.util.ArrayList;
2225
import java.util.Collection;
2326
import java.util.Collections;
@@ -106,22 +109,75 @@ protected Map<Integer, File> prepareCountData(SingleCellOutput output, SequenceO
106109
params.outputCategory = SeuratCiteSeqHandler.CATEGORY;
107110
params.createOutputFiles = true;
108111
params.genomeId = wrapper.getSequenceOutputFile().getLibrary_id();
109-
params.cellBarcodeWhitelistFile = cellBarcodesParsed;
112+
//params.cellBarcodeWhitelistFile = cellBarcodesParsed;
110113
params.cells = 250000;
111114

112115
finalOutput = CellHashingService.get().processCellHashingOrCiteSeqForParent(parentReadset, output, ctx, params);
116+
117+
File validAdt = CellHashingServiceImpl.get().getValidCiteSeqBarcodeMetadataFile(ctx.getSourceDirectory(), parentReadset.getReadsetId());
118+
if (!validAdt.exists())
119+
{
120+
throw new PipelineJobException("Unable to find ADT metadata. expected: " + validAdt.getPath());
121+
}
122+
123+
try
124+
{
125+
FileUtils.copyFile(validAdt, getAdtMetadata(finalOutput));
126+
}
127+
catch (IOException e)
128+
{
129+
throw new PipelineJobException(e);
130+
}
113131
}
114132
else
115133
{
116134
ctx.getLogger().info("CITE-seq not used, skipping: " + parentReadset.getName());
117135
}
118136

119-
dataIdToCalls.put(wrapper.getSequenceOutputFileId(), finalOutput);
137+
dataIdToCalls.put(wrapper.getSequenceOutputFileId(), finalOutput.getParentFile());
120138
}
121139

122140
return dataIdToCalls;
123141
}
124142

143+
public File getAdtMetadata(File countMatrix)
144+
{
145+
return new File(countMatrix.getParentFile(), "adtMetadata.txt");
146+
}
147+
148+
@Override
149+
protected Chunk createDataChunk(Map<Integer, File> hashingData)
150+
{
151+
Chunk ret = super.createDataChunk(hashingData);
152+
153+
List<String> lines = new ArrayList<>();
154+
155+
lines.add("featureMetadataFiles <- list(");
156+
for (Integer key : hashingData.keySet())
157+
{
158+
if (hashingData.get(key) == null)
159+
{
160+
lines.add("\t'" + key + "' = NULL,");
161+
}
162+
else
163+
{
164+
File meta = getAdtMetadata(hashingData.get(key));
165+
lines.add("\t'" + key + "' = '" + meta.getName() + "',");
166+
}
167+
}
168+
169+
// Remove trailing comma:
170+
int lastIdx = lines.size() - 1;
171+
lines.set(lastIdx, lines.get(lastIdx).replaceAll(",$", ""));
172+
173+
lines.add(")");
174+
lines.add("");
175+
176+
ret.bodyLines.addAll(lines);
177+
178+
return ret;
179+
}
180+
125181
@Override
126182
public boolean isIncluded(SequenceOutputHandler.JobContext ctx, List<SequenceOutputFile> inputs) throws PipelineJobException
127183
{

0 commit comments

Comments
 (0)