package fr.ens.biologie.genomique.eoulsan.modules.mapping.local;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import fr.ens.biologie.genomique.eoulsan.annotations.HadoopCompatible;
import fr.ens.biologie.genomique.eoulsan.core.TaskContext;
import fr.ens.biologie.genomique.eoulsan.core.TaskResult;
import fr.ens.biologie.genomique.eoulsan.core.TaskStatus;
import fr.ens.biologie.genomique.eoulsan.data.Data;
import fr.ens.biologie.genomique.eoulsan.data.DataFile;
import fr.ens.biologie.genomique.eoulsan.data.DataFormats;
import fr.ens.biologie.genomique.eoulsan.modules.mapping.AbstractBAM2SAMModule;
import fr.ens.biologie.genomique.eoulsan.util.LocalReporter;
import fr.ens.biologie.genomique.eoulsan.util.Reporter;
import htsjdk.samtools.SAMFileHeader.SortOrder;
import htsjdk.samtools.SAMFileWriter;
import htsjdk.samtools.SAMFileWriterFactory;
import htsjdk.samtools.SAMRecord;
import htsjdk.samtools.SamInputResource;
import htsjdk.samtools.SamReader;
import htsjdk.samtools.SamReaderFactory;
/**
* This class define a module for converting BAM files into SAM.
* @since 2.0
* @author Laurent Jourdren
*/
@HadoopCompatible
public class BAM2SAMLocalModule extends AbstractBAM2SAMModule {
@Override
public TaskResult execute(final TaskContext context,
final TaskStatus status) {
try {
// Create the reporter
final Reporter reporter = new LocalReporter();
// Get input SAM data
final Data inData = context.getInputData(DataFormats.MAPPER_RESULTS_BAM);
// Get output BAM data
final Data outSAMData =
context.getOutputData(DataFormats.MAPPER_RESULTS_SAM, inData);
final DataFile samFile = outSAMData.getDataFile();
final DataFile bamFile = inData.getDataFile();
convert(bamFile, samFile, reporter, context.getLocalTempDirectory());
// Set the description of the context
status.setDescription("Convert alignments ("
+ inData.getName() + ", " + outSAMData.getName() + ")");
// Add counters for this sample to log file
status.setCounters(reporter, COUNTER_GROUP);
return status.createTaskResult();
} catch (final IOException e) {
return status.createTaskResult(e);
}
}
/**
* Convert BAM file to sorted SAM with Picard
* @param bamDataFile input SAM file
* @param samDataFile output SAM file
* @param reporter reporter
* @param tmpDir temporary directory
* @throws IOException if an error occurs
*/
// private static final void convert(final File in, final File out)
private static void convert(final DataFile bamDataFile,
final DataFile samDataFile, final Reporter reporter, final File tmpDir)
throws IOException {
InputStream in = bamDataFile.open();
OutputStream out = samDataFile.create();
// Open bam file
final SamReader bamReader =
SamReaderFactory.makeDefault().open(SamInputResource.of(in));
// Force sort
bamReader.getFileHeader().setSortOrder(SortOrder.unsorted);
// Open sam file
final SAMFileWriter samWriter = new SAMFileWriterFactory()
.setCreateIndex(false).setTempDirectory(tmpDir)
.makeSAMWriter(bamReader.getFileHeader(), false, out);
for (final SAMRecord samRecord : bamReader) {
samWriter.addAlignment(samRecord);
reporter.incrCounter(COUNTER_GROUP, "converted records", 1);
}
samWriter.close();
bamReader.close();
}
}