3c1b9cee5a4152b70e2fc10b432082ea89fecae6 hiram Tue Sep 29 15:06:19 2026 -0700 add trackDb construction for miniMap2 chain tracks refs #34360 diff --git src/hg/utils/automation/asmHubMiniMap2ChainNetTrackDb.pl src/hg/utils/automation/asmHubMiniMap2ChainNetTrackDb.pl new file mode 100755 index 00000000000..a9f2007db1e --- /dev/null +++ src/hg/utils/automation/asmHubMiniMap2ChainNetTrackDb.pl @@ -0,0 +1,219 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use File::Basename; +use FindBin qw($Bin); +use lib "$Bin"; +use HgAutomate; + +sub usage() { + printf STDERR "usage: asmHubMiniMap2ChainNetTrackDb.pl <buildDir>\n"; + printf STDERR "expecting to find directories: buildDir/trackData/miniMap2.*/\n"; + printf STDERR "where each /miniMap2.*/ directory is one completed minimap2/chainNet\n"; + printf STDERR "and basename(buildDir) is the 'target' sequence name\n"; + exit 255; +} + +my $argc = scalar(@ARGV); + +if ($argc != 1) { + usage; +} + +my $buildDir = shift; +my $targetDb = basename($buildDir); +my @tParts = split('_', $targetDb); +my $targetAccession = "$tParts[0]_$tParts[1]"; +my @queryList; +my %queryPrio; # key is queryDb, value is featureBits on chain file +my %commonName; # key is queryDb, value is common name + +open (my $CN, "-|", "hgsql -N -e 'select gcAccession,commonName from genark;' hgcentraltest") or die "can not hgsql -N -e 'select gcAccession,commonName from genark;'"; +while (my $line = <$CN>) { + chomp $line; + my ($gcX, $comName) = split('\t', $line); + $comName =~ s/\s\(.*//; + $commonName{$gcX} = $comName; +} +close ($CN); + +open ($CN, "-|", "hgsql -N -e 'select name,organism from dbDb;' hgcentraltest") or die "can not hgsql -N -e 'select name,organism from dbDb;'"; +while (my $line = <$CN>) { + chomp $line; + my ($gcX, $comName) = split('\t', $line); + $comName =~ s/\s\(.*//; + $commonName{$gcX} = "$comName/${gcX}"; +} +close ($CN); + +`mkdir -p $buildDir/bbi`; + +# doMiniMap2.pl names buildDir/trackData/miniMap2.$QDb where $QDb is +# ucfirst() of the actual query db/accession. Reconstruct the actual +# db name/accession (otherDb) by undoing that ucfirst, except for a +# GenArk accession (already starts with the uppercase 'GC', ucfirst is +# a no-op there). +sub queryDbFromQDb($) { + my ($qDb) = @_; + return $qDb if ($qDb =~ m/^GC/); + return lcfirst($qDb); +} + +open (DL, "ls -d $buildDir/trackData/miniMap2.*|") or die "can not list $buildDir/trackData/miniMap2.*"; +while (my $mm2Dir = <DL>) { + chomp $mm2Dir; + my $Qdb = basename($mm2Dir); + $Qdb =~ s/miniMap2.//; + my $queryDb = &queryDbFromQDb($Qdb); + $queryPrio{$queryDb} = 100; + my $fbTxt = `ls $buildDir/trackData/miniMap2.${Qdb}/fb.*.chain${Qdb}Link.txt 2> /dev/null`; + chomp $fbTxt; + if (-s "${fbTxt}") { + my $prio = `cut -d' ' -f5 $fbTxt | tr -d '()%'`; + chomp $prio; + $queryPrio{$queryDb} = sprintf("%.3f", 100 - $prio); + } +} +close (DL); + +foreach my $qDb ( sort {$queryPrio{$a} <=> $queryPrio{$b}} keys %queryPrio) { + push @queryList, $qDb; +} + +##### begin trackDb output ###### +printf "track %sChainNetMiniMap2\n", $targetDb; +printf "compositeTrack on +shortLabel minimap2 Chain/Net +longLabel minimap2 chain alignments to target sequence: %s\n", $targetDb; +printf "subGroup1 view Views chain=Chains liftover=Lift_over\n"; +printf "subGroup2 species Assembly"; +my $N = 0; +foreach my $queryDb (@queryList) { + printf " s%03d=%s", $N++, $queryDb; +} +printf "\n"; +printf "subGroup3 chainType chain_type c00=chain c01=lift_over\n"; +printf "dragAndDrop subTracks\n"; +printf "visibility hide +group compGeno +color 0,0,0 +altColor 255,255,0 +type bed 3 +chainLinearGap medium +dimensions dimensionX=chainType dimensionY=species +sortOrder species=+ view=+ chainType=+ +configurable on\n"; +printf "html html/%s.miniMap2ChainNet\n", $targetDb; + +my $QueryDb = "QDb"; +my $queryDate = "some date"; +my $comName = "some date"; +my $queryAsmName = "qAsmName"; + +$N = 0; +my $headerOut = 0; +foreach my $queryDb (@queryList) { + $comName = $queryDb; + $comName = $commonName{$queryDb} if (defined($commonName{$queryDb})); + $QueryDb = ucfirst($queryDb); + my $mm2Dir="miniMap2.$QueryDb"; + `rm -f $buildDir/bbi/$targetDb.chainMiniMap2${QueryDb}.bb`; + `rm -f $buildDir/bbi/$targetDb.chainMiniMap2${QueryDb}Link.bb`; + `ln -s ../trackData/$mm2Dir/axtChain/chain${QueryDb}.bb $buildDir/bbi/$targetDb.chainMiniMap2${QueryDb}.bb`; + `ln -s ../trackData/$mm2Dir/axtChain/chain${QueryDb}Link.bb $buildDir/bbi/$targetDb.chainMiniMap2${QueryDb}Link.bb`; + $queryDate = "some date"; + $queryAsmName = ""; + if ( $queryDb !~ m/^GC/ ) { + $queryDate = `hgsql -N -e 'select description from dbDb where name="$queryDb"' hgcentraltest | sed -e 's/ (.*//;'`; + chomp $queryDate; + } else { + ($queryDate, $queryAsmName) = &HgAutomate::hubDateName($queryDb); + } + if (0 == $headerOut) { + printf " + track %sChainNetMiniMap2Viewchain + shortLabel Chains + view chain + visibility dense + parent %sChainNetMiniMap2 + spectrum on +", $targetDb, $targetDb; + $headerOut = 1; + + printf " + track chainMiniMap2%s + parent %sChainNetMiniMap2Viewchain on", $QueryDb, $targetDb; + } else { + printf " + track chainMiniMap2%s + parent %sChainNetMiniMap2Viewchain off", $QueryDb, $targetDb; + } + printf " + subGroups view=chain species=s%03d chainType=c00 + shortLabel %s mm2 Chain + longLabel %s/%s%s (%s) minimap2 Chained Alignments + type bigChain %s + bigDataUrl bbi/%s.chainMiniMap2%s.bb + linkDataUrl bbi/%s.chainMiniMap2%sLink.bb + otherDb %s + html html/%s.miniMap2ChainNet + priority %s +", $N, $comName, $comName, $queryDb, $queryAsmName, $queryDate, $queryDb, $targetDb, + $QueryDb, $targetDb, $QueryDb, $queryDb, $targetDb, $queryPrio{$queryDb}; + $N++; +} + +$N = 0; +$headerOut = 0; +foreach my $queryDb (@queryList) { + $comName = $queryDb; + $comName = $commonName{$queryDb} if (defined($commonName{$queryDb})); + $QueryDb = ucfirst($queryDb); + my $mm2Dir="miniMap2.$QueryDb"; + + if ( -s "$buildDir/trackData/$mm2Dir/axtChain/chainLiftOver${QueryDb}.bb" ) { + `rm -f $buildDir/bbi/$targetDb.chainLiftOverMiniMap2${QueryDb}.bb`; + `rm -f $buildDir/bbi/$targetDb.chainLiftOverMiniMap2${QueryDb}Link.bb`; + `ln -s ../trackData/$mm2Dir/axtChain/chainLiftOver${QueryDb}.bb $buildDir/bbi/$targetDb.chainLiftOverMiniMap2${QueryDb}.bb`; + `ln -s ../trackData/$mm2Dir/axtChain/chainLiftOver${QueryDb}Link.bb $buildDir/bbi/$targetDb.chainLiftOverMiniMap2${QueryDb}Link.bb`; + + if ( $queryDb !~ m/^GC/ ) { + $queryDate = `hgsql -N -e 'select description from dbDb where name="$queryDb"' hgcentraltest | sed -e 's/ (.*//;'`; + chomp $queryDate; + } else { + ($queryDate, $queryAsmName) = &HgAutomate::hubDateName($queryDb); + } + + if (0 == $headerOut) { + printf " + track %sChainNetMiniMap2ViewLiftOver + shortLabel Lift over + view liftover + visibility hide + parent %sChainNetMiniMap2 + spectrum on +", $targetDb, $targetDb; + $headerOut = 1; + } + + printf " + track chainLiftOverMiniMap2%s + parent %sChainNetMiniMap2ViewLiftOver off + subGroups view=liftover species=s%03d chainType=c01 + shortLabel %s mm2 loChain + longLabel %s/%s%s (%s) minimap2 Lift Over Chained Alignments + type bigChain %s + bigDataUrl bbi/%s.chainLiftOverMiniMap2%s.bb + linkDataUrl bbi/%s.chainLiftOverMiniMap2%sLink.bb + otherDb %s + html html/%s.miniMap2ChainNet + priority %s +", $QueryDb, $targetDb, $N, $comName, $comName, $queryDb, $queryAsmName, $queryDate, $queryDb, $targetDb, + $QueryDb, $targetDb, $QueryDb, $queryDb, $targetDb, $queryPrio{$queryDb}; + + } + $N++; +} + +printf "\n" if ($N > 0);