diff --git a/numass-core/src/main/java/inr/numass/data/analyzers/AbstractAnalyzer.java b/numass-core/src/main/java/inr/numass/data/analyzers/AbstractAnalyzer.java index b636aeec..bdb31b06 100644 --- a/numass-core/src/main/java/inr/numass/data/analyzers/AbstractAnalyzer.java +++ b/numass-core/src/main/java/inr/numass/data/analyzers/AbstractAnalyzer.java @@ -37,15 +37,12 @@ public abstract class AbstractAnalyzer implements NumassAnalyzer { * @return */ public Stream getEventStream(NumassBlock block, Meta config) { - int loChannel = config.getInt("window.lo", 0); - int upChannel = config.getInt("window.up", Integer.MAX_VALUE); if (block.getFrames().count() == 0) { - return block.getEvents().filter(it -> it.getChanel() >= loChannel && it.getChanel() < upChannel); + return block.getEvents(); } else if (getProcessor() == null) { throw new IllegalArgumentException("Signal processor needed to analyze frames"); } else { - return Stream.concat(block.getEvents(), block.getFrames().flatMap(getProcessor()::analyze)) - .filter(it -> it.getChanel() >= loChannel && it.getChanel() <= upChannel); + return Stream.concat(block.getEvents(), block.getFrames().flatMap(getProcessor()::analyze)); } } diff --git a/numass-core/src/main/java/inr/numass/data/analyzers/SimpleAnalyzer.java b/numass-core/src/main/java/inr/numass/data/analyzers/SimpleAnalyzer.java index a374568a..3740baf9 100644 --- a/numass-core/src/main/java/inr/numass/data/analyzers/SimpleAnalyzer.java +++ b/numass-core/src/main/java/inr/numass/data/analyzers/SimpleAnalyzer.java @@ -4,10 +4,13 @@ import hep.dataforge.meta.Meta; import hep.dataforge.tables.ValueMap; import hep.dataforge.values.Values; import inr.numass.data.api.NumassBlock; +import inr.numass.data.api.NumassEvent; import inr.numass.data.api.NumassPoint; import inr.numass.data.api.SignalProcessor; import org.jetbrains.annotations.Nullable; +import java.util.stream.Stream; + /** * A simple event counter * Created by darksnake on 07.07.2017. @@ -21,11 +24,15 @@ public class SimpleAnalyzer extends AbstractAnalyzer { public SimpleAnalyzer() { } + public Stream getEventStream(NumassBlock block, int loChannel, int upChannel) { + return getEventStream(block, Meta.empty()).filter(it -> it.getChanel() >= loChannel && it.getChanel() < upChannel); + } + @Override public Values analyze(NumassBlock block, Meta config) { int loChannel = config.getInt("window.lo", 0); int upChannel = config.getInt("window.up", Integer.MAX_VALUE); - long count = getEventStream(block, config).count(); + long count = getEventStream(block, loChannel, upChannel).count(); double countRate = (double) count / block.getLength().toMillis() * 1000; double countRateError = Math.sqrt((double) count) / block.getLength().toMillis() * 1000; diff --git a/numass-core/src/main/java/inr/numass/data/analyzers/TimeAnalyzer.java b/numass-core/src/main/java/inr/numass/data/analyzers/TimeAnalyzer.java index 68090339..e8f6102c 100644 --- a/numass-core/src/main/java/inr/numass/data/analyzers/TimeAnalyzer.java +++ b/numass-core/src/main/java/inr/numass/data/analyzers/TimeAnalyzer.java @@ -7,11 +7,12 @@ import inr.numass.data.api.NumassBlock; import inr.numass.data.api.NumassEvent; import inr.numass.data.api.NumassPoint; import inr.numass.data.api.SignalProcessor; +import javafx.util.Pair; import org.jetbrains.annotations.Nullable; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.LongStream; +import java.util.stream.Stream; /** * An analyzer which uses time information from events @@ -30,19 +31,21 @@ public class TimeAnalyzer extends AbstractAnalyzer { public Values analyze(NumassBlock block, Meta config) { int loChannel = config.getInt("window.lo", 0); int upChannel = config.getInt("window.up", Integer.MAX_VALUE); - long t0 = config.getValue("t0").longValue(); AtomicLong totalN = new AtomicLong(0); AtomicLong totalT = new AtomicLong(0); - timeChain(block, config).forEach(delay -> { - if (delay >= t0) { - totalN.incrementAndGet(); - //TODO add progress listener here - totalT.addAndGet(delay); - } - }); + extendedEventStream(block, config) + .filter(pair -> { + short channel = pair.getKey().getChanel(); + return channel >= loChannel && channel < upChannel; + }) + .forEach(pair -> { + totalN.incrementAndGet(); + //TODO add progress listener here + totalT.addAndGet(pair.getValue()); + }); double countRate = 1e6 * totalN.get() / (totalT.get() / 1000 - t0 * totalN.get() / 1000);//1e9 / (totalT.get() / totalN.get() - t0); double countRateError = countRate / Math.sqrt(totalN.get()); @@ -77,24 +80,32 @@ public class TimeAnalyzer extends AbstractAnalyzer { * @param config * @return */ - public LongStream timeChain(NumassBlock block, Meta config) { + public Stream> extendedEventStream(NumassBlock block, Meta config) { + long t0 = config.getValue("t0").longValue(); + AtomicReference lastEvent = new AtomicReference<>(null); - return getEventStream(block, config) + + return super.getEventStream(block, config) //using super implementation .sorted() - .mapToLong(event -> { + .map(event -> { if (lastEvent.get() == null) { lastEvent.set(event); - return 0; + return new Pair<>(event, 0L); } else { long res = event.getTimeOffset() - lastEvent.get().getTimeOffset(); if (res >= 0) { lastEvent.set(event); - return res; + return new Pair<>(event, res); } else { lastEvent.set(null); - return 0; + return new Pair<>(event, 0L); } } - }); + }).filter(pair -> pair.getValue() >= t0); + } + + @Override + public Stream getEventStream(NumassBlock block, Meta config) { + return extendedEventStream(block,config).map(Pair::getKey); } } diff --git a/numass-core/src/main/java/inr/numass/data/api/NumassAnalyzer.java b/numass-core/src/main/java/inr/numass/data/api/NumassAnalyzer.java index 827046e0..0ac32f42 100644 --- a/numass-core/src/main/java/inr/numass/data/api/NumassAnalyzer.java +++ b/numass-core/src/main/java/inr/numass/data/api/NumassAnalyzer.java @@ -30,7 +30,7 @@ public interface NumassAnalyzer { static long countInWindow(Table spectrum, short loChannel, short upChannel) { return spectrum.getRows().filter(row -> { int channel = row.getInt(CHANNEL_KEY); - return channel > loChannel && channel < upChannel; + return channel >= loChannel && channel < upChannel; }).mapToLong(it -> it.getValue(COUNT_KEY).numberValue().longValue()).sum(); } @@ -59,7 +59,7 @@ public interface NumassAnalyzer { spectrum.getRows().filter(row -> { int c = row.getInt(CHANNEL_KEY); - return c >= binLo && c <= binUp; + return c >= binLo && c < binUp; }).forEach(row -> { count.addAndGet(row.getValue(COUNT_KEY, 0).longValue()); countRate.accumulateAndGet(row.getDouble(COUNT_RATE_KEY, 0), (d1, d2) -> d1 + d2); diff --git a/numass-main/src/main/groovy/inr/numass/data/PointAnalyzer.groovy b/numass-main/src/main/groovy/inr/numass/data/PointAnalyzer.groovy index ad8d575f..54df3e6f 100644 --- a/numass-main/src/main/groovy/inr/numass/data/PointAnalyzer.groovy +++ b/numass-main/src/main/groovy/inr/numass/data/PointAnalyzer.groovy @@ -20,7 +20,7 @@ class PointAnalyzer { static Histogram histogram(NumassBlock point, int loChannel = 0, int upChannel = 10000, double binSize = 0.5, int binNum = 500) { return UnivariateHistogram.buildUniform(0d, binSize * binNum, binSize) - .fill(analyzer.timeChain(point, Grind.buildMeta("window.lo": loChannel, "window.up": upChannel)).mapToDouble {it / 1000 as double}) + .fill(analyzer.extendedEventStream(point, Grind.buildMeta("window.lo": loChannel, "window.up": upChannel)).mapToDouble {it.value / 1000 as double}) } static Histogram histogram(DoubleStream stream, double binSize = 0.5, int binNum = 500) { diff --git a/numass-main/src/main/groovy/inr/numass/scripts/times/MultiPointHistogram.groovy b/numass-main/src/main/groovy/inr/numass/scripts/times/MultiPointHistogram.groovy index dae24e69..7aa3bce1 100644 --- a/numass-main/src/main/groovy/inr/numass/scripts/times/MultiPointHistogram.groovy +++ b/numass-main/src/main/groovy/inr/numass/scripts/times/MultiPointHistogram.groovy @@ -44,7 +44,7 @@ new GrindShell(ctx).eval { def loChannel = 400; def upChannel = 800; - def chain = new TimeAnalyzer().timeChain(new MetaBlock(points), Grind.buildMeta("window.lo": loChannel, "window.up": upChannel)) + def chain = new TimeAnalyzer().extendedEventStream(new MetaBlock(points), Grind.buildMeta("window.lo": loChannel, "window.up": upChannel)) def histogram = PointAnalyzer.histogram(chain, 5e-6, 500).asTable();