45568b1262f04b7e8b641915fed48823373bc51a
angie
  Wed Apr 16 07:16:16 2014 -0700
Suppress "Variant Identifiers" option if this assembly has no snp table. (Thanks Jonathan!)fixes #13085

diff --git src/hg/hgVai/hgVai.c src/hg/hgVai/hgVai.c
index ff63bd7..ad37aed 100644
--- src/hg/hgVai/hgVai.c
+++ src/hg/hgVai/hgVai.c
@@ -299,58 +299,67 @@
 	    slAddHead(&groupRefList, slRefNew(grp));
 	}
     hashFree(&hash);
     slReverse(&groupRefList);
     *retGroupRefList = groupRefList;
     }
 }
 
 boolean isVariantCustomTrack(struct trackDb *tdb, void *filterData)
 /* This is a TdbFilterFunction to get custom or hub tracks with type pgSnp or vcf(Tabix). */
 {
 return ((sameString(tdb->grp, "user") || isHubTrack(tdb->track)) &&
 	(sameString(tdb->type, "pgSnp") || startsWith("vcf", tdb->type)));
 }
 
+// Function prototype to avoid shuffling code around:
+char *findLatestSnpTable(char *suffix);
+/* Return the name of the 'snp1__<suffix>' table with the highest build number, if any. */
+
 void selectVariants(struct slRef *varGroupList, struct slRef *varTrackList)
 /* Offer selection of user's variant custom tracks, example variants, pasted input etc. */
 {
 printf("<div class='sectionLiteHeader'>Select Variants</div>\n");
 printf("If you have more than one custom track or hub track in "
        "<A HREF='../FAQ/FAQformat.html#format10' TARGET=_BLANK>pgSnp</A> or "
        "<A HREF='../goldenPath/help/vcf.html' TARGET=_BLANK>VCF</A> format, "
        "please select the one you wish to annotate:<BR>\n");
 printf("<B>variants: </B>");
 printf("<SELECT ID='hgva_variantTrack' NAME='hgva_variantTrack' "
        "onchange=\"hgva.changeVariantSource();\">\n");
 char *selected = cartUsualString(cart, "hgva_variantTrack", "");
 struct slRef *ref;
 for (ref = varTrackList;  ref != NULL;  ref = ref->next)
     {
     struct trackDb *tdb = ref->val;
     printOption(tdb->track, selected, tdb->longLabel);
     }
 printOption(hgvaSampleVariants, selected, hgvaSampleVariantsLabel);
+boolean hasSnps = (findLatestSnpTable(NULL) != NULL);
+if (hasSnps)
     printOption(hgvaUseVariantIds, selected, hgvaVariantIdsLabel);
 printf("</SELECT><BR>\n");
 
+if (hasSnps)
+    {
     printf("<div id='"hgvaVariantPasteContainer"'%s>\n",
 	   differentString(selected, hgvaUseVariantIds) ? " style='display: none;'" : "");
     printf("Enter dbSNP rs# identifiers separated by whitespace or commas:<BR>\n");
     char *oldPasted = cartUsualString(cart, hgvaVariantIds, "");
     cgiMakeTextArea(hgvaVariantIds, oldPasted, 10, 70);
     puts("</div>");
+    }
 
 printf("<B>maximum number of variants to be processed:</B>\n");
 char *curLimit = cartUsualString(cart, "hgva_variantLimit", "10000");
 char *limitLabels[] = { "10", "100", "1,000", "10,000", "100,000" };
 char *limitValues[] = { "10", "100", "1000", "10000", "100000" };
 cgiMakeDropListWithVals("hgva_variantLimit", limitLabels, limitValues, ArraySize(limitLabels),
 			curLimit);
 printCtAndHubButtons();
 puts("<BR>");
 }
 
 boolean isGeneTrack(struct trackDb *tdb, void *filterData)
 /* This is a TdbFilterFunction to get genePred tracks. */
 {
 return (startsWith("genePred", tdb->type));
@@ -1585,30 +1594,32 @@
     }
 return dyStringCannibalize(&dy);
 }
 
 //#*** Variant ID-matching should be metadata-driven too.  termRegex -> data source.
 static const char *rsIdRegex = "^rs[0-9]+$";
 
 static void rsIdsToVcfRecords(struct annoAssembly *assembly, struct slName *rsIds,
 			      struct vcfFile *vcff, struct vcfRecord **pRecList,
 			      struct slName **pCommentList)
 /* If possible, look up coordinates and alleles of dbSNP rs IDs. */
 {
 if (rsIds == NULL)
     return;
 char *table = findLatestSnpTable(NULL);
+if (table == NULL)
+    return;
 struct sqlConnection *conn = hAllocConn(assembly->name);
 // Build a 'name in (...)' query, and build a hash of IDs so we can test whether all were found
 struct dyString *dq = sqlDyStringCreate("select chrom, chromStart, chromEnd, name, strand, "
 					"refUCSC, observed from %s where name in (",
 					table);
 struct hash *idHash = hashNew(0);
 struct slName *id;
 for (id = rsIds;  id != NULL;  id = id->next)
     {
     tolowers(id->name);
     dyStringPrintf(dq, "%s'%s'", (id != rsIds ? "," : ""), id->name);
     hashStoreName(idHash, id->name);
     }
 dyStringAppend(dq, ");");
 struct sqlResult *sr = sqlGetResult(conn, dq->string);