Skip to content

Commit

Permalink
Add dialog to select tracks from hub
Browse files Browse the repository at this point in the history
  • Loading branch information
jrobinso committed Dec 2, 2023
1 parent 2e1977a commit 68efeed
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 21 deletions.
1 change: 1 addition & 0 deletions src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
exports org.broad.igv.feature.genome.load to com.google.gson;
opens org.broad.igv.feature.genome.load to com.google.gson;
opens org.broad.igv.feature to com.google.gson;
exports org.broad.igv.ucsc;

requires com.google.common;
requires commons.math3;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package org.broad.igv.feature.genome.load;

import org.broad.igv.Globals;
import org.broad.igv.feature.genome.Genome;
import org.broad.igv.prefs.PreferencesManager;
import org.broad.igv.ucsc.Hub;
import org.broad.igv.ucsc.TrackConfigGroup;
import org.broad.igv.ui.IGV;
import org.broad.igv.ui.TrackSelectionDialog;
import org.broad.igv.ucsc.TrackSelectionDialog;

import java.io.IOException;
import java.util.Comparator;
import java.util.List;
import java.util.*;

public class HubGenomeLoader extends GenomeLoader {

Expand All @@ -24,15 +26,15 @@ public static boolean isHubURL(String obj) {
public static String convertToHubURL(String accension) {
//https://hgdownload.soe.ucsc.edu/hubs/GCF/016/808/095/GCF_016808095.1/
//https://hgdownload.soe.ucsc.edu/hubs/GCA/028/534/965/GCA_028534965.1/
if(accension.startsWith("GCF") || accension.startsWith("GCA") && accension.length() >= 13) {
String prefix = accension.substring(0, 3);
String n1 = accension.substring(4, 7);
String n2 = accension.substring(7, 10);
String n3 = accension.substring(10, 13);
return "https://hgdownload.soe.ucsc.edu/hubs/" + prefix + "/" + n1 + "/" + n2 + "/" + n3 + "/" + accension + "/hub.txt";
} else {
return null;
}
if (accension.startsWith("GCF") || accension.startsWith("GCA") && accension.length() >= 13) {
String prefix = accension.substring(0, 3);
String n1 = accension.substring(4, 7);
String n2 = accension.substring(7, 10);
String n3 = accension.substring(10, 13);
return "https://hgdownload.soe.ucsc.edu/hubs/" + prefix + "/" + n1 + "/" + n2 + "/" + n3 + "/" + accension + "/hub.txt";
} else {
return null;
}
}

@Override
Expand All @@ -42,13 +44,36 @@ public Genome loadGenome() throws IOException {

GenomeConfig config = hub.getGenomeConfig(null);

// Select tracks
if(IGV.hasInstance()) {
// Potentially override default tracks from hub with user selections

// Check previous selections for this hub first
String key = "hub:" + this.hubURL;
if (PreferencesManager.getPreferences().hasExplicitValue(key)) {
List<TrackConfig> selectedTracks = new ArrayList<>();
Set<String> selectedTrackNames = new HashSet<>(Arrays.asList(PreferencesManager.getPreferences().get(key).split(",")));
List<TrackConfigGroup> trackConfigGroups = hub.getGroupedTrackConfigurations();
for (TrackConfigGroup group : trackConfigGroups) {
for (TrackConfig trackConfig : group.tracks) {
if (selectedTrackNames.contains(trackConfig.name)) {
selectedTracks.add(trackConfig);
}
}
}
selectedTracks.sort((o1, o2) -> o1.order - o2.order);
config.tracks = selectedTracks;
}

// If running in interactive mode opend dialog to set tracks.
else if (IGV.hasInstance() && !Globals.isBatch() && !Globals.isHeadless() && !Globals.isTesting()) {
TrackSelectionDialog dlg = new TrackSelectionDialog(hub.getGroupedTrackConfigurations(), IGV.getInstance().getMainFrame());
dlg.setVisible(true);
List<TrackConfig> selectedTracks = dlg.getSelectedConfigs();
selectedTracks.sort((o1, o2) -> o1.order - o2.order);
config.tracks = selectedTracks;

// Remember selections in user preferences
List<String> names = selectedTracks.stream().map((trackConfig) -> trackConfig.name).toList();
PreferencesManager.getPreferences().put(key, String.join(",", names));
}

return new Genome(config);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
package org.broad.igv.ui;
package org.broad.igv.ucsc;

import com.jidesoft.swing.FontUtils;
import org.broad.igv.feature.genome.load.TrackConfig;
import org.broad.igv.ucsc.Hub;
import org.broad.igv.ucsc.TrackConfigGroup;
import org.broad.igv.ui.FontManager;
import org.broad.igv.ui.util.HyperlinkFactory;

import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.*;
import java.util.List;

/**
* Dialog to enable selection of track hub tracks prior to loading. Might be generalized to other use cases, but
* for now focused on track hubs.
*
*/
public class TrackSelectionDialog extends JDialog {


Map<JCheckBox, TrackConfig> configMap;

public TrackSelectionDialog(List<TrackConfigGroup> groupedTrackConfigurations, Frame owner) {
Expand All @@ -35,6 +37,7 @@ void init(List<TrackConfigGroup> trackConfigurations) {
configMap = new HashMap<>();

JLabel headerMessage = new JLabel("Select tracks to load");
headerMessage.setFont(FontManager.getFont(Font.BOLD, 14));
headerMessage.setHorizontalAlignment(SwingConstants.CENTER);
headerMessage.setPreferredSize(new Dimension(300, 50));
// add(headerMessage, BorderLayout.NORTH);
Expand Down Expand Up @@ -113,8 +116,12 @@ JPanel categoryPanel(TrackConfigGroup configGroup) {
public List<TrackConfig> getSelectedConfigs() {
List<TrackConfig> selected = new ArrayList<>();
for(Map.Entry<JCheckBox, TrackConfig> entry : configMap.entrySet()) {
final TrackConfig trackConfig = entry.getValue();
if(entry.getKey().isSelected()) {
selected.add(entry.getValue());
trackConfig.visible = true;
selected.add(trackConfig);
} else {
trackConfig.visible = false;
}
}
return selected;
Expand Down

0 comments on commit 68efeed

Please sign in to comment.