46849f2053370ff9c0ff9594936d95a51124b162
markd
  Mon Aug 4 13:17:44 2025 -0700
adjustments to clsLongReadRna trackDb to address composite behavior problems

diff --git src/hg/makeDb/outside/clsLongReadRna/clsTrackTool src/hg/makeDb/outside/clsLongReadRna/clsTrackTool
index 1d00d29f1f2..2abca8b574c 100755
--- src/hg/makeDb/outside/clsLongReadRna/clsTrackTool
+++ src/hg/makeDb/outside/clsLongReadRna/clsTrackTool
@@ -342,36 +342,36 @@
           post_capture_pacbio_models=Post-capture_PacBio_models \\
           pre_capture_ont_reads=Pre-capture_ONT_reads \\
           pre_capture_pacbio_reads=Pre-capture_PacBio_reads \\
           post_capture_ont_reads=Post-capture_ONT_reads \\
           post_capture_pacbio_reads=Post-capture_PacBio_reads
 dimensions dimX=type dimY=sample
 html clsLongReadRna.html
 
 """
 
 TARGETS_TDB = """\
     track targets_view
     view targets_view
     parent clsLongReadRnaTrack
     shortLabel Targets
-    visibility hide
+    visibility dense
     type bigBed
     noScoreFilter on
 
         track target_regions
-        parent targets_view on
+        parent targets_view off
         subGroups view=targets_view sample=combined type=targets
         shortLabel CLS targets
         longLabel CLS target regions
         labelFields name
         defaultLabelFields none
         type bigBed 6 +
         color 0,100,0
         bigDataUrl {bigDataUrl}
         priority 1
 
 """
 
 MODELS_TDB = """\
     track models_view
     view models_view
