@platforma-open/milaboratories.top-antibodies.workflow 2.0.1 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
   WARN  Issue while reading "/home/runner/work/antibody-tcr-lead-selection/antibody-tcr-lead-selection/.npmrc". Failed to replace env in config: ${NPMJS_TOKEN}
2
2
 
3
- > @platforma-open/milaboratories.top-antibodies.workflow@2.0.1 build /home/runner/work/antibody-tcr-lead-selection/antibody-tcr-lead-selection/workflow
3
+ > @platforma-open/milaboratories.top-antibodies.workflow@2.2.0 build /home/runner/work/antibody-tcr-lead-selection/antibody-tcr-lead-selection/workflow
4
4
  > shx rm -rf dist && pl-tengo check && pl-tengo build
5
5
 
6
6
  Processing "src/assembling-fasta.tpl.tengo"...
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # @platforma-open/milaboratories.top-antibodies.workflow
2
2
 
3
+ ## 2.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - f54202c: Add isNA/isNotNA filter types for lead selection filters
8
+
9
+ Columns with discrete allowed values (like Structural Liabilities with None/Low/Medium/High) previously only offered "Is one of" / "Is not one of" filter types, making it impossible to filter by empty/NA values. Now all column types (numeric, string, and discrete) include "Is empty (NA)" and "Is not empty (NA)" filter options.
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [f54202c]
14
+ - @platforma-open/milaboratories.top-antibodies.sample-clonotypes@2.1.0
15
+
16
+ ## 2.1.0
17
+
18
+ ### Minor Changes
19
+
20
+ - 84a7fe5: Deal with ANARCI numbering issues
21
+
22
+ ### Patch Changes
23
+
24
+ - Updated dependencies [84a7fe5]
25
+ - @platforma-open/milaboratories.top-antibodies.anarci-kabat@1.4.0
26
+
3
27
  ## 2.0.1
4
28
 
5
29
  ### Patch Changes
@@ -581,7 +581,9 @@ filterOperatorMap := {
581
581
  "string_contains": "contains",
582
582
  "string_doesNotContain": "not contains",
583
583
  "string_in": "in",
584
- "string_notIn": "not in"
584
+ "string_notIn": "not in",
585
+ "isNA": "is empty",
586
+ "isNotNA": "is not empty"
585
587
  }
586
588
 
587
589
 
@@ -603,6 +605,11 @@ formatFilterDescription := func(columnLabel, filter) {
603
605
  op = filter.type
604
606
  }
605
607
 
608
+
609
+ if filter.type == "isNA" || filter.type == "isNotNA" {
610
+ return columnLabel + " " + op
611
+ }
612
+
606
613
  ref := filter.reference
607
614
 
