package picard.sam;
import picard.PicardException;
import picard.cmdline.CommandLineProgram;
import picard.cmdline.CommandLineProgramProperties;
import picard.cmdline.Option;
import picard.cmdline.StandardOptionDefinitions;
import htsjdk.samtools.util.IOUtil;
import htsjdk.samtools.SAMUtils;
import picard.cmdline.programgroups.SamOrBam;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
@CommandLineProgramProperties(
usage = "Creates a hash code based on identifying information in the RG (read group) " +
"records in a SAM file's header. This hash code changes any time read groups are added or removed " +
"comparing one file's hash code to another tells you if the read groups in the BAM files are different.",
usageShort = "Creates a hash code based on the read groups (RG) in the SAM or BAM header.",
programGroup = SamOrBam.class
)
public class CalculateReadGroupChecksum extends CommandLineProgram {
private static final String OUTPUT_FILE_EXTENSION = ".read_group_md5";
@Option(shortName=StandardOptionDefinitions.INPUT_SHORT_NAME, doc="The input SAM or BAM file. ")
public File INPUT;
@Option(shortName=StandardOptionDefinitions.OUTPUT_SHORT_NAME, doc="The file to which the hash code should be written.", optional=true)
public File OUTPUT;
public static void main(final String[] args) {
new CalculateReadGroupChecksum().instanceMainWithExit(args);
}
/**
* Creates a file name (not including the path) for an RG MD5 file based on the name of the input file.
*/
public static String getOutputFileName(final File inputFile) {
return inputFile.getName() + OUTPUT_FILE_EXTENSION;
}
@Override
protected int doWork() {
final File output =
OUTPUT == null
? new File(INPUT.getParentFile(), getOutputFileName(INPUT))
: OUTPUT;
IOUtil.assertFileIsWritable(output);
final String hashText = SAMUtils.calculateReadGroupRecordChecksum(INPUT);
try {
final FileWriter outputWriter = new FileWriter(output);
outputWriter.write(hashText);
outputWriter.close();
} catch (final IOException ioe) {
throw new PicardException(
"Could not write the computed hash (" + hashText + ") to the output file: " + ioe.getMessage(), ioe);
}
return 0;
}
}