From aca92bc7bd14ece590ab11bef569b5189e67ed73 Mon Sep 17 00:00:00 2001 From: Sun-Young Kim Date: Wed, 28 Jan 2026 07:54:51 -0600 Subject: [PATCH] chore(gnomad): bump version to 4.1.1 --- .../human-result/human-result.component.html | 8 +++-- client/src/app/services/api.service.ts | 2 +- server/app.js | 2 ++ server/config/index.js | 20 ++++++++++++- server/controllers/gnomAD.controller.js | 12 ++++++-- server/models/gnomAD.model.js | 3 +- server/models/gnomADGene.model.js | 3 +- server/utils/db/gnomAD.js | 29 +++++++++++++++++++ 8 files changed, 69 insertions(+), 10 deletions(-) diff --git a/client/src/app/components/pages/human-result/human-result.component.html b/client/src/app/components/pages/human-result/human-result.component.html index 9b6eb94..260450a 100644 --- a/client/src/app/components/pages/human-result/human-result.component.html +++ b/client/src/app/components/pages/human-result/human-result.component.html @@ -206,17 +206,19 @@

gnomAD

- Population Allele Frequencies of {{ variantString }} from gnomAD + Population Allele Frequencies of + Chr{{ hg38Variant.chr }}:{{ hg38Variant.pos }} {{ hg38Variant.ref }}>{{ hg38Variant.alt }} + from gnomAD

