msa-parsers 6.5.0 → 7.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 (74) 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 +15 -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 +2 -7
  15. package/dist/msa/BaseMSA.js.map +1 -1
  16. package/dist/msa/FastaMSA.js +2 -2
  17. package/dist/msa/FastaMSA.js.map +1 -1
  18. package/dist/msa/StockholmMSA.d.ts +7 -7
  19. package/dist/msa/StockholmMSA.js +40 -17
  20. package/dist/msa/StockholmMSA.js.map +1 -1
  21. package/dist/msa/fastaRecords.d.ts +8 -3
  22. package/dist/msa/fastaRecords.js +28 -16
  23. package/dist/msa/fastaRecords.js.map +1 -1
  24. package/dist/msa/index.d.ts +1 -1
  25. package/dist/msa/index.js +8 -2
  26. package/dist/msa/index.js.map +1 -1
  27. package/dist/msa/stockholmParser.js +21 -9
  28. package/dist/msa/stockholmParser.js.map +1 -1
  29. package/dist/types.d.ts +17 -2
  30. package/package.json +4 -4
  31. package/src/gff/annotationsToGFF.ts +10 -4
  32. package/src/gff/gffToAnnotations.test.ts +21 -0
  33. package/src/gff/gffToAnnotations.ts +33 -21
  34. package/src/gff/interProToGFF.test.ts +43 -6
  35. package/src/gff/parseGFF.test.ts +23 -11
  36. package/src/gff/parseGFF.ts +39 -23
  37. package/src/interProScanToAnnotations.ts +24 -16
  38. package/src/msa/A3mMSA.ts +3 -3
  39. package/src/msa/BaseMSA.ts +2 -7
  40. package/src/msa/FastaMSA.ts +2 -2
  41. package/src/msa/StockholmMSA.ts +46 -24
  42. package/src/msa/fastaRecords.ts +30 -17
  43. package/src/msa/index.test.ts +93 -0
  44. package/src/msa/index.ts +11 -2
  45. package/src/msa/stockholmParser.test.ts +22 -0
  46. package/src/msa/stockholmParser.ts +20 -9
  47. package/src/types.ts +19 -5
  48. package/dist/gff/gffToAnnotations.test.d.ts +0 -1
  49. package/dist/gff/gffToAnnotations.test.js +0 -71
  50. package/dist/gff/gffToAnnotations.test.js.map +0 -1
  51. package/dist/gff/interProToGFF.test.d.ts +0 -1
  52. package/dist/gff/interProToGFF.test.js +0 -208
  53. package/dist/gff/interProToGFF.test.js.map +0 -1
  54. package/dist/gff/parseGFF.test.d.ts +0 -1
  55. package/dist/gff/parseGFF.test.js +0 -102
  56. package/dist/gff/parseGFF.test.js.map +0 -1
  57. package/dist/msa/A3mMSA.property.test.d.ts +0 -1
  58. package/dist/msa/A3mMSA.property.test.js +0 -112
  59. package/dist/msa/A3mMSA.property.test.js.map +0 -1
  60. package/dist/msa/A3mMSA.test.d.ts +0 -1
  61. package/dist/msa/A3mMSA.test.js +0 -337
  62. package/dist/msa/A3mMSA.test.js.map +0 -1
  63. package/dist/msa/impgIntegration.test.d.ts +0 -1
  64. package/dist/msa/impgIntegration.test.js +0 -49
  65. package/dist/msa/impgIntegration.test.js.map +0 -1
  66. package/dist/msa/index.test.d.ts +0 -1
  67. package/dist/msa/index.test.js +0 -229
  68. package/dist/msa/index.test.js.map +0 -1
  69. package/dist/msa/stockholmParser.test.d.ts +0 -1
  70. package/dist/msa/stockholmParser.test.js +0 -122
  71. package/dist/msa/stockholmParser.test.js.map +0 -1
  72. package/dist/util.test.d.ts +0 -1
  73. package/dist/util.test.js +0 -40
  74. 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. Pass a
