static struct slName *parsePath(char *path) /* Convert : separated path into a name list. */ { struct slName *list = NULL; char *dupe = cloneString(path); char *s, *e; for (s = dupe; s != NULL && s[0] != 0; s = e) { e = strchr(s, ':'); if (e != NULL) *e++ = 0; slNameAddTail(&list, expandTilde(s)); } freeMem(dupe); return list; }
static struct slRef *simpleSearchForTracksstruct(char *simpleEntry) // Performs the simple search and returns the found tracks. { struct slRef *tracks = NULL; // Prepare for trix search if (!isEmpty(simpleEntry)) { int trixWordCount = 0; char *tmp = cloneString(simpleEntry); char *val = nextWord(&tmp); struct slName *el, *trixList = NULL; while (val != NULL) { slNameAddTail(&trixList, val); trixWordCount++; val = nextWord(&tmp); } if (trixWordCount > 0) { // Unfortunately trixSearch can't handle the slName list int i; char **trixWords = needMem(sizeof(char *) * trixWordCount); for (i = 0, el = trixList; el != NULL; i++, el = el->next) trixWords[i] = strLower(el->name); // Now open the trix file char trixFile[HDB_MAX_PATH_STRING]; getSearchTrixFile(database, trixFile, sizeof(trixFile)); struct trix *trix = trixOpen(trixFile); struct trixSearchResult *tsList = trixSearch(trix, trixWordCount, trixWords, TRUE); for ( ; tsList != NULL; tsList = tsList->next) { struct track *track = (struct track *) hashFindVal(trackHash, tsList->itemId); if (track != NULL) // It is expected that this is NULL { // (e.g. when trix references trackDb tracks which have no tables) refAdd(&tracks, track); } } //trixClose(trix); // don't bother (this is a CGI that is about to end) } } return tracks; }
void txGeneAltProt(char *pepFile, char *isoformsFile, char *outFile) /* txGeneAltProt - Figure out statistics on number of alternative proteins produced by alt-splicing.. */ { struct hash *pepHash = faReadAllIntoHash(pepFile, dnaUpper); struct hash *totalUniqHash = hashNew(18); uglyf("Read %d from %s\n", pepHash->elCount, pepFile); int lastClusterId = -1; struct hash *uniqHash = NULL; struct slName *clusterList = NULL; FILE *f = mustOpen(outFile, "w"); struct lineFile *lf = lineFileOpen(isoformsFile, TRUE); char *row[2]; while (lineFileRow(lf, row)) { int clusterId = lineFileNeedNum(lf, row, 0); char *tx = row[1]; if (clusterId != lastClusterId) { if (uniqHash != NULL) { outputCluster(lastClusterId, clusterList, f); hashFree(&uniqHash); slFreeList(&clusterList); } uniqHash = hashNew(0); } lastClusterId = clusterId; struct dnaSeq *pep = hashFindVal(pepHash, tx); if (pep != NULL) { if (!hashLookup(uniqHash, pep->dna)) { hashAdd(uniqHash, pep->dna, NULL); slNameAddTail(&clusterList, tx); } if (!hashLookup(totalUniqHash, pep->dna)) hashAdd(totalUniqHash, pep->dna, NULL); } } outputCluster(lastClusterId, clusterList, f); verbose(1, "%d total unique proteins\n", totalUniqHash->elCount); carefulClose(&f); }
struct patch *patchLoadAll(char *fileName) /* Load in file with one patch per line in the format: * original new1 new2 ... newN * This suppresses patches where original and new are the same. */ { struct patch *list = NULL, *patch; struct lineFile *lf = lineFileOpen(fileName, TRUE); char *line; while (lineFileNextReal(lf, &line)) { AllocVar(patch); patch->source = cloneString(nextWord(&line)); char *dest; while ((dest = nextWord(&line)) != NULL) slNameAddTail(&patch->destList, cloneString(dest)); if (patch->destList != NULL) slAddHead(&list, patch); } lineFileClose(&lf); slReverse(&list); return list; }
void doSearchTracks(struct group *groupList) { if (!advancedJavascriptFeaturesEnabled(cart)) { warn("Requires advanced javascript features."); return; } struct group *group; char *groups[128]; char *labels[128]; int numGroups = 1; groups[0] = ANYLABEL; labels[0] = ANYLABEL; char *currentTab = cartUsualString(cart, TRACK_SEARCH_CURRENT_TAB, "simpleTab"); char *nameSearch = cartOptionalString(cart, TRACK_SEARCH_ON_NAME); #ifdef TRACK_SEARCH_ON_TYPE char *typeSearch = cartOptionalString(cart, TRACK_SEARCH_ON_TYPE); #else///ifndef TRACK_SEARCH_ON_TYPE char *typeSearch = NULL; #endif///def TRACK_SEARCH_ON_TYPE char *descSearch; char *groupSearch = cartOptionalString(cart, TRACK_SEARCH_ON_GROUP); boolean doSearch = sameString(cartOptionalString(cart, TRACK_SEARCH), "Search") || cartUsualInt(cart, TRACK_SEARCH_PAGER, -1) >= 0; struct sqlConnection *conn = hAllocConn(database); boolean metaDbExists = sqlTableExists(conn, "metaDb"); int numMetadataSelects, tracksFound = 0; int numMetadataNonEmpty = 0; char **mdbVar = NULL; char **mdbVal = NULL; #ifdef ONE_FUNC struct hash *parents = newHash(4); #endif///def ONE_FUNC boolean simpleSearch; struct trix *trix; char trixFile[HDB_MAX_PATH_STRING]; char **descWords = NULL; int descWordCount = 0; boolean searchTermsExist = FALSE; int cols; char buf[512]; if(sameString(currentTab, "simpleTab")) { descSearch = cartOptionalString(cart, TRACK_SEARCH_SIMPLE); simpleSearch = TRUE; freez(&nameSearch); #ifdef TRACK_SEARCH_ON_TYPE freez(&typeSearch); #endif///def TRACK_SEARCH_ON_TYPE freez(&groupSearch); } else { descSearch = cartOptionalString(cart, TRACK_SEARCH_ON_DESCR); simpleSearch = FALSE; } if(descSearch) stripChar(descSearch, '"'); trackList = getTrackList(&groupList, -2); // global makeGlobalTrackHash(trackList); // NOTE: This is necessary when container cfg by '*' results in vis changes // This will handle composite/view override when subtrack specific vis exists, AND superTrack reshaping. parentChildCartCleanup(trackList,cart,oldVars); // Subtrack settings must be removed when composite/view settings are updated getSearchTrixFile(database, trixFile, sizeof(trixFile)); trix = trixOpen(trixFile); slSort(&groupList, gCmpGroup); for (group = groupList; group != NULL; group = group->next) { groupTrackListAddSuper(cart, group); if (group->trackList != NULL) { groups[numGroups] = cloneString(group->name); labels[numGroups] = cloneString(group->label); numGroups++; if (numGroups >= ArraySize(groups)) internalErr(); } } safef(buf, sizeof(buf),"Search for Tracks in the %s %s Assembly", organism, hFreezeFromDb(database)); webStartWrapperDetailedNoArgs(cart, database, "", buf, FALSE, FALSE, FALSE, FALSE); hPrintf("<div style='max-width:1080px;'>"); hPrintf("<form action='%s' name='%s' id='%s' method='get'>\n\n", hgTracksName(),TRACK_SEARCH_FORM,TRACK_SEARCH_FORM); cartSaveSession(cart); // Creates hidden var of hgsid to avoid bad voodoo safef(buf, sizeof(buf), "%lu", clock1()); cgiMakeHiddenVar("hgt_", buf); // timestamps page to avoid browser cache hPrintf("<input type='hidden' name='db' value='%s'>\n", database); hPrintf("<input type='hidden' name='%s' id='currentTab' value='%s'>\n", TRACK_SEARCH_CURRENT_TAB, currentTab); hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_DEL_ROW); hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_ADD_ROW); hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_PAGER); hPrintf("<div id='tabs' style='display:none; %s'>\n" "<ul>\n" "<li><a href='#simpleTab'><B style='font-size:.9em;font-family: arial, Geneva, Helvetica, san-serif;'>Search</B></a></li>\n" "<li><a href='#advancedTab'><B style='font-size:.9em;font-family: arial, Geneva, Helvetica, san-serif;'>Advanced</B></a></li>\n" "</ul>\n" "<div id='simpleTab' style='max-width:inherit;'>\n",cgiBrowser()==btIE?"width:1060px;":"max-width:inherit;"); hPrintf("<table style='width:100%%; font-size:.9em;'><tr><td colspan='2'>"); hPrintf("<input type='text' name='%s' id='simpleSearch' class='submitOnEnter' value='%s' style='max-width:1000px; width:100%%;' onkeyup='findTracksSearchButtonsEnable(true);'>\n", TRACK_SEARCH_SIMPLE,descSearch == NULL ? "" : descSearch); if (simpleSearch && descSearch) searchTermsExist = TRUE; hPrintf("</td></tr><td style='max-height:4px;'></td></tr></table>"); //hPrintf("</td></tr></table>"); hPrintf("<input type='submit' name='%s' id='searchSubmit' value='search' style='font-size:.8em;'>\n", TRACK_SEARCH); hPrintf("<input type='button' name='clear' value='clear' class='clear' style='font-size:.8em;' onclick='findTracksClear();'>\n"); hPrintf("<input type='submit' name='submit' value='cancel' class='cancel' style='font-size:.8em;'>\n"); hPrintf("</div>\n"); // Advanced tab hPrintf("<div id='advancedTab' style='width:inherit;'>\n" "<table cellSpacing=0 style='width:inherit; font-size:.9em;'>\n"); cols = 8; // Track Name contains hPrintf("<tr><td colspan=3></td>"); hPrintf("<td nowrap><b style='max-width:100px;'>Track Name:</b></td>"); hPrintf("<td align='right'>contains</td>\n"); hPrintf("<td colspan='%d'>", cols - 4); hPrintf("<input type='text' name='%s' id='nameSearch' class='submitOnEnter' value='%s' onkeyup='findTracksSearchButtonsEnable(true);' style='min-width:326px; font-size:.9em;'>", TRACK_SEARCH_ON_NAME, nameSearch == NULL ? "" : nameSearch); hPrintf("</td></tr>\n"); // Description contains hPrintf("<tr><td colspan=2></td><td align='right'>and </td>"); hPrintf("<td><b style='max-width:100px;'>Description:</b></td>"); hPrintf("<td align='right'>contains</td>\n"); hPrintf("<td colspan='%d'>", cols - 4); hPrintf("<input type='text' name='%s' id='descSearch' value='%s' class='submitOnEnter' onkeyup='findTracksSearchButtonsEnable(true);' style='max-width:536px; width:536px; font-size:.9em;'>", TRACK_SEARCH_ON_DESCR, descSearch == NULL ? "" : descSearch); hPrintf("</td></tr>\n"); if (!simpleSearch && descSearch) searchTermsExist = TRUE; hPrintf("<tr><td colspan=2></td><td align='right'>and </td>\n"); hPrintf("<td><b style='max-width:100px;'>Group:</b></td>"); hPrintf("<td align='right'>is</td>\n"); hPrintf("<td colspan='%d'>", cols - 4); cgiMakeDropListFull(TRACK_SEARCH_ON_GROUP, labels, groups, numGroups, groupSearch, "class='groupSearch' style='min-width:40%; font-size:.9em;'"); hPrintf("</td></tr>\n"); if (!simpleSearch && groupSearch) searchTermsExist = TRUE; #ifdef TRACK_SEARCH_ON_TYPE // Track Type is (drop down) hPrintf("<tr><td colspan=2></td><td align='right'>and </td>\n"); hPrintf("<td nowrap><b style='max-width:100px;'>Data Format:</b></td>"); hPrintf("<td align='right'>is</td>\n"); hPrintf("<td colspan='%d'>", cols - 4); char **formatTypes = NULL; char **formatLabels = NULL; int formatCount = getFormatTypes(&formatLabels, &formatTypes); cgiMakeDropListFull(TRACK_SEARCH_ON_TYPE, formatLabels, formatTypes, formatCount, typeSearch, "class='typeSearch' style='min-width:40%; font-size:.9em;'"); hPrintf("</td></tr>\n"); if (!simpleSearch && typeSearch) searchTermsExist = TRUE; #endif///def TRACK_SEARCH_ON_TYPE // Metadata selects require careful accounting if(metaDbExists) numMetadataSelects = printMdbSelects(conn, cart, simpleSearch, &mdbVar, &mdbVal, &numMetadataNonEmpty, cols); else numMetadataSelects = 0; hPrintf("</table>\n"); hPrintf("<input type='submit' name='%s' id='searchSubmit' value='search' style='font-size:.8em;'>\n", TRACK_SEARCH); hPrintf("<input type='button' name='clear' value='clear' class='clear' style='font-size:.8em;' onclick='findTracksClear();'>\n"); hPrintf("<input type='submit' name='submit' value='cancel' class='cancel' style='font-size:.8em;'>\n"); //hPrintf("<a target='_blank' href='../goldenPath/help/trackSearch.html'>help</a>\n"); hPrintf("</div>\n</div>\n"); hPrintf("</form>\n"); hPrintf("</div>"); // Restricts to max-width:1000px; if(descSearch != NULL && !strlen(descSearch)) descSearch = NULL; if(groupSearch != NULL && sameString(groupSearch, ANYLABEL)) groupSearch = NULL; if(typeSearch != NULL && sameString(typeSearch, ANYLABEL)) typeSearch = NULL; if(!isEmpty(descSearch)) { char *tmp = cloneString(descSearch); char *val = nextWord(&tmp); struct slName *el, *descList = NULL; int i; while (val != NULL) { slNameAddTail(&descList, val); descWordCount++; val = nextWord(&tmp); } descWords = needMem(sizeof(char *) * descWordCount); for(i = 0, el = descList; el != NULL; i++, el = el->next) descWords[i] = strLower(el->name); } if (doSearch && simpleSearch && descWordCount <= 0) doSearch = FALSE; if(doSearch) { // Now search struct slRef *tracks = NULL; if(simpleSearch) tracks = simpleSearchForTracksstruct(trix,descWords,descWordCount); else tracks = advancedSearchForTracks(conn,groupList,descWords,descWordCount,nameSearch,typeSearch,descSearch,groupSearch,numMetadataNonEmpty,numMetadataSelects,mdbVar,mdbVal); // Sort and Print results enum sortBy sortBy = cartUsualInt(cart,TRACK_SEARCH_SORT,sbRelevance); tracksFound = slCount(tracks); if(tracksFound > 1) findTracksSort(&tracks,simpleSearch,sortBy); displayFoundTracks(cart,tracks,tracksFound,sortBy); } hFreeConn(&conn); webNewSection("About Track Search"); if(metaDbExists) hPrintf("<p>Search for terms in track names, descriptions, groups, and ENCODE " "metadata. If multiple terms are entered, only tracks with all terms " "will be part of the results."); else hPrintf("<p>Search for terms in track descriptions, groups, and names. " "If multiple terms are entered, only tracks with all terms " "will be part of the results."); hPrintf("<BR><a target='_blank' href='../goldenPath/help/trackSearch.html'>more help</a></p>\n"); webEndSectionTables(); }
void checkMetaFiles(struct mdbObj *mdbObj, char *downDir, struct hash *allNames) { verbose(1, "----------------------------------------------\n"); verbose(1, "Checking that files specified in metaDb exist in download dir\n"); verbose(1, "----------------------------------------------\n"); for(; mdbObj != NULL; mdbObj=mdbObj->next) { struct mdbVar *mdbVar = hashFindVal(mdbObj->varHash, "objType"); if (mdbVar == NULL) { warn("objType not found in object %s", mdbObj->obj); continue; } if (sameString(mdbVar->val, "composite")) // skip objType composite continue; mdbObj->deleteThis = FALSE; mdbVar = hashFindVal(mdbObj->varHash, "composite"); if (mdbVar == NULL) { warn("composite not found in object %s", mdbObj->obj); continue; } // char *composite = mdbVar->val; mdbVar = hashFindVal(mdbObj->varHash, "fileName"); if (mdbVar == NULL) { mdbObj->deleteThis = TRUE; warn("fileName not found in object %s", mdbObj->obj); continue; } char *fileName = mdbVar->val; char buffer[10 * 1024]; struct hash *bamNames = hashNew(8); struct slName *list = slNameListFromString(fileName, ','), *el; for(el=list; el; el=el->next) { if (hashLookup(allNames, el->name)) { warn("duplicate fileName entry: %s", el->name); } else { hashAdd(allNames, el->name, NULL); } if (endsWith(el->name,".bam")) { hashAdd(bamNames, el->name, NULL); } if (endsWith(el->name,".bam.bai")) { el->name[strlen(el->name)-4] = 0; struct hashEl *hel = hashLookup(bamNames, el->name); el->name[strlen(el->name)] = '.'; if (hel == NULL) { warn(".bam.bai without corresponding .bam: %s", el->name); } else { hel->val = (void *)1; } } } // see if we have to add any .bam.bai to the list for(el=list; el; el=el->next) { if (endsWith(el->name,".bam")) { struct hashEl *hel = hashLookup(bamNames, el->name); if (hel->val == NULL) { // we have to add a .bam.bai to the list char *bambai = addSuffix(el->name, ".bai"); warn(".bam.bai not found for corresponding .bam in meta.fileName: %s", el->name); slNameAddTail(&list, bambai); if (hashLookup(allNames, bambai)) { warn("duplicate fileName entry: %s", bambai); } else hashAdd(allNames, bambai, NULL); } } } // make sure the files are there for(el=list; el; el=el->next) { if (!startsWith(mdbObj->obj, el->name)) { warn("fileName %s does not start with object name %s", el->name, mdbObj->obj); } safef(buffer, sizeof buffer, "%s/%s", downDir, el->name); verbose(2, "checking for fileExists %s\n", buffer); if (!fileExists(buffer)) { mdbObj->deleteThis = TRUE; warn("metaDb file %s not found in download dir %s",buffer, downDir); } } } }
char *customPpNext(struct customPp *cpp) /* Return next line. */ { /* Check first for line to reuse. */ struct slName *reused = cpp->reusedLines; if (reused) { /* We need to keep line actually reusing in memory until next * call to customPpNext, so we move it to inReuse rather than * immediately freeing it. */ freeMem(cpp->inReuse); cpp->reusedLines = reused->next; cpp->inReuse = reused; return reused->name; } /* Get next line from file on top of stack. If at EOF * go to next file in stack. If get a http:// or https:// or ftp:// line * open file this references and push it onto stack. Meanwhile * squirrel away 'browser' lines. */ struct lineFile *lf; while ((lf = cpp->fileStack) != NULL) { char *line; if (lineFileNext(lf, &line, NULL)) { // if user pastes just a URL, create a track line automatically // also allow a filename from a local directory if it has been allowed via udc.localDir in hg.conf bool isLocalFile = cfgOption("udc.localDir")!=NULL && startsWith(cfgOption("udc.localDir"), line); if (startsWith("http://", line) || startsWith("https://", line) || startsWith("ftp://", line) || isLocalFile) { if (customTrackIsBigData(line)) line = bigUrlToTrackLine(line); else { lf = netLineFileOpen(line); slAddHead(&cpp->fileStack, lf); #ifdef PROGRESS_METER off_t remoteSize = 0; remoteSize = remoteFileSize(line); cpp->remoteFileSize = remoteSize; #endif continue; } } else if (!cpp->ignoreBrowserLines && startsWith("browser", line)) { char afterPattern = line[7]; if (isspace(afterPattern) || afterPattern == 0) { slNameAddTail(&cpp->browserLines, line); continue; } } return line; } else { cpp->fileStack = lf->next; lineFileClose(&lf); } } return NULL; }
struct rqlStatement *rqlStatementParse(struct lineFile *lf) /* Parse an RQL statement out of text */ { struct tokenizer *tkz = tokenizerOnLineFile(lf); tkz->uncommentShell = TRUE; tkz->uncommentC = TRUE; tkz->leaveQuotes = TRUE; struct rqlStatement *rql; AllocVar(rql); rql->command = cloneString(tokenizerMustHaveNext(tkz)); if (sameString(rql->command, "select")) { struct dyString *buf = dyStringNew(0); struct slName *list = NULL; char *tok = rqlParseFieldSpec(tkz, buf); /* Look for count(*) as special case. */ boolean countOnly = FALSE; if (sameString(tok, "count")) { char *paren = tokenizerNext(tkz); if (paren[0] == '(') { while ((paren = tokenizerMustHaveNext(tkz)) != NULL) { if (paren[0] == ')') break; } countOnly = TRUE; freez(&rql->command); rql->command = cloneString("count"); } else { tokenizerReuse(tkz); } } if (!countOnly) { list = slNameNew(tok); for (;;) { /* Parse out comma-separated field list. */ char *comma = tokenizerNext(tkz); if (comma == NULL || comma[0] != ',') { tokenizerReuse(tkz); break; } slNameAddHead(&list, rqlParseFieldSpec(tkz, buf)); } slReverse(&list); rql->fieldList = list; } dyStringFree(&buf); } else if (sameString(rql->command, "count")) { /* No parameters to count. */ } else errAbort("Unknown RQL command '%s line %d of %s\n", rql->command, lf->lineIx, lf->fileName); char *from = tokenizerNext(tkz); if (from != NULL) { if (sameString(from, "from")) { for (;;) { struct dyString *buf = dyStringNew(0); char *table = rqlParseFieldSpec(tkz, buf); slNameAddTail(&rql->tableList, table); char *comma = tokenizerNext(tkz); if (comma == NULL) break; if (comma[0] != ',') { tokenizerReuse(tkz); break; } dyStringFree(&buf); } } else { errAbort("missing 'from' clause in %s\n", rql->command); } } /* Parse where clause. */ char *where = tokenizerNext(tkz); if (where != NULL) { if (!sameString(where, "where")) { tokenizerReuse(tkz); } else { rql->whereClause = rqlParseExpression(tkz); rqlParseVarsUsed(rql->whereClause, &rql->whereVarList); } } /* Parse limit clause. */ char *limit = tokenizerNext(tkz); rql->limit = -1; if (limit != NULL) { if (!sameString(limit, "limit")) errAbort("Unknown clause '%s' line %d of %s", limit, lf->lineIx, lf->fileName); char *count = tokenizerMustHaveNext(tkz); if (!isdigit(count[0])) errAbort("Expecting number after limit, got %s line %d of %s", count, lf->lineIx, lf->fileName); rql->limit = atoi(count); } /* Check that are at end of statement. */ char *extra = tokenizerNext(tkz); if (extra != NULL) errAbort("Extra stuff starting with '%s' past end of statement line %d of %s", extra, lf->lineIx, lf->fileName); return rql; }
static void addIfExists(struct hash *hash, struct slName **pList, char *name) /* Add name to tail of list if it exists in hash. */ { if (hashLookup(hash, name)) slNameAddTail(pList, name); }
static struct slName *getProbeList(struct sqlConnection *conn, int id) /* Get list of probes with hyperlinks to probe info page. */ { struct slName *returnList = NULL; char query[256]; char *sidUrl = cartSidUrlString(cart); struct dyString *dy = dyStringNew(0); struct slInt *probeList = NULL, *probe; int submissionSource = 0; /* Make up a list of all probes in this image. */ safef(query, sizeof(query), "select probe from imageProbe where image=%d", id); probeList = sqlQuickNumList(conn, query); safef(query, sizeof(query), "select submissionSet.submissionSource from image, submissionSet" " where image.submissionSet = submissionSet.id and image.id=%d", id); submissionSource = sqlQuickNum(conn, query); for (probe = probeList; probe != NULL; probe = probe->next) { char *type; /* Create hyperlink to probe page around gene name. */ dyStringClear(dy); dyStringPrintf(dy, "<A HREF=\"%s?%s&%s=%d&%s=%d\" target=_parent>", hgVisiGeneCgiName(), sidUrl, hgpDoProbe, probe->val, hgpSs, submissionSource); safef(query, sizeof(query), "select probeType.name from probeType,probe where probe.id = %d " "and probe.probeType = probeType.id", probe->val); type = sqlQuickString(conn, query); dyStringPrintf(dy, "%s", naForEmpty(type)); if (sameWord(type, "antibody")) { char *abName; safef(query, sizeof(query), "select antibody.name from probe,antibody " "where probe.id = %d and probe.antibody = antibody.id" , probe->val); abName = sqlQuickString(conn, query); if (abName != NULL) { dyStringPrintf(dy, " %s", abName); freeMem(abName); } } else if (sameWord(type, "RNA")) { safef(query, sizeof(query), "select length(seq) from probe where id=%d", probe->val); if (sqlQuickNum(conn, query) > 0) dyStringPrintf(dy, " sequenced"); else { safef(query, sizeof(query), "select length(fPrimer) from probe where id=%d", probe->val); if (sqlQuickNum(conn, query) > 0) dyStringPrintf(dy, " from primers"); } } else if (sameWord(type, "BAC")) { char *name; safef(query, sizeof(query), "select bac.name from probe,bac " "where probe.id = %d and probe.bac = bac.id" , probe->val); name = sqlQuickString(conn, query); if (name != NULL) { dyStringPrintf(dy, " %s", name); freeMem(name); } } dyStringPrintf(dy, "</A>"); freez(&type); /* Add to return list. */ slNameAddTail(&returnList, dy->string); } slFreeList(&probeList); slReverse(&returnList); return returnList; }
static struct slName *geneProbeList(struct sqlConnection *conn, int id) /* Get list of gene names with hyperlinks to probe info page. */ { struct slName *returnList = NULL; char query[256], **row; struct sqlResult *sr; struct dyString *dy = dyStringNew(0); struct probeAndColor *pcList = NULL, *pc; int probeCount = 0; /* Make up a list of all probes in this image. */ safef(query, sizeof(query), "select probe,probeColor from imageProbe where image=%d", id); sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { AllocVar(pc); pc->probe = sqlUnsigned(row[0]); pc->probeColor = sqlUnsigned(row[1]); slAddHead(&pcList, pc); ++probeCount; } slReverse(&pcList); for (pc = pcList; pc != NULL; pc = pc->next) { int geneId; char *geneName; int probe = pc->probe; char *geneUrl = NULL; /* Get gene ID and name. */ safef(query, sizeof(query), "select gene from probe where id = %d", probe); geneId = sqlQuickNum(conn, query); geneName = vgGeneNameFromId(conn, geneId); /* Get url for known genes page if any. */ geneUrl = getKnownGeneUrl(conn, geneId); /* Print gene name, surrounded by hyperlink to known genes * page if possible. */ dyStringClear(dy); if (geneUrl != NULL) dyStringPrintf(dy, "<A HREF=\"%s\" target=_parent>", geneUrl); dyStringPrintf(dy, "%s", geneName); if (geneUrl != NULL) dyStringAppend(dy, "</A>"); freez(&geneName); /* Add color if there's more than one probe for this image. */ if (probeCount > 1) { char *color; safef(query, sizeof(query), "select probeColor.name from probeColor " "where probeColor.id = %d" , pc->probeColor); color = sqlQuickString(conn, query); if (color != NULL) dyStringPrintf(dy, " (%s)", color); freez(&color); } /* Add to return list. */ slNameAddTail(&returnList, dy->string); } slFreeList(&pcList); slReverse(&returnList); return returnList; }
void writeLaneArray(FILE *f, struct tagStanza *stanza, char *csvList) /* Write out an array of file objects base on file names in csvList */ { struct slName *list = csvParse(csvList), *file; /* Figure out number of files per lanes. We'll take the lane number for the * file names if available, but if not we'll assume list is sorted and will * put the appropriate number of files in each lane. */ int laneCounter = 1; int filesPerLane = 1; int curFileInLane = 0; char *pairedEnds = tagMustFindVal(stanza, "assay.seq.paired_ends"); if (!sameString(pairedEnds, "no")) filesPerLane = 2; /* First pass, make a list of lanes */ struct laneFiles *laneList = NULL, *lane; for (file = list; file != NULL; file = file->next) { /* Figure out laneIx, from file name if possible, otherwise by counting */ char *fileName = file->name; int laneIx = laneFromFileName(fileName); if (laneIx == 0) laneIx = laneCounter; /* Update laneCounter */ if (++curFileInLane >= filesPerLane) { ++laneCounter; curFileInLane = 0; } /* Find lane in laneList, make new lane if it's not there. */ lane = laneFilesFind(laneList, laneIx); if (lane == NULL) { AllocVar(lane); lane->laneIx = laneIx; slAddHead(&laneList, lane); } slNameAddTail(&lane->fileList, fileName); } slReverse(&laneList); slSort(&laneList, laneFilesCmp); /* Now make a lane array and go through lane list */ boolean firstOut = TRUE; fputc('[', f); for (lane = laneList; lane != NULL; lane = lane->next) { /* Write comma between lane objects */ if (firstOut) firstOut = FALSE; else fputc(',', f); /* Write lane object starting with lane index*/ fputc('{', f); fprintf(f, "\"%s\": %d", "number", lane->laneIx); /* Rest of lane fields are based on files we contain */ for (file = lane->fileList; file != NULL; file = file->next) { /* Calculate type */ char *fileName = file->name; char *type = NULL; if (sameString(pairedEnds, "no")) { type = "r1"; } else if (sameString(pairedEnds, "yes")) { int end = endFromFileName(fileName); if (end == 1) type = "r1"; else type = "r2"; } else errAbort("Unrecognized paired_ends %s", pairedEnds); fprintf(f, ",\"%s\":", type); writeJsonVal(f, fileName, FALSE); } fputc('}', f); } fputc(']', f); slFreeList(&list); }