Updates to click train detector

New GUI for click train classification - more intuitive and allows users to build more powerful classifiers.
CPOD data can now build average waveforms.
CPOD click trains can be viewed in TDisplayFX pop up menu displays
Fixed Peak Frequency symbol chooser so it saves the colour box settings
This commit is contained in:
Jamie Mac 2022-02-17 16:04:57 +00:00
parent 8ad62a59e9
commit b61a480ec4
9 changed files with 41 additions and 214 deletions

View File

@ -6,7 +6,7 @@
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/Java 17">
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-16">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>

View File

@ -81,7 +81,7 @@ public class IDIClassification implements CTClassification {
@Override
public String getSummaryString() {
return String.format("IDI Classifier: Mean IDI %.5fs Median IDI %.5fs Std IDI%.5fs",
return String.format("IDI Classifier: Mean IDI %.4f\u00B0/s Median IDI %.4f\u00B0/s Std IDI%.4f\u00B0/s",
meanIDI, medianIDI, stdIDI);
}

View File

@ -37,13 +37,7 @@ public class IDIClassifier implements CTClassifier {
//check IDI classification is passed
boolean passesIDI = checkIDIMeasurements(clickTrain);
int speciesID = CTClassifier.NOSPECIES;
if (passesIDI) {
speciesID = idiParams.speciesFlag;
}
return new IDIClassification( speciesID, clickTrain.getIDIInfo().medianIDI, clickTrain.getIDIInfo().meanIDI, clickTrain.getIDIInfo().stdIDI);
return null;
}
@Override

View File

@ -1,5 +1,6 @@
package clickTrainDetector.classification.standardClassifier;
import clickTrainDetector.ClickTrainControl;
import clickTrainDetector.classification.CTClassification;
import clickTrainDetector.classification.CTClassifierType;
import clickTrainDetector.classification.ClassifierJSONLogging;
@ -13,6 +14,12 @@ import clickTrainDetector.classification.bearingClassifier.BearingClassifierJSON
*/
public class StandardClassification implements CTClassification {
/**
* Reference to the click control.
*/
private ClickTrainControl clickTrainControl;
/**
* The current species ID.
*/
@ -24,9 +31,6 @@ public class StandardClassification implements CTClassification {
private CTClassification[] ctClassifications;
public CTClassification[] getCtClassifications() {
return ctClassifications;
}
/**
* Standard classifier JSON logging.
@ -34,10 +38,10 @@ public class StandardClassification implements CTClassification {
private StandardClassificationJSON standardClassifierJSONLogging;
public StandardClassification(CTClassification[] ctClassifications, int speciesID) {
public StandardClassification(ClickTrainControl clickTrainControl, CTClassification[] ctClassifications, int speciesID) {
this.clickTrainControl=clickTrainControl;
this.ctClassifications=ctClassifications;
standardClassifierJSONLogging = new StandardClassificationJSON(ctClassifications);
this.speciesID=speciesID;
standardClassifierJSONLogging = new StandardClassificationJSON();
}
@ -46,15 +50,9 @@ public class StandardClassification implements CTClassification {
* @param jsonstring
*/
public StandardClassification(String jsonstring) {
standardClassifierJSONLogging = new StandardClassificationJSON();
CTClassification classification = standardClassifierJSONLogging.createClassification(jsonstring);
this.ctClassifications = ((StandardClassification) classification).getCtClassifications();
this.speciesID =classification.getSpeciesID();
}
@Override
public CTClassifierType getClassifierType() {

View File

@ -1,111 +1,10 @@
package clickTrainDetector.classification.standardClassifier;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import clickTrainDetector.classification.CTClassification;
import clickTrainDetector.classification.SimpleClassifierJSONLogging;
import clickTrainDetector.classification.bearingClassifier.BearingClassification;
import clickTrainDetector.classification.bearingClassifier.BearingClassifier;
import clickTrainDetector.classification.idiClassifier.IDIClassification;
import clickTrainDetector.classification.idiClassifier.IDIClassifier;
import clickTrainDetector.classification.simplechi2classifier.Chi2CTClassification;
import clickTrainDetector.classification.simplechi2classifier.Chi2ThresholdClassifier;
import clickTrainDetector.classification.templateClassifier.CTTemplateClassifier;
import clickTrainDetector.classification.templateClassifier.TemplateClassification;
/**
* Standard classification JSON logging
*
* @author Jamie Macaulay
*
*/
public class StandardClassificationJSON extends SimpleClassifierJSONLogging {
private CTClassification[] standardClassifier;
/**
* Create the JSON logging for standard classifier.
* @param ctClassifications - the standard classifier.
*/
public StandardClassificationJSON(CTClassification[] ctClassifications) {
this.standardClassifier=ctClassifications;
}
public StandardClassificationJSON() {
}
@Override
public void writeJSONData(JsonGenerator jg, CTClassification ctClassification) {
for (int i=0; i<standardClassifier.length; i++) {
((SimpleClassifierJSONLogging) standardClassifier[i].getJSONLogging()).writeJSONData(jg, standardClassifier[i]);
}
}
@Override
public CTClassification createClassification(String jsonString) {
try {
ObjectMapper om = new ObjectMapper();
JsonNode jTree = om.readTree(new ByteArrayInputStream(jsonString.getBytes()));
// JsonNode nv = jTree.findValue("NAME");
JsonNode na = jTree.findValue("SPECIES");
int speciesID;
if (na != null ) {
speciesID = na.asInt();
}
else {
System.err.println("Cannot load standard classifier");
return null;
}
//System.out.println("Hello load classification: " + standardClassifier.length);
CTClassification[] ctClassification = new CTClassification[StandardClassifier.CLASSIFIER_TYPES.length];
for (int i=0; i<ctClassification.length; i++) {
CTClassification classification = null;
switch (StandardClassifier.CLASSIFIER_TYPES[i]) {
case CHI2THRESHOLD:
classification = new Chi2CTClassification(jsonString);
break;
case IDICLASSIFIER:
classification = new IDIClassification(jsonString);
break;
case TEMPLATECLASSIFIER:
classification = new TemplateClassification(jsonString);
break;
case BEARINGCLASSIFIER:
classification = new BearingClassification(jsonString);
break;
default:
System.err.println("StandardClassification: classifier JSON not found");
break;
}
ctClassification[i] = classification;
}
StandardClassification stClassification =
new StandardClassification(ctClassification, speciesID);
return stClassification;
} catch (IOException e) {
System.err.println("Classification interpreting " + jsonString);
e.printStackTrace();
return null;
}
}
}

View File

@ -7,9 +7,11 @@ import clickTrainDetector.ClickTrainControl;
import clickTrainDetector.classification.CTClassification;
import clickTrainDetector.classification.CTClassifier;
import clickTrainDetector.classification.CTClassifierParams;
import clickTrainDetector.classification.CTClassifierType;
import clickTrainDetector.classification.bearingClassifier.BearingClassifier;
import clickTrainDetector.classification.bearingClassifier.BearingClassifierParams;
import clickTrainDetector.classification.idiClassifier.IDIClassification;
import clickTrainDetector.classification.idiClassifier.IDIClassifier;
import clickTrainDetector.classification.simplechi2classifier.Chi2CTClassification;
import clickTrainDetector.classification.simplechi2classifier.Chi2ThresholdClassifier;
import clickTrainDetector.classification.templateClassifier.CTTemplateClassifier;
import clickTrainDetector.layout.classification.CTClassifierGraphics;
@ -17,17 +19,12 @@ import clickTrainDetector.layout.classification.standardClassifier.StandardClass
/**
* Combines the IDI, CHI2, BEARING and TEMPLATE classifier into one.
* @author Jamie Macaulay
*
*/
public class StandardClassifier implements CTClassifier {
/**
* It's quite complicated to keep track of the species ID for all sub classifier but just set them
* to 1 to check whether the classifier has passed or not,
*/
public int SUB_CLASSIFIER_SPECIESID = 1;
/**
* The bearing classifier parameters.
*/
@ -47,13 +44,6 @@ public class StandardClassifier implements CTClassifier {
* Click train control.
*/
private ClickTrainControl clickTrainControl;
/**
* The classifier types used in the standard classifier.
* ****New types MUST BE ADDED HERE****
*/
public static CTClassifierType[] CLASSIFIER_TYPES = {CTClassifierType.CHI2THRESHOLD, CTClassifierType.IDICLASSIFIER, CTClassifierType.TEMPLATECLASSIFIER, CTClassifierType.BEARINGCLASSIFIER};
public StandardClassifier(ClickTrainControl clickTrainControl, int speciesID) {
this.clickTrainControl = clickTrainControl;
@ -62,6 +52,7 @@ public class StandardClassifier implements CTClassifier {
//load the settings
createClassifiers();
}
/**
@ -69,32 +60,18 @@ public class StandardClassifier implements CTClassifier {
*/
private void createClassifiers() {
classifiers = new ArrayList<CTClassifier>();
//do this so that is CLASSIFIER_TYPES changes order things still work.
for (int i=0; i<CLASSIFIER_TYPES.length; i++) {
switch (CLASSIFIER_TYPES[i]) {
default:
break;
case CHI2THRESHOLD:
classifiers.add(new Chi2ThresholdClassifier(clickTrainControl, SUB_CLASSIFIER_SPECIESID));
break;
case IDICLASSIFIER:
classifiers.add(new IDIClassifier(clickTrainControl,SUB_CLASSIFIER_SPECIESID));
break;
case TEMPLATECLASSIFIER:
classifiers.add(new CTTemplateClassifier(clickTrainControl, SUB_CLASSIFIER_SPECIESID));
break;
case BEARINGCLASSIFIER:
classifiers.add(new BearingClassifier(clickTrainControl, SUB_CLASSIFIER_SPECIESID));
break;
}
}
classifiers.add(new Chi2ThresholdClassifier(clickTrainControl, standardClssfrParams.speciesFlag));
classifiers.add(new IDIClassifier(clickTrainControl, standardClssfrParams.speciesFlag));
classifiers.add(new CTTemplateClassifier(clickTrainControl, standardClssfrParams.speciesFlag));
classifiers.add(new BearingClassifier(clickTrainControl, standardClssfrParams.speciesFlag));
setClassifierParams();
}
/**
* Set the parameters for the individual classifiers
*/
@ -124,32 +101,11 @@ public class StandardClassifier implements CTClassifier {
@Override
public CTClassification classifyClickTrain(CTDataUnit clickTrain) {
int speciesID = standardClssfrParams.speciesFlag;
System.out.println("Standard Classificiation: " );
//all classifiers have to pass.
CTClassification[] ctClassification = new CTClassification[classifiers.size()];
for (int i=0; i<classifiers.size(); i++) {
ctClassification[i] = classifiers.get(i).classifyClickTrain(clickTrain);
System.out.println("Standard Classificiation: " + i + " speciesID: " + ctClassification[i].getSpeciesID()
+ " sub species: "+ classifiers.get(i).getParams().speciesFlag + " standard species: " +speciesID + " use? : " + standardClssfrParams.enable[i]);
if (standardClssfrParams.enable[i]) {
if (ctClassification[i].getSpeciesID() != SUB_CLASSIFIER_SPECIESID){
speciesID = CTClassifier.NOSPECIES;
}
}
}
System.out.println("SPECIES ID: " + speciesID);
//create the classification.
StandardClassification classification = new StandardClassification(ctClassification, speciesID);
return classification;
return null;
}
@Override
@ -185,4 +141,4 @@ public class StandardClassifier implements CTClassifier {
return classifiers;
}
}
}

View File

@ -1,8 +1,6 @@
package clickTrainDetector.classification.standardClassifier;
import clickTrainDetector.classification.CTClassifierParams;
import clickTrainDetector.classification.CTClassifierType;
/**
@ -25,13 +23,7 @@ public class StandardClassifierParams extends CTClassifierParams {
* List of which classifiers are enabled.
*/
public boolean[] enable;
public StandardClassifierParams(){
///very important to set this or else the clasifier manager does not
//know which classifier to create.
type = CTClassifierType.STANDARDCLASSIFIER;
}
//
// /**
// * Standard classifier parameters.

View File

@ -26,8 +26,6 @@ public class StandardClassifierPane extends SettingsPane<StandardClassifierPara
private PamToggleSwitch[] enableSwitch;
private Label[] labels;
public StandardClassifierPane(StandardClassifier standardClassifier) {
super(null);
this.standardClassifier = standardClassifier;
@ -39,28 +37,26 @@ public class StandardClassifierPane extends SettingsPane<StandardClassifierPara
PamVBox vBox = new PamVBox();
vBox.setSpacing(5);
labels = new Label[standardClassifier.getClassifiers().size()];
enableSwitch = new PamToggleSwitch[standardClassifier.getClassifiers().size()];
for (int i=0; i<standardClassifier.getClassifiers().size(); i++) {
enableSwitch[i] = new PamToggleSwitch("");
labels[i] = new Label(standardClassifier.getClassifiers().get(i).getName());
PamGuiManagerFX.titleFont2style(labels[i]);
Label label = new Label(standardClassifier.getClassifiers().get(i).getName());
PamGuiManagerFX.titleFont2style(label);
final int ii = i;
enableSwitch[i].selectedProperty().addListener((obsVal, oldVal, newVal)->{
standardClassifier.getClassifiers().get(ii).getCTClassifierGraphics().getCTClassifierPane().setDisable(!enableSwitch[ii].isSelected());
labels[ii].setDisable(!enableSwitch[ii].isSelected());
label.setDisable(!enableSwitch[ii].isSelected());
});
PamHBox hBox = new PamHBox();
hBox.setSpacing(5);
hBox.getChildren().addAll(enableSwitch[i], labels[i]);
hBox.getChildren().addAll(enableSwitch[i], label);
vBox.getChildren().addAll(hBox, standardClassifier.getClassifiers().get(i).getCTClassifierGraphics().getCTClassifierPane());
}
@ -68,12 +64,6 @@ public class StandardClassifierPane extends SettingsPane<StandardClassifierPara
return vBox;
}
private void disableClassifierPane(int ii) {
standardClassifier.getClassifiers().get(ii).getCTClassifierGraphics().getCTClassifierPane().setDisable(!enableSwitch[ii].isSelected());
labels[ii].setDisable(!enableSwitch[ii].isSelected());
}
@Override
public StandardClassifierParams getParams(StandardClassifierParams currParams) {
for (int i=0; i<standardClassifier.getClassifiers().size(); i++) {
@ -88,8 +78,6 @@ public class StandardClassifierPane extends SettingsPane<StandardClassifierPara
for (int i=0; i<standardClassifier.getClassifiers().size(); i++) {
standardClassifier.getClassifiers().get(i).getCTClassifierGraphics().setParams(input.ctClassifierParams[i]);
enableSwitch[i].setSelected(input.enable[i]);
disableClassifierPane(i);
}
}

View File

@ -49,7 +49,7 @@ import pamViewFX.fxStyles.PamStylesManagerFX;
*/
public class TDMenuPane extends PamBorderPane {
public static final int MENU_WIDTH=200;
public static final int menuWidth=200;
/**
* The current data units.
@ -333,10 +333,10 @@ public class TDMenuPane extends PamBorderPane {
flipPane.getFront().getChildren().add(menuPane);
flipPane.getBack().getChildren().add(infoPane);
flipPane.setPrefWidth(MENU_WIDTH);
flipPane.setPrefWidth(menuWidth);
PamBorderPane holder = new PamBorderPane(flipPane);
holder.setPrefWidth(MENU_WIDTH);
holder.setPrefWidth(menuWidth);
return holder;
@ -392,7 +392,7 @@ public class TDMenuPane extends PamBorderPane {
ScrollPane scrollPane = new ScrollPane(externalMenuPane);
scrollPane.setHbarPolicy(ScrollBarPolicy.NEVER);
scrollPane.setVbarPolicy(ScrollBarPolicy.AS_NEEDED);
scrollPane.setPrefHeight(300);
scrollPane.setPrefHeight(200);
menuPane.getChildren().add(scrollPane);