diff --git a/singlecell/api-src/org/labkey/api/singlecell/pipeline/AbstractSingleCellPipelineStep.java b/singlecell/api-src/org/labkey/api/singlecell/pipeline/AbstractSingleCellPipelineStep.java index add9ee2da..b10ba3191 100644 --- a/singlecell/api-src/org/labkey/api/singlecell/pipeline/AbstractSingleCellPipelineStep.java +++ b/singlecell/api-src/org/labkey/api/singlecell/pipeline/AbstractSingleCellPipelineStep.java @@ -348,38 +348,52 @@ public static void executeR(SequenceOutputHandler.JobContext ctx, String dockerC localBashScript.delete(); } - protected String prepareValueForR(SeuratToolParameter pd) + protected void addParameterVariables(SeuratToolParameter pd, List body) { String val = StringUtils.trimToNull(pd.extractValue(getPipelineCtx().getJob(), getProvider(), getStepIdx())); if (val == null) { - return "NULL"; + body.add((pd.getVariableName() + " <- NULL")); } else if ("false".equals(val)) { - return "FALSE"; + body.add((pd.getVariableName() + " <- FALSE")); } else if ("true".equals(val)) { - return "TRUE"; + body.add((pd.getVariableName() + " <- TRUE")); } else if (NumberUtils.isCreatable(val)) { - return val; + body.add((pd.getVariableName() + " <- " + val)); } else if ("sequenceanalysis-trimmingtextarea".equals(pd.getFieldXtype())) { val = val.replace("'", "\\\'"); - String[] vals = val.split(pd.getDelimiter()); - return "c('" + StringUtils.join(vals, "','") + "')"; + serializeMultiValueParam(pd, body, val); } else if (pd.isMultiValue()) { - String[] vals = val.split(pd.getDelimiter()); - return "c('" + StringUtils.join(vals, "','") + "')"; + serializeMultiValueParam(pd, body, val); } + else + { + body.add((pd.getVariableName() + " <- '" + val + "'")); + } + } - return "'" + val + "'"; + private void serializeMultiValueParam(SeuratToolParameter pd, List body, String val) + { + String[] vals = val.split(pd.getDelimiter()); + final int batchSize = 75; + int numBatches = (int)Math.ceil((double)vals.length / batchSize); + + for (int i=0;i loadChunkFromFile() throws PipelineJobException @@ -423,7 +437,7 @@ protected Chunk createParamChunk(SequenceOutputHandler.JobContext ctx, List provider, int stepIdx) { if (!_includeIfEmptyOrNull) { diff --git a/singlecell/resources/chunks/NimbleAppend.R b/singlecell/resources/chunks/AppendNimble.R similarity index 100% rename from singlecell/resources/chunks/NimbleAppend.R rename to singlecell/resources/chunks/AppendNimble.R diff --git a/singlecell/resources/chunks/TcrFilter.R b/singlecell/resources/chunks/TcrFilter.R index 7da1c4e08..3a5066254 100644 --- a/singlecell/resources/chunks/TcrFilter.R +++ b/singlecell/resources/chunks/TcrFilter.R @@ -18,7 +18,11 @@ for (datasetId in names(seuratObjects)) { cdr3ForLocus <- gsub(cdr3ForLocus, pattern = paste0(fieldName, ':'), replacement = '') matchingCells <- sapply(seuratObj@meta.data[[fieldName]], function(x){ - values <- unlist(strsplit(x, split = ',')) + if (is.na(x)) { + return(FALSE) + } + + values <- unlist(strsplit(as.character(x), split = ',')) return(length(intersect(values, cdr3ForLocus)) != 0) }) @@ -37,8 +41,9 @@ for (datasetId in names(seuratObjects)) { if (all(is.null(cellsToKeep))) { print('There were no matching cells') } else { + print(paste0('Total passing cells: ', length(cellsToKeep))) seuratObj <- subset(seuratObj, cells = cellsToKeep) - #saveData(seuratObj, datasetId) + saveData(seuratObj, datasetId) totalPassed <- totalPassed + 1 } diff --git a/singlecell/src/org/labkey/singlecell/SingleCellModule.java b/singlecell/src/org/labkey/singlecell/SingleCellModule.java index 6c2b35a02..821328730 100644 --- a/singlecell/src/org/labkey/singlecell/SingleCellModule.java +++ b/singlecell/src/org/labkey/singlecell/SingleCellModule.java @@ -188,7 +188,7 @@ public static void registerPipelineSteps() SequencePipelineService.get().registerPipelineStep(new CheckExpectations.Provider()); SequencePipelineService.get().registerPipelineStep(new CommonFilters.Provider()); SequencePipelineService.get().registerPipelineStep(new RunVision.Provider()); - SequencePipelineService.get().registerPipelineStep(new NimbleAppend.Provider()); + SequencePipelineService.get().registerPipelineStep(new AppendNimble.Provider()); SequencePipelineService.get().registerPipelineStep(new AppendTcr.Provider()); SequencePipelineService.get().registerPipelineStep(new TcrFilter.Provider()); diff --git a/singlecell/src/org/labkey/singlecell/pipeline/singlecell/NimbleAppend.java b/singlecell/src/org/labkey/singlecell/pipeline/singlecell/AppendNimble.java similarity index 88% rename from singlecell/src/org/labkey/singlecell/pipeline/singlecell/NimbleAppend.java rename to singlecell/src/org/labkey/singlecell/pipeline/singlecell/AppendNimble.java index bcf8822f6..7088332c1 100644 --- a/singlecell/src/org/labkey/singlecell/pipeline/singlecell/NimbleAppend.java +++ b/singlecell/src/org/labkey/singlecell/pipeline/singlecell/AppendNimble.java @@ -15,9 +15,9 @@ import java.util.List; import java.util.Set; -public class NimbleAppend extends AbstractRDiscvrStep +public class AppendNimble extends AbstractRDiscvrStep { - public NimbleAppend(PipelineContext ctx, NimbleAppend.Provider provider) + public AppendNimble(PipelineContext ctx, AppendNimble.Provider provider) { super(provider, ctx); } @@ -35,9 +35,9 @@ public Provider() @Override - public NimbleAppend create(PipelineContext ctx) + public AppendNimble create(PipelineContext ctx) { - return new NimbleAppend(ctx, this); + return new AppendNimble(ctx, this); } } @@ -62,6 +62,7 @@ protected Chunk createParamChunk(SequenceOutputHandler.JobContext ctx, List htosPerReadset = CellHashingServiceImpl.get().getHtosForParentReadset(parentReadset.getReadsetId(), ctx.getSourceDirectory(), ctx.getSequenceSupport(), false);