org.opencb.opencga.storage.mongodb.variant.DBObjectToVariantSourceConverter.java Source code

Java tutorial

Introduction

Here is the source code for org.opencb.opencga.storage.mongodb.variant.DBObjectToVariantSourceConverter.java

Source

/*
 * Copyright 2015 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;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import com.mongodb.util.JSON;
import org.opencb.biodata.models.variant.VariantSource;
import org.opencb.biodata.models.variant.VariantStudy;
import org.opencb.biodata.models.variant.stats.VariantGlobalStats;
import org.opencb.datastore.core.ComplexTypeConverter;

/**
 *
 * @author Cristina Yenyxe Gonzalez Garcia <cyenyxe@ebi.ac.uk>
 */
public class DBObjectToVariantSourceConverter implements ComplexTypeConverter<VariantSource, DBObject> {

    public final static String FILEID_FIELD = "fid";
    public final static String FILENAME_FIELD = "fname";
    public final static String STUDYID_FIELD = "sid";
    public final static String STUDYNAME_FIELD = "sname";
    public final static String STUDYTYPE_FIELD = "stype";
    public final static String DATE_FIELD = "date";
    public final static String SAMPLES_FIELD = "samp";

    public final static String STATS_FIELD = "st";
    public final static String NUMSAMPLES_FIELD = "nSamp";
    public final static String NUMVARIANTS_FIELD = "nVar";
    public final static String NUMSNPS_FIELD = "nSnp";
    public final static String NUMINDELS_FIELD = "nIndel";
    public final static String NUMSTRUCTURAL_FIELD = "nSv";
    public final static String NUMPASSFILTERS_FIELD = "nPass";
    public final static String NUMTRANSITIONS_FIELD = "nTi";
    public final static String NUMTRANSVERSIONS_FIELD = "nTv";
    public final static String MEANQUALITY_FIELD = "meanQ";

    public final static String METADATA_FIELD = "meta";
    public final static String HEADER_FIELD = "header";
    static final char CHARACTER_TO_REPLACE_DOTS = (char) 163; // <-- 

    @Override
    public VariantSource convertToDataModelType(DBObject object) {
        VariantStudy.StudyType studyType = VariantStudy.StudyType
                .fromString(object.get(STUDYTYPE_FIELD).toString());
        VariantSource source = new VariantSource((String) object.get(FILENAME_FIELD),
                (String) object.get(FILEID_FIELD), (String) object.get(STUDYID_FIELD),
                (String) object.get(STUDYNAME_FIELD), studyType, VariantSource.Aggregation.NONE);

        // Samples
        if (object.containsField(SAMPLES_FIELD)) {
            Map<String, Integer> samplesPosition = new HashMap<>();
            for (Map.Entry<String, Integer> entry : ((Map<String, Integer>) object.get(SAMPLES_FIELD)).entrySet()) {
                samplesPosition.put(entry.getKey().replace(CHARACTER_TO_REPLACE_DOTS, '.'), entry.getValue());
            }
            source.setSamplesPosition(samplesPosition);
        }

        // Statistics
        DBObject statsObject = (DBObject) object.get(STATS_FIELD);
        if (statsObject != null) {
            VariantGlobalStats stats = new VariantGlobalStats((int) statsObject.get(NUMVARIANTS_FIELD),
                    (int) statsObject.get(NUMSAMPLES_FIELD), (int) statsObject.get(NUMSNPS_FIELD),
                    (int) statsObject.get(NUMINDELS_FIELD), 0, // TODO Add structural variants to schema!
                    (int) statsObject.get(NUMPASSFILTERS_FIELD), (int) statsObject.get(NUMTRANSITIONS_FIELD),
                    (int) statsObject.get(NUMTRANSVERSIONS_FIELD), -1,
                    ((Double) statsObject.get(MEANQUALITY_FIELD)).floatValue(), null);
            //            stats.setSamplesCount((int) statsObject.get(NUMSAMPLES_FIELD));
            //            stats.setVariantsCount((int) statsObject.get(NUMVARIANTS_FIELD));
            //            stats.setSnpsCount((int) statsObject.get(NUMSNPS_FIELD));
            //            stats.setIndelsCount((int) statsObject.get(NUMINDELS_FIELD));
            //            stats.setPassCount((int) statsObject.get(NUMPASSFILTERS_FIELD));
            //            stats.setTransitionsCount((int) statsObject.get(NUMTRANSITIONS_FIELD));
            //            stats.setTransversionsCount((int) statsObject.get(NUMTRANSVERSIONS_FIELD));
            //            stats.setMeanQuality(((Double) statsObject.get(MEANQUALITY_FIELD)).floatValue());
            source.setStats(stats);
        }

        // Metadata
        BasicDBObject metadata = (BasicDBObject) object.get(METADATA_FIELD);
        for (Map.Entry<String, Object> o : metadata.entrySet()) {
            source.addMetadata(o.getKey().replace(CHARACTER_TO_REPLACE_DOTS, '.'), o.getValue());
        }

        return source;
    }