@@ -396,64 +396,64 @@
 
 SAMPLE_MODELS_VIEW_TDB = """\
     track sample_models_view
     view sample_models_view
     parent clsLongReadRnaTrack
     shortLabel Sample models
     visibility squish
     type bigBed
     noScoreFilter on
 
 """
 
 SAMPLE_MODELS_TDB = """\
         track {sample}_models
         parent sample_models_view on
-        shortLabel {sample} models
-        longLabel {sample} transcript models
+        shortLabel {shortLabel}
+        longLabel {longLabel}
         bigDataUrl {bigDataUrl}
         type bigBed 12 +
         color 100,22,180
         subGroups view=sample_models_view sample={sample} type=models
 
 """
 
 EXPR_READS_VIEW_TDB = """\
     track per_expr_reads_view
-    parent clsLongReadRnaTrack on
     view per_expr_reads_view
+    parent clsLongReadRnaTrack on
     shortLabel Reads
     visibility hide
     type bam
 
 """
 
 EXPR_READS_TDB = """\
         track {track}
         parent per_expr_reads_view on
         shortLabel {shortLabel}
         longLabel {longLabel}
         bigDataUrl {bigDataUrl}
         type bam
         subGroups view=per_expr_reads_view sample={sample} type={type}
 
 """
 
 EXPR_MODELS_VIEW_TDB = """\
     track per_expr_models_view
+    view per_expr_models_view
     parent clsLongReadRnaTrack on
-    view per_exp_models_view
     shortLabel Models
     visibility hide
     type bam
     noScoreFilter on
 
 """
 
 EXPR_MODELS_TDB = """\
         track {track}
         parent per_expr_models_view on
         shortLabel {shortLabel}
         longLabel {longLabel}
         bigDataUrl {bigDataUrl}
         type bigBed 12 +
         noScoreFilter on
@@ -478,66 +478,77 @@
         if sdef not in done:
             defs.append(sdef)
             done.add(sdef)
     return " \\\n".join(defs)
 
 
 def getTrackName(clsMeta, dtype):
     # post_ccap_cpool_pb_reads
     return (clsMeta.stage + '_' + clsMeta.tissue + '_' + platform_desc_map[clsMeta.platform] + '_' +
             shortCapture(clsMeta).lower() + '_' + dtype).lower()
 
 def getShortLabel(clsMeta, dtype):
     return clsMetaToDesc(clsMeta, short=True) + " " + dtype
 
 def getLongLabel(clsMeta, dtype):
+    if dtype == "models":
+        dtype = "transcript models"
     return clsMetaToDesc(clsMeta) + " " + dtype
 
 def getType(clsMeta, dtype):
     return (clsMeta.capture.replace('-', '_').lower() + '_' + platform_desc_map[clsMeta.platform].lower() +
             '_' + dtype)
 
-
 def write_expr_data_trackdb(fh, clsMeta, dtype, bigDataUrl, template):
     fh.write(template.format(track=getTrackName(clsMeta, dtype),
                              sample=sampleGrpName(clsMeta),
+                             stage=stageTissueName(clsMeta),
                              shortLabel=getShortLabel(clsMeta, dtype),
                              longLabel=getLongLabel(clsMeta, dtype),
                              type=getType(clsMeta, dtype),
                              bigDataUrl=bigDataUrl))
 
-def write_sample_model_trackdb(fh, stage_tissue, sample, bigDataUrl):
-    fh.write(SAMPLE_MODELS_TDB.format(sample=sample,
+def write_sample_model_trackdb(fh, clsMetaST, bigDataUrl):
+    "unique stage/tissue clsMeta"
+    fh.write(SAMPLE_MODELS_TDB.format(sample=sampleGrpName(clsMetaST),
+                                      shortLabel=clsMetaToSampleDesc(clsMetaST, short=True) + " models",
+                                      longLabel=clsMetaToSampleDesc(clsMetaST, short=False) + " transcript models",
                                       bigDataUrl=bigDataUrl))
 
-def build_stage_tissue_samples_list(clsMetas):
-    return set((stageTissueName(clsMeta), sampleGrpName(clsMeta))
-               for clsMeta in clsMetas)
-
+def filter_stage_tissue_samples(clsMetas):
+    # only returns clsMetas on per stage/tissue
+    clsMetaSubset = []
+    done = set()
+    for clsMeta in clsMetas:
+        stageTissue = (stageTissueName(clsMeta), sampleGrpName(clsMeta))
+        if stageTissue not in done:
+            clsMetaSubset.append(clsMeta)
+            done.add(stageTissue)
+    return clsMetaSubset
 
 def writeTrackDb(fh, clsMetas, trackDir, parent):
     parentSpec = '' if parent is None else f'parent {parent}\n'
 
     fh.write(COMPOSITE_TDB.format(sampleSubgroups=buildSampleSubGroupDefs(clsMetas),
                                   parent=parentSpec))
     fh.write(TARGETS_TDB.format(bigDataUrl=osp.join(trackDir, "cls-targets.bb")))
     fh.write(MODELS_TDB.format(bigDataUrl=osp.join(trackDir, "cls-models.bb")))
 
     fh.write(SAMPLE_MODELS_VIEW_TDB)
-    for stage_tissue, sample in build_stage_tissue_samples_list(clsMetas):
-        write_sample_model_trackdb(fh, stage_tissue, sample,
-                                   osp.join(trackDir, stageTissueToBigBedPath(stage_tissue)))
+    for clsMeta in filter_stage_tissue_samples(clsMetas):
+        write_sample_model_trackdb(fh, clsMeta,
+                                   osp.join(trackDir, stageTissueToBigBedPath(stageTissueName(clsMeta))))
 
     fh.write(EXPR_MODELS_VIEW_TDB)
     for clsMeta in clsMetas:
         write_expr_data_trackdb(fh, clsMeta, 'models',
                                 osp.join(trackDir, sampleIdToBigBedPath(clsMeta)),
                                 EXPR_MODELS_TDB)
 
     fh.write(EXPR_READS_VIEW_TDB)
     for clsMeta in clsMetas:
         write_expr_data_trackdb(fh, clsMeta, 'reads',
                                 osp.join(trackDir, sampleIdToBamPath(clsMeta)),
                                 EXPR_READS_TDB)
 
 def metaSortKey(clsMeta):
     return (clsMeta.tissue, clsMeta.stage, clsMeta.sid)