diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/ConsequenceTypeCalculator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/ConsequenceTypeCalculator.java index d480327d1e..b0b94e3c39 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/ConsequenceTypeCalculator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/ConsequenceTypeCalculator.java @@ -32,6 +32,7 @@ import org.opencb.commons.datastore.core.QueryOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.opencb.biodata.models.variant.avro.VariantType; import java.util.*; @@ -73,7 +74,9 @@ protected void parseQueryParam(QueryOptions queryOptions) { } protected int getStart(int extraPadding) { - if (imprecise && variant.getSv() != null) { + if (imprecise && VariantType.CNV.equals(variant.getType())) { + return variant.getStart() - extraPadding; + } else if (imprecise && variant.getSv() != null) { return variant.getSv().getCiStartLeft() != null ? variant.getSv().getCiStartLeft() - extraPadding : variant.getStart(); } else { @@ -83,7 +86,9 @@ protected int getStart(int extraPadding) { } protected int getEnd(int extraPadding) { - if (imprecise && variant.getSv() != null) { + if (imprecise && VariantType.CNV.equals(variant.getType())) { + return variant.getEnd() + extraPadding; + } else if (imprecise && variant.getSv() != null) { return variant.getSv().getCiEndRight() != null ? variant.getSv().getCiEndRight() + extraPadding : variant.getEnd(); } else { diff --git a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/ConsequenceTypeGenericRegionCalculator.java b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/ConsequenceTypeGenericRegionCalculator.java index c591c84283..a5fa04fa03 100644 --- a/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/ConsequenceTypeGenericRegionCalculator.java +++ b/cellbase-lib/src/main/java/org/opencb/cellbase/lib/variant/annotation/ConsequenceTypeGenericRegionCalculator.java @@ -20,6 +20,7 @@ import org.opencb.biodata.models.core.Gene; import org.opencb.biodata.models.core.Transcript; import org.opencb.biodata.models.variant.Variant; +import org.opencb.biodata.models.variant.avro.VariantType; import org.opencb.biodata.models.variant.avro.ConsequenceType; import org.opencb.biodata.models.variant.avro.ExonOverlap; import org.opencb.cellbase.core.ParamConstants; @@ -43,8 +44,9 @@ public List run(Variant inputVariant, List geneList, bool parseQueryParam(queryOptions); List consequenceTypeList = new ArrayList<>(); variant = inputVariant; - variantEnd = getEnd(svExtraPadding); - variantStart = getStart(svExtraPadding); + int extraPadding = VariantType.CNV.equals(variant.getType()) ? cnvExtraPadding : svExtraPadding; + variantEnd = getEnd(extraPadding); + variantStart = getStart(extraPadding); // isBigDeletion = ((variantEnd - variantStart) > BIG_VARIANT_SIZE_THRESHOLD); boolean isIntergenic = true; for (Gene currentGene : geneList) { 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 fdbd0fd35b..b7a259ff35 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 @@ -587,8 +587,8 @@ private List runAnnotationProcess(List normalizedVar if (annotatorSet.contains("consequenceType")) { try { - List consequenceTypeList = getConsequenceTypeList(variant, affectedGenes, true, QueryOptions.empty(), - dataRelease); + List consequenceTypeList = getConsequenceTypeList(variant, affectedGenes, true, + new QueryOptions().append("imprecise", imprecise).append("cnvExtraPadding", cnvExtraPadding), dataRelease); variantAnnotation.setConsequenceTypes(consequenceTypeList); if (phased) { checkAndAdjustPhasedConsequenceTypes(variant, variantBuffer, dataRelease); @@ -1308,6 +1308,9 @@ private boolean[] getRegulatoryRegionOverlaps(Variant variant) throws QueryExcep return getRegulatoryRegionOverlaps(variant.getChromosome(), variant.getStart()); } else if (VariantType.INDEL.equals(variant.getType()) && StringUtils.isBlank(variant.getReference())) { return getRegulatoryRegionOverlaps(variant.getChromosome(), variant.getStart() - 1, variant.getEnd()); + } else if (VariantType.CNV.equals(variant.getType())) { + return getRegulatoryRegionOverlaps(variant.getChromosome(), variant.getStart() - cnvExtraPadding, + variant.getEnd() + cnvExtraPadding); // Short deletions and symbolic variants except breakends } else if (!VariantType.BREAKEND.equals(variant.getType())) { return getRegulatoryRegionOverlaps(variant.getChromosome(), variant.getStart(), variant.getEnd()); 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 e1edc55cdc..c7e790bf81 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 @@ -33,6 +33,7 @@ import org.opencb.cellbase.lib.GenericMongoDBAdaptorTest; import org.opencb.cellbase.lib.variant.annotation.VariantAnnotationCalculator; import org.opencb.commons.datastore.core.QueryOptions; +import org.opencb.commons.datastore.core.result.QueryResult; import java.io.IOException; import java.nio.file.Path; @@ -1957,6 +1958,39 @@ public void testGetAllConsequenceTypesByVariant() throws IOException, QueryExcep // } } + @Test + // long variant should have same annotations as short variant + cnvPadding + public void testCNVExtraPadding() throws Exception { + + // short variant + Variant shortVariant = new Variant("chr17:43087248-43087249:"); + // long variant + Variant longVariant = new Variant("chr17:43087248-43098506:"); + + QueryOptions queryOptions = new QueryOptions("useCache", false); + queryOptions.put("include", "consequenceType, reference, alternate ,clinical"); + queryOptions.put("normalize", true); + queryOptions.put("skipDecompose", false); + queryOptions.put("checkAminoAcidChange", true); + queryOptions.put("imprecise", true); + queryOptions.put("phased", false); + + // long variant + CellBaseDataResult consequenceTypeResult = + variantAnnotationCalculator.getAllConsequenceTypesByVariant(longVariant, queryOptions); + assertEquals(27, consequenceTypeResult.getNumResults()); + + // short variant + consequenceTypeResult = variantAnnotationCalculator.getAllConsequenceTypesByVariant(shortVariant, queryOptions); + assertEquals(27, consequenceTypeResult.getNumResults()); + + queryOptions.put("cnvExtraPadding", 10000); + + // short variant with padding + consequenceTypeResult = variantAnnotationCalculator.getAllConsequenceTypesByVariant(shortVariant, queryOptions); + assertEquals(27, consequenceTypeResult.getNumResults()); + } + private void assertObjectListEquals(String expectedConsequenceTypeJson, List actualList, Class clazz) throws IOException { ObjectReader reader = jsonObjectMapper