Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Track panel refactor #1673

Merged
merged 2 commits into from
Mar 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,18 @@ public static File downloadGenome(GenomeConfig c, boolean downloadSequence, bool

// Create a directory for the data files (sequence and annotations)
final File genomeDirectory = DirectoryManager.getGenomeCacheDirectory();
File dataDirectory = new File(genomeDirectory, config.getId());
if (dataDirectory.exists()) {
if (!dataDirectory.isDirectory()) {
throw new RuntimeException("Error downloading genome. " + dataDirectory.getAbsolutePath() + " exists and is not a directory.");
}
} else {
if (!dataDirectory.mkdir()) {
throw new RuntimeException("Error downloading genome. Could not create directory: " + dataDirectory.getAbsolutePath());
File dataDirectory = null;

if(downloadSequence || downloadAnnotations) {
dataDirectory = new File(genomeDirectory, config.getId());
if (dataDirectory.exists()) {
if (!dataDirectory.isDirectory()) {
throw new RuntimeException("Error downloading genome. " + dataDirectory.getAbsolutePath() + " exists and is not a directory.");
}
} else {
if (!dataDirectory.mkdir()) {
throw new RuntimeException("Error downloading genome. Could not create directory: " + dataDirectory.getAbsolutePath());
}
}
}

Expand Down
8 changes: 3 additions & 5 deletions src/main/java/org/broad/igv/feature/genome/GenomeManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,6 @@
import java.util.List;
import java.util.stream.Stream;

import static org.broad.igv.prefs.Constants.SHOW_SINGLE_TRACK_PANE_KEY;

/**
* @author jrobinso
*/
Expand Down Expand Up @@ -241,19 +239,19 @@ public void restoreGenomeTracks(Genome genome) {
// Fetch the gene track, defined by .genome files. In this format the genome data is encoded in the .genome file
FeatureTrack geneFeatureTrack = genome.getGeneTrack(); // Can be null
if (geneFeatureTrack != null) {
PanelName panelName = PreferencesManager.getPreferences().getAsBoolean(SHOW_SINGLE_TRACK_PANE_KEY) ?
PanelName.DATA_PANEL : PanelName.FEATURE_PANEL;
geneFeatureTrack.setAttributeValue(Globals.TRACK_NAME_ATTRIBUTE, geneFeatureTrack.getName());
geneFeatureTrack.setAttributeValue(Globals.TRACK_DATA_FILE_ATTRIBUTE, "");
geneFeatureTrack.setAttributeValue(Globals.TRACK_DATA_TYPE_ATTRIBUTE, geneFeatureTrack.getTrackType().toString());
IGV.getInstance().addTracks(Arrays.asList(geneFeatureTrack), panelName);
geneFeatureTrack.getResourceLocator().setPanelName(PanelName.ANNOTATION_PANEL.getName());
IGV.getInstance().addTracks(Arrays.asList(geneFeatureTrack));
}

List<ResourceLocator> resources = genome.getAnnotationResources();
List<Track> annotationTracks = new ArrayList<>();
if (resources != null) {
for (ResourceLocator locator : resources) {
try {
locator.setPanelName(PanelName.ANNOTATION_PANEL.getName());
List<Track> tracks = IGV.getInstance().load(locator);
annotationTracks.addAll(tracks);
} catch (DataLoadException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -239,9 +239,8 @@ public void setBlatDB(String blatDB) {
}

public String getUcsdID() {
return ucsdID;
return ucsdID == null ? id : ucsdID;
}

public void setUcsdID(String ucsdID) {
this.ucsdID = ucsdID;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.stream.Collectors;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,7 @@ public void loadSession(InputStream inputStream, Session session, String session
locator.setTrackLine(trackLine);
// Alignment tracks must be loaded synchronously
if (isAlignmentFile(locator.getPath())) {
TrackPanel panel = igv.getPanelFor(locator);
if (panel == null) {
panel = igv.getTrackPanel(DATA_PANEL_NAME);
}
panel.addTracks(igv.load(locator));
igv.addTracks(igv.load(locator));
} else {
aSync.add(locator);
}
Expand Down Expand Up @@ -233,8 +229,7 @@ private ResourceLocator parseResourceLine(String line) {
String[] tokens = line.split("\\s+");
if (tokens.length == 1) {
locator = new ResourceLocator(tokens[0]);
}
else if (tokens.length >= 2) {
} else if (tokens.length >= 2) {
// Might want to do some error checking here on
// making sure file prefixes match and file extensions
// indicate the index comes second.
Expand Down
6 changes: 1 addition & 5 deletions src/main/java/org/broad/igv/session/UCSCSessionReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,7 @@ public void loadSession(InputStream inputStream, Session session, String session
locator.setTrackLine(trackLine);
// Alignment tracks must be loaded synchronously
if (isAlignmentFile(locator.getPath())) {
TrackPanel panel = igv.getPanelFor(locator);
if (panel == null) {
panel = igv.getTrackPanel(DATA_PANEL_NAME);
}
panel.addTracks(igv.load(locator));
igv.addTracks(igv.load(locator));
} else {
aSync.add(locator);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ static void handleDialogResult(MotifFinderDialog dialog) {
*/
static List<Track> addTracksForPatterns(String[] pattern, String[] posTrackNames, String[] negTrackNames) {
List<Track> trackList = generateTracksForPatterns(pattern, posTrackNames, negTrackNames);
IGV.getInstance().addTracks(trackList, PanelName.FEATURE_PANEL);
IGV.getInstance().addTracks(trackList);
return trackList;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ private void okButtonActionPerformed(ActionEvent e) {
TrackMenuUtils.changeRendererClass(Arrays.asList(newTrack), track0.getRenderer().getClass());
newTrack.setDataRange(track0.getDataRange());
newTrack.setColorScale(track0.getColorScale());
IGV.getInstance().addTracks(Arrays.asList(newTrack), PanelName.DATA_PANEL);

IGV.getInstance().addTracks(Arrays.asList(newTrack));
this.setVisible(false);

}
Expand Down
24 changes: 13 additions & 11 deletions src/main/java/org/broad/igv/ucsc/hub/CollapsiblePanel.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,18 +27,18 @@ public class CollapsiblePanel extends JPanel {
private final JLabel jlabel;
private final List<SelectionBox> selectionBoxes;
private final boolean autoselectDefaults;
private final TrackConfigContainer configGroup;
private final TrackConfigContainer configContainer;
private JButton collapseButton;
private JComponent content;
private JPanel header;
private ImageIcon openIcon;
private ImageIcon closeIcon;

public CollapsiblePanel(TrackConfigContainer configGroup, boolean autoselectDefaults) {
public CollapsiblePanel(TrackConfigContainer configContainer, boolean autoselectDefaults) {

Color backgroundColor = HEADER_BG;

this.configGroup = configGroup;
this.configContainer = configContainer;
this.autoselectDefaults = autoselectDefaults;

setLayout(new BorderLayout());
Expand All @@ -47,10 +47,10 @@ public CollapsiblePanel(TrackConfigContainer configGroup, boolean autoselectDefa
trackPanel.setLayout(new BoxLayout(trackPanel, BoxLayout.Y_AXIS));

// There is a (so far) intractable bug if a large # of JCheckboxes are created for this widget.
int totalTrackCount = configGroup.countTracks();
int totalTrackCount = configContainer.countTracks();
SelectionBox.CheckboxType checkboxType = totalTrackCount < 1000 ? SelectionBox.CheckboxType.SWING : SelectionBox.CheckboxType.CUSTOM;

selectionBoxes = addSelectionBoxes(null, configGroup, trackPanel, checkboxType);
selectionBoxes = addSelectionBoxes(null, configContainer, trackPanel, checkboxType);

boolean isSelected = false;
int maxWidth = 0;
Expand All @@ -68,9 +68,9 @@ public CollapsiblePanel(TrackConfigContainer configGroup, boolean autoselectDefa
selectionBox.setPreferredWidth(maxWidth);
}

String label = configGroup.label + " (" + selectionBoxes.size() + " tracks, " + selectionCount + " selected)";
String label = configContainer.label + " (" + selectionBoxes.size() + " tracks, " + selectionCount + " selected)";

boolean isOpen = isSelected || configGroup.defaultOpen;
boolean isOpen = isSelected || configContainer.defaultOpen;

this.content = trackPanel;
this.openIcon = IconFactory.getInstance().getIcon(IconFactory.IconID.MINUS);
Expand Down Expand Up @@ -102,7 +102,7 @@ public CollapsiblePanel(TrackConfigContainer configGroup, boolean autoselectDefa

this.add(header, BorderLayout.NORTH);

final JButton searchButton = createSearchButton("Search " + configGroup.label, selectionBoxes,
final JButton searchButton = createSearchButton("Search " + configContainer.label, selectionBoxes,
(selectedCount) -> {
this.updateLabel();
return null;
Expand All @@ -121,7 +121,9 @@ public CollapsiblePanel(TrackConfigContainer configGroup, boolean autoselectDefa
public void resetSelectionBoxes(Set<String> loadedTrackPaths) {
for (CollapsiblePanel.SelectionBox box : selectionBoxes) {
final boolean isLoaded = loadedTrackPaths != null && loadedTrackPaths.contains(box.trackConfig.getUrl());
box.setSelected(isLoaded || (autoselectDefaults && box.trackConfig.getVisible() == true));
box.setSelected(
isLoaded ||
(autoselectDefaults && box.trackConfig.getVisible() == true) && configContainer.name.toLowerCase().equals("genes"));
box.setEnabled(!isLoaded);
updateLabel();
}
Expand All @@ -134,7 +136,7 @@ public void updateLabel() {
count++;
}
}
String label = configGroup.label + " (" + selectionBoxes.size() + " tracks, " + count + " selected)";
String label = configContainer.label + " (" + selectionBoxes.size() + " tracks, " + count + " selected)";
jlabel.setText(label);
}

Expand All @@ -144,7 +146,7 @@ public void clearSelections() {
box.setSelected(false);
}
}
String label = configGroup.label + " (" + selectionBoxes.size() + " tracks, 0 selected)";
String label = configContainer.label + " (" + selectionBoxes.size() + " tracks, 0 selected)";
jlabel.setText(label);
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/broad/igv/ucsc/hub/Stanza.java
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ boolean hasProperty(String key) {
return getProperty(key) != null;
}

String format() {
String type() {
String type = this.getOwnProperty("type");
if (type != null) {
// Trim extra bed qualifiers (e.g. bigBed + 4)
Expand Down
21 changes: 11 additions & 10 deletions src/main/java/org/broad/igv/ucsc/hub/TrackDbHub.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class TrackDbHub {


static Set supportedTypes = new HashSet(Arrays.asList("bigbed", "bigwig", "biggenepred", "vcftabix", "refgene",
"bam", "sampleinfo", "vcf.list", "ucscsnp", "bed", "tdf", "gff", "gff3", "gtf"));
"bam", "sampleinfo", "vcf.list", "ucscsnp", "bed", "tdf", "gff", "gff3", "gtf", "vcf"));

static Set filterTracks = new HashSet(Arrays.asList("cytoBandIdeo", "assembly", "gap", "gapOverlap", "allGaps",
"cpgIslandExtUnmasked", "windowMasker"));
Expand All @@ -24,11 +24,15 @@ public class TrackDbHub {
"squish", "SQUISHED",
"dense", "COLLAPSED");

static Map<String, String> typeFormatMap = Map.of(
"vcftabix", "vcf"
);


List<Stanza> trackStanzas;
List<Stanza> groupStanzas;
List<TrackConfigContainer> groupTrackConfigs;


public TrackDbHub(List<Stanza> trackStanzas, List<Stanza> groupStanzas) {
this.groupStanzas = groupStanzas;
this.trackStanzas = trackStanzas;
Expand Down Expand Up @@ -100,7 +104,7 @@ public List<TrackConfigContainer> getGroupedTrackConfigurations(String hubName)

} else if (!filterTracks.contains(s.name) &&
s.hasProperty("bigDataUrl") &&
supportedTypes.contains(s.format().toLowerCase())) {
supportedTypes.contains(s.type().toLowerCase())) {

final TrackConfig trackConfig = getTrackConfig(s);
if (parent != null) {
Expand All @@ -123,19 +127,17 @@ public List<TrackConfigContainer> getGroupedTrackConfigurations(String hubName)
return groupTrackConfigs;
}


private TrackConfig getTrackConfig(Stanza t) {

String url = t.getProperty("bigDataUrl");
TrackConfig config = new TrackConfig(url);

String format = t.format();
if (format != null) {
String type = t.type();
if (type != null) {
String format = typeFormatMap.containsKey(type) ? typeFormatMap.get(type) : type;
config.setFormat(format.toLowerCase());
}

config.setPanelName(IGV.DATA_PANEL_NAME);

config.setId(t.getProperty("track"));
config.setName(t.getProperty("shortLabel"));

Expand All @@ -154,7 +156,7 @@ private TrackConfig getTrackConfig(Stanza t) {

if (t.hasProperty("bigDataIndex")) {
config.setIndexURL(t.getProperty("bigDataIndex"));
} else if (t.format().equals("vcfTabix")) {
} else if (t.type().equals("vcfTabix")) {
config.setIndexURL(t.getProperty("bigDataUrl") + ".tbi");
}

Expand All @@ -181,7 +183,6 @@ private TrackConfig getTrackConfig(Stanza t) {
config.setVisibilityWindow(vizWindow);
}


if (t.hasProperty("autoScale")) {
config.setAutoscale(t.getProperty("autoScale").toLowerCase().equals("on"));
}
Expand Down
Loading
Loading