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" );