From b70cc9a6966ac8df301712289da0a3244b9f1bee Mon Sep 17 00:00:00 2001 From: mathieulemieux Date: Fri, 3 Jan 2025 12:57:29 -0800 Subject: [PATCH] Revert parseVariantDecorator and use jsonifyVariant instead --- src/PMC4232638/index.js | 8 ++--- src/cancergenomeinterpreter/index.js | 13 ++++---- src/cancerhotspots/index.js | 13 ++++---- src/cgl/index.js | 8 ++--- src/civic/variant.js | 14 +++++---- src/cosmic/resistance.js | 11 +++---- src/docm/index.js | 9 ++---- src/entrez/snp.js | 10 ++----- src/moa/index.js | 13 ++++---- src/oncokb/index.js | 11 +++---- src/util.js | 44 ---------------------------- src/variants/index.js | 8 ++--- 12 files changed, 45 insertions(+), 117 deletions(-) diff --git a/src/PMC4232638/index.js b/src/PMC4232638/index.js index 5334b3b..979d784 100644 --- a/src/PMC4232638/index.js +++ b/src/PMC4232638/index.js @@ -1,16 +1,12 @@ const readXlsxFile = require('read-excel-file/node'); -const { parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { logger } = require('../logging'); const { rid } = require('../graphkb'); const _pubmed = require('../entrez/pubmed'); const _entrezGene = require('../entrez/gene'); const { PMC4232638: SOURCE_DEFN } = require('../sources'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); - const TP53_COLS = { DOM: 'Functional categories for TP53 - Dominant negative activity', GOF: 'Functional categories for TP53 - Gain of function', @@ -137,7 +133,7 @@ const uploadFile = async ({ conn, filename }) => { logger.info(`loading: ${row.Gene}:${row['Amino acid change']}`); try { - const parsed = parseVariant(`p.${row['Amino acid change']}`, false).toJSON(); + const parsed = jsonifyVariant(parseVariant(`p.${row['Amino acid change']}`, false)); const [gene] = await _entrezGene.fetchAndLoadBySymbol(conn, row.Gene); const relevance = await conn.getVocabularyTerm(row.relevance); const evidence = await _pubmed.fetchAndLoadByIds(conn, row.evidence); diff --git a/src/cancergenomeinterpreter/index.js b/src/cancergenomeinterpreter/index.js index d07638f..42ebf0e 100644 --- a/src/cancergenomeinterpreter/index.js +++ b/src/cancergenomeinterpreter/index.js @@ -1,9 +1,6 @@ const fs = require('fs'); -const { parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { loadDelimToJson, @@ -220,7 +217,7 @@ const processVariants = async ({ conn, row, source }) => { } if (genomic && !isCat) { - const parsed = parseVariant(genomic).toJSON(); + const parsed = jsonifyVariant(parseVariant(genomic)); const reference1 = await conn.getUniqueRecordBy({ filters: { AND: [ @@ -245,7 +242,7 @@ const processVariants = async ({ conn, row, source }) => { } if (protein && !isCat) { - const parsed = parseVariant(`${gene}:${protein.split(':')[1]}`).toJSON(); + const parsed = jsonifyVariant(parseVariant(`${gene}:${protein.split(':')[1]}`)); const type = await conn.getVocabularyTerm(parsed.type); proteinVariant = await conn.addVariant({ content: { ...parsed, reference1: rid(gene1Record), type }, @@ -254,7 +251,7 @@ const processVariants = async ({ conn, row, source }) => { }); } if (transcript && cds && !isCat) { - const parsed = parseVariant(`${transcript}:${cds}`).toJSON(); + const parsed = jsonifyVariant(parseVariant(`${transcript}:${cds}`)); const reference1 = await conn.getUniqueRecordBy({ filters: { AND: [{ biotype: 'transcript' }, { sourceId: transcript }, { sourceIdVersion: null }] }, sort: orderPreferredOntologyTerms, @@ -268,7 +265,7 @@ const processVariants = async ({ conn, row, source }) => { }); } if (exonic && !isCat) { - const parsed = parseVariant(`${gene}:${exonic}`).toJSON(); + const parsed = jsonifyVariant(parseVariant(`${gene}:${exonic}`)); const type = await conn.getVocabularyTerm(parsed.type); exonicVariant = await conn.addVariant({ content: { ...parsed, reference1: rid(gene1Record), type }, diff --git a/src/cancerhotspots/index.js b/src/cancerhotspots/index.js index e048be4..54c8b9b 100644 --- a/src/cancerhotspots/index.js +++ b/src/cancerhotspots/index.js @@ -5,10 +5,7 @@ const fs = require('fs'); const csv = require('fast-csv'); -const { parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { convertRowFields, @@ -104,7 +101,7 @@ const processVariants = async ({ conn, record, source }) => { // deletion notation = `${notation}${start}_${stop}del${refSeq}`; } - const variant = parseVariant(notation).toJSON(); + const variant = jsonifyVariant(parseVariant(notation)); variant.reference1 = rid(reference1); variant.type = rid(await conn.getVocabularyTerm(variant.type)); @@ -128,10 +125,10 @@ const processVariants = async ({ conn, record, source }) => { [reference1] = await _entrezGene.fetchAndLoadByIds(conn, [geneId]); featureCache[geneId] = reference1; } - const variant = parseVariant( + const variant = jsonifyVariant(parseVariant( protein.replace(/fs\*\?$/, 'fs'), // ignore uncertain truncations false, - ).toJSON(); + )); variant.reference1 = rid(reference1); variant.type = rid(await conn.getVocabularyTerm(variant.type)); proteinVariant = rid(await conn.addVariant({ @@ -166,7 +163,7 @@ const processVariants = async ({ conn, record, source }) => { featureCache[transcriptId] = reference1; } // parse the cds variant - const variant = parseVariant(cds, false).toJSON(); + const variant = jsonifyVariant(parseVariant(cds, false)); variant.reference1 = reference1; variant.type = rid(await conn.getVocabularyTerm(variant.type)); diff --git a/src/cgl/index.js b/src/cgl/index.js index 56cca0d..7881af6 100644 --- a/src/cgl/index.js +++ b/src/cgl/index.js @@ -1,6 +1,6 @@ const fs = require('fs'); -const { parseVariant } = require('@bcgsc-pori/graphkb-parser'); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { loadDelimToJson, @@ -50,7 +50,7 @@ const loadCdsVariant = async (graphkbConn, transcriptId, cdsNotation) => { variant.reference1 = reference1; variant.type = rid(await graphkbConn.getVocabularyTerm(variant.type)); const cds = rid(await graphkbConn.addVariant({ - content: { ...variant }, + content: { ...jsonifyVariant(variant) }, existsOk: true, target: 'PositionalVariant', })); @@ -91,7 +91,7 @@ const loadProteinVariant = async (graphkbConn, gene, proteinNotation) => { variant.reference1 = reference1; variant.type = rid(await graphkbConn.getVocabularyTerm(variant.type)); const protein = rid(await graphkbConn.addVariant({ - content: { ...variant }, + content: { ...jsonifyVariant(variant) }, existsOk: true, target: 'PositionalVariant', })); @@ -167,7 +167,7 @@ const loadGenomicVariant = async (graphkbConn, chromosome, position, ref, alt) = variant.reference1 = reference1; variant.type = rid(await graphkbConn.getVocabularyTerm(variant.type)); const genomic = rid(await graphkbConn.addVariant({ - content: { ...variant, assembly: 'hg19' }, + content: { ...jsonifyVariant(variant), assembly: 'hg19' }, existsOk: true, target: 'PositionalVariant', })); diff --git a/src/civic/variant.js b/src/civic/variant.js index 346a3a2..684197e 100644 --- a/src/civic/variant.js +++ b/src/civic/variant.js @@ -1,14 +1,16 @@ -const { ErrorMixin, ParsingError, parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); +const { + ErrorMixin, + jsonifyVariant, + parseVariant, + ParsingError, +} = require('@bcgsc-pori/graphkb-parser'); + const { rid } = require('../graphkb'); const _entrezGene = require('../entrez/gene'); const _snp = require('../entrez/snp'); const { civic: SOURCE_DEFN } = require('../sources'); const { logger } = require('../logging'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); - class NotImplementedError extends ErrorMixin { } const VARIANT_CACHE = new Map(); @@ -523,7 +525,7 @@ const uploadVariant = async (conn, normalizedVariant) => { let content = {}; if (normalizedVariant.positional) { - content = parseVariant(normalizedVariant.variant, false).toJSON(); + content = jsonifyVariant(parseVariant(normalizedVariant.variant, false)); } // Variant type diff --git a/src/cosmic/resistance.js b/src/cosmic/resistance.js index 1570830..881b04e 100644 --- a/src/cosmic/resistance.js +++ b/src/cosmic/resistance.js @@ -3,10 +3,7 @@ */ const fs = require('fs'); -const { parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { loadDelimToJson, @@ -80,7 +77,7 @@ const processVariants = async ({ conn, record, source }) => { try { // add the protein variant with its protein translation - const variant = parseVariant(record.protein, false).toJSON(); + const variant = jsonifyVariant(parseVariant(record.protein, false)); variant.type = rid(await conn.getVocabularyTerm(variant.type)); const reference1 = rid(await _ensembl.fetchAndLoadById( @@ -116,7 +113,7 @@ const processVariants = async ({ conn, record, source }) => { // create the cds variant if (record.cds && record.cds.trim()) { try { - const variant = parseVariant(record.cds, false).toJSON(); + const variant = jsonifyVariant(parseVariant(record.cds, false)); // get the ensembl transcript const reference1 = rid(await _ensembl.fetchAndLoadById( conn, @@ -146,7 +143,7 @@ const processVariants = async ({ conn, record, source }) => { // add the genomic representation if (record.genomic) { try { - const variant = parseVariant(record.genomic, false).toJSON(); + const variant = jsonifyVariant(parseVariant(record.genomic, false)); // get the chromosome const reference1 = rid(await conn.getUniqueRecordBy({ filters: { diff --git a/src/docm/index.js b/src/docm/index.js index 0873210..c4693ee 100644 --- a/src/docm/index.js +++ b/src/docm/index.js @@ -6,10 +6,7 @@ const Ajv = require('ajv'); const fs = require('fs'); -const { parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { checkSpec, request } = require('../util'); const { @@ -110,7 +107,7 @@ const processVariants = async ({ conn, source, record: docmRecord }) => { try { // create the protein variant const [reference1] = await _gene.fetchAndLoadBySymbol(conn, gene); - let variant = parseVariant(parseDocmVariant(aminoAcid), false).toJSON(); + let variant = jsonifyVariant(parseVariant(parseDocmVariant(aminoAcid), false)); const type = await conn.getVocabularyTerm(variant.type); protein = variant = await conn.addVariant({ content: { ...variant, reference1: rid(reference1), type: rid(type) }, @@ -124,7 +121,7 @@ const processVariants = async ({ conn, source, record: docmRecord }) => { try { // create the genomic variant - let variant = parseVariant(buildGenomicVariant(docmRecord), false).toJSON(); + let variant = jsonifyVariant(parseVariant(buildGenomicVariant(docmRecord), false)); const type = await conn.getVocabularyTerm(variant.type); const reference1 = await conn.getUniqueRecordBy({ filters: { diff --git a/src/entrez/snp.js b/src/entrez/snp.js index 362ac3f..5d17d27 100644 --- a/src/entrez/snp.js +++ b/src/entrez/snp.js @@ -1,6 +1,6 @@ const Ajv = require('ajv'); -const { parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { checkSpec } = require('../util'); const { fetchByIdList, uploadRecord, preLoadCache: preLoadAnyCache, BASE_FETCH_URL, @@ -10,10 +10,6 @@ const entrezGene = require('./gene'); const { rid } = require('../graphkb'); const { logger } = require('../logging'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); - const ajv = new Ajv(); const { dbSnp: SOURCE_DEFN } = require('../sources'); @@ -52,7 +48,7 @@ const loadFromDocsumHgvs = async (api, hgvsVariants) => { try { if (hgvsVariants.cds) { - const parsed = parseVariant(hgvsVariants.cds.split('|')[0], true).toJSON(); + const parsed = jsonifyVariant(parseVariant(hgvsVariants.cds.split('|')[0], true)); const [transcript] = await refseq.fetchAndLoadByIds(api, [parsed.reference1]); const type = await api.getVocabularyTerm(parsed.type); cds = await api.addVariant({ @@ -68,7 +64,7 @@ const loadFromDocsumHgvs = async (api, hgvsVariants) => { try { if (hgvsVariants.protein) { const gene = hgvsVariants.protein.split('|').find(p => p.startsWith('GENE=')); - const parsed = parseVariant(hgvsVariants.protein.split('|')[0], true).toJSON(); + const parsed = jsonifyVariant(parseVariant(hgvsVariants.protein.split('|')[0], true)); const [reference1] = await refseq.fetchAndLoadByIds(api, [parsed.reference1]); const type = await api.getVocabularyTerm(parsed.type); protein = await api.addVariant({ diff --git a/src/moa/index.js b/src/moa/index.js index df50c4d..1ba0fd3 100644 --- a/src/moa/index.js +++ b/src/moa/index.js @@ -1,9 +1,6 @@ const Ajv = require('ajv'); -const { parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { checkSpec, requestWithRetry } = require('../util'); const { moa: SOURCE_DEFN } = require('../sources'); @@ -62,7 +59,7 @@ const loadSmallMutation = async (conn, gene, moaVariant) => { // create the genomic variant if we have the appropriate fields if (!['reference_allele', 'alternate_allele', 'start_position', 'end_position', 'chromosome'].some(v => moaVariant[v] === null)) { - const hgvsg = parseVariant(composeGenomicHgvs(moaVariant), false).toJSON(); + const hgvsg = jsonifyVariant(parseVariant(composeGenomicHgvs(moaVariant), false)); const chromosome = await conn.getUniqueRecordBy({ filters: { AND: [ @@ -88,7 +85,7 @@ const loadSmallMutation = async (conn, gene, moaVariant) => { // create the cds variant if (moaVariant.cdna_change !== null && moaVariant.cdna_change !== '') { - const hgvsc = parseVariant(moaVariant.cdna_change, false).toJSON(); + const hgvsc = jsonifyVariant(parseVariant(moaVariant.cdna_change, false)); const cdsType = rid(await conn.getVocabularyTerm(hgvsc.type)); cdsVariant = rid(await conn.addVariant({ content: { @@ -101,7 +98,7 @@ const loadSmallMutation = async (conn, gene, moaVariant) => { // create the protein variant if (moaVariant.protein_change !== null && moaVariant.protein_change !== '') { - const hgvsp = parseVariant(moaVariant.protein_change, false).toJSON(); + const hgvsp = jsonifyVariant(parseVariant(moaVariant.protein_change, false)); const proteinType = rid(await conn.getVocabularyTerm(hgvsp.type)); proteinVariant = rid(await conn.addVariant({ content: { @@ -132,7 +129,7 @@ const loadSmallMutation = async (conn, gene, moaVariant) => { } else { variantType = await conn.getVocabularyTerm('mutation'); } - const parsed = parseVariant(`e.${exonNumber}mut`, false).toJSON(); + const parsed = jsonifyVariant(parseVariant(`e.${exonNumber}mut`, false)); exonVariant = await conn.addVariant({ content: { ...parsed, diff --git a/src/oncokb/index.js b/src/oncokb/index.js index a649849..2d132ba 100644 --- a/src/oncokb/index.js +++ b/src/oncokb/index.js @@ -5,10 +5,7 @@ const Ajv = require('ajv'); const fs = require('fs'); const path = require('path'); -const { ParsingError, parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); +const { jsonifyVariant, parseVariant, ParsingError } = require('@bcgsc-pori/graphkb-parser'); const { checkSpec, @@ -279,11 +276,11 @@ const processVariant = async (conn, { if (!variant) { try { - variant = parseVariant(type, false).toJSON(); + variant = jsonifyVariant(parseVariant(type, false)); } catch (err) { try { // try with adding a p prefix also - variant = parseVariant(`p.${type}`, false).toJSON(); + variant = jsonifyVariant(parseVariant(`p.${type}`, false)); } catch (err2) { } logger.warn(`failed to parse the variant (${type}) for record (gene=${gene}, variant=${variantName})`); throw err; @@ -330,7 +327,7 @@ const processVariant = async (conn, { try { // try with adding a p prefix also - const parsed = parseVariant(altVariantName, false).toJSON(); + const parsed = jsonifyVariant(parseVariant(altVariantName, false)); parsed.reference1 = rid(reference1); parsed.type = rid(await getVocabulary(conn, parsed.type)); const altVariant = rid(await conn.addVariant({ diff --git a/src/util.js b/src/util.js index 3223871..0a4a682 100644 --- a/src/util.js +++ b/src/util.js @@ -225,49 +225,6 @@ const convertRowFields = (header, row) => { return result; }; -/** - * Decorator function to add toJSON() method to parseVariant returned object - * (from graphkb-parser v1 not avail. anymore in v2.1.1) - */ -function parseVariantDecorator(parseVariant) { - // Method - function toJSON() { - const positionToJSON = (position) => { - const json = {}; - - for (const [attr, value] of Object.entries(position)) { - if (value !== null && !['prefix', 'longRefAA'].includes(attr)) { - json[attr] = value; - } - } - return json; - }; - - const json = {}; - const IGNORE = ['prefix', 'multiFeature', 'noFeatures', 'notationType', 'toJSON']; - - for (const [attr, value] of Object.entries(this)) { - if (value !== undefined && !IGNORE.includes(attr)) { - if (value.pos) { - json[attr] = positionToJSON(value); - } else { - json[attr] = value; - } - } - } - return json; - } - - return function (...args) { - const result = parseVariant(...args); - - if (!('toJSON' in result) || typeof result.toJSON !== 'function') { - result.toJSON = toJSON; - } - return result; - }; -} - module.exports = { checkSpec, @@ -278,7 +235,6 @@ module.exports = { loadDelimToJson, loadXmlToJson, logger, - parseVariantDecorator, parseXmlToJson, request, requestWithRetry, diff --git a/src/variants/index.js b/src/variants/index.js index c2aa2a5..8b20c57 100644 --- a/src/variants/index.js +++ b/src/variants/index.js @@ -1,14 +1,10 @@ const fs = require('fs'); -const { parseVariant: parseVariantOriginal } = require('@bcgsc-pori/graphkb-parser'); +const { jsonifyVariant, parseVariant } = require('@bcgsc-pori/graphkb-parser'); const { logger } = require('../logging'); const { orderPreferredOntologyTerms, rid } = require('../graphkb'); const { fetchAndLoadBySymbol } = require('../entrez/gene'); -const { parseVariantDecorator } = require('../util'); - -const parseVariant = parseVariantDecorator(parseVariantOriginal); - const getEntrezGene = async (conn, name) => { try { @@ -51,7 +47,7 @@ const uploadFile = async (opt) => { logger.info(`loading ${variant}`); try { - const parsed = parseVariant(variant, true).toJSON(); + const parsed = jsonifyVariant(parseVariant(variant, true)); const variantType = await conn.getVocabularyTerm(parsed.type); const reference1 = await getEntrezGene(conn, parsed.reference1);