0766f8ef11c8e73a7351fbbc5d5ae9f987941a54 angie Fri Mar 11 15:12:00 2011 -0800 Mark rightly pointed out that these programs I used for quick testingshould go in lib/tests with proper testcases, not in oneShot/. Test cases coming up... diff --git src/lib/tests/tabixFetch.c src/lib/tests/tabixFetch.c new file mode 100644 index 0000000..135f31e --- /dev/null +++ src/lib/tests/tabixFetch.c @@ -0,0 +1,114 @@ +/* tabixFetch - Test lineFileOnTabix and lineFileSetTabixRegion (compare with cmd line tabix output). */ +#include "common.h" +#include "linefile.h" +#include "options.h" + +#ifdef USE_TABIX + +#include "sqlNum.h" +#include "udc.h" +#include "knetUdc.h" + +void usage() +/* Explain usage and exit. */ +{ +errAbort( + + "tabixFetch - Test lineFileOnTabix and lineFileSetTabixRegion (compare\n" + " with command-line tabix output)\n" + + "usage:\n" + " tabixFetch fileOrUrl chrom:start-end\n" + "Fetch lines from the specified position range from a line-based file\n" + "with genomic positions that has been compressed and indexed by tabix.\n" + "This duplicates the fetching functionality of the tabix program -- it\n" + "was written solely to test lib/lineFile.c's tabix-wrapper mode.\n" + ); +} + +static struct optionSpec options[] = { + {NULL, 0}, +}; + +#define BAD_POS_FORMAT "Expecting position format: chrom:N-M where N and M are integers. " \ + "\"%s\" doesn't match." +static void parsePosition(const char *position, char **retChrom, int *retStart, int *retEnd) +/* Do we have a lib routine for this somewhere? Too lazy to look. */ +{ +char *posDupe = cloneString(position); +char *words[3]; +int wordCount = chopByChar(posDupe, ':', words, ArraySize(words)); +if (wordCount != 2) + errAbort(BAD_POS_FORMAT, position); +*retChrom = posDupe; + +stripChar(words[1], ','); +char *range = cloneString(words[1]); +wordCount = chopByChar(range, '-', words, ArraySize(words)); +if (wordCount != 2) + errAbort(BAD_POS_FORMAT, position); +*retStart = sqlUnsigned(words[0]); +*retEnd = sqlUnsigned(words[1]); +} + +void tabixFetch(char *fileOrUrl, char *position) +/* tabixFetch - Test lineFileOnTabix and lineFileSetTabixRegion + * (compare with cmd line tabix output). */ +{ +udcSetDefaultDir("/data/tmp/angie/udcCache"); +knetUdcInstall(); +struct lineFile *lf = lineFileOnTabix(fileOrUrl, TRUE); +if (lf == NULL) + exit(1); +int lineSize; +char *line = NULL; +boolean gotLine = FALSE; +if (0) +do + { + gotLine = lineFileNext(lf, &line, &lineSize); + puts(line); + } +while (gotLine && (line[0] == '#' || isEmpty(line))); + +char *chrom = NULL; +int start, end; +parsePosition(position, &chrom, &start, &end); +boolean success = lineFileSetTabixRegion(lf, chrom, start, end); +if (!success) + printf("*** Could not set position to %s\n", position); +else + { + printf("*** First (up to) 10 lines from query on %s:\n", position); + int i; + for (i=0; i < 10; i++) + { + if (lineFileNext(lf, &line, &lineSize)) + puts(line); + else break; + } + if (i == 0) + printf("*** No lines returned from query on %s\n", position); + } +lineFileClose(&lf); +} + +int main(int argc, char *argv[]) +/* Process command line. */ +{ +optionInit(&argc, argv, options); +if (argc != 3) + usage(); +tabixFetch(argv[1], argv[2]); +return 0; +} + +#else // no USE_TABIX +int main(int argc, char *argv[]) +/* Process command line. */ +{ +errAbort(COMPILE_WITH_TABIX, "tabixFetch"); +return 1; +} + +#endif // no USE_TABIX