/* * Copyright 2015-2016 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.opencga.storage.mongodb.variant.converters; import com.google.common.collect.Lists; import org.bson.Document; import org.bson.types.Binary; import org.junit.Before; import org.junit.Test; import org.opencb.biodata.models.variant.StudyEntry; import org.opencb.biodata.models.variant.Variant; import org.opencb.biodata.models.variant.avro.FileEntry; import org.opencb.commons.utils.CryptoUtils; import org.opencb.opencga.storage.core.metadata.StudyConfiguration; import org.opencb.opencga.storage.core.variant.VariantStorageEngine; import org.opencb.opencga.storage.core.variant.adaptors.VariantField; import org.opencb.opencga.storage.mongodb.variant.MongoDBVariantStorageEngine; import org.opencb.opencga.storage.mongodb.variant.protobuf.VariantMongoDBProto; import java.util.*; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; /** * @author Cristina Yenyxe Gonzalez Garcia <cyenyxe@ebi.ac.uk> */ public class DocumentToVariantConverterTest { private Document mongoVariant; private Variant variant; protected StudyEntry studyEntry; private Integer studyId; private Integer fileId; @Before public void setUp() { //Setup variant variant = new Variant("1", 1000, 1000, "A", "C"); variant.setIds(Collections.singletonList("rs666")); //Setup variantSourceEntry studyId = 1; fileId = 2; studyEntry = new StudyEntry(fileId.toString(), studyId.toString()); FileEntry fileEntry = studyEntry.getFile(fileId.toString()); fileEntry.getAttributes().put("QUAL", "0.01"); fileEntry.getAttributes().put("AN", "2"); studyEntry.setFormatAsString("GT:DP"); Map<String, String> na001 = new HashMap<>(); na001.put("GT", "0/0"); na001.put("DP", "4"); studyEntry.addSampleData("NA001", na001); Map<String, String> na002 = new HashMap<>(); na002.put("GT", "0/1"); na002.put("DP", "5"); studyEntry.addSampleData("NA002", na002); variant.addStudyEntry(studyEntry); //Setup mongoVariant mongoVariant = new Document("_id", " 1: 1000:A:C") .append(DocumentToVariantConverter.CHROMOSOME_FIELD, variant.getChromosome()) .append(DocumentToVariantConverter.START_FIELD, variant.getStart()) .append(DocumentToVariantConverter.END_FIELD, variant.getStart()) .append(DocumentToVariantConverter.LENGTH_FIELD, variant.getLength()) .append(DocumentToVariantConverter.REFERENCE_FIELD, variant.getReference()) .append(DocumentToVariantConverter.ALTERNATE_FIELD, variant.getAlternate()) .append(DocumentToVariantConverter.TYPE_FIELD, variant.getType().name()) .append(DocumentToVariantConverter.IDS_FIELD, variant.getIds()) .append(DocumentToVariantConverter.ANNOTATION_FIELD, Collections.emptyList()); LinkedList chunkIds = new LinkedList(); chunkIds.add("1_1_1k"); chunkIds.add("1_0_10k"); mongoVariant.append(DocumentToVariantConverter.AT_FIELD, new Document("chunkIds", chunkIds)); LinkedList hgvs = new LinkedList(); // hgvs.add(new Document("type", "genomic").append("name", "1:g.1000A>C")); mongoVariant.append("hgvs", hgvs); } @Test public void testConvertToDataModelTypeWithFiles() { // MongoDB object Document mongoStudy = new Document(DocumentToStudyVariantEntryConverter.STUDYID_FIELD, Integer.parseInt(studyEntry .getStudyId())); // mongoStudy.append(DocumentToVariantSourceEntryConverter.FORMAT_FIELD, variantSourceEntry.getFormat()); mongoStudy.append(DocumentToStudyVariantEntryConverter.GENOTYPES_FIELD, new Document("0/1", Collections.singletonList(1))); Document mongoFile = new Document(DocumentToStudyVariantEntryConverter.FILEID_FIELD, Integer.parseInt(studyEntry .getFiles().get(0).getFileId())) .append(DocumentToStudyVariantEntryConverter.ATTRIBUTES_FIELD, new Document("QUAL", 0.01).append("AN", 2)) .append(DocumentToStudyVariantEntryConverter.SAMPLE_DATA_FIELD, new Document("dp", new Binary(VariantMongoDBProto.OtherFields.newBuilder() .addIntValues(DocumentToSamplesConverter.INTEGER_COMPLEX_TYPE_CONVERTER.convertToStorageType("4")) .addIntValues(DocumentToSamplesConverter.INTEGER_COMPLEX_TYPE_CONVERTER.convertToStorageType("5")).build().toByteArray()))); mongoStudy.append(DocumentToStudyVariantEntryConverter.FILES_FIELD, Collections.singletonList(mongoFile)); mongoVariant.append(DocumentToVariantConverter.STUDIES_FIELD, Collections.singletonList(mongoStudy)); StudyConfiguration studyConfiguration = new StudyConfiguration(studyId, studyId.toString(), fileId, fileId.toString());//studyId, // fileId, sampleNames, "0/0" studyConfiguration.getIndexedFiles().add(fileId); studyConfiguration.getSamplesInFiles().put(fileId, new LinkedHashSet<>(Arrays.asList(0, 1))); studyConfiguration.getSampleIds().put("NA001", 0); studyConfiguration.getSampleIds().put("NA002", 1); studyConfiguration.getAttributes().put(MongoDBVariantStorageEngine.MongoDBVariantOptions.DEFAULT_GENOTYPE.key(), "0/0"); studyConfiguration.getAttributes().put(VariantStorageEngine.Options.EXTRA_GENOTYPE_FIELDS.key(), Collections.singletonList("DP")); DocumentToVariantConverter converter = new DocumentToVariantConverter( new DocumentToStudyVariantEntryConverter( true, new DocumentToSamplesConverter(studyConfiguration)), new DocumentToVariantStatsConverter()); Variant converted = converter.convertToDataModelType(mongoVariant); assertEquals("\n" + variant.toJson() + "\n" + converted.toJson(), variant, converted); } @Test public void testConvertToStorageTypeWithFiles() { variant.addStudyEntry(studyEntry); // MongoDB object Document mongoFile = new Document(DocumentToStudyVariantEntryConverter.FILEID_FIELD, fileId); mongoFile.append(DocumentToStudyVariantEntryConverter.ATTRIBUTES_FIELD, new Document("QUAL", 0.01).append("AN", 2)) .append(DocumentToStudyVariantEntryConverter.SAMPLE_DATA_FIELD, new Document()); // mongoFile.append(DocumentToVariantSourceEntryConverter.FORMAT_FIELD, variantSourceEntry.getFormat()); Document mongoStudy = new Document(DocumentToStudyVariantEntryConverter.STUDYID_FIELD, studyId) .append(DocumentToStudyVariantEntryConverter.FILES_FIELD, Collections.singletonList(mongoFile)); Document genotypeCodes = new Document(); // genotypeCodes.append("def", "0/0"); genotypeCodes.append("0/1", Collections.singletonList(1)); mongoStudy.append(DocumentToStudyVariantEntryConverter.GENOTYPES_FIELD, genotypeCodes); LinkedList studies = new LinkedList(); studies.add(mongoStudy); mongoVariant.append(DocumentToVariantConverter.STUDIES_FIELD, studies); List<String> sampleNames = Lists.newArrayList("NA001", "NA002"); DocumentToVariantConverter converter = new DocumentToVariantConverter( new DocumentToStudyVariantEntryConverter( true, new DocumentToSamplesConverter(studyId, fileId, sampleNames, "0/0")), new DocumentToVariantStatsConverter()); Document converted = converter.convertToStorageType(variant); assertFalse(converted.containsKey(DocumentToVariantConverter.IDS_FIELD)); //IDs must be added manually. converted.put(DocumentToVariantConverter.IDS_FIELD, variant.getIds()); //Add IDs mongoVariant.append(DocumentToVariantConverter.STATS_FIELD, Collections.emptyList()); assertEquals("\n" + mongoVariant.toJson() + "\n" + converted.toJson(), mongoVariant, converted); } @Test public void testConvertToDataModelTypeWithoutFiles() { DocumentToVariantConverter converter = new DocumentToVariantConverter(); Variant converted = converter.convertToDataModelType(mongoVariant); variant.setStudies(Collections.<StudyEntry>emptyList()); assertEquals("\n" + variant.toJson() + "\n" + converted.toJson(), variant, converted); } @Test public void testConvertToStorageTypeWithoutFiles() { DocumentToVariantConverter converter = new DocumentToVariantConverter(); Document converted = converter.convertToStorageType(variant); assertFalse(converted.containsKey(DocumentToVariantConverter.IDS_FIELD)); //IDs must be added manually. converted.put(DocumentToVariantConverter.IDS_FIELD, variant.getIds()); //Add IDs assertEquals(mongoVariant, converted); } @Test public void testBuildStorageId() { DocumentToVariantConverter converter = new DocumentToVariantConverter(); // SNV Variant v1 = new Variant("1", 1000, 1000, "A", "C"); assertEquals(" 1: 1000:A:C", converter.buildStorageId(v1)); // Indel Variant v2 = new Variant("1", 1000, 1002, "", "CA"); assertEquals(" 1: 1000::CA", converter.buildStorageId(v2)); // Structural String alt = "ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT"; Variant v3 = new Variant("1", 1000, 1002, "TAG", alt); assertEquals(" 1: 1000:TAG:" + new String(CryptoUtils.encryptSha1(alt)), converter.buildStorageId(v3)); } @Test public void testFieldsMap() { assertEquals(VariantField.values().length, DocumentToVariantConverter.FIELDS_MAP.size()); } }