d947dcc75b04fd0dc921c0eb02ed988d7b4819f0
braney
  Mon Jun 30 16:00:56 2025 -0700
let genark hubs appear in hgConvert if we can figure out their UCSC org

diff --git src/hg/lib/genark.c src/hg/lib/genark.c
index 9d31bd1d39b..df599a2ae91 100644
--- src/hg/lib/genark.c
+++ src/hg/lib/genark.c
@@ -1,27 +1,28 @@
 /* genark.c was originally generated by the autoSql program, which also
  * generated genark.h and genark.sql.  This module links the database and
  * the RAM representation of objects. */
 
 #include <limits.h>
 #include "common.h"
 #include "linefile.h"
 #include "dystring.h"
 #include "jksql.h"
 #include "genark.h"
 #include "hgConfig.h"
 #include "hdb.h"
+#include "dbDb.h"
 
 char *genarkCommaSepFieldNames = "gcAccession,hubUrl,asmName,scientificName,commonName,taxId,priority,clade";
 
 void genarkStaticLoad(char **row, struct genark *ret)
 /* Load a row from genark table into ret.  The contents of ret will
  * be replaced at the next call to this function. */
 {
 int colCount = genArkColumnCount();
 
 ret->gcAccession = row[0];
 ret->hubUrl = row[1];
 ret->asmName = row[2];
 ret->scientificName = row[3];
 ret->commonName = row[4];
 ret->taxId = sqlSigned(row[5]);
@@ -371,15 +372,96 @@
 return colCount;
 }
 
 boolean isGenArk(char *genome)
 /* given a genome name, see if it is in the genark table to determine
  *  yes/no this is a genark genome assembly
  */
 {
 if (isEmpty(genome))
     return FALSE;
 char *url = genarkUrl(genome);
 if (isEmpty(url))
     return FALSE;
 return TRUE;
 }
+
+struct dbDb * genarkMakeDbDb(char **row)
+/* Fake a dbDb structure for a Genark hub. */
+{
+struct dbDb *dbDb;
+struct hash *orgHash = genarkGetOrgHash();
+
+AllocVar(dbDb);
+
+dbDb->name = cloneString(row[0]);
+dbDb->nibPath = cloneString("genark"); 
+dbDb->description = cloneString(row[4]); // commonName
+dbDb->scientificName = cloneString(row[3]); 
+dbDb->taxId = atoi(row[5]); 
+dbDb->genome = hashFindVal(orgHash, row[0]);
+dbDb->orderKey = 99999;
+dbDb->defaultPos = "default";
+if (dbDb->genome == NULL)
+    dbDb->genome = "Other";
+
+return dbDb;
+}
+
+struct dbDb *genarkLiftOverDbs(char *listOfAccs)
+/* return list of dbDb structures for the genark genomes that match listOfAccs */
+{
+if (!cfgOption("genarkLiftOver"))
+    return NULL;
+struct dbDb *list = NULL;
+char query[64 * 1024];
+
+safef(query, sizeof query, "NOSQLINJ select * from %s where gcAccession in (%s)", genarkTableName(), listOfAccs);
+struct sqlConnection *conn = hConnectCentral();
+struct sqlResult *sr;
+char **row;
+
+sr = sqlGetResult(conn, query);
+while ((row = sqlNextRow(sr)) != NULL)
+    {
+    struct dbDb *dbDb = genarkMakeDbDb(row);
+    slAddHead(&list, dbDb);
+    }
+slReverse(&list);
+sqlFreeResult(&sr);
+hDisconnectCentral(&conn);
+return list;
+}
+
+struct dbDb *genarkLiftOverDb(char *acc)
+/* return dbDb structure for GC* acc */
+{
+char query[4096];
+safef(query, sizeof query, "'%s'", acc);
+
+return genarkLiftOverDbs(query);
+}
+
+struct hash *genarkGetOrgHash()
+/* read table that maps gcAccession to UCSC org. */
+{
+static struct hash *orgHash = NULL;
+
+if (orgHash != NULL)
+    return orgHash;
+char query[64 * 1024];
+
+sqlSafef(query, sizeof query, "select * from %s", "genarkOrg");
+struct sqlConnection *conn = hConnectCentral();
+struct sqlResult *sr;
+char **row;
+orgHash = newHash(0);
+
+sr = sqlGetResult(conn, query);
+while ((row = sqlNextRow(sr)) != NULL)
+    {
+    hashAdd(orgHash, cloneString(row[0]), cloneString(row[1]));
+    }
+sqlFreeResult(&sr);
+hDisconnectCentral(&conn);
+return orgHash;
+}