msa-parsers 6.5.0 → 8.0.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 (75) hide show
  1. package/README.md +23 -8
  2. package/dist/gff/annotationsToGFF.d.ts +6 -4
  3. package/dist/gff/annotationsToGFF.js +7 -4
  4. package/dist/gff/annotationsToGFF.js.map +1 -1
  5. package/dist/gff/gffToAnnotations.js +48 -4
  6. package/dist/gff/gffToAnnotations.js.map +1 -1
  7. package/dist/gff/parseGFF.js +21 -6
  8. package/dist/gff/parseGFF.js.map +1 -1
  9. package/dist/interProScanToAnnotations.d.ts +7 -2
  10. package/dist/interProScanToAnnotations.js +20 -10
  11. package/dist/interProScanToAnnotations.js.map +1 -1
  12. package/dist/msa/A3mMSA.js +3 -3
  13. package/dist/msa/A3mMSA.js.map +1 -1
  14. package/dist/msa/BaseMSA.d.ts +5 -14
  15. package/dist/msa/BaseMSA.js +3 -7
  16. package/dist/msa/BaseMSA.js.map +1 -1
  17. package/dist/msa/FastaMSA.js +2 -2
  18. package/dist/msa/FastaMSA.js.map +1 -1
  19. package/dist/msa/StockholmMSA.d.ts +7 -7
  20. package/dist/msa/StockholmMSA.js +40 -17
  21. package/dist/msa/StockholmMSA.js.map +1 -1
  22. package/dist/msa/fastaRecords.d.ts +8 -3
  23. package/dist/msa/fastaRecords.js +28 -16
  24. package/dist/msa/fastaRecords.js.map +1 -1
  25. package/dist/msa/index.d.ts +1 -1
  26. package/dist/msa/index.js +8 -2
  27. package/dist/msa/index.js.map +1 -1
  28. package/dist/msa/stockholmParser.js +21 -9
  29. package/dist/msa/stockholmParser.js.map +1 -1
  30. package/dist/types.d.ts +24 -2
  31. package/package.json +6 -6
  32. package/src/gff/annotationsToGFF.ts +10 -4
  33. package/src/gff/gffToAnnotations.test.ts +55 -0
  34. package/src/gff/gffToAnnotations.ts +72 -21
  35. package/src/gff/interProToGFF.test.ts +43 -6
  36. package/src/gff/parseGFF.test.ts +23 -11
  37. package/src/gff/parseGFF.ts +39 -23
  38. package/src/interProScanToAnnotations.ts +24 -16
  39. package/src/msa/A3mMSA.ts +3 -3
  40. package/src/msa/BaseMSA.ts +5 -14
  41. package/src/msa/FastaMSA.ts +2 -2
  42. package/src/msa/StockholmMSA.ts +46 -24
  43. package/src/msa/fastaRecords.ts +30 -17
  44. package/src/msa/index.test.ts +93 -0
  45. package/src/msa/index.ts +11 -2
  46. package/src/msa/stockholmParser.test.ts +22 -0
  47. package/src/msa/stockholmParser.ts +20 -9
  48. package/src/types.ts +26 -5
  49. package/dist/gff/gffToAnnotations.test.d.ts +0 -1
  50. package/dist/gff/gffToAnnotations.test.js +0 -71
  51. package/dist/gff/gffToAnnotations.test.js.map +0 -1
  52. package/dist/gff/interProToGFF.test.d.ts +0 -1
  53. package/dist/gff/interProToGFF.test.js +0 -208
  54. package/dist/gff/interProToGFF.test.js.map +0 -1
  55. package/dist/gff/parseGFF.test.d.ts +0 -1
  56. package/dist/gff/parseGFF.test.js +0 -102
  57. package/dist/gff/parseGFF.test.js.map +0 -1
  58. package/dist/msa/A3mMSA.property.test.d.ts +0 -1
  59. package/dist/msa/A3mMSA.property.test.js +0 -112
  60. package/dist/msa/A3mMSA.property.test.js.map +0 -1
  61. package/dist/msa/A3mMSA.test.d.ts +0 -1
  62. package/dist/msa/A3mMSA.test.js +0 -337
  63. package/dist/msa/A3mMSA.test.js.map +0 -1
  64. package/dist/msa/impgIntegration.test.d.ts +0 -1
  65. package/dist/msa/impgIntegration.test.js +0 -49
  66. package/dist/msa/impgIntegration.test.js.map +0 -1
  67. package/dist/msa/index.test.d.ts +0 -1
  68. package/dist/msa/index.test.js +0 -229
  69. package/dist/msa/index.test.js.map +0 -1
  70. package/dist/msa/stockholmParser.test.d.ts +0 -1
  71. package/dist/msa/stockholmParser.test.js +0 -122
  72. package/dist/msa/stockholmParser.test.js.map +0 -1
  73. package/dist/util.test.d.ts +0 -1
  74. package/dist/util.test.js +0 -40
  75. package/dist/util.test.js.map +0 -1
