mirror of
https://github.com/PAMGuard/PAMGuard.git
synced 2025-02-16 17:22:46 +00:00
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:
parent
8ad62a59e9
commit
b61a480ec4
@ -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>
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user