/* * 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. */ /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.opencb.opencga.storage.alignment.tasks; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.file.Paths; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import java.util.zip.GZIPInputStream; import org.opencb.biodata.models.alignment.AlignmentRegion; import org.opencb.biodata.models.alignment.stats.MeanCoverage; import org.opencb.biodata.models.alignment.stats.RegionCoverage; import org.opencb.biodata.models.feature.Region; import org.opencb.commons.run.Task; /** * * @author jacobo */ public class AlignmentRegionCoverageFromJsonTask extends Task<AlignmentRegion>{ private final String filename; private final JsonFactory factory; private final ObjectMapper jsonObjectMapper; private JsonParser coverageParser; private InputStream coveragesStream; private RegionCoverage actualRC; private List<MeanCoverage> meanCoverage; public AlignmentRegionCoverageFromJsonTask(String filename) { this.filename = filename; this.factory = new JsonFactory(); this.jsonObjectMapper = new ObjectMapper(this.factory); } @Override public boolean pre() { try { coveragesStream = new FileInputStream(Paths.get(filename).toAbsolutePath().toString()); if (filename.endsWith(".gz")) { coveragesStream = new GZIPInputStream(coveragesStream); } coverageParser = factory.createParser(coveragesStream); return super.pre(); } catch (FileNotFoundException ex) { Logger.getLogger(AlignmentRegionCoverageFromJsonTask.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(AlignmentRegionCoverageFromJsonTask.class.getName()).log(Level.SEVERE, null, ex); } return false; } @Override public boolean post() { try { coverageParser.close(); return super.post(); } catch (IOException ex) { Logger.getLogger(AlignmentRegionCoverageFromJsonTask.class.getName()).log(Level.SEVERE, null, ex); } return false; } @Override public boolean apply(List<AlignmentRegion> batch) throws IOException { for(AlignmentRegion ar : batch){ getRegionCoverage(ar); } return true; } private void getRegionCoverage(AlignmentRegion alignmentRegion) { /* * actualRC * _______|_______ * | | * ---a----b---------c-------d---- <--coverage * |_________________| * | * region * offset = b-a * length = d-b * */ Region region = alignmentRegion.getRegion(); // RegionCoverage regionCoverage = new RegionCoverage(region.getEnd()-region.getStart()); read(); if(meanCoverage == null || actualRC == null){ System.out.println("NULL in " + region.getStart() + " " + region.getEnd()); } alignmentRegion.setMeanCoverage(meanCoverage); alignmentRegion.setCoverage(actualRC); meanCoverage = null; actualRC = null; return; // // int index = 0; // int length = region.getEnd()-region.getStart(); // int offset; // while(index < length){ // if(actualRC == null) { // actualRC = read(); // } // if(region.getChromosome().equals(actualRC.getChromosome())){ // offset = (int)(region.getStart() - actualRC.getStart()); // //assert(offset >= 0); // if(offset < 0){ // region.setStart((int)actualRC.getStart()); // length = region.getEnd()-region.getStart(); // offset = 0; // } // // for(; index < length; index++){ // if(index + offset >= actualRC.getA().length){ // actualRC = null; // break; // } // regionCoverage.getA()[index] = actualRC.getA()[index + offset]; // regionCoverage.getC()[index] = actualRC.getC()[index + offset]; // regionCoverage.getT()[index] = actualRC.getT()[index + offset]; // regionCoverage.getG()[index] = actualRC.getG()[index + offset]; // regionCoverage.getAll()[index] = actualRC.getAll()[index + offset]; // } // } else { // actualRC = null; // } // } // // return; //return regionCoverage; } private void read() { try { if (coverageParser.nextToken() == null) { System.out.println("[ERROR] Corrupted file " + filename); } actualRC = coverageParser.readValueAs(RegionCoverage.class); meanCoverage = coverageParser.readValueAs(new TypeReference<List<MeanCoverage>>() { }); } catch (IOException ex) { Logger.getLogger(AlignmentRegionCoverageFromJsonTask.class.getName()).log(Level.SEVERE, null, ex); } } }