Updates in numass viewer. Minor fixes in core.

This commit is contained in:
Alexander Nozik 2016-05-22 22:58:01 +03:00
parent d65c29cde8
commit 3767d13756
8 changed files with 156 additions and 138 deletions

View File

@ -1,87 +0,0 @@
/*
* 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.actions;
import hep.dataforge.tables.MapPoint;
import hep.dataforge.tables.SimplePointSource;
import hep.dataforge.values.Value;
import inr.numass.storage.NMFile;
import inr.numass.storage.NMPoint;
import inr.numass.storage.NumassData;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author Darksnake
*/
public class BorderData extends SimplePointSource {
private final static String[] names = {"U", "80%", "90%", "95%", "99%"};
private final static double[] percents = {0.8, 0.9, 0.95, 0.99};
public static double getNorm(Map<Double, Double> spectrum, int lower, int upper) {
double res = 0;
for (Map.Entry<Double, Double> entry : spectrum.entrySet()) {
if ((entry.getKey() >= lower) && (entry.getKey() <= upper)) {
res += entry.getValue();
}
}
return res;
}
public BorderData(NumassData file, int upper, int lower, NMPoint reference) {
super(names);
if (upper <= lower) {
throw new IllegalArgumentException();
}
fill(file, lower, upper, reference);
}
private void fill(NumassData file, int lower, int upper, NMPoint reference) {
for (NMPoint point : file.getNMPoints()) {
if ((reference != null) && (point.getUset() == reference.getUset())) {
continue;
}
//создаем основу для будущей точки
HashMap<String, Value> map = new HashMap<>();
map.put(names[0], Value.of(point.getUset()));
Map<Double, Double> spectrum;
if (reference != null) {
spectrum = point.getMapWithBinning(reference, 0);
} else {
spectrum = point.getMapWithBinning(0, true);
}
double norm = getNorm(spectrum, lower, upper);
double counter = 0;
int chanel = upper;
while (chanel > lower) {
chanel--;
counter += spectrum.get((double) chanel);
for (int i = 0; i < percents.length; i++) {
if (counter / norm > percents[i]) {
if (!map.containsKey(names[i + 1])) {
map.put(names[i + 1], Value.of(chanel));
}
}
}
}
this.addRow(new MapPoint(map));
}
}
}

View File

