X-Git-Url: http://woldlab.caltech.edu/gitweb/?p=pysam.git;a=blobdiff_plain;f=pysam%2Fpysam_util.c;fp=pysam%2Fpysam_util.c;h=c1eae5d39beaafcf0f4cd23a771727c29c74fd96;hp=e0456901cf493b0f78e4e3c8f93478bab0a02383;hb=68c074fc81858150ca7447a88e731eec96be6378;hpb=768881ffd9d33e3c5fa00dd9ea6f488f4f0700b3 diff --git a/pysam/pysam_util.c b/pysam/pysam_util.c index e045690..c1eae5d 100644 --- a/pysam/pysam_util.c +++ b/pysam/pysam_util.c @@ -16,10 +16,19 @@ #include "stdio.h" FILE * pysamerr = NULL; -FILE * pysam_set_stderr( FILE * f ) +FILE * pysam_set_stderr(int fd) { - pysamerr = f; - return f; + if (pysamerr != NULL) + fclose(pysamerr); + pysamerr = fdopen(fd, "w"); + return pysamerr; +} + +void pysam_unset_stderr() +{ + if (pysamerr != NULL) + fclose(pysamerr); + pysamerr = fopen("/dev/null", "w"); } // ####################################################### @@ -313,41 +322,48 @@ int pysam_dispatch(int argc, char *argv[] ) knet_win32_init(); #endif #endif - + // reset getopt optind = 1; if (argc < 2) return 1; - - if (strcmp(argv[1], "view") == 0) return main_samview(argc-1, argv+1); - else if (strcmp(argv[1], "import") == 0) return main_import(argc-1, argv+1); - else if (strcmp(argv[1], "mpileup") == 0) return bam_mpileup(argc-1, argv+1); - else if (strcmp(argv[1], "merge") == 0) return bam_merge(argc-1, argv+1); - else if (strcmp(argv[1], "sort") == 0) return bam_sort(argc-1, argv+1); - else if (strcmp(argv[1], "index") == 0) return bam_index(argc-1, argv+1); - else if (strcmp(argv[1], "faidx") == 0) return faidx_main(argc-1, argv+1); - else if (strcmp(argv[1], "idxstats") == 0) return bam_idxstats(argc-1, argv+1); - else if (strcmp(argv[1], "fixmate") == 0) return bam_mating(argc-1, argv+1); - else if (strcmp(argv[1], "rmdup") == 0) return bam_rmdup(argc-1, argv+1); - else if (strcmp(argv[1], "flagstat") == 0) return bam_flagstat(argc-1, argv+1); - else if (strcmp(argv[1], "calmd") == 0) return bam_fillmd(argc-1, argv+1); - else if (strcmp(argv[1], "fillmd") == 0) return bam_fillmd(argc-1, argv+1); - else if (strcmp(argv[1], "reheader") == 0) return main_reheader(argc-1, argv+1); - else if (strcmp(argv[1], "cat") == 0) return main_cat(argc-1, argv+1); - else if (strcmp(argv[1], "targetcut") == 0) return main_cut_target(argc-1, argv+1); - else if (strcmp(argv[1], "phase") == 0) return main_phase(argc-1, argv+1); - else if (strcmp(argv[1], "depth") == 0) return main_depth(argc-1, argv+1); - else if (strcmp(argv[1], "bam2fq") == 0) return main_bam2fq(argc-1, argv+1); + int retval = 0; + + if (strcmp(argv[1], "view") == 0) retval = main_samview(argc-1, argv+1); + else if (strcmp(argv[1], "import") == 0) retval = main_import(argc-1, argv+1); + else if (strcmp(argv[1], "mpileup") == 0) retval = bam_mpileup(argc-1, argv+1); + else if (strcmp(argv[1], "merge") == 0) retval = bam_merge(argc-1, argv+1); + else if (strcmp(argv[1], "sort") == 0) retval = bam_sort(argc-1, argv+1); + else if (strcmp(argv[1], "index") == 0) retval = bam_index(argc-1, argv+1); + else if (strcmp(argv[1], "faidx") == 0) retval = faidx_main(argc-1, argv+1); + else if (strcmp(argv[1], "idxstats") == 0) retval = bam_idxstats(argc-1, argv+1); + else if (strcmp(argv[1], "fixmate") == 0) retval = bam_mating(argc-1, argv+1); + else if (strcmp(argv[1], "rmdup") == 0) retval = bam_rmdup(argc-1, argv+1); + else if (strcmp(argv[1], "flagstat") == 0) retval = bam_flagstat(argc-1, argv+1); + else if (strcmp(argv[1], "calmd") == 0) retval = bam_fillmd(argc-1, argv+1); + else if (strcmp(argv[1], "fillmd") == 0) retval = bam_fillmd(argc-1, argv+1); + else if (strcmp(argv[1], "reheader") == 0) retval = main_reheader(argc-1, argv+1); + else if (strcmp(argv[1], "cat") == 0) retval = main_cat(argc-1, argv+1); + else if (strcmp(argv[1], "targetcut") == 0) retval = main_cut_target(argc-1, argv+1); + else if (strcmp(argv[1], "phase") == 0) retval = main_phase(argc-1, argv+1); + else if (strcmp(argv[1], "depth") == 0) + { + retval = main_depth(argc-1, argv+1); + } + + else if (strcmp(argv[1], "bam2fq") == 0) retval = main_bam2fq(argc-1, argv+1); #if _CURSES_LIB != 0 - else if (strcmp(argv[1], "tview") == 0) return bam_tview_main(argc-1, argv+1); + else if (strcmp(argv[1], "tview") == 0) retval = bam_tview_main(argc-1, argv+1); #endif else { fprintf(stderr, "[main] unrecognized command '%s'\n", argv[1]); return 1; } - return 0; + fflush( stdout ); + + return retval; } // taken from samtools/bam_import.c @@ -435,8 +451,59 @@ int pysam_reference2tid( bam_header_t *header, const char * s ) return kh_value(h, iter); } +// Auxiliary functions for B support +void bam_aux_appendB(bam1_t *b, const char tag[2], char type, char subtype, int len, uint8_t *data) +{ + + int ori_len; - + int data_len; + + // check that type is 'B' + if('B' != type) return; + + ori_len = b->data_len; + + data_len = len * bam_aux_type2size(subtype); + // infer the data length from the sub-type + b->data_len += 8 + data_len; + + b->l_aux += 8 + data_len; + + if (b->m_data < b->data_len) + { + + b->m_data = b->data_len; + + kroundup32(b->m_data); + + b->data = (uint8_t*)realloc(b->data, b->m_data); + + } + + b->data[ori_len] = tag[0]; + b->data[ori_len + 1] = tag[1]; + // tag + b->data[ori_len + 2] = type; + // type + b->data[ori_len + 3] = subtype; + // subtype + (*(int32_t*)(b->data + ori_len + 4)) = len; + // size + memcpy(b->data + ori_len + 8, data, data_len); + // data +} + +/* +// return size of auxiliary type +int bam_aux_type2size(int x) +{ + if (x == 'C' || x == 'c' || x == 'A') return 1; + else if (x == 'S' || x == 's') return 2; + else if (x == 'I' || x == 'i' || x == 'f') return 4; + else return 0; +} +*/