diff --git a/cellbase-app/pom.xml b/cellbase-app/pom.xml index 235c0f146..da0a4585e 100644 --- a/cellbase-app/pom.xml +++ b/cellbase-app/pom.xml @@ -6,7 +6,7 @@ org.opencb.cellbase cellbase - 4.12.3 + 4.12.4 ../pom.xml diff --git a/cellbase-client/pom.xml b/cellbase-client/pom.xml index 7f49ade0e..60c447798 100644 --- a/cellbase-client/pom.xml +++ b/cellbase-client/pom.xml @@ -6,7 +6,7 @@ org.opencb.cellbase cellbase - 4.12.3 + 4.12.4 ../pom.xml diff --git a/cellbase-core/pom.xml b/cellbase-core/pom.xml index 4275ef5be..2c497a573 100644 --- a/cellbase-core/pom.xml +++ b/cellbase-core/pom.xml @@ -6,7 +6,7 @@ org.opencb.cellbase cellbase - 4.12.3 + 4.12.4 ../pom.xml diff --git a/cellbase-core/src/main/java/org/opencb/cellbase/core/variant/annotation/VariantAnnotationCalculator.java b/cellbase-core/src/main/java/org/opencb/cellbase/core/variant/annotation/VariantAnnotationCalculator.java index f220ec998..a0df55d77 100644 --- a/cellbase-core/src/main/java/org/opencb/cellbase/core/variant/annotation/VariantAnnotationCalculator.java +++ b/cellbase-core/src/main/java/org/opencb/cellbase/core/variant/annotation/VariantAnnotationCalculator.java @@ -1102,6 +1102,10 @@ private ConsequenceTypeCalculator getConsequenceTypeCalculator(Variant variant) case BREAKEND: return new ConsequenceTypeBNDCalculator(); default: + logger.error("There is no ConsequenceTypeCalculator for variant %s of type %s", + variant, + VariantAnnotationUtils.getVariantType(variant) + ); throw new UnsupportedURLVariantFormat(); } } diff --git a/cellbase-core/src/main/java/org/opencb/cellbase/core/variant/annotation/VariantAnnotationUtils.java b/cellbase-core/src/main/java/org/opencb/cellbase/core/variant/annotation/VariantAnnotationUtils.java index c462d87ad..805275ee4 100644 --- a/cellbase-core/src/main/java/org/opencb/cellbase/core/variant/annotation/VariantAnnotationUtils.java +++ b/cellbase-core/src/main/java/org/opencb/cellbase/core/variant/annotation/VariantAnnotationUtils.java @@ -5,6 +5,8 @@ import org.opencb.biodata.models.variant.annotation.ConsequenceTypeMappings; import org.opencb.biodata.models.variant.annotation.exceptions.SOTermNotAvailableException; import org.opencb.biodata.models.variant.avro.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.*; @@ -146,6 +148,8 @@ public class VariantAnnotationUtils { public static final String MT = "MT"; public static final String UNKNOWN_AMINOACID = "X"; + private static final int MAX_MNV_THRESHOLD = 1000; + private static Logger logger = LoggerFactory.getLogger(VariantAnnotationUtils.class); static { @@ -670,6 +674,12 @@ public static VariantType getVariantType(Variant variant) throws UnsupportedURLV } else { return VariantType.MNV; } + } else if (!variant.isSymbolic() && variant.getReference().length() > 1 && variant.getAlternate().length() > 1) { + if (variant.getReference().length() <= MAX_MNV_THRESHOLD && variant.getAlternate().length() <= MAX_MNV_THRESHOLD) { + return VariantType.MNV; + } else { + logger.warn("Provided alleles for variant are too long to be considered an MNV: %s", variant); + } } return variant.getType(); // return getVariantType(variant.getReferenceStart(), variant.getAlternate()); diff --git a/cellbase-lib/pom.xml b/cellbase-lib/pom.xml index 64b471320..daf607aa2 100644 --- a/cellbase-lib/pom.xml +++ b/cellbase-lib/pom.xml @@ -6,7 +6,7 @@ org.opencb.cellbase cellbase - 4.12.3 + 4.12.4 ../pom.xml diff --git a/cellbase-lib/src/test/java/org/opencb/cellbase/lib/impl/VariantAnnotationCalculatorTest.java b/cellbase-lib/src/test/java/org/opencb/cellbase/lib/impl/VariantAnnotationCalculatorTest.java index 3b403bb34..0e632ff68 100644 --- a/cellbase-lib/src/test/java/org/opencb/cellbase/lib/impl/VariantAnnotationCalculatorTest.java +++ b/cellbase-lib/src/test/java/org/opencb/cellbase/lib/impl/VariantAnnotationCalculatorTest.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectReader; +import org.apache.commons.lang3.StringUtils; import org.hamcrest.CoreMatchers; import org.junit.Before; import org.junit.Test; @@ -28,6 +29,7 @@ import org.opencb.biodata.models.variant.avro.*; import org.opencb.cellbase.core.variant.AnnotationBasedPhasedQueryManager; import org.opencb.cellbase.core.variant.annotation.VariantAnnotationCalculator; +import org.opencb.cellbase.core.variant.annotation.UnsupportedURLVariantFormat; import org.opencb.cellbase.lib.GenericMongoDBAdaptorTest; import org.opencb.commons.datastore.core.QueryOptions; import org.opencb.commons.datastore.core.QueryResult; @@ -40,7 +42,6 @@ import static org.junit.Assert.*; - public class VariantAnnotationCalculatorTest extends GenericMongoDBAdaptorTest { ObjectMapper jsonObjectMapper; @@ -2379,7 +2380,53 @@ public void testSpliceAnnotation() throws Exception { "splice_acceptor_variant")) ); } + @Test + public void testLongMNVConsequenceTypes() throws Exception { + Variant variant = new Variant("22", 17668822, "TCTCTACTAAAAATACAAAAAATTAGCCAGGCGTGGTGGCAGGTGCCTGTAGTAC", "CC"); + QueryOptions queryOptions = new QueryOptions("useCache", false); + queryOptions.put("include", "consequenceType"); + queryOptions.put("skipDecompose", true); + QueryResult queryResult = variantAnnotationCalculator + .getAnnotationByVariant(variant, queryOptions); + List consequenceTypeList = queryResult.getResult().get(0).getConsequenceTypes(); + assertFalse(consequenceTypeList.isEmpty()); + String sequenceOntologyTerms = getSequenceOntologyTerms("ENST00000399839", consequenceTypeList); + assertEquals("[{\"accession\": \"SO:0001627\", \"name\": \"intron_variant\"}]", sequenceOntologyTerms); + + // Deletion instead of MNV produces feature_truncation in addition to intron_variant + variant = new Variant("22", 17668822, "TCTCTACTAAAAATACAAAAAATTAGCCAGGCGTGGTGGCAGGTGCCTGTAGTAC", ""); + queryResult = variantAnnotationCalculator + .getAnnotationByVariant(variant, queryOptions); + consequenceTypeList = queryResult.getResult().get(0).getConsequenceTypes(); + assertFalse(consequenceTypeList.isEmpty()); + sequenceOntologyTerms = getSequenceOntologyTerms("ENST00000399839", consequenceTypeList); + assertEquals("[{\"accession\": \"SO:0001906\", \"name\": \"feature_truncation\"}, {\"accession\": \"SO:0001627\", \"name\": \"intron_variant\"}]", sequenceOntologyTerms); + } + @Test(expected = UnsupportedURLVariantFormat.class) + public void testLongMNVConsequenceTypesFailsForAboveThresholdLength() throws Exception { + QueryOptions queryOptions = new QueryOptions("useCache", false); + queryOptions.put("include", "consequenceType"); + queryOptions.put("skipDecompose", true); + // Very long MNV > MAX_MNV_THRESHOLD should return no consequence type + String alt = "C" + StringUtils.repeat('A', 1001); + Variant aboveThresholdVariant = new Variant("22", 17668822, "TCTCTACTAAAAATACAAAAAATTAGCCAGGCGTGGTGGCAGGTGCCTGTAGTAC",alt); + QueryResult queryResult = variantAnnotationCalculator + .getAnnotationByVariant(aboveThresholdVariant, queryOptions); + List consequenceTypeList = queryResult.getResult().get(0).getConsequenceTypes(); + assertTrue(consequenceTypeList.isEmpty()); + // Very long MNV > MAX_MNV_THRESHOLD throws UnsupportedURLVariantFormat + variantAnnotationCalculator.getAllConsequenceTypesByVariant(aboveThresholdVariant, queryOptions); + } + + public String getSequenceOntologyTerms(String transcriptID, List consequenceTypeList){ + for (ConsequenceType consequenceType : consequenceTypeList) { + if (consequenceType.getEnsemblTranscriptId().equals("ENST00000399839")){ + return consequenceType.getSequenceOntologyTerms().toString(); + }; + } + return null; + } private void assertObjectListEquals(String expectedConsequenceTypeJson, List actualList, Class clazz) throws IOException { ObjectReader reader = jsonObjectMapper diff --git a/cellbase-server/pom.xml b/cellbase-server/pom.xml index e7f9784e8..cc8c17d5b 100644 --- a/cellbase-server/pom.xml +++ b/cellbase-server/pom.xml @@ -6,7 +6,7 @@ org.opencb.cellbase cellbase - 4.12.3 + 4.12.4 ../pom.xml diff --git a/cellbase-test/pom.xml b/cellbase-test/pom.xml index 12637dcc0..937b5c45f 100644 --- a/cellbase-test/pom.xml +++ b/cellbase-test/pom.xml @@ -22,7 +22,7 @@ org.opencb.cellbase cellbase-test - 4.12.3 + 4.12.4 pom diff --git a/pom.xml b/pom.xml index 58dc6efc7..a0b37e445 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.opencb.cellbase cellbase - 4.12.3 + 4.12.4 pom CellBase project