0a05f3e3c58ea53afa036c0d0be18d4eb79e11b5
hiram
Mon May 4 15:28:20 2026 -0700
enable B links for maf clicks to GenArk browsers
diff --git src/hg/hgc/mafClick.c src/hg/hgc/mafClick.c
index 58b25be3afd..85c7551bfc4 100644
--- src/hg/hgc/mafClick.c
+++ src/hg/hgc/mafClick.c
@@ -6,30 +6,31 @@
#include "common.h"
#include "hash.h"
#include "linefile.h"
#include "hgc.h"
#include "maf.h"
#include "obscure.h"
#include "cheapcgi.h"
#include "genePred.h"
#include "botDelay.h"
#include "hgMaf.h"
#include "hui.h"
#include "hCommon.h"
#include "hubConnect.h"
#include "trackHub.h"
#include "chromAlias.h"
+#include "genark.h"
extern boolean issueBotWarning;
#define ADDEXONCAPITAL
/* Javascript to help make a selection from a drop-down
* go back to the server. */
static char *autoSubmit = "document.gpForm.submit();";
static char *splitMafSrc(char *src, char *dbOnly, int dbOnlySize, struct hash *labelHash)
/* Split a maf component src ("db.chrom") into db (in dbOnly) and chrom
* (return value). If labelHash has an entry whose key is a prefix of src
* ending at a dot, prefer that. This handles multi-dot db names like assembly
* hub accessions ("GCF_000009085.1.NC_002163v1").
* Falls back to chopping at the first dot when no labelHash hit. */
@@ -201,32 +202,43 @@
if (mc->strand == '-')
reverseIntRange(&s, &e, mc->srcSize);
if (mc->text != NULL)
{
if (lineStart == 0)
{
if (hDbIsActive(dbOnly))
{
dyStringPrintf(dy, "%s Browser %s:%d-%d %c %*dbps",hOrganism(dbOnly),chrom, s+1, e, mc->strand,sizeChars, mc->size);
linkToOtherBrowserTitle(dbOnly, chrom, s, e, dy->string);
dyStringClear(dy);
fprintf(f, "B ");
}
+ else
+ {
+ char *hubUrl = genarkUrl(dbOnly);
+ if (hubUrl != NULL)
+ {
+ dyStringPrintf(dy, "%s Browser %s:%d-%d %c %*dbps", org, chrom, s+1, e, mc->strand, sizeChars, mc->size);
+ fprintf(f, "B ",
+ dy->string, hgTracksName(), dbOnly, cgiEncode(hubUrl), cgiEncode(chrom), s+1, e);
+ dyStringClear(dy);
+ }
else
fprintf(f, " ");
+ }
if (hDbExists(dbOnly))
{
dyStringPrintf(dy, "Get %s DNA %s:%d-%d %c %*dbps",hOrganism(dbOnly),chrom, s+1, e, mc->strand,sizeChars, mc->size);
printf("D ", dy->string,hgcName(),
s, cgiEncode(chrom),
chrom, s, e, dbOnly, revComp);
}
else
fprintf(f, " ");
}
else
{
fprintf(f, " ");
}
@@ -252,32 +264,43 @@
int s = mc->start;
int e = s + mc->rightLen;
struct dyString *dy = dyStringNew(512);
if (mc->strand == '-')
reverseIntRange(&s, &e, mc->srcSize);
if ( hDbIsActive(dbOnly))
{
dyStringPrintf(dy, "%s Browser %s:%d-%d %c %d bps Unaligned",hOrganism(dbOnly),chrom, s+1, e, mc->strand, e-s);
linkToOtherBrowserTitle(dbOnly, chrom, s, e, dy->string);
fprintf(f,"B ");
dyStringClear(dy);
}
+ else
+ {
+ char *hubUrl = genarkUrl(dbOnly);
+ if (hubUrl != NULL)
+ {
+ dyStringPrintf(dy, "%s Browser %s:%d-%d %c %d bps Unaligned", org, chrom, s+1, e, mc->strand, e-s);
+ fprintf(f, "B ",
+ dy->string, hgTracksName(), dbOnly, cgiEncode(hubUrl), cgiEncode(chrom), s+1, e);
+ dyStringClear(dy);
+ }
else
fprintf(f," ");
+ }
if (hDbExists(dbOnly))
{
dyStringPrintf(dy, "Get %s DNA %s:%d-%d %c %d bps Unaligned",hOrganism(dbOnly),chrom, s+1, e, mc->strand, e-s);
printf("D ", dy->string, hgcName(),
s, cgiEncode(chrom),
chrom, s, e, dbOnly,revComp);
}
else
fprintf(f, " ");
}
else
fprintf(f, " ");
initSummaryLine(summaryLine, size, ' ');
@@ -344,32 +367,41 @@
if (hDbIsActive(dbOnly))
{
char strand = mc->strand;
#ifdef REVERSESTRAND
if (cartCgiUsualBoolean(cart, COMPLEMENT_BASES_VAR, FALSE))
strand = (strand == '+') ? '-' : '+';
#endif
if (strand == '-') revComp = "&hgSeq.revComp=on";
linkToOtherBrowser(dbOnly, chrom, s, e);
fprintf(f,"B");
fprintf(f, "");
fprintf(f, " ");
}
+ else
+ {
+ char *hubUrl = genarkUrl(dbOnly);
+ if (hubUrl != NULL)
+ {
+ fprintf(f, "B ",
+ hgTracksName(), dbOnly, cgiEncode(hubUrl), cgiEncode(chrom), s+1, e);
+ }
else
fprintf(f, " ");
+ }
if (hDbExists(dbOnly))
{
printf("D ", hgcName(), s, cgiEncode(chrom), chrom, s,
e, dbOnly,revComp);
}
else
fprintf(f, " ");
fprintf(f, "%*s %dbp\n", srcChars, org,mc->rightLen);
}
}
fprintf(f, "\n");
}
freeMem(summaryLine);