75f0d8f409975fddfd9c01378b4404d19393ec6b hiram Fri Sep 25 12:53:35 2026 -0700 beginning to get a miniMap2 process in place refs #34360 diff --git src/hg/utils/automation/mashDistance.pl src/hg/utils/automation/mashDistance.pl index c6b2caedbc3..cab868050da 100755 --- src/hg/utils/automation/mashDistance.pl +++ src/hg/utils/automation/mashDistance.pl @@ -1,131 +1,130 @@ #!/usr/bin/env perl # DO NOT EDIT the /cluster/bin/scripts copy of this file -- # edit ~/kent/src/hg/utils/automation/mashDistance.pl instead. # mashDistance.pl -- standalone divergence check between two assemblies. # Thin CLI wrapper around AssemblyDivergence.pm, for a human (or another # script, via backticks) to decide which pairwise pipeline fits a given # pair before committing to one: # doMiniMap2.pl (minimap2/chain/net) for closely related pairs # doBlastzChainNet.pl (lastz/chain/net) for everything else use Getopt::Long; use warnings; use strict; use FindBin qw($Bin); use lib "$Bin"; use HgAutomate; use AssemblyDivergence; use AsmHub qw(asmIdToPath); use vars qw/ $opt_workDir $opt_regenerate $opt_dbHost $opt_help /; my $dbHost = 'hgwdev'; sub usage { my ($status) = @_; print STDERR " usage: mashDistance.pl aSeq bSeq Measures mash distance between two sequences and recommends which UCSC pairwise pipeline fits: doMiniMap2.pl (minimap2/chain/net) for closely related pairs doBlastzChainNet.pl (lastz/chain/net) for everything else aSeq and bSeq can each be, in any combination: - a plain path to a .2bit, .fa/.fasta, or .fa.gz/.fasta.gz file - a GenArk accession, e.g. GCA_060551615.1, translated to its standard location: /gbdb/genark/GCA/060/551/615/GCA_060551615.1/GCA_060551615.1.2bit - a UCSC database name, e.g. hg38, translated to /gbdb/hg38/hg38.2bit For a GenArk assembly (basename starting with GCA_/GCF_ and built under /hive/data/genomes/asmHubs/), or for a plain UCSC database's own sequence file (e.g. /gbdb/hg38/hg38.2bit, recognized via an hgcentraltest dbDb lookup), the mash sketch is cached permanently in that assembly's own mashSketch/ directory and reused on every future call for it -- no need to re-sketch the same genome for every pairwise check. For anything else, sketches are one-off, written to -workDir. Prints, to stdout, lines suitable for parsing by another script: mashDistance=<float> pipeline=minimap2|lastz minimapPreset=asm5|asm10|asm20 (only when pipeline=minimap2) Any recommendation caveat goes to stderr, not stdout. options: -workDir dir Fallback scratch dir for mash sketch files, used only for a sequence file that isn't a cacheable GenArk accession (see above). Default: a fresh directory under /tmp, removed on exit. Give an existing pipeline's build dir here to reuse/leave behind its mashSketch.{a,b}.msh files. -regenerate Re-sketch and overwrite even if a .msh already exists, cached or fallback. Use after changing sketch parameters, after a re-built assembly, or - to pick up sketches made before -I <accession> - labeling was added. + some other change to the assembly. -dbHost host Host to run the hgcentraltest dbDb lookup on (see above), default: $dbHost. hgcentraltest is only reachable from hgwdev -- change this only if you know what you're doing. -help This help. "; exit $status; } # Accept an existing path as-is (unchanged, original behavior). Also # accept two "just tell me the name" shorthands and translate them to # the standard, already-built location for that assembly -- everything # under /gbdb is a fixed, predictable layout, so this is plain path # construction, no database lookup needed: # GCA_060551615.1 -> /gbdb/genark/GCA/060/551/615/GCA_060551615.1/GCA_060551615.1.2bit # hg38 -> /gbdb/hg38/hg38.2bit sub resolveSeqArg { my ($arg) = @_; return $arg if (-e $arg); if ($arg =~ m/^(GC[AF]_\d{9}\.\d+)$/) { my $accession = $1; my $path = "/gbdb/genark/" . &asmIdToPath($accession) . "/$accession/$accession.2bit"; return $path if (-e $path); die "mashDistance.pl: '$arg' looks like a GenArk accession, but " . "$path doesn't exist\n"; } my $path = "/gbdb/$arg/$arg.2bit"; return $path if (-e $path); die "mashDistance.pl: can't find '$arg' as a path, a GenArk accession " . "under /gbdb/genark/, or a UCSC database's .2bit under /gbdb/\n"; } # resolveSeqArg my $ok = GetOptions('workDir=s', 'regenerate', 'dbHost=s', 'help'); &usage(1) if (!$ok); &usage(0) if ($opt_help); &usage(1) if (scalar(@ARGV) != 2); my ($aSeq, $bSeq) = @ARGV; $dbHost = $opt_dbHost if ($opt_dbHost); $aSeq = &resolveSeqArg($aSeq); $bSeq = &resolveSeqArg($bSeq); my $workDir = $opt_workDir; my $cleanupWorkDir = 0; if ($workDir) { &HgAutomate::mustMkdir($workDir) if (! -d $workDir); } else { $workDir = `mktemp -d -t mashDistance.XXXXXX`; chomp $workDir; $cleanupWorkDir = 1; } my $dist = &AssemblyDivergence::mashDistance($aSeq, $bSeq, $workDir, $opt_regenerate, $dbHost); my ($pipeline, $preset, $warning) = &AssemblyDivergence::choosePipeline($dist); print "mashDistance=$dist\n"; print "pipeline=$pipeline\n"; print "minimapPreset=$preset\n" if ($preset); warn "$warning\n" if ($warning); system("rm -rf $workDir") if ($cleanupWorkDir);