package/README.md CHANGED
@@ -30,12 +30,15 @@ pnpm add msa-parsers
30
30
 
31
31
  ### Parsing MSA files
32
32
 
33
- The `parseMSA` function auto-detects the format:
33
+ `parseMSA` sniffs the format from the content, not from the file name. FASTA and
34
+ A3M share a leading `>`, so telling them apart is heuristic; pass a format as
35
+ the third argument to override the guess:
34
36
 
35
37
  ```typescript
36
38
  import { parseMSA } from 'msa-parsers'
37
39
 
38
40
  const msa = parseMSA(fileContents)
41
+ const stockholm = parseMSA(fileContents, 0, 'stockholm')
39
42
 
40
43
  // Get sequence names
41
44
  const names = msa.getNames()
@@ -56,7 +59,8 @@ const tree = msa.getTree()
56
59
  import { FastaMSA, StockholmMSA, ClustalMSA } from 'msa-parsers'
57
60
 
58
61
  const fasta = new FastaMSA(fastaContents)
59
- const stockholm = new StockholmMSA(stockholmContents)
62
+ // a Stockholm file can hold several alignments; the second argument picks one
63
+ const stockholm = new StockholmMSA(stockholmContents, 0)
60
64
  const clustal = new ClustalMSA(clustalContents)
61
65
  ```
62
66
 
@@ -71,15 +75,26 @@ const treeWithIds = generateNodeIds(tree)
71
75
 
72
76
  ### GFF and InterProScan utilities
73
77
 
78
+ Every source of overlay annotations converts to one flat list of `Annotation` (a
79
+ row name, an accession, a name, a description and a 1-based inclusive interval),
80
+ and the viewer draws that list.
81
+
74
82
  ```typescript
75
- import { parseGFF, gffToInterProResults, interProToGFF } from 'msa-parsers'
83
+ import {
84
+ annotationsToGFF,
85
+ gffToAnnotations,
86
+ interProScanResponseToAnnotations,
87
+ parseGFF,
88
+ } from 'msa-parsers'
89
+
90
+ // GFF3 (including InterProScan's own output) to annotations
91
+ const annotations = gffToAnnotations(parseGFF(gffContents))
76
92
 
77
- // Parse GFF file
78
- const records = parseGFF(gffContents)
93
+ // an InterProScan JSON response to the same shape
94
+ const fromScan = interProScanResponseToAnnotations(response)
79
95
 
80
- // Convert between GFF and InterProScan formats
81
- const interProResults = gffToInterProResults(records)
82
- const gffString = interProToGFF(interProResults, seqId)
96
+ // and back out as GFF3, with optional `#` header lines
97
+ const gffString = annotationsToGFF(annotations, ['written by my pipeline'])
83
98
  ```
84
99
 
85
100
  ## License
@@ -1,9 +1,11 @@
1
1
  import type { Annotation } from '../types.ts';
2
2
  /**
3
- * Write annotations as GFF3, one line per annotation, in list order.
3
+ * Write annotations as GFF3, one line per annotation, in list order, with
4
+ * optional `#` comment lines after the version directive saying where they came
5
+ * from.
4
6
  *
5
7
  * The source column is always `InterProScan`: an Annotation records no source
6
- * of its own, and the CLI's precomputed-lookup path depends on this output
7
- * matching what a real InterProScan run emits, byte for byte.
8
+ * of its own, and the viewer reads a precomputed-lookup GFF by the same rules
9
+ * it reads a real InterProScan run's.
8
10
  */
9
- export declare function annotationsToGFF(annotations: Annotation[]): string;
11
+ export declare function annotationsToGFF(annotations: Annotation[], header?: string[]): string;
@@ -1,13 +1,16 @@
1
1
  /**
2
- * Write annotations as GFF3, one line per annotation, in list order.
2
+ * Write annotations as GFF3, one line per annotation, in list order, with
3
+ * optional `#` comment lines after the version directive saying where they came
4
+ * from.
3
5
  *
4
6
  * The source column is always `InterProScan`: an Annotation records no source
5
- * of its own, and the CLI's precomputed-lookup path depends on this output
6
- * matching what a real InterProScan run emits, byte for byte.
7
+ * of its own, and the viewer reads a precomputed-lookup GFF by the same rules
8
+ * it reads a real InterProScan run's.
7
9
  */
