p2s_mapper 1.1.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -27
- package/dist/fetchUtils.d.ts +14 -1
- package/dist/fetchUtils.js +23 -1
- package/dist/fetchUtils.js.map +1 -1
- package/dist/pdbUniProtMapping.d.ts +11 -2
- package/dist/pdbUniProtMapping.js +13 -3
- package/dist/pdbUniProtMapping.js.map +1 -1
- package/dist/uniProtSearch.d.ts +4 -1
- package/dist/uniProtSearch.js +14 -3
- package/dist/uniProtSearch.js.map +1 -1
- package/esm/fetchUtils.d.ts +14 -1
- package/esm/fetchUtils.js +20 -1
- package/esm/fetchUtils.js.map +1 -1
- package/esm/pdbUniProtMapping.d.ts +11 -2
- package/esm/pdbUniProtMapping.js +14 -4
- package/esm/pdbUniProtMapping.js.map +1 -1
- package/esm/uniProtSearch.d.ts +4 -1
- package/esm/uniProtSearch.js +14 -3
- package/esm/uniProtSearch.js.map +1 -1
- package/package.json +1 -1
- package/src/fetchUtils.ts +26 -1
- package/src/pdbUniProtMapping.ts +14 -4
- package/src/uniProtSearch.ts +23 -3
package/README.md
CHANGED
|
@@ -7,9 +7,9 @@ PDBe and UniProt lookups that find a structure to map in the first place.
|
|
|
7
7
|
|
|
8
8
|
Extracted from
|
|
9
9
|
[jbrowse-plugin-protein3d](https://github.com/GMOD/jbrowse-plugin-protein3d),
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
where we made the measurements behind the scoring rules. The package has no
|
|
11
|
+
React, no JBrowse and no Mol\* dependency: a loaded Mol\* model reaches it
|
|
12
|
+
through narrow structural interfaces, and `g2p_mapper` is the only runtime
|
|
13
13
|
dependency.
|
|
14
14
|
|
|
15
15
|
## Install
|
|
@@ -20,23 +20,22 @@ npm install p2s_mapper
|
|
|
20
20
|
|
|
21
21
|
## Coordinate conventions
|
|
22
22
|
|
|
23
|
-
One residue has up to four numbers, and mixing them
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
`
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
any offset.
|
|
23
|
+
One residue has up to four numbers, and mixing them causes the off-by-one bugs
|
|
24
|
+
this package's types prevent. **Every stored or computed coordinate is a 0-based
|
|
25
|
+
position**: an index into the ungapped structure sequence or the ungapped
|
|
26
|
+
transcript sequence, the one numbering that is dense and zero-based whatever the
|
|
27
|
+
file. `coordinates.ts` brands the three internal spaces — structure position,
|
|
28
|
+
transcript position, alignment column — so the compiler rejects mixing them. Two
|
|
29
|
+
conversions leave that space, and each has exactly one correct route. **Mol\* is
|
|
30
|
+
addressed by `label_seq_id`**, which is `position + 1` only for a file carrying
|
|
31
|
+
`entity_poly_seq` or SEQRES; a SEQRES-less PDB numbers its observed residues by
|
|
32
|
+
author numbering and leaves holes at unobserved loops, so `Entity.seqIds`
|
|
33
|
+
carries the real ids and every crossing goes through `toLabelSeqIds`,
|
|
34
|
+
`rangeToLabelSeqIds` or `makeLabelSeqIdIndex`. **The user sees `auth_seq_id`**,
|
|
35
|
+
the depositors' numbering that papers and UniProt cite (1TUP position 154
|
|
36
|
+
reads 248) and that Mol\*'s own hover shows; `Entity.authSeqIds` carries it, and
|
|
37
|
+
it is display-only. UniProt positions are 1-based, and `pdbUniProtMapping`
|
|
38
|
+
converts them with SIFTS rather than assuming any offset.
|
|
40
39
|
|
|
41
40
|
## Exports
|
|
42
41
|
|
|
@@ -55,8 +54,8 @@ accessors, not by index.
|
|
|
55
54
|
|
|
56
55
|
`alignmentQuality`, `isLowSimilarity`, `describeAlignmentQuality`,
|
|
57
56
|
`describeTranscriptCoverage`, `describeCoveredRange` — identity over the shorter
|
|
58
|
-
sequence
|
|
59
|
-
|
|
57
|
+
sequence separates a real match from a chance local alignment; local identity
|
|
58
|
+
alone does not.
|
|
60
59
|
|
|
61
60
|
`AlignmentAlgorithm`, `coerceAlignmentAlgorithm`, `ALIGNMENT_ALGORITHM_LABELS`.
|
|
62
61
|
|
|
@@ -134,14 +133,18 @@ host can hand in an instrumented one and a test can hand in a double.
|
|
|
134
133
|
|
|
135
134
|
`structureFormatFromContent`, `structureFormatFromName`,
|
|
136
135
|
`structureFileExtension`, `isBinaryStructureUrl` — which parser a structure
|
|
137
|
-
needs, sniffed from **content** rather than a filename.
|
|
138
|
-
|
|
139
|
-
|
|
136
|
+
needs, sniffed from **content** rather than a filename. PDB read as mmCIF
|
|
137
|
+
throws, while mmCIF read as PDB succeeds and yields a model with thousands of
|
|
138
|
+
misread atoms and zero polymer entities.
|
|
140
139
|
|
|
141
140
|
`caCoordsToPdb`, `hasValidCaCoords` — a PDB file from Foldseek Cα coordinates.
|
|
142
141
|
|
|
143
|
-
`rawfetch`, `myfetch`, `jsonfetch`, `httpError`, `
|
|
144
|
-
`timeout`, `FetchOptions`.
|
|
142
|
+
`rawfetch`, `myfetch`, `jsonfetch`, `httpError`, `HttpError`,
|
|
143
|
+
`isDefinitiveFailure`, `networkError`, `abortError`, `timeout`, `FetchOptions`.
|
|
144
|
+
A failed response throws an `HttpError` carrying its `status`, and
|
|
145
|
+
`isDefinitiveFailure` is true for a 4xx — the server understood and declined, so
|
|
146
|
+
retrying repeats the answer. `fetchUniProtStructureMappings` uses it: PDBe
|
|
147
|
+
answers 404 for an entry it has no UniProt mapping for at all.
|
|
145
148
|
|
|
146
149
|
## License
|
|
147
150
|
|
package/dist/fetchUtils.d.ts
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
3
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
4
|
+
* unchanged, so existing error rendering is unaffected.
|
|
5
|
+
*/
|
|
6
|
+
export declare class HttpError extends Error {
|
|
7
|
+
readonly status: number;
|
|
8
|
+
constructor(message: string, status: number);
|
|
9
|
+
}
|
|
10
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
11
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
12
|
+
* not. */
|
|
13
|
+
export declare function isDefinitiveFailure(e: unknown): boolean;
|
|
1
14
|
/**
|
|
2
15
|
* The error a failed response deserves: status and host, plus at most the first
|
|
3
16
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
4
17
|
* and pasting it into the dialog buries the one line that says what went wrong.
|
|
5
18
|
*/
|
|
6
|
-
export declare function httpError(response: Response, url: string): Promise<
|
|
19
|
+
export declare function httpError(response: Response, url: string): Promise<HttpError>;
|
|
7
20
|
/**
|
|
8
21
|
* `fetch` rejects with a bare `TypeError: Failed to fetch` for a DNS failure,
|
|
9
22
|
* an offline browser and a refused cross-origin request alike, naming neither
|
package/dist/fetchUtils.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpError = void 0;
|
|
4
|
+
exports.isDefinitiveFailure = isDefinitiveFailure;
|
|
3
5
|
exports.httpError = httpError;
|
|
4
6
|
exports.networkError = networkError;
|
|
5
7
|
exports.rawfetch = rawfetch;
|
|
@@ -20,6 +22,26 @@ function firstLine(body) {
|
|
|
20
22
|
const line = body.split('\n', 1)[0]?.trim() ?? '';
|
|
21
23
|
return line.length > MAX_DETAIL ? `${line.slice(0, MAX_DETAIL)}…` : line;
|
|
22
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
27
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
28
|
+
* unchanged, so existing error rendering is unaffected.
|
|
29
|
+
*/
|
|
30
|
+
class HttpError extends Error {
|
|
31
|
+
status;
|
|
32
|
+
constructor(message, status) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.name = 'HttpError';
|
|
35
|
+
this.status = status;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.HttpError = HttpError;
|
|
39
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
40
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
41
|
+
* not. */
|
|
42
|
+
function isDefinitiveFailure(e) {
|
|
43
|
+
return e instanceof HttpError && e.status >= 400 && e.status < 500;
|
|
44
|
+
}
|
|
23
45
|
/**
|
|
24
46
|
* The error a failed response deserves: status and host, plus at most the first
|
|
25
47
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
@@ -28,7 +50,7 @@ function firstLine(body) {
|
|
|
28
50
|
async function httpError(response, url) {
|
|
29
51
|
const detail = firstLine(await response.text().catch(() => ''));
|
|
30
52
|
const status = `HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''} from ${hostOf(url)}`;
|
|
31
|
-
return new
|
|
53
|
+
return new HttpError(detail ? `${status}: ${detail}` : status, response.status);
|
|
32
54
|
}
|
|
33
55
|
/**
|
|
34
56
|
* `fetch` rejects with a bare `TypeError: Failed to fetch` for a DNS failure,
|
package/dist/fetchUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,8 +28,17 @@ export interface UniProtStructureMapping {
|
|
|
28
28
|
*/
|
|
29
29
|
export type MapUniProtPosition = (uniprotPos: number) => number | undefined;
|
|
30
30
|
export declare function pdbeSiftsUrl(pdbId: string): string;
|
|
31
|
-
/**
|
|
32
|
-
*
|
|
31
|
+
/**
|
|
32
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
33
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
34
|
+
*
|
|
35
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
36
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
37
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
38
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
39
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
40
|
+
* resolve.
|
|
41
|
+
*/
|
|
33
42
|
export declare function fetchUniProtStructureMappings(pdbId: string, opts?: FetchOptions): Promise<UniProtStructureMapping[]>;
|
|
34
43
|
/**
|
|
35
44
|
* Parses a PDBe `mappings/uniprot/{pdbId}` response into one entry per UniProt
|
|
@@ -29,8 +29,17 @@ function pdbeSiftsUrl(pdbId) {
|
|
|
29
29
|
const SIFTS_RETRY_DELAYS_MS = [1000, 3000];
|
|
30
30
|
// bounded, since a view reports itself loading until SIFTS answers
|
|
31
31
|
const SIFTS_TIMEOUT_MS = 20_000;
|
|
32
|
-
/**
|
|
33
|
-
*
|
|
32
|
+
/**
|
|
33
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
34
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
35
|
+
*
|
|
36
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
37
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
38
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
39
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
40
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
41
|
+
* resolve.
|
|
42
|
+
*/
|
|
34
43
|
async function fetchUniProtStructureMappings(pdbId, opts) {
|
|
35
44
|
const { signal: caller, ...rest } = opts ?? {};
|
|
36
45
|
const signal = caller ?? undefined;
|
|
@@ -43,7 +52,8 @@ async function fetchUniProtStructureMappings(pdbId, opts) {
|
|
|
43
52
|
}
|
|
44
53
|
catch (e) {
|
|
45
54
|
const delay = SIFTS_RETRY_DELAYS_MS[attempt];
|
|
46
|
-
|
|
55
|
+
// the caller's own abort is not a failure to retry either
|
|
56
|
+
if (delay === undefined || (0, fetchUtils_ts_1.isDefinitiveFailure)(e) || signal?.aborted) {
|
|
47
57
|
throw e;
|
|
48
58
|
}
|
|
49
59
|
await (0, fetchUtils_ts_1.timeout)(delay, signal);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdbUniProtMapping.js","sourceRoot":"","sources":["../src/pdbUniProtMapping.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,EAAE;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,4BAA4B;AAC5B,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,eAAe;;;AAqCf,oCAEC;
|
|
1
|
+
{"version":3,"file":"pdbUniProtMapping.js","sourceRoot":"","sources":["../src/pdbUniProtMapping.ts"],"names":[],"mappings":"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"}
|
package/dist/uniProtSearch.d.ts
CHANGED
|
@@ -16,8 +16,11 @@ export interface UniProtEntry {
|
|
|
16
16
|
* The symbol is quoted because a bare one containing `:` — an HLA allele, a
|
|
17
17
|
* name straight out of an annotation file — reads as another field to
|
|
18
18
|
* UniProt's parser, which answers 400.
|
|
19
|
+
*
|
|
20
|
+
* `organism_id` matches that taxon alone and `taxonomy_id` its descendants
|
|
21
|
+
* too. See searchByGeneName for when each is asked.
|
|
19
22
|
*/
|
|
20
|
-
export declare function buildGeneNameQuery(geneName: string, organismId?: number): string;
|
|
23
|
+
export declare function buildGeneNameQuery(geneName: string, organismId?: number, scope?: 'organism_id' | 'taxonomy_id'): string;
|
|
21
24
|
export interface UniProtSearchResult {
|
|
22
25
|
entries: UniProtEntry[];
|
|
23
26
|
attemptedCount: number;
|
package/dist/uniProtSearch.js
CHANGED
|
@@ -29,11 +29,14 @@ async function searchUniProt(query, size, opts) {
|
|
|
29
29
|
* The symbol is quoted because a bare one containing `:` — an HLA allele, a
|
|
30
30
|
* name straight out of an annotation file — reads as another field to
|
|
31
31
|
* UniProt's parser, which answers 400.
|
|
32
|
+
*
|
|
33
|
+
* `organism_id` matches that taxon alone and `taxonomy_id` its descendants
|
|
34
|
+
* too. See searchByGeneName for when each is asked.
|
|
32
35
|
*/
|
|
33
|
-
function buildGeneNameQuery(geneName, organismId) {
|
|
36
|
+
function buildGeneNameQuery(geneName, organismId, scope = 'organism_id') {
|
|
34
37
|
return [
|
|
35
38
|
`gene_exact:"${geneName.replaceAll('"', '\\"')}"`,
|
|
36
|
-
organismId ?
|
|
39
|
+
organismId ? `${scope}:${organismId}` : undefined,
|
|
37
40
|
'reviewed:true',
|
|
38
41
|
]
|
|
39
42
|
.filter(s => s !== undefined)
|
|
@@ -54,7 +57,15 @@ async function searchByXref(id, opts) {
|
|
|
54
57
|
}
|
|
55
58
|
async function searchByGeneName(geneName, organismId, opts) {
|
|
56
59
|
try {
|
|
57
|
-
const
|
|
60
|
+
const exact = await searchUniProt(buildGeneNameQuery(geneName, organismId), organismId ? 5 : 10, opts);
|
|
61
|
+
// Swiss-Prot files a microbe's entries under its reference strain, and an
|
|
62
|
+
// assembly often names the species: fission yeast is 4896 and its entries
|
|
63
|
+
// are 284812. The descendants are asked only on a miss, because for a
|
|
64
|
+
// species with reviewed subspecies entries (human and Neanderthal) they
|
|
65
|
+
// turn one answer into two.
|
|
66
|
+
const entries = exact.length === 0 && organismId
|
|
67
|
+
? await searchUniProt(buildGeneNameQuery(geneName, organismId, 'taxonomy_id'), 5, opts)
|
|
68
|
+
: exact;
|
|
58
69
|
return { entries, error: undefined };
|
|
59
70
|
}
|
|
60
71
|
catch (e) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniProtSearch.js","sourceRoot":"","sources":["../src/uniProtSearch.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"uniProtSearch.js","sourceRoot":"","sources":["../src/uniProtSearch.ts"],"names":[],"mappings":"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"}
|
package/esm/fetchUtils.d.ts
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
3
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
4
|
+
* unchanged, so existing error rendering is unaffected.
|
|
5
|
+
*/
|
|
6
|
+
export declare class HttpError extends Error {
|
|
7
|
+
readonly status: number;
|
|
8
|
+
constructor(message: string, status: number);
|
|
9
|
+
}
|
|
10
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
11
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
12
|
+
* not. */
|
|
13
|
+
export declare function isDefinitiveFailure(e: unknown): boolean;
|
|
1
14
|
/**
|
|
2
15
|
* The error a failed response deserves: status and host, plus at most the first
|
|
3
16
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
4
17
|
* and pasting it into the dialog buries the one line that says what went wrong.
|
|
5
18
|
*/
|
|
6
|
-
export declare function httpError(response: Response, url: string): Promise<
|
|
19
|
+
export declare function httpError(response: Response, url: string): Promise<HttpError>;
|
|
7
20
|
/**
|
|
8
21
|
* `fetch` rejects with a bare `TypeError: Failed to fetch` for a DNS failure,
|
|
9
22
|
* an offline browser and a refused cross-origin request alike, naming neither
|
package/esm/fetchUtils.js
CHANGED
|
@@ -11,6 +11,25 @@ function firstLine(body) {
|
|
|
11
11
|
const line = body.split('\n', 1)[0]?.trim() ?? '';
|
|
12
12
|
return line.length > MAX_DETAIL ? `${line.slice(0, MAX_DETAIL)}…` : line;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
16
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
17
|
+
* unchanged, so existing error rendering is unaffected.
|
|
18
|
+
*/
|
|
19
|
+
export class HttpError extends Error {
|
|
20
|
+
status;
|
|
21
|
+
constructor(message, status) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = 'HttpError';
|
|
24
|
+
this.status = status;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
28
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
29
|
+
* not. */
|
|
30
|
+
export function isDefinitiveFailure(e) {
|
|
31
|
+
return e instanceof HttpError && e.status >= 400 && e.status < 500;
|
|
32
|
+
}
|
|
14
33
|
/**
|
|
15
34
|
* The error a failed response deserves: status and host, plus at most the first
|
|
16
35
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
@@ -19,7 +38,7 @@ function firstLine(body) {
|
|
|
19
38
|
export async function httpError(response, url) {
|
|
20
39
|
const detail = firstLine(await response.text().catch(() => ''));
|
|
21
40
|
const status = `HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''} from ${hostOf(url)}`;
|
|
22
|
-
return new
|
|
41
|
+
return new HttpError(detail ? `${status}: ${detail}` : status, response.status);
|
|
23
42
|
}
|
|
24
43
|
/**
|
|
25
44
|
* `fetch` rejects with a bare `TypeError: Failed to fetch` for a DNS failure,
|
package/esm/fetchUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"AAAA,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,GAAG,CAAA;AAEtB,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACjD,OAAO,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAkB,EAAE,GAAW;IAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,QAAQ,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACnH,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,8 +28,17 @@ export interface UniProtStructureMapping {
|
|
|
28
28
|
*/
|
|
29
29
|
export type MapUniProtPosition = (uniprotPos: number) => number | undefined;
|
|
30
30
|
export declare function pdbeSiftsUrl(pdbId: string): string;
|
|
31
|
-
/**
|
|
32
|
-
*
|
|
31
|
+
/**
|
|
32
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
33
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
34
|
+
*
|
|
35
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
36
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
37
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
38
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
39
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
40
|
+
* resolve.
|
|
41
|
+
*/
|
|
33
42
|
export declare function fetchUniProtStructureMappings(pdbId: string, opts?: FetchOptions): Promise<UniProtStructureMapping[]>;
|
|
34
43
|
/**
|
|
35
44
|
* Parses a PDBe `mappings/uniprot/{pdbId}` response into one entry per UniProt
|
package/esm/pdbUniProtMapping.js
CHANGED
|
@@ -13,15 +13,24 @@
|
|
|
13
13
|
// SEQRES, i.e. label_seq_id, which is exactly this plugin's structure-sequence
|
|
14
14
|
// position + 1 (see applyLociInteractivity.ts for the other place that boundary
|
|
15
15
|
// is crossed).
|
|
16
|
-
import { jsonfetch, timeout } from "./fetchUtils.js";
|
|
16
|
+
import { isDefinitiveFailure, jsonfetch, timeout } from "./fetchUtils.js";
|
|
17
17
|
export function pdbeSiftsUrl(pdbId) {
|
|
18
18
|
return `https://www.ebi.ac.uk/pdbe/api/mappings/uniprot/${pdbId.toLowerCase()}`;
|
|
19
19
|
}
|
|
20
20
|
const SIFTS_RETRY_DELAYS_MS = [1000, 3000];
|
|
21
21
|
// bounded, since a view reports itself loading until SIFTS answers
|
|
22
22
|
const SIFTS_TIMEOUT_MS = 20_000;
|
|
23
|
-
/**
|
|
24
|
-
*
|
|
23
|
+
/**
|
|
24
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
25
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
26
|
+
*
|
|
27
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
28
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
29
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
30
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
31
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
32
|
+
* resolve.
|
|
33
|
+
*/
|
|
25
34
|
export async function fetchUniProtStructureMappings(pdbId, opts) {
|
|
26
35
|
const { signal: caller, ...rest } = opts ?? {};
|
|
27
36
|
const signal = caller ?? undefined;
|
|
@@ -34,7 +43,8 @@ export async function fetchUniProtStructureMappings(pdbId, opts) {
|
|
|
34
43
|
}
|
|
35
44
|
catch (e) {
|
|
36
45
|
const delay = SIFTS_RETRY_DELAYS_MS[attempt];
|
|
37
|
-
|
|
46
|
+
// the caller's own abort is not a failure to retry either
|
|
47
|
+
if (delay === undefined || isDefinitiveFailure(e) || signal?.aborted) {
|
|
38
48
|
throw e;
|
|
39
49
|
}
|
|
40
50
|
await timeout(delay, signal);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdbUniProtMapping.js","sourceRoot":"","sources":["../src/pdbUniProtMapping.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,4BAA4B;AAC5B,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,eAAe;AAEf,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"pdbUniProtMapping.js","sourceRoot":"","sources":["../src/pdbUniProtMapping.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,4BAA4B;AAC5B,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,eAAe;AAEf,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAmCzE,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,mDAAmD,KAAK,CAAC,WAAW,EAAE,EAAE,CAAA;AACjF,CAAC;AAED,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;AAC1C,mEAAmE;AACnE,MAAM,gBAAgB,GAAG,MAAM,CAAA;AAE/B;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,KAAa,EACb,IAAmB;IAEnB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAA;IAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,SAAS,CAAA;IAClC,MAAM,QAAQ,GAAG,GAAG,EAAE,CACpB,MAAM;QACJ,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAClE,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC3C,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,6BAA6B,CAClC,MAAM,SAAS,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC,CACtE,CAAA;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;YAC5C,0DAA0D;YAC1D,IAAI,KAAK,KAAK,SAAS,IAAI,mBAAmB,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;gBACrE,MAAM,CAAC,CAAA;YACT,CAAC;YACD,MAAM,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAA;AAChF,CAAC;AAED,SAAS,aAAa,CAAC,QAAiB;IACtC,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAC/E,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAiB;IAC5C,OAAO,QAAQ,CAAC,QAAQ,CAAC;QACvB,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAC9C,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,SAAS,YAAY,CAAC,OAAgB;IACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAChD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAChD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5C,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC5C,MAAM,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACtD,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAClD,OAAO,QAAQ,KAAK,SAAS;QAC3B,QAAQ,KAAK,SAAS;QACtB,MAAM,KAAK,SAAS;QACpB,WAAW,KAAK,SAAS;QACzB,SAAS,KAAK,SAAS;QACvB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC;YACE,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC1B,GAAG,CAAC,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;gBACtC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;gBAC/B,CAAC,CAAC,EAAE,CAAC;YACP,QAAQ;YACR,MAAM;YACN,kEAAkE;YAClE,WAAW,EAAE,WAAW,GAAG,CAAC;YAC5B,SAAS,EAAE,SAAS,GAAG,CAAC;YACxB,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;YACrD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;SAClD,CAAA;AACP,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,6BAA6B,CAC3C,IAAa;IAEb,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACjE,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAA;IAC3D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,CAAA;IACX,CAAC;IACD,MAAM,MAAM,GAA8B,EAAE,CAAA;IAC5C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACzD,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;QAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YACtC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;YACzD,CAAC,CAAC,EAAE,CAAA;QACN,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS;gBACT,IAAI,EACF,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAC/C,CAAC,CAAC,KAAK,CAAC,IAAI;oBACZ,CAAC,CAAC,SAAS;gBACf,QAAQ;aACT,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,eAAe,CAAC,QAAmC;IAC1D,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAC5E,CAAC;AASD;;;;;GAKG;AACH,SAAS,iBAAiB,CACxB,OAAgC,EAChC,MAAqB;IAErB,OAAO,cAAc,CACnB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC1B,CAAC,CAAC,OAAO,KAAK,SAAS;QACrB,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;QAChC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CACtC,CACF,CAAA;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAAmC,EACnC,MAAiC;IAEjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,IAAyC,CAAA;IAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACnD,IACE,QAAQ,CAAC,MAAM,GAAG,CAAC;YACnB,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC,QAAQ,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EACrE,CAAC;YACD,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,CAAA;QACjC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,eAAe,GAAG,CAAC,CAAA;AACzB,MAAM,gBAAgB,GAAG,GAAG,CAAA;AAE5B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,sBAAsB,CACpC,QAAmC,EACnC,MAAiC,EACjC,MAAoC;IAEpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,MAAM,WAAW,GAAG,MAAM;QACxB,CAAC,CAAC,QAAQ;aACL,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;aACtC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,CAAC,CAAC,EAAE,CAAA;IACN,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,QAAmC,EAAE,GAAW,EAAE,EAAE,CAClE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,WAAW,IAAI,GAAG,IAAI,CAAC,CAAC,SAAS,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;QAC1C,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;YACjC,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAA;gBACT,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3B,CAAC;QACH,CAAC;QACD,OAAO,SAAS,GAAG,CAAC,OAAO,GAAG,eAAe,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAA;IACzC,IAAI,WAAW,GAAG,gBAAgB,EAAE,CAAC;QACnC,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAE,CAAA;IACvD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,IACE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;YACjB,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,EACvE,CAAC;YACD,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,4EAA4E;AAC5E,6EAA6E;AAC7E,SAAS,cAAc,CAAC,QAAmC;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;QACzB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,EAAE,CAAA;QACvE,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,OAAO,KAAK,CAAA;IACd,CAAC,CAAC,CAAA;AACJ,CAAC;AAED;mDACmD;AACnD,MAAM,CAAC,MAAM,0BAA0B,GAAuB,UAAU,CAAC,EAAE,CACzE,UAAU,GAAG,CAAC,CAAA;AAEhB,MAAM,UAAU,sBAAsB,CACpC,QAAmC;IAEnC,OAAO,UAAU,CAAC,EAAE;QAClB,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,CAAC,UAAU,IAAI,CAAC,CAAC,QAAQ,IAAI,UAAU,IAAI,CAAC,CAAC,MAAM,CACxD,CAAA;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,GAAG,CAAC,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;QACjE,OAAO,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAA;IACnD,CAAC,CAAA;AACH,CAAC"}
|
package/esm/uniProtSearch.d.ts
CHANGED
|
@@ -16,8 +16,11 @@ export interface UniProtEntry {
|
|
|
16
16
|
* The symbol is quoted because a bare one containing `:` — an HLA allele, a
|
|
17
17
|
* name straight out of an annotation file — reads as another field to
|
|
18
18
|
* UniProt's parser, which answers 400.
|
|
19
|
+
*
|
|
20
|
+
* `organism_id` matches that taxon alone and `taxonomy_id` its descendants
|
|
21
|
+
* too. See searchByGeneName for when each is asked.
|
|
19
22
|
*/
|
|
20
|
-
export declare function buildGeneNameQuery(geneName: string, organismId?: number): string;
|
|
23
|
+
export declare function buildGeneNameQuery(geneName: string, organismId?: number, scope?: 'organism_id' | 'taxonomy_id'): string;
|
|
21
24
|
export interface UniProtSearchResult {
|
|
22
25
|
entries: UniProtEntry[];
|
|
23
26
|
attemptedCount: number;
|
package/esm/uniProtSearch.js
CHANGED
|
@@ -25,11 +25,14 @@ async function searchUniProt(query, size, opts) {
|
|
|
25
25
|
* The symbol is quoted because a bare one containing `:` — an HLA allele, a
|
|
26
26
|
* name straight out of an annotation file — reads as another field to
|
|
27
27
|
* UniProt's parser, which answers 400.
|
|
28
|
+
*
|
|
29
|
+
* `organism_id` matches that taxon alone and `taxonomy_id` its descendants
|
|
30
|
+
* too. See searchByGeneName for when each is asked.
|
|
28
31
|
*/
|
|
29
|
-
export function buildGeneNameQuery(geneName, organismId) {
|
|
32
|
+
export function buildGeneNameQuery(geneName, organismId, scope = 'organism_id') {
|
|
30
33
|
return [
|
|
31
34
|
`gene_exact:"${geneName.replaceAll('"', '\\"')}"`,
|
|
32
|
-
organismId ?
|
|
35
|
+
organismId ? `${scope}:${organismId}` : undefined,
|
|
33
36
|
'reviewed:true',
|
|
34
37
|
]
|
|
35
38
|
.filter(s => s !== undefined)
|
|
@@ -50,7 +53,15 @@ async function searchByXref(id, opts) {
|
|
|
50
53
|
}
|
|
51
54
|
async function searchByGeneName(geneName, organismId, opts) {
|
|
52
55
|
try {
|
|
53
|
-
const
|
|
56
|
+
const exact = await searchUniProt(buildGeneNameQuery(geneName, organismId), organismId ? 5 : 10, opts);
|
|
57
|
+
// Swiss-Prot files a microbe's entries under its reference strain, and an
|
|
58
|
+
// assembly often names the species: fission yeast is 4896 and its entries
|
|
59
|
+
// are 284812. The descendants are asked only on a miss, because for a
|
|
60
|
+
// species with reviewed subspecies entries (human and Neanderthal) they
|
|
61
|
+
// turn one answer into two.
|
|
62
|
+
const entries = exact.length === 0 && organismId
|
|
63
|
+
? await searchUniProt(buildGeneNameQuery(geneName, organismId, 'taxonomy_id'), 5, opts)
|
|
64
|
+
: exact;
|
|
54
65
|
return { entries, error: undefined };
|
|
55
66
|
}
|
|
56
67
|
catch (e) {
|
package/esm/uniProtSearch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniProtSearch.js","sourceRoot":"","sources":["../src/uniProtSearch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,YAAY,CAAA;AAsCnB,MAAM,cAAc,GAClB,6DAA6D,CAAA;AAE/D,SAAS,mBAAmB,CAC1B,MAAsC;IAEtC,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,gBAAgB;QAClC,EAAE,EAAE,MAAM,CAAC,WAAW;QACtB,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK;QAC5C,YAAY,EACV,MAAM,CAAC,QAAQ,EAAE,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,cAAc;QAChE,WAAW,EAAE,MAAM,CAAC,kBAAkB,EAAE,eAAe,EAAE,QAAQ,EAAE,KAAK;QACxE,UAAU,EAAE,MAAM,CAAC,SAAS,KAAK,iCAAiC;KACnE,CAAA;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,KAAa,EACb,IAAY,EACZ,IAAmB;IAEnB,MAAM,GAAG,GAAG,mDAAmD,kBAAkB,CAAC,KAAK,CAAC,WAAW,cAAc,SAAS,IAAI,EAAE,CAAA;IAChI,MAAM,IAAI,GAAG,MAAM,SAAS,CAAmB,GAAG,EAAE,IAAI,CAAC,CAAA;IACzD,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;AAC9C,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"uniProtSearch.js","sourceRoot":"","sources":["../src/uniProtSearch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "p2s_mapper",
|
|
3
3
|
"description": "Map a transcript's translation onto a protein structure: alignment, coordinates, chain choice, SIFTS, and the AlphaFold and PDBe lookups that find the structure",
|
|
4
|
-
"version": "1.1
|
|
4
|
+
"version": "1.2.1",
|
|
5
5
|
"packageManager": "pnpm@11.15.1",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
package/src/fetchUtils.ts
CHANGED
|
@@ -13,6 +13,28 @@ function firstLine(body: string) {
|
|
|
13
13
|
return line.length > MAX_DETAIL ? `${line.slice(0, MAX_DETAIL)}…` : line
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
18
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
19
|
+
* unchanged, so existing error rendering is unaffected.
|
|
20
|
+
*/
|
|
21
|
+
export class HttpError extends Error {
|
|
22
|
+
readonly status: number
|
|
23
|
+
|
|
24
|
+
constructor(message: string, status: number) {
|
|
25
|
+
super(message)
|
|
26
|
+
this.name = 'HttpError'
|
|
27
|
+
this.status = status
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
32
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
33
|
+
* not. */
|
|
34
|
+
export function isDefinitiveFailure(e: unknown) {
|
|
35
|
+
return e instanceof HttpError && e.status >= 400 && e.status < 500
|
|
36
|
+
}
|
|
37
|
+
|
|
16
38
|
/**
|
|
17
39
|
* The error a failed response deserves: status and host, plus at most the first
|
|
18
40
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
@@ -21,7 +43,10 @@ function firstLine(body: string) {
|
|
|
21
43
|
export async function httpError(response: Response, url: string) {
|
|
22
44
|
const detail = firstLine(await response.text().catch(() => ''))
|
|
23
45
|
const status = `HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''} from ${hostOf(url)}`
|
|
24
|
-
return new
|
|
46
|
+
return new HttpError(
|
|
47
|
+
detail ? `${status}: ${detail}` : status,
|
|
48
|
+
response.status,
|
|
49
|
+
)
|
|
25
50
|
}
|
|
26
51
|
|
|
27
52
|
/**
|
package/src/pdbUniProtMapping.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// position + 1 (see applyLociInteractivity.ts for the other place that boundary
|
|
15
15
|
// is crossed).
|
|
16
16
|
|
|
17
|
-
import { jsonfetch, timeout } from './fetchUtils.ts'
|
|
17
|
+
import { isDefinitiveFailure, jsonfetch, timeout } from './fetchUtils.ts'
|
|
18
18
|
|
|
19
19
|
import type { FetchOptions } from './fetchUtils.ts'
|
|
20
20
|
|
|
@@ -57,8 +57,17 @@ const SIFTS_RETRY_DELAYS_MS = [1000, 3000]
|
|
|
57
57
|
// bounded, since a view reports itself loading until SIFTS answers
|
|
58
58
|
const SIFTS_TIMEOUT_MS = 20_000
|
|
59
59
|
|
|
60
|
-
/**
|
|
61
|
-
*
|
|
60
|
+
/**
|
|
61
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
62
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
63
|
+
*
|
|
64
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
65
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
66
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
67
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
68
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
69
|
+
* resolve.
|
|
70
|
+
*/
|
|
62
71
|
export async function fetchUniProtStructureMappings(
|
|
63
72
|
pdbId: string,
|
|
64
73
|
opts?: FetchOptions,
|
|
@@ -76,7 +85,8 @@ export async function fetchUniProtStructureMappings(
|
|
|
76
85
|
)
|
|
77
86
|
} catch (e) {
|
|
78
87
|
const delay = SIFTS_RETRY_DELAYS_MS[attempt]
|
|
79
|
-
|
|
88
|
+
// the caller's own abort is not a failure to retry either
|
|
89
|
+
if (delay === undefined || isDefinitiveFailure(e) || signal?.aborted) {
|
|
80
90
|
throw e
|
|
81
91
|
}
|
|
82
92
|
await timeout(delay, signal)
|
package/src/uniProtSearch.ts
CHANGED
|
@@ -77,11 +77,18 @@ async function searchUniProt(
|
|
|
77
77
|
* The symbol is quoted because a bare one containing `:` — an HLA allele, a
|
|
78
78
|
* name straight out of an annotation file — reads as another field to
|
|
79
79
|
* UniProt's parser, which answers 400.
|
|
80
|
+
*
|
|
81
|
+
* `organism_id` matches that taxon alone and `taxonomy_id` its descendants
|
|
82
|
+
* too. See searchByGeneName for when each is asked.
|
|
80
83
|
*/
|
|
81
|
-
export function buildGeneNameQuery(
|
|
84
|
+
export function buildGeneNameQuery(
|
|
85
|
+
geneName: string,
|
|
86
|
+
organismId?: number,
|
|
87
|
+
scope: 'organism_id' | 'taxonomy_id' = 'organism_id',
|
|
88
|
+
) {
|
|
82
89
|
return [
|
|
83
90
|
`gene_exact:"${geneName.replaceAll('"', '\\"')}"`,
|
|
84
|
-
organismId ?
|
|
91
|
+
organismId ? `${scope}:${organismId}` : undefined,
|
|
85
92
|
'reviewed:true',
|
|
86
93
|
]
|
|
87
94
|
.filter(s => s !== undefined)
|
|
@@ -115,11 +122,24 @@ async function searchByGeneName(
|
|
|
115
122
|
opts?: FetchOptions,
|
|
116
123
|
): Promise<SearchAttempt> {
|
|
117
124
|
try {
|
|
118
|
-
const
|
|
125
|
+
const exact = await searchUniProt(
|
|
119
126
|
buildGeneNameQuery(geneName, organismId),
|
|
120
127
|
organismId ? 5 : 10,
|
|
121
128
|
opts,
|
|
122
129
|
)
|
|
130
|
+
// Swiss-Prot files a microbe's entries under its reference strain, and an
|
|
131
|
+
// assembly often names the species: fission yeast is 4896 and its entries
|
|
132
|
+
// are 284812. The descendants are asked only on a miss, because for a
|
|
133
|
+
// species with reviewed subspecies entries (human and Neanderthal) they
|
|
134
|
+
// turn one answer into two.
|
|
135
|
+
const entries =
|
|
136
|
+
exact.length === 0 && organismId
|
|
137
|
+
? await searchUniProt(
|
|
138
|
+
buildGeneNameQuery(geneName, organismId, 'taxonomy_id'),
|
|
139
|
+
5,
|
|
140
|
+
opts,
|
|
141
|
+
)
|
|
142
|
+
: exact
|
|
123
143
|
return { entries, error: undefined }
|
|
124
144
|
} catch (e) {
|
|
125
145
|
console.error(`gene name search failed for ${geneName}:`, e)
|