Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
e955bcc
CyberVector, CyberReport serializers. CyberReportFile drag and drop s…
Birdasaur Sep 9, 2025
573cb26
FeatureVectorEventHandler now supports CyberReport/CyberVector proces…
Birdasaur Sep 9, 2025
80b4be1
New PDF and CDF computation engine
Birdasaur Sep 10, 2025
0491b86
first cut nat PdfCdf chart.
Birdasaur Sep 10, 2025
2424e9f
End to end first cut for sending feature vectors to PDF/CDF chart
Birdasaur Sep 10, 2025
06a3d8c
StatisticEngine and chart/panel classes fixed to support L1Norm, Linf…
Birdasaur Sep 11, 2025
d6e98d4
Dimension based computations for PDF and CDF
Birdasaur Sep 11, 2025
1d69e17
First cut support for 3D Joint PDF/CDF using Hypersurface
Birdasaur Sep 11, 2025
a103e0d
SurfaceUtils providing Interpolation and Smoothing algorithms for Hyp…
Birdasaur Sep 13, 2025
435a1e4
CyberReport processing updated to match new dynamic formatting.
Birdasaur Sep 13, 2025
a562a66
Stubbed new FeatureVectorManager GUI.
Birdasaur Sep 14, 2025
5fc76bb
First cut at FeatureVectorManager service and GUI. Observer only
Birdasaur Sep 14, 2025
9c74f54
Fixes so that FeatureVectorManagerView can properly manage and switch…
Birdasaur Sep 15, 2025
3a3221c
applyActiveToWorkspace now connected for Hyperspace
Birdasaur Sep 15, 2025
a650385
Append and Replace support for both collections and rows of vectors
Birdasaur Sep 15, 2025
0c35c47
Fixed label config dimensionLabels now update Dimensionality ListView
Birdasaur Sep 15, 2025
e2cd94d
Refactored reusable static methods into new FeatureVectorUtils helper…
Birdasaur Sep 15, 2025
60a858a
Search and Filter capability for FeatureVectorManager
Birdasaur Sep 16, 2025
5154719
FeatureVectorManager GUI support now allows for popping out to second…
Birdasaur Sep 16, 2025
c9b6e77
Created new HypersurfaceControlsPane. Not wired in.
Birdasaur Sep 16, 2025
39c5824
First cut at new Pairwise Joint PDF Pane. Sorta works.
Birdasaur Sep 17, 2025
574cd7a
all embedded Hypersurface GUI controls now moved to dedicated floatin…
Birdasaur Sep 17, 2025
1e41fd0
added sync event handling for the HypersurfaceControlsPane
Birdasaur Sep 17, 2025
3965d65
Tweaks to layout to make it more compact
Birdasaur Sep 18, 2025
2aab4fb
tilePane for pairwise JPDF thumbnails no longer blows out size of par…
Birdasaur Sep 18, 2025
14e8cde
setup for second screen popout for PairwiseJpdfPane
Birdasaur Sep 19, 2025
5f05e4e
Migrated PairwiseJpdfPane child Nodes into reusable component to supp…
Birdasaur Sep 19, 2025
53545a4
Fixed PairwiseJpdfPane to reuse PairwiseJpdfView component.
Birdasaur Sep 21, 2025
ea205a2
View and Pane updated to support streaming output
Birdasaur Sep 21, 2025
6f3989c
Refactored PairwiseJpdfView so that controls and content are in split…
Birdasaur Sep 21, 2025
ed06ee5
Rearranged gui layout to minimize total horizontal space usage
Birdasaur Sep 23, 2025
9538d88
added menu-button styles
Birdasaur Sep 24, 2025
03034a8
First cut at base components for Pairwise Matrix support. Not wired i…
Birdasaur Sep 26, 2025
55a71d4
New classes to support Pairwise Matrix computations
Birdasaur Sep 26, 2025
e6d33f3
Divergence Matrix upgrades with Synthetic and Labelwise cohort genera…
Birdasaur Sep 28, 2025
bc9ec19
Updates to fix UI usability with collapsible controls and labeling
Birdasaur Sep 29, 2025
d857640
First cut 3D graph derived from Similarity and Divergence Matrices.
Birdasaur Sep 29, 2025
de339f6
fixes to have JPDF from matrix cell clicks
Birdasaur Sep 30, 2025
f4158d7
mvp 3D graph support from Similarity Matrix with GUI controls. Not su…
Birdasaur Sep 30, 2025
84aee4a
Graph style can now be controlled via GUI.
Birdasaur Oct 1, 2025
3774e15
SyntheticDataDialog not fills in Cohort info.
Birdasaur Oct 4, 2025
6fe4b24
small tweaks to adjust to new CyberReport format to ensure proper ing…
Birdasaur Oct 6, 2025
23d8efa
Upgrades to appearance management for Joint PDF thumbnail grid.
Birdasaur Oct 6, 2025
75139f1
Statistics pane now supports popout.
Birdasaur Oct 7, 2025
177f284
fixed submenu system to be streamlined without causing exceptions.
Birdasaur Oct 8, 2025
10120cf
Proper Time Series modes for Stats panel
Birdasaur Oct 9, 2025
2677a56
Fixes to allow "Set All" to active workspace effect for any and all F…
Birdasaur Oct 11, 2025
1b1b005
Fast switching between component index. Fixes to options menu.
Birdasaur Oct 12, 2025
984ed08
New ExportMicroToolbar for LitPathPane.
Birdasaur Oct 13, 2025
a8f2438
chore: fmt / fix logging
samypr100 Oct 13, 2025
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
23 changes: 21 additions & 2 deletions src/main/java/edu/jhuapl/trinity/App.java
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@ public void start(Stage stage) throws IOException {
centerStack.getChildren().add(mediaView);
mediaView.fitWidthProperty().bind(centerStack.widthProperty().subtract(10));
mediaPlayer.play();
mediaView.setOnMouseClicked(e-> {
mediaView.setOnMouseClicked(e -> {
mediaPlayer.setVolume(0.0); // Ensure final volume is zero
mediaPlayer.currentTimeProperty().removeListener(fadeListener);
mediaPlayer.currentTimeProperty().removeListener(fadeListener);
mediaPlayer.stop();
centerStack.getChildren().remove(mediaView);
});
Expand Down Expand Up @@ -155,6 +155,8 @@ public void start(Stage stage) throws IOException {
scene.getStylesheets().add(CSS);
CSS = StyleResourceProvider.getResource("covalent.css").toExternalForm();
scene.getStylesheets().add(CSS);
CSS = StyleResourceProvider.getResource("dialogstyles.css").toExternalForm();
scene.getStylesheets().add(CSS);

//add just the dark necessities...
JukeBox jukeBox = new JukeBox(scene);
Expand Down Expand Up @@ -336,6 +338,23 @@ private void keyReleased(Stage stage, KeyEvent e) {
if (e.isAltDown() && e.isControlDown() && e.getCode().equals(KeyCode.Q)) {
shutdown(false);
}
//J cuz i'm running out of letters
if (e.isAltDown() && e.isControlDown() && e.getCode().equals(KeyCode.J)) {
stage.getScene().getRoot().fireEvent(new ApplicationEvent(e.isShiftDown()
? ApplicationEvent.POPOUT_STATISTICS_PANE : ApplicationEvent.SHOW_STATISTICS_PANE));
}
if (e.isAltDown() && e.isControlDown() && e.getCode().equals(KeyCode.F)) {
stage.getScene().getRoot().fireEvent(
new ApplicationEvent(ApplicationEvent.SHOW_FEATUREVECTOR_MANAGER));
}
if (e.isAltDown() && e.isControlDown() && e.getCode().equals(KeyCode.Y)) {
stage.getScene().getRoot().fireEvent(
new ApplicationEvent(ApplicationEvent.SHOW_PAIRWISEJPDF_PANE));
}
if (e.isAltDown() && e.isControlDown() && e.getCode().equals(KeyCode.U)) {
stage.getScene().getRoot().fireEvent(
new ApplicationEvent(ApplicationEvent.SHOW_PAIRWISEMATRIX_PANE));
}
if (e.isAltDown() && e.isControlDown() && e.getCode().equals(KeyCode.S)) {
stage.getScene().getRoot().fireEvent(
new ApplicationEvent(ApplicationEvent.SHOW_SPECIALEFFECTS_PANE));
Expand Down
219 changes: 180 additions & 39 deletions src/main/java/edu/jhuapl/trinity/AppAsyncManager.java

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package edu.jhuapl.trinity.data.files;

import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.jhuapl.trinity.data.messages.xai.CyberReport;
import edu.jhuapl.trinity.data.messages.xai.CyberReportIO;

import java.awt.datatransfer.DataFlavor;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;

/**
* @author Sean Phillips
*/
public class CyberReporterFile extends DroppableFile {
public List<CyberReport> cyberReports = null;

public CyberReporterFile(String pathname) {
super(pathname);
}

public CyberReporterFile(String pathname, Boolean parseExisting) throws IOException {
super(pathname);
if (parseExisting)
parseContent();
}

/**
* Tests whether a given File is this type of file or not
*
* @param file The File to be tested
* @return True if the file being tested is this type of file
* @throws java.io.IOException
*/
public static boolean isFileType(File file) throws IOException {
String extension = file.getName().substring(file.getName().lastIndexOf("."));
if (extension.equalsIgnoreCase(".json")) {
String body = Files.readString(file.toPath());
return CyberReport.isCyberReport(body);
}
return false;
}

@Override
public DataFlavor getDataFlavor() {
return new DataFlavor(CyberReporterFile.class, "CYBERREPORT");
}

@Override
public void parseContent() throws IOException {
/** Provides deserialization support for JSON messages */
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
String message = Files.readString(this.toPath());
// From a string:
cyberReports = CyberReportIO.readReports(message);
}

@Override
public void writeContent() throws IOException {
if (null != cyberReports) {
ObjectMapper mapper = new ObjectMapper();
//mapper.configure(SerializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.writeValue(this, cyberReports);
LOG.info("CyberReports serialized to file.");
}
}
}
83 changes: 83 additions & 0 deletions src/main/java/edu/jhuapl/trinity/data/files/DroppableFile.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package edu.jhuapl.trinity.data.files;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.File;
import java.io.IOException;

/**
*
* @author Sean Phillips
*/
public abstract class DroppableFile extends File implements Transferable {
public static final Logger LOG = LoggerFactory.getLogger(DroppableFile.class);

/**
* Constructor that extends File super constructor
*
* @param pathname Full path string to the file
*/
public DroppableFile(String pathname) {
super(pathname);
}

/**
* Constructor that allows for automatically parsing the content of the file
*
* @param pathname Full path string to the file
* @param parseExisting True to automatically parse the content of the file
* specified by pathname
* @throws java.io.IOException
*/
public DroppableFile(String pathname, Boolean parseExisting) throws IOException {
super(pathname);
if (parseExisting)
parseContent();
}

/**
* Parses the file specified via this object's constructor
* Assumes the file exists and is readable and conforms to expected format.
*
* @throws java.io.IOException
*/
public void parse() throws IOException {
parseContent();
}

public abstract DataFlavor getDataFlavor();

public abstract void parseContent() throws IOException;

/**
* Writes out the content of this File at the location
* specified via this object's constructor.
* Assumes the file exists.
*
* @throws java.io.IOException
*/
public abstract void writeContent() throws IOException;

@Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{getDataFlavor()};
}

@Override
public boolean isDataFlavorSupported(DataFlavor df) {
return df == getDataFlavor();
}

@Override
public Object getTransferData(DataFlavor df) throws UnsupportedFlavorException, IOException {
if (df == getDataFlavor()) {
return this;
} else {
throw new UnsupportedFlavorException(df);
}
}
}
Loading