235301fd42a93e1ba15678074735ca2ce7ffe3d6 Merge parents caa4f9e ffae904 tdreszer Fri Dec 2 11:08:58 2011 -0800 Merge branch 'master' into tdreszer-subCfg diff --cc src/hg/lib/pal.c index 719a00d,2e86497..90c4598 --- src/hg/lib/pal.c +++ src/hg/lib/pal.c @@@ -1,303 -1,302 +1,302 @@@ #include "common.h" #include "hash.h" #include "cart.h" #include "genePred.h" #include "genePredReader.h" #include "mafGene.h" #include "trackDb.h" #include "hdb.h" #include "hgMaf.h" #include "jsHelper.h" #include "hPrint.h" #include "hdb.h" - static char const rcsid[] = "$Id: pal.c,v 1.14 2009/07/06 17:43:08 braney Exp $"; -#define hgtaCGIGeneMafTable "hgta_mafGeneMafTable" -#define hgtaJSGeneMafTable "mafGeneMafTable" -#define hgtaCGIGeneExons "hgta_mafGeneExons" -#define hgtaJSGeneExons "mafGeneExons" -#define hgtaCGIGeneNoTrans "hgta_mafGeneNoTrans" -#define hgtaJSGeneNoTrans "mafGeneNoTrans" -#define hgtaCGIGeneOutBlank "hgta_mafGeneOutBlank" -#define hgtaJSGeneOutBlank "mafGeneOutBlank" -#define hgtaCGIOutTable "hgta_mafOutTable" -#define hgtaJSOutTable "mafOutTable" +#define hgtaCGIGeneMafTable "hgta_mafGeneMafTable" +#define hgtaJSGeneMafTable "mafGeneMafTable" +#define hgtaCGIGeneExons "hgta_mafGeneExons" +#define hgtaJSGeneExons "mafGeneExons" +#define hgtaCGIGeneNoTrans "hgta_mafGeneNoTrans" +#define hgtaJSGeneNoTrans "mafGeneNoTrans" +#define hgtaCGIGeneOutBlank "hgta_mafGeneOutBlank" +#define hgtaJSGeneOutBlank "mafGeneOutBlank" +#define hgtaCGIOutTable "hgta_mafOutTable" +#define hgtaJSOutTable "mafOutTable" #define hgtaCGINumColumns "hgta_mafNumColumns" #define hgtaJSNumColumns "mafNumColumns" #define hgtaCGITruncHeader "hgta_mafTruncHeader" #define hgtaJSTruncHeader "mafTruncHeader" static char *curVars[] = { hgtaCGIGeneMafTable, hgtaCGIGeneExons, hgtaCGIGeneNoTrans, hgtaCGIGeneOutBlank, hgtaCGIOutTable, hgtaCGINumColumns, hgtaCGITruncHeader, }; int palOutPredList(struct sqlConnection *conn, struct cart *cart, struct genePred *list) /* output a list of genePreds in pal format */ { if (list == NULL) return 0; -char *mafTable = cartString(cart, hgtaCGIGeneMafTable); +char *mafTable = cartString(cart, hgtaCGIGeneMafTable); char *database = sqlGetDatabase(conn); struct trackDb *maftdb = hTrackDbForTrack(database, mafTable); struct wigMafSpecies *wmSpecies; int groupCnt; /* get maf parent (if any) */ maftdb->parent = hCompositeTrackDbForSubtrack(database,maftdb); /* this queries the state of the getSpecies dialog */ -wigMafGetSpecies(cart, maftdb, database, &wmSpecies, &groupCnt); +wigMafGetSpecies(cart, maftdb, maftdb->track, database, &wmSpecies, &groupCnt); /* since the species selection dialog doesn't list * the reference species, we just automatically include * it */ struct slName *includeList = slNameNew(database); /* now make a list of all species that are on */ for(; wmSpecies; wmSpecies = wmSpecies->next) { if (wmSpecies->on) { struct slName *newName = slNameNew(wmSpecies->name); slAddHead(&includeList, newName); } } slReverse(&includeList); -boolean inExons = cartUsualBoolean(cart, hgtaCGIGeneExons , FALSE); -boolean noTrans = cartUsualBoolean(cart, hgtaCGIGeneNoTrans, FALSE); -boolean outBlank = cartUsualBoolean(cart, hgtaCGIGeneOutBlank, FALSE); -boolean outTable = cartUsualBoolean(cart, hgtaCGIOutTable, FALSE); -boolean truncHeader = cartUsualBoolean(cart, hgtaCGITruncHeader, FALSE); +boolean inExons = cartUsualBoolean(cart, hgtaCGIGeneExons , FALSE); +boolean noTrans = cartUsualBoolean(cart, hgtaCGIGeneNoTrans, FALSE); +boolean outBlank = cartUsualBoolean(cart, hgtaCGIGeneOutBlank, FALSE); +boolean outTable = cartUsualBoolean(cart, hgtaCGIOutTable, FALSE); +boolean truncHeader = cartUsualBoolean(cart, hgtaCGITruncHeader, FALSE); int numCols = cartUsualInt(cart, hgtaCGINumColumns, 20); unsigned options = 0; if (inExons) options |= MAFGENE_EXONS; if (noTrans) options |= MAFGENE_NOTRANS; if (outBlank) options |= MAFGENE_OUTBLANK; if (outTable) options |= MAFGENE_OUTTABLE; if (!truncHeader) numCols = -1; /* send out the alignments */ int outCount = 0; for( ; list ; list = list->next) { if (list->cdsStart != list->cdsEnd) { outCount++; - mafGeneOutPred(stdout, list, database, mafTable, + mafGeneOutPred(stdout, list, database, mafTable, includeList, options, numCols); } } slNameFreeList(&includeList); return outCount; } int palOutPredsInBeds(struct sqlConnection *conn, struct cart *cart, struct bed *beds, char *table ) /* output the alignments whose names and coords match a bed*/ { struct genePred *list = NULL; for(; beds; beds = beds->next) { char where[10 * 1024]; - safef(where, sizeof where, + safef(where, sizeof where, "name = '%s' and chrom='%s' and txEnd > %d and txStart <= %d", beds->name, beds->chrom, beds->chromStart, beds->chromEnd); struct genePredReader *reader = genePredReaderQuery( conn, table, where); struct genePred *pred; while ((pred = genePredReaderNext(reader)) != NULL) slAddHead(&list, pred); genePredReaderFree(&reader); } int outCount = 0; if (list != NULL) { slReverse(&list); outCount = palOutPredList( conn, cart, list); genePredFreeList(&list); } return outCount; } static char *onChangeEnd(struct dyString **pDy) /* Finish up javascript onChange command. */ { dyStringAppend(*pDy, "document.hiddenForm.submit();\""); return dyStringCannibalize(pDy); } static struct dyString *onChangeStart() /* Start up a javascript onChange command */ { struct dyString *dy = dyStringNew(1024); dyStringAppend(dy, "onChange=\""); jsDropDownCarryOver(dy, hgtaCGIGeneMafTable); -jsTrackedVarCarryOver(dy, hgtaCGIGeneExons, hgtaJSGeneExons); -jsTrackedVarCarryOver(dy, hgtaCGIGeneNoTrans, hgtaJSGeneNoTrans); -jsTrackedVarCarryOver(dy, hgtaCGIGeneOutBlank, hgtaJSGeneOutBlank); -jsTrackedVarCarryOver(dy, hgtaCGIOutTable, hgtaJSOutTable); -jsTrackedVarCarryOver(dy, hgtaCGITruncHeader, hgtaJSTruncHeader); +jsTrackedVarCarryOver(dy, hgtaCGIGeneExons, hgtaJSGeneExons); +jsTrackedVarCarryOver(dy, hgtaCGIGeneNoTrans, hgtaJSGeneNoTrans); +jsTrackedVarCarryOver(dy, hgtaCGIGeneOutBlank, hgtaJSGeneOutBlank); +jsTrackedVarCarryOver(dy, hgtaCGIOutTable, hgtaJSOutTable); +jsTrackedVarCarryOver(dy, hgtaCGITruncHeader, hgtaJSTruncHeader); jsTextCarryOver(dy, hgtaCGINumColumns); return dy; } static char *onChangeGenome() /* Get group-changing javascript. */ { struct dyString *dy = onChangeStart(); return onChangeEnd(&dy); } static char * getConservationTrackName( struct sqlConnection *conn) { struct slName *dbList = hTrackDbList(); struct slName *dbl = dbList; char *ret = NULL; for(; dbl; dbl = dbl->next) { char query[512]; - safef(query, sizeof query, + safef(query, sizeof query, "select tableName from %s where shortLabel='Conservation'", dbl->name); struct sqlResult *sr = sqlGetResult(conn, query); char **row; struct slName *tableList = NULL; while ((row = sqlNextRow(sr)) != NULL) { struct slName *name = newSlName(row[0]); slAddHead(&tableList, name); } sqlFreeResult(&sr); struct slName *l = tableList; for(; l; l = l->next) if (sqlTableExists(conn, l->name)) ret = cloneString(l->name); slFreeList(&tableList); if (ret != NULL) break; } slFreeList(&dbList); return ret; } static char * outMafTableDrop(struct cart *cart, struct sqlConnection *conn) { struct slName *list = hTrackTablesOfType(conn, "wigMaf%%"); int count = slCount(list); if (count == 0) errAbort("There are no multiple alignments available for this genome."); char **tables = needMem(sizeof(char *) * count); char **tb = tables; char *mafTable = cartOptionalString(cart, hgtaCGIGeneMafTable); if (mafTable != NULL) { struct slName *l = list; for(; l; l=l->next) if (sameString(l->name, mafTable)) break; /* didn't find mafTable in list, reset it */ if (l == NULL) mafTable = NULL; } if (mafTable == NULL) { if ((mafTable = getConservationTrackName(conn)) == NULL) mafTable = list->name; cartSetString(cart, hgtaCGIGeneMafTable, mafTable); } for(; list; list = list->next) *tb++ = list->name; printf("<B>MAF table: </B>\n"); -cgiMakeDropListFull(hgtaCGIGeneMafTable, tables, tables, +cgiMakeDropListFull(hgtaCGIGeneMafTable, tables, tables, count , mafTable, onChangeGenome()); return mafTable; } -void palOptions(struct cart *cart, - struct sqlConnection *conn, void (*addButtons)(), +void palOptions(struct cart *cart, + struct sqlConnection *conn, void (*addButtons)(), char *extraVar) /* output the options dialog (select MAF file, output options */ { char *database = sqlGetDatabase(conn); hPrintf("<FORM ACTION=\"%s\" NAME=\"mainForm\" METHOD=POST>\n", cgiScriptName()); cartSaveSession(cart); char *mafTable = outMafTableDrop(cart, conn); char *numColumns = cartUsualString(cart, hgtaCGINumColumns, ""); printf("<BR><BR><B>Formatting options:</B><BR>\n"); jsMakeTrackingCheckBox(cart, hgtaCGIGeneExons, hgtaJSGeneExons, FALSE); printf("Separate into exons<BR>"); jsMakeTrackingCheckBox(cart, hgtaCGIGeneNoTrans, hgtaJSGeneNoTrans, FALSE); printf("Show nucleotides<BR>"); jsMakeTrackingCheckBox(cart, hgtaCGIGeneOutBlank, hgtaJSGeneOutBlank, FALSE); printf("Output lines with just dashes<BR>"); jsMakeTrackingCheckBox(cart, hgtaCGIOutTable, hgtaJSOutTable, FALSE); printf("Format output as table "); jsMakeTrackingCheckBox(cart, hgtaCGITruncHeader, hgtaJSTruncHeader, FALSE); printf("Truncate headers at "); cgiMakeTextVar(hgtaCGINumColumns, numColumns, 2); printf("characters (enter zero for no headers)<BR>"); printf("<BR>"); struct trackDb *maftdb = hTrackDbForTrack(database, mafTable); /* get maf parent (if any) */ maftdb->parent = hCompositeTrackDbForSubtrack(database,maftdb); wigMafSpeciesTable(cart, maftdb, mafTable, database); addButtons(); hPrintf("</FORM>\n"); /* Hidden form - for benefit of javascript. */ { static char *saveVars[32]; int varCount = ArraySize(curVars); assert(varCount < (sizeof saveVars / sizeof(char *))); memcpy(saveVars, curVars, varCount * sizeof(saveVars[0])); if (extraVar != NULL) { assert(varCount + 1 < (sizeof saveVars / sizeof(char *))); saveVars[varCount] = extraVar; varCount++; } jsCreateHiddenForm(cart, cgiScriptName(), saveVars, varCount); } cartSaveSession(cart); }