8b49d2145ae719c3b3577de7956f7b9131c385ba
angie
  Wed Jan 7 09:43:45 2015 -0800
Libified code from hgVai/libifyMe.c to lib/hAnno.c in anticipationof sharing code with hgAi.  Also added hAnnoGetAutoSqlForTdb for hgAi.

diff --git src/hg/hgVai/libifyMe.c src/hg/hgVai/libifyMe.c
index 8db79a6..fb91fe7 100644
--- src/hg/hgVai/libifyMe.c
+++ src/hg/hgVai/libifyMe.c
@@ -1,297 +1,69 @@
 /* Stuff lifted from hgTables that should be libified. */
 
 /* Copyright (C) 2014 The Regents of the University of California 
  * See README in this or parent directory for licensing information. */
 #include "common.h"
 #include "cheapcgi.h"
 #include "customTrack.h"
 #include "grp.h"
 #include "hdb.h"
 #include "hgFind.h"
-#include "hubConnect.h"
+#include "hgMaf.h"
 #include "hui.h"
-#include "trackHub.h"
-#include "wikiTrack.h"
-#include "annoGratorQuery.h"
-#include "annoGratorGpVar.h"
-#include "annoStreamBigBed.h"
-#include "annoStreamDb.h"
-#include "annoStreamDbFactorSource.h"
-#include "annoStreamTab.h"
-#include "annoStreamVcf.h"
-#include "annoStreamWig.h"
-#include "annoGrateWigDb.h"
-#include "annoFormatTab.h"
-#include "annoFormatVep.h"
-#include "pgSnp.h"
-#include "vcf.h"
+#include "joiner.h"
 
 #include "libifyMe.h"
 
 static boolean searchPosition(char *range, struct cart *cart, char *cartVar)
 /* Try and fill in region via call to hgFind. Return FALSE
  * if it can't find a single position. */
 {
 struct hgPositions *hgp = NULL;
 char retAddr[512];
 char position[512];
 char *chrom = NULL;
 int start=0, end=0;
 char *db = cloneString(cartString(cart, "db")); // gets clobbered if position is not found!
 safef(retAddr, sizeof(retAddr), "%s", cgiScriptName());
 hgp = findGenomePosWeb(db, range, &chrom, &start, &end,
 	cart, TRUE, retAddr);
 if (hgp != NULL && hgp->singlePos != NULL)
     {
     safef(position, sizeof(position),
 	    "%s:%d-%d", chrom, start+1, end);
     cartSetString(cart, cartVar, position);
     return TRUE;
     }
 else if (start == 0)	/* Confusing way findGenomePosWeb says pos not found. */
     {
     cartSetString(cart, cartVar, hDefaultPos(db));
     return FALSE;
     }
 else
     return FALSE;
 }
 
 boolean lookupPosition(struct cart *cart, char *cartVar)
 /* Look up position if it is not already seq:start-end.  Return FALSE if it puts
  * up multiple positions. */
 {
 char *db = cartString(cart, "db");
 char *range = cartUsualString(cart, cartVar, "");
 boolean isSingle = TRUE;
 range = trimSpaces(range);
 if (range[0] != 0)
     isSingle = searchPosition(range, cart, cartVar);
 else
     cartSetString(cart, cartVar, hDefaultPos(db));
 return isSingle;
 }
 
+//#*** duplicated many places... htmlshell?
 void nbSpaces(int count)
 /* Print some non-breaking spaces. */
 {
 int i;
 for (i=0; i<count; ++i)
     printf("&nbsp;");
 }
 
