f683064dc6a998206665b484790ef9d561e6c8a7 markd Sat Dec 5 22:42:53 2020 -0800 initial conversion to gfServer connection to object diff --git src/jkOwnLib/gfBlatLib.c src/jkOwnLib/gfBlatLib.c index 038292c..d3d9cdd 100644 --- src/jkOwnLib/gfBlatLib.c +++ src/jkOwnLib/gfBlatLib.c @@ -93,75 +93,75 @@ 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, char *genome, char *genomeDataDir) +static void startSeqQuery(struct gfConnection *conn, bioSeq *seq, char *type, char *genome, char *genomeDataDir) /* Send a query that involves some sequence. */ { char buf[1024]; // room for error message if we need it. safef(buf, sizeof(buf), "%s%s %d", gfSignature(), type, seq->size); if (genomeDataDir != NULL) { safecat(buf, sizeof(buf), " "); safecat(buf, sizeof(buf), genome); safecat(buf, sizeof(buf), " "); safecat(buf, sizeof(buf), genomeDataDir); } -mustWriteFd(conn, buf, strlen(buf)); -if (read(conn, buf, 1) < 0) +mustWriteFd(conn->fd, buf, strlen(buf)); +if (read(conn->fd, buf, 1) < 0) errAbort("startSeqQuery: read failed: %s", strerror(errno)); if (buf[0] != 'Y') { // try to get read of message, might be an a useful error - int n = read(conn, buf+1, sizeof(buf)-2); + int n = read(conn->fd, buf+1, sizeof(buf)-2); if (n >= 0) buf[n+1] = '\0'; errAbort("Expecting 'Y' from server, got %s", buf); } -mustWriteFd(conn, seq->dna, seq->size); +mustWriteFd(conn->fd, 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, char *genome, char *genomeDataDir) +static struct gfRange *gfQuerySeq(struct gfConnection *conn, struct dnaSeq *seq, char *genome, char *genomeDataDir) /* Ask server for places sequence hits. */ { struct gfRange *rangeList = NULL, *range; char buf[256], *row[6]; int rowSize; startSeqQuery(conn, seq, "query", genome, genomeDataDir); /* Read results line by line and save in list, and return. */ for (;;) { - netRecieveString(conn, buf); + netRecieveString(conn->fd, buf); if (sameString(buf, "end")) { break; } else if (startsWith("Error:", buf)) { gfServerWarn(seq, buf); break; } else { rowSize = chopLine(buf, row); if (rowSize < 6) errAbort("Expecting 6 words from server got %d", rowSize); range = gfRangeLoad(row); @@ -186,80 +186,80 @@ if (val == NULL) { internalErr(); break; } if (sameString("tileSize", var)) { tileSize = atoi(val); if (tileSize <= 0) internalErr(); } } return tileSize; } -struct gfHit *getHitsFromServer(int conn, struct lm *lm) +struct gfHit *getHitsFromServer(struct gfConnection *conn, struct lm *lm) /* Read a lone line of hits from server. */ { char *s, *line, *q, *t; struct gfHit *hitList = NULL, *hit; -s = line = netRecieveLongString(conn); +s = line = netRecieveLongString(conn->fd); for (;;) { 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], +static void gfQuerySeqTrans(struct gfConnection *conn, aaSeq *seq, struct gfClump *clumps[2][3], struct lm *lm, struct gfSeqSource **retSsList, int *retTileSize, char *genome, char *genomeDataDir) /* 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", genome, genomeDataDir); -line = netRecieveString(conn, buf); +line = netRecieveString(conn->fd, 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); + netRecieveString(conn->fd, buf); if (sameString(buf, "end")) { break; } else if (startsWith("Error:", buf)) { gfServerWarn(seq, buf); break; } rowSize = chopLine(buf, row); if (rowSize < 8) errAbort("Expecting 8 words from server got %d", rowSize); AllocVar(clump); clump->qStart = sqlUnsigned(row[0]); clump->qEnd = sqlUnsigned(row[1]); @@ -278,61 +278,61 @@ clump->hitList = getHitsFromServer(conn, lm); assert(slCount(clump->hitList) == clump->hitCount); } 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, +static void gfQuerySeqTransTrans(struct gfConnection *conn, struct dnaSeq *seq, struct gfClump *clumps[2][3][3], struct lm *lm, struct gfSeqSource **retSsList, int *retTileSize, char *genome, char *genomeDataDir) /* 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", genome, genomeDataDir); -line = netRecieveString(conn, buf); +line = netRecieveString(conn->fd, 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); + netRecieveString(conn->fd, buf); if (sameString(buf, "end")) { break; } else if (startsWith("Error:", buf)) { gfServerWarn(seq, buf); break; } rowSize = chopLine(buf, row); if (rowSize < 9) errAbort("Expecting 9 words from server got %d", rowSize); AllocVar(clump); clump->qStart = sqlUnsigned(row[0]); clump->qEnd = sqlUnsigned(row[1]); @@ -549,45 +549,45 @@ 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, +void gfAlignStrand(struct gfConnection *conn, char *tSeqDir, struct dnaSeq *seq, boolean isRc, int minMatch, struct hash *tFileCache, struct gfOutput *out, char *genome, char *genomeDataDir) /* 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, genome, genomeDataDir); -close(*pConn); -*pConn = -1; +rangeList = gfQuerySeq(conn, seq, genome, genomeDataDir); +close(conn->fd); +conn->fd = -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, bun, NULL, isRc, FALSE, ffCdna, minMatch, out); ssBundleFree(&bun); @@ -1039,54 +1039,54 @@ if ((oldT3 = hashFindVal(t3Hash, range->tName)) != NULL) { 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, +void gfAlignTrans(struct gfConnection *conn, char *tSeqDir, aaSeq *seq, int minMatch, struct hash *tFileCache, struct gfOutput *out, char *genome, char *genomeDataDir) /* 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, genome, genomeDataDir); -close(*pConn); -*pConn = -1; +gfQuerySeqTrans(conn, seq, clumps, lm, &ssList, &tileSize, genome, genomeDataDir); +close(conn->fd); +conn->fd = -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); loadHashT3Ranges(rangeList, tSeqDir, tFileCache, seq->size, isRc, &t3Hash, &tSeqList, &t3RefList); @@ -1161,56 +1161,56 @@ { struct gfRange *range; 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, +void gfAlignTransTrans(struct gfConnection *conn, char *tSeqDir, struct dnaSeq *qSeq, boolean qIsRc, int minMatch, struct hash *tFileCache, struct gfOutput *out, boolean isRna, char *genome, char *genomeDataDir) /* 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, genome, genomeDataDir); -close(*pConn); -*pConn = -1; +gfQuerySeqTransTrans(conn, qSeq, clumps, lm, &ssList, &tileSize, genome, genomeDataDir); +close(conn->fd); +conn->fd = -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); slSort(&rangeList, gfRangeCmpTarget); rangeList = gfRangesBundle(rangeList, ffIntronMax);