diff --git a/.changeset/smooth-rockets-confess.md b/.changeset/smooth-rockets-confess.md new file mode 100644 index 0000000..f6692fa --- /dev/null +++ b/.changeset/smooth-rockets-confess.md @@ -0,0 +1,6 @@ +--- +'@platforma-open/milaboratories.repertoire-diversity.workflow': minor +'@platforma-open/milaboratories.repertoire-diversity.model': minor +--- + +Outliers removed from table and plots if option "Drop outliers" is on diff --git a/model/src/index.ts b/model/src/index.ts index 4514739..42fc8e8 100644 --- a/model/src/index.ts +++ b/model/src/index.ts @@ -124,7 +124,8 @@ export const model = BlockModel.create() .getData() .entries.map((v) => v.obj) .filter(isPColumn) - .filter((column) => valueTypes.find((valueType) => valueType === column.spec.valueType)); + .filter((column) => valueTypes.find((valueType) => valueType === column.spec.valueType)) + .filter((column) => column.spec.name !== "Sample"); return ctx.createPFrame([...pCols, ...upstream]); }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6095ba9..fc5262c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,6 +18,9 @@ catalogs: '@platforma-open/milaboratories.software-mixcr': specifier: 4.7.0-137-develop version: 4.7.0-137-develop + '@platforma-open/milaboratories.software-ptransform': + specifier: ^1.2.0 + version: 1.2.0 '@platforma-open/milaboratories.software-small-binaries': specifier: ^1.15.7 version: 1.15.7 @@ -155,6 +158,9 @@ importers: '@platforma-open/milaboratories.software-mixcr': specifier: 'catalog:' version: 4.7.0-137-develop + '@platforma-open/milaboratories.software-ptransform': + specifier: 'catalog:' + version: 1.2.0 '@platforma-open/milaboratories.software-small-binaries': specifier: 'catalog:' version: 1.15.7 @@ -1067,6 +1073,9 @@ packages: '@platforma-open/milaboratories.software-mixcr@4.7.0-137-develop': resolution: {integrity: sha512-/ZqmRDkbVytX1MWgJyIj8xzU6ZiXQzSoa1Et9OyNcfR7nssfcjPE0+jxX027oSmekuRIBk6YXeIR4bGyGKGv1g==} + '@platforma-open/milaboratories.software-ptransform@1.2.0': + resolution: {integrity: sha512-OCSEvD9XqJomOeVPqbKntev0bX22Ieh4+Ljo2ucLXyZV1rhkt9GssCnAZqaV43Fkf127O4z6QFyG/G/8Wlau8w==} + '@platforma-open/milaboratories.software-small-binaries.guided-command@1.0.4': resolution: {integrity: sha512-LD8XQDnR+L9oRD7JXE0VWGmv1/0cm+J71flrwBUWeIbuaenPC8Nsza8oy7JjLJ8AX+bm8XAyyJALuqBBqkL95Q==} @@ -5976,6 +5985,8 @@ snapshots: '@platforma-open/milaboratories.software-mixcr@4.7.0-137-develop': {} + '@platforma-open/milaboratories.software-ptransform@1.2.0': {} + '@platforma-open/milaboratories.software-small-binaries.guided-command@1.0.4': {} '@platforma-open/milaboratories.software-small-binaries.hello-world-py@1.0.4': {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e5891e7..85c6b6c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -15,6 +15,7 @@ catalog: '@milaboratories/software-pframes-conv': ^2.1.8 '@platforma-open/milaboratories.software-small-binaries': ^1.15.7 '@platforma-open/milaboratories.software-mixcr': 4.7.0-137-develop + '@platforma-open/milaboratories.software-ptransform': ^1.2.0 '@platforma-sdk/test': ^1.22.22 diff --git a/workflow/package.json b/workflow/package.json index db74255..0d3404b 100644 --- a/workflow/package.json +++ b/workflow/package.json @@ -14,6 +14,7 @@ "@milaboratories/software-pframes-conv": "catalog:", "@platforma-open/milaboratories.software-small-binaries": "catalog:", "@platforma-open/milaboratories.software-mixcr": "catalog:", + "@platforma-open/milaboratories.software-ptransform": "catalog:", "vitest": "catalog:" } } diff --git a/workflow/src/filterTables.lib.tengo b/workflow/src/filterTables.lib.tengo new file mode 100644 index 0000000..9b68603 --- /dev/null +++ b/workflow/src/filterTables.lib.tengo @@ -0,0 +1,36 @@ +ll := import("@platforma-sdk/workflow-tengo:ll") +exec := import("@platforma-sdk/workflow-tengo:exec") +assets := import("@platforma-sdk/workflow-tengo:assets") +json := import("json") +paggregateSw := assets.importSoftware("@platforma-open/milaboratories.software-ptransform:main") + +//// aggregating by-nodes output to make it uniquely addressable by it's native key +filterOutliers := func(inputTsv) { + filterWorkflow := { steps: [ + { + type: "filter", + predicate: { + type: "gt", + value: 0, + column: "Observed diversity" + } + } + ] + } + + + filterCmd := exec.builder(). + printErrStreamToStdout(). + software(paggregateSw). + arg("--workflow").arg("wf.json"). + writeFile("wf.json", json.encode(filterWorkflow)). + arg("input.tsv").addFile("input.tsv", inputTsv). + arg("output.tsv").saveFile("output.tsv"). + run() + + return filterCmd.getFile("output.tsv") +} + +export ll.toStrict({ + filterOutliers: filterOutliers +}) \ No newline at end of file diff --git a/workflow/src/importTsv.tpl.tengo b/workflow/src/importTsv.tpl.tengo index 34e38b0..f2842f5 100644 --- a/workflow/src/importTsv.tpl.tengo +++ b/workflow/src/importTsv.tpl.tengo @@ -10,6 +10,8 @@ json := import("json") self.defineOutputs("pf") +filterTables := import(":filterTables") + tsvImportParams := { "axes": [ { @@ -58,8 +60,9 @@ self.body(func(args) { tsvMap := pColumn.resourceMapBuilder(/* key length*/ 1 ) for fileName, file in args.tsv { + filteredFile := filterTables.filterOutliers(file) chain := fileName[FILE_NAME_PREFIX_LEN:(len(fileName) - FILE_NAME_SUFFIX_LEN)] - tsvMap.add([chain], file) + tsvMap.add([chain], filteredFile) } tsvMap = tsvMap.build()