b1c2fdec9a31078a56333427830a760757d22a51
angie
  Fri Jun 17 14:44:44 2016 -0700
Command line wrapper script for hgVai: hg/utils/vai.pl .  hgVai has a new input parameter to specify a local file of variants instead of a custom track, and inhibits web output (e.g. Content-Type and cookies) when run on the command line.  Added support for reading pgSnp variants from input file without bin column instead of database (pgSnp.as includes bin, but pgSnp files do not).
Has been tested somewhat on GBiB.  Needs documentation.
refs #12216

diff --git src/hg/lib/hAnno.c src/hg/lib/hAnno.c
index 71bdc5e..847d03f 100644
--- src/hg/lib/hAnno.c
+++ src/hg/lib/hAnno.c
@@ -153,30 +153,66 @@
 
 static boolean dbTableMatchesAutoSql(char *db, char *table, struct asObject *asObj)
 /* Return true if table exists and its fields match the columns of asObj. */
 {
 boolean matches = FALSE;
 struct sqlConnection *conn = hAllocConn(db);
 if (sqlTableExists(conn, table))
     {
     struct sqlFieldInfo *fieldList = sqlFieldInfoGet(conn, table);
     matches = columnsMatch(asObj, fieldList);
     }
 hFreeConn(&conn);
 return matches;
 }
 
+struct annoStreamer *hAnnoStreamerFromBigFileUrl(char *fileOrUrl, struct annoAssembly *assembly,
+                                                 int maxOutRows, char *type)
+/* Determine what kind of big data file/url we have and make streamer for it.
+ * If type is NULL, this will determine type using custom track type or file suffix. */
+{
+struct annoStreamer *streamer = NULL;
+if (isEmpty(type))
+    type = customTrackTypeFromBigFile(fileOrUrl);
+if (type == NULL)
+    {
+    if (endsWith(fileOrUrl, "pgSnp") || endsWith(fileOrUrl, "pgsnp") ||
+        endsWith(fileOrUrl, "pgSnp.gz") || endsWith(fileOrUrl, "pgsnp.gz") ||
+        endsWith(fileOrUrl, "bed") || endsWith(fileOrUrl, "bed.gz"))
+        {
+        type = "pgSnp";
+        }
+    else
+        errAbort("Unrecognized bigData type of file or url '%s'", fileOrUrl);
+    }
+if (sameString(type, "bigBed") || sameString("bigGenePred", type))
+    streamer = annoStreamBigBedNew(fileOrUrl, assembly, maxOutRows);
+else if (sameString(type, "vcfTabix"))
+    streamer = annoStreamVcfNew(fileOrUrl, TRUE, assembly, maxOutRows);
+else if (sameString(type, "vcf"))
+    streamer = annoStreamVcfNew(fileOrUrl, FALSE, assembly, maxOutRows);
+else if (sameString(type, "bigWig"))
+    streamer = annoStreamBigWigNew(fileOrUrl, assembly);
+else if (sameString(type, "pgSnp"))
+    streamer = annoStreamTabNew(fileOrUrl, assembly, pgSnpFileAsObj());
+else if (sameString(type, "bam"))
+    errAbort("Sorry, BAM is not yet supported");
+else
+    errAbort("Unrecognized bigData type %s of file or url '%s'", type, fileOrUrl);
+return streamer;
+}
+
 struct annoStreamer *hAnnoStreamerFromTrackDb(struct annoAssembly *assembly, char *selTable,
                                               struct trackDb *tdb, char *chrom, int maxOutRows,
                                               struct jsonElement *config)
 /* 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;
@@ -251,30 +287,31 @@
 grator->setOverlapRule(grator, overlapRule);
 return grator;
 }
 
 struct annoGrator *hAnnoGratorFromTrackDb(struct annoAssembly *assembly, char *selTable,
                                           struct trackDb *tdb, char *chrom, int maxOutRows,
                                           struct asObject *primaryAsObj,
                                           enum annoGratorOverlap overlapRule,
                                           struct jsonElement *config)
 /* 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;
 boolean primaryIsVariants = (primaryAsObj != NULL &&
                              (asObjectsMatch(primaryAsObj, pgSnpAsObj()) ||
+                              asObjectsMatch(primaryAsObj, pgSnpFileAsObj()) ||
                               asObjectsMatch(primaryAsObj, vcfAsObj())));
 char *bigDataUrl = trackDbSetting(tdb, "bigDataUrl");
 if (bigDataUrl != NULL)
     {
     if (primaryIsVariants && sameString("bigGenePred", tdb->type))
         {
         struct annoStreamer *streamer = annoStreamBigBedNew(bigDataUrl, assembly, maxOutRows);
         grator = annoGratorGpVarNew(streamer);
         }
     else
         grator = hAnnoGratorFromBigFileUrl(bigDataUrl, assembly, maxOutRows, overlapRule);
     }
 else if (startsWithWord("wig", tdb->type))
     {
     char *dataDb = assembly->name;