@Override
protected int doWork() {
IOUtil.assertFileIsReadable(INPUT);
IOUtil.assertDirectoryIsWritable(OUTPUT);
SAMFileReader reader = new SAMFileReader(INPUT);
Map<String, SAMFileWriter> libraryToWriter = new HashMap<String, SAMFileWriter>();
Map<String, List<SAMReadGroupRecord>> libraryToRg = new HashMap<String, List<SAMReadGroupRecord>>();
SAMFileWriterFactory factory = new SAMFileWriterFactory();
String extension = reader.isBinary() ? ".bam" : ".sam";
SAMFileHeader unknownHeader = reader.getFileHeader().clone();
unknownHeader.setReadGroups(new ArrayList<SAMReadGroupRecord>());
SAMFileWriter unknown = null;
for (SAMReadGroupRecord rg : reader.getFileHeader().getReadGroups()) {
String lib = rg.getLibrary();
if (lib != null) {
if (!libraryToRg.containsKey(lib)) {
libraryToRg.put(lib, new ArrayList<SAMReadGroupRecord>());
}
libraryToRg.get(lib).add(rg);
}
else {
unknownHeader.addReadGroup(rg);
}
}
if (libraryToRg.size() == 0) {
log.error("No individual libraries are " +
"specified in the header of " + INPUT.getAbsolutePath());
return NO_LIBRARIES_SPECIFIED_IN_HEADER;
}
for (Map.Entry<String, List<SAMReadGroupRecord>> entry : libraryToRg.entrySet()) {
String lib = entry.getKey();
SAMFileHeader header = reader.getFileHeader().clone();
header.setReadGroups(entry.getValue());
libraryToWriter.put(lib, factory.makeSAMOrBAMWriter(header, true,
new File(OUTPUT, IOUtil.makeFileNameSafe(lib) + extension)));
}
for (Iterator<SAMRecord> it = reader.iterator(); it.hasNext(); ) {
SAMRecord sam = it.next();
SAMReadGroupRecord rg = sam.getReadGroup();
if (rg != null && rg.getLibrary() != null) {
libraryToWriter.get(rg.getLibrary()).addAlignment(sam);
}
else {
if (unknown == null) {
unknown = factory.makeSAMOrBAMWriter(unknownHeader, true,
new File(OUTPUT, "unknown" + extension));
}
unknown.addAlignment(sam);
}
}
// Close the reader and writers
reader.close();
if (unknown != null) {
unknown.close();
}