672812fed9c467baac3b53330e1355f8a331e620 ceisenhart Mon May 26 11:56:31 2014 -0700 Fixed an I/O bug diff --git src/utils/bamSplitByChrom/bamSplitByChrom.c src/utils/bamSplitByChrom/bamSplitByChrom.c index 612148f..43c2f39 100644 --- src/utils/bamSplitByChrom/bamSplitByChrom.c +++ src/utils/bamSplitByChrom/bamSplitByChrom.c @@ -1,76 +1,87 @@ /* bamSplitByChrom - Splits a bam file into multiple bam files based on chromosome . */ #include "common.h" #include "linefile.h" #include "hash.h" #include "options.h" #include "bamFile.h" void usage() /* Explain usage and exit. */ { errAbort( "bamSplitByChrom - Splits a bam file into multiple bam files based on chromosome \n" "usage:\n" " bamSplitByChrom input.bam\n" "options:\n" " \n" ); } /* Command line validation table. */ static struct optionSpec options[] = { {NULL, 0}, }; void printBamSeq() { } samfile_t *samMustOpen(char *fileName, char *mode, void *extraHeader) /* Open up samfile or die trying. */ { samfile_t *sf = samopen(fileName, mode, extraHeader); if (sf == NULL) errnoAbort("Couldn't open %s.\n", fileName); return sf; } +char *concat(char *s1, char *s2) +/* A simple concatenate function. */ +{ +char *result = needMem(strlen(s1)+strlen(s2) +1); +strcpy(result,s1); +strcat(result,s2); +return result; +} + void bamSplitByChrom(char *inBam) /* bamSplitByChrom - Splits a bam file into multiple bam files based on chromosome . */ { /* Open file and get header for it. */ -samfile_t *in = samMustOpen(inBam, "rb", NULL); -bam_header_t *head = in->header; +samfile_t *input = samMustOpen(inBam, "rb", NULL); +bam_header_t *head = input->header; bam1_t one; ZeroVar(&one); // This seems to be necessary! int i =0; for (i=0; in_targets; ++i) /* Loop through each chromosome. */ { + samfile_t *in = samMustOpen(inBam, "rb", NULL); char *outBam = head->target_name[i]; - samfile_t *out = bamMustOpenLocal(outBam, "wb", head); + char *bam = ".bam"; + samfile_t *out = bamMustOpenLocal(concat(outBam,bam), "wb", head); /* Open an output bam file. */ for (;;) /* Loop through the input bam file. */ { if (samread(in, &one) < 0) { break; } if (head->target_name[one.core.tid]==outBam) { samwrite(out, &one); } } samclose(out); - } samclose(in); } +} int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, options); if (argc != 2) usage(); bamSplitByChrom(argv[1]); return 0; }