34
+ format as the third argument to settle it yourself -- FASTA and A3M share a
35
+ leading `>`, so auto-detection between them is a heuristic:
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 that list is what the viewer draws.
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,10 @@ 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
+ // InterProScan describes the sequence it scanned before listing the matches
26
+ // against it. Those lines span the whole row and carry no signature, so they
27
+ // would draw a full-width block labelled by an md5.
28
+ const WHOLE_SEQUENCE_TYPES = new Set(['polypeptide', 'nucleic_acid']);
25
29
  /**
26
30
  * Convert GFF records to annotations, one per record, in file order.
27
31
  *
@@ -30,18 +34,25 @@ function geneStrand({ type, strand }) {
30
34
  * name, with domain positions 1-based.
31
35
  */
32
36
  export function gffToAnnotations(gffRecords) {
33
- return gffRecords.map(record => {
37
+ return gffRecords
38
+ .filter(record => !WHOLE_SEQUENCE_TYPES.has(record.type))
39
+ .map(record => {
34
40
  const accession = record.Name ||
35
41
  record.ID ||
36
42
  `${record.source}_${record.start}_${record.end}`;
37
- const name = record.signature_desc || record.Name || accession;
43
+ const name = record.signature_desc ||
44
+ record.Name ||
45
+ accession;
38
46
  return {
39
47
  id: record.seq_id,
40
48
  accession,
41
49
  name,
42
- description: record.Ontology_term ||
43
- record.description ||
50
+ // not Ontology_term: a GO id list is what the domain is annotated
51
+ // with, not what it is, and reading it first labelled every
52
+ // InterProScan domain "GO:0003677 GO:0006281"
53
+ description: record.description ||
44
54
  record.Note ||
55
+ record.signature_desc ||
45
56
  name,
46
57
  featureType: record.type,
47
58
  start: record.start,
@@ -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":"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,4EAA4E;AAC5E,6EAA6E;AAC7E,oDAAoD;AACpD,MAAM,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,CAAA;AAErE;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAuB;IACtD,OAAO,UAAU;SACd,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SACxD,GAAG,CAAC,MAAM,CAAC,EAAE;QACZ,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;YAChC,MAAM,CAAC,IAAe;YACvB,SAAS,CAAA;QACX,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,MAAM;YACjB,SAAS;YACT,IAAI;YACJ,kEAAkE;YAClE,4DAA4D;YAC5D,8CAA8C;YAC9C,WAAW,EACR,MAAM,CAAC,WAAsB;gBAC7B,MAAM,CAAC,IAAe;gBACtB,MAAM,CAAC,cAAyB;gBACjC,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;AACN,CAAC"}
@@ -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":"AAEA,8EAA8E;AAC9E,kEAAkE;AAClE,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CACvB,IAAI;SACD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACzB,MAAM,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACnD,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACnD,wEAAwE;QACxE,qEAAqE;QACrE,kBAAkB;QAClB,OAAO;YACL,GAAG;YACH,GAAG;gBACD,CAAC,CAAC,GAAG;qBACA,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAC9B,IAAI,CAAC,GAAG,CAAC;gBACd,CAAC,CAAC,SAAS;SACd,CAAA;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;QACtE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAErB,yEAAyE;QACzE,oDAAoD;QACpD,OAAO;YACL,GAAG,eAAe,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,MAAM,IAAI,EAAE;YACpB,MAAM,EAAE,MAAM,IAAI,EAAE;YACpB,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACzB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACzB,MAAM,EAAE,MAAM,IAAI,GAAG;YACrB,KAAK,EAAE,KAAK,IAAI,GAAG;SACpB,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
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,4 +1,4 @@
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;
@@ -25,10 +25,5 @@ export default abstract class BaseMSA {
25
25
  get alignmentNames(): string[];
26
26
  get seqConsensus(): string | undefined;
27
27
  get secondaryStructureConsensus(): string | undefined;
28
- get tracks(): {
29
- id: string;
30
- name: string;
31
- data?: string;
32
- customColorScheme?: Record<string, string>;
33
- }[];
28
+ get tracks(): MSATrack[];
34
29
  }
@@ -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;;;;;;;;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;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[];
@@ -1,29 +1,41 @@
1
+ // a `>` record, optionally after `#` header lines such as ColabFold's `#8\t1`
2
+ export function fastaSniff(text) {
3
+ return /^(#.*\n)*>/.test(text);
4
+ }
1
5
  /**
2
6
  * Split FASTA-style text (shared by the FASTA and A3M parsers) into records.
3
- * The id is the defline up to the first space. A repeated id keeps the first
4
- * record: ids index the row data, so emitting the id twice would render a
5
- * phantom duplicate row showing the last record's residues.
7
+ *
8
+ * A record starts at a `>` that begins a line, so a `>` inside a defline
9
+ * (`x->y`, HGVS `c.1799T>A`) stays part of it, and anything before the first
10
+ * record (ColabFold's `#8\t1` header) is skipped. The id is the defline up to
11
+ * the first whitespace, tab included. A repeated id keeps the first record: ids
12
+ * index the row data, so emitting the id twice would render a phantom duplicate
13
+ * row showing the last record's residues.
6
14
  */
7
15
  export function splitFastaRecords(text) {
8
16
  const records = [];
9
17
  const seen = new Set();
10
- for (const entry of text.split('>')) {
11
- if (!/\S/.test(entry)) {
12
- continue;
18
+ let current;
19
+ const flush = () => {
20
+ if (current && !seen.has(current.id)) {
21
+ seen.add(current.id);
22
+ records.push({
23
+ id: current.id,
24
+ seq: current.lines.join('').replaceAll(/\s/g, ''),
25
+ });
13
26
  }
14
- const newlineIdx = entry.indexOf('\n');
15
- if (newlineIdx === -1) {
16
- continue;
27
+ };
28
+ for (const line of text.split('\n')) {
29
+ if (line.startsWith('>')) {
30
+ flush();
31
+ const id = /^>(\S*)/.exec(line)[1];
32
+ current = id ? { id, lines: [] } : undefined;
17
33
  }
18
- const defLine = entry.slice(0, newlineIdx).replace(/\r$/, '');
19
- const spaceIdx = defLine.indexOf(' ');
20
- const id = spaceIdx === -1 ? defLine : defLine.slice(0, spaceIdx);
21
- if (!id || seen.has(id)) {
22
- continue;
34
+ else {
35
+ current?.lines.push(line);
23
36
  }
24
- seen.add(id);
25
- records.push({ id, seq: entry.slice(newlineIdx + 1).replaceAll(/\s/g, '') });
26
37
  }
38
+ flush();
27
39
  return records;
28
40
  }
29
41
  //# sourceMappingURL=fastaRecords.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastaRecords.js","sourceRoot":"","sources":["../../src/msa/fastaRecords.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAkB,EAAE,CAAA;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAE9B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,SAAQ;QACV,CAAC;QACD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,SAAQ;QACV,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;QACjE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACZ,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;IAC9E,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}
1
+ {"version":3,"file":"fastaRecords.js","sourceRoot":"","sources":["../../src/msa/fastaRecords.ts"],"names":[],"mappings":"AAKA,8EAA8E;AAC9E,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,OAAO,GAAkB,EAAE,CAAA;IACjC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,IAAI,OAAoD,CAAA;IAExD,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;YACpB,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC;aAClD,CAAC,CAAA;QACJ,CAAC;IACH,CAAC,CAAA;IAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,KAAK,EAAE,CAAA;YACP,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAE,CAAC,CAAC,CAAE,CAAA;YACpC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAC9C,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAA;IAEP,OAAO,OAAO,CAAA;AAChB,CAAC"}
@@ -7,7 +7,7 @@ export { parseEmfTree } from 'emf-js';
7
7
  export { default as parseNewick } from './parseNewick.ts';
8
8
  export type MSAParserType = StockholmMSA | A3mMSA | FastaMSA | EmfMSA | ClustalMSA;
9
9
  export type MSAFormat = 'stockholm' | 'a3m' | 'fasta' | 'emf' | 'clustal';
10
- export declare function parseMSA(text: string, currentAlignment?: number, format?: MSAFormat): MSAParserType;
10
+ export declare function parseMSA(input: string, currentAlignment?: number, format?: MSAFormat): MSAParserType;
11
11
  /**
12
12
  * Get ungapped sequence from an aligned row
13
13
  */