Skip to content

Commit

Permalink
wip: mixcr successfully runs for input samples
Browse files Browse the repository at this point in the history
  • Loading branch information
dbolotin committed Aug 22, 2024
1 parent 2c35d81 commit 5dcbac8
Show file tree
Hide file tree
Showing 9 changed files with 123 additions and 55 deletions.
2 changes: 1 addition & 1 deletion model/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ export const platforma = BlockModel.create<BlockArgs>('Heavy')
if (!isPColumnSpec(v.obj)) return false;
const domain = v.obj.domain;
return (
v.obj.name === 'pl7.app/data/sequencing' &&
v.obj.name === 'pl7.app/sequencing/data' &&
((v.obj.valueType as string) === 'blob' || (v.obj.valueType as string) === 'file') &&
domain !== undefined &&
(domain['pl7.app/fileExtension'] === 'fastq' ||
Expand Down
15 changes: 11 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,17 @@
"@milaboratory/pl-block-tools": "catalog:",
"@changesets/cli": "catalog:"
},
"//": {},
"pnpm": {
"overrides": {
"@milaboratory/pl-middle-layer": "file:/Volumes/Data/Projects/MiLaboratory/platforma/ts-pl-middle-layer/milaboratory-pl-middle-layer-1.9.30.tgz"
"//": {
"pnpm": {
"overrides": {
"@milaboratory/pl-middle-layer": "file:/Volumes/Data/Projects/MiLaboratory/platforma/ts-pl-middle-layer/milaboratory-pl-middle-layer-1.9.30.tgz"
}
},
"pnpm1": {
"overrides": {
"@milaboratory/pl-middle-layer": "1.9.30",
"@milaboratory/tengo-sdk": "file:/Volumes/Data/Projects/MiLaboratory/blocks-beta/tengo-sdk"
}
}
}
}
77 changes: 46 additions & 31 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions pnpm-workspace.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ catalog:
'@milaboratory/block-builder': ^1.2.3

'@milaboratory/sdk-ui': ^0.12.18
'@milaboratory/sdk-test': ^1.4.11
'@milaboratory/sdk-test': ^1.4.12

'@milaboratory/tengo-sdk': ^1.0.14
'@milaboratory/tengo-sdk': ^1.0.15

'@milaboratory/platforma-uikit': ^1.0.24
'@milaboratory/platforma-uikit': ^1.0.25
'@milaboratory/sdk-vue': ^1.0.33
'@milaboratory/helpers': ^1.5.2

Expand Down
5 changes: 3 additions & 2 deletions test/src/wf.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ blockTest('empty imputs', { timeout: 10000 }, async ({ rawPrj: project, ml, help

blockTest(
'simple project',
{ timeout: 10000 },
{ timeout: 20000 },
async ({ rawPrj: project, ml, helpers, expect }) => {
const sndBlockId = await project.addBlock('Samples & Data', samplesAndDataBlockSpec);
const clonotypingBlockId = await project.addBlock('MiXCR Clonotyping', myBlockSpec);
Expand Down Expand Up @@ -115,7 +115,8 @@ blockTest(
} satisfies BlockArgs);
await project.runBlock(clonotypingBlockId);
const clonotypingStableState2 = await helpers.awaitBlockDoneAndGetStableBlockState(
clonotypingBlockId
clonotypingBlockId,
10000
);
console.dir(clonotypingStableState2, { depth: 5 });
}
Expand Down
23 changes: 11 additions & 12 deletions workflow/src/main.tpl.tengo
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
wf := import("@milaboratory/tengo-sdk:workflow")

render := import("@milaboratory/tengo-sdk:render")

maps := import("@milaboratory/tengo-sdk:maps")
ll := import("@milaboratory/tengo-sdk:ll")
smart := import("@milaboratory/tengo-sdk:smart")
Expand All @@ -8,7 +10,7 @@ llPFrames := import("@milaboratory/tengo-sdk:pframes.ll")

json := import("json")

mixcrAggTpl := ll.importTemplate(":mixcr-analyze")
runMixcrTpl := ll.importTemplate(":run-mixcr")

wf.setPreRun(ll.importTemplate(":prerun"))

Expand All @@ -19,22 +21,19 @@ wf.body(func(args) {

input := wf.resolve(inputRef)

mixcrResults := llPFrames.aggregate(
input.getFutureInputField("data"), [1], mixcrAggTpl,
["qc"],
false,
{
params: smart.createJsonResource({
preset: preset
})
}
)
runMixcr := render.createEphemeral(runMixcrTpl, {
params: smart.createJsonResource({
preset: preset
}),
inputSpec: input.getFutureInputField("spec"),
inputData: input.getFutureInputField("data")
})

exports := {}

return {
outputs: {
qc: mixcrResults.output("qc")
qc: runMixcr.output("qc")
},
exports: exports
}
Expand Down
9 changes: 7 additions & 2 deletions workflow/src/mixcr-analyze.tpl.tengo
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ pConstants := import("@milaboratory/tengo-sdk:pframes.constants")
ll := import("@milaboratory/tengo-sdk:ll")
exec := import("@milaboratory/tengo-sdk:exec")

json := import("json")

self.defineOutputs("qc")

self.body(func(inputs) {
Expand All @@ -18,15 +20,18 @@ self.body(func(inputs) {

if inputDataMeta.keyLength == 1 {
mixcrCmdBuilder := exec.builder().
printErrStreamToStdout().
cmd("mixcr").
arg("analyze").
arg(preset)

for r, inputFile in inputData.inputs() {
for sKey, inputFile in inputData.inputs() {
key := json.decode(sKey)
r := key[0]
if (r[0] != 'R' && r[0] != "I") || (r[1] != '1' && r[1] != '2') || len(r) != 2 {
ll.panic("malformed read index: %v", r)
}
fileName := "input_" + r + fileExtension
fileName := "input_" + r + "." + fileExtension
mixcrCmdBuilder.addFile(fileName, inputFile).
arg(fileName)
}
Expand Down
1 change: 1 addition & 0 deletions workflow/src/prerun.tpl.tengo
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ wf.body(func(args) {
cmd("mixcr").
arg("listPresetSpecificationsForUI").
arg("presets.json").
inUiQueue().
cache(24 * 60 * 60 * 1000).
saveFile("presets.json").
run()
Expand Down
40 changes: 40 additions & 0 deletions workflow/src/run-mixcr.tpl.tengo
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// run-mixcr

self := import("@milaboratory/tengo-sdk:tpl")

ll := import("@milaboratory/tengo-sdk:ll")
smart := import("@milaboratory/tengo-sdk:smart")
file := import("@milaboratory/tengo-sdk:file")
llPFrames := import("@milaboratory/tengo-sdk:pframes.ll")

json := import("json")

mixcrAggTpl := ll.importTemplate(":mixcr-analyze")

self.awaitState("InputsLocked")
self.awaitState("params", "ResourceReady")
self.awaitState("inputSpec", "ResourceReady")

self.body(func(inputs) {
params := inputs.params
preset := params.preset
inputSpec := self.rawInputs().inputSpec.getValue().getDataAsJson()

fileExtension := inputSpec.domain["pl7.app/fileExtension"]

mixcrResults := llPFrames.aggregate(
self.rawInputs().inputData, [1], mixcrAggTpl,
["qc"],
false,
{
params: smart.createJsonResource({
preset: preset,
fileExtension: fileExtension
})
}
)

return {
qc: mixcrResults.output("qc")
}
})

0 comments on commit 5dcbac8

Please sign in to comment.