f8b08276dd3ccd91b1c1d1649434f38e33a96a48 markd Mon Nov 29 15:05:36 2010 -0800 Changes from Bejerano lab to support great on multiple assemblies diff --git src/hg/hgTables/great.c src/hg/hgTables/great.c index 85c9fd5..5d59081 100644 --- src/hg/hgTables/great.c +++ src/hg/hgTables/great.c @@ -1,70 +1,129 @@ /* great - stuff related to GREAT. */ #include "common.h" #include "cheapcgi.h" #include "hgTables.h" #include "cart.h" #include "dystring.h" #include "textOut.h" #include "trashDir.h" static char const rcsid[] = "$Id: great.c,v 1.3 2010/06/01 20:09:36 galt Exp $"; +static char* greatData = "greatData/supportedAssemblies.txt"; + static struct dyString *getRequestName() { char *track = cartString(cart, hgtaTrack); char *table = cartString(cart, hgtaTable); struct dyString *name; if (differentStringNullOk(track, table)) name = dyStringCreate("%s:%s", track, table); else name = dyStringCreate("%s", track); return name; } void verifyGreatFormat(const char *output) { if (!sameString(output, outBed) && !sameString(output, outWigBed)) { htmlOpen("Sorry!"); errAbort("GREAT requires that the output format be BED format.\n" "Some tracks are not available in BED format and thus cannot be passed to GREAT.\n" "Please go back and ensure that BED format is chosen."); htmlClose(); } } +void addAssemblyToSupportedList(struct dyString* dy, char* assembly) +{ +char* organism = hOrganism(assembly); +char* freezeDate = hFreezeDate(assembly); +dyStringPrintf(dy, "%s %s", organism, freezeDate); +freeMem(organism); +freeMem(freezeDate); +} + void verifyGreatAssemblies() { -if (differentStringNullOk(database, "hg18") && differentStringNullOk(database, "mm9")) +// First read in the assembly name and description information into name lists +struct slName* supportedAssemblies = NULL; +struct lineFile *lf = lineFileOpen(greatData, TRUE); +int fieldCount = 1; +char* row[fieldCount]; +int wordCount; +while ((wordCount = lineFileChopTab(lf, row)) != 0) + { + if (wordCount != fieldCount) + errAbort("The %s file is not properly formatted.\n", greatData); + slNameAddHead(&supportedAssemblies, row[0]); + } +lineFileClose(&lf); + +boolean invalidAssembly = TRUE; +struct slName* currAssembly; +for (currAssembly = supportedAssemblies; currAssembly != NULL; currAssembly = currAssembly->next) + { + if (!hDbIsActive(currAssembly->name)) + { + errAbort("Assembly %s in supported assembly file is not an active assembly.\n", currAssembly->name); + } + if (sameOk(database, currAssembly->name)) { + invalidAssembly = FALSE; + break; + } + } + +if (invalidAssembly) + { + slReverse(&supportedAssemblies); + currAssembly = supportedAssemblies; + struct dyString* dy = dyStringNew(0); + addAssemblyToSupportedList(dy, currAssembly->name); + + currAssembly = currAssembly->next; + while (currAssembly != NULL) + { + dyStringAppend(dy, ", "); + if (currAssembly->next == NULL) + dyStringAppend(dy, "and "); + addAssemblyToSupportedList(dy, currAssembly->name); + currAssembly = currAssembly->next; + } + hPrintf("<script type='text/javascript'>\n"); hPrintf("function logSpecies() {\n"); hPrintf("try {\n"); hPrintf("var r = new XMLHttpRequest();\n"); hPrintf("r.open('GET', 'http://great.stanford.edu/public/cgi-bin/logSpecies.php?species=%s');\n", database); hPrintf("r.send(null);\n"); hPrintf("} catch (err) { }\n"); hPrintf("}\n"); hPrintf("window.onload = logSpecies;\n"); hPrintf("</script>\n"); - errAbort("GREAT only supports the Human, Mar. 2006 (NCBI36/hg18) and Mouse, July 2007 (NCBI37/mm9) assemblies." - "\nPlease go back and ensure that one of those assemblies is chosen."); + errAbort("GREAT only supports the %s assemblies." + "\nPlease go back and ensure that one of those assemblies is chosen.", + dyStringContents(dy)); htmlClose(); + dyStringFree(&dy); } + +slNameFreeList(&supportedAssemblies); } void doGreatTopLevel() /* intermediate page for formats printed directly from top form */ { struct dyString *name = getRequestName(); htmlOpen("Send BED data to GREAT as %s", dyStringContents(name)); freeDyString(&name); verifyGreatAssemblies(); startGreatForm(); cgiMakeHiddenVar(hgtaDoTopSubmit, "get output"); printGreatSubmitButtons(); htmlClose(); }