6dcfa7d1962d9e9dbfa5cbe651b6e301101287ef
hiram
  Fri Sep 25 12:51:58 2026 -0700
beginning to get a miniMap2 process in place refs #34360

diff --git src/hg/utils/automation/AsmHub.pm src/hg/utils/automation/AsmHub.pm
index 8f62543fc0c..e42f13f4753 100755
--- src/hg/utils/automation/AsmHub.pm
+++ src/hg/utils/automation/AsmHub.pm
@@ -7,31 +7,32 @@
 
 use warnings;
 use strict;
 use Carp;
 use File::Basename;
 use File::stat;
 use vars qw(@ISA @EXPORT_OK);
 use Exporter;
 
 @ISA = qw(Exporter);
 
 # This is a listing of the public methods and variables (which should be
 # treated as constants) exported by this module:
 @EXPORT_OK = (
     # Support for common command line options:
-    qw( commify asmSize ncbiGeneDescription
+    qw( commify asmSize ncbiGeneDescription asmIdToPath
+        accessionFromPath mashSketchDir
       ),
 );
 
 # from Perl Cookbook Recipe 2.17, print out large numbers with comma
 # delimiters, input is a large number with no commas:
 sub commify($) {
     my $text = reverse $_[0];
     $text =~ s/(\d\d\d)(?=\d)(?!\d*\.)/$1,/g;
     return scalar reverse $text
 }
 
 # given an asmId.chrom.sizes, return the assembly size from the
 # sum of column 2:
 sub asmSize($) {
     my ($chromSizes) = @_;
@@ -40,30 +41,65 @@
     return $asmSize;
 }
 
 # given a fully qualified asmId, e.g.: GCA_018504075.1_HG02723.alt.pat.f1_v2
 # return the string representating the path: GCA/018/504/075
 sub asmIdToPath($) {
   my ($asmId) = @_;
   my $gcX = substr($asmId, 0, 3);
   my $d0 = substr($asmId, 4, 3);
   my $d1 = substr($asmId, 7, 3);
   my $d2 = substr($asmId, 10, 3);
   my $ret = sprintf("%s/%s/%s/%s", $gcX, $d0, $d1, $d2);
   return $ret;
 }
 
+# given any path to a sequence file (.2bit, .fa/.fasta, .fa.gz/.fasta.gz),
+# return the bare NCBI accession (e.g. GCA_939628115.1) if the basename
+# starts with one -- the standard GenArk convention is that these files
+# are named <asmId>.2bit, i.e. <accession>_<name>.2bit, but this only
+# needs the accession prefix to match.  Returns undef if the basename
+# doesn't look like an accession at all (an arbitrary/non-GenArk file).
+sub accessionFromPath($) {
+  my ($path) = @_;
+  my $base = basename($path);
+  return undef if ($base !~ m/^(GC[AF]_\d{9}\.\d+)/);
+  return $1;
+}
+
+# given a bare accession (or full asmId -- only the accession prefix is
+# used), resolve and return the standard GenArk mashSketch cache
+# directory for it:
+#   /hive/data/genomes/asmHubs/{genbankBuild,refseqBuild}/GCx/ddd/ddd/ddd/asmId/mashSketch
+# by locating the actual on-disk asmId directory, the same way
+# asmHubChainNet.pl resolves a bare accession to its full build
+# directory name.  Returns undef if no such build directory exists
+# (accession not built here, wrong accession, etc.) -- callers should
+# fall back to an ordinary scratch directory in that case.
+sub mashSketchDir($) {
+  my ($accession) = @_;
+  return undef if ($accession !~ m/^GC[AF]_\d{9}/);
+  my $gcX = substr($accession, 0, 3);
+  my $hubBuildDir = ($gcX eq 'GCA') ? 'genbankBuild' : 'refseqBuild';
+  my $accDir = "/hive/data/genomes/asmHubs/$hubBuildDir/" . &asmIdToPath($accession);
+  my $asmId = `ls -d $accDir/${accession}_* 2> /dev/null | head -1`;
+  chomp $asmId;
+  return undef if (! $asmId);
+  $asmId =~ s#.*/##;
+  return "$accDir/$asmId/mashSketch";
+}
+
 # Look up NCBI's own annotation provider/name/date for an accession from
 # the 'genark' database's assemblySummary{Genbank,Refseq} table, falling
 # back to the ...Historical variant when the accession isn't in the
 # current one (a superseded/suppressed assembly).  Returns ("", "", "")
 # if found in neither, so callers always get three defined strings.
 sub fetchAnnotationInfo($$) {
   my ($asmType, $accession) = @_;
   my $table = "assemblySummary" . ucfirst($asmType);
   foreach my $t ($table, "${table}Historical") {
     my $result = `hgsql -N -e 'select annotationProvider,annotationName,annotationDate from $t where assemblyAccession="$accession";' genark 2> /dev/null`;
     chomp $result;
     next if ($result eq "");
     my ($provider, $name, $date) = split('\t', $result);
     $provider = "" if ( ! defined $provider || $provider eq "NULL" );
     $name = "" if ( ! defined $name || $name eq "NULL" );