package org.genedb.crawl.bam;
import java.io.File;
import java.util.Map;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;
import net.sf.samtools.SAMFileHeader;
import net.sf.samtools.SAMFileReader;
import net.sf.samtools.SAMFileReader.ValidationStringency;
import net.sf.samtools.SAMFileWriter;
import net.sf.samtools.SAMFileWriterFactory;
import net.sf.samtools.SAMRecord;
import net.sf.samtools.SAMSequenceDictionary;
import net.sf.samtools.SAMSequenceRecord;
public class BAMConverter {
@Option(name = "-h", aliases = {"--help"}, usage = "Print help")
public boolean help;
@Option(name = "-i", aliases = {"--input"}, usage = "The input BAM", required = true)
public File inputSamOrBamFile;
@Option(name = "-o", aliases = {"--output"}, usage = "The output BAM", required = true)
public File outputSamOrBamFile;
@Option(name = "-m", aliases = {"--m"}, usage = "The map of old to new sequences", required = true)
public Map<String,String> sequenceMap;
public static void main(String[] args) {
BAMConverter converter = new BAMConverter();
CmdLineParser parser = new CmdLineParser(converter);
try {
parser.parseArgument(args);
if (converter.help) {
parser.setUsageWidth(80);
parser.printUsage(System.out);
System.exit(1);
}
converter.convert();
} catch (CmdLineException e) {
System.out.println(e.getMessage());
parser.setUsageWidth(80);
parser.printUsage(System.out);
System.exit(1);
}
}
public void convert() {
final SAMFileReader inputSam = new SAMFileReader(inputSamOrBamFile);
inputSam.setValidationStringency(ValidationStringency.SILENT);
System.out.println(String.format("Copying %s to %s", inputSamOrBamFile, sequenceMap.get(outputSamOrBamFile)));
System.out.println(sequenceMap);
SAMFileHeader header = inputSam.getFileHeader();
SAMSequenceDictionary dict = header.getSequenceDictionary();
SAMSequenceDictionary newDict = new SAMSequenceDictionary();
for (SAMSequenceRecord sequence : dict.getSequences()) {
String currentName = sequence.getSequenceName();
if (sequenceMap.containsKey(currentName)) {
System.out.println(String.format("Converting %s to %s", currentName, sequenceMap.get(currentName)));
currentName = sequenceMap.get(currentName);
}
SAMSequenceRecord newSequence = new SAMSequenceRecord(currentName, sequence.getSequenceLength());
newDict.addSequence(newSequence);
}
header.setSequenceDictionary(newDict);
final SAMFileWriter outputSam = new SAMFileWriterFactory().makeSAMOrBAMWriter(header,
true, outputSamOrBamFile);
for (final SAMRecord samRecord : inputSam) {
outputSam.addAlignment(samRecord);
}
outputSam.close();
inputSam.close();
}
}