react-msaview 4.6.0 → 4.8.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.
Files changed (93) hide show
  1. package/bundle/index.js +99 -99
  2. package/bundle/index.js.LICENSE.txt +6 -6
  3. package/bundle/index.js.map +1 -1
  4. package/dist/__snapshots__/parseAsn1.test.js.snap +2400 -0
  5. package/dist/components/header/HeaderInfoArea.js +3 -4
  6. package/dist/components/header/HeaderInfoArea.js.map +1 -1
  7. package/dist/components/import/ImportForm.js +6 -2
  8. package/dist/components/import/ImportForm.js.map +1 -1
  9. package/dist/components/import/util.d.ts +1 -1
  10. package/dist/components/import/util.js +4 -1
  11. package/dist/components/import/util.js.map +1 -1
  12. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +7 -2
  13. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  14. package/dist/components/msa/renderMSABlock.js.map +1 -1
  15. package/dist/components/tree/renderTreeCanvas.js +10 -8
  16. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  17. package/dist/model.d.ts +153 -16
  18. package/dist/model.js +97 -29
  19. package/dist/model.js.map +1 -1
  20. package/dist/rowCoordinateCalculations.d.ts +69 -9
  21. package/dist/rowCoordinateCalculations.js +118 -46
  22. package/dist/rowCoordinateCalculations.js.map +1 -1
  23. package/dist/rowCoordinateCalculations.test.js +152 -52
  24. package/dist/rowCoordinateCalculations.test.js.map +1 -1
  25. package/dist/seqPosToGlobalCol.d.ts +19 -0
  26. package/dist/seqPosToGlobalCol.js +34 -0
  27. package/dist/seqPosToGlobalCol.js.map +1 -0
  28. package/dist/seqPosToGlobalCol.test.js +60 -0
  29. package/dist/seqPosToGlobalCol.test.js.map +1 -0
  30. package/dist/util.d.ts +1 -2
  31. package/dist/util.js +0 -9
  32. package/dist/util.js.map +1 -1
  33. package/dist/version.d.ts +1 -1
  34. package/dist/version.js +1 -1
  35. package/package.json +7 -9
  36. package/src/components/header/HeaderInfoArea.tsx +2 -5
  37. package/src/components/import/ImportForm.tsx +6 -1
  38. package/src/components/import/util.ts +4 -0
  39. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +7 -2
  40. package/src/components/msa/renderMSABlock.ts +5 -1
  41. package/src/components/tree/renderTreeCanvas.ts +11 -9
  42. package/src/declare.d.ts +0 -1
  43. package/src/model.ts +122 -42
  44. package/src/rowCoordinateCalculations.test.ts +167 -74
  45. package/src/rowCoordinateCalculations.ts +138 -63
  46. package/src/seqPosToGlobalCol.test.ts +71 -0
  47. package/src/seqPosToGlobalCol.ts +40 -0
  48. package/src/util.ts +1 -19
  49. package/src/version.ts +1 -1
  50. package/dist/parseGFF.d.ts +0 -10
  51. package/dist/parseGFF.js +0 -31
  52. package/dist/parseGFF.js.map +0 -1
  53. package/dist/parseNewick.d.ts +0 -60
  54. package/dist/parseNewick.js +0 -95
  55. package/dist/parseNewick.js.map +0 -1
  56. package/dist/parsers/A3mMSA.d.ts +0 -43
  57. package/dist/parsers/A3mMSA.js +0 -277
  58. package/dist/parsers/A3mMSA.js.map +0 -1
  59. package/dist/parsers/A3mMSA.test.js +0 -138
  60. package/dist/parsers/A3mMSA.test.js.map +0 -1
  61. package/dist/parsers/ClustalMSA.d.ts +0 -30
  62. package/dist/parsers/ClustalMSA.js +0 -55
  63. package/dist/parsers/ClustalMSA.js.map +0 -1
  64. package/dist/parsers/EmfMSA.d.ts +0 -27
  65. package/dist/parsers/EmfMSA.js +0 -53
  66. package/dist/parsers/EmfMSA.js.map +0 -1
  67. package/dist/parsers/EmfTree.d.ts +0 -5
  68. package/dist/parsers/EmfTree.js +0 -8
  69. package/dist/parsers/EmfTree.js.map +0 -1
  70. package/dist/parsers/FastaMSA.d.ts +0 -19
  71. package/dist/parsers/FastaMSA.js +0 -69
  72. package/dist/parsers/FastaMSA.js.map +0 -1
  73. package/dist/parsers/StockholmMSA.d.ts +0 -68
  74. package/dist/parsers/StockholmMSA.js +0 -107
  75. package/dist/parsers/StockholmMSA.js.map +0 -1
  76. package/dist/seqCoordToRowSpecificGlobalCoord.d.ts +0 -4
  77. package/dist/seqCoordToRowSpecificGlobalCoord.js +0 -19
  78. package/dist/seqCoordToRowSpecificGlobalCoord.js.map +0 -1
  79. package/dist/seqCoordToRowSpecificGlobalCoord.test.d.ts +0 -1
  80. package/dist/seqCoordToRowSpecificGlobalCoord.test.js +0 -42
  81. package/dist/seqCoordToRowSpecificGlobalCoord.test.js.map +0 -1
  82. package/src/parseGFF.ts +0 -34
  83. package/src/parseNewick.ts +0 -94
  84. package/src/parsers/A3mMSA.test.ts +0 -164
  85. package/src/parsers/A3mMSA.ts +0 -321
  86. package/src/parsers/ClustalMSA.ts +0 -69
  87. package/src/parsers/EmfMSA.ts +0 -67
  88. package/src/parsers/EmfTree.ts +0 -9
  89. package/src/parsers/FastaMSA.ts +0 -82
  90. package/src/parsers/StockholmMSA.ts +0 -140
  91. package/src/seqCoordToRowSpecificGlobalCoord.test.ts +0 -53
  92. package/src/seqCoordToRowSpecificGlobalCoord.ts +0 -25
  93. /package/dist/{parsers/A3mMSA.test.d.ts → seqPosToGlobalCol.test.d.ts} +0 -0
