Task model helper revision
This commit is contained in:
parent
98cfc04e49
commit
21109003b8
@ -16,6 +16,9 @@ import static hep.dataforge.io.envelopes.DefaultEnvelopeType.DEFAULT_ENVELOPE_TY
|
|||||||
*/
|
*/
|
||||||
public class NumassEnvelopeType implements EnvelopeType {
|
public class NumassEnvelopeType implements EnvelopeType {
|
||||||
|
|
||||||
|
public static final byte[] LEGACY_START_SEQUENCE = {'#', '!'};
|
||||||
|
public static final byte[] LEGACY_END_SEQUENCE = {'!', '#', '\r', '\n'};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getCode() {
|
public int getCode() {
|
||||||
return DEFAULT_ENVELOPE_TYPE;
|
return DEFAULT_ENVELOPE_TYPE;
|
||||||
@ -41,18 +44,15 @@ public class NumassEnvelopeType implements EnvelopeType {
|
|||||||
return new DefaultEnvelopeWriter(this, MetaType.resolve(properties));
|
return new DefaultEnvelopeWriter(this, MetaType.resolve(properties));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class LegacyTag extends EnvelopeTag {
|
public static class LegacyTag extends EnvelopeTag {
|
||||||
private final byte[] START_SEQUENCE = {'#', '!'};
|
|
||||||
private final byte[] END_SEQUENCE = {'!', '#', '\r', '\n'};
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected byte[] getStartSequence() {
|
protected byte[] getStartSequence() {
|
||||||
return START_SEQUENCE;
|
return LEGACY_START_SEQUENCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected byte[] getEndSequence() {
|
protected byte[] getEndSequence() {
|
||||||
return END_SEQUENCE;
|
return LEGACY_END_SEQUENCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
@ -24,13 +24,13 @@ import hep.dataforge.meta.MetaBuilder;
|
|||||||
import hep.dataforge.providers.Provider;
|
import hep.dataforge.providers.Provider;
|
||||||
import hep.dataforge.storage.api.ObjectLoader;
|
import hep.dataforge.storage.api.ObjectLoader;
|
||||||
import hep.dataforge.storage.api.Storage;
|
import hep.dataforge.storage.api.Storage;
|
||||||
import hep.dataforge.storage.filestorage.FileEnvelope;
|
|
||||||
import hep.dataforge.storage.filestorage.FileStorage;
|
import hep.dataforge.storage.filestorage.FileStorage;
|
||||||
import hep.dataforge.storage.loaders.AbstractLoader;
|
import hep.dataforge.storage.loaders.AbstractLoader;
|
||||||
import hep.dataforge.tables.Table;
|
import hep.dataforge.tables.Table;
|
||||||
import hep.dataforge.values.Value;
|
import hep.dataforge.values.Value;
|
||||||
import inr.numass.data.api.NumassPoint;
|
import inr.numass.data.api.NumassPoint;
|
||||||
import inr.numass.data.api.NumassSet;
|
import inr.numass.data.api.NumassSet;
|
||||||
|
import inr.numass.data.legacy.NumassFileEnvelope;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -87,7 +87,7 @@ public class NumassDataLoader extends AbstractLoader implements ObjectLoader<Env
|
|||||||
|| fileName.startsWith(POINT_FRAGMENT_NAME);
|
|| fileName.startsWith(POINT_FRAGMENT_NAME);
|
||||||
}).forEach(file -> {
|
}).forEach(file -> {
|
||||||
try {
|
try {
|
||||||
items.put(FileStorage.entryName(file), () -> FileEnvelope.open(file, true));
|
items.put(FileStorage.entryName(file), () -> NumassFileEnvelope.open(file, true));
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
LoggerFactory.getLogger(NumassDataLoader.class)
|
LoggerFactory.getLogger(NumassDataLoader.class)
|
||||||
.error("Can't load numass data directory " + FileStorage.entryName(directory), ex);
|
.error("Can't load numass data directory " + FileStorage.entryName(directory), ex);
|
||||||
|
@ -27,6 +27,8 @@ import hep.dataforge.tables.Table;
|
|||||||
import hep.dataforge.tables.ValueMap;
|
import hep.dataforge.tables.ValueMap;
|
||||||
import hep.dataforge.values.Value;
|
import hep.dataforge.values.Value;
|
||||||
import hep.dataforge.values.Values;
|
import hep.dataforge.values.Values;
|
||||||
|
import inr.numass.data.api.NumassAnalyzer;
|
||||||
|
import inr.numass.data.api.NumassPoint;
|
||||||
import inr.numass.utils.NumassUtils;
|
import inr.numass.utils.NumassUtils;
|
||||||
import javafx.util.Pair;
|
import javafx.util.Pair;
|
||||||
import org.apache.commons.math3.analysis.interpolation.SplineInterpolator;
|
import org.apache.commons.math3.analysis.interpolation.SplineInterpolator;
|
||||||
@ -40,6 +42,7 @@ import java.util.TreeMap;
|
|||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
import static hep.dataforge.values.ValueType.NUMBER;
|
import static hep.dataforge.values.ValueType.NUMBER;
|
||||||
|
import static inr.numass.data.analyzers.AbstractAnalyzer.TIME_KEY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Darksnake
|
* @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")
|
@ValueDef(name = "calculateRelative", info = "Calculate count rate relative to average monitor point", def = "false")
|
||||||
public class MonitorCorrectAction extends OneToOneAction<Table, Table> {
|
public class MonitorCorrectAction extends OneToOneAction<Table, Table> {
|
||||||
|
|
||||||
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<Values> monitorPoints = new CopyOnWriteArrayList<>();
|
CopyOnWriteArrayList<Values> monitorPoints = new CopyOnWriteArrayList<>();
|
||||||
//FIXME remove from state
|
//FIXME remove from state
|
||||||
@ -67,16 +70,16 @@ public class MonitorCorrectAction extends OneToOneAction<Table, Table> {
|
|||||||
}
|
}
|
||||||
double norm = 0;
|
double norm = 0;
|
||||||
double totalAv = 0;
|
double totalAv = 0;
|
||||||
String head = "";
|
StringBuilder head = new StringBuilder();
|
||||||
head += String.format("%20s\t%10s\t%s%n", "Timestamp", "Total", "CR in window");
|
head.append(String.format("%20s\t%10s\t%s%n", "timestamp", "Count", "CR in window"));
|
||||||
for (Values dp : index.values()) {
|
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();
|
norm += getCR(dp) / index.size();
|
||||||
totalAv += getTotal(dp) / index.size();
|
totalAv += getTotal(dp) / index.size();
|
||||||
monitorPoints.add(dp);
|
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<Values> dataList = new ArrayList<>();
|
List<Values> dataList = new ArrayList<>();
|
||||||
|
|
||||||
@ -93,7 +96,7 @@ public class MonitorCorrectAction extends OneToOneAction<Table, Table> {
|
|||||||
double corrFactor = corr.getKey();
|
double corrFactor = corr.getKey();
|
||||||
double corrErr = corr.getValue();
|
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);
|
double err = Math.sqrt(corrErr * corrErr + pointErr * pointErr) * getCR(dp);
|
||||||
|
|
||||||
if (dp.getNames().contains("Monitor")) {
|
if (dp.getNames().contains("Monitor")) {
|
||||||
@ -102,23 +105,22 @@ public class MonitorCorrectAction extends OneToOneAction<Table, Table> {
|
|||||||
pb.putValue("Monitor", corrFactor);
|
pb.putValue("Monitor", corrFactor);
|
||||||
}
|
}
|
||||||
|
|
||||||
pb.putValue("CR", Value.of(dp.getValue("CR").doubleValue() / corrFactor));
|
pb.putValue(NumassAnalyzer.COUNT_RATE_KEY, Value.of(dp.getValue(NumassAnalyzer.COUNT_RATE_KEY).doubleValue() / corrFactor));
|
||||||
pb.putValue("Window", Value.of(dp.getValue("Window").doubleValue() / corrFactor));
|
pb.putValue(NumassAnalyzer.COUNT_RATE_ERROR_KEY, Value.of(err));
|
||||||
pb.putValue("CRerr", Value.of(err));
|
|
||||||
} else {
|
} else {
|
||||||
double corrFactor = dp.getValue("CR").doubleValue() / norm;
|
double corrFactor = dp.getValue(NumassAnalyzer.COUNT_RATE_KEY).doubleValue() / norm;
|
||||||
if (dp.getNames().contains("Monitor")) {
|
if (dp.getNames().contains("Monitor")) {
|
||||||
pb.putValue("Monitor", Value.of(dp.getValue("Monitor").doubleValue() / corrFactor));
|
pb.putValue("Monitor", Value.of(dp.getValue("Monitor").doubleValue() / corrFactor));
|
||||||
} else {
|
} else {
|
||||||
pb.putValue("Monitor", corrFactor);
|
pb.putValue("Monitor", corrFactor);
|
||||||
}
|
}
|
||||||
pb.putValue("CR", norm);
|
pb.putValue(NumassAnalyzer.COUNT_RATE_KEY, norm);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (meta.getBoolean("calculateRelative", false)) {
|
if (meta.getBoolean("calculateRelative", false)) {
|
||||||
pb.putValue("relCR", pb.build().getValue("CR").doubleValue() / norm);
|
pb.putValue("relCR", pb.build().getValue(NumassAnalyzer.COUNT_RATE_KEY).doubleValue() / norm);
|
||||||
pb.putValue("relCRerr", pb.build().getValue("CRerr").doubleValue() / norm);
|
pb.putValue("relCRerr", pb.build().getValue(NumassAnalyzer.COUNT_RATE_ERROR_KEY).doubleValue() / norm);
|
||||||
}
|
}
|
||||||
|
|
||||||
dataList.add(pb.build());
|
dataList.add(pb.build());
|
||||||
@ -155,7 +157,7 @@ public class MonitorCorrectAction extends OneToOneAction<Table, Table> {
|
|||||||
|
|
||||||
PolynomialSplineFunction corrFunc = new SplineInterpolator().interpolate(xs, ys);
|
PolynomialSplineFunction corrFunc = new SplineInterpolator().interpolate(xs, ys);
|
||||||
if (corrFunc.isValidPoint(time)) {
|
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);
|
return new Pair<>(corrFunc.value(time), averageErr / norm / 2d);
|
||||||
} else {
|
} else {
|
||||||
return new Pair<>(1d, 0d);
|
return new Pair<>(1d, 0d);
|
||||||
@ -184,7 +186,7 @@ public class MonitorCorrectAction extends OneToOneAction<Table, Table> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
double corrFactor = (getCR(previousMonitor.getValue()) * (1 - p) + getCR(nextMonitor.getValue()) * p) / norm;
|
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);
|
return new Pair<>(corrFactor, corrErr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,19 +207,19 @@ public class MonitorCorrectAction extends OneToOneAction<Table, Table> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean isMonitorPoint(double monitor, Values point) {
|
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) {
|
private Instant getTime(Values point) {
|
||||||
return point.getValue("Timestamp").timeValue();
|
return point.getValue(TIME_KEY).timeValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getTotal(Values point) {
|
private int getTotal(Values point) {
|
||||||
return point.getValue("Total").intValue();
|
return point.getValue(NumassAnalyzer.COUNT_KEY).intValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private double getCR(Values point) {
|
private double getCR(Values point) {
|
||||||
return point.getValue("CR").doubleValue();
|
return point.getValue(NumassAnalyzer.COUNT_RATE_KEY).doubleValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
private TreeMap<Instant, Values> getMonitorIndex(double monitor, Iterable<Values> data) {
|
private TreeMap<Instant, Values> getMonitorIndex(double monitor, Iterable<Values> data) {
|
||||||
|
@ -64,19 +64,19 @@ public class NumassSubstractEmptySourceTask extends AbstractTask<Table> {
|
|||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected TaskModel transformModel(TaskModel model) {
|
protected void updateModel(TaskModel.Builder model, Meta meta) {
|
||||||
Meta modelMeta = model.meta();
|
model.dependsOn("prepare", meta, "prepare");
|
||||||
model.dependsOn("prepare", modelMeta, "prepare");
|
|
||||||
MetaBuilder emptyCfg = new MetaBuilder("prepare")
|
MetaBuilder emptyCfg = new MetaBuilder("prepare")
|
||||||
.setNode(modelMeta.getMeta("prepare"))
|
.setNode(meta.getMeta("prepare"))
|
||||||
.setNode("data", modelMeta.getMeta("empty"))
|
.setNode("data", meta.getMeta("empty"))
|
||||||
.setNode(new MetaBuilder("merge").setValue("mergeName", model.meta().getName() + ".empty"));
|
.setNode(new MetaBuilder("merge").setValue("mergeName", model.getName() + ".empty"));
|
||||||
model.dependsOn("prepare", emptyCfg, "empty");
|
model.dependsOn("prepare", emptyCfg, "empty");
|
||||||
return model;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private Data<? extends Table> subtract(Data<? extends Table> mergeData, Data<? extends Table> emptyData) {
|
private Data<? extends Table> subtract(Data<? extends Table> mergeData, Data<? extends Table> emptyData) {
|
||||||
return DataUtils.combine(mergeData, emptyData, Table.class, mergeData.meta(), (BiFunction<Table, Table, Table>) this::subtract);
|
return DataUtils.combine(mergeData, emptyData, Table.class, mergeData.meta(), (BiFunction<Table, Table, Table>) this::subtract);
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ limitations under the License.
|
|||||||
<Insets left="10.0" />
|
<Insets left="10.0" />
|
||||||
</padding></Label>
|
</padding></Label>
|
||||||
<Pane HBox.hgrow="ALWAYS" />
|
<Pane HBox.hgrow="ALWAYS" />
|
||||||
<ToggleButton fx:id="processManagerButton" mnemonicParsing="false" text="ProcessManager" />
|
<!--<ToggleButton fx:id="processManagerButton" mnemonicParsing="false" text="ProcessManager" />-->
|
||||||
<ToggleButton fx:id="consoleButton" contentDisplay="CENTER" mnemonicParsing="false" text="Console" />
|
<ToggleButton fx:id="consoleButton" contentDisplay="CENTER" mnemonicParsing="false" text="Console" />
|
||||||
</items>
|
</items>
|
||||||
</ToolBar>
|
</ToolBar>
|
||||||
|
Loading…
Reference in New Issue
Block a user