2015-12-18 16:20:47 +03:00
|
|
|
/*
|
|
|
|
* Copyright 2015 Alexander Nozik.
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
package inr.numass.viewer;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* To change this license header, choose License Headers in Project Properties.
|
|
|
|
* To change this template file, choose Tools | Templates
|
|
|
|
* and open the template in the editor.
|
|
|
|
*/
|
2016-04-21 19:43:58 +03:00
|
|
|
import hep.dataforge.context.Context;
|
|
|
|
import hep.dataforge.context.ProcessManager;
|
2015-12-18 16:20:47 +03:00
|
|
|
import hep.dataforge.io.ColumnedDataWriter;
|
|
|
|
import hep.dataforge.meta.Meta;
|
|
|
|
import hep.dataforge.meta.MetaBuilder;
|
|
|
|
import hep.dataforge.plots.XYPlotFrame;
|
|
|
|
import hep.dataforge.plots.XYPlottable;
|
2015-12-21 16:40:21 +03:00
|
|
|
import hep.dataforge.plots.data.ChangeablePlottableData;
|
2016-05-22 22:58:01 +03:00
|
|
|
import hep.dataforge.plots.data.DynamicPlottable;
|
|
|
|
import hep.dataforge.plots.data.DynamicPlottableSet;
|
2015-12-18 16:20:47 +03:00
|
|
|
import hep.dataforge.plots.data.PlotDataUtils;
|
|
|
|
import hep.dataforge.plots.data.PlottableData;
|
2016-05-22 22:58:01 +03:00
|
|
|
import hep.dataforge.plots.data.PlottableSet;
|
2016-05-15 16:26:38 +03:00
|
|
|
import hep.dataforge.plots.fx.PlotContainer;
|
2015-12-18 16:20:47 +03:00
|
|
|
import hep.dataforge.plots.jfreechart.JFreeChartFrame;
|
|
|
|
import hep.dataforge.storage.commons.JSONMetaWriter;
|
2016-04-30 21:57:46 +03:00
|
|
|
import hep.dataforge.tables.DataPoint;
|
|
|
|
import hep.dataforge.tables.ListTable;
|
|
|
|
import hep.dataforge.tables.MapPoint;
|
|
|
|
import hep.dataforge.tables.Table;
|
|
|
|
import hep.dataforge.tables.XYAdapter;
|
2016-05-02 18:23:03 +03:00
|
|
|
import inr.numass.storage.NMPoint;
|
|
|
|
import inr.numass.storage.NumassData;
|
2015-12-18 16:20:47 +03:00
|
|
|
import java.io.File;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.net.URL;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.ResourceBundle;
|
2015-12-27 18:04:05 +03:00
|
|
|
import java.util.function.Predicate;
|
2016-05-22 22:58:01 +03:00
|
|
|
import java.util.function.Supplier;
|
2015-12-21 16:40:21 +03:00
|
|
|
import java.util.stream.Collectors;
|
2015-12-27 18:04:05 +03:00
|
|
|
import javafx.application.Platform;
|
2015-12-21 16:40:21 +03:00
|
|
|
import javafx.beans.value.ChangeListener;
|
2015-12-18 16:20:47 +03:00
|
|
|
import javafx.beans.value.ObservableValue;
|
|
|
|
import javafx.collections.FXCollections;
|
|
|
|
import javafx.event.ActionEvent;
|
|
|
|
import javafx.fxml.FXML;
|
|
|
|
import javafx.fxml.FXMLLoader;
|
|
|
|
import javafx.fxml.Initializable;
|
2016-05-15 16:26:38 +03:00
|
|
|
import javafx.geometry.Insets;
|
|
|
|
import javafx.geometry.Orientation;
|
2015-12-18 16:20:47 +03:00
|
|
|
import javafx.scene.control.Button;
|
|
|
|
import javafx.scene.control.CheckBox;
|
|
|
|
import javafx.scene.control.ChoiceBox;
|
2016-05-15 16:26:38 +03:00
|
|
|
import javafx.scene.control.Label;
|
|
|
|
import javafx.scene.control.Separator;
|
2015-12-18 16:20:47 +03:00
|
|
|
import javafx.scene.control.Tab;
|
|
|
|
import javafx.scene.control.TextArea;
|
2015-12-21 16:40:21 +03:00
|
|
|
import javafx.scene.control.TextField;
|
2015-12-18 16:20:47 +03:00
|
|
|
import javafx.scene.layout.AnchorPane;
|
|
|
|
import javafx.scene.layout.VBox;
|
|
|
|
import javafx.stage.FileChooser;
|
2015-12-21 16:40:21 +03:00
|
|
|
import javafx.util.converter.NumberStringConverter;
|
2015-12-18 16:20:47 +03:00
|
|
|
import org.controlsfx.control.CheckListView;
|
2015-12-21 16:40:21 +03:00
|
|
|
import org.controlsfx.control.RangeSlider;
|
2015-12-27 18:04:05 +03:00
|
|
|
import org.controlsfx.validation.ValidationSupport;
|
|
|
|
import org.controlsfx.validation.Validator;
|
2015-12-18 16:20:47 +03:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* FXML Controller class
|
|
|
|
*
|
|
|
|
* @author darksnake
|
|
|
|
*/
|
|
|
|
public class NumassLoaderViewComponent extends AnchorPane implements Initializable {
|
|
|
|
|
2016-04-21 19:43:58 +03:00
|
|
|
private final Context context;
|
2015-12-21 16:40:21 +03:00
|
|
|
|
2015-12-18 16:20:47 +03:00
|
|
|
Logger logger = LoggerFactory.getLogger(NumassLoaderViewComponent.class);
|
|
|
|
private NumassData data;
|
2016-05-15 16:26:38 +03:00
|
|
|
private PlotContainer detectorPlot;
|
2016-05-22 22:58:01 +03:00
|
|
|
private PlotContainer spectrumPlot;
|
|
|
|
private PlotContainer hvPlot;
|
2015-12-21 16:40:21 +03:00
|
|
|
private ChangeablePlottableData spectrumData;
|
|
|
|
private List<NMPoint> points;
|
2016-05-15 16:26:38 +03:00
|
|
|
private ChoiceBox<Integer> detectorBinningSelector;
|
|
|
|
private CheckBox detectorNormalizeSwitch;
|
|
|
|
private Button detectorDataExportButton;
|
2015-12-18 16:20:47 +03:00
|
|
|
|
|
|
|
@FXML
|
|
|
|
private AnchorPane detectorPlotPane;
|
|
|
|
@FXML
|
|
|
|
private CheckListView<String> detectorPointListView;
|
|
|
|
@FXML
|
|
|
|
private Tab detectorTab;
|
|
|
|
@FXML
|
|
|
|
private Tab hvTab;
|
|
|
|
@FXML
|
|
|
|
private Tab spectrumTab;
|
|
|
|
@FXML
|
|
|
|
private TextArea infoTextBox;
|
|
|
|
@FXML
|
|
|
|
private AnchorPane spectrumPlotPane;
|
|
|
|
@FXML
|
|
|
|
private VBox spectrumOptionsPane;
|
|
|
|
@FXML
|
2015-12-21 16:40:21 +03:00
|
|
|
private TextField lowChannelField;
|
|
|
|
@FXML
|
|
|
|
private TextField upChannelField;
|
|
|
|
@FXML
|
|
|
|
private RangeSlider channelSlider;
|
2015-12-27 18:04:05 +03:00
|
|
|
@FXML
|
|
|
|
private Button spectrumExportButton;
|
|
|
|
@FXML
|
|
|
|
private TextField dTimeField;
|
2016-05-22 22:58:01 +03:00
|
|
|
@FXML
|
|
|
|
private AnchorPane hvPane;
|
2015-12-27 18:04:05 +03:00
|
|
|
|
2016-04-21 19:43:58 +03:00
|
|
|
public NumassLoaderViewComponent(Context context) {
|
|
|
|
this.context = context;
|
2015-12-27 18:04:05 +03:00
|
|
|
FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/NumassLoaderView.fxml"));
|
|
|
|
|
|
|
|
loader.setRoot(this);
|
|
|
|
loader.setController(this);
|
|
|
|
|
|
|
|
try {
|
|
|
|
loader.load();
|
|
|
|
} catch (IOException ex) {
|
|
|
|
throw new RuntimeException(ex);
|
|
|
|
}
|
|
|
|
}
|
2015-12-21 16:40:21 +03:00
|
|
|
|
2015-12-18 16:20:47 +03:00
|
|
|
/**
|
|
|
|
* Initializes the controller class.
|
2015-12-21 16:40:21 +03:00
|
|
|
*
|
2015-12-18 16:20:47 +03:00
|
|
|
* @param url
|
|
|
|
* @param rb
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public void initialize(URL url, ResourceBundle rb) {
|
2016-05-15 16:26:38 +03:00
|
|
|
//setup detector pane plot and sidebar
|
|
|
|
Label l = new Label("Bin size:");
|
|
|
|
l.setPadding(new Insets(5));
|
|
|
|
detectorBinningSelector = new ChoiceBox<>(FXCollections.observableArrayList(1, 2, 5, 10, 20, 50));
|
|
|
|
detectorBinningSelector.setMaxWidth(Double.MAX_VALUE);
|
2015-12-27 18:04:05 +03:00
|
|
|
detectorBinningSelector.getSelectionModel().select(4);
|
2016-05-15 16:26:38 +03:00
|
|
|
|
|
|
|
detectorNormalizeSwitch = new CheckBox("Normailize");
|
2015-12-18 16:20:47 +03:00
|
|
|
detectorNormalizeSwitch.setSelected(true);
|
2016-05-15 16:26:38 +03:00
|
|
|
detectorNormalizeSwitch.setPadding(new Insets(5));
|
|
|
|
|
|
|
|
detectorPlot = PlotContainer.anchorTo(detectorPlotPane);
|
|
|
|
detectorPlot.addToSideBar(0, l, detectorBinningSelector, detectorNormalizeSwitch, new Separator(Orientation.HORIZONTAL));
|
2015-12-18 16:20:47 +03:00
|
|
|
|
2016-05-15 16:26:38 +03:00
|
|
|
detectorDataExportButton = new Button("Export");
|
|
|
|
detectorDataExportButton.setMaxWidth(Double.MAX_VALUE);
|
2015-12-18 16:20:47 +03:00
|
|
|
detectorDataExportButton.setOnAction(this::onExportButtonClick);
|
2016-05-15 16:26:38 +03:00
|
|
|
detectorPlot.addToSideBar(detectorDataExportButton);
|
2016-05-18 13:12:59 +03:00
|
|
|
|
2016-05-15 16:26:38 +03:00
|
|
|
detectorPlot.setSideBarPosition(0.7);
|
|
|
|
//setup spectrum pane
|
2016-05-22 22:58:01 +03:00
|
|
|
spectrumPlot = PlotContainer.anchorTo(spectrumPlotPane);
|
|
|
|
|
|
|
|
Meta spectrumPlotMeta = new MetaBuilder("plot")
|
|
|
|
.setValue("xAxis.axisTitle", "U")
|
|
|
|
.setValue("xAxis.axisUnits", "V")
|
|
|
|
.setValue("yAxis.axisTitle", "count rate")
|
|
|
|
.setValue("yAxis.axisUnits", "Hz")
|
|
|
|
.setValue("legend.show", false);
|
|
|
|
spectrumPlot.setPlot(new JFreeChartFrame(spectrumPlotMeta));
|
|
|
|
|
2015-12-21 16:40:21 +03:00
|
|
|
lowChannelField.textProperty().bindBidirectional(channelSlider.lowValueProperty(), new NumberStringConverter());
|
|
|
|
upChannelField.textProperty().bindBidirectional(channelSlider.highValueProperty(), new NumberStringConverter());
|
2015-12-24 12:20:42 +03:00
|
|
|
|
2015-12-27 18:04:05 +03:00
|
|
|
channelSlider.setHighValue(1900d);
|
|
|
|
channelSlider.setLowValue(300d);
|
2015-12-24 12:20:42 +03:00
|
|
|
|
2015-12-21 16:40:21 +03:00
|
|
|
ChangeListener<? super Number> rangeChangeListener = (ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
|
2016-05-22 22:58:01 +03:00
|
|
|
setupSpectrumPane(points);
|
2015-12-21 16:40:21 +03:00
|
|
|
};
|
2015-12-24 12:20:42 +03:00
|
|
|
|
2015-12-27 18:04:05 +03:00
|
|
|
dTimeField.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
|
2016-05-22 22:58:01 +03:00
|
|
|
setupSpectrumPane(points);
|
2015-12-27 18:04:05 +03:00
|
|
|
});
|
|
|
|
|
2015-12-21 16:40:21 +03:00
|
|
|
channelSlider.lowValueProperty().addListener(rangeChangeListener);
|
|
|
|
channelSlider.highValueProperty().addListener(rangeChangeListener);
|
2015-12-27 18:04:05 +03:00
|
|
|
|
|
|
|
ValidationSupport validationSupport = new ValidationSupport();
|
|
|
|
Predicate<String> isNumber = (String t) -> {
|
|
|
|
try {
|
|
|
|
Double.parseDouble(t);
|
|
|
|
return true;
|
|
|
|
} catch (NumberFormatException | NullPointerException ex) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
validationSupport.registerValidator(dTimeField, Validator.createPredicateValidator(isNumber, "Must be number"));
|
2016-05-22 22:58:01 +03:00
|
|
|
|
|
|
|
//setup HV plot
|
|
|
|
hvPlot = PlotContainer.anchorTo(hvPane);
|
|
|
|
Meta hvPlotMeta = new MetaBuilder("plot")
|
|
|
|
.setValue("xAxis.axisTitle", "time")
|
|
|
|
.setValue("xAxis.type", "time")
|
|
|
|
.setValue("yAxis.axisTitle", "HV");
|
|
|
|
hvPlot.setPlot(new JFreeChartFrame(hvPlotMeta));
|
2015-12-18 16:20:47 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
public NumassData getData() {
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
2015-12-27 18:04:05 +03:00
|
|
|
public void loadData(NumassData data) {
|
2015-12-18 16:20:47 +03:00
|
|
|
this.data = data;
|
|
|
|
if (data != null) {
|
2016-04-21 19:43:58 +03:00
|
|
|
context.processManager().<List<NMPoint>>post("viewer.numass.load", (ProcessManager.Callback callback) -> {
|
|
|
|
callback.updateTitle("Load numass data (" + data.getName() + ")");
|
|
|
|
points = data.getNMPoints();
|
2016-05-22 22:58:01 +03:00
|
|
|
|
2016-04-21 19:43:58 +03:00
|
|
|
Platform.runLater(() -> {
|
|
|
|
//setup detector data
|
|
|
|
setupDetectorPane(points);
|
|
|
|
//setup spectrum plot
|
2016-05-22 22:58:01 +03:00
|
|
|
setupSpectrumPane(points);
|
2016-04-21 19:43:58 +03:00
|
|
|
});
|
|
|
|
});
|
2016-05-22 22:58:01 +03:00
|
|
|
//setup hv plot
|
|
|
|
Supplier<Table> hvData = data.getHVData();
|
|
|
|
if (hvData != null) {
|
|
|
|
setupHVPane(hvData);
|
|
|
|
}
|
|
|
|
setupInfo(data);
|
|
|
|
|
2015-12-18 16:20:47 +03:00
|
|
|
} else {
|
|
|
|
logger.error("The data model is null");
|
|
|
|
}
|
2015-12-27 18:04:05 +03:00
|
|
|
detectorTab.getTabPane().getSelectionModel().select(detectorTab);
|
|
|
|
}
|
|
|
|
|
2016-05-22 22:58:01 +03:00
|
|
|
private void setupHVPane(Supplier<Table> hvData) {
|
|
|
|
context.processManager().post("viewer.numass.hv", (ProcessManager.Callback callback) -> {
|
|
|
|
Table t = hvData.get();
|
2015-12-27 18:04:05 +03:00
|
|
|
Platform.runLater(() -> {
|
2016-05-22 22:58:01 +03:00
|
|
|
if (t != null) {
|
|
|
|
hvPlot.getPlot().plottables().clear();
|
|
|
|
DynamicPlottableSet set = new DynamicPlottableSet();
|
|
|
|
for (DataPoint dp : t) {
|
|
|
|
String block = dp.getString("block", "default");
|
|
|
|
if (!set.hasPlottable(block)) {
|
|
|
|
set.addPlottable(new DynamicPlottable(block, block));
|
|
|
|
}
|
|
|
|
set.getPlottable(block).put(dp.getValue("timestamp").timeValue(), dp.getValue("value"));
|
|
|
|
}
|
|
|
|
hvPlot.getPlot().addAll(set);
|
|
|
|
}
|
2015-12-27 18:04:05 +03:00
|
|
|
});
|
2016-05-22 22:58:01 +03:00
|
|
|
});
|
2015-12-18 16:20:47 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* setup detector pane
|
|
|
|
*
|
|
|
|
* @param points
|
|
|
|
*/
|
|
|
|
private void setupDetectorPane(List<NMPoint> points) {
|
|
|
|
boolean normalize = detectorNormalizeSwitch.isSelected();
|
|
|
|
int binning = detectorBinningSelector.getValue();
|
|
|
|
updateDetectorPane(fillDetectorData(points, binning, normalize));
|
|
|
|
detectorBinningSelector.getSelectionModel().selectedItemProperty()
|
|
|
|
.addListener((ObservableValue<? extends Integer> observable, Integer oldValue, Integer newValue) -> {
|
|
|
|
boolean norm = detectorNormalizeSwitch.isSelected();
|
2015-12-27 18:04:05 +03:00
|
|
|
updateDetectorPane(fillDetectorData(NumassLoaderViewComponent.this.points, newValue, norm));
|
2015-12-18 16:20:47 +03:00
|
|
|
});
|
|
|
|
detectorNormalizeSwitch.selectedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
|
|
|
|
int bin = detectorBinningSelector.getValue();
|
2015-12-27 18:04:05 +03:00
|
|
|
updateDetectorPane(fillDetectorData(NumassLoaderViewComponent.this.points, bin, newValue));
|
2015-12-18 16:20:47 +03:00
|
|
|
});
|
|
|
|
detectorDataExportButton.setDisable(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setupInfo(NumassData loader) {
|
|
|
|
Meta info = loader.getInfo();
|
|
|
|
infoTextBox.setText(new JSONMetaWriter().writeString(info, null).
|
2015-12-27 18:04:05 +03:00
|
|
|
replace("\\r", "\r\t").replace("\\n", "\n\t"));
|
2015-12-18 16:20:47 +03:00
|
|
|
}
|
|
|
|
|
2016-05-22 22:58:01 +03:00
|
|
|
private void setupSpectrumPane(List<NMPoint> points) {
|
2015-12-21 16:40:21 +03:00
|
|
|
if (spectrumData == null) {
|
2016-02-15 17:00:27 +03:00
|
|
|
spectrumData = new ChangeablePlottableData("spectrum");
|
2016-05-22 22:58:01 +03:00
|
|
|
spectrumPlot.getPlot().add(spectrumData);
|
2015-12-21 16:40:21 +03:00
|
|
|
}
|
2015-12-18 16:20:47 +03:00
|
|
|
|
2015-12-21 16:40:21 +03:00
|
|
|
int lowChannel = (int) channelSlider.getLowValue();
|
|
|
|
int highChannel = (int) channelSlider.getHighValue();
|
|
|
|
if (points == null || points.isEmpty()) {
|
|
|
|
spectrumData.clear();
|
|
|
|
} else {
|
|
|
|
spectrumData.fillData(points.stream()
|
2015-12-27 18:04:05 +03:00
|
|
|
.<DataPoint>map((NMPoint point) -> getSpectrumPoint(point, lowChannel, highChannel, getDTime()))
|
2015-12-21 16:40:21 +03:00
|
|
|
.collect(Collectors.toList()));
|
|
|
|
}
|
|
|
|
}
|
2015-12-18 16:20:47 +03:00
|
|
|
|
2015-12-27 18:04:05 +03:00
|
|
|
private double getDTime() {
|
|
|
|
try {
|
|
|
|
return Double.parseDouble(dTimeField.getText()) * 1e-6;
|
|
|
|
} catch (NumberFormatException ex) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private DataPoint getSpectrumPoint(NMPoint point, int lowChannel, int upChannel, double dTime) {
|
2015-12-21 16:40:21 +03:00
|
|
|
double u = point.getUread();
|
2016-02-28 20:08:59 +03:00
|
|
|
return new MapPoint(new String[]{"x", "y", "yErr"}, u,
|
2015-12-27 18:04:05 +03:00
|
|
|
point.getCountRate(lowChannel, upChannel, dTime),
|
|
|
|
point.getCountRateErr(lowChannel, upChannel, dTime));
|
2015-12-18 16:20:47 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* update detector pane with new data
|
|
|
|
*/
|
|
|
|
private void updateDetectorPane(List<XYPlottable> detectorData) {
|
2015-12-27 18:04:05 +03:00
|
|
|
Platform.runLater(() -> {
|
|
|
|
if (detectorData == null) {
|
|
|
|
throw new IllegalArgumentException("Detector data not defined");
|
|
|
|
}
|
2015-12-18 16:20:47 +03:00
|
|
|
|
2016-05-15 16:26:38 +03:00
|
|
|
// detectorPointListView.getItems().clear();//removing all checkboxes
|
|
|
|
// detectorPlotPane.getChildren().clear();//removing plot
|
2015-12-27 18:04:05 +03:00
|
|
|
Meta frameMeta = new MetaBuilder("frame")
|
|
|
|
.setValue("frameTitle", "Detector response plot")
|
|
|
|
.setNode(new MetaBuilder("xAxis")
|
|
|
|
.setValue("axisTitle", "ADC")
|
|
|
|
.setValue("axisUnits", "channels")
|
|
|
|
.build())
|
|
|
|
.setNode(new MetaBuilder("yAxis")
|
|
|
|
.setValue("axisTitle", "count rate")
|
|
|
|
.setValue("axisUnits", "Hz")
|
|
|
|
.build())
|
2016-05-15 16:26:38 +03:00
|
|
|
.setNode(new MetaBuilder("legend")
|
|
|
|
.setValue("show", false))
|
2015-12-27 18:04:05 +03:00
|
|
|
.build();
|
|
|
|
|
2016-05-15 16:26:38 +03:00
|
|
|
// detectorPlot = PlotContainer.anchorTo(detectorPlotPane);
|
|
|
|
XYPlotFrame detectorPlotFrame = new JFreeChartFrame(frameMeta);
|
2015-12-27 18:04:05 +03:00
|
|
|
|
|
|
|
for (XYPlottable pl : detectorData) {
|
|
|
|
detectorPlotFrame.add(pl);
|
2016-05-15 16:26:38 +03:00
|
|
|
//TODO add update instead of replace action
|
2015-12-27 18:04:05 +03:00
|
|
|
}
|
2016-05-15 16:26:38 +03:00
|
|
|
detectorPlot.setPlot(detectorPlotFrame);
|
2015-12-27 18:04:05 +03:00
|
|
|
});
|
2015-12-18 16:20:47 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
private List<XYPlottable> fillDetectorData(List<NMPoint> points, int binning, boolean normalize) {
|
|
|
|
List<XYPlottable> plottables = new ArrayList<>();
|
|
|
|
Meta plottableConfig = new MetaBuilder("plot")
|
|
|
|
.setValue("connectionType", "step")
|
|
|
|
.setValue("thickness", 2)
|
|
|
|
.setValue("showLine", true)
|
|
|
|
.setValue("showSymbol", false)
|
2016-01-14 16:16:33 +03:00
|
|
|
.setValue("showErrors", false)
|
2015-12-18 16:20:47 +03:00
|
|
|
.build();
|
|
|
|
|
|
|
|
for (NMPoint point : points) {
|
|
|
|
String seriesName = String.format("%d: %.2f (%.2f)", points.indexOf(point), point.getUset(), point.getUread());
|
|
|
|
|
2016-04-21 19:43:58 +03:00
|
|
|
PlottableData datum = PlottableData.plot(seriesName, new XYAdapter("chanel", "count"), point.getData(binning, normalize));
|
2016-01-07 18:33:15 +03:00
|
|
|
datum.configure(plottableConfig);
|
2015-12-18 16:20:47 +03:00
|
|
|
plottables.add(datum);
|
|
|
|
}
|
|
|
|
return plottables;
|
|
|
|
}
|
|
|
|
|
2015-12-27 18:04:05 +03:00
|
|
|
@FXML
|
|
|
|
private void onSpectrumExportClick(ActionEvent event) {
|
|
|
|
if (points != null && !points.isEmpty()) {
|
|
|
|
FileChooser fileChooser = new FileChooser();
|
|
|
|
fileChooser.setTitle("Choose text export destination");
|
|
|
|
fileChooser.setInitialFileName(data.getName() + "_spectrum.out");
|
|
|
|
File destination = fileChooser.showSaveDialog(spectrumPlotPane.getScene().getWindow());
|
|
|
|
if (destination != null) {
|
|
|
|
String[] names = new String[]{"Uset", "Uread", "Length", "Total", "Window", "CR", "CRerr", "Timestamp"};
|
|
|
|
int loChannel = (int) channelSlider.getLowValue();
|
|
|
|
int upChannel = (int) channelSlider.getHighValue();
|
|
|
|
double dTime = getDTime();
|
2016-04-26 17:50:06 +03:00
|
|
|
ListTable.Builder spectrumDataSet = new ListTable.Builder(names);
|
2015-12-27 18:04:05 +03:00
|
|
|
|
|
|
|
for (NMPoint point : points) {
|
2016-04-26 17:50:06 +03:00
|
|
|
spectrumDataSet.addRow(new MapPoint(names, new Object[]{
|
2015-12-27 18:04:05 +03:00
|
|
|
point.getUset(),
|
|
|
|
point.getUread(),
|
|
|
|
point.getLength(),
|
|
|
|
point.getEventsCount(),
|
|
|
|
point.getCountInWindow(loChannel, upChannel),
|
|
|
|
point.getCountRate(loChannel, upChannel, dTime),
|
|
|
|
point.getCountRateErr(loChannel, upChannel, dTime),
|
|
|
|
point.getStartTime()
|
|
|
|
}
|
|
|
|
));
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
String comment = String.format("Numass data viewer spectrum data export for %s%n"
|
|
|
|
+ "Window: (%d, %d)%n"
|
|
|
|
+ "Dead time per event: %g%n",
|
|
|
|
data.getName(), loChannel, upChannel, dTime);
|
|
|
|
|
|
|
|
ColumnedDataWriter
|
2016-04-26 17:50:06 +03:00
|
|
|
.writeDataSet(destination, spectrumDataSet.build(), comment, false);
|
2015-12-27 18:04:05 +03:00
|
|
|
} catch (IOException ex) {
|
|
|
|
LoggerFactory.getLogger(getClass()).error("Destination file not found", ex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-18 16:20:47 +03:00
|
|
|
private void onExportButtonClick(ActionEvent event) {
|
|
|
|
FileChooser fileChooser = new FileChooser();
|
|
|
|
fileChooser.setTitle("Choose text export destination");
|
|
|
|
fileChooser.setInitialFileName(data.getName() + "_detector.out");
|
|
|
|
File destination = fileChooser.showSaveDialog(detectorPlotPane.getScene().getWindow());
|
|
|
|
if (destination != null) {
|
2016-05-15 16:26:38 +03:00
|
|
|
Table detectorData = PlotDataUtils.collectXYDataFromPlot((XYPlotFrame) detectorPlot.getPlot(), true);
|
2015-12-18 16:20:47 +03:00
|
|
|
try {
|
|
|
|
ColumnedDataWriter
|
|
|
|
.writeDataSet(destination, detectorData, "Numass data viewer detector data export for " + data.getName(),
|
|
|
|
false);
|
|
|
|
} catch (IOException ex) {
|
|
|
|
LoggerFactory.getLogger(getClass()).error("Destination file not found", ex);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|