#include <getopt.h>
#include <unistd.h>
#include <htslib/sam.h>
static void print_usage(FILE *fp)
{
fprintf(fp, "Usage: split_t1 infile outdir\n\
Splits the input file alignments to read1 and read2 and saves as 1.sam and 2.bam in given directory\n\
Shows the usage of basic thread in htslib\n");
return;
}
int main(int argc, char *argv[])
{
const char *inname = NULL, *outdir = NULL;
char *file1 = NULL, *file2 = NULL;
int c = 0, ret = EXIT_FAILURE, size = 0;
samFile *infile = NULL, *outfile1 = NULL, *outfile2 = NULL;
sam_hdr_t *in_samhdr = NULL;
bam1_t *bamdata = NULL;
if (argc != 3) {
print_usage(stdout);
goto end;
}
inname = argv[1];
outdir = argv[2];
size = sizeof(char) * (strlen(outdir) + sizeof("/1.sam") + 1); file1 = malloc(size);
file2 = malloc(size);
if (!file1 || !file2) {
printf("Failed to set output path\n");
goto end;
}
snprintf(file1, size, "%s/1.sam", outdir); snprintf(file2, size, "%s/2.bam", outdir); if (!(bamdata = bam_init1())) {
printf("Failed to initialize bamdata\n");
goto end;
}
if (!(infile = sam_open(inname, "r"))) {
printf("Could not open %s\n", inname);
goto end;
}
outfile1 = sam_open(file1, "w"); outfile2 = sam_open(file2, "wb"); if (!outfile1 || !outfile2) {
printf("Could not open output file\n");
goto end;
}
if (hts_set_opt(infile, HTS_OPT_NTHREADS, 2) < 0 || hts_set_opt(outfile1, HTS_OPT_NTHREADS, 1) < 0 || hts_set_opt(outfile2, HTS_OPT_NTHREADS, 1) < 0) { printf("Failed to set thread options\n");
goto end;
}
if (!(in_samhdr = sam_hdr_read(infile))) {
printf("Failed to read header from file!\n");
goto end;
}
if ((sam_hdr_write(outfile1, in_samhdr) == -1) || (sam_hdr_write(outfile2, in_samhdr) == -1)) {
printf("Failed to write header\n");
goto end;
}
while ((c = sam_read1(infile, in_samhdr, bamdata)) >= 0) {
if (bamdata->core.flag & BAM_FREAD1) {
if (sam_write1(outfile1, in_samhdr, bamdata) < 0) {
printf("Failed to write output data\n");
goto end;
}
}
else if (bamdata->core.flag & BAM_FREAD2) {
if (sam_write1(outfile2, in_samhdr, bamdata) < 0) {
printf("Failed to write output data\n");
goto end;
}
}
}
if (-1 == c) {
ret = EXIT_SUCCESS;
}
else {
printf("Error in reading data\n");
}
end:
if (in_samhdr) {
sam_hdr_destroy(in_samhdr);
}
if (infile) {
sam_close(infile);
}
if (bamdata) {
bam_destroy1(bamdata);
}
if (file1) {
free(file1);
}
if (file2) {
free(file2);
}
if (outfile1) {
sam_close(outfile1);
}
if (outfile2) {
sam_close(outfile2);
}
return ret;
}