e764efe5d0e596213c72e69f028df0a667d0a83c markd Mon Jun 29 00:43:22 2020 +0000 gfClient working with blat server running under xinetd diff --git src/jkOwnLib/gfBlatLib.c src/jkOwnLib/gfBlatLib.c index d7c7009..8bfd8cf 100644 --- src/jkOwnLib/gfBlatLib.c +++ src/jkOwnLib/gfBlatLib.c @@ -93,57 +93,62 @@ if (lDiff < 0) diff = -1; else if (lDiff > 0) diff = 1; else diff = 0; #ifdef SOLARIS_WORKAROUND_COMPILER_BUG_BUT_FAILS_IN_64_BIT diff = (unsigned long)(a->t3) - (unsigned long)(b->t3); /* Casts needed for Solaris. Thanks Darren Platt! */ #endif /* SOLARIS_WORKAROUND_COMPILER_BUG_BUT_FAILS_IN_64_BIT */ } if (diff == 0) diff = a->tStart - b->tStart; return diff; } -static void startSeqQuery(int conn, bioSeq *seq, char *type) +static void startSeqQuery(int conn, bioSeq *seq, char *type, char *dynGenome) /* Send a query that involves some sequence. */ { char buf[256]; safef(buf, sizeof(buf), "%s%s %d", gfSignature(), type, seq->size); +if (dynGenome != NULL) + { + safecat(buf, sizeof(buf), " "); + safecat(buf, sizeof(buf), dynGenome); + } mustWriteFd(conn, buf, strlen(buf)); if (read(conn, buf, 1) < 0) errAbort("startSeqQuery: read failed: %s", strerror(errno)); if (buf[0] != 'Y') errAbort("Expecting 'Y' from server, got %c", buf[0]); mustWriteFd(conn, seq->dna, seq->size); } static void gfServerWarn(bioSeq *seq, char *warning) /* Write out warning. */ { warn("couldn't process %s: %s", seq->name, warning); } -static struct gfRange *gfQuerySeq(int conn, struct dnaSeq *seq) +static struct gfRange *gfQuerySeq(int conn, struct dnaSeq *seq, char *dynGenome) /* Ask server for places sequence hits. */ { struct gfRange *rangeList = NULL, *range; char buf[256], *row[6]; int rowSize; -startSeqQuery(conn, seq, "query"); +startSeqQuery(conn, seq, "query", dynGenome); /* Read results line by line and save in list, and return. */ for (;;) { netRecieveString(conn, buf); if (sameString(buf, "end")) { break; } else if (startsWith("Error:", buf)) { gfServerWarn(seq, buf); break; } else @@ -196,46 +201,46 @@ if ((q = nextWord(&line)) == NULL) break; if ((t = nextWord(&line)) == NULL) internalErr(); lmAllocVar(lm, hit); hit->qStart = sqlUnsigned(q); hit->tStart = sqlUnsigned(t); slAddHead(&hitList, hit); } freez(&s); slReverse(&hitList); return hitList; } static void gfQuerySeqTrans(int conn, aaSeq *seq, struct gfClump *clumps[2][3], - struct lm *lm, struct gfSeqSource **retSsList, int *retTileSize) + struct lm *lm, struct gfSeqSource **retSsList, int *retTileSize, char *dynGenome) /* Query server for clumps where aa sequence hits translated index. */ { int frame, isRc, rowSize; struct gfClump *clump; int tileSize = 0; char *line; char buf[256], *row[12]; struct gfSeqSource *ssList = NULL, *ss; for (isRc = 0; isRc <= 1; ++isRc) for (frame = 0; frame<3; ++frame) clumps[isRc][frame] = NULL; /* Send sequence to server. */ -startSeqQuery(conn, seq, "protQuery"); +startSeqQuery(conn, seq, "protQuery", dynGenome); line = netRecieveString(conn, buf); if (!startsWith("Error:", line)) { tileSize = findTileSize(line); /* Read results line by line and save in memory. */ for (;;) { /* Read and parse first line that describes clump overall. */ netRecieveString(conn, buf); if (sameString(buf, "end")) { break; } else if (startsWith("Error:", buf)) @@ -266,48 +271,49 @@ } for (isRc = 0; isRc <= 1; ++isRc) for (frame = 0; frame<3; ++frame) slReverse(&clumps[isRc][frame]); } else { gfServerWarn(seq, line); } *retSsList = ssList; *retTileSize = tileSize; } static void gfQuerySeqTransTrans(int conn, struct dnaSeq *seq, struct gfClump *clumps[2][3][3], - struct lm *lm, struct gfSeqSource **retSsList, int *retTileSize) + struct lm *lm, struct gfSeqSource **retSsList, int *retTileSize, + char *dynGenome) /* Query server for clumps where translated DNA sequence hits translated * index. */ { int qFrame, tFrame, isRc, rowSize; struct gfClump *clump; int tileSize = 0; char *line; char buf[256], *row[12]; struct gfSeqSource *ssList = NULL, *ss; for (isRc = 0; isRc <= 1; ++isRc) for (qFrame = 0; qFrame<3; ++qFrame) for (tFrame = 0; tFrame<3; ++tFrame) clumps[isRc][qFrame][tFrame] = NULL; /* Send sequence to server. */ -startSeqQuery(conn, seq, "transQuery"); +startSeqQuery(conn, seq, "transQuery", dynGenome); line = netRecieveString(conn, buf); if (!startsWith("Error:", line)) { tileSize = findTileSize(line); /* Read results line by line and save in memory. */ for (;;) { /* Read and parse first line that describes clump overall. */ netRecieveString(conn, buf); if (sameString(buf, "end")) { break; } else if (startsWith("Error:", buf)) @@ -535,41 +541,42 @@ static void getTargetName(char *tSpec, boolean includeFile, char *targetName) /* Put sequence name, optionally prefixed by file: in targetName. */ { if (includeFile) { char seqName[128]; char fileName[PATH_LEN]; gfiGetSeqName(tSpec, seqName, fileName); safef(targetName, PATH_LEN, "%s:%s", fileName, seqName); } else gfiGetSeqName(tSpec, targetName, NULL); } void gfAlignStrand(int *pConn, char *tSeqDir, struct dnaSeq *seq, - boolean isRc, int minMatch, struct hash *tFileCache, struct gfOutput *out) + boolean isRc, int minMatch, struct hash *tFileCache, struct gfOutput *out, + char *dynGenome) /* Search genome on server with one strand of other sequence to find homology. * Then load homologous bits of genome locally and do detailed alignment. * Call 'outFunction' with each alignment that is found. */ { struct ssBundle *bun; struct gfRange *rangeList = NULL, *range; struct dnaSeq *targetSeq; char targetName[PATH_LEN]; -rangeList = gfQuerySeq(*pConn, seq); +rangeList = gfQuerySeq(*pConn, seq, dynGenome); close(*pConn); *pConn = -1; slSort(&rangeList, gfRangeCmpTarget); rangeList = gfRangesBundle(rangeList, ffIntronMax); for (range = rangeList; range != NULL; range = range->next) { getTargetName(range->tName, out->includeTargetFile, targetName); targetSeq = gfiExpandAndLoadCached(range, tFileCache, tSeqDir, seq->size, &range->tTotalSize, FALSE, FALSE, usualExpansion); AllocVar(bun); bun->qSeq = seq; bun->genoSeq = targetSeq; alignComponents(range, bun, ffCdna); ssStitch(bun, ffCdna, minMatch, ssAliCount); saveAlignments(targetName, range->tTotalSize, range->tStart, @@ -1024,50 +1031,50 @@ { slAddTail(&oldT3->next, t3); } else { hashAdd(t3Hash, range->tName, t3); } } *retT3Hash = t3Hash; *retSeqList = tSeqList; *retT3RefList = t3RefList; } void gfAlignTrans(int *pConn, char *tSeqDir, aaSeq *seq, int minMatch, - struct hash *tFileCache, struct gfOutput *out) + struct hash *tFileCache, struct gfOutput *out, char *dynGenome) /* Search indexed translated genome on server with an amino acid sequence. * Then load homologous bits of genome locally and do detailed alignment. * Call 'outFunction' with each alignment that is found. */ { struct ssBundle *bun; struct gfClump *clumps[2][3], *clump; struct gfRange *rangeList = NULL, *range, *rl; struct dnaSeq *targetSeq, *tSeqList = NULL; char targetName[PATH_LEN]; int tileSize; int frame, isRc = 0; struct hash *t3Hash = NULL; struct slRef *t3RefList = NULL, *ref; struct gfSeqSource *ssList = NULL, *ss; struct trans3 *t3; struct lm *lm = lmInit(0); /* Get clumps from server. */ -gfQuerySeqTrans(*pConn, seq, clumps, lm, &ssList, &tileSize); +gfQuerySeqTrans(*pConn, seq, clumps, lm, &ssList, &tileSize, dynGenome); close(*pConn); *pConn = -1; for (isRc = 0; isRc <= 1; ++isRc) { /* Figure out which parts of sequence we need to load. */ for (frame = 0; frame < 3; ++frame) { rl = seqClumpToRangeList(clumps[isRc][frame], frame); rangeList = slCat(rangeList, rl); } /* Convert from amino acid to nucleotide coordinates. */ rangeCoorTimes3(rangeList); slSort(&rangeList, gfRangeCmpTarget); rangeList = gfRangesBundle(rangeList, ffIntronMax); @@ -1146,51 +1153,51 @@ for (range = rangeList; range != NULL; range = range->next) { range->qStart = 3*range->qStart + qFrame; range->qEnd = 3*range->qEnd + qFrame; range->tStart = 3*range->tStart + tFrame; range->tEnd = 3*range->tEnd + tFrame; if (t3Hash) t3 = trans3Find(t3Hash, range->tSeq->name, range->tStart + tOffset, range->tEnd + tOffset); range->tSeq = t3->seq; range->t3 = t3; } } void gfAlignTransTrans(int *pConn, char *tSeqDir, struct dnaSeq *qSeq, boolean qIsRc, int minMatch, struct hash *tFileCache, - struct gfOutput *out, boolean isRna) + struct gfOutput *out, boolean isRna, char *dynGenome) /* Search indexed translated genome on server with an dna sequence. Translate * this sequence in three frames. Load homologous bits of genome locally * and do detailed alignment. Call 'outFunction' with each alignment * that is found. */ { struct gfClump *clumps[2][3][3], *clump; char targetName[PATH_LEN]; int qFrame, tFrame, tIsRc; struct gfSeqSource *ssList = NULL, *ss; struct lm *lm = lmInit(0); int tileSize; struct gfRange *rangeList = NULL, *rl, *range; struct trans3 *qTrans = trans3New(qSeq), *t3; struct slRef *t3RefList = NULL, *t3Ref; struct hash *t3Hash = NULL; struct dnaSeq *tSeqList = NULL; enum ffStringency stringency = (isRna ? ffCdna : ffLoose); /* Query server for clumps. */ -gfQuerySeqTransTrans(*pConn, qSeq, clumps, lm, &ssList, &tileSize); +gfQuerySeqTransTrans(*pConn, qSeq, clumps, lm, &ssList, &tileSize, dynGenome); close(*pConn); *pConn = -1; for (tIsRc=0; tIsRc <= 1; ++tIsRc) { /* Figure out which ranges need to be loaded and load them. */ for (qFrame = 0; qFrame < 3; ++qFrame) { for (tFrame = 0; tFrame < 3; ++tFrame) { rl = seqClumpToRangeList(clumps[tIsRc][qFrame][tFrame], tFrame); rangeList = slCat(rangeList, rl); } } rangeCoorTimes3(rangeList);