608
615
  if filter.type == "string_in" || filter.type == "string_notIn" {
Binary file
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@platforma-open/milaboratories.top-antibodies.workflow",
3
- "version": "2.0.1",
3
+ "version": "2.2.0",
4
4
  "type": "module",
5
5
  "description": "Block Workflow",
6
6
  "dependencies": {
7
- "@platforma-sdk/workflow-tengo": "5.8.2",
7
+ "@platforma-sdk/workflow-tengo": "5.11.0",
8
8
  "@platforma-open/milaboratories.software-anarci": "^0.0.3",
9
- "@platforma-open/milaboratories.top-antibodies.sample-clonotypes": "2.0.0",
9
+ "@platforma-open/milaboratories.top-antibodies.spectratype": "1.8.1",
10
10
  "@platforma-open/milaboratories.top-antibodies.assembling-fasta": "1.3.0",
11
11
  "@platforma-open/milaboratories.top-antibodies.umap": "1.2.1",
12
- "@platforma-open/milaboratories.top-antibodies.anarci-kabat": "1.3.0",
13
- "@platforma-open/milaboratories.top-antibodies.spectratype": "1.8.1"
12
+ "@platforma-open/milaboratories.top-antibodies.anarci-kabat": "1.4.0",
13
+ "@platforma-open/milaboratories.top-antibodies.sample-clonotypes": "2.1.0"
14
14
  },
15
15
  "devDependencies": {
16
- "@platforma-sdk/tengo-builder": "2.4.18"
16
+ "@platforma-sdk/tengo-builder": "2.5.2"
17
17
  },
18
18
  "scripts": {
19
19
  "build": "shx rm -rf dist && pl-tengo check && pl-tengo build",
@@ -6,7 +6,7 @@ pt := import("@platforma-sdk/workflow-tengo:pt")
6
6
  pframes := import("@platforma-sdk/workflow-tengo:pframes")
7
7
  anarciSw := assets.importSoftware("@platforma-open/milaboratories.software-anarci:main")
8
8
 
9
- self.defineOutputs("kabat")
9
+ self.defineOutputs("kabat", "kabatStats")
10
10
 
11
11
  self.body(func(inputs) {
12
12
 
@@ -37,13 +37,17 @@ self.body(func(inputs) {
37
37
 
38
38
  anarciFileNameBulk := "anarci.csv_" + bulkChain + ".csv"
39
39
 
40
+ // Pre-create empty CSV placeholders so that saveFile always finds the files,
41
+ // even when ANARCI cannot number any sequences (e.g. heavily engineered scaffolds)
40
42
  anarciBuilder := exec.builder().
41
43
  software(anarciSw).
42
44
  arg("-i").arg("assembling.fasta").
43
45
  arg("--scheme").arg("kabat").
44
46
  arg("--ncpu").argWithVar("{system.cpu}").
45
47
  arg("-o").arg("anarci.csv").arg("--csv").
46
- addFile("assembling.fasta", cmd.getFile("assembling.fasta"))
48
+ addFile("assembling.fasta", cmd.getFile("assembling.fasta")).
49
+ writeFile("anarci.csv_H.csv", "Id\n").
50
+ writeFile("anarci.csv_KL.csv", "Id\n")
47
51
  if isSingleCell {
48
52
  anarciBuilder = anarciBuilder.saveFile("anarci.csv_H.csv").saveFile("anarci.csv_KL.csv")
49
53
  } else {
@@ -73,16 +77,16 @@ self.body(func(inputs) {
73
77
  }
74
78
  kabatExec = kabatExec.
75
79
  arg("--out_tsv").arg("kabat.tsv").
80
+ arg("--numbered_count_file").arg("numbered_count.txt").
76
81
  saveFile("kabat.tsv").
82
+ saveFileContent("numbered_count.txt").
77
83
  printErrStreamToStdout().
78
84
  cache(24 * 60 * 60 * 1000).
79
85
  run()
80
-
81
- kabat := kabatExec.getFile("kabat.tsv")
82
86
 
83
87
  return {
84
- kabat: kabat
85
- // kabatPf: pframes.exportFrame(kabatDf)
88
+ kabat: kabatExec.getFile("kabat.tsv"),
89
+ kabatStats: kabatExec.getFileContent("numbered_count.txt")
86
90
  }
87
91
  })
88
92
 
@@ -246,6 +246,7 @@ wf.body(func(args) {
246
246
  // Convert kabat.tsv to PFrame with proper specs (bulk: select heavy/light)
247
247
  kabatPf := xsv.importFile(kabatFile, "tsv", kabatConv.getColumns(datasetSpec, featName, bulkChain), {cpu: 1, mem: "8GiB"})
248
248
  outputs["assemblingKabatPf"] = pframes.exportFrame(kabatPf)
249
+ outputs["kabatStatsContent"] = assem.output("kabatStats")
249
250
  }
250
251
  }
251
252
  }
@@ -581,7 +581,9 @@ filterOperatorMap := {
581
581
  "string_contains": "contains",
582
582
  "string_doesNotContain": "not contains",
583
583
  "string_in": "in",
584
- "string_notIn": "not in"
584
+ "string_notIn": "not in",
585
+ "isNA": "is empty",
586
+ "isNotNA": "is not empty"
585
587
  }
586
588
 
587
589
  /**
@@ -603,6 +605,11 @@ formatFilterDescription := func(columnLabel, filter) {
603
605
  op = filter.type
604
606
  }
605
607
 
608
+ // isNA/isNotNA have no reference value
609
+ if filter.type == "isNA" || filter.type == "isNotNA" {
610
+ return columnLabel + " " + op
611
+ }
612
+
606
613
  ref := filter.reference
607
614
  // In multiple select filters, parse JSON array and join values
608
615
  if filter.type == "string_in" || filter.type == "string_notIn" {