diff ezBAMQC/src/htslib/htsfile.c @ 0:dfa3745e5fd8

Uploaded
author youngkim
date Thu, 24 Mar 2016 17:12:52 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ezBAMQC/src/htslib/htsfile.c	Thu Mar 24 17:12:52 2016 -0400
@@ -0,0 +1,168 @@
+/*  htsfile.c -- file identifier and minimal viewer.
+
+    Copyright (C) 2014-2015 Genome Research Ltd.
+
+    Author: John Marshall <jm18@sanger.ac.uk>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.  */
+
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <unistd.h>
+
+#include "htslib/hfile.h"
+#include "htslib/hts.h"
+#include "htslib/sam.h"
+#include "htslib/vcf.h"
+
+enum { identify, view_headers, view_all } mode = identify;
+int show_headers = 1;
+
+static htsFile *dup_stdout(const char *mode)
+{
+    int fd = dup(STDOUT_FILENO);
+    hFILE *hfp = (fd >= 0)? hdopen(fd, mode) : NULL;
+    return hfp? hts_hopen(hfp, "-", mode) : NULL;
+}
+
+static int view_sam(hFILE *hfp, const char *filename)
+{
+    samFile *in = hts_hopen(hfp, filename, "r");
+    if (in == NULL) return 0;
+    samFile *out = dup_stdout("w");
+    bam_hdr_t *hdr = sam_hdr_read(in);
+
+    if (show_headers) sam_hdr_write(out, hdr);
+    if (mode == view_all) {
+        bam1_t *b = bam_init1();
+        while (sam_read1(in, hdr, b) >= 0)
+            sam_write1(out, hdr, b);
+        bam_destroy1(b);
+    }
+
+    bam_hdr_destroy(hdr);
+    hts_close(out);
+    hts_close(in);
+    return 1;
+}
+
+static int view_vcf(hFILE *hfp, const char *filename)
+{
+    vcfFile *in = hts_hopen(hfp, filename, "r");
+    if (in == NULL) return 0;
+    vcfFile *out = dup_stdout("w");
+    bcf_hdr_t *hdr = bcf_hdr_read(in);
+
+    if (show_headers) bcf_hdr_write(out, hdr);
+    if (mode == view_all) {
+        bcf1_t *rec = bcf_init();
+        while (bcf_read(in, hdr, rec) >= 0)
+            bcf_write(out, hdr, rec);
+        bcf_destroy(rec);
+    }
+
+    bcf_hdr_destroy(hdr);
+    hts_close(out);
+    hts_close(in);
+    return 1;
+}
+
+static void usage(FILE *fp, int status)
+{
+    fprintf(fp,
+"Usage: htsfile [-chH] FILE...\n"
+"Options:\n"
+"  -c, --view         Write textual form of FILEs to standard output\n"
+"  -h, --header-only  Display only headers in view mode, not records\n"
+"  -H, --no-header    Suppress header display in view mode\n");
+    exit(status);
+}
+
+int main(int argc, char **argv)
+{
+    static const struct option options[] = {
+        { "header-only", no_argument, NULL, 'h' },
+        { "no-header", no_argument, NULL, 'H' },
+        { "view", no_argument, NULL, 'c' },
+        { "help", no_argument, NULL, '?' },
+        { "version", no_argument, NULL, 1 },
+        { NULL, 0, NULL, 0 }
+    };
+
+    int status = EXIT_SUCCESS;
+    int c, i;
+    while ((c = getopt_long(argc, argv, "chH?", options, NULL)) >= 0)
+        switch (c) {
+        case 'c': mode = view_all; break;
+        case 'h': mode = view_headers; show_headers = 1; break;
+        case 'H': show_headers = 0; break;
+        case 1:
+            printf(
+"htsfile (htslib) %s\n"
+"Copyright (C) 2015 Genome Research Ltd.\n",
+                   hts_version());
+            exit(EXIT_SUCCESS);
+            break;
+        case '?': usage(stdout, EXIT_SUCCESS); break;
+        default:  usage(stderr, EXIT_FAILURE); break;
+        }
+
+    if (optind == argc) usage(stderr, EXIT_FAILURE);
+
+    for (i = optind; i < argc; i++) {
+        htsFormat fmt;
+        hFILE *fp = hopen(argv[i], "r");
+        if (fp == NULL) {
+            fprintf(stderr, "htsfile: can't open \"%s\": %s\n", argv[i], strerror(errno));
+            status = EXIT_FAILURE;
+            continue;
+        }
+
+        if (hts_detect_format(fp, &fmt) < 0) {
+            fprintf(stderr, "htsfile: detecting \"%s\" format failed: %s\n", argv[i], strerror(errno));
+            hclose_abruptly(fp);
+            status = EXIT_FAILURE;
+            continue;
+        }
+
+        if (mode == identify) {
+            char *description = hts_format_description(&fmt);
+            printf("%s:\t%s\n", argv[i], description);
+            free(description);
+        }
+        else
+            switch (fmt.category) {
+            case sequence_data: if (view_sam(fp, argv[i])) fp = NULL; break;
+            case variant_data:  if (view_vcf(fp, argv[i])) fp = NULL; break;
+            default:
+                fprintf(stderr, "htsfile: can't view %s: unknown format\n", argv[i]);
+                status = EXIT_FAILURE;
+                break;
+            }
+
+        if (fp && hclose(fp) < 0) {
+            fprintf(stderr, "htsfile: closing %s failed\n", argv[i]);
+            status = EXIT_FAILURE;
+        }
+    }
+
+    return status;
+}