|
|
@@ -20,7 +20,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
|
};
|
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
-exports.getInteractionsFromEntry = exports.getEntryFromGeneName = exports.getEnrty = exports.readOffset = exports.makeIndex = void 0;
|
|
|
+exports.findDistance = exports.getInteractionsFromEntry = exports.getEntryFromGeneName = exports.getEnrty = exports.readOffset = exports.makeIndex = void 0;
|
|
|
const fs_1 = __importDefault(require("fs"));
|
|
|
const readline_1 = __importDefault(require("readline"));
|
|
|
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
|
@@ -134,12 +134,58 @@ const getEntryFromGeneName = (idmappingPath, dbPath, geneName) => __awaiter(void
|
|
|
});
|
|
|
exports.getEntryFromGeneName = getEntryFromGeneName;
|
|
|
const getInteractionsFromEntry = (json) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
- const uniprotIDs = json.entry.accession;
|
|
|
- const genes_interactant = [...new Set((0, jsonata_1.default)(`entry.comment[type="interaction"].interactant`).evaluate(json)
|
|
|
- .filter((e) => !uniprotIDs.includes(e.label))
|
|
|
- .map((e) => e.label))];
|
|
|
- const scope_inter = (0, jsonata_1.default)(`entry.reference[scope ~> /INTERACTION WITH/i ]`).evaluate(json).map((e) => (Object.assign({ txt: Array.isArray(e.scope) ? e.scope.filter((ee) => ee.match(/INTERACTION\ WITH/)).join() : e.scope }, e))).map((e) => (Object.assign({ interaction: e.txt.substring(e.txt.indexOf("INTERACTION WITH ") + "INTERACTION WITH ".length, e.txt.length) }, e)));
|
|
|
- const genes_scope_inter = [...new Set(scope_inter.map((e) => e.interaction))];
|
|
|
- return [...new Set([...genes_scope_inter, ...genes_interactant])].filter(e => e);
|
|
|
+ const uniprotIDs = Array.isArray(json.entry.accession) ? json.entry.accession : [json.entry.accession];
|
|
|
+ // Comment interactant
|
|
|
+ const res_inter = (0, jsonata_1.default)(`entry.comment[type="interaction"].interactant`).evaluate(json);
|
|
|
+ let genes_interactant = [];
|
|
|
+ if (res_inter) {
|
|
|
+ genes_interactant = [...new Set(res_inter
|
|
|
+ .filter((e) => !uniprotIDs.includes(e.label))
|
|
|
+ .map((e) => e.label)
|
|
|
+ .filter((e) => e))];
|
|
|
+ }
|
|
|
+ // Reference scope = INTERACTION WITH
|
|
|
+ const scope_inter = (0, jsonata_1.default)(`entry.reference[scope ~> /INTERACTION WITH/i ]`).evaluate(json);
|
|
|
+ let genes_scope_inter = [];
|
|
|
+ if (scope_inter) {
|
|
|
+ const comment_scope_inters = Array.isArray(scope_inter) ? scope_inter : [scope_inter];
|
|
|
+ const comment_scope_inters_genes = comment_scope_inters.map((e) => (Object.assign({ txt: Array.isArray(e.scope) ? e.scope.filter((ee) => ee.match(/INTERACTION\ WITH/)).join() : e.scope }, e))).map((e) => (Object.assign({ interaction: e.txt.substring(e.txt.indexOf("INTERACTION WITH ") + "INTERACTION WITH ".length, e.txt.length) }, e)));
|
|
|
+ genes_scope_inter = [...new Set(comment_scope_inters_genes.map((e) => e.interaction))].flatMap((e) => e.split(/; | AND /));
|
|
|
+ }
|
|
|
+ // Comment subunit
|
|
|
+ const comment_subunit = (0, jsonata_1.default)(`entry.comment[type="subunit"].text.value`).evaluate(json);
|
|
|
+ let comment_subunits_genes = [];
|
|
|
+ if (comment_subunit) {
|
|
|
+ const comment_subunits = Array.isArray(comment_subunit) ? comment_subunit : [comment_subunit];
|
|
|
+ comment_subunits_genes = comment_subunits
|
|
|
+ .flatMap((e) => e.replace(/ *\([^)]*\) */g, '').split(/\n/))
|
|
|
+ .filter((e) => /Interacts/.test(e))
|
|
|
+ .flatMap((e) => e.match(/[A-Z][A-Z0-9]{2,}/g));
|
|
|
+ }
|
|
|
+ let res = [...new Set([...genes_scope_inter, ...genes_interactant, ...comment_subunits_genes])].sort().filter((e) => typeof e === 'string').filter(_ => _);
|
|
|
+ console.log(res);
|
|
|
+ if (res.length > 0)
|
|
|
+ res = res.flatMap((e) => e.match(/[A-Z][A-Z0-9]{2,}/g)).filter(_ => _);
|
|
|
+ return res;
|
|
|
});
|
|
|
exports.getInteractionsFromEntry = getInteractionsFromEntry;
|
|
|
+const findDistance = (idmappingPath, dbPath, geneNameA, geneNameB, maxDistance = 6) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
+ let rounds = [[geneNameA]];
|
|
|
+ let run = true;
|
|
|
+ let nIter = 0;
|
|
|
+ while (nIter <= maxDistance && run) {
|
|
|
+ for (const gA of rounds[nIter]) {
|
|
|
+ console.log(nIter, gA);
|
|
|
+ const tmp = yield getInteractionsFromEntry(yield getEntryFromGeneName(idmappingPath, dbPath, gA));
|
|
|
+ if (tmp.includes(geneNameB)) {
|
|
|
+ run = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ rounds.push(tmp);
|
|
|
+ }
|
|
|
+ nIter++;
|
|
|
+ }
|
|
|
+ //console.log(rounds);
|
|
|
+ return nIter;
|
|
|
+});
|
|
|
+exports.findDistance = findDistance;
|