/*
* 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.core.alignment.tasks;
import org.opencb.biodata.formats.alignment.AlignmentUtils;
import org.opencb.biodata.formats.sequence.fasta.dbadaptor.CellBaseSequenceDBAdaptor;
import org.opencb.biodata.formats.sequence.fasta.dbadaptor.SequenceDBAdaptor;
import org.opencb.biodata.models.alignment.Alignment;
import org.opencb.biodata.models.alignment.AlignmentRegion;
import org.opencb.biodata.models.alignment.exceptions.ShortReferenceSequenceException;
import org.opencb.biodata.models.core.Region;
import org.opencb.commons.run.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.List;
/**
* Date: 27/03/14.
*
* @author Jacobo Coll Moragon <jcoll@ebi.ac.uk>
*/
public class AlignmentRegionCompactorTask extends Task<AlignmentRegion> {
private final SequenceDBAdaptor adaptor;
protected static Logger logger = LoggerFactory.getLogger(AlignmentRegionCompactorTask.class);
public AlignmentRegionCompactorTask() {
this.adaptor = new CellBaseSequenceDBAdaptor();
}
public AlignmentRegionCompactorTask(SequenceDBAdaptor adaptor) {
this.adaptor = adaptor;
}
@Override
public boolean pre() {
try {
adaptor.open();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
public boolean post() {
try {
adaptor.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
@Override
public boolean apply(List<AlignmentRegion> batch) throws IOException {
for (AlignmentRegion alignmentRegion : batch) {
Region region = alignmentRegion.getRegion();
long start = region.getStart();
if (start <= 0) {
start = 1;
region.setStart(1);
}
logger.info("Asking for sequence: " + region.toString() + " size = " + (region.getEnd() - region.getStart()));
String sequence = adaptor.getSequence(region);
for (Alignment alignment : alignmentRegion.getAlignments()) {
try {
AlignmentUtils.completeDifferencesFromReference(alignment, sequence, start);
} catch (ShortReferenceSequenceException e) {
logger.warn("NOT ENOUGH REFERENCE SEQUENCE. " + alignment.getChromosome() + ":" + alignment.getUnclippedStart() + "-"
+ alignment.getUnclippedEnd(), e);
}
}
}
return true;
}
}