@@ -1,67 +1,139 @@
1
1
  import { isBlank } from './util';
2
- export function mouseOverCoordToGlobalCoord(blanks, position) {
3
- let mousePosition = 0; // Current position in mouse coordinates
4
- let blankArrayIndex = 0; // Current index in the blanks array
5
- let globalPosition = 0; // Position in global coordinates (return value)
2
+ /**
3
+ * MSA Coordinate Systems:
4
+ *
5
+ * 1. **Global Column (globalCol)**: The column index in the full, unfiltered MSA.
6
+ * Range: 0 to (MSA width - 1)
7
+ * This is the "true" column position before any gap-hiding is applied.
8
+ *
9
+ * 2. **Visible Column (visibleCol)**: The column index after hiding gappy columns.
10
+ * Range: 0 to (numColumns - 1) where numColumns = MSA width - blanks.length
11
+ * This is what the user sees on screen when "Hide columns w/ N% gaps" is enabled.
12
+ * When gap hiding is disabled, visibleCol === globalCol.
13
+ *
14
+ * 3. **Sequence Position (seqPos)**: The position within a specific row's ungapped sequence.
15
+ * Range: 0 to (ungapped sequence length - 1)
16
+ * This counts only non-gap characters ('-' and '.' are gaps).
17
+ * Each row can have different seqPos values for the same globalCol due to gaps.
18
+ */
19
+ /**
20
+ * Convert a visible column index to a global column index.
21
+ * This is used when translating mouse/screen coordinates to MSA coordinates.
22
+ *
23
+ * @param blanks - Sorted array of global column indices that are hidden
24
+ * @param visibleCol - The visible column index (what the user sees on screen)
25
+ * @returns The corresponding global column index in the full MSA
26
+ */
27
+ export function visibleColToGlobalCol(blanks, visibleCol) {
28
+ let currentVisibleCol = 0;
29
+ let blankArrayIndex = 0;
30
+ let globalCol = 0;
6
31
  const blanksLen = blanks.length;
7
- // Iterate until we reach the target mouse position
8
- while (mousePosition < position) {
9
- // Skip any blank positions in the sequence
10
- // Check if the next position (globalPosition + 1) is blank by comparing
11
- // blanks[blankArrayIndex] - 1 with current globalPosition
32
+ // Skip any leading blank columns (blanks at the very beginning)
33
+ while (blankArrayIndex < blanksLen && blanks[blankArrayIndex] === globalCol) {
34
+ blankArrayIndex++;
35
+ globalCol++;
36
+ }
37
+ while (currentVisibleCol < visibleCol) {
38
+ currentVisibleCol++;
39
+ globalCol++;
40
+ // Skip any blank columns after incrementing
12
41
  while (blankArrayIndex < blanksLen &&
13
- blanks[blankArrayIndex] - 1 === globalPosition) {
42
+ blanks[blankArrayIndex] === globalCol) {
14
43
  blankArrayIndex++;
15
- globalPosition++;
44
+ globalCol++;
16
45
  }
17
- // Move to next position
18
- mousePosition++;
19
- globalPosition++;
20
46
  }
21
- return globalPosition;
47
+ return globalCol;
22
48
  }
23
- export function globalCoordToRowSpecificCoord(seq, position) {
24
- // Initialize counter for non-gap characters
25
- let nonGapCount = 0;
26
- // Initialize position counter
27
- let currentPosition = 0;
28
- const sequenceLength = seq.length;
29
- // Iterate until we reach the target position or end of sequence
30
- while (currentPosition < position && currentPosition < sequenceLength) {
31
- // If current character is not a gap, increment the non-gap counter
32
- if (!isBlank(seq[currentPosition])) {
33
- nonGapCount++;
49
+ /**
50
+ * Convert a global column index to a visible column index.
51
+ * This is the inverse of visibleColToGlobalCol.
52
+ *
53
+ * @param blanks - Sorted array of global column indices that are hidden
54
+ * @param globalCol - The global column index in the full MSA
55
+ * @returns The visible column index, or undefined if the column is hidden
56
+ */
57
+ export function globalColToVisibleCol(blanks, globalCol) {
58
+ // Check if this column is hidden
59
+ // Use binary search since blanks is sorted
60
+ let left = 0;
61
+ let right = blanks.length - 1;
62
+ while (left <= right) {
63
+ const mid = Math.floor((left + right) / 2);
64
+ if (blanks[mid] === globalCol) {
65
+ return undefined; // Column is hidden
66
+ }
67
+ if (blanks[mid] < globalCol) {
68
+ left = mid + 1;
69
+ }
70
+ else {
71
+ right = mid - 1;
34
72
  }
35
- currentPosition++;
36
73
  }
37
- return nonGapCount;
74
+ // Count blanks before this column (left is now the insertion point)
75
+ const blanksBefore = left;
76
+ return globalCol - blanksBefore;
38
77
  }
39
- export function mouseOverCoordToGapRemovedRowCoord({ rowName, position, rowMap, blanks, }) {
40
- const seq = rowMap.get(rowName);
41
- return seq !== undefined
42
- ? mouseOverCoordToGapRemovedCoord({
43
- seq,
44
- position,
45
- blanks,
46
- })
47
- : undefined;
78
+ /**
79
+ * Convert a global column index to a row-specific sequence position.
80
+ * This counts non-gap characters up to the given global column.
81
+ *
82
+ * @param seq - The row's sequence string (including gaps)
83
+ * @param globalCol - The global column index
84
+ * @returns The sequence position (count of non-gap characters before this column)
85
+ */
86
+ export function globalColToSeqPos(seq, globalCol) {
87
+ let seqPos = 0;
88
+ let currentCol = 0;
89
+ const seqLen = seq.length;
90
+ while (currentCol < globalCol && currentCol < seqLen) {
91
+ if (!isBlank(seq[currentCol])) {
92
+ seqPos++;
93
+ }
94
+ currentCol++;
95
+ }
96
+ return seqPos;
48
97
  }
49
- export function mouseOverCoordToGapRemovedCoord({ seq, blanks, position, }) {
50
- // First convert the mouse position to global coordinates
51
- const globalPos = mouseOverCoordToGlobalCoord(blanks, position);
98
+ /**
99
+ * Convert a visible column to a row-specific sequence position.
100
+ * Returns undefined if the position is a gap in the sequence.
101
+ *
102
+ * @param seq - The row's sequence string (including gaps)
103
+ * @param blanks - Sorted array of global column indices that are hidden
104
+ * @param visibleCol - The visible column index
105
+ * @returns The sequence position, or undefined if it's a gap
106
+ */
107
+ export function visibleColToSeqPos({ seq, blanks, visibleCol, }) {
108
+ // First convert the visible column to global column
109
+ const globalCol = visibleColToGlobalCol(blanks, visibleCol);
52
110
  const seqLen = seq.length;
53
111
  // Check if the position in the sequence is a gap
54
- if (globalPos < seqLen && isBlank(seq[globalPos])) {
112
+ if (globalCol < seqLen && isBlank(seq[globalCol])) {
55
113
  return undefined;
56
114
  }
57
115
  // Count non-gap characters up to the global position
58
- let nonGapCount = 0;
59
- for (let i = 0; i < globalPos && i < seqLen; i++) {
116
+ let seqPos = 0;
117
+ for (let i = 0; i < globalCol && i < seqLen; i++) {
60
118
  if (!isBlank(seq[i])) {
61
- nonGapCount++;
119
+ seqPos++;
62
120
  }
63
121
  }
64
- // If we're at a valid position, return the count of non-gap characters
65
- return globalPos < seqLen ? nonGapCount : undefined;
122
+ return globalCol < seqLen ? seqPos : undefined;
123
+ }
124
+ /**
125
+ * Convert a visible column to a row-specific sequence position, with row lookup.
126
+ *
127
+ * @param rowName - The name of the row
128
+ * @param visibleCol - The visible column index
129
+ * @param rowMap - Map from row name to sequence string
130
+ * @param blanks - Sorted array of global column indices that are hidden
131
+ * @returns The sequence position, or undefined if row not found or position is a gap
132
+ */
133
+ export function visibleColToSeqPosForRow({ rowName, visibleCol, rowMap, blanks, }) {
134
+ const seq = rowMap.get(rowName);
135
+ return seq !== undefined
136
+ ? visibleColToSeqPos({ seq, visibleCol, blanks })
137
+ : undefined;
66
138
  }
67
139
  //# sourceMappingURL=rowCoordinateCalculations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rowCoordinateCalculations.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC,MAAM,UAAU,2BAA2B,CACzC,MAAgB,EAChB,QAAgB;IAEhB,IAAI,aAAa,GAAG,CAAC,CAAA,CAAC,wCAAwC;IAC9D,IAAI,eAAe,GAAG,CAAC,CAAA,CAAC,oCAAoC;IAC5D,IAAI,cAAc,GAAG,CAAC,CAAA,CAAC,gDAAgD;IACvE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAA;IAE/B,mDAAmD;IACnD,OAAO,aAAa,GAAG,QAAQ,EAAE,CAAC;QAChC,2CAA2C;QAC3C,wEAAwE;QACxE,0DAA0D;QAC1D,OACE,eAAe,GAAG,SAAS;YAC3B,MAAM,CAAC,eAAe,CAAE,GAAG,CAAC,KAAK,cAAc,EAC/C,CAAC;YACD,eAAe,EAAE,CAAA;YACjB,cAAc,EAAE,CAAA;QAClB,CAAC;QAED,wBAAwB;QACxB,aAAa,EAAE,CAAA;QACf,cAAc,EAAE,CAAA;IAClB,CAAC;IAED,OAAO,cAAc,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,GAAW,EAAE,QAAgB;IACzE,4CAA4C;IAC5C,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,8BAA8B;IAC9B,IAAI,eAAe,GAAG,CAAC,CAAA;IACvB,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM,CAAA;IAEjC,gEAAgE;IAChE,OAAO,eAAe,GAAG,QAAQ,IAAI,eAAe,GAAG,cAAc,EAAE,CAAC;QACtE,mEAAmE;QACnE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;YACnC,WAAW,EAAE,CAAA;QACf,CAAC;QACD,eAAe,EAAE,CAAA;IACnB,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,EACjD,OAAO,EACP,QAAQ,EACR,MAAM,EACN,MAAM,GAMP;IACC,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC/B,OAAO,GAAG,KAAK,SAAS;QACtB,CAAC,CAAC,+BAA+B,CAAC;YAC9B,GAAG;YACH,QAAQ;YACR,MAAM;SACP,CAAC;QACJ,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,EAC9C,GAAG,EACH,MAAM,EACN,QAAQ,GAKT;IACC,yDAAyD;IACzD,MAAM,SAAS,GAAG,2BAA2B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAA;IAEzB,iDAAiD;IACjD,IAAI,SAAS,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAClD,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,qDAAqD;IACrD,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,OAAO,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;AACrD,CAAC"}
1
+ {"version":3,"file":"rowCoordinateCalculations.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { expect, test } from 'vitest';
2
- import { globalCoordToRowSpecificCoord, mouseOverCoordToGapRemovedCoord, mouseOverCoordToGlobalCoord, } from './rowCoordinateCalculations';
3
- test('with blanks at positions [2, 5, 8]', () => {
2
+ import { globalColToSeqPos, globalColToVisibleCol, visibleColToGlobalCol, visibleColToSeqPos, } from './rowCoordinateCalculations';
3
+ // Tests for visibleColToGlobalCol (visible global)
4
+ test('visibleColToGlobalCol with blanks at positions [2, 5, 8]', () => {
4
5
  const blanks = [2, 5, 8];
5
6
  [
6
7
  [0, 0],
@@ -12,10 +13,10 @@ test('with blanks at positions [2, 5, 8]', () => {
12
13
  [6, 9],
13
14
  [7, 10],
14
15
  ].forEach(r => {
15
- expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
16
+ expect(visibleColToGlobalCol(blanks, r[0])).toBe(r[1]);
16
17
  });
17
18
  });
18
- test('with no blanks', () => {
19
+ test('visibleColToGlobalCol with no blanks', () => {
19
20
  const blanks = [];
20
21
  [
21
22
  [0, 0],
@@ -23,10 +24,10 @@ test('with no blanks', () => {
23
24
  [5, 5],
24
25
  [10, 10],
25
26
  ].forEach(r => {
26
- expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
27
+ expect(visibleColToGlobalCol(blanks, r[0])).toBe(r[1]);
27
28
  });
28
29
  });
29
- test('with consecutive blanks', () => {
30
+ test('visibleColToGlobalCol with consecutive blanks', () => {
30
31
  const blanks = [2, 3, 4, 7, 8];
31
32
  [
32
33
  [0, 0],
@@ -36,10 +37,10 @@ test('with consecutive blanks', () => {
36
37
  [4, 9], // After position 3, skip 2 blanks (7,8)
37
38
  [5, 10],
38
39
  ].forEach(r => {
39
- expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
40
+ expect(visibleColToGlobalCol(blanks, r[0])).toBe(r[1]);
40
41
  });
41
42
  });
42
- test('with blanks at the beginning', () => {
43
+ test('visibleColToGlobalCol with blanks at the beginning', () => {
43
44
  const blanks = [1, 2, 5];
44
45
  [
45
46
  [0, 0],
@@ -48,10 +49,10 @@ test('with blanks at the beginning', () => {
48
49
  [3, 6], // After position 2, skip 1 blank (5)
49
50
  [4, 7],
50
51
  ].forEach(r => {
51
- expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
52
+ expect(visibleColToGlobalCol(blanks, r[0])).toBe(r[1]);
52
53
  });
53
54
  });
54
- test('with position exceeding blanks array', () => {
55
+ test('visibleColToGlobalCol with position exceeding blanks array', () => {
55
56
  const blanks = [2, 5];
56
57
  [
57
58
  [0, 0],
@@ -61,64 +62,163 @@ test('with position exceeding blanks array', () => {
61
62
  [4, 6], // After position 3, skip 1 blank (5)
62
63
  [10, 12], // Far beyond blanks array
63
64
  ].forEach(r => {
64
- expect(mouseOverCoordToGlobalCoord(blanks, r[0])).toBe(r[1]);
65
+ expect(visibleColToGlobalCol(blanks, r[0])).toBe(r[1]);
65
66
  });
66
67
  });
67
- test('with gaps in sequence', () => {
68
+ // Tests for globalColToVisibleCol (global visible)
69
+ test('globalColToVisibleCol with blanks at positions [2, 5, 8]', () => {
70
+ const blanks = [2, 5, 8];
71
+ // Inverse of visibleColToGlobalCol
72
+ expect(globalColToVisibleCol(blanks, 0)).toBe(0);
73
+ expect(globalColToVisibleCol(blanks, 1)).toBe(1);
74
+ expect(globalColToVisibleCol(blanks, 2)).toBe(undefined); // Hidden
75
+ expect(globalColToVisibleCol(blanks, 3)).toBe(2);
76
+ expect(globalColToVisibleCol(blanks, 4)).toBe(3);
77
+ expect(globalColToVisibleCol(blanks, 5)).toBe(undefined); // Hidden
78
+ expect(globalColToVisibleCol(blanks, 6)).toBe(4);
79
+ expect(globalColToVisibleCol(blanks, 7)).toBe(5);
80
+ expect(globalColToVisibleCol(blanks, 8)).toBe(undefined); // Hidden
81
+ expect(globalColToVisibleCol(blanks, 9)).toBe(6);
82
+ expect(globalColToVisibleCol(blanks, 10)).toBe(7);
83
+ });
84
+ test('globalColToVisibleCol with no blanks', () => {
85
+ const blanks = [];
86
+ expect(globalColToVisibleCol(blanks, 0)).toBe(0);
87
+ expect(globalColToVisibleCol(blanks, 5)).toBe(5);
88
+ expect(globalColToVisibleCol(blanks, 10)).toBe(10);
89
+ });
90
+ test('globalColToVisibleCol with consecutive blanks', () => {
91
+ const blanks = [2, 3, 4, 7, 8];
92
+ expect(globalColToVisibleCol(blanks, 0)).toBe(0);
93
+ expect(globalColToVisibleCol(blanks, 1)).toBe(1);
94
+ expect(globalColToVisibleCol(blanks, 2)).toBe(undefined); // Hidden
95
+ expect(globalColToVisibleCol(blanks, 3)).toBe(undefined); // Hidden
96
+ expect(globalColToVisibleCol(blanks, 4)).toBe(undefined); // Hidden
97
+ expect(globalColToVisibleCol(blanks, 5)).toBe(2);
98
+ expect(globalColToVisibleCol(blanks, 6)).toBe(3);
99
+ expect(globalColToVisibleCol(blanks, 7)).toBe(undefined); // Hidden
100
+ expect(globalColToVisibleCol(blanks, 8)).toBe(undefined); // Hidden
101
+ expect(globalColToVisibleCol(blanks, 9)).toBe(4);
102
+ expect(globalColToVisibleCol(blanks, 10)).toBe(5);
103
+ });
104
+ // Tests for globalColToSeqPos (global column → sequence position)
105
+ test('globalColToSeqPos with gaps in sequence', () => {
68
106
  const sequence = 'AC-GT-A';
69
- expect(globalCoordToRowSpecificCoord(sequence, 0)).toBe(0);
70
- expect(globalCoordToRowSpecificCoord(sequence, 1)).toBe(1);
71
- expect(globalCoordToRowSpecificCoord(sequence, 2)).toBe(2);
107
+ expect(globalColToSeqPos(sequence, 0)).toBe(0);
108
+ expect(globalColToSeqPos(sequence, 1)).toBe(1);
109
+ expect(globalColToSeqPos(sequence, 2)).toBe(2);
72
110
  // Position 2 is a gap, so count before it is 2
73
- expect(globalCoordToRowSpecificCoord(sequence, 3)).toBe(2);
74
- expect(globalCoordToRowSpecificCoord(sequence, 4)).toBe(3);
75
- expect(globalCoordToRowSpecificCoord(sequence, 5)).toBe(4);
111
+ expect(globalColToSeqPos(sequence, 3)).toBe(2);
112
+ expect(globalColToSeqPos(sequence, 4)).toBe(3);
113
+ expect(globalColToSeqPos(sequence, 5)).toBe(4);
76
114
  // Position 5 is a gap, so count before it is 4
77
- expect(globalCoordToRowSpecificCoord(sequence, 6)).toBe(4);
115
+ expect(globalColToSeqPos(sequence, 6)).toBe(4);
78
116
  });
79
- test('with mixed gap characters (- and .)', () => {
117
+ test('globalColToSeqPos with mixed gap characters (- and .)', () => {
80
118
  const sequence = 'AC.GT-A';
81
- expect(globalCoordToRowSpecificCoord(sequence, 0)).toBe(0);
82
- expect(globalCoordToRowSpecificCoord(sequence, 1)).toBe(1);
119
+ expect(globalColToSeqPos(sequence, 0)).toBe(0);
120
+ expect(globalColToSeqPos(sequence, 1)).toBe(1);
83
121
  // Position 2 is a gap (.), so count before it is 2
84
- expect(globalCoordToRowSpecificCoord(sequence, 2)).toBe(2);
85
- expect(globalCoordToRowSpecificCoord(sequence, 3)).toBe(2);
86
- expect(globalCoordToRowSpecificCoord(sequence, 4)).toBe(3);
122
+ expect(globalColToSeqPos(sequence, 2)).toBe(2);
123
+ expect(globalColToSeqPos(sequence, 3)).toBe(2);
124
+ expect(globalColToSeqPos(sequence, 4)).toBe(3);
87
125
  // Position 5 is a gap (-), so count before it is 4
88
- expect(globalCoordToRowSpecificCoord(sequence, 5)).toBe(4);
89
- expect(globalCoordToRowSpecificCoord(sequence, 6)).toBe(4);
126
+ expect(globalColToSeqPos(sequence, 5)).toBe(4);
127
+ expect(globalColToSeqPos(sequence, 6)).toBe(4);
90
128
  });
91
- test('with no gaps in sequence', () => {
129
+ test('globalColToSeqPos with no gaps in sequence', () => {
92
130
  const sequence = 'ACGTA';
93
- expect(globalCoordToRowSpecificCoord(sequence, 0)).toBe(0);
94
- expect(globalCoordToRowSpecificCoord(sequence, 1)).toBe(1);
95
- expect(globalCoordToRowSpecificCoord(sequence, 2)).toBe(2);
96
- expect(globalCoordToRowSpecificCoord(sequence, 3)).toBe(3);
97
- expect(globalCoordToRowSpecificCoord(sequence, 4)).toBe(4);
131
+ expect(globalColToSeqPos(sequence, 0)).toBe(0);
132
+ expect(globalColToSeqPos(sequence, 1)).toBe(1);
133
+ expect(globalColToSeqPos(sequence, 2)).toBe(2);
134
+ expect(globalColToSeqPos(sequence, 3)).toBe(3);
135
+ expect(globalColToSeqPos(sequence, 4)).toBe(4);
98
136
  });
99
- test('with all gaps in sequence', () => {
137
+ test('globalColToSeqPos with all gaps in sequence', () => {
100
138
  const sequence = '-----';
101
- expect(globalCoordToRowSpecificCoord(sequence, 0)).toBe(0);
102
- expect(globalCoordToRowSpecificCoord(sequence, 1)).toBe(0);
103
- expect(globalCoordToRowSpecificCoord(sequence, 2)).toBe(0);
104
- expect(globalCoordToRowSpecificCoord(sequence, 3)).toBe(0);
105
- expect(globalCoordToRowSpecificCoord(sequence, 4)).toBe(0);
139
+ expect(globalColToSeqPos(sequence, 0)).toBe(0);
140
+ expect(globalColToSeqPos(sequence, 1)).toBe(0);
141
+ expect(globalColToSeqPos(sequence, 2)).toBe(0);
142
+ expect(globalColToSeqPos(sequence, 3)).toBe(0);
143
+ expect(globalColToSeqPos(sequence, 4)).toBe(0);
106
144
  });
107
- test('with position exceeding sequence length', () => {
145
+ test('globalColToSeqPos with position exceeding sequence length', () => {
108
146
  const sequence = 'AC-GT';
109
- expect(globalCoordToRowSpecificCoord(sequence, 10)).toBe(4);
147
+ expect(globalColToSeqPos(sequence, 10)).toBe(4);
110
148
  });
111
- test('mouseOverCoordToGapRemovedCoord', () => {
149
+ // Tests for visibleColToSeqPos (visible column → sequence position)
150
+ test('visibleColToSeqPos returns sequence position or undefined for gaps', () => {
112
151
  const seq = 'AC--GT--CT';
113
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 0, blanks: [] })).toBe(0);
114
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 1, blanks: [] })).toBe(1);
115
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 2, blanks: [] })).toBe(undefined);
116
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 3, blanks: [] })).toBe(undefined);
117
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 4, blanks: [] })).toBe(2);
118
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 5, blanks: [] })).toBe(3);
119
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 6, blanks: [] })).toBe(undefined);
120
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 7, blanks: [] })).toBe(undefined);
121
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 8, blanks: [] })).toBe(4);
122
- expect(mouseOverCoordToGapRemovedCoord({ seq, position: 9, blanks: [] })).toBe(5);
152
+ expect(visibleColToSeqPos({ seq, visibleCol: 0, blanks: [] })).toBe(0);
153
+ expect(visibleColToSeqPos({ seq, visibleCol: 1, blanks: [] })).toBe(1);
154
+ expect(visibleColToSeqPos({ seq, visibleCol: 2, blanks: [] })).toBe(undefined);
155
+ expect(visibleColToSeqPos({ seq, visibleCol: 3, blanks: [] })).toBe(undefined);
156
+ expect(visibleColToSeqPos({ seq, visibleCol: 4, blanks: [] })).toBe(2);
157
+ expect(visibleColToSeqPos({ seq, visibleCol: 5, blanks: [] })).toBe(3);
158
+ expect(visibleColToSeqPos({ seq, visibleCol: 6, blanks: [] })).toBe(undefined);
159
+ expect(visibleColToSeqPos({ seq, visibleCol: 7, blanks: [] })).toBe(undefined);
160
+ expect(visibleColToSeqPos({ seq, visibleCol: 8, blanks: [] })).toBe(4);
161
+ expect(visibleColToSeqPos({ seq, visibleCol: 9, blanks: [] })).toBe(5);
162
+ });
163
+ // Round-trip tests: visible → global → visible should be identity for valid columns
164
+ test('round-trip: visibleColToGlobalCol and globalColToVisibleCol are inverses', () => {
165
+ const blanks = [2, 5, 8];
166
+ // For each visible column, going to global and back should return the same value
167
+ for (let visibleCol = 0; visibleCol < 10; visibleCol++) {
168
+ const globalCol = visibleColToGlobalCol(blanks, visibleCol);
169
+ const backToVisible = globalColToVisibleCol(blanks, globalCol);
170
+ expect(backToVisible).toBe(visibleCol);
171
+ }
172
+ });
173
+ test('round-trip: globalColToVisibleCol and visibleColToGlobalCol for non-hidden columns', () => {
174
+ const blanks = [2, 5, 8];
175
+ // For each global column that is NOT hidden, going to visible and back should return the same value
176
+ for (let globalCol = 0; globalCol < 15; globalCol++) {
177
+ const visibleCol = globalColToVisibleCol(blanks, globalCol);
178
+ if (visibleCol !== undefined) {
179
+ const backToGlobal = visibleColToGlobalCol(blanks, visibleCol);
180
+ expect(backToGlobal).toBe(globalCol);
181
+ }
182
+ }
183
+ });
184
+ // Edge case: blanks at position 0
185
+ test('globalColToVisibleCol with blank at position 0', () => {
186
+ const blanks = [0, 1, 5];
187
+ expect(globalColToVisibleCol(blanks, 0)).toBe(undefined); // Hidden
188
+ expect(globalColToVisibleCol(blanks, 1)).toBe(undefined); // Hidden
189
+ expect(globalColToVisibleCol(blanks, 2)).toBe(0); // First visible column
190
+ expect(globalColToVisibleCol(blanks, 3)).toBe(1);
191
+ expect(globalColToVisibleCol(blanks, 4)).toBe(2);
192
+ expect(globalColToVisibleCol(blanks, 5)).toBe(undefined); // Hidden
193
+ expect(globalColToVisibleCol(blanks, 6)).toBe(3);
194
+ });
195
+ test('visibleColToGlobalCol with blank at position 0', () => {
196
+ const blanks = [0, 1, 5];
197
+ expect(visibleColToGlobalCol(blanks, 0)).toBe(2); // Skips 0, 1
198
+ expect(visibleColToGlobalCol(blanks, 1)).toBe(3);
199
+ expect(visibleColToGlobalCol(blanks, 2)).toBe(4);
200
+ expect(visibleColToGlobalCol(blanks, 3)).toBe(6); // Skips 5
201
+ });
202
+ // Edge case: all columns before a position are blanks
203
+ test('globalColToVisibleCol with many leading blanks', () => {
204
+ const blanks = [0, 1, 2, 3, 4];
205
+ expect(globalColToVisibleCol(blanks, 0)).toBe(undefined);
206
+ expect(globalColToVisibleCol(blanks, 4)).toBe(undefined);
207
+ expect(globalColToVisibleCol(blanks, 5)).toBe(0); // First visible
208
+ expect(globalColToVisibleCol(blanks, 6)).toBe(1);
209
+ expect(globalColToVisibleCol(blanks, 10)).toBe(5);
210
+ });
211
+ // Test visibleColToSeqPos with blanks (combined gap hiding and row gaps)
212
+ test('visibleColToSeqPos with both blanks and row gaps', () => {
213
+ // Sequence: A-C-G (global cols 0,1,2,3,4)
214
+ // If blanks = [1, 3], visible sequence becomes: A C G (visible cols 0,1,2)
215
+ const seq = 'A-C-G';
216
+ const blanks = [1, 3];
217
+ // Visible col 0 → global col 0 → 'A' → seqPos 0
218
+ expect(visibleColToSeqPos({ seq, visibleCol: 0, blanks })).toBe(0);
219
+ // Visible col 1 → global col 2 → 'C' → seqPos 1
220
+ expect(visibleColToSeqPos({ seq, visibleCol: 1, blanks })).toBe(1);
221
+ // Visible col 2 → global col 4 → 'G' → seqPos 2
222
+ expect(visibleColToSeqPos({ seq, visibleCol: 2, blanks })).toBe(2);
123
223
  });
124
224
  //# sourceMappingURL=rowCoordinateCalculations.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rowCoordinateCalculations.test.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rowCoordinateCalculations.test.js","sourceRoot":"","sources":["../src/rowCoordinateCalculations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Convert a sequence position (ungapped, 0-based) to a global column index.
3
+ * This finds the global column that contains the Nth non-gap character.
4
+ *
5
+ * @param row - The row's sequence string (including gaps)
6
+ * @param seqPos - The sequence position (0-based count of non-gap characters)
7
+ * @returns The global column index containing the seqPos-th non-gap character
8
+ *
9
+ * @example
10
+ * // Row: "A-TG-C" (A at 0, T at 2, G at 3, C at 5)
11
+ * seqPosToGlobalCol({ row: "A-TG-C", seqPos: 0 }) // → 0 (A)
12
+ * seqPosToGlobalCol({ row: "A-TG-C", seqPos: 1 }) // → 2 (T)
13
+ * seqPosToGlobalCol({ row: "A-TG-C", seqPos: 2 }) // → 3 (G)
14
+ * seqPosToGlobalCol({ row: "A-TG-C", seqPos: 3 }) // → 5 (C)
15
+ */
16
+ export declare function seqPosToGlobalCol({ row, seqPos, }: {
17
+ row: string;
18
+ seqPos: number;
19
+ }): number;
@@ -0,0 +1,34 @@
1
+ import { isBlank } from './util';
2
+ /**
3
+ * Convert a sequence position (ungapped, 0-based) to a global column index.
4
+ * This finds the global column that contains the Nth non-gap character.
5
+ *
6
+ * @param row - The row's sequence string (including gaps)
7
+ * @param seqPos - The sequence position (0-based count of non-gap characters)
8
+ * @returns The global column index containing the seqPos-th non-gap character
9
+ *
10
+ * @example
11
+ * // Row: "A-TG-C" (A at 0, T at 2, G at 3, C at 5)
12
+ * seqPosToGlobalCol({ row: "A-TG-C", seqPos: 0 }) // → 0 (A)
13
+ * seqPosToGlobalCol({ row: "A-TG-C", seqPos: 1 }) // → 2 (T)
14
+ * seqPosToGlobalCol({ row: "A-TG-C", seqPos: 2 }) // → 3 (G)
15
+ * seqPosToGlobalCol({ row: "A-TG-C", seqPos: 3 }) // → 5 (C)
16
+ */
17
+ export function seqPosToGlobalCol({ row, seqPos, }) {
18
+ let nonGapCount = 0;
19
+ let globalCol = 0;
20
+ // Find the seqPos-th non-gap character
21
+ while (globalCol < row.length) {
22
+ if (!isBlank(row[globalCol])) {
23
+ if (nonGapCount === seqPos) {
24
+ return globalCol;
25
+ }
26
+ nonGapCount++;
27
+ }
28
+ globalCol++;
29
+ }
30
+ // If seqPos is 0 and we didn't find any non-gap character, return 0
31
+ // Otherwise return globalCol (which is row.length at this point)
32
+ return seqPos === 0 ? 0 : globalCol;
33
+ }
34
+ //# sourceMappingURL=seqPosToGlobalCol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seqPosToGlobalCol.js","sourceRoot":"","sources":["../src/seqPosToGlobalCol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAEhC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAChC,GAAG,EACH,MAAM,GAIP;IACC,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,IAAI,SAAS,GAAG,CAAC,CAAA;IACjB,uCAAuC;IACvC,OAAO,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YAC7B,IAAI,WAAW,KAAK,MAAM,EAAE,CAAC;gBAC3B,OAAO,SAAS,CAAA;YAClB,CAAC;YACD,WAAW,EAAE,CAAA;QACf,CAAC;QACD,SAAS,EAAE,CAAA;IACb,CAAC;IACD,oEAAoE;IACpE,iEAAiE;IACjE,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AACrC,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { describe, expect, test } from 'vitest';
2
+ import { seqPosToGlobalCol } from './seqPosToGlobalCol';
3
+ describe('seqPosToGlobalCol', () => {
4
+ test('converts sequence position to global column with no gaps', () => {
5
+ const row = 'ATGCATGC';
6
+ expect(seqPosToGlobalCol({ row, seqPos: 0 })).toBe(0);
7
+ expect(seqPosToGlobalCol({ row, seqPos: 3 })).toBe(3);
8
+ expect(seqPosToGlobalCol({ row, seqPos: 7 })).toBe(7);
9
+ expect(seqPosToGlobalCol({ row, seqPos: 8 })).toBe(8); // Past end
10
+ });
11
+ test('converts sequence position to global column with gaps', () => {
12
+ const row = 'A-TG-CA-TGC';
13
+ // Global: A(0) -(1) T(2) G(3) -(4) C(5) A(6) -(7) T(8) G(9) C(10)
14
+ // SeqPos: A(0) T(1) G(2) C(3) A(4) T(5) G(6) C(7)
15
+ expect(seqPosToGlobalCol({ row, seqPos: 0 })).toBe(0); // A
16
+ expect(seqPosToGlobalCol({ row, seqPos: 1 })).toBe(2); // T
17
+ expect(seqPosToGlobalCol({ row, seqPos: 2 })).toBe(3); // G
18
+ expect(seqPosToGlobalCol({ row, seqPos: 3 })).toBe(5); // C
19
+ expect(seqPosToGlobalCol({ row, seqPos: 4 })).toBe(6); // A
20
+ expect(seqPosToGlobalCol({ row, seqPos: 5 })).toBe(8); // T
21
+ expect(seqPosToGlobalCol({ row, seqPos: 6 })).toBe(9); // G
22
+ expect(seqPosToGlobalCol({ row, seqPos: 7 })).toBe(10); // C
23
+ expect(seqPosToGlobalCol({ row, seqPos: 8 })).toBe(11); // Past end
24
+ });
25
+ test('handles empty row', () => {
26
+ expect(seqPosToGlobalCol({ row: '', seqPos: 0 })).toBe(0);
27
+ });
28
+ test('handles row with only gaps', () => {
29
+ const row = '---..--';
30
+ expect(seqPosToGlobalCol({ row, seqPos: 0 })).toBe(0);
31
+ expect(seqPosToGlobalCol({ row, seqPos: 1 })).toBe(7); // Past end
32
+ });
33
+ test('handles mixed gap characters (- and .)', () => {
34
+ const row = 'A-.G-C.';
35
+ // Global: A(0) -(1) .(2) G(3) -(4) C(5) .(6)
36
+ // SeqPos: A(0) G(1) C(2)
37
+ expect(seqPosToGlobalCol({ row, seqPos: 0 })).toBe(0); // A
38
+ expect(seqPosToGlobalCol({ row, seqPos: 1 })).toBe(3); // G
39
+ expect(seqPosToGlobalCol({ row, seqPos: 2 })).toBe(5); // C
40
+ expect(seqPosToGlobalCol({ row, seqPos: 3 })).toBe(7); // Past end
41
+ });
42
+ test('handles leading gaps', () => {
43
+ const row = '--ACG';
44
+ // Global: -(0) -(1) A(2) C(3) G(4)
45
+ // SeqPos: A(0) C(1) G(2)
46
+ expect(seqPosToGlobalCol({ row, seqPos: 0 })).toBe(2); // A
47
+ expect(seqPosToGlobalCol({ row, seqPos: 1 })).toBe(3); // C
48
+ expect(seqPosToGlobalCol({ row, seqPos: 2 })).toBe(4); // G
49
+ });
50
+ test('handles trailing gaps', () => {
51
+ const row = 'ACG--';
52
+ // Global: A(0) C(1) G(2) -(3) -(4)
53
+ // SeqPos: A(0) C(1) G(2)
54
+ expect(seqPosToGlobalCol({ row, seqPos: 0 })).toBe(0); // A
55
+ expect(seqPosToGlobalCol({ row, seqPos: 1 })).toBe(1); // C
56
+ expect(seqPosToGlobalCol({ row, seqPos: 2 })).toBe(2); // G
57
+ expect(seqPosToGlobalCol({ row, seqPos: 3 })).toBe(5); // Past end
58
+ });
59
+ });
60
+ //# sourceMappingURL=seqPosToGlobalCol.test.js.map