-//#*** duplicated in hgVarAnnoGrator and annoGratorTester
-struct annoAssembly *getAnnoAssembly(char *db)
-/* Make annoAssembly for db. */
-{
-static struct annoAssembly *aa = NULL;
-if (aa == NULL)
-    {
-    char *nibOrTwoBitDir = hDbDbNibPath(db);
-    if (nibOrTwoBitDir == NULL)
-        errAbort("Can't find .2bit for db '%s'", db);
-    char twoBitPath[HDB_MAX_PATH_STRING];
-    safef(twoBitPath, sizeof(twoBitPath), "%s/%s.2bit", nibOrTwoBitDir, db);
-    char *path = hReplaceGbdb(twoBitPath);
-    aa = annoAssemblyNew(db, path);
-    freeMem(path);
-    }
-return aa;
-}
-
-static boolean columnsMatch(struct asObject *asObj, struct sqlFieldInfo *fieldList)
-/* Return TRUE if asObj's column names match the given SQL fields. */
-{
-if (asObj == NULL)
-    return FALSE;
-struct sqlFieldInfo *firstRealField = fieldList;
-if (sameString("bin", fieldList->field) && differentString("bin", asObj->columnList->name))
-    firstRealField = fieldList->next;
-boolean columnsMatch = TRUE;
-struct sqlFieldInfo *field = firstRealField;
-struct asColumn *asCol = asObj->columnList;
-for (;  field != NULL && asCol != NULL;  field = field->next, asCol = asCol->next)
-    {
-    if (!sameString(field->field, asCol->name))
-	{
-	columnsMatch = FALSE;
-	break;
-	}
-    }
-if (field != NULL || asCol != NULL)
-    columnsMatch = FALSE;
-return columnsMatch;
-}
-
-static struct asObject *asObjectFromFields(char *name, struct sqlFieldInfo *fieldList)
-/* Make autoSql text from SQL fields and pass it to asParse. */
-{
-struct dyString *dy = dyStringCreate("table %s\n"
-				     "\"Column names grabbed from mysql\"\n"
-				     "    (\n", name);
-struct sqlFieldInfo *field;
-for (field = fieldList;  field != NULL;  field = field->next)
-    {
-    char *sqlType = field->type;
-    // hg19.wgEncodeOpenChromSynthGm12878Pk.pValue has sql type "float unsigned",
-    // and I'd rather pretend it's just a float than work unsigned floats into autoSql.
-    if (sameString(sqlType, "float unsigned"))
-	sqlType = "float";
-    char *asType = asTypeNameFromSqlType(sqlType);
-    if (asType == NULL)
-	errAbort("No asTypeInfo for sql type '%s'!", field->type);
-    dyStringPrintf(dy, "    %s %s;\t\"\"\n", asType, field->field);
-    }
-dyStringAppend(dy, "    )\n");
-return asParseText(dy->string);
-}
-
-static struct asObject *getAutoSqlForTable(char *db, char *dataDb, char *dbTable,
-					   struct trackDb *tdb)
-/* Get autoSql for dataDb.dbTable from tdb and/or db.tableDescriptions;
- * if it doesn't match columns, make one up from dataDb.table sql fields. */
-//#*** should we just always use sql fields?
-{
-struct sqlConnection *connDataDb = hAllocConn(dataDb);
-struct sqlFieldInfo *fieldList = sqlFieldInfoGet(connDataDb, dbTable);
-hFreeConn(&connDataDb);
-struct asObject *asObj = NULL;
-if (tdb != NULL)
-    {
-    struct sqlConnection *connDb = hAllocConn(db);
-    asObj = asForTdb(connDb, tdb);
-    hFreeConn(&connDb);
-    }
-if (columnsMatch(asObj, fieldList))
-    return asObj;
-else
-    return asObjectFromFields(dbTable, fieldList);
-}
-
-static char *getBigDataFileName(char *db, struct trackDb *tdb, char *selTable, char *chrom)
-/* Get fileName from bigBed/bigWig/BAM/VCF database table, or bigDataUrl from custom track. */
-{
-struct sqlConnection *conn = hAllocConn(db);
-char *fileOrUrl = bbiNameFromSettingOrTableChrom(tdb, conn, selTable, chrom);
-hFreeConn(&conn);
-return fileOrUrl;
-}
-
-struct annoStreamer *streamerFromTrack(struct annoAssembly *assembly, char *selTable,
-				       struct trackDb *tdb, char *chrom, int maxOutRows)
-/* Figure out the source and type of data and make an annoStreamer. */
-{
-struct annoStreamer *streamer = NULL;
-char *db = assembly->name, *dataDb = db, *dbTable = selTable;
-if (chrom == NULL)
-    chrom = hDefaultChrom(db);
-if (isCustomTrack(selTable))
-    {
-    dbTable = trackDbSetting(tdb, "dbTableName");
-    if (dbTable != NULL)
-	// This is really a database table, not a bigDataUrl CT.
-	dataDb = CUSTOM_TRASH;
-    }
-if (startsWith("wig", tdb->type))
-    streamer = annoStreamWigDbNew(dataDb, dbTable, assembly, maxOutRows);
-else if (sameString("vcfTabix", tdb->type))
-    {
-    char *fileOrUrl = getBigDataFileName(db, tdb, selTable, chrom);
-    streamer = annoStreamVcfNew(fileOrUrl, TRUE, assembly, maxOutRows);
-    }
-else if (sameString("vcf", tdb->type))
-    {
-    char *fileOrUrl = getBigDataFileName(dataDb, tdb, dbTable, chrom);
-    streamer = annoStreamVcfNew(fileOrUrl, FALSE, assembly, maxOutRows);
-    }
-else if (sameString("bam", tdb->type))
-    {
-    warn("Sorry, BAM is not yet supported");
-    }
-else if (startsWith("bigBed", tdb->type))
-    {
-    char *fileOrUrl = getBigDataFileName(db, tdb, selTable, chrom);
-    streamer = annoStreamBigBedNew(fileOrUrl, assembly, maxOutRows);
-    }
-else if (sameString("factorSource", tdb->type))
-    {
-    char *sourceTable = trackDbSetting(tdb, "sourceTable");
-    char *inputsTable = trackDbSetting(tdb, "inputTrackTable");
-    streamer = annoStreamDbFactorSourceNew(db, tdb->track, sourceTable, inputsTable, assembly,
-					   maxOutRows);
-    }
-else
-    {
-    struct sqlConnection *conn = hAllocConn(dataDb);
-    char maybeSplitTable[1024];
-    if (sqlTableExists(conn, dbTable))
-	safecpy(maybeSplitTable, sizeof(maybeSplitTable), dbTable);
-    else
-	safef(maybeSplitTable, sizeof(maybeSplitTable), "%s_%s", chrom, dbTable);
-    hFreeConn(&conn);
-    struct asObject *asObj = getAutoSqlForTable(db, dataDb, maybeSplitTable, tdb);
-    streamer = annoStreamDbNew(dataDb, maybeSplitTable, assembly, asObj, maxOutRows);
-    }
-return streamer;
-}
-
-struct annoGrator *gratorFromBigDataFileOrUrl(char *fileOrUrl, struct annoAssembly *assembly,
-					      int maxOutRows, enum annoGratorOverlap overlapRule)
-/* Determine what kind of big data file/url we have and make streamer & grator for it. */
-{
-struct annoStreamer *streamer = NULL;
-struct annoGrator *grator = NULL;
-if (endsWith(fileOrUrl, ".bb"))
-    streamer = annoStreamBigBedNew(fileOrUrl, assembly, maxOutRows);
-else if (endsWith(fileOrUrl, ".vcf.gz"))
-    streamer = annoStreamVcfNew(fileOrUrl, TRUE, assembly, maxOutRows);
-else if (endsWith(fileOrUrl, ".bw"))
-    grator = annoGrateBigWigNew(fileOrUrl, assembly);
-else
-    errAbort("Can't tell bigData type of file or url '%s'", fileOrUrl);
-if (grator == NULL)
-    grator = annoGratorNew(streamer);
-grator->setOverlapRule(grator, overlapRule);
-return grator;
-}
-
-struct annoGrator *gratorFromTrackDb(struct annoAssembly *assembly, char *selTable,
-				     struct trackDb *tdb, char *chrom, int maxOutRows,
-				     struct asObject *primaryAsObj,
-				     enum annoGratorOverlap overlapRule)
-/* Figure out the source and type of data, make an annoStreamer & wrap in annoGrator.
- * If not NULL, primaryAsObj is used to determine whether we can make an annoGratorGpVar. */
-{
-struct annoGrator *grator = NULL;
-char *dataDb = assembly->name, *dbTable = selTable;
-if (isCustomTrack(selTable))
-    {
-    dataDb = CUSTOM_TRASH;
-    dbTable = trackDbSetting(tdb, "dbTableName");
-    if (dbTable == NULL)
-	{
-	char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl");
-	if (bigDataUrl != NULL)
-	    grator = gratorFromBigDataFileOrUrl(bigDataUrl, assembly, maxOutRows, overlapRule);
-	else
-	    errAbort("Can't find dbTableName or bigDataUrl for custom track %s", selTable);
-	}
-    }
-if (startsWith("wig", tdb->type))
-    {
-    grator = annoGrateWigDbNew(dataDb, dbTable, assembly, maxOutRows);
-    }
-else
-    {
-    struct annoStreamer *streamer = streamerFromTrack(assembly, dbTable, tdb, chrom, maxOutRows);
-    if (primaryAsObj != NULL &&
-	(asObjectsMatch(primaryAsObj, pgSnpAsObj()) || asObjectsMatch(primaryAsObj, vcfAsObj()))
-	&& asColumnNamesMatchFirstN(streamer->asObj, genePredAsObj(), 10))
-	grator = annoGratorGpVarNew(streamer);
-    else
-	grator = annoGratorNew(streamer);
-    }
-grator->setOverlapRule(grator, overlapRule);
-return grator;
-}
-