95030f73f067d8e8f9221a09c1811784607e4e72 markd Fri Jul 10 17:51:29 2020 -0700 split dynamic server genomeDataPrefix into genome and genomeDataDir. More verbose, but clearer diff --git src/gfClient/gfClient.c src/gfClient/gfClient.c index 26f26c4..280b031 100644 --- src/gfClient/gfClient.c +++ src/gfClient/gfClient.c @@ -19,31 +19,32 @@ {"dots", OPTION_INT}, {"out", OPTION_STRING}, {"maxIntron", OPTION_INT}, {"nohead", OPTION_BOOLEAN}, {"genomeDir", OPTION_STRING}, {NULL, 0} }; /* Variables that can be overridden by command line. */ int dots = 0; int minScore = 30; double minIdentity = 90; char *outputFormat = "psl"; char *qType = "dna"; char *tType = "dna"; -char *genomeDir = NULL; +char *genome = NULL; +char *genomeDataDir = NULL; void usage() /* Explain usage and exit. */ { printf( "gfClient v. %s - A client for the genomic finding program that produces a .psl file\n" "usage:\n" " gfClient host port seqDir in.fa out.psl\n" "where\n" " host is the name of the machine running the gfServer\n" " port is the same port that you started the gfServer with\n" " seqDir is the path of the .2bit or .nib files relative to the current dir\n" " (note these are needed by the client as well as the server)\n" " in.fa is a fasta format file. May contain multiple records\n" " out.psl is where to put the output\n" @@ -66,33 +67,37 @@ " mismatches minus some sort of gap penalty. Default is 30.\n" " -minIdentity=N Sets minimum sequence identity (in percent). Default is\n" " 90 for nucleotide searches, 25 for protein or translated\n" " protein searches.\n" " -out=type Controls output file format. Type is one of:\n" " psl - Default. Tab-separated format without actual sequence\n" " pslx - Tab-separated format with sequence\n" " axt - blastz-associated axt format\n" " maf - multiz-associated maf format\n" " sim4 - similar to sim4 format\n" " wublast - similar to wublast format\n" " blast - similar to NCBI blast format\n" " blast8- NCBI blast tabular format\n" " blast9 - NCBI blast tabular format with comments\n" " -maxIntron=N Sets maximum intron size. Default is %d.\n" - " -genomeDir=name When using a dynamic gfServer, this is the root-relative directory\n" - " of the genome query. It maybe prefixed by containing directory as\n" - " needed (see gfServer).\n", + " -genome=name When using a dynamic gfServer, The genome name is used to \n" + " find the data files relative to the dynamic gfServer root, named \n" + " in the form $genome.2bit, $genome.untrans.gfidx, and $genome.trans.gfidx, \n" + " -genomeDataDir=path\n" + " When using a dynamic gfServer, this is the dynamic gfServer root directory\n" + " that contained the genome data files. Defaults to being the root directory.\n" + " \n", gfVersion, ffIntronMaxDefault); exit(-1); } struct gfOutput *gvo; void gfClient(char *hostName, char *portName, char *tSeqDir, char *inName, char *outName, char *tTypeName, char *qTypeName) /* gfClient - A client for the genomic finding program that produces a .psl file. */ { struct lineFile *lf = lineFileOpen(inName, TRUE); static bioSeq seq; FILE *out = mustOpen(outName, "w"); enum gfType qType = gfTypeFromName(qTypeName); @@ -109,73 +114,79 @@ while (faSomeSpeedReadNext(lf, &seq.dna, &seq.size, &seq.name, qType != gftProt)) { int conn = gfConnect(hostName, portName); if (dots != 0) { if (++dotMod >= dots) { dotMod = 0; fputc('.', stdout); fflush(stdout); } } if (qType == gftProt && (tType == gftDnaX || tType == gftRnaX)) { gvo->reportTargetStrand = TRUE; - gfAlignTrans(&conn, tSeqDir, &seq, minScore, tFileCache, gvo, genomeDir); + gfAlignTrans(&conn, tSeqDir, &seq, minScore, tFileCache, gvo, genome, genomeDataDir); } else if ((qType == gftRnaX || qType == gftDnaX) && (tType == gftDnaX || tType == gftRnaX)) { gvo->reportTargetStrand = TRUE; gfAlignTransTrans(&conn, tSeqDir, &seq, FALSE, minScore, tFileCache, - gvo, qType == gftRnaX, genomeDir); + gvo, qType == gftRnaX, genome, genomeDataDir); if (qType == gftDnaX) { reverseComplement(seq.dna, seq.size); close(conn); conn = gfConnect(hostName, portName); gfAlignTransTrans(&conn, tSeqDir, &seq, TRUE, minScore, tFileCache, - gvo, FALSE, genomeDir); + gvo, FALSE, genome, genomeDataDir); } } else if ((tType == gftDna || tType == gftRna) && (qType == gftDna || qType == gftRna)) { - gfAlignStrand(&conn, tSeqDir, &seq, FALSE, minScore, tFileCache, gvo, genomeDir); + gfAlignStrand(&conn, tSeqDir, &seq, FALSE, minScore, tFileCache, gvo, genome, genomeDataDir); conn = gfConnect(hostName, portName); reverseComplement(seq.dna, seq.size); - gfAlignStrand(&conn, tSeqDir, &seq, TRUE, minScore, tFileCache, gvo, genomeDir); + gfAlignStrand(&conn, tSeqDir, &seq, TRUE, minScore, tFileCache, gvo, genome, genomeDataDir); } else { errAbort("Comparisons between %s queries and %s databases not yet supported", qTypeName, tTypeName); } gfOutputQuery(gvo, out); } if (out != stdout) printf("Output is in %s\n", outName); gfFileCacheFree(&tFileCache); } int main(int argc, char *argv[]) /* Process command line. */ { optionInit(&argc, argv, optionSpecs); if (argc != 6) usage(); if (optionExists("prot")) qType = tType = "prot"; qType = optionVal("q", qType); tType = optionVal("t", tType); if (sameWord(tType, "prot") || sameWord(tType, "dnax") || sameWord(tType, "rnax")) minIdentity = 25; minIdentity = optionFloat("minIdentity", minIdentity); minScore = optionInt("minScore", minScore); dots = optionInt("dots", 0); outputFormat = optionVal("out", outputFormat); -genomeDir = optionVal("genomeDir", NULL); +genome = optionVal("genome", NULL); +genomeDataDir = optionVal("genomeDataDir", NULL); +if ((genomeDataDir != NULL) && (genome == NULL)) + errAbort("-genomeDataDir requires the -genome option"); +if ((genome == NULL) && (genomeDataDir != NULL)) + genomeDataDir = "."; + /* set global for fuzzy find functions */ setFfIntronMax(optionInt("maxIntron", ffIntronMaxDefault)); gfClient(argv[1], argv[2], argv[3], argv[4], argv[5], tType, qType); return 0; }