    @Override
    public DBObject convertToStorageType(VariantSource object) {
        BasicDBObject studyMongo = new BasicDBObject(FILENAME_FIELD, object.getFileName())
                .append(FILEID_FIELD, object.getFileId()).append(STUDYNAME_FIELD, object.getStudyName())
                .append(STUDYID_FIELD, object.getStudyId()).append(DATE_FIELD, Calendar.getInstance().getTime())
                .append(STUDYTYPE_FIELD, object.getType().toString());

        Map<String, Integer> samplesPosition = object.getSamplesPosition();
        if (samplesPosition != null) {
            BasicDBObject samples = new BasicDBObject(samplesPosition.size());
            for (Map.Entry<String, Integer> entry : samplesPosition.entrySet()) {
                samples.append(entry.getKey().replace('.', CHARACTER_TO_REPLACE_DOTS), entry.getValue());
            }
            studyMongo.append(SAMPLES_FIELD, samples);
        }

        // TODO Pending how to manage the consequence type ranking (calculate during reading?)
        //        BasicDBObject cts = new BasicDBObject();
        //        for (Map.Entry<String, Integer> entry : conseqTypes.entrySet()) {
        //            cts.append(entry.getKey(), entry.getValue());
        //        }

        // Statistics
        VariantGlobalStats global = object.getStats();
        if (global != null) {
            DBObject globalStats = new BasicDBObject(NUMSAMPLES_FIELD, global.getSamplesCount())
                    .append(NUMVARIANTS_FIELD, global.getVariantsCount())
                    .append(NUMSNPS_FIELD, global.getSnpsCount()).append(NUMINDELS_FIELD, global.getIndelsCount())
                    .append(NUMPASSFILTERS_FIELD, global.getPassCount())
                    .append(NUMTRANSITIONS_FIELD, global.getTransitionsCount())
                    .append(NUMTRANSVERSIONS_FIELD, global.getTransversionsCount())
                    .append(MEANQUALITY_FIELD, (double) global.getMeanQuality());

            studyMongo = studyMongo.append(STATS_FIELD, globalStats);
        }

        // TODO Save pedigree information

        // Metadata
        Logger logger = Logger.getLogger(DBObjectToVariantSourceConverter.class.getName());
        Map<String, Object> meta = object.getMetadata();
        BasicDBObject metadataMongo = new BasicDBObject();
        for (Map.Entry<String, Object> metaEntry : meta.entrySet()) {
            if (metaEntry.getKey().equals("variantFileHeader")) {
                metadataMongo.append(HEADER_FIELD, metaEntry.getValue());
            } else {
                ObjectMapper mapper = new ObjectMapper();
                ObjectWriter writer = mapper.writer();
                String key = metaEntry.getKey().replace('.', CHARACTER_TO_REPLACE_DOTS);
                try {
                    metadataMongo.append(key, JSON.parse(writer.writeValueAsString(metaEntry.getValue())));
                } catch (JsonProcessingException e) {
                    logger.log(Level.WARNING, "Metadata key {0} could not be parsed in json", metaEntry.getKey());
                    logger.log(Level.INFO, "{}", e.toString());
                }
            }
        }
        studyMongo = studyMongo.append(METADATA_FIELD, metadataMongo);

        return studyMongo;
    }

}