From f7ecf88b37b276d548b04a9323f42f92a3d6b9e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 24 Apr 2025 15:13:21 +0200 Subject: [PATCH 01/10] lib: add ACMG annotation, #TASK-7626, #TASK-7549 --- .../annotation/VariantAnnotationCalculator.java | 14 +++++++++++++- .../impl/core/VariantAnnotationCalculatorTest.java | 8 ++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java index 1b86b49367..fea5f70337 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java @@ -18,13 +18,15 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.opencb.biodata.models.clinical.ClinicalAcmg; +import org.opencb.biodata.models.clinical.interpretation.VariantClassification; import org.opencb.biodata.models.core.*; import org.opencb.biodata.models.pharma.PharmaChemical; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.VariantBuilder; import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; -import org.opencb.biodata.models.variant.avro.GeneCancerAssociation; import org.opencb.biodata.models.variant.avro.*; +import org.opencb.biodata.models.variant.avro.GeneCancerAssociation; import org.opencb.biodata.tools.variant.VariantNormalizer; import org.opencb.biodata.tools.variant.exceptions.VariantNormalizerException; import org.opencb.cellbase.core.ParamConstants; @@ -680,6 +682,16 @@ private List runAnnotationProcess(List normalizedVar // Not needed with newCachedThreadPool // fixedThreadPool.shutdown(); + // ACMG + for (VariantAnnotation variantAnnotation : variantAnnotationList) { + for (ConsequenceType consequenceType : variantAnnotation.getConsequenceTypes()) { + List acmgs = VariantClassification.calculateAcmgClassification(consequenceType, variantAnnotation, null); + if (CollectionUtils.isNotEmpty(acmgs)) { + consequenceType.setAcmg(acmgs.stream().map(ClinicalAcmg::getClassification).collect(Collectors.toList())); + } + } + } + logger.debug("Total batch annotation performance is {}ms for {} variants", System.currentTimeMillis() - globalStartTime, normalizedVariantList.size()); return variantAnnotationList; diff --git a/cellbase-lib/src/test/java/org/opencb/cellbase/lib/impl/core/VariantAnnotationCalculatorTest.java b/cellbase-lib/src/test/java/org/opencb/cellbase/lib/impl/core/VariantAnnotationCalculatorTest.java index b973f0b996..6f835a8f04 100644 --- a/cellbase-lib/src/test/java/org/opencb/cellbase/lib/impl/core/VariantAnnotationCalculatorTest.java +++ b/cellbase-lib/src/test/java/org/opencb/cellbase/lib/impl/core/VariantAnnotationCalculatorTest.java @@ -457,14 +457,14 @@ public void testImpreciseConsequenceTypeAnnotation() throws Exception { assertThat(consequenceTypeResult.getResults(), CoreMatchers.hasItems(new ConsequenceType("FAM138A", "ENSG00000237613", "ENST00000417324", "ENSG00000237613", - "ENST00000417324", null, "-", "lincRNA", "ensembl", null, null, + "ENST00000417324", null, "-", "lincRNA", "ensembl", null, null, null, Arrays.asList("basic"), null, null, null, null, Arrays.asList(new SequenceOntologyTerm("SO:0001889", "transcript_amplification"))), new ConsequenceType("FAM138A", "ENSG00000237613", "ENST00000461467", "ENSG00000237613", "ENST00000461467", null, "-", "lincRNA", "ensembl", null, null, - null, null, null, + null, null, null, null, null, null, Arrays.asList(new SequenceOntologyTerm("SO:0001889", "transcript_amplification"))))); @@ -500,13 +500,13 @@ public void testImpreciseConsequenceTypeAnnotation() throws Exception { assertThat(consequenceTypeResult.getResults(), CoreMatchers.hasItems(new ConsequenceType("FAM138A", "ENSG00000237613", "ENST00000417324", "ENSG00000237613", - "ENST00000417324", null, "-", "lincRNA", "ensembl", null, null, + "ENST00000417324", null, "-", "lincRNA", "ensembl", null, null, null, Arrays.asList("basic"), null, null, null, null, Arrays.asList(new SequenceOntologyTerm("SO:0001893", "transcript_ablation"))), new ConsequenceType("FAM138A", "ENSG00000237613", "ENST00000461467", "ENSG00000237613", - "ENST00000461467", null, "-", "lincRNA", "ensembl", null, null, + "ENST00000461467", null, "-", "lincRNA", "ensembl", null, null, null, null, null, null, null, null, Arrays.asList(new SequenceOntologyTerm("SO:0001893", "transcript_ablation"))))); From 809ba1f008576dbd9cfcab88ebcb146e39b302b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 25 Apr 2025 14:03:22 +0200 Subject: [PATCH 02/10] lib: include genomic sequence context for INDELs, #TASK-7627, #TASK-7549 --- .../VariantAnnotationCalculator.java | 23 +++- ...FutureGenomicSequenceContextAnnotator.java | 103 ++++++++++++++++++ checkstyle.xml | 2 +- 3 files changed, 121 insertions(+), 7 deletions(-) create mode 100644 cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java index fea5f70337..5d96efbb39 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java @@ -41,6 +41,7 @@ import org.opencb.cellbase.lib.EtlCommons; import org.opencb.cellbase.lib.managers.*; import org.opencb.cellbase.lib.variant.VariantAnnotationUtils; +import org.opencb.cellbase.lib.variant.annotation.futures.FutureGenomicSequenceContextAnnotator; import org.opencb.cellbase.lib.variant.annotation.futures.FuturePharmacogenomicsAnnotator; import org.opencb.cellbase.lib.variant.annotation.futures.FutureSnpAnnotator; import org.opencb.cellbase.lib.variant.annotation.futures.FutureSpliceScoreAnnotator; @@ -534,6 +535,10 @@ private List runAnnotationProcess(List normalizedVar pharmacogenomicsFuture = CACHED_THREAD_POOL.submit(futurePharmacogenomicsAnnotator); } + FutureGenomicSequenceContextAnnotator contextAnnotator = new FutureGenomicSequenceContextAnnotator(normalizedVariantList, + dataRelease.getRelease(), genomeManager); + Future> contextFuture = CACHED_THREAD_POOL.submit(contextAnnotator); + // We iterate over all variants to get the rest of the annotations and to create the VariantAnnotation objects Queue variantBuffer = new LinkedList<>(); long startTime = System.currentTimeMillis(); @@ -678,16 +683,22 @@ private List runAnnotationProcess(List normalizedVar if (futurePharmacogenomicsAnnotator != null) { futurePharmacogenomicsAnnotator.processResults(pharmacogenomicsFuture, variantAnnotationList); } + contextAnnotator.processResults(contextFuture, variantAnnotationList); // Not needed with newCachedThreadPool // fixedThreadPool.shutdown(); - // ACMG - for (VariantAnnotation variantAnnotation : variantAnnotationList) { - for (ConsequenceType consequenceType : variantAnnotation.getConsequenceTypes()) { - List acmgs = VariantClassification.calculateAcmgClassification(consequenceType, variantAnnotation, null); - if (CollectionUtils.isNotEmpty(acmgs)) { - consequenceType.setAcmg(acmgs.stream().map(ClinicalAcmg::getClassification).collect(Collectors.toList())); + // ACMG, only if consequence type is required + if (annotatorSet.contains("consequenceType")) { + for (VariantAnnotation variantAnnotation : variantAnnotationList) { + if (variantAnnotation != null && CollectionUtils.isNotEmpty(variantAnnotation.getConsequenceTypes())) { + for (ConsequenceType consequenceType : variantAnnotation.getConsequenceTypes()) { + List acmgs = VariantClassification.calculateAcmgClassification(consequenceType, variantAnnotation, + null); + if (CollectionUtils.isNotEmpty(acmgs)) { + consequenceType.setAcmg(acmgs.stream().map(ClinicalAcmg::getClassification).collect(Collectors.toList())); + } + } } } } diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java new file mode 100644 index 0000000000..4a11f7eecd --- /dev/null +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java @@ -0,0 +1,103 @@ +/* + * Copyright 2015-2020 OpenCB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.opencb.cellbase.lib.variant.annotation.futures; + +import org.apache.commons.collections4.CollectionUtils; +import org.opencb.biodata.models.core.GenomeSequenceFeature; +import org.opencb.biodata.models.core.Region; +import org.opencb.biodata.models.variant.Variant; +import org.opencb.biodata.models.variant.avro.GenomicSequenceContext; +import org.opencb.biodata.models.variant.avro.VariantAnnotation; +import org.opencb.biodata.models.variant.avro.VariantType; +import org.opencb.cellbase.lib.managers.GenomeManager; +import org.opencb.commons.datastore.core.QueryOptions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.*; + +public class FutureGenomicSequenceContextAnnotator implements Callable> { + + // The context length is: [CONTEX_SIZE <- variant.start -> CONTEXT_SIZE] + private final int CONTEXT_SIZE = 10; + + private GenomeManager genomeManager; + + private List variantList; + private int dataRelease; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + public FutureGenomicSequenceContextAnnotator(List variantList, int dataRelease, GenomeManager genomeManager) { + this.genomeManager = genomeManager; + + this.variantList = variantList; + this.dataRelease = dataRelease; + } + + @Override + public List call() throws Exception { + long startTime = System.currentTimeMillis(); + + GenomicSequenceContext genomicSequenceContext; + List resultList = new ArrayList<>(variantList.size()); + + logger.debug("Genomic sequence context queries ..."); + // Want to return only one CellBaseDataResult object per Variant + for (Variant variant : variantList) { + genomicSequenceContext = null; + if (VariantType.SNV != variant.getType() && VariantType.SNP != variant.getType()) { + int start = variant.getStart() - CONTEXT_SIZE; + int end = variant.getEnd() + CONTEXT_SIZE; + Region region = new Region(variant.getChromosome(), start, end); + logger.debug("Region {} for the genomic sequence context query", region); + GenomeSequenceFeature genomeSequenceFeature = genomeManager.getSequence(region, QueryOptions.empty(), dataRelease).first(); + if (genomeSequenceFeature != null) { + genomicSequenceContext = new GenomicSequenceContext(genomeSequenceFeature.getStart(), genomeSequenceFeature.getEnd(), + genomeSequenceFeature.getSequence()); + } + logger.debug("Genomic sequence context = {}", genomicSequenceContext); + } + resultList.add(genomicSequenceContext); + } + logger.info("Genomic sequence context queries performance in {} ms for {} variants", + System.currentTimeMillis() - startTime, variantList.size()); + return resultList; + } + + public void processResults(Future> contextFuture, List variantAnnotationList) + throws InterruptedException, ExecutionException { + List contextResults; + try { + contextResults = contextFuture.get(30, TimeUnit.SECONDS); + } catch (TimeoutException e) { + contextFuture.cancel(true); + throw new ExecutionException("Unable to finish genomic sequence context query on time", e); + } + + if (CollectionUtils.isNotEmpty(contextResults)) { + for (int i = 0; i < variantAnnotationList.size(); i++) { + GenomicSequenceContext context = contextResults.get(i); + if (context != null) { + variantAnnotationList.get(i).setGenomicSequenceContext(context); + } + } + } + } +} diff --git a/checkstyle.xml b/checkstyle.xml index 7591a7a795..cf524ad54f 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -57,7 +57,7 @@ - + From d0c8e80a8040a2f53fab5dc7f273c597cce2d438 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 29 May 2025 12:26:23 +0200 Subject: [PATCH 03/10] lib: fix checkstyle, #TASK-7549 --- .../VariantAnnotationCalculator.java | 26 +++++++++++-------- checkstyle.xml | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java index 5d96efbb39..87d0b48d98 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java @@ -690,17 +690,7 @@ private List runAnnotationProcess(List normalizedVar // ACMG, only if consequence type is required if (annotatorSet.contains("consequenceType")) { - for (VariantAnnotation variantAnnotation : variantAnnotationList) { - if (variantAnnotation != null && CollectionUtils.isNotEmpty(variantAnnotation.getConsequenceTypes())) { - for (ConsequenceType consequenceType : variantAnnotation.getConsequenceTypes()) { - List acmgs = VariantClassification.calculateAcmgClassification(consequenceType, variantAnnotation, - null); - if (CollectionUtils.isNotEmpty(acmgs)) { - consequenceType.setAcmg(acmgs.stream().map(ClinicalAcmg::getClassification).collect(Collectors.toList())); - } - } - } - } + setAcmdPredictions(variantAnnotationList); } logger.debug("Total batch annotation performance is {}ms for {} variants", System.currentTimeMillis() @@ -708,6 +698,20 @@ private List runAnnotationProcess(List normalizedVar return variantAnnotationList; } + private static void setAcmdPredictions(List variantAnnotationList) { + for (VariantAnnotation variantAnnotation : variantAnnotationList) { + if (variantAnnotation != null && CollectionUtils.isNotEmpty(variantAnnotation.getConsequenceTypes())) { + for (ConsequenceType consequenceType : variantAnnotation.getConsequenceTypes()) { + List acmgs = VariantClassification.calculateAcmgClassification(consequenceType, variantAnnotation, + null); + if (CollectionUtils.isNotEmpty(acmgs)) { + consequenceType.setAcmg(acmgs.stream().map(ClinicalAcmg::getClassification).collect(Collectors.toList())); + } + } + } + } + } + public List getBatchGeneList(List variantList) throws QueryException, IllegalAccessException, CellBaseException { List regionList = variantListToRegionList(variantList); diff --git a/checkstyle.xml b/checkstyle.xml index cf524ad54f..7591a7a795 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -57,7 +57,7 @@ - + From ad2788c4fd80083260a301944cfae07a11c1f817 Mon Sep 17 00:00:00 2001 From: JuanfeSanahuja Date: Fri, 27 Jun 2025 11:05:56 +0200 Subject: [PATCH 04/10] Added org param in docker build #TASK-7549 --- cellbase-app/app/cloud/docker/docker-build.py | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/cellbase-app/app/cloud/docker/docker-build.py b/cellbase-app/app/cloud/docker/docker-build.py index dd3d12f254..778c3a5d79 100755 --- a/cellbase-app/app/cloud/docker/docker-build.py +++ b/cellbase-app/app/cloud/docker/docker-build.py @@ -17,6 +17,7 @@ parser.add_argument('--build-folder', help="the location of the build folder, if not default location") parser.add_argument('--username', help="credentials for dockerhub (REQUIRED if deleting from DockerHub)") parser.add_argument('--password', help="credentials for dockerhub (REQUIRED if deleting from DockerHub)") +parser.add_argument('--org', help="Docker organization", default="opencb") ## Some ANSI colors to print shell output shell_colors = { @@ -62,31 +63,31 @@ def build(): print_header('Building docker images: ' + ', '.join(images)) for image in images: print() - print(shell_colors['blue'] + "Building opencb/cellbase-" + image + ":" + tag + " ..." + shell_colors['reset']) + print(shell_colors['blue'] + "Building " + org + "/cellbase-" + image + ":" + tag + " ..." + shell_colors['reset']) if image == "base": - run("docker build -t opencb/cellbase-" + image + ":" + tag + " -f " + build_folder + "/cloud/docker/cellbase-" + image + "/Dockerfile " + build_folder) + run("docker build -t " + org + "/cellbase-" + image + ":" + tag + " -f " + build_folder + "/cloud/docker/cellbase-" + image + "/Dockerfile " + build_folder) else: - run("docker build -t opencb/cellbase-" + image + ":" + tag + " -f " + build_folder + "/cloud/docker/cellbase-" + image + "/Dockerfile --build-arg TAG=" + tag + " " + build_folder) + run("docker build -t " + org + "/cellbase-" + image + ":" + tag + " -f " + build_folder + "/cloud/docker/cellbase-" + image + "/Dockerfile --build-arg TAG=" + tag + " " + build_folder) def tag_latest(image): - latest_tag = os.popen(("curl -s https://registry.hub.docker.com/v1/repositories/opencb/cellbase-" + image + "/tags" + latest_tag = os.popen(("curl -s https://registry.hub.docker.com/v1/repositories/" + org + "/cellbase-" + image + "/tags" + " | jq -r .[].name" + " | grep -v latest" + " | sort -h" + " | head")) if tag >= latest_tag.read(): - print(shell_colors['blue'] + "Pushing opencb/cellbase-" + image + ":latest" + shell_colors['reset']) - run("docker tag opencb/cellbase-" + image + ":" + tag + " opencb/cellbase-" + image + ":latest") - run("docker push opencb/cellbase-" + image + ":latest") + print(shell_colors['blue'] + "Pushing " + org + "/cellbase-" + image + ":latest" + shell_colors['reset']) + run("docker tag " + org + "/cellbase-" + image + ":" + tag + " " + org + "/cellbase-" + image + ":latest") + run("docker push " + org + "/cellbase-" + image + ":latest") def push(): print_header('Pushing to DockerHub: ' + ', '.join(images)) for i in images: print() - print(shell_colors['blue'] + "Pushing opencb/cellbase-" + i + ":" + tag + " ..." + shell_colors['reset']) - run("docker push opencb/cellbase-" + i + ":" + tag) + print(shell_colors['blue'] + "Pushing " + org + "/cellbase-" + i + ":" + tag + " ..." + shell_colors['reset']) + run("docker push " + org + "/cellbase-" + i + ":" + tag) tag_latest(i) @@ -104,11 +105,11 @@ def delete(): error("dockerhub login failed") for i in images: print() - print(shell_colors['blue'] + 'Deleting image on Docker hub for opencb/cellbase-' + i + ':' + tag + shell_colors['reset']) + print(shell_colors['blue'] + 'Deleting image on Docker hub for ' + org + '/cellbase-' + i + ':' + tag + shell_colors['reset']) headers = { 'Authorization': 'JWT ' + json_response["token"] } - requests.delete('https://hub.docker.com/v2/repositories/opencb/cellbase-' + i + '/tags/' + tag + '/', headers=headers) + requests.delete('https://hub.docker.com/v2/repositories/' + org + '/cellbase-' + i + '/tags/' + tag + '/', headers=headers) ## Parse command-line parameters and init basedir, tag and build_folder @@ -144,6 +145,11 @@ def delete(): else: images = args.images.split(",") +# 5. Set docker org to default value if not set +if args.org is not None: + org = args.org +else: + org = "opencb" ## Execute the action if args.action == "build": From ee9470b7197e15cf3147a877ac20ed4aa46e7d16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 11 Jul 2025 11:19:49 +0200 Subject: [PATCH 05/10] pom: upgrade biodata and java-commons-lib versions, #TASK-7549 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9f0c8d7c50..16da9da7f2 100644 --- a/pom.xml +++ b/pom.xml @@ -23,8 +23,8 @@ ${project.version} - 5.5.0-SNAPSHOT - 3.5.0-SNAPSHOT + 7.0.0-SNAPSHOT + 5.0.0-SNAPSHOT 0.1.0 2.11.4 1.9.13 From 17774801650671f08a2d218cf93660a00bdb6385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 10 Sep 2025 11:00:38 +0200 Subject: [PATCH 06/10] lib: fix the position 'end' for the genomic sequence context, #TASK-7627, #TASK-7549 --- .../futures/FutureGenomicSequenceContextAnnotator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java index 4a11f7eecd..260a704bb9 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java @@ -64,7 +64,7 @@ public List call() throws Exception { genomicSequenceContext = null; if (VariantType.SNV != variant.getType() && VariantType.SNP != variant.getType()) { int start = variant.getStart() - CONTEXT_SIZE; - int end = variant.getEnd() + CONTEXT_SIZE; + int end = variant.getStart() + CONTEXT_SIZE; Region region = new Region(variant.getChromosome(), start, end); logger.debug("Region {} for the genomic sequence context query", region); GenomeSequenceFeature genomeSequenceFeature = genomeManager.getSequence(region, QueryOptions.empty(), dataRelease).first(); From cf071163d4777f5c20365d40939fe1b0c29b22fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Wed, 10 Sep 2025 12:56:46 +0200 Subject: [PATCH 07/10] lib: check genomic context ranges, and minor improvements, #TASK-7627, #TASK-7549 --- .../VariantAnnotationCalculator.java | 85 ++++++++++++------- ...FutureGenomicSequenceContextAnnotator.java | 10 ++- 2 files changed, 62 insertions(+), 33 deletions(-) diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java index 87d0b48d98..9c99240417 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java @@ -71,6 +71,29 @@ public class VariantAnnotationCalculator { private static final String EMPTY_STRING = ""; private static final String ALTERNATE = "1"; + + // Include values + public static final String EXPRESSION_INCLUDE = "expression"; + public static final String GENE_DISEASE_INCLUDE = "geneDisease"; + public static final String DRUG_INTERACTION_INCLUDE = "drugInteraction"; + public static final String GENE_CONSTRAINTS_INCLUDE = "geneConstraints"; + public static final String MIRNA_TARGETS_INCLUDE = "mirnaTargets"; + public static final String CANCER_GENE_ASSOCIATION_INCLUDE = "cancerGeneAssociation"; + public static final String CANCER_HOTSPOTS_INCLUDE = "cancerHotspots"; + public static final String VARIATION_INCLUDE = "variation"; + public static final String POPULATION_FREQUENCIES_INCLUDE = "populationFrequencies"; + public static final String XREFS_INCLUDE = "xrefs"; + public static final String CONSERVATION_INCLUDE = "conservation"; + public static final String FUNCTIONAL_SCORE_INCLUDE = "functionalScore"; + @Deprecated + public static final String CLINICAL_INCLUDE = "clinical"; + public static final String TRAIT_ASSOCIATION_INCLUDE = "traitAssociation"; + public static final String REPEATS_INCLUDE = "repeats"; + public static final String CYTOBAND_INCLUDE = "cytoband"; + public static final String CONSEQUENCE_TYPE_INCLUDE = "consequenceType"; + public static final String PHARMACOGENOMICS_INCLUDE = "pharmacogenomics"; + public static final String HGVS_INCLUDE = "hgvs"; + private GenomeManager genomeManager; private GeneManager geneManager; private RegulatoryManager regulationManager; @@ -273,7 +296,7 @@ private List setGeneAnnotation(List geneList, Variant variant) VariantAnnotation variantAnnotation = variant.getAnnotation(); // TODO Remove expression data since is deprecated - if (annotatorSet.contains("expression")) { + if (annotatorSet.contains(EXPRESSION_INCLUDE)) { variantAnnotation.setGeneExpression(new ArrayList<>()); for (Gene gene : geneList) { // refseq genes don't have annotation (yet) @@ -283,7 +306,7 @@ private List setGeneAnnotation(List geneList, Variant variant) } } - if (annotatorSet.contains("geneDisease")) { + if (annotatorSet.contains(GENE_DISEASE_INCLUDE)) { variantAnnotation.setGeneTraitAssociation(new ArrayList<>()); Set visited = new HashSet<>(); for (Gene gene : geneList) { @@ -297,7 +320,7 @@ private List setGeneAnnotation(List geneList, Variant variant) } } - if (annotatorSet.contains("drugInteraction")) { + if (annotatorSet.contains(DRUG_INTERACTION_INCLUDE)) { variantAnnotation.setGeneDrugInteraction(new ArrayList<>()); for (Gene gene : geneList) { if (gene.getAnnotation() != null && gene.getAnnotation().getDrugs() != null) { @@ -306,7 +329,7 @@ private List setGeneAnnotation(List geneList, Variant variant) } } - if (annotatorSet.contains("geneConstraints")) { + if (annotatorSet.contains(GENE_CONSTRAINTS_INCLUDE)) { variantAnnotation.setGeneConstraints(new ArrayList<>()); for (Gene gene : geneList) { if (gene.getAnnotation() != null && gene.getAnnotation().getConstraints() != null) { @@ -315,7 +338,7 @@ private List setGeneAnnotation(List geneList, Variant variant) } } - if (annotatorSet.contains("mirnaTargets")) { + if (annotatorSet.contains(MIRNA_TARGETS_INCLUDE)) { variantAnnotation.setGeneMirnaTargets(new ArrayList<>()); for (Gene gene : geneList) { if (gene.getMirna() != null && gene.getMirna().getMatures() != null) { @@ -324,7 +347,7 @@ private List setGeneAnnotation(List geneList, Variant variant) } } - if (annotatorSet.contains("cancerGeneAssociation")) { + if (annotatorSet.contains(CANCER_GENE_ASSOCIATION_INCLUDE)) { variantAnnotation.setGeneCancerAssociations(new ArrayList<>()); Set visited = new HashSet<>(); for (Gene gene : geneList) { @@ -377,7 +400,7 @@ private List setGeneAnnotation(List geneList, Variant variant) } } - if (annotatorSet.contains("cancerHotspots")) { + if (annotatorSet.contains(CANCER_HOTSPOTS_INCLUDE)) { variantAnnotation.setCancerHotspots(new ArrayList<>()); Set visited = new HashSet<>(); for (Gene gene : geneList) { @@ -463,7 +486,7 @@ private List runAnnotationProcess(List normalizedVar Future>> variationFuture = null; List batchGeneList = getBatchGeneList(normalizedVariantList); - if (annotatorSet.contains("variation") || annotatorSet.contains("populationFrequencies")) { + if (annotatorSet.contains(VARIATION_INCLUDE) || annotatorSet.contains(POPULATION_FREQUENCIES_INCLUDE)) { futureVariationAnnotator = new FutureVariationAnnotator(normalizedVariantList, new QueryOptions("include", "id,annotation.populationFrequencies,annotation.additionalAttributes.dgvSpecificAttributes") .append("imprecise", imprecise), dataRelease.getRelease()); @@ -472,14 +495,14 @@ private List runAnnotationProcess(List normalizedVar FutureSnpAnnotator futureSnpAnnotator = null; Future>> snpFuture = null; - if (annotatorSet.contains("xrefs") && dataRelease.getCollections().containsKey(EtlCommons.SNP_COLLECTION_NAME)) { + if (annotatorSet.contains(XREFS_INCLUDE) && dataRelease.getCollections().containsKey(EtlCommons.SNP_COLLECTION_NAME)) { futureSnpAnnotator = new FutureSnpAnnotator(normalizedVariantList, dataRelease.getRelease(), variantManager, logger); snpFuture = CACHED_THREAD_POOL.submit(futureSnpAnnotator); } FutureConservationAnnotator futureConservationAnnotator = null; Future>> conservationFuture = null; - if (annotatorSet.contains("conservation")) { + if (annotatorSet.contains(CONSERVATION_INCLUDE)) { futureConservationAnnotator = new FutureConservationAnnotator(normalizedVariantList, QueryOptions.empty(), dataRelease.getRelease()); conservationFuture = CACHED_THREAD_POOL.submit(futureConservationAnnotator); @@ -487,7 +510,7 @@ private List runAnnotationProcess(List normalizedVar FutureVariantFunctionalScoreAnnotator futureVariantFunctionalScoreAnnotator = null; Future>> variantFunctionalScoreFuture = null; - if (annotatorSet.contains("functionalScore")) { + if (annotatorSet.contains(FUNCTIONAL_SCORE_INCLUDE)) { futureVariantFunctionalScoreAnnotator = new FutureVariantFunctionalScoreAnnotator(normalizedVariantList, QueryOptions.empty(), dataRelease.getRelease()); variantFunctionalScoreFuture = CACHED_THREAD_POOL.submit(futureVariantFunctionalScoreAnnotator); @@ -496,7 +519,7 @@ private List runAnnotationProcess(List normalizedVar FutureClinicalAnnotator futureClinicalAnnotator = null; Future>> clinicalFuture = null; // FIXME "clinical" is deprecated, replaced with traitAssociation - if (annotatorSet.contains("clinical") || annotatorSet.contains("traitAssociation")) { + if (annotatorSet.contains(CLINICAL_INCLUDE) || annotatorSet.contains(TRAIT_ASSOCIATION_INCLUDE)) { QueryOptions queryOptions = new QueryOptions(); queryOptions.add(ParamConstants.QueryParams.PHASE.key(), phased); queryOptions.add(ParamConstants.QueryParams.CHECK_AMINO_ACID_CHANGE.key(), checkAminoAcidChange); @@ -507,21 +530,21 @@ private List runAnnotationProcess(List normalizedVar FutureRepeatsAnnotator futureRepeatsAnnotator = null; Future>> repeatsFuture = null; - if (annotatorSet.contains("repeats")) { + if (annotatorSet.contains(REPEATS_INCLUDE)) { futureRepeatsAnnotator = new FutureRepeatsAnnotator(normalizedVariantList, dataRelease.getRelease()); repeatsFuture = CACHED_THREAD_POOL.submit(futureRepeatsAnnotator); } FutureCytobandAnnotator futureCytobandAnnotator = null; Future>> cytobandFuture = null; - if (annotatorSet.contains("cytoband")) { + if (annotatorSet.contains(CYTOBAND_INCLUDE)) { futureCytobandAnnotator = new FutureCytobandAnnotator(normalizedVariantList, QueryOptions.empty(), dataRelease.getRelease()); cytobandFuture = CACHED_THREAD_POOL.submit(futureCytobandAnnotator); } FutureSpliceScoreAnnotator futureSpliceScoreAnnotator = null; Future>> spliceScoreFuture = null; - if (annotatorSet.contains("consequenceType")) { + if (annotatorSet.contains(CONSEQUENCE_TYPE_INCLUDE)) { futureSpliceScoreAnnotator = new FutureSpliceScoreAnnotator(normalizedVariantList, dataRelease.getRelease(), apiKey, variantManager, logger); spliceScoreFuture = CACHED_THREAD_POOL.submit(futureSpliceScoreAnnotator); @@ -529,7 +552,7 @@ private List runAnnotationProcess(List normalizedVar FuturePharmacogenomicsAnnotator futurePharmacogenomicsAnnotator = null; Future>> pharmacogenomicsFuture = null; - if (annotatorSet.contains("pharmacogenomics") && dataRelease.getCollections().containsKey(EtlCommons.PHARMACOGENOMICS_DATA)) { + if (annotatorSet.contains(PHARMACOGENOMICS_INCLUDE) && dataRelease.getCollections().containsKey(EtlCommons.PHARMACOGENOMICS_DATA)) { futurePharmacogenomicsAnnotator = new FuturePharmacogenomicsAnnotator(normalizedVariantList, QueryOptions.empty(), dataRelease.getRelease(), pharmacogenomicsManager, logger); pharmacogenomicsFuture = CACHED_THREAD_POOL.submit(futurePharmacogenomicsAnnotator); @@ -573,7 +596,7 @@ private List runAnnotationProcess(List normalizedVar // FOR INDELS // Given that the number of indels is expected to be negligible if compared to the number of SNVs, the // decision is to run it synchronously - if (annotatorSet.contains("hgvs")) { + if (annotatorSet.contains(HGVS_INCLUDE)) { try { // Decided to always set normalize = false for a number of reasons: // * was raising problems with the normalizer - it could potentially fail in weird multiallelic @@ -597,7 +620,7 @@ private List runAnnotationProcess(List normalizedVar } } - if (annotatorSet.contains("consequenceType")) { + if (annotatorSet.contains(CONSEQUENCE_TYPE_INCLUDE)) { try { List consequenceTypeList = getConsequenceTypeList(variant, affectedGenes, true, QueryOptions.empty(), dataRelease.getRelease()); @@ -689,7 +712,7 @@ private List runAnnotationProcess(List normalizedVar // fixedThreadPool.shutdown(); // ACMG, only if consequence type is required - if (annotatorSet.contains("consequenceType")) { + if (annotatorSet.contains(CONSEQUENCE_TYPE_INCLUDE)) { setAcmdPredictions(variantAnnotationList); } @@ -1208,9 +1231,11 @@ private Set getAnnotatorSet(QueryOptions queryOptions) { annotatorSet = new HashSet<>(includeList); } else { // 'expression' removed in CB 5.0 - annotatorSet = new HashSet<>(Arrays.asList("variation", "traitAssociation", "conservation", "functionalScore", - "consequenceType", "geneDisease", "drugInteraction", "geneConstraints", "mirnaTargets", "pharmacogenomics", - "cancerGeneAssociation", "cancerHotspots", "populationFrequencies", "repeats", "cytoband", "hgvs", "xrefs")); + annotatorSet = new HashSet<>(Arrays.asList(VARIATION_INCLUDE, TRAIT_ASSOCIATION_INCLUDE, CONSERVATION_INCLUDE, + FUNCTIONAL_SCORE_INCLUDE, CONSEQUENCE_TYPE_INCLUDE, GENE_DISEASE_INCLUDE, DRUG_INTERACTION_INCLUDE, + GENE_CONSTRAINTS_INCLUDE, MIRNA_TARGETS_INCLUDE, PHARMACOGENOMICS_INCLUDE, CANCER_GENE_ASSOCIATION_INCLUDE, + CANCER_HOTSPOTS_INCLUDE, POPULATION_FREQUENCIES_INCLUDE, REPEATS_INCLUDE, CYTOBAND_INCLUDE, HGVS_INCLUDE, + XREFS_INCLUDE)); List excludeList = queryOptions.getAsStringList("exclude"); excludeList.forEach(annotatorSet::remove); } @@ -1226,25 +1251,25 @@ private List getIncludedGeneFields(Set annotatorSet) { "transcripts.exons.cdsEnd", "transcripts.exons.sequence", "transcripts.exons.phase", "transcripts.exons.exonNumber", "mirna", "transcripts.exons.genomicCodingStart", "transcripts.exons.genomicCodingEnd")); - if (annotatorSet.contains("expression")) { + if (annotatorSet.contains(EXPRESSION_INCLUDE)) { includeGeneFields.add("annotation.expression"); } - if (annotatorSet.contains("geneDisease")) { + if (annotatorSet.contains(GENE_DISEASE_INCLUDE)) { includeGeneFields.add("annotation.diseases"); } - if (annotatorSet.contains("drugInteraction")) { + if (annotatorSet.contains(DRUG_INTERACTION_INCLUDE)) { includeGeneFields.add("annotation.drugs"); } - if (annotatorSet.contains("geneConstraints")) { + if (annotatorSet.contains(GENE_CONSTRAINTS_INCLUDE)) { includeGeneFields.add("annotation.constraints"); } - if (annotatorSet.contains("mirnaTargets")) { + if (annotatorSet.contains(MIRNA_TARGETS_INCLUDE)) { includeGeneFields.add("annotation.targets"); } - if (annotatorSet.contains("cancerGeneAssociation")) { + if (annotatorSet.contains(CANCER_GENE_ASSOCIATION_INCLUDE)) { includeGeneFields.add("annotation.cancerAssociations"); } - if (annotatorSet.contains("cancerHotspots")) { + if (annotatorSet.contains(CANCER_HOTSPOTS_INCLUDE)) { includeGeneFields.add("annotation.cancerHotspots"); } return includeGeneFields; @@ -1623,7 +1648,7 @@ public void processResults(Future>> variationFu } } - if (annotatorSet.contains("populationFrequencies") && preferredVariant != null) { + if (annotatorSet.contains(POPULATION_FREQUENCIES_INCLUDE) && preferredVariant != null) { variantAnnotationList.get(i) .setPopulationFrequencies(preferredVariant.getAnnotation().getPopulationFrequencies()); } diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java index 260a704bb9..fa701848ee 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/futures/FutureGenomicSequenceContextAnnotator.java @@ -17,6 +17,7 @@ package org.opencb.cellbase.lib.variant.annotation.futures; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.time.StopWatch; import org.opencb.biodata.models.core.GenomeSequenceFeature; import org.opencb.biodata.models.core.Region; import org.opencb.biodata.models.variant.Variant; @@ -53,7 +54,7 @@ public FutureGenomicSequenceContextAnnotator(List variantList, int data @Override public List call() throws Exception { - long startTime = System.currentTimeMillis(); + StopWatch stopWatch = StopWatch.createStarted(); GenomicSequenceContext genomicSequenceContext; List resultList = new ArrayList<>(variantList.size()); @@ -64,6 +65,9 @@ public List call() throws Exception { genomicSequenceContext = null; if (VariantType.SNV != variant.getType() && VariantType.SNP != variant.getType()) { int start = variant.getStart() - CONTEXT_SIZE; + if (start < 1) { + start = 1; + } int end = variant.getStart() + CONTEXT_SIZE; Region region = new Region(variant.getChromosome(), start, end); logger.debug("Region {} for the genomic sequence context query", region); @@ -76,8 +80,8 @@ public List call() throws Exception { } resultList.add(genomicSequenceContext); } - logger.info("Genomic sequence context queries performance in {} ms for {} variants", - System.currentTimeMillis() - startTime, variantList.size()); + logger.info("Genomic sequence context queries performance in {} ms for {} variants", stopWatch.getTime(TimeUnit.MILLISECONDS), + variantList.size()); return resultList; } From 19c5f3357f4144814ba1e39a7abdeb39334241f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Thu, 11 Sep 2025 10:44:48 +0200 Subject: [PATCH 08/10] lib: add the include value 'genomicContext', #TASK-7627, #TASK-7549 --- .../VariantAnnotationCalculator.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java index 9c99240417..9563a629d1 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/VariantAnnotationCalculator.java @@ -93,6 +93,7 @@ public class VariantAnnotationCalculator { public static final String CONSEQUENCE_TYPE_INCLUDE = "consequenceType"; public static final String PHARMACOGENOMICS_INCLUDE = "pharmacogenomics"; public static final String HGVS_INCLUDE = "hgvs"; + public static final String GENOMIC_CONTEXT_INCLUDE = "genomicContext"; private GenomeManager genomeManager; private GeneManager geneManager; @@ -478,10 +479,8 @@ private List runAnnotationProcess(List normalizedVar // Object to be returned List variantAnnotationList = new ArrayList<>(normalizedVariantList.size()); - /* - * Next three async blocks calculate annotations using Futures, this will be calculated in a different thread. - * Once the main loop has finished then they will be stored. This provides a ~30% of performance improvement. - */ + // Next three async blocks calculate annotations using Futures, this will be calculated in a different thread. + // Once the main loop has finished then they will be stored. This provides a ~30% of performance improvement. FutureVariationAnnotator futureVariationAnnotator = null; Future>> variationFuture = null; List batchGeneList = getBatchGeneList(normalizedVariantList); @@ -558,9 +557,12 @@ private List runAnnotationProcess(List normalizedVar pharmacogenomicsFuture = CACHED_THREAD_POOL.submit(futurePharmacogenomicsAnnotator); } - FutureGenomicSequenceContextAnnotator contextAnnotator = new FutureGenomicSequenceContextAnnotator(normalizedVariantList, - dataRelease.getRelease(), genomeManager); - Future> contextFuture = CACHED_THREAD_POOL.submit(contextAnnotator); + FutureGenomicSequenceContextAnnotator contextAnnotator = null; + Future> contextFuture = null; + if (annotatorSet.contains(GENOMIC_CONTEXT_INCLUDE)) { + contextAnnotator = new FutureGenomicSequenceContextAnnotator(normalizedVariantList, dataRelease.getRelease(), genomeManager); + contextFuture = CACHED_THREAD_POOL.submit(contextAnnotator); + } // We iterate over all variants to get the rest of the annotations and to create the VariantAnnotation objects Queue variantBuffer = new LinkedList<>(); @@ -675,10 +677,8 @@ private List runAnnotationProcess(List normalizedVar logger.debug("Main loop iteration annotation performance is {}ms for {} variants", System.currentTimeMillis() - startTime, normalizedVariantList.size()); - /* - * Now, hopefully the other annotations have finished and we can store the results. - * Method 'processResults' has been implemented in the same class for sanity. - */ + // Now, hopefully the other annotations have finished and we can store the results. + // Method 'processResults' has been implemented in the same class for sanity. if (futureVariationAnnotator != null) { futureVariationAnnotator.processResults(variationFuture, variantAnnotationList, annotatorSet); } @@ -706,10 +706,9 @@ private List runAnnotationProcess(List normalizedVar if (futurePharmacogenomicsAnnotator != null) { futurePharmacogenomicsAnnotator.processResults(pharmacogenomicsFuture, variantAnnotationList); } - contextAnnotator.processResults(contextFuture, variantAnnotationList); - - // Not needed with newCachedThreadPool - // fixedThreadPool.shutdown(); + if (contextAnnotator != null) { + contextAnnotator.processResults(contextFuture, variantAnnotationList); + } // ACMG, only if consequence type is required if (annotatorSet.contains(CONSEQUENCE_TYPE_INCLUDE)) { @@ -1235,7 +1234,7 @@ private Set getAnnotatorSet(QueryOptions queryOptions) { FUNCTIONAL_SCORE_INCLUDE, CONSEQUENCE_TYPE_INCLUDE, GENE_DISEASE_INCLUDE, DRUG_INTERACTION_INCLUDE, GENE_CONSTRAINTS_INCLUDE, MIRNA_TARGETS_INCLUDE, PHARMACOGENOMICS_INCLUDE, CANCER_GENE_ASSOCIATION_INCLUDE, CANCER_HOTSPOTS_INCLUDE, POPULATION_FREQUENCIES_INCLUDE, REPEATS_INCLUDE, CYTOBAND_INCLUDE, HGVS_INCLUDE, - XREFS_INCLUDE)); + XREFS_INCLUDE, GENOMIC_CONTEXT_INCLUDE)); List excludeList = queryOptions.getAsStringList("exclude"); excludeList.forEach(annotatorSet::remove); } From 76a6f366c146affd4a60b6958a2266011e17f91d Mon Sep 17 00:00:00 2001 From: JuanfeSanahuja Date: Thu, 30 Oct 2025 16:17:04 +0100 Subject: [PATCH 09/10] cicd: Fix task name workflow #TASK-7549 --- .github/workflows/task.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/task.yml b/.github/workflows/task.yml index ac09089acb..903cf0d0b5 100644 --- a/.github/workflows/task.yml +++ b/.github/workflows/task.yml @@ -1,4 +1,4 @@ -name: CellBase Develop workflow +name: CellBase task workflow on: push: From 0d481661a74e6500707090d850b46e53c24161d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joaqu=C3=ADn=20T=C3=A1rraga=20Gim=C3=A9nez?= Date: Fri, 31 Oct 2025 07:41:07 +0100 Subject: [PATCH 10/10] tests: fix JUnit tests by using a LTS version (CellBase 5.8), #TASK-7549 --- .../cellbase/client/rest/VariantClientTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/cellbase-client/src/test/java/org/opencb/cellbase/client/rest/VariantClientTest.java b/cellbase-client/src/test/java/org/opencb/cellbase/client/rest/VariantClientTest.java index 9b39239538..5cd1c0f78f 100644 --- a/cellbase-client/src/test/java/org/opencb/cellbase/client/rest/VariantClientTest.java +++ b/cellbase-client/src/test/java/org/opencb/cellbase/client/rest/VariantClientTest.java @@ -154,14 +154,14 @@ public void testSearchSnpBydbSnpId() throws Exception { int dataRelease = 7; ClientConfiguration clientConfiguration = new ClientConfiguration() .setDefaultSpecies("hsapiens") - .setVersion("v5.8.3-SNAPSHOT") + .setVersion("v5.8") .setRest(new RestConfig(Collections.singletonList("https://ws.zettagenomics.com/cellbase"), 2000)); CellBaseClient client = new CellBaseClient(clientConfiguration); // Assumptions before running the test ObjectMap result = client.getMetaClient().about().firstResult(); - Assumptions.assumeTrue(VersionUtils.isMinVersion("5.8.3-SNAPSHOT", result.getString("Version"))); + Assumptions.assumeTrue(VersionUtils.isMinVersion("5.8", result.getString("Version"))); CellBaseDataResponse dataReleaseResponse = client.getMetaClient().dataReleases(); Assumptions.assumeTrue(dataReleaseResponse.getResponses().get(0).getResults().stream().map(DataRelease::getRelease).collect(Collectors.toList()).contains(dataRelease)); @@ -180,14 +180,14 @@ public void testSearchSnpByPosition() throws Exception { int dataRelease = 7; ClientConfiguration clientConfiguration = new ClientConfiguration() .setDefaultSpecies("hsapiens") - .setVersion("v5.8.3-SNAPSHOT") + .setVersion("v5.8") .setRest(new RestConfig(Collections.singletonList("https://ws.zettagenomics.com/cellbase"), 2000)); CellBaseClient client = new CellBaseClient(clientConfiguration); // Assumptions before running the test ObjectMap result = client.getMetaClient().about().firstResult(); - Assumptions.assumeTrue(VersionUtils.isMinVersion("5.8.3-SNAPSHOT", result.getString("Version"))); + Assumptions.assumeTrue(VersionUtils.isMinVersion("5.8", result.getString("Version"))); CellBaseDataResponse dataReleaseResponse = client.getMetaClient().dataReleases(); Assumptions.assumeTrue(dataReleaseResponse.getResponses().get(0).getResults().stream().map(DataRelease::getRelease).collect(Collectors.toList()).contains(dataRelease)); @@ -211,14 +211,14 @@ public void testStarsWithSnp() throws Exception { int dataRelease = 7; ClientConfiguration clientConfiguration = new ClientConfiguration() .setDefaultSpecies("hsapiens") - .setVersion("v5.8.3-SNAPSHOT") + .setVersion("v5.8") .setRest(new RestConfig(Collections.singletonList("https://ws.zettagenomics.com/cellbase"), 2000)); CellBaseClient client = new CellBaseClient(clientConfiguration); // Assumptions before running the test ObjectMap result = client.getMetaClient().about().firstResult(); - Assumptions.assumeTrue(VersionUtils.isMinVersion("5.8.3-SNAPSHOT", result.getString("Version"))); + Assumptions.assumeTrue(VersionUtils.isMinVersion("5.8", result.getString("Version"))); CellBaseDataResponse dataReleaseResponse = client.getMetaClient().dataReleases(); Assumptions.assumeTrue(dataReleaseResponse.getResponses().get(0).getResults().stream().map(DataRelease::getRelease).collect(Collectors.toList()).contains(dataRelease));