diff --git a/numass-core/src/main/java/inr/numass/NumassEnvelopeType.java b/numass-core/src/main/java/inr/numass/NumassEnvelopeType.java index d0654532..0d69571d 100644 --- a/numass-core/src/main/java/inr/numass/NumassEnvelopeType.java +++ b/numass-core/src/main/java/inr/numass/NumassEnvelopeType.java @@ -16,6 +16,9 @@ import static hep.dataforge.io.envelopes.DefaultEnvelopeType.DEFAULT_ENVELOPE_TY */ public class NumassEnvelopeType implements EnvelopeType { + public static final byte[] LEGACY_START_SEQUENCE = {'#', '!'}; + public static final byte[] LEGACY_END_SEQUENCE = {'!', '#', '\r', '\n'}; + @Override public int getCode() { return DEFAULT_ENVELOPE_TYPE; @@ -41,18 +44,15 @@ public class NumassEnvelopeType implements EnvelopeType { return new DefaultEnvelopeWriter(this, MetaType.resolve(properties)); } - private static class LegacyTag extends EnvelopeTag { - private final byte[] START_SEQUENCE = {'#', '!'}; - private final byte[] END_SEQUENCE = {'!', '#', '\r', '\n'}; - + public static class LegacyTag extends EnvelopeTag { @Override protected byte[] getStartSequence() { - return START_SEQUENCE; + return LEGACY_START_SEQUENCE; } @Override protected byte[] getEndSequence() { - return END_SEQUENCE; + return LEGACY_END_SEQUENCE; } /** diff --git a/numass-core/src/main/java/inr/numass/data/legacy/NumassFileEnvelope.java b/numass-core/src/main/java/inr/numass/data/legacy/NumassFileEnvelope.java new file mode 100644 index 00000000..11eda987 --- /dev/null +++ b/numass-core/src/main/java/inr/numass/data/legacy/NumassFileEnvelope.java @@ -0,0 +1,44 @@ +package inr.numass.data.legacy; + +import hep.dataforge.io.envelopes.EnvelopeTag; +import hep.dataforge.storage.filestorage.FileEnvelope; +import inr.numass.NumassEnvelopeType; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.channels.SeekableByteChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; + +import static inr.numass.NumassEnvelopeType.LEGACY_START_SEQUENCE; +import static java.nio.file.StandardOpenOption.READ; + +public class NumassFileEnvelope extends FileEnvelope { + + public static FileEnvelope open(Path path, boolean readOnly) { + if (!Files.exists(path)) { + throw new RuntimeException("File envelope does not exist"); + } + try (SeekableByteChannel channel = Files.newByteChannel(path, READ)) { + ByteBuffer header = ByteBuffer.allocate(2); + channel.read(header); + if(Arrays.equals(header.array(),LEGACY_START_SEQUENCE)){ + return new NumassFileEnvelope(path,readOnly); + } else { + return FileEnvelope.open(path, readOnly); + } + } catch (IOException e) { + throw new RuntimeException("Failed to open file envelope", e); + } + } + + private NumassFileEnvelope(Path path, boolean readOnly) { + super(path, readOnly); + } + + @Override + protected EnvelopeTag buildTag(){ + return new NumassEnvelopeType.LegacyTag(); + } +} diff --git a/numass-core/src/main/java/inr/numass/data/storage/NumassDataLoader.java b/numass-core/src/main/java/inr/numass/data/storage/NumassDataLoader.java index 7f4f7832..f411870e 100644 --- a/numass-core/src/main/java/inr/numass/data/storage/NumassDataLoader.java +++ b/numass-core/src/main/java/inr/numass/data/storage/NumassDataLoader.java @@ -24,13 +24,13 @@ import hep.dataforge.meta.MetaBuilder; import hep.dataforge.providers.Provider; import hep.dataforge.storage.api.ObjectLoader; import hep.dataforge.storage.api.Storage; -import hep.dataforge.storage.filestorage.FileEnvelope; import hep.dataforge.storage.filestorage.FileStorage; import hep.dataforge.storage.loaders.AbstractLoader; import hep.dataforge.tables.Table; import hep.dataforge.values.Value; import inr.numass.data.api.NumassPoint; import inr.numass.data.api.NumassSet; +import inr.numass.data.legacy.NumassFileEnvelope; import org.slf4j.LoggerFactory; import java.io.IOException; @@ -87,7 +87,7 @@ public class NumassDataLoader extends AbstractLoader implements ObjectLoader { try { - items.put(FileStorage.entryName(file), () -> FileEnvelope.open(file, true)); + items.put(FileStorage.entryName(file), () -> NumassFileEnvelope.open(file, true)); } catch (Exception ex) { LoggerFactory.getLogger(NumassDataLoader.class) .error("Can't load numass data directory " + FileStorage.entryName(directory), ex); diff --git a/numass-main/src/main/java/inr/numass/actions/MonitorCorrectAction.java b/numass-main/src/main/java/inr/numass/actions/MonitorCorrectAction.java index 4a7a4979..739e4dea 100644 --- a/numass-main/src/main/java/inr/numass/actions/MonitorCorrectAction.java +++ b/numass-main/src/main/java/inr/numass/actions/MonitorCorrectAction.java @@ -27,6 +27,8 @@ import hep.dataforge.tables.Table; import hep.dataforge.tables.ValueMap; import hep.dataforge.values.Value; import hep.dataforge.values.Values; +import inr.numass.data.api.NumassAnalyzer; +import inr.numass.data.api.NumassPoint; import inr.numass.utils.NumassUtils; import javafx.util.Pair; import org.apache.commons.math3.analysis.interpolation.SplineInterpolator; @@ -40,6 +42,7 @@ import java.util.TreeMap; import java.util.concurrent.CopyOnWriteArrayList; import static hep.dataforge.values.ValueType.NUMBER; +import static inr.numass.data.analyzers.AbstractAnalyzer.TIME_KEY; /** * @author Darksnake @@ -50,7 +53,7 @@ import static hep.dataforge.values.ValueType.NUMBER; @ValueDef(name = "calculateRelative", info = "Calculate count rate relative to average monitor point", def = "false") public class MonitorCorrectAction extends OneToOneAction { - private static final String[] monitorNames = {"Timestamp", "Total", "CR", "CRerr"}; + //private static final String[] monitorNames = {"timestamp", NumassAnalyzer.COUNT_KEY, NumassAnalyzer.COUNT_RATE_KEY, NumassAnalyzer.COUNT_RATE_KEY}; CopyOnWriteArrayList monitorPoints = new CopyOnWriteArrayList<>(); //FIXME remove from state @@ -67,16 +70,16 @@ public class MonitorCorrectAction extends OneToOneAction { } double norm = 0; double totalAv = 0; - String head = ""; - head += String.format("%20s\t%10s\t%s%n", "Timestamp", "Total", "CR in window"); + StringBuilder head = new StringBuilder(); + head.append(String.format("%20s\t%10s\t%s%n", "timestamp", "Count", "CR in window")); for (Values dp : index.values()) { - head += String.format("%20s\t%10d\t%g%n", getTime(dp).toString(), getTotal(dp), getCR(dp)); + head.append(String.format("%20s\t%10d\t%g%n", getTime(dp).toString(), getTotal(dp), getCR(dp))); norm += getCR(dp) / index.size(); totalAv += getTotal(dp) / index.size(); monitorPoints.add(dp); } - head += String.format("%20s\t%10g\t%g%n", "Average", totalAv, norm); + head.append(String.format("%20s\t%10g\t%g%n", "Average", totalAv, norm)); List dataList = new ArrayList<>(); @@ -93,7 +96,7 @@ public class MonitorCorrectAction extends OneToOneAction { double corrFactor = corr.getKey(); double corrErr = corr.getValue(); - double pointErr = dp.getValue("CRerr").doubleValue() / getCR(dp); + double pointErr = dp.getValue(NumassAnalyzer.COUNT_RATE_ERROR_KEY).doubleValue() / getCR(dp); double err = Math.sqrt(corrErr * corrErr + pointErr * pointErr) * getCR(dp); if (dp.getNames().contains("Monitor")) { @@ -102,23 +105,22 @@ public class MonitorCorrectAction extends OneToOneAction { pb.putValue("Monitor", corrFactor); } - pb.putValue("CR", Value.of(dp.getValue("CR").doubleValue() / corrFactor)); - pb.putValue("Window", Value.of(dp.getValue("Window").doubleValue() / corrFactor)); - pb.putValue("CRerr", Value.of(err)); + pb.putValue(NumassAnalyzer.COUNT_RATE_KEY, Value.of(dp.getValue(NumassAnalyzer.COUNT_RATE_KEY).doubleValue() / corrFactor)); + pb.putValue(NumassAnalyzer.COUNT_RATE_ERROR_KEY, Value.of(err)); } else { - double corrFactor = dp.getValue("CR").doubleValue() / norm; + double corrFactor = dp.getValue(NumassAnalyzer.COUNT_RATE_KEY).doubleValue() / norm; if (dp.getNames().contains("Monitor")) { pb.putValue("Monitor", Value.of(dp.getValue("Monitor").doubleValue() / corrFactor)); } else { pb.putValue("Monitor", corrFactor); } - pb.putValue("CR", norm); + pb.putValue(NumassAnalyzer.COUNT_RATE_KEY, norm); } if (meta.getBoolean("calculateRelative", false)) { - pb.putValue("relCR", pb.build().getValue("CR").doubleValue() / norm); - pb.putValue("relCRerr", pb.build().getValue("CRerr").doubleValue() / norm); + pb.putValue("relCR", pb.build().getValue(NumassAnalyzer.COUNT_RATE_KEY).doubleValue() / norm); + pb.putValue("relCRerr", pb.build().getValue(NumassAnalyzer.COUNT_RATE_ERROR_KEY).doubleValue() / norm); } dataList.add(pb.build()); @@ -155,7 +157,7 @@ public class MonitorCorrectAction extends OneToOneAction { PolynomialSplineFunction corrFunc = new SplineInterpolator().interpolate(xs, ys); if (corrFunc.isValidPoint(time)) { - double averageErr = index.values().stream().mapToDouble(p -> p.getDouble("CRerr")).average().getAsDouble(); + double averageErr = index.values().stream().mapToDouble(p -> p.getDouble(NumassAnalyzer.COUNT_RATE_ERROR_KEY)).average().getAsDouble(); return new Pair<>(corrFunc.value(time), averageErr / norm / 2d); } else { return new Pair<>(1d, 0d); @@ -184,7 +186,7 @@ public class MonitorCorrectAction extends OneToOneAction { } double corrFactor = (getCR(previousMonitor.getValue()) * (1 - p) + getCR(nextMonitor.getValue()) * p) / norm; - double corrErr = previousMonitor.getValue().getValue("CRerr").doubleValue() / getCR(previousMonitor.getValue()) / Math.sqrt(2); + double corrErr = previousMonitor.getValue().getValue(NumassAnalyzer.COUNT_RATE_ERROR_KEY).doubleValue() / getCR(previousMonitor.getValue()) / Math.sqrt(2); return new Pair<>(corrFactor, corrErr); } @@ -205,19 +207,19 @@ public class MonitorCorrectAction extends OneToOneAction { } private boolean isMonitorPoint(double monitor, Values point) { - return point.getValue("Uset").doubleValue() == monitor; + return point.getValue(NumassPoint.HV_KEY).doubleValue() == monitor; } private Instant getTime(Values point) { - return point.getValue("Timestamp").timeValue(); + return point.getValue(TIME_KEY).timeValue(); } private int getTotal(Values point) { - return point.getValue("Total").intValue(); + return point.getValue(NumassAnalyzer.COUNT_KEY).intValue(); } private double getCR(Values point) { - return point.getValue("CR").doubleValue(); + return point.getValue(NumassAnalyzer.COUNT_RATE_KEY).doubleValue(); } private TreeMap getMonitorIndex(double monitor, Iterable data) { diff --git a/numass-main/src/main/java/inr/numass/tasks/NumassSubstractEmptySourceTask.java b/numass-main/src/main/java/inr/numass/tasks/NumassSubstractEmptySourceTask.java index 1220e122..800a6402 100644 --- a/numass-main/src/main/java/inr/numass/tasks/NumassSubstractEmptySourceTask.java +++ b/numass-main/src/main/java/inr/numass/tasks/NumassSubstractEmptySourceTask.java @@ -64,19 +64,19 @@ public class NumassSubstractEmptySourceTask extends AbstractTask { return builder.build(); } + @Override - protected TaskModel transformModel(TaskModel model) { - Meta modelMeta = model.meta(); - model.dependsOn("prepare", modelMeta, "prepare"); + protected void updateModel(TaskModel.Builder model, Meta meta) { + model.dependsOn("prepare", meta, "prepare"); MetaBuilder emptyCfg = new MetaBuilder("prepare") - .setNode(modelMeta.getMeta("prepare")) - .setNode("data", modelMeta.getMeta("empty")) - .setNode(new MetaBuilder("merge").setValue("mergeName", model.meta().getName() + ".empty")); + .setNode(meta.getMeta("prepare")) + .setNode("data", meta.getMeta("empty")) + .setNode(new MetaBuilder("merge").setValue("mergeName", model.getName() + ".empty")); model.dependsOn("prepare", emptyCfg, "empty"); - return model; } + private Data subtract(Data mergeData, Data emptyData) { return DataUtils.combine(mergeData, emptyData, Table.class, mergeData.meta(), (BiFunction) this::subtract); } diff --git a/numass-viewer/src/main/resources/fxml/MainView.fxml b/numass-viewer/src/main/resources/fxml/MainView.fxml index 1878aa18..aece1e31 100644 --- a/numass-viewer/src/main/resources/fxml/MainView.fxml +++ b/numass-viewer/src/main/resources/fxml/MainView.fxml @@ -37,7 +37,7 @@ limitations under the License. - +