820ebcf85a344a03cf2279b6ceee42a25514f4a3
angie
  Mon May 23 09:41:50 2011 -0700
Feature #3711 (VCF haplotype clustering): User can select which variantis used as the center (for center-weighted clustering) by clicking on a
link in its details page.

diff --git src/hg/hgc/vcfClick.c src/hg/hgc/vcfClick.c
index 62d5f33..2fa75f4 100644
--- src/hg/hgc/vcfClick.c
+++ src/hg/hgc/vcfClick.c
@@ -190,34 +190,42 @@
 
 static void pgSnpCodingDetail(struct vcfRecord *rec)
 /* Translate rec into pgSnp (with proper chrom name) and call Belinda's
  * coding effect predictor from pgSnp details. */
 {
 if (hTableExists(database, "knownGene"))
     {
     struct pgSnp *pgs = pgSnpFromVcfRecord(rec);
     if (!sameString(rec->chrom, seqName))
 	// rec->chrom might be missing "chr" prefix:
 	pgs->chrom = seqName;
     printSeqCodDisplay(database, pgs);
     }
 }
 
-static void vcfRecordDetails(struct vcfRecord *rec)
-/* Display the contents of a single line of VCF. */
+static void vcfRecordDetails(struct trackDb *tdb, struct vcfRecord *rec)
+/* Display the contents of a single line of VCF, assumed to be from seqName
+ * (using seqName instead of rec->chrom because rec->chrom might lack "chr"). */
 {
 printf("<B>Name:</B> %s<BR>\n", rec->name);
+if (rec->file->genotypeCount > 0)
+    {
+    char cartVar[512];
+    safef(cartVar, sizeof(cartVar), "%s.centerVariantPos", tdb->track);
+    printf("<A HREF=\"%s&%s=%s:%d\">View haplotypes sorted by variants at this position</A><BR>\n",
+	   hgTracksPathAndSettings(), cartVar, seqName, rec->chromStart);
+    }
 printPosOnChrom(seqName, rec->chromStart, rec->chromEnd, NULL, FALSE, rec->name);
 printf("<B>Reference allele:</B> %s<BR>\n", rec->ref);
 vcfAltAlleleDetails(rec);
 if (rec->qual != 0.0)
     printf("<B>Call quality:</B> %.1f<BR>\n", rec->qual);
 vcfFilterDetails(rec);
 vcfInfoDetails(rec);
 pgSnpCodingDetail(rec);
 vcfGenotypesDetails(rec);
 }
 
 void doVcfTabixDetails(struct trackDb *tdb, char *item)
 /* Show details of an alignment from a VCF file compressed and indexed by tabix. */
 {
 #if (defined USE_TABIX && defined KNETFILE_HOOKS)
@@ -239,21 +247,21 @@
     {
     vcff = vcfTabixFileMayOpen(fileOrUrl, seqName, start, end, vcfMaxErr);
     }
 errCatchEnd(errCatch);
 if (errCatch->gotError)
     {
     if (isNotEmpty(errCatch->message->string))
 	warn("%s", errCatch->message->string);
     }
 errCatchFree(&errCatch);
 if (vcff != NULL)
     {
     struct vcfRecord *rec;
     for (rec = vcff->records;  rec != NULL;  rec = rec->next)
 	if (rec->chromStart == start && rec->chromEnd == end) // in pgSnp mode, don't get name
-	    vcfRecordDetails(rec);
+	    vcfRecordDetails(tdb, rec);
     }
 }
 
 
 #endif // no USE_TABIX