8
- export function annotationsToGFF(annotations) {
10
+ export function annotationsToGFF(annotations, header = []) {
9
11
  return [
10
12
  '##gff-version 3',
13
+ ...header.map(line => `# ${line}`),
11
14
  ...annotations.map(annotation => {
12
15
  const { accession, name, description, featureType } = annotation;
13
16
  const { id, start, end, strand } = annotation;
@@ -1 +1 @@
1
- {"version":3,"file":"annotationsToGFF.js","sourceRoot":"","sources":["../../src/gff/annotationsToGFF.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAyB;IACxD,OAAO;QACL,iBAAiB;QACjB,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC9B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAU,CAAA;YAChE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;YAC7C,OAAO;gBACL,EAAE;gBACF,cAAc;gBACd,mEAAmE;gBACnE,oEAAoE;gBACpE,gEAAgE;gBAChE,oCAAoC;gBACpC,WAAW,IAAI,eAAe;gBAC9B,KAAK;gBACL,GAAG;gBACH,GAAG;gBACH,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;gBACnD,GAAG;gBACH;oBACE,QAAQ,kBAAkB,CAAC,SAAS,CAAC,EAAE;oBACvC,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE;oBAC5C,eAAe,kBAAkB,CAAC,WAAW,CAAC,EAAE;iBACjD,CAAC,IAAI,CAAC,GAAG,CAAC;aACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACd,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
1
+ {"version":3,"file":"annotationsToGFF.js","sourceRoot":"","sources":["../../src/gff/annotationsToGFF.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAyB,EACzB,MAAM,GAAa,EAAE;IAErB,OAAO;QACL,iBAAiB;QACjB,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC9B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAU,CAAA;YAChE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;YAC7C,OAAO;gBACL,EAAE;gBACF,cAAc;gBACd,mEAAmE;gBACnE,oEAAoE;gBACpE,gEAAgE;gBAChE,oCAAoC;gBACpC,WAAW,IAAI,eAAe;gBAC9B,KAAK;gBACL,GAAG;gBACH,GAAG;gBACH,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;gBACnD,GAAG;gBACH;oBACE,QAAQ,kBAAkB,CAAC,SAAS,CAAC,EAAE;oBACvC,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE;oBAC5C,eAAe,kBAAkB,CAAC,WAAW,CAAC,EAAE;iBACjD,CAAC,IAAI,CAAC,GAAG,CAAC;aACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACd,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
@@ -22,6 +22,41 @@ function geneStrand({ type, strand }) {
22
22
  const directional = strand === '+' ? 1 : strand === '-' ? -1 : undefined;
23
23
  return GENE_LEVEL_TYPES.has(type) ? directional : undefined;
24
24
  }
25
+ // The nine columns a feature line holds; every other key of a record came from
26
+ // column 9
27
+ const GFF_COLUMNS = new Set([
28
+ 'seq_id',
29
+ 'source',
30
+ 'type',
31
+ 'start',
32
+ 'end',
33
+ 'score',
34
+ 'strand',
35
+ 'phase',
36
+ ]);
37
+ function attributesOf(record) {
38
+ const entries = Object.entries(record).filter(([key, value]) => !GFF_COLUMNS.has(key) && typeof value === 'string');
39
+ return entries.length > 0 ? Object.fromEntries(entries) : undefined;
40
+ }
41
+ // JBrowse and IGV read an RGB triple as well as a named or hex color, and the
42
+ // attribute parser has already turned `255,0,0` into `255 0 0` by splitting on
43
+ // the GFF3 multi-value comma
44
+ const RGB_TRIPLE = /^(\d{1,3})[\s,]+(\d{1,3})[\s,]+(\d{1,3})$/;
45
+ function cssColor(record) {
46
+ const value = (record.color ??
47
+ record.colour ??
48
+ record.Color ??
49
+ record.Colour);
50
+ if (!value) {
51
+ return undefined;
52
+ }
53
+ const triple = RGB_TRIPLE.exec(value.trim());
54
+ return triple ? `rgb(${triple[1]},${triple[2]},${triple[3]})` : value.trim();
55
+ }
56
+ // InterProScan describes the sequence it scanned before listing the matches
57
+ // against it. Those lines span the whole row and carry no signature, so they
58
+ // would draw a full-width block labelled by an md5.
59
+ const WHOLE_SEQUENCE_TYPES = new Set(['polypeptide', 'nucleic_acid']);
25
60
  /**
26
61
  * Convert GFF records to annotations, one per record, in file order.
27
62
  *
@@ -30,23 +65,32 @@ function geneStrand({ type, strand }) {
30
65
  * name, with domain positions 1-based.
31
66
  */
32
67
  export function gffToAnnotations(gffRecords) {
33
- return gffRecords.map(record => {
68
+ return gffRecords
69
+ .filter(record => !WHOLE_SEQUENCE_TYPES.has(record.type))
70
+ .map(record => {
34
71
  const accession = record.Name ||
35
72
  record.ID ||
36
73
  `${record.source}_${record.start}_${record.end}`;
37
- const name = record.signature_desc || record.Name || accession;
74
+ const name = record.signature_desc ||
75
+ record.Name ||
76
+ accession;
38
77
  return {
39
78
  id: record.seq_id,
40
79
  accession,
41
80
  name,
42
- description: record.Ontology_term ||
43
- record.description ||
81
+ // not Ontology_term: a GO id list is what the domain is annotated
82
+ // with, not what it is, and reading it first labelled every
83
+ // InterProScan domain "GO:0003677 GO:0006281"
84
+ description: record.description ||
44
85
  record.Note ||
86
+ record.signature_desc ||
45
87
  name,
46
88
  featureType: record.type,
47
89
  start: record.start,
48
90
  end: record.end,
49
91
  strand: geneStrand(record),
92
+ color: cssColor(record),
93
+ attributes: attributesOf(record),
50
94
  };
51
95
  });
52
96
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gffToAnnotations.js","sourceRoot":"","sources":["../../src/gff/gffToAnnotations.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,uDAAuD;AACvD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM;IACN,YAAY;IACZ,MAAM;IACN,YAAY;IACZ,oBAAoB;IACpB,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;CACV,CAAC,CAAA;AAEF,0EAA0E;AAC1E,oCAAoC;AACpC,SAAS,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAa;IAC7C,MAAM,WAAW,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAuB;IACtD,OAAO,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QAC7B,MAAM,SAAS,GACZ,MAAM,CAAC,IAAe;YACtB,MAAM,CAAC,EAAa;YACrB,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,GAAG,EAAE,CAAA;QAClD,MAAM,IAAI,GACP,MAAM,CAAC,cAAyB,IAAK,MAAM,CAAC,IAAe,IAAI,SAAS,CAAA;QAC3E,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,MAAM;YACjB,SAAS;YACT,IAAI;YACJ,WAAW,EACR,MAAM,CAAC,aAAwB;gBAC/B,MAAM,CAAC,WAAsB;gBAC7B,MAAM,CAAC,IAAe;gBACvB,IAAI;YACN,WAAW,EAAE,MAAM,CAAC,IAAI;YACxB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC;SAC3B,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"gffToAnnotations.js","sourceRoot":"","sources":["../../src/gff/gffToAnnotations.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,11 @@ function safeDecode(val) {
8
8
  return val;
9
9
  }
10
10
  }
11
+ // InterProScan quotes some of its values (Ontology_term="GO:0008652",
12
+ // Dbxref="InterPro:IPR001048"), and the quotes are not part of the term
13
+ function unquote(val) {
14
+ return val.replace(/^"(.*)"$/, '$1');
15
+ }
11
16
  function parseAttributes(col9) {
12
17
  if (!col9) {
13
18
  return {};
@@ -28,7 +33,7 @@ function parseAttributes(col9) {
28
33
  val
29
34
  ? val
30
35
  .split(',')
31
- .map(v => safeDecode(v).trim())
36
+ .map(v => unquote(safeDecode(v).trim()))
32
37
  .join(' ')
33
38
  : undefined,
34
39
  ];
@@ -39,11 +44,21 @@ export function parseGFF(str) {
39
44
  if (!str) {
40
45
  return [];
41
46
  }
42
- return str
43
- .split('\n')
44
- .map(f => f.trim())
45
- .filter(f => !!f && !f.startsWith('#'))
46
- .map(f => {
47
+ const lines = [];
48
+ for (const raw of str.split('\n')) {
49
+ const line = raw.trim();
50
+ // InterProScan appends the sequences it scanned; every line past this is
51
+ // FASTA, and reading it as features gave rows named ">P51587"
52
+ if (line.startsWith('##FASTA')) {
53
+ break;
54
+ }
55
+ // a feature is nine tab-separated columns, eight of them mandatory; a
56
+ // FASTA line in a file that omitted the ##FASTA directive is one
57
+ if (line && !line.startsWith('#') && line.split('\t').length >= 8) {
58
+ lines.push(line);
59
+ }
60
+ }
61
+ return lines.map(f => {
47
62
  const parts = f.split('\t');
48
63
  const [seq_id, source, type, start, end, score, strand, phase] = parts;
49
64
  const col9 = parts[8];
@@ -1 +1 @@
1
- {"version":3,"file":"parseGFF.js","sourceRoot":"","sources":["../../src/gff/parseGFF.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parseGFF.js","sourceRoot":"","sources":["../../src/gff/parseGFF.ts"],"names":[],"mappings":"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"}
@@ -10,8 +10,13 @@ export declare function indexResultsByXref(results: InterProScanResults[]): {
10
10
  };
11
11
  /**
12
12
  * Flatten InterProScan results, keyed by the row name they attach to, into one
13
- * annotation per signature location. A signature without an `entry` carries no
14
- * accession or name to color, filter or label by, so it is dropped.
13
+ * annotation per signature location.
14
+ *
15
+ * An unintegrated signature has no InterPro `entry` -- MobiDBLite's disorder
16
+ * calls, and many CDD, Pfam and PANTHER hits -- and falling back to the
17
+ * signature's own accession and name is the difference between drawing those
18
+ * and dropping them. Only a signature with no accession at all has nothing to
19
+ * color, filter or label by, and is dropped.
15
20
  */
16
21
  export declare function interProScanToAnnotations(results: Record<string, InterProScanResults>): Annotation[];
17
22
  /**
@@ -11,22 +11,32 @@ export function indexResultsByXref(results) {
11
11
  }
12
12
  /**
13
13
  * Flatten InterProScan results, keyed by the row name they attach to, into one
14
- * annotation per signature location. A signature without an `entry` carries no
15
- * accession or name to color, filter or label by, so it is dropped.
14
+ * annotation per signature location.
15
+ *
16
+ * An unintegrated signature has no InterPro `entry` -- MobiDBLite's disorder
17
+ * calls, and many CDD, Pfam and PANTHER hits -- and falling back to the
18
+ * signature's own accession and name is the difference between drawing those
19
+ * and dropping them. Only a signature with no accession at all has nothing to
20
+ * color, filter or label by, and is dropped.
16
21
  */
17
22
  export function interProScanToAnnotations(results) {
18
- return Object.entries(results).flatMap(([id, { matches }]) => matches.flatMap(({ signature: { entry }, locations }) => entry
19
- ? locations.map(({ start, end, strand }) => ({
23
+ return Object.entries(results).flatMap(([id, { matches }]) => matches.flatMap(({ signature, locations }) => {
24
+ const { entry } = signature;
25
+ const accession = entry?.accession ?? signature.accession;
26
+ if (!accession) {
27
+ return [];
28
+ }
29
+ const name = entry?.name ?? signature.name ?? accession;
30
+ return locations.map(({ start, end, strand }) => ({
20
31
  id,
21
- accession: entry.accession,
22
- name: entry.name,
23
- description: entry.description,
24
- featureType: entry.featureType,
32
+ accession,
33
+ name,
34
+ description: entry?.description ?? signature.description ?? name,
25
35
  start,
26
36
  end,
27
37
  strand,
28
- }))
29
- : []));
38
+ }));
39
+ }));
30
40
  }
31
41
  /**
32
42
  * Flatten a whole InterProScan JSON response, resolving each result's row name
@@ -1 +1 @@
1
- {"version":3,"file":"interProScanToAnnotations.js","sourceRoot":"","sources":["../src/interProScanToAnnotations.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA8B;IAC/D,OAAO,MAAM,CAAC,WAAW,CACvB,OAAO;SACJ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAU,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAsC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CACzE,CAAA;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAA4C;IAE5C,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAC3D,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,CACtD,KAAK;QACH,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YACzC,EAAE;YACF,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,KAAK;YACL,GAAG;YACH,MAAM;SACP,CAAC,CAAC;QACL,CAAC,CAAC,EAAE,CACP,CACF,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAC/C,QAA8B;IAE9B,OAAO,yBAAyB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;AACxE,CAAC"}
1
+ {"version":3,"file":"interProScanToAnnotations.js","sourceRoot":"","sources":["../src/interProScanToAnnotations.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAA8B;IAC/D,OAAO,MAAM,CAAC,WAAW,CACvB,OAAO;SACJ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAU,CAAC;SACrC,MAAM,CAAC,CAAC,CAAC,EAAsC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CACzE,CAAA;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CACvC,OAA4C;IAE5C,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAC3D,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3C,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAA;QAC3B,MAAM,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,SAAS,CAAC,SAAS,CAAA;QACzD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,EAAE,CAAA;QACX,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,SAAS,CAAA;QACvD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAChD,EAAE;YACF,SAAS;YACT,IAAI;YACJ,WAAW,EAAE,KAAK,EAAE,WAAW,IAAI,SAAS,CAAC,WAAW,IAAI,IAAI;YAChE,KAAK;YACL,GAAG;YACH,MAAM;SACP,CAAC,CAAC,CAAA;IACL,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAC/C,QAA8B;IAE9B,OAAO,yBAAyB,CAAC,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;AACxE,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import BaseMSA from './BaseMSA.js';
2
- import { splitFastaRecords } from './fastaRecords.js';
2
+ import { fastaSniff, splitFastaRecords } from './fastaRecords.js';
3
3
  /**
4
4
  * A3M Format Parser
5
5
  *
@@ -61,7 +61,7 @@ export default class A3mMSA extends BaseMSA {
61
61
  };
62
62
  }
63
63
  static sniff(text) {
64
- if (!text.startsWith('>')) {
64
+ if (!fastaSniff(text)) {
65
65
  return false;
66
66
  }
67
67
  const seqs = splitFastaRecords(text)
@@ -114,7 +114,7 @@ function expandA3M(rawSeqs, names) {
114
114
  maxInserts[pos] = Math.max(maxInserts[pos], ins.length);
115
115
  }
116
116
  }
117
- const expanded = {};
117
+ const expanded = Object.create(null);
118
118
  for (const [seqIdx, { matches, inserts }] of rows.entries()) {
119
119
  const result = [];
120
120
  for (let pos = 0; pos <= numPositions; pos++) {
@@ -1 +1 @@
1
- {"version":3,"file":"A3mMSA.js","sourceRoot":"","sources":["../../src/msa/A3mMSA.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"A3mMSA.js","sourceRoot":"","sources":["../../src/msa/A3mMSA.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,13 @@
1
- import type { NodeWithIds } from '../types.ts';
1
+ import type { MSATrack, NodeWithIds } from '../types.ts';
2
2
  export default abstract class BaseMSA {
3
3
  abstract getMSA(): unknown;
4
4
  abstract getRow(name: string): string;
5
5
  abstract getNames(): string[];
6
6
  private width?;
7
7
  /**
8
- * Column count of the alignment: the length of its widest row.
9
- *
10
- * Not the first row's length. Ragged input is real -- a hand-edited fasta, or
11
- * an aligner that stops a row at its last residue -- and taking row 0 makes
12
- * every column past it unreachable when row 0 is the short one. The viewer's
13
- * gap analysis already defines the column count this way, so anything else
14
- * disagrees with it.
8
+ * Column count of the alignment: the length of its widest row, since a
9
+ * hand-edited fasta or some aligners leave rows short. The viewer's gap
10
+ * analysis counts columns the same way.
15
11
  */
16
12
  getWidth(): number;
17
13
  getTree(): NodeWithIds;
@@ -25,10 +21,5 @@ export default abstract class BaseMSA {
25
21
  get alignmentNames(): string[];
26
22
  get seqConsensus(): string | undefined;
27
23
  get secondaryStructureConsensus(): string | undefined;
28
- get tracks(): {
29
- id: string;
30
- name: string;
31
- data?: string;
32
- customColorScheme?: Record<string, string>;
33
- }[];
24
+ get tracks(): MSATrack[];
34
25
  }
@@ -1,13 +1,9 @@
1
1
  export default class BaseMSA {
2
2
  width;
3
3
  /**
4
- * Column count of the alignment: the length of its widest row.
5
- *
6
- * Not the first row's length. Ragged input is real -- a hand-edited fasta, or
7
- * an aligner that stops a row at its last residue -- and taking row 0 makes
8
- * every column past it unreachable when row 0 is the short one. The viewer's
9
- * gap analysis already defines the column count this way, so anything else
10
- * disagrees with it.
4
+ * Column count of the alignment: the length of its widest row, since a
5
+ * hand-edited fasta or some aligners leave rows short. The viewer's gap
6
+ * analysis counts columns the same way.
11
7
  */
12
8
  getWidth() {
13
9
  this.width ??= this.getNames().reduce((max, name) => Math.max(max, this.getRow(name).length), 0);
@@ -1 +1 @@
1
- {"version":3,"file":"BaseMSA.js","sourceRoot":"","sources":["../../src/msa/BaseMSA.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,OAAO;IAK3B,KAAK,CAAS;IAEtB;;;;;;;;OAQG;IACH,QAAQ;QACN,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EACtD,CAAC,CACF,CAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,OAAO;QACL,OAAO;YACL,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,IAAI;gBACR,QAAQ,EAAE,EAAE;gBACZ,IAAI;aACL,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAED,UAAU,CACR,KAAa;QAEb,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,aAAa;QACX,OAAO,EAAE,CAAA;IACX,CAAC;IAED,SAAS;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,YAAY;QACd,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,2BAA2B;QAC7B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,MAAM;QAMR,OAAO,EAAE,CAAA;IACX,CAAC;CACF"}
1
+ {"version":3,"file":"BaseMSA.js","sourceRoot":"","sources":["../../src/msa/BaseMSA.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,OAAO;IAK3B,KAAK,CAAS;IAEtB;;;;OAIG;IACH,QAAQ;QACN,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EACtD,CAAC,CACF,CAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,OAAO;QACL,OAAO;YACL,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,IAAI;gBACR,QAAQ,EAAE,EAAE;gBACZ,IAAI;aACL,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAED,UAAU,CACR,KAAa;QAEb,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,aAAa;QACX,OAAO,EAAE,CAAA;IACX,CAAC;IAED,SAAS;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,YAAY;QACd,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,2BAA2B;QAC7B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,EAAE,CAAA;IACX,CAAC;CACF"}
@@ -8,8 +8,8 @@ export default class FastaMSA extends BaseMSA {
8
8
  constructor(text) {
9
9
  super();
10
10
  const records = splitFastaRecords(text);
11
- const seqdata = {};
12
- const colonNormalized = {};
11
+ const seqdata = Object.create(null);
12
+ const colonNormalized = Object.create(null);
13
13
  for (const { id, seq } of records) {
14
14
  seqdata[id] = seq;
15
15
  if (id.includes(':')) {
@@ -1 +1 @@
1
- {"version":3,"file":"FastaMSA.js","sourceRoot":"","sources":["../../src/msa/FastaMSA.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IACnC,GAAG,CAGV;IAED,yEAAyE;IACzE,0EAA0E;IAClE,YAAY,CAAU;IAE9B,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,OAAO,GAA2B,EAAE,CAAA;QAC1C,MAAM,eAAe,GAA2B,EAAE,CAAA;QAElD,KAAK,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;YACjB,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;YAC/C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA;IACzC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtD,EAAE,CACH,CAAA;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"FastaMSA.js","sourceRoot":"","sources":["../../src/msa/FastaMSA.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IACnC,GAAG,CAGV;IAED,yEAAyE;IACzE,0EAA0E;IAClE,YAAY,CAAU;IAE9B,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,OAAO,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3D,MAAM,eAAe,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAEnE,KAAK,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;YACjB,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;YAC/C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA;IACzC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtD,EAAE,CACH,CAAA;IACH,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import BaseMSA from './BaseMSA.ts';
2
- import type { NodeWithIds } from '../types.ts';
2
+ import type { MSATrack, NodeWithIds } from '../types.ts';
3
3
  import type { StockholmData } from './stockholmParser.ts';
4
4
  export default class StockholmMSA extends BaseMSA {
5
5
  private data;
@@ -32,11 +32,11 @@ export default class StockholmMSA extends BaseMSA {
32
32
  getTree(): NodeWithIds;
33
33
  get seqConsensus(): string | undefined;
34
34
  get secondaryStructureConsensus(): string | undefined;
35
- get tracks(): {
36
- id: string;
37
- name: string;
38
- data?: string;
39
- customColorScheme?: Record<string, string>;
40
- }[];
35
+ /**
36
+ * One text track per `#=GC` line, and one per `#=GR` line that stays hidden
37
+ * until asked for: a Pfam seed carries a few per-row active-site lines, but
38
+ * an Rfam family carries a structure line for every row with a PDB entry.
39
+ */
40
+ get tracks(): MSATrack[];
41
41
  }
42
42
  export { sniff as stockholmSniff } from './stockholmParser.ts';
@@ -46,7 +46,7 @@ export default class StockholmMSA extends BaseMSA {
46
46
  return this.MSA.seqname;
47
47
  }
48
48
  getStructures() {
49
- const pdbRegex = /PDB; +(\S+) +(\S); ([0-9]+)-([0-9]+)/;
49
+ const pdbRegex = /PDB; +(\S+) +([^;\s]+); *(-?[0-9]+)-(-?[0-9]+)/;
50
50
  const drEntries = this.MSA.gs.DR ?? {};
51
51
  const result = {};
52
52
  for (const [id, drList] of Object.entries(drEntries)) {
@@ -75,35 +75,58 @@ export default class StockholmMSA extends BaseMSA {
75
75
  get secondaryStructureConsensus() {
76
76
  return this.MSA.gc.SS_cons;
77
77
  }
78
+ /**
79
+ * One text track per `#=GC` line, and one per `#=GR` line that stays hidden
80
+ * until asked for: a Pfam seed carries a few per-row active-site lines, but
81
+ * an Rfam family carries a structure line for every row with a PDB entry.
82
+ */
78
83
  get tracks() {
84
+ const { seq_cons, SS_cons, ...otherGc } = this.MSA.gc;
79
85
  return [
80
86
  {
81
87
  id: 'seqConsensus',
82
88
  name: 'Sequence consensus',
83
- data: this.seqConsensus,
89
+ data: seq_cons,
84
90
  customColorScheme: {},
85
91
  },
86
92
  {
87
93
  id: 'secondaryStruct',
88
94
  name: 'Secondary-structure',
89
- data: this.secondaryStructureConsensus,
90
- // WUSS notation pairs base-paired columns as open/close brackets of
91
- // several nesting types (<>, (), [], {}); color all opens one way and
92
- // closes the other so every helix (e.g. the tRNA acceptor stem, which
93
- // is written with parens) is highlighted, not just the <> arms.
94
- customColorScheme: {
95
- '<': 'lightblue',
96
- '(': 'lightblue',
97
- '[': 'lightblue',
98
- '{': 'lightblue',
99
- '>': 'pink',
100
- ')': 'pink',
101
- ']': 'pink',
102
- '}': 'pink',
103
- },
95
+ data: SS_cons,
96
+ customColorScheme: wussColors,
104
97
  },
98
+ ...Object.entries(otherGc).map(([tag, data]) => ({
99
+ id: `gc-${tag}`,
100
+ name: tag,
101
+ data,
102
+ customColorScheme: structureColors(tag),
103
+ })),
104
+ ...Object.entries(this.MSA.gr).flatMap(([tag, byRow]) => Object.entries(byRow).map(([row, data]) => ({
105
+ id: `gr-${row}-${tag}`,
106
+ name: `${row} ${tag}`,
107
+ data,
108
+ customColorScheme: structureColors(tag),
109
+ defaultOff: true,
110
+ }))),
105
111
  ];
106
112
  }
107
113
  }
114
+ // WUSS writes base-paired columns as open/close brackets of several nesting
115
+ // types (<>, (), [], {}); coloring every open one way and every close the other
116
+ // highlights each helix, including the tRNA acceptor stem written with parens
117
+ const wussColors = {
118
+ '<': 'lightblue',
119
+ '(': 'lightblue',
120
+ '[': 'lightblue',
121
+ '{': 'lightblue',
122
+ '>': 'pink',
123
+ ')': 'pink',
124
+ ']': 'pink',
125
+ '}': 'pink',
126
+ };
127
+ // `SS`, and Rfam's per-structure `2GIS_A_SS`
128
+ function structureColors(tag) {
129
+ return tag === 'SS' || tag.endsWith('_SS') ? wussColors : {};
130
+ }
108
131
  export { sniff as stockholmSniff } from './stockholmParser.js';
109
132
  //# sourceMappingURL=StockholmMSA.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StockholmMSA.js","sourceRoot":"","sources":["../../src/msa/StockholmMSA.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StockholmMSA.js","sourceRoot":"","sources":["../../src/msa/StockholmMSA.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,15 @@ export interface FastaRecord {
2
2
  id: string;
3
3
  seq: string;
4
4
  }
5
+ export declare function fastaSniff(text: string): boolean;
5
6
  /**
6
7
  * Split FASTA-style text (shared by the FASTA and A3M parsers) into records.
7
- * The id is the defline up to the first space. A repeated id keeps the first
8
- * record: ids index the row data, so emitting the id twice would render a
9
- * phantom duplicate row showing the last record's residues.
8
+ *
9
+ * A record starts at a `>` that begins a line, so a `>` inside a defline
10
+ * (`x->y`, HGVS `c.1799T>A`) stays part of it, and anything before the first
11
+ * record (ColabFold's `#8\t1` header) is skipped. The id is the defline up to
12
+ * the first whitespace, tab included. A repeated id keeps the first record: ids
13
+ * index the row data, so emitting the id twice would render a phantom duplicate
14
+ * row showing the last record's residues.
10
15
  */
11
16
  export declare function splitFastaRecords(text: string): FastaRecord[];