c3694589a4868b788e827bad95104fd30703ccbd ceisenhart Mon May 26 13:29:34 2014 -0700 Not working for chromosomes with underscores in their name. Working for others. diff --git src/utils/bamSplitByChrom/bamSplitByChrom.c src/utils/bamSplitByChrom/bamSplitByChrom.c index 43c2f39..cfef3fe 100644 --- src/utils/bamSplitByChrom/bamSplitByChrom.c +++ src/utils/bamSplitByChrom/bamSplitByChrom.c @@ -1,87 +1,84 @@ /* 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 *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; i<head->n_targets; ++i) /* Loop through each chromosome. */ { samfile_t *in = samMustOpen(inBam, "rb", NULL); char *outBam = head->target_name[i]; 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; }