long long currentVmPeak() /* return value of peak Vm memory usage (if /proc/ business exists) */ { long long vmPeak = 0; pid_t pid = getpid(); char temp[256]; safef(temp, sizeof(temp), "/proc/%d/status", (int) pid); struct lineFile *lf = lineFileMayOpen(temp, TRUE); if (lf) { char *line; while (lineFileNextReal(lf, &line)) { // typical line: 'VmPeak: 62646196 kB' // seems to always be kB if (stringIn("VmPeak", line)) { char *words[3]; chopByWhite(line, words, 3); vmPeak = sqlLongLong(words[1]); // assume always 2nd word break; } } lineFileClose(&lf); } return vmPeak; }
struct lineFile *lineFileOpen(char *fileName, bool zTerm) /* Open up a lineFile or die trying. */ { struct lineFile *lf = lineFileMayOpen(fileName, zTerm); if (lf == NULL) errAbort("Couldn't open %s , %s", fileName, strerror(errno)); return lf; }
void liftGl(char *destFile, struct hash *liftHash, int sourceCount, char *sources[]) /* Lift up coordinates in .gl file. */ { char dirBuf[256], chromName[256]; int i; char *source; char *contig; FILE *dest = mustOpen(destFile, "w"); struct lineFile *lf = NULL; int lineSize, wordCount; char *line, *words[32]; struct liftSpec *spec; int offset; if (how == carryMissing) warn("'carry' doesn't work for .gl files, ignoring"); for (i=0; i<sourceCount; ++i) { source = sources[i]; verbose(1, "Processing %s\n", source); contig = contigInDir(source, dirBuf); verbose(2,"#\tcontig: %s, source: %s, dirBuf: %s\n", contig, source, dirBuf); if (!startsWith("ctg", contig) && !startsWith("NC_", contig) && !startsWith("NT_", contig) && !startsWith("NG_", contig)) { sprintf(chromName, "chr%s", contig); contig = chromName; verbose(2,"#\tcontig: %s, chromName: %s\n", contig, chromName); } spec = findLift(liftHash, contig, lf); if (spec == NULL) continue; cantHandleSpecRevStrand(spec); offset = spec->offset; lf = lineFileMayOpen(source, TRUE); if (lf == NULL) { warn("%s doesn't exist, skipping", source); continue; } while (lineFileNext(lf, &line, &lineSize)) { int s, e; if ((wordCount = chopLine(line, words)) != 4) errAbort("Bad line %d of %s", lf->lineIx, lf->fileName); s = atoi(words[1]); e = atoi(words[2]); fprintf(dest, "%s\t%d\t%d\t%s\n", words[0], s+offset, e+offset, words[3]); } lineFileClose(&lf); if (dots) verbose(1, "\n"); } }
struct vcfFile *vcfFileMayOpen(char *fileOrUrl, int maxErr, int maxRecords) /* Parse a VCF file into a vcfFile object. If maxErr not zero, then * continue to parse until this number of error have been reached. A maxErr * less than zero does not stop and reports all errors. */ { struct lineFile *lf = NULL; if (startsWith("http://", fileOrUrl) || startsWith("ftp://", fileOrUrl) || startsWith("https://", fileOrUrl)) lf = netLineFileOpen(fileOrUrl); else lf = lineFileMayOpen(fileOrUrl, TRUE); struct vcfFile *vcff = vcfFileHeaderFromLineFile(lf, maxErr); vcfParseData(vcff, maxRecords); return vcff; }
struct mouseChromCache *newMouseChromCache(char *chrom, int chromSize, char *ratMouseDir) /* Create a new chromCache. */ { struct mouseChromCache *mcc; char fileName[512]; struct lineFile *lf; char *row[3]; int start,end; long long *pPos; /* Open up file with actual alignments. Warn and return NULL * if it doesn't exist. */ sprintf(fileName, "%s/%s.axt", ratMouseDir, chrom); lf = lineFileMayOpen(fileName, TRUE); /* Allocate structure and store basic info in it. */ AllocVar(mcc); mcc->name = cloneString(chrom); mcc->size = chromSize; mcc->lf = lf; if (lf == NULL) { warn("%s doesn't exist", fileName); if (!noDieMissing) noWarnAbort(); return mcc; } /* Read index file into bk. */ sprintf(fileName, "%s/%s.axt.ix", ratMouseDir, chrom); mcc->bk = binKeeperNew(0, chromSize); lf = lineFileOpen(fileName, TRUE); verbose(1, "Reading %s\n", fileName); while (lineFileRow(lf, row)) { start = lineFileNeedNum(lf, row, 0); end = lineFileNeedNum(lf, row, 1) + start; AllocVar(pPos); *pPos = atoll(row[2]); binKeeperAdd(mcc->bk, start, end, pPos); } lineFileClose(&lf); /* Return initialized object. */ return mcc; }
void printMem(FILE *f) /* Print out memory used and other stuff from linux. */ { struct lineFile *lf = lineFileMayOpen("/proc/self/stat", TRUE); if (lf != NULL) { char *line, *words[50]; int wordCount; if (lineFileNext(lf, &line, NULL)) { wordCount = chopLine(line, words); if (wordCount >= 23) fprintf(f, "memory usage %s, utime %s s/100, stime %s\n", words[22], words[13], words[14]); } lineFileClose(&lf); } }
static struct visiMatch *readMatchFile(char *fileName) /* Read in match file */ { struct visiMatch *matchList = NULL, *match; struct lineFile *lf = lineFileMayOpen(fileName, TRUE); if (lf != NULL) { char *row[2]; while (lineFileRow(lf, row)) { AllocVar(match); match->imageId = lineFileNeedNum(lf, row, 0); match->weight = lineFileNeedDouble(lf, row, 1); slAddHead(&matchList, match); } lineFileClose(&lf); slReverse(&matchList); } return matchList; }
struct vcfFile *vcfFileMayOpen(char *fileOrUrl, int maxErr, int maxRecords, boolean parseAll) /* Open fileOrUrl and parse VCF header; return NULL if unable. * If parseAll, then read in all lines, parse and store in * vcff->records; if maxErr >= zero, then continue to parse until * there are maxErr+1 errors. A maxErr less than zero does not stop * and reports all errors. Set maxErr to VCF_IGNORE_ERRS for silence */ { struct lineFile *lf = NULL; if (startsWith("http://", fileOrUrl) || startsWith("ftp://", fileOrUrl) || startsWith("https://", fileOrUrl)) lf = netLineFileOpen(fileOrUrl); else lf = lineFileMayOpen(fileOrUrl, TRUE); struct vcfFile *vcff = vcfFileHeaderFromLineFile(lf, maxErr); if (parseAll) { vcff->records = vcfParseData(vcff, maxRecords); lineFileClose(&(vcff->lf)); // Not sure why it is closed. Angie? } return vcff; }
void setAliBits(char *axtBestDir, char *chrom, int chromSize, Bits *aliBits, Bits *matchBits) /* Set bits where there are alignments and matches. */ { char axtFileName[512]; struct axt *axt; struct lineFile *lf; sprintf(axtFileName, "%s/%s.axt", axtBestDir, chrom); if ((lf = lineFileMayOpen(axtFileName, TRUE)) == NULL) { warn("Couldn't open %s", axtFileName); return; } while ((axt = axtRead(lf)) != NULL) { axtSetBits(axt, chromSize, aliBits, matchBits); axtFree(&axt); } lineFileClose(&lf); }
struct blackListRange *genbankBlackListParse(char *blackList) /* parse a black list file into blackListRange data structure */ { struct lineFile *lf = lineFileMayOpen(blackList, TRUE); if (lf == NULL) errAbort("Could not open black list file %s. ", blackList); struct blackListRange *ranges = NULL; char *words[2]; while(lineFileRow(lf, words)) { char *prefix1 = cloneString(words[0]); genbankDropVer(prefix1, prefix1); char *number1 = skipToNumeric(prefix1); int begin = atoi(number1); *number1 = 0; // null so now prefix1 points to only the prefix char *prefix2 = cloneString(words[1]); genbankDropVer(prefix2, prefix2); char *number2 = skipToNumeric(prefix2); int end = atoi(number2); *number2 = 0; // null so now prefix2 points to only the prefix if (differentString(prefix1, prefix2)) errAbort("blackList file %s has accesions with different prefixes on line %d\n", lf->fileName, lf->lineIx); if (begin > end) errAbort("blackList file %s has end before begin on line %d\n", lf->fileName, lf->lineIx); struct blackListRange *range; AllocVar(range); range->prefix = prefix1; range->begin = begin; range->end = end; slAddHead(&ranges, range); } return ranges; }
void raFoldIn(char *fileName, struct hash *hashOfHash) /* Read ra's in file name and fold them into hashOfHash. * This will add ra's and ra fields to whatever already * exists in the hashOfHash, overriding fields of the * same name if they exist already. */ { struct lineFile *lf = lineFileMayOpen(fileName, TRUE); if (lf != NULL) { struct hash *uniqHash = hashNew(0); char *name; while ((name = raFoldInOneRetName(lf, hashOfHash)) != NULL) { if (hashLookup(uniqHash, name)) errAbort("%s duplicated in record ending line %d of %s", name, lf->lineIx, lf->fileName); hashAdd(uniqHash, name, NULL); } lineFileClose(&lf); hashFree(&uniqHash); } }
struct segFile *segMayOpen(char *fileName) /* Open up a segment file for reading. Read header and verify. Prepare * for subsequent calls to segNext(). Return NULL if file does not exist. */ { struct segFile *sf; struct lineFile *lf; char *line, *name, *val, *word; char *sig = "##seg"; /* Open fileName. */ if ((lf = lineFileMayOpen(fileName, TRUE)) == NULL) return NULL; AllocVar(sf); sf->lf = lf; /* Check for a valid signature. */ lineFileNeedNext(lf, &line, NULL); if (!startsWith(sig, line)) errAbort("%s does not start with %s", fileName, sig); line += strlen(sig); /* parse name=val. */ while ((word = nextWord(&line)) != NULL) { name = word; val = strchr(word, '='); if (val == NULL) errAbort("Missing = after %s line 1 of %s", name, fileName); *val++ = 0; if (sameString(name, "version")) sf->version = atoi(val); } if (sf->version == 0) errAbort("No version line 1 of %s", fileName); return sf; }
struct mafFile *mafMayOpen(char *fileName) /* Open up a maf file and verify header. */ { struct mafFile *mf; struct lineFile *lf; char *line, *word; char *sig = "##maf"; if ((lf = lineFileMayOpen(fileName, TRUE)) == NULL) return NULL; AllocVar(mf); mf->lf = lf; lineFileNeedNext(lf, &line, NULL); if (!startsWith(sig, line)) { errAbort("%s does not start with %s", fileName, sig); } line += strlen(sig); while ((word = nextWord(&line)) != NULL) { /* Parse name=val. */ char *name = word; char *val = strchr(word, '='); if (val == NULL) errAbort("Missing = after %s line 1 of %s\n", name, fileName); *val++ = 0; if (sameString(name, "version")) mf->version = atoi(val); else if (sameString(name, "scoring")) mf->scoring = cloneString(val); } if (mf->version == 0) errAbort("No version line 1 of %s\n", fileName); return mf; }
struct slName *randomVcfIds(char *table, struct sqlConnection *conn, int count, boolean isTabix) /* Return some semi-random IDs from a VCF file. */ { /* Read 10000 items from vcf file, or if they ask for a big list, then 4x what they ask for. */ struct trackDb *tdb = hashFindVal(fullTableToTdbHash, table); char *fileName = vcfFileName(tdb, conn, table, hDefaultChrom(database)); struct lineFile *lf = isTabix ? lineFileTabixMayOpen(fileName, TRUE) : lineFileMayOpen(fileName, TRUE); if (lf == NULL) noWarnAbort(); int orderedCount = count * 4; if (orderedCount < 100) orderedCount = 100; struct slName *idList = NULL; char *words[4]; int i; for (i = 0; i < orderedCount && lineFileChop(lf, words); i++) { // compress runs of identical ID, in case most are placeholder if (i == 0 || !sameString(words[2], idList->name)) slAddHead(&idList, slNameNew(words[2])); } lineFileClose(&lf); /* Shuffle list and trim it to count if necessary. */ shuffleList(&idList); struct slName *sl; for (sl = idList, i = 0; sl != NULL; sl = sl->next, i++) { if (i+1 >= count) { slNameFreeList(&(sl->next)); break; } } freez(&fileName); return idList; }
void printVmPeak() /* print to stderr peak Vm memory usage (if /proc/ business exists) */ { pid_t pid = getpid(); char temp[256]; safef(temp, sizeof(temp), "/proc/%d/status", (int) pid); struct lineFile *lf = lineFileMayOpen(temp, TRUE); if (lf) { char *line; while (lineFileNextReal(lf, &line)) { if (stringIn("VmPeak", line)) { fprintf(stderr, "# pid=%d: %s\n", pid, line); break; } } lineFileClose(&lf); } else fprintf(stderr, "# printVmPeak: %s - not available\n", temp); fflush(stderr); }
void liftAgp(char *destFile, struct hash *liftHash, int sourceCount, char *sources[]) /* Lift up coordinates in .agp file. */ { FILE *dest = mustOpen(destFile, "w"); char *source; int i; struct lineFile *lf; int lineSize, wordCount; char *line, *words[32]; char *s; struct liftSpec *spec; int start = 0; int end = 0; int ix = 0; char newDir[256], newName[128], newExt[64]; struct bigInsert *bi; struct chromInserts *chromInserts; struct hash *insertHash = newHash(8); struct hash *contigsHash = newHash(10); boolean firstContig = TRUE; char lastContig[256]; char *contig; int lastEnd = 0; if (sourceCount < 2) usage(); if (how == carryMissing) warn("'carry' doesn't work for .agp files, ignoring"); splitPath(destFile, newDir, newName, newExt); /* Read in inserts file and process it. */ chromInsertsRead(sources[0], insertHash); chromInserts = hashFindVal(insertHash, newName); strcpy(lastContig, ""); for (i=1; i<sourceCount; ++i) { source = sources[i]; verbose(1, "Lifting %s\n", source); lf = lineFileMayOpen(source, TRUE); if (lf != NULL) { while (lineFileNext(lf, &line, &lineSize)) { /* Check for comments and just pass them through. */ s = skipLeadingSpaces(line); if (s[0] == '#') { fprintf(dest, "%s\n", line); continue; } /* Parse line, adjust offsets, write */ wordCount = chopLine(line, words); if (wordCount != 8 && wordCount != 9) malformedAgp(lf); contig = words[0]; if (!sameString(contig, lastContig)) { char *gapType = "contig"; char *ctg = rmChromPrefix(contig); int gapSize = chromInsertsGapSize(chromInserts, ctg, firstContig); if (hashLookup(contigsHash, contig)) errAbort("Contig repeated line %d of %s", lf->lineIx, lf->fileName); hashAdd(contigsHash, contig, NULL); if (gapSize != 0) { if ((bi = bigInsertBeforeContig(chromInserts, ctg)) != NULL) { gapType = bi->type; } fprintf(dest, "%s\t%d\t%d\t%d\tN\t%d\t%s\tno\n", newName, end+1, end+gapSize, ++ix, gapSize, gapType); } firstContig = FALSE; strcpy(lastContig, contig); } spec = findLift(liftHash, contig, lf); cantHandleSpecRevStrand(spec); start = numField(words, 1, 0, lf) + spec->offset; end = numField(words, 2, 0, lf) + spec->offset; if (end > lastEnd) lastEnd = end; if (!sameString(newName, spec->newName)) errAbort("Mismatch in new name between %s and %s", newName, spec->newName); fprintf(dest, "%s\t%d\t%d\t%d\t%s\t%s\t%s\t%s", newName, start, end, ++ix, words[4], words[5], words[6], words[7]); if (wordCount == 9) fprintf(dest, "\t%s", words[8]); fputc('\n', dest); } lineFileClose(&lf); if (dots) verbose(1, "\n"); } } if (chromInserts != NULL) { if ((bi = chromInserts->terminal) != NULL) { fprintf(dest, "%s\t%d\t%d\t%d\tN\t%d\t%s\tno\n", newName, lastEnd+1, lastEnd+bi->size, ++ix, bi->size, bi->type); } } if (ferror(dest)) errAbort("error writing %s", destFile); fclose(dest); }
void liftGap(char *destFile, struct hash *liftHash, int sourceCount, char *sources[]) /* Lift up coordinates in .gap file (just the gaps from .agp). Negative strad allowed */ { FILE *dest = mustOpen(destFile, "w"); char *source; int i; struct lineFile *lf; int lineSize, wordCount; char *line, *words[32]; char *s; struct liftSpec *spec; int start = 0; int end = 0; int ix = 0; char newDir[256], newName[128], newExt[64]; char lastContig[256]; char *contig; int lastEnd = 0; int fragStart, fragEnd; if (how == carryMissing) warn("'carry' doesn't work for .gap files, ignoring"); splitPath(destFile, newDir, newName, newExt); strcpy(lastContig, ""); for (i=0; i<sourceCount; ++i) { source = sources[i]; verbose(1, "Lifting %s\n", source); lf = lineFileMayOpen(source, TRUE); if (lf != NULL) { while (lineFileNext(lf, &line, &lineSize)) { /* Check for comments and just pass them through. */ s = skipLeadingSpaces(line); if (s[0] == '#') { fprintf(dest, "%s\n", line); continue; } /* Parse line, adjust offsets, write */ wordCount = chopLine(line, words); if (wordCount != 8 && wordCount != 9) malformedAgp(lf); if (words[4][0] != 'N' && words[4][0] != 'U') errAbort("Found non-gap in .gap file: %s", words[4]); contig = words[0]; spec = findLift(liftHash, contig, lf); start = fragStart = numField(words, 1, 0, lf); end = fragEnd = numField(words, 2, 0, lf); end = fragEnd; if (spec->strand == '-') { start = spec->oldSize - fragEnd + 1; end = spec->oldSize - fragStart + 1; } start += spec->offset; end += spec->offset; if (end > lastEnd) lastEnd = end; fprintf(dest, "%s\t%d\t%d\t%d\t%s\t%s\t%s\t%s", spec->newName, start, end, ++ix, words[4], words[5], words[6], words[7]); if (wordCount == 9) fprintf(dest, "\t%s", words[8]); fputc('\n', dest); } lineFileClose(&lf); if (dots) verbose(1, "\n"); } } if (ferror(dest)) errAbort("error writing %s", destFile); fclose(dest); }
void configMultiRegionPage() /* Do multi-region config page after setting track visibility. If vis is -2, then visibility * is unchanged. If -1 then set visibility to default, otherwise it should * be tvHide, tvDense, etc. */ { char *groupTarget; struct track *trackList; struct track *ideoTrack; struct group *groupList; int vis = -2; configInitTrackList(vis, &groupTarget, &trackList, &ideoTrack, &groupList); hPrintf("<FORM ACTION=\"%s\" NAME=\"mainForm\" METHOD=%s>\n", hgTracksName(), cartUsualString(cart, "formMethod", "POST")); webStartWrapperDetailedNoArgs(cart, database, "", "", FALSE, FALSE, FALSE, FALSE); cartSaveSession(cart); hPrintf("<BR>\n"); hTableStart(); virtModeType = cartUsualString(cart, "virtModeType", virtModeType); hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "default", sameWord("default", virtModeType)); hPrintf("</TD><TD>"); hPrintf("Exit multi-region mode"); hPrintf("</TD></TR>\n"); struct sqlConnection *conn = NULL; if (!trackHubDatabase(database)) // no db conn for assembly hubs conn = hAllocConn(database); // Do we have a gene table for exonMostly? findBestEMGeneTable(trackList); if (emGeneTable) { hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "exonMostly", sameWord("exonMostly", virtModeType)); hPrintf("</TD><TD>"); hPrintf("Show exons using %s. Use padding of: ", emGeneTrack->shortLabel); hIntVar("emPadding", cartUsualInt(cart, "emPadding", emPadding), 3); hPrintf(" bases."); hPrintf("</TD></TR>\n"); } if (emGeneTable) { hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "geneMostly", sameWord("geneMostly", virtModeType)); hPrintf("</TD><TD>"); hPrintf("Show genes using %s. Use padding of: ", emGeneTrack->shortLabel); hIntVar("gmPadding", cartUsualInt(cart, "gmPadding", gmPadding), 3); hPrintf(" bases."); hPrintf("</TD></TR>\n"); } /* obsolete if (conn && sqlTableExists(conn,"knownCanonical")) { hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "kcGenes", sameWord("kcGenes", virtModeType)); hPrintf("</TD><TD>"); hPrintf("Show gene regions genome-wide."); hPrintf("</TD></TR>\n"); } */ hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "customUrl", sameWord("customUrl", virtModeType)); hPrintf("</TD><TD>"); hPrintf("Enter Custom regions as BED, or a URL to them:<br>"); multiRegionsBedUrl = cartUsualString(cart, "multiRegionsBedUrl", multiRegionsBedUrl); struct dyString *dyMultiRegionsBedInput = dyStringNew(256); if (strstr(multiRegionsBedUrl,"://")) { dyStringAppend(dyMultiRegionsBedInput, multiRegionsBedUrl); } else { if (fileExists(multiRegionsBedUrl)) { struct lineFile *lf = lineFileMayOpen(multiRegionsBedUrl, TRUE); char *line; int lineSize; while (lineFileNext(lf, &line, &lineSize)) { dyStringPrintf(dyMultiRegionsBedInput, "%s\n", line); } lineFileClose(&lf); } } hPrintf("<TEXTAREA NAME='multiRegionsBedInput' ID='multiRegionsBedInput' rows='4' cols='58' style='white-space: pre;'>%s</TEXTAREA>", dyMultiRegionsBedInput->string); hPrintf("</TD></TR>\n"); /* The AllChroms option will be released in future if (emGeneTable && sqlTableExists(conn, emGeneTable)) { hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "singleTrans", sameWord("singleTrans", virtModeType)); hPrintf("</TD><TD>"); hPrintf("Show only one transcript using an ID from %s : ", emGeneTrack->shortLabel); char *trans = cartUsualString(cart, "singleTransId", singleTransId); char sql[1024]; sqlSafef(sql, sizeof sql, "select name from %s where name='%s'", emGeneTable, trans); char *result = sqlQuickString(conn, sql); if (!result) { sqlSafef(sql, sizeof sql, "select name from %s limit 1", emGeneTable); trans = sqlQuickString(conn, sql); } hTextVar("singleTransId", trans, 20); hPrintf("</TD></TR>\n"); } */ if (conn) { boolean altLocExists = sqlTableExists(conn, "altLocations"); boolean fixLocExists = sqlTableExists(conn, "fixLocations"); if (altLocExists || fixLocExists) { hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "singleAltHaplo", sameWord("singleAltHaplo", virtModeType)); hPrintf("</TD><TD>"); hPrintf("Show one alternate haplotype"); if (fixLocExists) hPrintf(" or fix patch"); hPrintf(", placed on its chromosome, using ID: "); char *haplo = cartUsualString(cart, "singleAltHaploId", singleAltHaploId); char *foundHaplo = NULL; char sql[1024]; if (altLocExists) { sqlSafef(sql, sizeof sql, "select name from altLocations where name rlike '^%s(:[0-9-]+)?'", haplo); foundHaplo = sqlQuickString(conn, sql); } if (!foundHaplo && fixLocExists) { sqlSafef(sql, sizeof sql, "select name from fixLocations where name rlike '^%s(:[0-9-]+)?'", haplo); foundHaplo = sqlQuickString(conn, sql); } if (!foundHaplo) { if (altLocExists) sqlSafef(sql, sizeof sql, "select name from altLocations limit 1"); else sqlSafef(sql, sizeof sql, "select name from fixLocations limit 1"); haplo = sqlQuickString(conn, sql); chopSuffixAt(haplo, ':'); } hTextVar("singleAltHaploId", haplo, 60); hPrintf("</TD></TR>\n"); } } /* disable demo for now if (sameString(database,"hg19") || sameString(database, "hg38")) { hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "demo1", sameWord("demo1", virtModeType)); hPrintf("</TD><TD>"); hPrintf("demo1 two windows on two chroms (default pos on chr21, and same loc on chr22)"); hPrintf("</TD></TR>\n"); } */ /* Disabled for now hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "demo2", sameWord("demo2", virtModeType)); hPrintf("</TD><TD>"); hPrintf("demo2 multiple "); hIntVar("demo2NumWindows", cartUsualInt(cart, "demo2NumWindows", demo2NumWindows), 3); hPrintf(" windows on one chrom chr21 def posn, window size "); hIntVar("demo2WindowSize", cartUsualInt(cart, "demo2WindowSize", demo2WindowSize), 3); hPrintf(" and step size "); hIntVar("demo2StepSize", cartUsualInt(cart, "demo2StepSize", demo2StepSize), 3); hPrintf(" exon-like"); hPrintf("</TD></TR>\n"); */ /* The AllChroms option will be released in future if (conn) // requires chromInfo from database. { // TODO allow it to use assembly hubs via trackHubAllChromInfo() ? hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "allChroms", sameWord("allChroms", virtModeType)); hPrintf("</TD><TD>"); hPrintf("<br>Show all chromosomes.<br><span style='color:red'>Warning:</span> Turn off all tracks except bigBed, bigWig, and very sparse tracks.<br>Press Hide All to hide all tracks."); hPrintf("</TD></TR>\n"); } */ /* Disabled for now hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "demo4", sameWord("demo4", virtModeType)); hPrintf("</TD><TD>"); hPrintf("demo4 multiple (311) windows showing exons from TITIN gene uc031rqd.1."); hPrintf("</TD></TR>\n"); */ /* Disabled for now hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "demo5", sameWord("demo5", virtModeType)); hPrintf("</TD><TD>"); hPrintf("demo5 alt locus on hg38. Shows alt chrom surrounded by regions of same size from reference genome."); hPrintf("</TD></TR>\n"); */ /* Disabled for now hPrintf("<TR><TD>"); cgiMakeRadioButton("virtModeType", "demo6", sameWord("demo6", virtModeType)); hPrintf("</TD><TD>"); hPrintf("demo6 shows zoomed in exon-exon junction from SOD1 gene, between exon1 and exon2."); hPrintf("</TD></TR>\n"); */ hTableEnd(); hPrintf("<BR>\n"); hPrintf("<TABLE style=\"border:0px; \">\n"); hPrintf("<TR><TD>"); hCheckBox("emAltHighlight", cartUsualBoolean(cart, "emAltHighlight", FALSE)); hPrintf("</TD><TD>"); hPrintf("Highlight alternating regions in multi-region view"); hPrintf("</TD></TR>\n"); hPrintf("</TABLE>\n"); hPrintf("<BR>\n"); hPrintf("<TABLE style=\"border:0px;width:650px \">\n"); hPrintf("<TR><TD>"); cgiMakeButton("topSubmit", "submit"); hPrintf("</TD><TD align=right>"); hPrintf("<A HREF=\"../goldenPath/help/multiRegionHelp.html\" target=_blank>Help</A>\n"); hPrintf("</TD></TR>\n"); hPrintf("</TABLE>\n"); hFreeConn(&conn); cgiDown(0.9); freez(&groupTarget); webEndSectionTables(); hPrintf("</FORM>"); }
void showSchemaVcf(char *table, struct trackDb *tdb, boolean isTabix) /* Show schema on vcf. */ { struct sqlConnection *conn = hAllocConn(database); char *fileName = vcfFileName(tdb, conn, table, hDefaultChrom(database)); struct asObject *as = vcfAsObj(); hPrintf("<B>Database:</B> %s", database); hPrintf(" <B>Primary Table:</B> %s<br>", table); hPrintf("<B>VCF File:</B> %s", fileName); hPrintf("<BR>\n"); hPrintf("<B>Format description:</B> %s<BR>", as->comment); hPrintf("See the <A HREF=\"%s\" target=_blank>Variant Call Format specification</A> for more details<BR>\n", "http://www.1000genomes.org/wiki/analysis/vcf4.0"); /* Put up table that describes fields. */ hTableStart(); hPrintf("<TR><TH>field</TH>"); hPrintf("<TH>description</TH> "); puts("</TR>\n"); struct asColumn *col; int colCount = 0; for (col = as->columnList; col != NULL; col = col->next) { hPrintf("<TR><TD><TT>%s</TT></TD>", col->name); hPrintf("<TD>%s</TD></TR>", col->comment); ++colCount; } hTableEnd(); /* Put up another section with sample rows. */ webNewSection("Sample Rows"); hTableStart(); /* Fetch sample rows. */ struct lineFile *lf = isTabix ? lineFileTabixMayOpen(fileName, TRUE) : lineFileMayOpen(fileName, TRUE); if (lf == NULL) noWarnAbort(); char *row[VCF_MAX_SCHEMA_COLS]; int i; for (i = 0; i < 10; i++) { int colCount = lineFileChop(lf, row); int colIx; if (i == 0) { // Print field names as column headers, using colCount to compute genotype span hPrintf("<TR>"); for (colIx = 0, col = as->columnList; col != NULL && colIx < colCount; colIx++, col = col->next) { if (sameString("genotypes", col->name) && colCount > colIx+1) hPrintf("<TH colspan=%d>%s</TH>", colCount - colIx, col->name); else hPrintf("<TH>%s</TH>", col->name); } hPrintf("</TR>\n"); } hPrintf("<TR>"); for (colIx=0; colIx < colCount; ++colIx) { if (colCount > VCFDATALINE_NUM_COLS && colIx == colCount - 1) hPrintf("<TD>...</TD>"); else writeHtmlCell(row[colIx]); } hPrintf("</TR>\n"); } hTableEnd(); printTrackHtml(tdb); /* Clean up and go home. */ lineFileClose(&lf); freeMem(fileName); hFreeConn(&conn); }
void sortGenes(struct sqlConnection *conn) /* Put up sort gene page. */ { cartWebStart(cart, database, "Finding Candidate Genes for Gene Sorter"); if (!hgNearOk(database)) errAbort("Sorry, gene sorter not available for this database."); /* Get list of regions. */ struct genoGraph *gg = ggFirstVisible(); double threshold = getThreshold(); struct bed3 *bed, *bedList = regionsOverThreshold(gg); /* Figure out what table and column are the sorter's main gene set. */ struct hash *genomeRa = hgReadRa(genome, database, "hgNearData", "genome.ra", NULL); char *geneTable = hashMustFindVal(genomeRa, "geneTable"); char *idColumn = hashMustFindVal(genomeRa, "idColumn"); /* if marker labels were present when the file was uploaded, they are saved here */ char cgmName[256]; safef(cgmName, sizeof(cgmName), "%s.cgm", gg->binFileName); struct lineFile *m = lineFileMayOpen(cgmName, TRUE); char *cgmRow[4]; cgmRow[0] = ""; /* dummy row */ cgmRow[1] = ""; cgmRow[2] = "0"; cgmRow[3] = "0"; FILE *g = NULL; int markerCount = 0; struct tempName snpTn; if (m) { /* Create custom column output file. */ trashDirFile(&snpTn, "hgg", "marker", ".mrk"); g = mustOpen(snpTn.forCgi, "w"); fprintf(g, "column name=\"%s Markers\" shortLabel=\"%s Markers over threshold\" longLabel=\"%s Markers in regions over threshold\" " "visibility=on priority=99 " "\n" , gg->shortLabel , gg->shortLabel , gg->shortLabel ); } /*** Build up hash of all transcriptHash that are in region. */ struct hash *transcriptHash = hashNew(16); /* This loop handles one chromosome at a time. It depends on * the bedList being sorted by chromosome. */ for (bed = bedList; bed != NULL; ) { /* Make binKeeper and stuff in all regions in this chromosome into it. */ char *chrom = bed->chrom; int chromSize = hChromSize(database, chrom); struct binKeeper *bk = binKeeperNew(0, chromSize); while (bed != NULL && sameString(chrom, bed->chrom)) { binKeeperAdd(bk, bed->chromStart, bed->chromEnd, bed); bed = bed->next; } struct binKeeper *bkGenes = NULL; if (m) bkGenes = binKeeperNew(0, chromSize); /* Query database to find out bounds of all genes on this chromosome * and if they overlap any of the regions then put them in the hash. */ char query[512]; safef(query, sizeof(query), "select name,txStart,txEnd from %s where chrom='%s'", geneTable, chrom); struct sqlResult *sr = sqlGetResult(conn, query); char **row; while ((row = sqlNextRow(sr)) != NULL) { char *name = row[0]; int start = sqlUnsigned(row[1]); int end = sqlUnsigned(row[2]); if (binKeeperAnyOverlap(bk, start, end)) { hashStore(transcriptHash, name); if (m) binKeeperAdd(bkGenes, start, end, cloneString(name)); } } sqlFreeResult(&sr); if (m) { /* Read cgm file if it exists, looking at all markers on this chromosome * and if they overlap any of the regions and genes then output them. */ do { // marker, chrom, chromStart, val char *marker = cgmRow[0]; char *chr = cgmRow[1]; int start = sqlUnsigned(cgmRow[2]); int end = start+1; double val = sqlDouble(cgmRow[3]); int cmp = strcmp(chr,chrom); if (cmp > 0) break; if (cmp == 0) { if (val >= threshold) { struct binElement *el, *bkList = binKeeperFind(bkGenes, start, end); for (el = bkList; el; el=el->next) { /* output to custom column trash file */ fprintf(g, "%s %s\n", (char *)el->val, marker); } if (bkList) { ++markerCount; slFreeList(&bkList); } } } } while (lineFileRow(m, cgmRow)); } /* Clean up for this chromosome. */ binKeeperFree(&bk); if (m) { /* For speed, we do not free up the values (cloned the kg names earlier) */ binKeeperFree(&bkGenes); } } /* Get list of all transcripts in regions. */ struct hashEl *el, *list = hashElListHash(transcriptHash); /* Create file with all matching gene IDs. */ struct tempName keyTn; trashDirFile(&keyTn, "hgg", "key", ".key"); FILE *f = mustOpen(keyTn.forCgi, "w"); for (el = list; el != NULL; el = el->next) fprintf(f, "%s\n", el->name); carefulClose(&f); /* Print out some info. */ hPrintf("Thresholding <i>%s</i> at %g. ", gg->shortLabel, threshold); hPrintf("There are %d regions covering %lld bases.<BR>\n", slCount(bedList), bedTotalSize((struct bed*)bedList) ); hPrintf("Installed a Gene Sorter filter that selects only genes in these regions.<BR>\n"); if (m) { hPrintf("There are %d markers in the regions over threshold that overlap knownGenes.<BR>\n", markerCount); hPrintf("Installed a Gene Sorter custom column called \"%s Markers\" with these markers.<BR>\n", gg->shortLabel); } /* close custom column output file */ if (m) { lineFileClose(&m); carefulClose(&g); } /* Stuff cart variable with name of file. */ char keyCartName[256]; safef(keyCartName, sizeof(keyCartName), "%s%s.keyFile", advFilterPrefix, idColumn); cartSetString(cart, keyCartName, keyTn.forCgi); cartSetString(cart, customFileVarName, snpTn.forCgi); char snpVisCartNameTemp[256]; char *snpVisCartName = NULL; safef(snpVisCartNameTemp, sizeof(snpVisCartNameTemp), "%s%s Markers.vis", colConfigPrefix, gg->shortLabel); snpVisCartName = replaceChars(snpVisCartNameTemp, " ", "_"); cartSetString(cart, snpVisCartName, "1"); freeMem(snpVisCartName); hPrintf("<FORM ACTION=\"../cgi-bin/hgNear\" METHOD=GET>\n"); cartSaveSession(cart); hPrintf("<CENTER>"); cgiMakeButton("submit", "go to gene sorter"); hPrintf("</CENTER>"); hPrintf("</FORM>"); cartWebEnd(); }