- +
diff --git a/client/src/app/services/api.service.ts b/client/src/app/services/api.service.ts index afd6356..4406d28 100644 --- a/client/src/app/services/api.service.ts +++ b/client/src/app/services/api.service.ts @@ -108,7 +108,7 @@ export class ApiService { } getGnomADVaraint(variant: Variant): Observable { - const url = `${environment.apiHost}/data/gnomAD/variant/${variant.chr}:${variant.pos}${variant.ref}>${variant.alt}`; + const url = `${environment.apiHost}/data/gnomAD/variant/${variant.chr}:${variant.pos}${variant.ref}>${variant.alt}?build=${variant.build || 'hg19'}`; return new Observable(observer => { this.http.get(url).subscribe((res: any) => { res = res || {}; diff --git a/server/app.js b/server/app.js index 9075cdc..90e0f73 100644 --- a/server/app.js +++ b/server/app.js @@ -66,6 +66,8 @@ console.log(`Running @ ${config.env}`); console.log(`DECIPHER control data using collection ${config.decipher.control.name}`); console.log(`DECIPEHR disease data using collection ${config.decipher.disease.name}`); console.log(`DECIPHER disease access is restricted to ${config.decipher.disease.allowedReferer}`); +console.log(`gnomAD data using version ${config.gnomad.version} ` + + `(collections: ${config.gnomad.variant.name}, ${config.gnomad.gene.name})`); const httpServer = http.createServer(app); // Mongoose diff --git a/server/config/index.js b/server/config/index.js index 58a4ffe..89e2692 100644 --- a/server/config/index.js +++ b/server/config/index.js @@ -21,6 +21,9 @@ const config = { version: process.env.DECIPHER_DISEASE_VERSION, name: `DECIPHERDisease${process.env.DECIPHER_DISEASE_VERSION ? `.${process.env.DECIPHER_DISEASE_VERSION}` : ''}` } + }, + gnomad: { + version: process.env.GNOMAD_VERSION || '2.1.1', } }, @@ -41,6 +44,9 @@ const config = { version: process.env.DECIPHER_DISEASE_VERSION, name: `DECIPHERDisease${process.env.DECIPHER_DISEASE_VERSION ? `.${process.env.DECIPHER_DISEASE_VERSION}` : ''}` } + }, + gnomad: { + version: process.env.GNOMAD_VERSION || '2.1.1', } }, @@ -72,7 +78,19 @@ config[env].mongo.url = `mongodb://${config[env].mongo.username}:${config[env].m }/${config[env].mongo.database}`; config[env].omim = require(path.join(rootPath, 'config/omim', `${env}.json`)); - +config[env].gnomad.variant = { + name: + config[env].gnomad.version === '2.1.1' + ? 'GnomAD' + : `Gnomad.${config[env].gnomad.version}`, + defaultBuild: config[env].gnomad.version === '2.1.1' ? 'hg19' : 'hg38', +}; +config[env].gnomad.gene = { + name: + config[env].gnomad.version === '2.1.1' + ? 'GnomADGene' + : `GnomadGene.${config[env].gnomad.version}`, +}; config[env].liftover = { hg38Version: process.env.LIFTOVER_HG38_VERSION || 'hg38_201312', hg19Version: process.env.LIFTOVER_HG19_VERSION || 'hg19_200902', diff --git a/server/controllers/gnomAD.controller.js b/server/controllers/gnomAD.controller.js index 2e7d250..5e0b863 100644 --- a/server/controllers/gnomAD.controller.js +++ b/server/controllers/gnomAD.controller.js @@ -2,6 +2,7 @@ const GnomAD = require('../models/gnomAD.model'); const utils = require('../utils'); const db = require('../utils/db'); +const config = require('../config'); // eslint-disable-next-line no-unused-vars const replace = (doc) => { @@ -21,13 +22,18 @@ exports.findByVariant = (req, res) => { return res.status(404).send({ message: 'Invalid variant' }); } - db.gnomAD.getByVariant(variant, null, build) + const majorVersion = config.gnomad.version.split('.')[0] || '2'; + (majorVersion === '2' + ? db.gnomAD.getByVariant(variant, null, build) + : db.gnomAD.getByVariantV2(variant, null, build) + ) .then((doc) => { return res.json(doc); - }).catch((err) => { + }) + .catch((err) => { console.log(err); return res.status(500).send({ - message: 'Server error occured' + message: 'Server error occured', }); }); }; diff --git a/server/models/gnomAD.model.js b/server/models/gnomAD.model.js index 1975e14..a602c6e 100644 --- a/server/models/gnomAD.model.js +++ b/server/models/gnomAD.model.js @@ -1,4 +1,5 @@ const mongoose = require('mongoose'); +const config = require('../config'); const gnomADSchema = mongoose.Schema({ chr: { @@ -25,5 +26,5 @@ const gnomADSchema = mongoose.Schema({ type: Number, select: false } -}, { collection: 'GnomAD' }); +}, { collection: config.gnomad.variant.name }); module.exports = mongoose.model('GnomAD', gnomADSchema); diff --git a/server/models/gnomADGene.model.js b/server/models/gnomADGene.model.js index 40c3c1e..45a835c 100644 --- a/server/models/gnomADGene.model.js +++ b/server/models/gnomADGene.model.js @@ -1,5 +1,6 @@ const mongoose = require('mongoose'); const ObjectId = mongoose.Schema.Types.ObjectId; +const config = require('../config'); const gnomADGeneSchema = mongoose.Schema({ geneId: { @@ -16,5 +17,5 @@ const gnomADGeneSchema = mongoose.Schema({ type: Number, select: false } -}, { collection: 'GnomADGene' }); +}, { collection: config.gnomad.gene.name }); module.exports = mongoose.model('GnomADGene', gnomADGeneSchema); diff --git a/server/utils/db/gnomAD.js b/server/utils/db/gnomAD.js index 6f02c41..a8670ce 100644 --- a/server/utils/db/gnomAD.js +++ b/server/utils/db/gnomAD.js @@ -96,3 +96,32 @@ exports.getByVariant = (variant, projection, build) => { }); }; +// Query by hg38 for newer version for gnomAD (v3+) +exports.getByVariantV2 = async (variant, projection, build) => { + projection = projection || {}; + projection['_id'] = 0; + + if (build === 'hg19') { + // need to liftOver to hg38 + try { + variant = await utils.liftover.liftOverVariant(variant, 'hg19', 'hg38'); + } catch (err) { + console.error('Error while liftOver hg19 to hg38 for getByVariantV2', err); + return null; + } + } + if (!variant || !variant.ref || !variant.alt) { + console.error('Error: liftOver returned null variant for getByVariantV2'); + return null; + } + + return GnomAD.findOne( + { + hg38Chr: variant.chr, + hg38Pos: variant.pos, + ref: variant.ref, + alt: variant.alt, + }, + projection + ).lean(); +};