Skip to content

Commit

Permalink
Merge pull request eclipse-chemclipse#1967 from lorenzgerber/pca_scor…
Browse files Browse the repository at this point in the history
…e_closest_distance

PCA, score plot, fix closest distance calculation
  • Loading branch information
eselmeister authored Nov 22, 2024
2 parents 3123d79 + 6081cf7 commit 14ef27e
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public class ExtendedLoadingsPlot extends Composite implements IExtendedPartUI {
//
private Composite control;
//
private boolean dblClicked = false;
private boolean doubleClicked = false;

public ExtendedLoadingsPlot(Composite parent, int style) {

Expand Down Expand Up @@ -340,9 +340,9 @@ public void handleEvent(BaseChart baseChart, Event event) {
int pcY = principalComponentUI.getPCY();
IResultsPCA<? extends IResultPCA, ? extends IVariable> resultsPCA = evaluationPCA.getResults();
List<FeatureDelta> featureDeltas = new ArrayList<>();
//
// Here need to prepare a result object with loading vectors per variable
//
/*
* Prepare a result object with loading vectors per variable
*/
for(int i = 0; i < resultsPCA.getExtractedVariables().size(); i++) {
double[] variableLoading = getVariableLoading(resultsPCA, i);
IPoint pointResult = getPoint(variableLoading, pcX, pcY, i);
Expand Down Expand Up @@ -371,7 +371,7 @@ public void handleEvent(BaseChart baseChart, Event event) {
List<Feature> featureList = new ArrayList<>();
featureList.add(featureDelta.getFeature());
UpdateNotifierUI.update(event.display, IChemClipseEvents.TOPIC_PCA_UPDATE_HIGHLIGHT_VARIABLE, featureList.toArray());
dblClicked = true;
doubleClicked = true;
}
}
}
Expand Down Expand Up @@ -465,11 +465,11 @@ private void applySettings() {
Range rangeY = baseChart.getAxisSet().getYAxis(BaseChart.ID_PRIMARY_Y_AXIS).getRange();
updatePlot(pcX, pcY);
/*
* Prevent Zoom reset on DblClick
* Prevent Zoom reset on Double Click
*/
if(dblClicked){
plotControl.get().updateRange(rangeX, rangeY);
}
if(doubleClicked) {
plotControl.get().updateRange(rangeX, rangeY);
}
}

private void updateWidgets() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,10 +328,10 @@ public void handleEvent(BaseChart baseChart, Event event) {
* Determine the x|y coordinates.
*/
Rectangle rectangle = baseChart.getPlotArea().getBounds();
int x = event.x;
int y = event.y;
int width = rectangle.width;
int height = rectangle.height;
double x = event.x;
double y = event.y;
double width = rectangle.width;
double height = rectangle.height;
/*
* Calculate the selected point.
*/
Expand All @@ -348,19 +348,32 @@ public void handleEvent(BaseChart baseChart, Event event) {
IResultsPCA<? extends IResultPCA, ? extends IVariable> resultsPCA = evaluationPCA.getResults();
List<? extends IResultPCA> resultList = resultsPCA.getPcaResultList();
List<ResultDelta> resultDeltas = new ArrayList<>();
//
for(int i = 0; i < resultList.size(); i++) {
IResultPCA pcaResult = resultList.get(i);
IPoint pointResult = getPoint(pcaResult, pcX, pcY, i);
double deltaX = Math.abs(pointResult.getX() - pX);
double deltaY = Math.abs(pointResult.getY() - pY);
resultDeltas.add(new ResultDelta(pcaResult, deltaX, deltaY));
/*
* prepare result object with score vectors per variable
*/
for(int i = 0; i < resultsPCA.getPcaResultList().size(); i++) {
IPoint pointResult = getPoint(resultList.get(i), pcX, pcY, i);
if(pointResult.getX() > rangeX.lower && pointResult.getX() < rangeX.upper && pointResult.getY() > rangeY.lower && pointResult.getY() < rangeY.upper) {
double deltaX = 0;
double deltaY = 0;
if(rangeX.upper < 0 || rangeX.lower > 0) {
deltaX = Math.abs(1.00 / Math.abs((Math.abs(rangeX.upper) - Math.abs(rangeX.lower))) * (pointResult.getX() - rangeX.lower) * width - x);
} else {
deltaX = Math.abs(1.00 / (rangeX.upper - rangeX.lower) * (pointResult.getX() - rangeX.lower) * width - x);
}
if(rangeY.upper < 0 || rangeY.lower > 0) {
deltaY = Math.abs(1.00 / Math.abs((Math.abs(rangeY.upper) - Math.abs(rangeY.lower))) * (pointResult.getY() - rangeY.lower) * height - (height - y));
} else {
deltaY = Math.abs(1.00 / (rangeY.upper - rangeY.lower) * (pointResult.getY() - rangeY.lower) * height - (height - y));
}
resultDeltas.add(new ResultDelta(resultList.get(i), deltaX, deltaY));
}
}
/*
* Get the closest result.
*/
if(!resultDeltas.isEmpty()) {
Collections.sort(resultDeltas, Comparator.comparing(ResultDelta::getDeltaX).thenComparing(ResultDelta::getDeltaY));
Collections.sort(resultDeltas, Comparator.comparing(ResultDelta::getDistance));
ResultDelta resultDelta = resultDeltas.get(0);
List<ISample> highlightedSamples = new ArrayList<>();
highlightedSamples.add(resultDelta.getResultPCA().getSample());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,4 @@ public String toString() {

return "FeatureDelta [featurePCA=" + feature + ", deltaX=" + deltaX + ", deltaY=" + deltaY + ", distance=" + distance + "]";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
*
* Contributors:
* Philip Wenig - initial API and implementation
* Lorenz Gerber - add distance
*******************************************************************************/
package org.eclipse.chemclipse.xxd.process.supplier.pca.model;

Expand All @@ -18,12 +19,14 @@ public class ResultDelta {
private IResultPCA resultPCA = null;
private double deltaX = 0;
private double deltaY = 0;
private double distance = 0;

public ResultDelta(IResultPCA resultPCA, double deltaX, double deltaY) {

this.resultPCA = resultPCA;
this.deltaX = deltaX;
this.deltaY = deltaY;
this.distance = Math.sqrt(Math.pow(this.deltaX, 2) + Math.pow(this.deltaY, 2));
}

public IResultPCA getResultPCA() {
Expand All @@ -41,6 +44,11 @@ public double getDeltaY() {
return deltaY;
}

public double getDistance() {

return distance;
}

@Override
public int hashCode() {

Expand All @@ -63,6 +71,6 @@ public boolean equals(Object obj) {
@Override
public String toString() {

return "ResultDelta [resultPCA=" + resultPCA + ", deltaX=" + deltaX + ", deltaY=" + deltaY + "]";
return "ResultDelta [resultPCA=" + resultPCA + ", deltaX=" + deltaX + ", deltaY=" + deltaY + ", distance=" + distance + "]";
}
}

0 comments on commit 14ef27e

Please sign in to comment.