p2s_mapper 2.0.0 → 2.1.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 (87) hide show
  1. package/README.md +37 -38
  2. package/dist/alignmentQuality.d.ts +5 -5
  3. package/dist/alphaFoldModels.d.ts +4 -4
  4. package/dist/alphaFoldModels.js +4 -4
  5. package/dist/chooseMappedEntity.d.ts +11 -13
  6. package/dist/chooseMappedEntity.js +9 -12
  7. package/dist/chooseMappedEntity.js.map +1 -1
  8. package/dist/coordinates.d.ts +11 -13
  9. package/dist/coordinates.js.map +1 -1
  10. package/dist/extractStructureSequences.d.ts +21 -28
  11. package/dist/extractStructureSequences.js +2 -2
  12. package/dist/extractStructureSequences.js.map +1 -1
  13. package/dist/fetchUtils.d.ts +7 -7
  14. package/dist/fetchUtils.js +7 -7
  15. package/dist/isoformRanking.d.ts +1 -1
  16. package/dist/mappings.d.ts +9 -12
  17. package/dist/mappings.js +4 -5
  18. package/dist/mappings.js.map +1 -1
  19. package/dist/pairwiseAlignment.d.ts +4 -2
  20. package/dist/pairwiseAlignment.js +9 -7
  21. package/dist/pairwiseAlignment.js.map +1 -1
  22. package/dist/pdbUniProtMapping.d.ts +5 -6
  23. package/dist/pdbUniProtMapping.js +5 -6
  24. package/dist/pdbUniProtMapping.js.map +1 -1
  25. package/dist/structureFormat.d.ts +11 -18
  26. package/dist/structureFormat.js +4 -6
  27. package/dist/structureFormat.js.map +1 -1
  28. package/dist/structureSources.d.ts +1 -1
  29. package/dist/structureUrls.d.ts +11 -16
  30. package/dist/structureUrls.js +14 -23
  31. package/dist/structureUrls.js.map +1 -1
  32. package/dist/types.d.ts +2 -5
  33. package/dist/types.js +2 -5
  34. package/dist/types.js.map +1 -1
  35. package/dist/uniProtSearch.js +3 -8
  36. package/dist/uniProtSearch.js.map +1 -1
  37. package/esm/alignmentQuality.d.ts +5 -5
  38. package/esm/alphaFoldModels.d.ts +4 -4
  39. package/esm/alphaFoldModels.js +4 -4
  40. package/esm/chooseMappedEntity.d.ts +11 -13
  41. package/esm/chooseMappedEntity.js +9 -12
  42. package/esm/chooseMappedEntity.js.map +1 -1
  43. package/esm/coordinates.d.ts +11 -13
  44. package/esm/coordinates.js.map +1 -1
  45. package/esm/extractStructureSequences.d.ts +21 -28
  46. package/esm/extractStructureSequences.js +2 -2
  47. package/esm/extractStructureSequences.js.map +1 -1
  48. package/esm/fetchUtils.d.ts +7 -7
  49. package/esm/fetchUtils.js +7 -7
  50. package/esm/isoformRanking.d.ts +1 -1
  51. package/esm/mappings.d.ts +9 -12
  52. package/esm/mappings.js +4 -5
  53. package/esm/mappings.js.map +1 -1
  54. package/esm/pairwiseAlignment.d.ts +4 -2
  55. package/esm/pairwiseAlignment.js +7 -5
  56. package/esm/pairwiseAlignment.js.map +1 -1
  57. package/esm/pdbUniProtMapping.d.ts +5 -6
  58. package/esm/pdbUniProtMapping.js +5 -6
  59. package/esm/pdbUniProtMapping.js.map +1 -1
  60. package/esm/structureFormat.d.ts +11 -18
  61. package/esm/structureFormat.js +4 -6
  62. package/esm/structureFormat.js.map +1 -1
  63. package/esm/structureSources.d.ts +1 -1
  64. package/esm/structureUrls.d.ts +11 -16
  65. package/esm/structureUrls.js +14 -23
  66. package/esm/structureUrls.js.map +1 -1
  67. package/esm/types.d.ts +2 -5
  68. package/esm/types.js +2 -5
  69. package/esm/types.js.map +1 -1
  70. package/esm/uniProtSearch.js +3 -8
  71. package/esm/uniProtSearch.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/alignmentQuality.ts +5 -5
  74. package/src/alphaFoldModels.ts +4 -4
  75. package/src/chooseMappedEntity.ts +12 -15
  76. package/src/coordinates.ts +11 -13
  77. package/src/extractStructureSequences.ts +21 -28
  78. package/src/fetchUtils.ts +7 -7
  79. package/src/isoformRanking.ts +1 -1
  80. package/src/mappings.ts +9 -12
  81. package/src/pairwiseAlignment.ts +11 -8
  82. package/src/pdbUniProtMapping.ts +5 -6
  83. package/src/structureFormat.ts +11 -18
  84. package/src/structureSources.ts +1 -1
  85. package/src/structureUrls.ts +14 -23
  86. package/src/types.ts +2 -5
  87. package/src/uniProtSearch.ts +3 -8