@ -22,20 +22,29 @@ import hep.dataforge.exceptions.ContentException;
import hep.dataforge.io.ColumnedDataWriter;
import hep.dataforge.io.reports.Reportable;
import hep.dataforge.meta.Laminate;
import hep.dataforge.tables.ListTable;
import hep.dataforge.tables.MapPoint;
import hep.dataforge.tables.Table;
import hep.dataforge.values.Value;
import inr.numass.storage.NMFile;
import inr.numass.storage.NMPoint;
import inr.numass.storage.NumassData;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author Darksnake
*/
@TypedActionDef(name = "findBorder", inputType = NMFile.class, outputType = NMFile.class)
public class FindBorderAction extends OneToOneAction<NumassData, NumassData> {
@TypedActionDef(name = "findBorder", inputType = NMFile.class, outputType = Table.class)
public class FindBorderAction extends OneToOneAction<NumassData, Table> {
private final static String[] names = {"U", "80%", "90%", "95%", "99%"};
private final static double[] percents = {0.8, 0.9, 0.95, 0.99};
@Override
protected NumassData execute(Context context, Reportable log, String name, Laminate meta, NumassData source) throws ContentException {
protected Table execute(Context context, Reportable log, String name, Laminate meta, NumassData source) throws ContentException {
log.report("File {} started", source.getName());
int upperBorder = meta.getInt("upper", 4094);
@ -50,14 +59,60 @@ public class FindBorderAction extends OneToOneAction<NumassData, NumassData> {
}
}
BorderData bData = new BorderData(source, upperBorder, lowerBorder, referencePoint);
ListTable.Builder dataBuilder = new ListTable.Builder(names);
fill(dataBuilder, source, lowerBorder, upperBorder, referencePoint);
Table bData = dataBuilder.build();
OutputStream stream = buildActionOutput(context, name);
ColumnedDataWriter.writeDataSet(stream, bData, String.format("%s : lower = %d upper = %d", source.getName(), lowerBorder, upperBorder));
ColumnedDataWriter.writeDataSet(stream, bData, String.format("%s : lower = %d upper = %d", name, lowerBorder, upperBorder));
log.report("File {} completed", source.getName());
return source;
return bData;
}
private double getNorm(Map<Double, Double> spectrum, int lower, int upper) {
double res = 0;
for (Map.Entry<Double, Double> entry : spectrum.entrySet()) {
if ((entry.getKey() >= lower) && (entry.getKey() <= upper)) {
res += entry.getValue();
}
}
return res;
}
private void fill(ListTable.Builder dataBuilder, NumassData file, int lower, int upper, NMPoint reference) {
for (NMPoint point : file.getNMPoints()) {
if ((reference != null) && (point.getUset() == reference.getUset())) {
continue;
}
//создаем основу для будущей точки
HashMap<String, Value> map = new HashMap<>();
map.put(names[0], Value.of(point.getUset()));
Map<Double, Double> spectrum;
if (reference != null) {
spectrum = point.getMapWithBinning(reference, 0);
} else {
spectrum = point.getMapWithBinning(0, true);
}
double norm = getNorm(spectrum, lower, upper);
double counter = 0;
int chanel = upper;
while (chanel > lower) {
chanel--;
counter += spectrum.get((double) chanel);
for (int i = 0; i < percents.length; i++) {
if (counter / norm > percents[i]) {
if (!map.containsKey(names[i + 1])) {
map.put(names[i + 1], Value.of(chanel));
}
}
}
}
dataBuilder.addRow(new MapPoint(map));
}
}
}

View File

@ -24,6 +24,7 @@ import hep.dataforge.tables.DataPoint;
import hep.dataforge.tables.PointSource;
import hep.dataforge.tables.Table;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
@ -39,7 +40,7 @@ public class TransmissionInterpolator implements UnivariateFunction {
public static TransmissionInterpolator fromFile(Context context, String path, String xName, String yName, int nSmooth, double w, double border) {
try {
File dataFile = context.io().getFile(path);
ColumnedDataReader reader = new ColumnedDataReader(dataFile);
ColumnedDataReader reader = new ColumnedDataReader(new FileInputStream(dataFile));
return new TransmissionInterpolator(reader, xName, yName, nSmooth, w, border);
} catch (FileNotFoundException ex) {
throw new RuntimeException(ex);

View File

@ -7,8 +7,10 @@ package inr.numass.storage;
import hep.dataforge.meta.Meta;
import hep.dataforge.names.Named;
import hep.dataforge.tables.Table;
import java.time.Instant;
import java.util.List;
import java.util.function.Supplier;
/**
*
@ -26,6 +28,10 @@ public interface NumassData extends Named {
Instant startTime();
default Supplier<Table> getHVData() {
return () -> null;
}
/**
* Find first point with given Uset
*

View File

@ -18,6 +18,7 @@ package inr.numass.storage;
import hep.dataforge.context.GlobalContext;
import hep.dataforge.data.binary.Binary;
import hep.dataforge.exceptions.StorageException;
import hep.dataforge.io.ColumnedDataReader;
import hep.dataforge.io.envelopes.DefaultEnvelopeReader;
import hep.dataforge.io.envelopes.Envelope;
import hep.dataforge.meta.Meta;
@ -25,7 +26,10 @@ import hep.dataforge.meta.MetaBuilder;
import hep.dataforge.storage.api.ObjectLoader;
import hep.dataforge.storage.api.Storage;
import hep.dataforge.storage.loaders.AbstractLoader;
import hep.dataforge.tables.ListTable;
import hep.dataforge.tables.Table;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
@ -40,6 +44,8 @@ import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
@ -263,6 +269,30 @@ public class NumassDataLoader extends AbstractLoader implements ObjectLoader<Env
.meta();
}
@Override
public Supplier<Table> getHVData() {
Envelope hvEnvelope = getHVEnvelope();
if (hvEnvelope == null) {
return () -> null;
}
return () -> {
try {
return new ColumnedDataReader(hvEnvelope.getData().getStream(), "timestamp", "block", "value").toDataSet();
} catch (IOException ex) {
LoggerFactory.getLogger(getClass()).error("Failed to load HV data from file", ex);
return null;
}
};
}
private Envelope getHVEnvelope() {
if (getItems().containsKey(HV_FRAGMENT_NAME)) {
return getItems().get(HV_FRAGMENT_NAME).get();
} else {
return null;
}
}
// public Envelope getHvData() {
// return hvData;
// }

View File

@ -5,7 +5,7 @@ if (!hasProperty('mainClass')) {
}
mainClassName = mainClass
version = "0.3.2"
version = "0.3.3"
description = "The viewer for numass data"

View File

@ -28,8 +28,11 @@ import hep.dataforge.meta.MetaBuilder;
import hep.dataforge.plots.XYPlotFrame;
import hep.dataforge.plots.XYPlottable;
import hep.dataforge.plots.data.ChangeablePlottableData;
import hep.dataforge.plots.data.DynamicPlottable;
import hep.dataforge.plots.data.DynamicPlottableSet;
import hep.dataforge.plots.data.PlotDataUtils;
import hep.dataforge.plots.data.PlottableData;
import hep.dataforge.plots.data.PlottableSet;
import hep.dataforge.plots.fx.PlotContainer;
import hep.dataforge.plots.jfreechart.JFreeChartFrame;
import hep.dataforge.storage.commons.JSONMetaWriter;
@ -47,12 +50,12 @@ import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
@ -90,7 +93,8 @@ public class NumassLoaderViewComponent extends AnchorPane implements Initializab
Logger logger = LoggerFactory.getLogger(NumassLoaderViewComponent.class);
private NumassData data;
private PlotContainer detectorPlot;
private XYPlotFrame spectrumPlotFrame;
private PlotContainer spectrumPlot;
private PlotContainer hvPlot;
private ChangeablePlottableData spectrumData;
private List<NMPoint> points;
private ChoiceBox<Integer> detectorBinningSelector;
@ -123,6 +127,8 @@ public class NumassLoaderViewComponent extends AnchorPane implements Initializab
private Button spectrumExportButton;
@FXML
private TextField dTimeField;
@FXML
private AnchorPane hvPane;
public NumassLoaderViewComponent(Context context) {
this.context = context;
@ -166,8 +172,17 @@ public class NumassLoaderViewComponent extends AnchorPane implements Initializab
detectorPlot.addToSideBar(detectorDataExportButton);
detectorPlot.setSideBarPosition(0.7);
//setup spectrum pane
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));
lowChannelField.textProperty().bindBidirectional(channelSlider.lowValueProperty(), new NumberStringConverter());
upChannelField.textProperty().bindBidirectional(channelSlider.highValueProperty(), new NumberStringConverter());
@ -175,11 +190,11 @@ public class NumassLoaderViewComponent extends AnchorPane implements Initializab
channelSlider.setLowValue(300d);
ChangeListener<? super Number> rangeChangeListener = (ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> {
updateSpectrumPane(points);
setupSpectrumPane(points);
};
dTimeField.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
updateSpectrumPane(points);
setupSpectrumPane(points);
});
channelSlider.lowValueProperty().addListener(rangeChangeListener);
@ -196,6 +211,14 @@ public class NumassLoaderViewComponent extends AnchorPane implements Initializab
};
validationSupport.registerValidator(dTimeField, Validator.createPredicateValidator(isNumber, "Must be number"));
//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));
}
public NumassData getData() {
@ -208,43 +231,45 @@ public class NumassLoaderViewComponent extends AnchorPane implements Initializab
context.processManager().<List<NMPoint>>post("viewer.numass.load", (ProcessManager.Callback callback) -> {
callback.updateTitle("Load numass data (" + data.getName() + ")");
points = data.getNMPoints();
Platform.runLater(() -> {
//setup detector data
setupDetectorPane(points);
//setup spectrum plot
updateSpectrumPane(points);
setupInfo(data);
setupSpectrumPane(points);
});
});
//setup hv plot
Supplier<Table> hvData = data.getHVData();
if (hvData != null) {
setupHVPane(hvData);
}
setupInfo(data);
} else {
logger.error("The data model is null");
}
detectorTab.getTabPane().getSelectionModel().select(detectorTab);
}
private class LoadPointsTask extends Task<List<NMPoint>> {
private final NumassData loader;
public LoadPointsTask(NumassData loader) {
this.loader = loader;
}
@Override
protected List<NMPoint> call() throws Exception {
updateTitle("Load numass data (" + loader.getName() + ")");
List<NMPoint> points = loader.getNMPoints();
private void setupHVPane(Supplier<Table> hvData) {
context.processManager().post("viewer.numass.hv", (ProcessManager.Callback callback) -> {
Table t = hvData.get();
Platform.runLater(() -> {
//setup detector data
setupDetectorPane(points);
//setup spectrum plot
updateSpectrumPane(points);
setupInfo(data);
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);
}
});
return points;
}
});
}
/**
@ -274,22 +299,10 @@ public class NumassLoaderViewComponent extends AnchorPane implements Initializab
replace("\\r", "\r\t").replace("\\n", "\n\t"));
}
private void updateSpectrumPane(List<NMPoint> points) {
if (spectrumPlotFrame == null) {
Meta plotMeta = new MetaBuilder("plot")
.setValue("xAxis.axisTitle", "U")
.setValue("xAxis.axisUnits", "V")
.setValue("yAxis.axisTitle", "count rate")
.setValue("yAxis.axisUnits", "Hz")
.setValue("legend.show", false);
spectrumPlotFrame = new JFreeChartFrame(plotMeta).display(spectrumPlotPane);
}
private void setupSpectrumPane(List<NMPoint> points) {
if (spectrumData == null) {
spectrumData = new ChangeablePlottableData("spectrum");
spectrumPlotFrame.add(spectrumData);
spectrumPlot.getPlot().add(spectrumData);
}
int lowChannel = (int) channelSlider.getLowValue();

View File

@ -52,7 +52,7 @@ limitations under the License.
</Tab>
<Tab fx:id="hvTab" text="HV">
<content>
<AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
<AnchorPane fx:id="hvPane" minHeight="0.0" minWidth="0.0" prefHeight="180.0" prefWidth="200.0" />
</content>
</Tab>
<Tab fx:id="spectrumTab" text="Spectrum">