struct pgo *readC2g(char *fileName) /* Read a C2g file into memory. */ { FILE *f = mustOpen(fileName, "r"); struct pgo *list = NULL, *el; char lineBuf[128]; char *words[4]; int wordCount; int lineCount = 0; while (fgets(lineBuf, sizeof(lineBuf), f) != NULL) { ++lineCount; wordCount = chopLine(lineBuf, words); if (wordCount == 0) continue; /* Ignore blank lines. */ if (wordCount != 3) { errAbort("Strange line starting with %s line %d of %s", words[0], lineCount, fileName); } AllocVar(el); if (!wormParseChromRange(words[0], &el->chrom, &el->start, &el->end)) errAbort("Bad chromosome range line %d of %s", lineCount, fileName); el->strand = words[1][0]; el->gene = cloneString(words[2]); slAddHead(&list, el); } slReverse(&list); return list; }
boolean wormIsChromRange(char *in) /* Check to see if the input is formatted correctly to be * a range of a chromosome. */ { char *chromId; int start, end; boolean ok; ok = wormParseChromRange(in, &chromId, &start, &end); return ok; }
void doMiddle() /* Write middle part of .html. */ { DNA *targetDna; char *chrom; int tStart, tEnd; struct xaAli *xa; int bothStart, bothEnd; char cbCosmidName[256]; char *s; /* Get input variables from CGI. */ char *qOrganism = cgiString("qOrganism"); char *tOrganism = cgiString("tOrganism"); char *query = cgiString("query"); char *target = cgiString("target"); char *strandString = cgiString("strand"); char strand = strandString[0]; boolean showSym = cgiBoolean("symbols"); boolean gotClickPos = cgiVarExists("clickPos"); double clickPos; if (gotClickPos) clickPos = cgiDouble("clickPos"); strcpy(cbCosmidName, query); if ((s = strrchr(cbCosmidName, '.')) != NULL) *s = 0; /* Get xaAli. */ xa = getOneXaAli(qOrganism, query); printf("<H2>Alignment of <I>C. briggsae</I> %s:%d-%d and <I>C. elegans</I> %s</H2>\n", cbCosmidName, xa->qStart, xa->qEnd, target); htmlParagraph("<I>C. briggsae</I> appears on top. Coding regions in <I>C. elegans</I> are in upper case."); /* Get display window. */ if (!wormParseChromRange(target, &chrom, &tStart, &tEnd)) errAbort("Target %s isn't formatted correctly", target); /* Figure out intersection of display window and xeno-alignment */ bothStart = max(xa->tStart, tStart); bothEnd = min(xa->tEnd, tEnd); /* Get upper-cased-exon target DNA. */ targetDna = wormChromPartExonsUpper(chrom, bothStart, bothEnd - bothStart); upcCorresponding(targetDna, bothEnd - bothStart, xa->tSym, bothStart - xa->tStart); printf("<TT><PRE>"); showTargetRange(xa, bothStart - xa->tStart, bothEnd-bothStart, strand, showSym); printf("</TT></PRE>"); }
static boolean findAltSpliceRange(char *name, struct snof *snof, FILE *f, char **retChrom, int *retStart, int *retEnd, char *retStrand) /* Return range of chromosome covered by a gene and all of it's isoforms. */ { char baseName[64]; char bName[64]; int snIx, maxIx; int start = 0x7fffffff; int end = -start; char lineBuf[128]; char *words[3]; int wordCount; int baseNameSize; strcpy(baseName, name); makeIsoformBaseName(baseName); baseNameSize = strlen(baseName); if (!snofFindFirstStartingWith(snof, baseName, baseNameSize, &snIx)) return FALSE; maxIx = snofElementCount(snof); for (;snIx < maxIx; ++snIx) { long offset; char *geneName; snofNameOffsetAtIx(snof, snIx, &geneName, &offset); if (strncmp(geneName, baseName, baseNameSize) != 0) break; strcpy(bName, geneName); makeIsoformBaseName(bName); if (sameString(baseName, bName)) { int s, e; fseek(f, offset, SEEK_SET); mustGetLine(f, lineBuf, sizeof(lineBuf)); wordCount = chopLine(lineBuf, words); assert(wordCount == 3); wormParseChromRange(words[0], retChrom, &s, &e); *retStrand = words[1][0]; if (start > s) start = s; if (end < e) end = e; } } *retStart = start; *retEnd = end; return TRUE; }
boolean wormGeneRange(char *name, char **retChrom, char *retStrand, int *retStart, int *retEnd) /* Return chromosome position of a chrom range, gene, ORF, cosmid, or nameless cluster. */ { static struct snof *c2gSnof = NULL, *c2cSnof = NULL; static FILE *c2gFile = NULL, *c2cFile = NULL; long offset; char fileName[512]; struct slName *syn = NULL; boolean ok; if (wormIsChromRange(name)) { *retStrand = '.'; return wormParseChromRange(name, retChrom, retStart, retEnd); } getDirs(); /* Translate biologist type name to cosmid.N name */ if (wormIsGeneName(name)) { syn = wormGeneToOrfNames(name); if (syn != NULL) { name = syn->name; } } if (wormFixupOrfName(name)) /* See if ORF, and if so make nice. */ { if (c2gSnof == NULL) { sprintf(fileName, "%sc2g", featDir); c2gSnof = snofMustOpen(fileName); sprintf(fileName, "%sc2g", featDir); c2gFile = mustOpen(fileName, "rb"); } ok = findAltSpliceRange(name, c2gSnof, c2gFile, retChrom, retStart, retEnd, retStrand); } else /* Lets say it's a cosmid. */ { char lineBuf[128]; char *words[3]; int wordCount; touppers(name); if (c2cSnof == NULL) { sprintf(fileName, "%sc2c", featDir); c2cSnof = snofMustOpen(fileName); sprintf(fileName, "%sc2c", featDir); c2cFile = mustOpen(fileName, "rb"); } if (!snofFindOffset(c2cSnof, name, &offset) ) return FALSE; fseek(c2cFile, offset, SEEK_SET); mustGetLine(c2cFile, lineBuf, sizeof(lineBuf)); wordCount = chopLine(lineBuf, words); assert(wordCount == 3); assert(strcmp(words[2], name) == 0); assert(wormIsChromRange(words[0])); *retStrand = words[1][0]; ok = wormParseChromRange(words[0], retChrom, retStart, retEnd); } slFreeList(&syn); return ok; }