package/README.md CHANGED
@@ -1,19 +1,17 @@
1
1
  # p2s_mapper
2
2
 
3
- Find which residue of a 3D protein structure each amino acid of a transcript
4
- lands on, and back.
5
-
6
- Give it a transcript's translation and a structure, an AlphaFold model or a PDB
7
- entry. p2s_mapper picks the chain that is the gene's protein, aligns the two,
8
- and builds the lookups between transcript positions, structure positions and the
9
- residue ids a viewer such as Mol\* uses. It also finds structures for a gene,
10
- judges whether a match is real, and uses a PDB entry's UniProt alignment to
11
- place UniProt annotations and drop the residues of a fusion partner.
12
-
13
- Pair it with [g2p_mapper](https://github.com/GMOD/g2p_mapper), which maps genome
14
- positions to protein positions, to go from a genome coordinate to a residue in
15
- 3D. The package has no React, JBrowse or Mol\* dependency; it came out of
16
- [jbrowse-plugin-protein3d](https://github.com/GMOD/jbrowse-plugin-protein3d).
3
+ Lines up a protein sequence with its 3D structure, residue by residue.
4
+
5
+ - **In:** a protein sequence, and an AlphaFold or PDB structure
6
+ - **Out:** which 3D residue each amino acid is, and back
7
+ - Picks the right chain and flags a poor match
8
+ - Finds structures for a gene
9
+ - Places UniProt annotations on a PDB entry
10
+ - With [g2p_mapper](https://github.com/GMOD/g2p_mapper): genome position ↔ 3D
11
+ residue
12
+ - No React, JBrowse or Mol\* dependency
13
+ - Used by
14
+ [jbrowse-plugin-protein3d](https://github.com/GMOD/jbrowse-plugin-protein3d)
17
15
 
18
16
  ## Install
19
17
 
@@ -63,14 +61,14 @@ if (picked) {
63
61
  }
64
62
  ```
65
63
 
66
- Every position is 0-based. The two kinds are separate branded types, so passing
67
- a structure position where a transcript position belongs is a compile error.
64
+ Every position is 0-based. Structure and transcript positions are separate
65
+ types, so passing one where the other belongs is a compile error.
68
66
 
69
67
  ### From a genome position to a residue, and back
70
68
 
71
- g2p_mapper turns the transcript's CDS into genome ↔ protein tables; p2s_mapper
72
- carries a protein position on to the structure and to the `label_seq_id` Mol\*
73
- addresses residues by.
69
+ g2p_mapper maps genome positions to protein positions. p2s_mapper maps a protein
70
+ position to a structure position, and that to the `label_seq_id` Mol\* uses to
71
+ select a residue.
74
72
 
75
73
  ```ts
76
74
  import { genomeToTranscriptSeqMapping } from 'g2p_mapper'
@@ -131,8 +129,9 @@ if (hovered !== undefined) {
131
129
 
132
130
  ### With a structure loaded in Mol\*
133
131
 
134
- `extractEntities` reads each chain's sequence, ids and numbering from a loaded
135
- Mol\* model, through a narrow structural type rather than a Mol\* import.
132
+ `extractEntities` reads each chain's sequence, residue ids and numbering from a
133
+ loaded Mol\* model. `StructureModel` lists the fields it reads, so the package
134
+ needs no Mol\* import.
136
135
 
137
136
  ```ts
138
137
  import {
@@ -186,12 +185,13 @@ if (accession) {
186
185
  ```
187
186
 
188
187
  Every network function takes `{ fetch?, signal? }` last, defaulting to
189
- `globalThis.fetch`, so a host can pass its own fetch and abort a stale request.
188
+ `globalThis.fetch`, so the caller can pass a custom fetch and an `AbortSignal`.
190
189
 
191
190
  ### Place UniProt annotations on a PDB entry
192
191
 
193
- A PDB construct is usually a fragment, numbered differently from UniProt. The
194
- entry's UniProt alignment, read from RCSB, says how the two line up.
192
+ A PDB construct is usually a fragment, numbered differently from UniProt.
193
+ `fetchUniProtStructureMappings` reads the entry's alignment to UniProt from
194
+ RCSB.
195
195
 
196
196
  ```ts
197
197
  import {
@@ -209,7 +209,7 @@ const toStructure = makeUniProtPositionMap(mapping?.segments ?? [])
209
209
  toStructure(248) // 154: UniProt residue 248 is structure position 154
210
210
  ```
211
211
 
212
- ## How it fits together
212
+ ## Pipeline
213
213
 
214
214
  ![From a gene on the genome to a residue in 3D, and back](docs/img/pipeline.svg)
215
215
 
@@ -218,22 +218,21 @@ toStructure(248) // 154: UniProt residue 248 is structure position 154
218
218
  - [api.md](docs/api.md): every export, with its signature, types and an example
219
219
  - [pipeline.md](docs/pipeline.md): the flow above, step by step, and why chain
220
220
  choice divides by the shorter sequence
221
- - [coordinates.md](docs/coordinates.md): the four numberings of a residue and
222
- the one route between each
221
+ - [coordinates.md](docs/coordinates.md): the four ways a residue is numbered,
222
+ and which function converts between them
223
223
  - [faq.md](docs/faq.md): can I trust the mapping? What the package checks, and
224
224
  what it leaves to you
225
225
 
226
- ## Things to know first
227
-
228
- - Every coordinate is **0-based** and branded by space, so the compiler rejects
229
- mixing them. UniProt positions and author residue numbers are 1-based. See
230
- [coordinates.md](docs/coordinates.md).
231
- - A `PairwiseAlignment` has **row 0 = transcript, row 1 = structure**. Use the
232
- accessors, not indexes.
233
- - The best-matching chain always wins, even a poor match. Check it with
234
- `isLowSimilarity` before trusting the mapping.
235
- - Cross into Mol\* only through `Entity.seqIds`: `label_seq_id` is not always
236
- position + 1.
226
+ ## Pitfalls
227
+
228
+ - Positions are **0-based**, except UniProt positions and author residue
229
+ numbers, which are 1-based. See [coordinates.md](docs/coordinates.md).
230
+ - A `PairwiseAlignment` has **row 0 = transcript, row 1 = structure**. Read the
231
+ rows with `transcriptAlignedSeq` and `structureAlignedSeq`.
232
+ - `chooseMappedEntity` returns the best-matching chain even when the match is
233
+ poor. Check it with `isLowSimilarity` before trusting the mapping.
234
+ - Get Mol\*'s `label_seq_id` from `toLabelSeqIds`, which reads `Entity.seqIds`.
235
+ Adding 1 to the position gives the wrong residue in a PDB file without SEQRES.
237
236
 
238
237
  ## License
239
238
 
@@ -1,20 +1,20 @@
1
1
  import type { PairwiseAlignment } from './mappings.ts';
2
2
  export interface AlignmentQuality {
3
- /** columns carrying a residue on both rows, i.e. mapped positions */
3
+ /** columns with a residue in both rows, i.e. mapped positions */
4
4
  aligned: number;
5
5
  identical: number;
6
6
  transcriptLength: number;
7
7
  structureLength: number;
8
8
  /** identical over aligned; 0 when nothing aligned */
9
9
  identity: number;
10
- /** identical over the shorter of the two sequences: the statistic that
11
- * separates a real match from a chance local alignment, see below */
10
+ /** identical over the shorter of the two sequences, which separates a
11
+ * real match from a chance local alignment (see LOW_IDENTITY_OVER_SHORTER) */
12
12
  identityOverShorter: number;
13
13
  /** aligned over the structure's length */
14
14
  structureCoverage: number;
15
15
  /** first and last transcript residue the alignment covers, 1-based
16
- * inclusive; 0 when nothing aligned. A structure is usually a fragment, and
17
- * which part of the protein it holds is the reader's first question. */
16
+ * inclusive; 0 when nothing aligned. A structure is usually a fragment, so
17
+ * these show which part of the protein it contains. */
18
18
  transcriptStart: number;
19
19
  transcriptEnd: number;
20
20
  }
@@ -22,11 +22,11 @@ export declare function parseAlphaFoldModels(json: unknown): AlphaFoldModel[];
22
22
  export declare function fetchAlphaFoldModels(uniprotId: string, opts?: FetchOptions): Promise<AlphaFoldModel[]>;
23
23
  /**
24
24
  * The model to open for a gene's transcripts: one folded from exactly a
25
- * transcript's translation, canonical first, so the view maps it as an
26
- * identity; else the canonical model; else the longest isoform model.
25
+ * transcript's translation, canonical first, so every residue maps to itself;
26
+ * else the canonical model; else the longest isoform model.
27
27
  *
28
- * Takes any record of sequences, since the structure loader knows one
29
- * translation rather than a gene's isoforms.
28
+ * Takes any record of sequences, since a caller may know one translation rather
29
+ * than a gene's isoforms.
30
30
  */
31
31
  export declare function pickAlphaFoldModel(models: AlphaFoldModel[], isoformSequences: Record<string, {
32
32
  seq: string;
@@ -48,11 +48,11 @@ async function fetchAlphaFoldModels(uniprotId, opts) {
48
48
  }
49
49
  /**
50
50
  * The model to open for a gene's transcripts: one folded from exactly a
51
- * transcript's translation, canonical first, so the view maps it as an
52
- * identity; else the canonical model; else the longest isoform model.
51
+ * transcript's translation, canonical first, so every residue maps to itself;
52
+ * else the canonical model; else the longest isoform model.
53
53
  *
54
- * Takes any record of sequences, since the structure loader knows one
55
- * translation rather than a gene's isoforms.
54
+ * Takes any record of sequences, since a caller may know one translation rather
55
+ * than a gene's isoforms.
56
56
  */
57
57
  function pickAlphaFoldModel(models, isoformSequences) {
58
58
  const translations = new Set(Object.values(isoformSequences ?? {}).map(v => (0, stripStopCodon_ts_1.stripStopCodon)(v.seq)));
@@ -9,12 +9,12 @@ import type { AlignmentAlgorithm } from './types.ts';
9
9
  */
10
10
  export declare function interactionMatchesMappedEntity(entityId: string, mappedEntityId: string | undefined): boolean;
11
11
  export interface EntitySelection extends ScoredAlignment {
12
- /** index into the candidate array of the entity that is the transcript's */
12
+ /** index of the chosen entity in the candidate array */
13
13
  index: number;
14
14
  }
15
15
  export interface ScoredAlignment {
16
- /** alignment of the transcript against the entity (stop codons stripped on
17
- * both sides, matching the rest of the mapping pipeline) */
16
+ /** alignment of the transcript against the entity, with stop codons
17
+ * stripped from both */
18
18
  alignment: PairwiseAlignment;
19
19
  /** identical aligned residues */
20
20
  matches: number;
@@ -39,17 +39,15 @@ export declare function explainedFraction(matches: number, transcriptLength: num
39
39
  */
40
40
  export declare function alignTranscriptToEntity(transcript: string, entitySeq: string, algorithm: AlignmentAlgorithm): ScoredAlignment | undefined;
41
41
  /**
42
- * Pick which polymer entity of a structure corresponds to the transcript.
42
+ * Pick the polymer entity of a structure that is the transcript's protein.
43
43
  *
44
- * The plugin historically hardcoded entity `[0]`, which silently mis-maps every
45
- * heteromeric / protein-DNA / processed-peptide structure where the protein of
46
- * interest is some other chain. Selecting by alignment makes the structure self-
47
- * describe which entity is the gene's protein: an exact sequence match wins
48
- * outright, otherwise the entity with the highest identity over the shorter
49
- * sequence (see `explainedFraction`). Nucleic-acid entities are never
50
- * candidates.
44
+ * Taking entity `[0]` mis-maps every heteromeric, protein-DNA or
45
+ * processed-peptide structure where the protein is another chain. An exact
46
+ * sequence match wins outright; otherwise the entity with the highest identity
47
+ * over the shorter sequence wins (see `explainedFraction`). Nucleic-acid
48
+ * entities are never candidates.
51
49
  *
52
- * Returns `undefined` only when there is nothing to map (no transcript or no
53
- * protein entities) — never a silent fallback to the wrong entity.
50
+ * Returns `undefined` only when there is nothing to map: no transcript, or no
51
+ * protein entity. It never falls back to another entity.
54
52
  */
55
53
  export declare function chooseMappedEntity(transcript: string, entities: readonly (string | EntityCandidate)[], algorithm: AlignmentAlgorithm): EntitySelection | undefined;
@@ -25,8 +25,7 @@ function interactionMatchesMappedEntity(entityId, mappedEntityId) {
25
25
  * usually is: on 1H26 the 11-residue p53 peptide matches 11 while CDK2 accrues
26
26
  * 58 scattered identities, and on 4ZZJ SIRT1 beats the 7-residue p53 peptide
27
27
  * 63 to 6. The Smith-Waterman score is no better there (56 vs 58). Dividing
28
- * by length asks the question the picker actually has, which chain *is* this
29
- * gene's product: the peptide scores 0.69 and 0.50, the partners 0.19 and
28
+ * by the shorter length identifies the chain that *is* this gene's product: the peptide scores 0.69 and 0.50, the partners 0.19 and
30
29
  * 0.17, and across a ribosome's 55 chains no decoy passes 0.29.
31
30
  *
32
31
  * Dividing by the *entity's* length alone penalised a fusion construct: a
@@ -91,18 +90,16 @@ function alignTranscriptToEntity(transcript, entitySeq, algorithm) {
91
90
  };
92
91
  }
93
92
  /**
94
- * Pick which polymer entity of a structure corresponds to the transcript.
93
+ * Pick the polymer entity of a structure that is the transcript's protein.
95
94
  *
96
- * The plugin historically hardcoded entity `[0]`, which silently mis-maps every
97
- * heteromeric / protein-DNA / processed-peptide structure where the protein of
98
- * interest is some other chain. Selecting by alignment makes the structure self-
99
- * describe which entity is the gene's protein: an exact sequence match wins
100
- * outright, otherwise the entity with the highest identity over the shorter
101
- * sequence (see `explainedFraction`). Nucleic-acid entities are never
102
- * candidates.
95
+ * Taking entity `[0]` mis-maps every heteromeric, protein-DNA or
96
+ * processed-peptide structure where the protein is another chain. An exact
97
+ * sequence match wins outright; otherwise the entity with the highest identity
98
+ * over the shorter sequence wins (see `explainedFraction`). Nucleic-acid
99
+ * entities are never candidates.
103
100
  *
104
- * Returns `undefined` only when there is nothing to map (no transcript or no
105
- * protein entities) — never a silent fallback to the wrong entity.
101
+ * Returns `undefined` only when there is nothing to map: no transcript, or no
102
+ * protein entity. It never falls back to another entity.
106
103
  */
107
104
  function chooseMappedEntity(transcript, entities, algorithm) {
108
105
  const t = (0, stripStopCodon_ts_1.stripStopCodon)(transcript);
@@ -1 +1 @@
1
- {"version":3,"file":"chooseMappedEntity.js","sourceRoot":"","sources":["../src/chooseMappedEntity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chooseMappedEntity.js","sourceRoot":"","sources":["../src/chooseMappedEntity.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,14 @@
1
1
  import type { PairwiseAlignment } from './mappings.ts';
2
2
  /**
3
- * Branded coordinate spaces. Every position in this plugin is a bare `number`,
4
- * but the *meaning* differs: a structure residue index is not interchangeable
5
- * with a transcript residue index or an alignment column, and mixing them is
6
- * the root cause of the off-by-one class of bugs. Branding makes the compiler
7
- * reject cross-space mixing; construct values with the helpers below at the
8
- * boundaries where raw numbers enter (molstar picks, hover events, features).
3
+ * Branded coordinate spaces. Every position is a plain `number` at runtime, but
4
+ * a structure residue index, a transcript residue index and an alignment column
5
+ * mean different things, and mixing them causes off-by-one bugs. The brands
6
+ * make the compiler reject mixing; wrap a raw number with the helpers below
7
+ * where it enters, such as a molstar pick, a hover event or a feature.
9
8
  *
10
- * Conventions: all are 0-based. StructurePos indexes the ungapped structure
11
- * sequence; TranscriptPos the ungapped transcript sequence; AlignmentCol a
12
- * column of the pairwise alignment (gaps included).
9
+ * All are 0-based. StructurePos indexes the ungapped structure sequence,
10
+ * TranscriptPos the ungapped transcript sequence, and AlignmentCol a column of
11
+ * the pairwise alignment, gaps included.
13
12
  */
14
13
  export type StructurePos = number & {
15
14
  readonly __brand: 'StructurePos';
@@ -39,10 +38,9 @@ export interface CoordinateMapper {
39
38
  transcriptToAlignment: (p: TranscriptPos) => AlignmentCol | undefined;
40
39
  alignmentToTranscript: (c: AlignmentCol) => TranscriptPos | undefined;
41
40
  /**
42
- * Raw lookup tables, for consumers that iterate the whole map rather than
43
- * convert a single position (e.g. per-residue track rendering, selection of
44
- * all aligned residues). Plain numbers — prefer the typed methods above for
45
- * point conversions.
41
+ * The lookup tables as plain numbers, for code that iterates a whole map,
42
+ * such as drawing a per-residue track or selecting every aligned residue.
43
+ * Use the typed methods above to convert one position.
46
44
  */
47
45
  readonly maps: CoordinateMaps;
48
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"coordinates.js","sourceRoot":"","sources":["../src/coordinates.ts"],"names":[],"mappings":";;;AA2DA,oDAiCC;AASD,0EAgBC;AArHD,+CAIsB;AACtB,iDAA0C;AAoBnC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAiB,CAAA;AAA/C,QAAA,YAAY,gBAAmC;AACrD,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAkB,CAAA;AAAjD,QAAA,aAAa,iBAAoC;AACvD,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAiB,CAAA;AAA/C,QAAA,YAAY,gBAAmC;AA2B5D;;;;GAIG;AACH,SAAgB,oBAAoB,CAClC,iBAAoC;IAEpC,MAAM,EACJ,mCAAmC,EACnC,mCAAmC,GACpC,GAAG,IAAA,4CAA8B,EAAC,iBAAiB,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,IAAA,6CAA+B,EAAC,iBAAiB,CAAC,CAAA;IAChE,MAAM,KAAK,GAAG,IAAA,8CAAgC,EAAC,iBAAiB,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,IAAA,wBAAS,EAAC,KAAK,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAA,wBAAS,EAAC,KAAK,CAAC,CAAA;IAE9B,uEAAuE;IACvE,6EAA6E;IAC7E,sEAAsE;IACtE,OAAO;QACL,qBAAqB,EAAE,CAAC,CAAC,EAAE,CACzB,mCAAmC,CAAC,CAAC,CAA8B;QACrE,qBAAqB,EAAE,CAAC,CAAC,EAAE,CACzB,mCAAmC,CAAC,CAAC,CAA6B;QACpE,oBAAoB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAA6B;QAC/D,oBAAoB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAA6B;QAC/D,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAA6B;QAChE,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAA8B;QACjE,IAAI,EAAE;YACJ,mCAAmC;YACnC,mCAAmC;YACnC,+BAA+B,EAAE,KAAK;YACtC,gCAAgC,EAAE,KAAK;YACvC,4BAA4B,EAAE,KAAK;YACnC,6BAA6B,EAAE,KAAK;SACrC;KACF,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,+BAA+B,CAC7C,MAAwB,EACxB,KAAqC;IAErC,IAAI,KAAyB,CAAA;IAC7B,IAAI,IAAwB,CAAA;IAC5B,KAAK,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,CAAC,IAAA,qBAAa,EAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;QACpE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACxD,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;QAC9C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,CAAA;AACrC,CAAC"}
1
+ {"version":3,"file":"coordinates.js","sourceRoot":"","sources":["../src/coordinates.ts"],"names":[],"mappings":";;;AAyDA,oDAiCC;AASD,0EAgBC;AAnHD,+CAIsB;AACtB,iDAA0C;AAmBnC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAiB,CAAA;AAA/C,QAAA,YAAY,gBAAmC;AACrD,MAAM,aAAa,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAkB,CAAA;AAAjD,QAAA,aAAa,iBAAoC;AACvD,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAiB,CAAA;AAA/C,QAAA,YAAY,gBAAmC;AA0B5D;;;;GAIG;AACH,SAAgB,oBAAoB,CAClC,iBAAoC;IAEpC,MAAM,EACJ,mCAAmC,EACnC,mCAAmC,GACpC,GAAG,IAAA,4CAA8B,EAAC,iBAAiB,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,IAAA,6CAA+B,EAAC,iBAAiB,CAAC,CAAA;IAChE,MAAM,KAAK,GAAG,IAAA,8CAAgC,EAAC,iBAAiB,CAAC,CAAA;IACjE,MAAM,KAAK,GAAG,IAAA,wBAAS,EAAC,KAAK,CAAC,CAAA;IAC9B,MAAM,KAAK,GAAG,IAAA,wBAAS,EAAC,KAAK,CAAC,CAAA;IAE9B,uEAAuE;IACvE,6EAA6E;IAC7E,sEAAsE;IACtE,OAAO;QACL,qBAAqB,EAAE,CAAC,CAAC,EAAE,CACzB,mCAAmC,CAAC,CAAC,CAA8B;QACrE,qBAAqB,EAAE,CAAC,CAAC,EAAE,CACzB,mCAAmC,CAAC,CAAC,CAA6B;QACpE,oBAAoB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAA6B;QAC/D,oBAAoB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAA6B;QAC/D,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAA6B;QAChE,qBAAqB,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAA8B;QACjE,IAAI,EAAE;YACJ,mCAAmC;YACnC,mCAAmC;YACnC,+BAA+B,EAAE,KAAK;YACtC,gCAAgC,EAAE,KAAK;YACvC,4BAA4B,EAAE,KAAK;YACnC,6BAA6B,EAAE,KAAK;SACrC;KACF,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,+BAA+B,CAC7C,MAAwB,EACxB,KAAqC;IAErC,IAAI,KAAyB,CAAA;IAC7B,IAAI,IAAwB,CAAA;IAC5B,KAAK,IAAI,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,CAAC,qBAAqB,CAAC,IAAA,qBAAa,EAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAA;QACpE,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;YACxD,IAAI,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS;QAC9C,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,CAAA;AACrC,CAAC"}
@@ -1,42 +1,35 @@
1
1
  /** A polymer entity of a loaded structure: its mmCIF entity id, its one-letter
2
- * sequence, and the molstar `label_seq_id` of each of those residues.
2
+ * sequence, and the molstar `label_seq_id` of each residue.
3
3
  *
4
- * The entity id is what lets every downstream step talk about "the gene's
5
- * protein" by identity instead of by the fragile entity-[0] position.
4
+ * Structure positions are 0-based indices into `seq`, and molstar selects
5
+ * residues by `label_seq_id`. The two differ by 1 only when the entity's
6
+ * sequence covers every residue from 1, which holds for any mmCIF with an
7
+ * `entity_poly_seq` category (all of RCSB and AlphaFold) and for a PDB file
8
+ * with SEQRES records, from which molstar builds that category.
6
9
  *
7
- * `seqIds` is what lets it talk about a *residue* by identity. Structure
8
- * positions in this plugin are 0-based indices into `seq`; molstar addresses
9
- * residues by `label_seq_id`. Those are related by `+1` only when the entity's
10
- * sequence covers every residue from 1 — true for any mmCIF with an
11
- * `entity_poly_seq` category (all of RCSB and AlphaFold) and for PDB files
12
- * carrying SEQRES records, because molstar synthesizes the category from them.
13
- *
14
- * A PDB-format file with no SEQRES has no such category, so molstar falls back
15
- * to `StructureSequence.fromHierarchy` and takes `label_seq_id` straight from
16
- * the observed residues' author numbering: a chain whose coordinates start at
17
- * residue 94 yields seqIds 94.., and an unobserved loop leaves a hole. Deriving
18
- * the id arithmetically there is off by the whole offset, in both directions —
19
- * every hover reads the wrong residue and every highlight paints the wrong one.
20
- * So carry the real ids and convert through them.
10
+ * For a PDB file without SEQRES, molstar falls back to
11
+ * `StructureSequence.fromHierarchy` and takes `label_seq_id` from the observed
12
+ * residues' author numbering: a chain whose coordinates start at residue 94 has
13
+ * seqIds 94.., and an unobserved loop leaves a gap. Adding 1 there is off by the
14
+ * whole offset, in both directions, so convert through `seqIds`.
21
15
  */
22
16
  export interface Entity {
23
- /** mmCIF entity id, molstar's own bookkeeping */
17
+ /** mmCIF entity id */
24
18
  entityId: string;
25
19
  /** one letter per residue, observed or not */
26
20
  seq: string;
27
21
  /** molstar `label_seq_id` per position of `seq` */
28
22
  seqIds: number[];
29
- /** author chain ids carrying this entity, e.g. ['A', 'B'] for a homodimer:
30
- * what a user recognises from the PDB entry page */
23
+ /** author chain ids of this entity, e.g. ['A', 'B'] for a homodimer, as
24
+ * the PDB entry page lists them */
31
25
  chains: string[];
32
- /** DNA, RNA or a hybrid, by molstar's entity subtype. Its letters spell
33
- * amino acids too (A, C, G, T, U), so it is kept out of the alignment
34
- * rather than left to score low. */
26
+ /** DNA, RNA or a hybrid, by molstar's entity subtype. A, C, G, T and U
27
+ * are amino-acid letters too, so chooseMappedEntity skips these. */
35
28
  nucleicAcid?: boolean;
36
29
  /** `auth_seq_id` per position: the depositors' numbering, which papers cite
37
- * (1TUP's position 154 is R248) and Mol*'s hover shows. Display only;
38
- * address Mol* through `seqIds`. Absent when the model has no atomic
39
- * hierarchy. See `residueNumber`. */
30
+ * (1TUP's position 154 is R248) and Mol*'s hover shows. For display only;
31
+ * use `seqIds` to select residues in Mol*. Absent when the model has no
32
+ * atomic hierarchy. See `residueNumber`. */
40
33
  authSeqIds?: number[];
41
34
  }
42
35
  export interface Column<T> {
@@ -123,8 +116,8 @@ export declare function oneLetterSequence(codes: ArrayLike<string>, canonical: s
123
116
  export declare function extractEntities(model: StructureModel): Entity[] | undefined;
124
117
  /** A user-facing name for an entity: its chains when known, else its id. */
125
118
  export declare function entityLabel(entity: Entity): string;
126
- /** The protein chains' sequences, for the launch dialog's isoform matching,
127
- * which has no use for a DNA strand that happens to align. */
119
+ /** The protein chains' sequences, for ranking isoforms against a structure.
120
+ * DNA chains are left out, because their letters align as amino acids. */
128
121
  export declare function extractStructureSequences(model: StructureModel): string[] | undefined;
129
122
  /**
130
123
  * The molstar `label_seq_id`s for a set of 0-based structure positions. Unknown
@@ -169,8 +169,8 @@ function entityLabel(entity) {
169
169
  : `Entity ${entity.entityId}`;
170
170
  return `${chains} (${entity.seq.length} ${entity.nucleicAcid ? 'nt' : 'aa'})`;
171
171
  }
172
- /** The protein chains' sequences, for the launch dialog's isoform matching,
173
- * which has no use for a DNA strand that happens to align. */
172
+ /** The protein chains' sequences, for ranking isoforms against a structure.
173
+ * DNA chains are left out, because their letters align as amino acids. */
174
174
  function extractStructureSequences(model) {
175
175
  return extractEntities(model)
176
176
  ?.filter(e => !e.nucleicAcid)
@@ -1 +1 @@
1
- {"version":3,"file":"extractStructureSequences.js","sourceRoot":"","sources":["../src/extractStructureSequences.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extractStructureSequences.js","sourceRoot":"","sources":["../src/extractStructureSequences.ts"],"names":[],"mappings":"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"}
@@ -12,9 +12,9 @@ export declare class HttpError extends Error {
12
12
  * not. */
13
13
  export declare function isDefinitiveFailure(e: unknown): boolean;
14
14
  /**
15
- * The error a failed response deserves: status and host, plus at most the first
16
- * line of the body. A whole body is an HTML error page or a megabyte of JSON,
17
- * and pasting it into the dialog buries the one line that says what went wrong.
15
+ * The error for a failed response: status and host, plus at most the first line
16
+ * of the body. A whole body is an HTML error page or a megabyte of JSON, which
17
+ * hides the line that says what went wrong.
18
18
  */
19
19
  export declare function httpError(response: Response, url: string): Promise<HttpError>;
20
20
  /**
@@ -38,10 +38,10 @@ export declare function rawfetch(url: string, args?: FetchOptions): Promise<Resp
38
38
  export declare function myfetch(url: string, args?: FetchOptions): Promise<Response>;
39
39
  export declare function jsonfetch<T = unknown>(url: string, args?: FetchOptions): Promise<T>;
40
40
  /**
41
- * An AbortSignal's reason as a real Error. `signal.reason` is `any` — usually a
42
- * DOMException, but a caller can abort with anything at all — and throwing a
43
- * non-Error loses the stack and breaks `instanceof Error` checks in the UI's
44
- * error rendering. Normalize at every throw site.
41
+ * An AbortSignal's reason as a real Error. `signal.reason` is `any`, usually a
42
+ * DOMException, but a caller can abort with any value, and throwing a non-Error
43
+ * loses the stack and breaks `instanceof Error` checks. Use it at every throw
44
+ * site.
45
45
  */
46
46
  export declare function abortError(signal: AbortSignal): Error;
47
47
  export declare function timeout(time: number, signal?: AbortSignal): Promise<void>;
@@ -43,9 +43,9 @@ function isDefinitiveFailure(e) {
43
43
  return e instanceof HttpError && e.status >= 400 && e.status < 500;
44
44
  }
45
45
  /**
46
- * The error a failed response deserves: status and host, plus at most the first
47
- * line of the body. A whole body is an HTML error page or a megabyte of JSON,
48
- * and pasting it into the dialog buries the one line that says what went wrong.
46
+ * The error for a failed response: status and host, plus at most the first line
47
+ * of the body. A whole body is an HTML error page or a megabyte of JSON, which
48
+ * hides the line that says what went wrong.
49
49
  */
50
50
  async function httpError(response, url) {
51
51
  const detail = firstLine(await response.text().catch(() => ''));
@@ -104,10 +104,10 @@ async function jsonfetch(url, args) {
104
104
  return response.json();
105
105
  }
106
106
  /**
107
- * An AbortSignal's reason as a real Error. `signal.reason` is `any` — usually a
108
- * DOMException, but a caller can abort with anything at all — and throwing a
109
- * non-Error loses the stack and breaks `instanceof Error` checks in the UI's
110
- * error rendering. Normalize at every throw site.
107
+ * An AbortSignal's reason as a real Error. `signal.reason` is `any`, usually a
108
+ * DOMException, but a caller can abort with any value, and throwing a non-Error
109
+ * loses the stack and breaks `instanceof Error` checks. Use it at every throw
110
+ * site.
111
111
  */
112
112
  function abortError(signal) {
113
113
  return signal.reason instanceof Error
@@ -10,7 +10,7 @@ export interface RankedIsoform {
10
10
  /** identical residues against the structure, for an isoform that does not
11
11
  * match it exactly; undefined with no structure to compare to */
12
12
  identical?: number;
13
- /** that alignment's score, which is what ranks non-matching isoforms */
13
+ /** that alignment's score, which ranks the non-matching isoforms */
14
14
  score?: number;
15
15
  }
16
16
  export interface ClassifiedIsoforms {
@@ -3,13 +3,11 @@ export interface AlignmentRow {
3
3
  seq: string;
4
4
  }
5
5
  /**
6
- * A two-row alignment whose ROW ORDER IS A CONTRACT: row 0 is the transcript,
7
- * row 1 is the structure. Every producer honors it — runLocalAlignment is
8
- * always called as (transcript, structure), and the manual-import dialog tells
9
- * the user to paste them in that order — and every consumer depends on it, but
10
- * nothing in the type can enforce it, and swapping the two silently inverts
11
- * every coordinate map. Read the rows through the accessors below rather than
12
- * indexing, so a call site states which sequence it means.
6
+ * A two-row alignment: row 0 is the transcript and row 1 is the structure.
7
+ * alignSequences takes them in that order and every consumer depends on it,
8
+ * but the type cannot enforce it, and swapped rows invert every coordinate map
9
+ * without an error. Read the rows with the accessors below, so a call site
10
+ * names the sequence it means.
13
11
  */
14
12
  export interface PairwiseAlignment {
15
13
  consensus: string;
@@ -21,11 +19,10 @@ export declare const structureAlignedSeq: (pa: PairwiseAlignment) => string;
21
19
  * `pairwiseAlignmentProblem` is what guarantees it. */
22
20
  export declare const alignmentLength: (pa: PairwiseAlignment) => number;
23
21
  /**
24
- * Why a pairwise alignment can't be used, or undefined if it's usable. The two
25
- * rows must be the same non-zero length — every coordinate map walks them in
26
- * lockstep, so a ragged pair would map positions to nonsense. Callers that
27
- * accept alignments from outside (the manual-import dialog) check this and
28
- * report it; the internal map builders assert on it.
22
+ * Why a pairwise alignment can't be used, or undefined if it's usable. Both
23
+ * rows must have the same non-zero length, because every coordinate map walks
24
+ * them in step. Check an alignment from outside the package with this; the
25
+ * internal map builders throw on it.
29
26
  */
30
27
  export declare function pairwiseAlignmentProblem(pa: PairwiseAlignment): string | undefined;
31
28
  /**
package/dist/mappings.js CHANGED
@@ -19,11 +19,10 @@ exports.structureAlignedSeq = structureAlignedSeq;
19
19
  const alignmentLength = (pa) => (0, exports.transcriptAlignedSeq)(pa).length;
20
20
  exports.alignmentLength = alignmentLength;
21
21
  /**
22
- * Why a pairwise alignment can't be used, or undefined if it's usable. The two
23
- * rows must be the same non-zero length — every coordinate map walks them in
24
- * lockstep, so a ragged pair would map positions to nonsense. Callers that
25
- * accept alignments from outside (the manual-import dialog) check this and
26
- * report it; the internal map builders assert on it.
22
+ * Why a pairwise alignment can't be used, or undefined if it's usable. Both
23
+ * rows must have the same non-zero length, because every coordinate map walks
24
+ * them in step. Check an alignment from outside the package with this; the
25
+ * internal map builders throw on it.
27
26
  */
28
27
  function pairwiseAlignmentProblem(pa) {
29
28
  const transcript = (0, exports.transcriptAlignedSeq)(pa);