9ca89f9ff4facb407acfd0a8e970472a45be29a0
hiram
  Tue Sep 22 11:48:06 2020 -0700
adding chrom.sizes as download file for hgTracks sequences in assembly hubs refs #24396

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 62ca1c4..cb31886 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -9910,32 +9910,33 @@
 boolean gotExtTools = extToolsEnabled();
 setupHotkeys(gotExtTools);
 if (gotExtTools)
     printExtMenuData(chromName);
 if (recTrackSetsEnabled())
     printRecTrackSets();
 }
 
 static void chromInfoTotalRow(int count, long long total, boolean hasAlias)
 /* Make table row with total number of sequences and size from chromInfo. */
 {
 cgiSimpleTableRowStart();
 cgiSimpleTableFieldStart();
 printf("Total: %d", count);
 cgiTableFieldEnd();
-cgiSimpleTableFieldStart();
+cgiTableFieldStartAlignRight();
 printLongWithCommas(stdout, total);
+puts("  ");
 cgiTableFieldEnd();
 if (hasAlias)
     {
     cgiSimpleTableFieldStart();
     puts("&nbsp");
     cgiTableFieldEnd();
     }
 cgiTableRowEnd();
 }
 
 static char *chrAliases(struct hash *aliasHash, char *sequenceName)
 /* lookup the sequenceName in the aliasHash and return csv string
  * of alias names
  */
 {
@@ -10203,77 +10204,85 @@
 	cgiTableRowEnd();
 	cgiSimpleTableRowStart();
 	cgiSimpleTableFieldStart();
 	printLongWithCommas(stdout, scafCount);
 	cgiTableFieldEnd();
 	cgiSimpleTableFieldStart();
 	printLongWithCommas(stdout, totalSize);
 	cgiTableFieldEnd();
 	}
     cgiTableRowEnd();
     }
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 }
 
-static void chromSizesDownloadRow(boolean hasAlias, char *hubAliasFile)
+static void chromSizesDownloadRow(boolean hasAlias, char *hubAliasFile, char *chromSizesFile)
 /* Show link to chrom.sizes file at end of chromInfo table (unless this is a hub) */
 {
 if (! trackHubDatabase(database))
     {
     cgiSimpleTableRowStart();
     cgiSimpleTableFieldStart();
-    puts("Download as file");
+    puts("Download as file:");
     cgiTableFieldEnd();
     cgiSimpleTableFieldStart();
     printf("<A HREF='http://%s/goldenPath/%s/bigZips/%s.chrom.sizes'>%s.chrom.sizes</A>",
            hDownloadsServer(), database, database, database);
     cgiTableFieldEnd();
     if (hasAlias)
 	{
 	cgiSimpleTableFieldStart();
 	puts("&nbsp");
 	cgiTableFieldEnd();
 	}
     cgiTableRowEnd();
     }
 else if (hubAliasFile)
     {
     cgiSimpleTableRowStart();
     cgiSimpleTableFieldStart();
-    puts("Download as file");
+    puts("Download as file:");
     cgiTableFieldEnd();
     cgiSimpleTableFieldStart();
+    if (chromSizesFile)
+	{
+        printf("<a href='%s' target=_blank>%s.chrom.sizes.txt</A>", chromSizesFile, trackHubSkipHubName(database));
+        puts("&nbsp;&nbsp;");
+	}
+    else
         puts("&nbsp");
     cgiTableFieldEnd();
     cgiSimpleTableFieldStart();
-    printf("<a href='%s' target=_blank>assembly hub alias file</A>", hubAliasFile);
+    printf("<a href='%s' target=_blank>%s.chromAlias.txt</A>", hubAliasFile, trackHubSkipHubName(database));
     cgiTableFieldEnd();
     cgiTableRowEnd();
     }
 }
 
 void chromInfoPage()
 /* Show list of chromosomes (or scaffolds, etc) on which this db is based. */
 {
 boolean hasAlias = FALSE;
+char *chromSizesFile = NULL;
 char *aliasFile = NULL;
 if (trackHubDatabase(database))
     {
     aliasFile = trackHubAliasFile(database);
     if (aliasFile)
         hasAlias = TRUE;
+    chromSizesFile = trackHubChromSizes(database);
     }
 else
     hasAlias = hTableExists(database, "chromAlias");
 
 char *position = cartUsualString(cart, "position", hDefaultPos(database));
 char *defaultChrom = hDefaultChrom(database);
 char *freeze = hFreezeFromDb(database);
 struct dyString *title = dyStringNew(512);
 if (freeze == NULL)
     dyStringPrintf(title, "%s Browser Sequences",
 		   hOrganism(database));
 else if (stringIn(database, freeze))
     dyStringPrintf(title, "%s %s Browser Sequences",
 		   hOrganism(database), freeze);
 else
@@ -10307,31 +10316,31 @@
 else if (hasAlias)
     {
     cgiSimpleTableFieldStart();
     puts("alias sequence names &nbsp;");
     cgiTableFieldEnd();
     }
 cgiTableRowEnd();
 
 if (sameString(database,"hg38"))
     chromInfoRowsChromExt("withAltRandom");
 else if ((startsWith("chr", defaultChrom) || startsWith("Group", defaultChrom)) &&
     hChromCount(database) < 100)
     chromInfoRowsChrom();
 else
     chromInfoRowsNonChrom(1000);
-chromSizesDownloadRow(hasAlias, aliasFile);
+chromSizesDownloadRow(hasAlias, aliasFile, chromSizesFile);
 
 hTableEnd();
 cgiDown(0.9);
 
 hgPositionsHelpHtml(organism, database);
 puts("</FORM>");
 dyStringFree(&title);
 webEndSectionTables();
 }	/*	void chromInfoPage()	*/
 
 void resetVars()
 /* Reset vars except for position and database. */
 {
 static char *except[] = {"db", "position", NULL};
 char *cookieName = hUserCookie();