@datagrok/bio 2.25.17 → 2.26.1

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.
Files changed (50) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/282.js +2 -0
  3. package/dist/282.js.map +1 -0
  4. package/dist/287.js +2 -0
  5. package/dist/287.js.map +1 -0
  6. package/dist/288.js +2 -0
  7. package/dist/288.js.map +1 -0
  8. package/dist/422.js +2 -0
  9. package/dist/422.js.map +1 -0
  10. package/dist/455.js +1 -1
  11. package/dist/455.js.map +1 -1
  12. package/dist/767.js +2 -0
  13. package/dist/767.js.map +1 -0
  14. package/dist/package-test.js +5 -5
  15. package/dist/package-test.js.map +1 -1
  16. package/dist/package.js +3 -3
  17. package/dist/package.js.map +1 -1
  18. package/files/samples/antibodies.csv +494 -0
  19. package/package.json +2 -2
  20. package/src/package-api.ts +28 -0
  21. package/src/package.g.ts +31 -1
  22. package/src/package.ts +40 -1
  23. package/src/tests/substructure-filters-tests.ts +1 -0
  24. package/src/utils/annotations/annotation-actions.ts +130 -0
  25. package/src/utils/annotations/annotation-manager-ui.ts +118 -0
  26. package/src/utils/annotations/annotation-manager.ts +163 -0
  27. package/src/utils/annotations/liability-scanner-ui.ts +88 -0
  28. package/src/utils/annotations/liability-scanner.ts +147 -0
  29. package/src/utils/annotations/numbering-ui.ts +472 -0
  30. package/src/utils/antibody-numbering (WIP)/alignment.ts +578 -0
  31. package/src/utils/antibody-numbering (WIP)/annotator.ts +120 -0
  32. package/src/utils/antibody-numbering (WIP)/data/blosum62.ts +55 -0
  33. package/src/utils/antibody-numbering (WIP)/data/consensus-aho.ts +155 -0
  34. package/src/utils/antibody-numbering (WIP)/data/consensus-imgt.ts +162 -0
  35. package/src/utils/antibody-numbering (WIP)/data/consensus-kabat.ts +157 -0
  36. package/src/utils/antibody-numbering (WIP)/data/consensus-martin.ts +152 -0
  37. package/src/utils/antibody-numbering (WIP)/data/consensus.ts +36 -0
  38. package/src/utils/antibody-numbering (WIP)/data/regions.ts +63 -0
  39. package/src/utils/antibody-numbering (WIP)/index.ts +31 -0
  40. package/src/utils/antibody-numbering (WIP)/testdata.ts +5356 -0
  41. package/src/utils/antibody-numbering (WIP)/types.ts +69 -0
  42. package/src/utils/context-menu.ts +42 -2
  43. package/src/utils/get-region-func-editor.ts +18 -2
  44. package/src/utils/get-region.ts +167 -17
  45. package/src/utils/sequence-column-input.ts +57 -0
  46. package/src/viewers/vd-regions-viewer.ts +2 -0
  47. package/src/widgets/representations.ts +53 -2
  48. package/src/widgets/sequence-scrolling-widget.ts +28 -18
  49. package/test-console-output-1.log +587 -551
  50. package/test-record-1.mp4 +0 -0
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Martin (enhanced Chothia) consensus profiles.
3
+ */
4
+
5
+ export const MARTIN_H: [number, string[]][] = [
6
+ [1, ['Q', 'E', 'D']], [2, ['V', 'Q']], [3, ['Q', 'K', 'H', 'S', 'T']], [4, ['L', 'V']],
7
+ [5, ['V', 'Q', 'L', 'E', 'K', 'T']], [6, ['E', 'Q', 'A']], [7, ['S', 'P', 'W']],
8
+ [8, ['G', 'E']], [9, ['G', 'A', 'P', 'S']], [10, ['G', 'E', 'D', 'V']],
9
+ [11, ['L', 'V']], [12, ['V', 'K', 'L']], [13, ['K', 'Q', 'R']], [14, ['P', 'A']],
10
+ [15, ['G', 'S', 'T']], [16, ['G', 'A', 'E', 'Q', 'R', 'S', 'D']], [17, ['S', 'T']],
11
+ [18, ['L', 'V']], [19, ['R', 'K', 'S', 'T']], [20, ['L', 'I', 'V', 'M']],
12
+ [21, ['S', 'T']], [22, ['C']], [23, ['A', 'K', 'T', 'V', 'S']],
13
+ [24, ['A', 'V', 'T', 'G', 'I']], [25, ['S', 'T', 'Y']],
14
+ [26, []], [27, []], [28, []], [29, []], [30, []], [31, []], [32, []],
15
+ [33, ['A', 'G', 'W', 'Y', 'D', 'L', 'S', 'T', 'V', 'F']],
16
+ [34, ['M', 'I', 'W', 'V', 'L']], [35, ['A', 'G', 'H', 'N', 'S', 'T', 'Y']],
17
+ [36, ['W']], [37, ['V', 'I', 'F']], [38, ['R', 'K']], [39, ['Q']],
18
+ [40, ['A', 'P', 'R', 'S', 'T', 'M', 'V']], [41, ['P', 'A', 'H']],
19
+ [42, ['G', 'E', 'S']], [43, ['K', 'Q', 'R', 'N']],
20
+ [44, ['G', 'A', 'R', 'S']], [45, ['L']], [46, ['E', 'Q']],
21
+ [47, ['W', 'Y', 'F', 'L']], [48, ['I', 'V', 'K', 'M']], [49, ['A', 'G', 'S']],
22
+ [50, ['A', 'G', 'S', 'D', 'E', 'N', 'T', 'V', 'I', 'L', 'K', 'R', 'Q', 'P', 'F', 'W', 'Y', 'M', 'H', 'C']], [51, ['A', 'G', 'S', 'D', 'E', 'N', 'T', 'V', 'I', 'L', 'K', 'R', 'Q', 'P', 'F', 'W', 'Y', 'M', 'H', 'C']], [52, []], [53, []],
23
+ [54, ['S', 'I', 'T', 'D', 'G', 'R', 'N', 'L', 'A', 'Y', 'F', 'E']],
24
+ [55, ['G', 'S', 'R', 'D', 'W', 'A', 'Y', 'F', 'V', 'N', 'T', 'E', 'L', 'H']],
25
+ [56, ['S', 'E', 'D', 'I', 'R', 'G', 'Y', 'T', 'V', 'N', 'A', 'H', 'K']],
26
+ [57, ['T', 'A', 'I', 'K', 'N', 'P', 'S']],
27
+ [58, ['Y', 'N', 'K', 'D', 'E', 'F', 'G', 'H', 'R', 'S', 'T']], [59, ['Y', 'F']],
28
+ [60, ['A', 'N', 'S', 'P', 'T', 'V', 'G']], [61, ['D', 'E', 'Q', 'A', 'S', 'P']],
29
+ [62, ['S', 'K', 'A', 'W']], [63, ['F', 'V', 'L', 'A']], [64, ['K', 'Q', 'R', 'E']],
30
+ [65, ['G', 'S', 'D', 'N']], [66, ['R', 'K', 'Q']],
31
+ [67, ['F', 'V', 'A', 'L', 'I']], [68, ['T', 'S', 'I']],
32
+ [69, ['I', 'L', 'M', 'V', 'F']], [70, ['S', 'T', 'N']],
33
+ [71, ['R', 'V', 'A', 'K', 'L', 'P', 'T']], [72, ['D', 'N', 'E']],
34
+ [73, ['N', 'S', 'D', 'K', 'T']], [74, ['T', 'Q', 'S', 'I', 'M']],
35
+ [75, ['L', 'A', 'V', 'F']], [76, ['Y', 'S', 'F', 'H', 'T', 'V']],
36
+ [77, ['L', 'M']], [78, ['Q', 'E', 'K', 'D', 'T']],
37
+ [79, ['L', 'M', 'I', 'V', 'W']],
38
+ [80, ['S', 'N', 'D', 'T', 'R', 'A', 'H', 'K']], [81, ['S', 'N', 'R', 'T', 'A', 'K', 'G']],
39
+ [82, ['L', 'M', 'V', 'P']], [83, ['R', 'T', 'K']],
40
+ [84, ['A', 'S', 'T', 'V', 'P']], [85, ['E', 'A', 'D', 'G', 'S', 'V']],
41
+ [86, ['D']], [87, ['T', 'S']], [88, ['A', 'G']],
42
+ [89, ['V', 'T', 'I', 'L', 'M']], [90, ['Y']], [91, ['Y', 'F']], [92, ['C']],
43
+ [93, ['A', 'T', 'V']], [94, ['R', 'K', 'S', 'T', 'A', 'G']],
44
+ [95, []], [96, []], [97, []], [98, []], [99, []], [100, []], [101, []],
45
+ [102, ['Y', 'V', 'I', 'L', 'F', 'P', 'H', 'S']],
46
+ [103, ['W']], [104, ['G']], [105, ['Q', 'P', 'R', 'K', 'A', 'T']],
47
+ [106, ['G']], [107, ['T', 'V', 'A', 'I']], [108, ['L', 'T', 'M', 'S', 'Q', 'P']],
48
+ [109, ['V', 'L', 'I']], [110, ['T', 'I', 'V']], [111, ['V']],
49
+ [112, ['S', 'T']], [113, ['S', 'A']],
50
+ ];
51
+
52
+ export const MARTIN_K: [number, string[]][] = [
53
+ [1, ['D', 'E', 'Q', 'N', 'A']], [2, ['I', 'V', 'L']], [3, ['V', 'Q', 'L', 'E', 'K']],
54
+ [4, ['M', 'L', 'V', 'I']], [5, ['T', 'S']], [6, ['Q']],
55
+ [7, ['S', 'T', 'A', 'I']], [8, ['P', 'Q', 'T', 'A', 'H']],
56
+ [9, ['S', 'G', 'L', 'A', 'D', 'K', 'F', 'P', 'V']], [10, ['S', 'T', 'F', 'I']],
57
+ [11, ['L', 'M', 'N', 'Q', 'V']], [12, ['T', 'S', 'A', 'P', 'Y']],
58
+ [13, ['V', 'L', 'A', 'T', 'M']], [14, ['T', 'S', 'A']],
59
+ [15, ['A', 'P', 'I', 'V', 'L']], [16, ['G']],
60
+ [17, ['E', 'Q', 'D', 'G', 'T']], [18, ['K', 'R', 'P', 'T', 'Q', 'S']],
61
+ [19, ['V', 'A', 'I']], [20, ['T', 'S']], [21, ['M', 'L', 'I', 'F']],
62
+ [22, ['S', 'T', 'N']], [23, ['C']],
63
+ [24, ['K', 'R', 'Q', 'S']], [25, ['S', 'A', 'T', 'C']], [26, ['S', 'T', 'G']],
64
+ [27, ['Q', 'G', 'E', 'S', 'K', 'H']], [28, ['S', 'N', 'D', 'E', 'R', 'T', 'G']],
65
+ [29, []], [30, []], [31, []], [32, []],
66
+ [33, ['L', 'M', 'I', 'V', 'F']],
67
+ [34, ['T', 'A', 'N', 'H', 'E', 'G', 'Q', 'Y', 'S', 'D']],
68
+ [35, ['W']], [36, ['Y', 'L', 'F']], [37, ['Q', 'L', 'R']],
69
+ [38, ['Q', 'H', 'E']], [39, ['K', 'R']],
70
+ [40, ['P', 'Q', 'S', 'T']], [41, ['G', 'E', 'D', 'H', 'N']],
71
+ [42, ['Q', 'K', 'S', 'T', 'G', 'E', 'R']], [43, ['P', 'A', 'S', 'T', 'V']],
72
+ [44, ['P', 'I', 'V']], [45, ['K', 'R', 'Q', 'E', 'I', 'T']],
73
+ [46, ['L', 'R', 'T', 'P', 'V', 'A']], [47, ['L', 'W']],
74
+ [48, ['I', 'V', 'M']], [49, ['Y', 'K', 'H', 'S', 'F']],
75
+ [50, ['W', 'G', 'L', 'K', 'N', 'A', 'D', 'Y', 'S', 'E', 'T', 'R', 'Q', 'F', 'V']],
76
+ [51, ['A', 'V', 'T', 'S', 'M', 'G', 'I']], [52, ['S', 'K', 'T', 'N']],
77
+ [53, ['T', 'S', 'K', 'N', 'I', 'D', 'R', 'Y', 'Q', 'F']], [54, ['R', 'L', 'S']],
78
+ [55, ['E', 'A', 'D', 'Q', 'F', 'R', 'Y', 'H', 'I', 'K', 'P', 'G', 'V']],
79
+ [56, ['S', 'T', 'D', 'P', 'A', 'E']], [57, ['G']], [58, ['V', 'I']],
80
+ [59, ['P', 'S', 'A']],
81
+ [60, ['D', 'S', 'A', 'V', 'K', 'G']], [61, ['R']], [62, ['F']],
82
+ [63, ['T', 'S', 'I', 'K', 'R']], [64, ['G', 'S', 'A']],
83
+ [65, ['S', 'G', 'R']], [66, ['G', 'R']], [67, ['S', 'Y']],
84
+ [68, ['G', 'R', 'A']], [69, ['T', 'R', 'S', 'Q']],
85
+ [70, ['D', 'E', 'Q', 'S', 'H', 'Y', 'A']], [71, ['F', 'Y']],
86
+ [72, ['T', 'S']], [73, ['L', 'F']], [74, ['T', 'K', 'N', 'S', 'R']],
87
+ [75, ['I', 'V']], [76, ['N', 'S', 'H', 'T', 'D']],
88
+ [77, ['S', 'R', 'P', 'N', 'G', 'D', 'T']], [78, ['V', 'L', 'M']],
89
+ [79, ['Q', 'E', 'K']], [80, ['A', 'P', 'E', 'S', 'T', 'Q', 'C', 'Y']],
90
+ [81, ['E', 'D']], [82, ['D']],
91
+ [83, ['L', 'F', 'V', 'T', 'A', 'I', 'S', 'M']], [84, ['A', 'G']],
92
+ [85, ['V', 'T', 'S', 'E', 'D', 'L', 'I', 'M']], [86, ['Y', 'F']],
93
+ [87, ['Y', 'F', 'H']], [88, ['C']],
94
+ [89, ['Q', 'W', 'F', 'L', 'H', 'M', 'G', 'A', 'K', 'S', 'V']],
95
+ [90, ['N', 'Q', 'H', 'G']],
96
+ [91, ['D', 'Y', 'G', 'F', 'I', 'S', 'W', 'R', 'T', 'A', 'N', 'H']],
97
+ [92, []], [93, []], [94, []], [95, []],
98
+ [96, ['L', 'Y', 'W', 'F', 'P', 'R', 'A', 'S', 'I', 'V', 'E', 'H', 'T']],
99
+ [97, ['T', 'V', 'I', 'A', 'S', 'F', 'L']], [98, ['F']],
100
+ [99, ['G']], [100, ['A', 'Q', 'S', 'G', 'P']], [101, ['G']],
101
+ [102, ['T']], [103, ['K', 'R', 'E']], [104, ['L', 'V']],
102
+ [105, ['E', 'V', 'D']], [106, ['L', 'I', 'V']], [107, ['K', 'R']],
103
+ ];
104
+
105
+ export const MARTIN_L: [number, string[]][] = [
106
+ [1, ['Q', 'S']], [2, ['S', 'Y', 'P', 'A', 'L', 'F']], [3, ['A', 'V', 'E']],
107
+ [4, ['L', 'V']], [5, ['T']], [6, ['Q']], [7, ['P', 'E', 'S']],
108
+ [8, ['A', 'P', 'S', 'R']], [9, ['S', 'A']], [10, []],
109
+ [11, ['V', 'L', 'A']], [12, ['S', 'T']],
110
+ [13, ['G', 'V', 'A', 'T', 'K', 'E', 'F']], [14, ['S', 'A', 'T']],
111
+ [15, ['P', 'L']], [16, ['G']], [17, ['Q', 'E', 'K', 'A']],
112
+ [18, ['S', 'T', 'K', 'R']], [19, ['I', 'A', 'V']],
113
+ [20, ['T', 'R', 'S', 'K']], [21, ['I', 'L']], [22, ['S', 'T']], [23, ['C']],
114
+ [24, ['T', 'G', 'Q', 'S', 'A', 'N', 'R']], [25, ['G', 'S', 'L', 'R']],
115
+ [26, ['T', 'N', 'D', 'S']],
116
+ [27, ['Q', 'T', 'N', 'S', 'K', 'A', 'R']], [28, ['S', 'I', 'L', 'N', 'G', 'Q']],
117
+ [29, ['S', 'D', 'G', 'N', 'A', 'R', 'H']],
118
+ [30, []], [31, ['N', 'K', 'D', 'R', 'Y']],
119
+ [32, ['F', 'S', 'L', 'A', 'Y', 'T', 'D', 'G', 'N']],
120
+ [33, ['V', 'A', 'I']], [34, ['S', 'H', 'Q', 'C', 'N', 'Y', 'E']],
121
+ [35, ['W']], [36, ['Y', 'F', 'V']], [37, ['Q']],
122
+ [38, ['Q', 'H', 'E']], [39, ['H', 'K', 'R', 'L', 'F', 'V', 'Q']],
123
+ [40, ['P', 'A', 'S']], [41, ['G', 'D', 'L']],
124
+ [42, ['K', 'Q', 'T', 'R', 'H', 'S', 'A', 'M']], [43, ['A', 'S', 'L', 'P', 'G']],
125
+ [44, ['P', 'F']], [45, ['K', 'V', 'S', 'R', 'T', 'I']],
126
+ [46, ['L', 'V', 'G', 'Y', 'T']], [47, ['I', 'V', 'M', 'L']],
127
+ [48, ['I', 'V', 'L', 'M']], [49, ['F', 'Y', 'G', 'S', 'E']],
128
+ [50, ['D', 'A', 'N', 'E', 'Q', 'Y', 'G', 'V', 'R', 'L', 'K']],
129
+ [51, ['V', 'D', 'N', 'T', 'K']], [52, ['T', 'S', 'Q', 'N', 'D', 'K']],
130
+ [53, ['N', 'D', 'K', 'Q', 'E', 'S', 'H']], [54, ['R', 'T']],
131
+ [55, ['P', 'A', 'G']], [56, ['S', 'P', 'D']], [57, ['G']],
132
+ [58, ['I', 'V']], [59, ['S', 'P']],
133
+ [60, ['N', 'E', 'A', 'D']], [61, ['R']], [62, ['F']], [63, ['S']],
134
+ [64, ['G']], [65, ['S']], [66, ['K', 'N', 'P', 'L', 'I', 'S']],
135
+ [67, ['S', 'D', 'I']], [68, ['G', 'A']],
136
+ [69, ['N', 'T', 'D', 'S', 'A']], [70, ['T', 'K', 'S', 'R']],
137
+ [71, ['A', 'R']], [72, ['S', 'T', 'A', 'Y']], [73, ['L']],
138
+ [74, ['T', 'G', 'A', 'S']], [75, ['I', 'V']], [76, ['S', 'T']],
139
+ [77, ['G', 'R', 'S', 'N']], [78, ['L', 'V', 'T', 'A', 'I']],
140
+ [79, ['Q', 'E', 'R']], [80, ['A', 'S', 'P', 'T']],
141
+ [81, ['E', 'G', 'M', 'D']], [82, ['D']], [83, ['E']],
142
+ [84, ['A', 'G']], [85, ['D', 'I', 'E']], [86, ['Y']],
143
+ [87, ['Y', 'F', 'I']], [88, ['C']],
144
+ [89, ['A', 'Q', 'C', 'H', 'G', 'S']], [90, ['A', 'V', 'L', 'S', 'T', 'M']],
145
+ [91, ['Y', 'W', 'L', 'R', 'G']],
146
+ [92, []], [93, []], [94, []], [95, []],
147
+ [96, ['L', 'V', 'W', 'R', 'P', 'Y', 'S', 'F', 'A']],
148
+ [97, ['L', 'T', 'V', 'I', 'A', 'F', 'S']], [98, ['F']],
149
+ [99, ['G']], [100, ['G', 'T', 'S']], [101, ['G']],
150
+ [102, ['T']], [103, ['K', 'T', 'R', 'Q']], [104, ['V', 'L']],
151
+ [105, ['T']], [106, ['V']], [107, ['L', 'K']],
152
+ ];
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Central consensus profile registry.
3
+ * Maps (scheme, chainType) -> profile data.
4
+ */
5
+ import type { Scheme, ChainType } from '../types';
6
+ import { IMGT_H, IMGT_K, IMGT_L, CTERM_H, CTERM_K, CTERM_L } from './consensus-imgt';
7
+ import { KABAT_H, KABAT_K, KABAT_L } from './consensus-kabat';
8
+ import { MARTIN_H, MARTIN_K, MARTIN_L } from './consensus-martin';
9
+ import { AHO_H, AHO_K, AHO_L } from './consensus-aho';
10
+
11
+ export type ProfileData = [number, string[]][];
12
+
13
+ /** Get the consensus profile for a given scheme and chain type */
14
+ export function getConsensusProfile(scheme: Scheme, chain: ChainType): ProfileData {
15
+ const key = `${scheme}_${chain}`;
16
+ const profiles: Record<string, ProfileData> = {
17
+ imgt_H: IMGT_H, imgt_K: IMGT_K, imgt_L: IMGT_L,
18
+ kabat_H: KABAT_H, kabat_K: KABAT_K, kabat_L: KABAT_L,
19
+ chothia_H: MARTIN_H, chothia_K: MARTIN_K, chothia_L: MARTIN_L,
20
+ aho_H: AHO_H, aho_K: AHO_K, aho_L: AHO_L,
21
+ };
22
+ return profiles[key] ?? IMGT_H;
23
+ }
24
+
25
+ /** Get the C-terminal finder profile for a chain type */
26
+ export function getCtermProfile(chain: ChainType): ProfileData {
27
+ const profiles: Record<ChainType, ProfileData> = {
28
+ H: CTERM_H, K: CTERM_K, L: CTERM_L,
29
+ };
30
+ return profiles[chain];
31
+ }
32
+
33
+ export { IMGT_H, IMGT_K, IMGT_L, CTERM_H, CTERM_K, CTERM_L };
34
+ export { KABAT_H, KABAT_K, KABAT_L };
35
+ export { MARTIN_H, MARTIN_K, MARTIN_L };
36
+ export { AHO_H, AHO_K, AHO_L };
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Region definitions per scheme, keyed by chain group.
3
+ * Each region: [name, startPosition, endPosition].
4
+ * Mirrors the Python number_antibody.py definitions.
5
+ */
6
+ import type { Scheme, ChainGroup } from '../types';
7
+
8
+ export type RegionDef = [name: string, start: number, end: number];
9
+
10
+ const IMGT_REGIONS: Record<ChainGroup, RegionDef[]> = {
11
+ Heavy: [
12
+ ['FR1', 1, 26], ['CDR1', 27, 38], ['FR2', 39, 55],
13
+ ['CDR2', 56, 65], ['FR3', 66, 104], ['CDR3', 105, 117], ['FR4', 118, 128],
14
+ ],
15
+ Light: [
16
+ ['FR1', 1, 26], ['CDR1', 27, 38], ['FR2', 39, 55],
17
+ ['CDR2', 56, 65], ['FR3', 66, 104], ['CDR3', 105, 117], ['FR4', 118, 127],
18
+ ],
19
+ };
20
+
21
+ const KABAT_REGIONS: Record<ChainGroup, RegionDef[]> = {
22
+ Heavy: [
23
+ ['FR1', 1, 30], ['CDR1', 31, 35], ['FR2', 36, 49],
24
+ ['CDR2', 50, 65], ['FR3', 66, 94], ['CDR3', 95, 102], ['FR4', 103, 113],
25
+ ],
26
+ Light: [
27
+ ['FR1', 1, 23], ['CDR1', 24, 34], ['FR2', 35, 49],
28
+ ['CDR2', 50, 56], ['FR3', 57, 88], ['CDR3', 89, 97], ['FR4', 98, 107],
29
+ ],
30
+ };
31
+
32
+ const CHOTHIA_REGIONS: Record<ChainGroup, RegionDef[]> = {
33
+ Heavy: [
34
+ ['FR1', 1, 25], ['CDR1', 26, 32], ['FR2', 33, 51],
35
+ ['CDR2', 52, 56], ['FR3', 57, 94], ['CDR3', 95, 102], ['FR4', 103, 113],
36
+ ],
37
+ Light: [
38
+ ['FR1', 1, 25], ['CDR1', 26, 32], ['FR2', 33, 49],
39
+ ['CDR2', 50, 52], ['FR3', 53, 90], ['CDR3', 91, 96], ['FR4', 97, 107],
40
+ ],
41
+ };
42
+
43
+ const AHO_REGIONS: Record<ChainGroup, RegionDef[]> = {
44
+ Heavy: [
45
+ ['FR1', 1, 24], ['CDR1', 25, 40], ['FR2', 41, 55],
46
+ ['CDR2', 56, 78], ['FR3', 79, 108], ['CDR3', 109, 138], ['FR4', 139, 149],
47
+ ],
48
+ Light: [
49
+ ['FR1', 1, 24], ['CDR1', 25, 40], ['FR2', 41, 55],
50
+ ['CDR2', 56, 78], ['FR3', 79, 108], ['CDR3', 109, 138], ['FR4', 139, 149],
51
+ ],
52
+ };
53
+
54
+ const SCHEME_REGIONS: Record<Scheme, Record<ChainGroup, RegionDef[]>> = {
55
+ imgt: IMGT_REGIONS,
56
+ kabat: KABAT_REGIONS,
57
+ chothia: CHOTHIA_REGIONS,
58
+ aho: AHO_REGIONS,
59
+ };
60
+
61
+ export function getRegions(scheme: Scheme, chainGroup: ChainGroup): RegionDef[] {
62
+ return SCHEME_REGIONS[scheme]?.[chainGroup] ?? IMGT_REGIONS.Heavy;
63
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * antibody-numbering - Browser-compatible antibody sequence numbering library.
3
+ *
4
+ * Assigns antibody numbering (IMGT/Kabat/Chothia/AHo) to amino acid sequences
5
+ * using profile-based alignment against consensus sequences.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * import { numberSequence } from 'antibody-numbering';
10
+ *
11
+ * const result = numberSequence(
12
+ * 'QVQLVQSGAEVKKPGASVKVSCKASGYTFTGYYMHWVRQAPGQGLEWMGWINPNSGGTNYAQKFQGRVTMTRDTSISTAYMELSRLRSDDTAVYYCAR',
13
+ * 'imgt'
14
+ * );
15
+ *
16
+ * console.log(result.chainType); // 'Heavy'
17
+ * console.log(result.numberingDetail); // [{ position: '1', aa: 'Q' }, ...]
18
+ * console.log(result.annotations); // [{ name: 'FR1', ... }, ...]
19
+ * ```
20
+ */
21
+
22
+ export { numberSequence, numberSequences, extractSequence } from './annotator';
23
+ export type {
24
+ Scheme,
25
+ ChainType,
26
+ ChainGroup,
27
+ NumberingResult,
28
+ NumberingEntry,
29
+ RegionAnnotation,
30
+ AlignmentResult,
31
+ } from './types';