This commit is contained in:
Alexander Nozik 2017-12-19 21:19:41 +03:00
parent 5e8db547eb
commit 4f8b2fef11
2 changed files with 0 additions and 235 deletions

View File

@ -1,83 +0,0 @@
package inr.numass.control
import hep.dataforge.control.devices.Stateful
import hep.dataforge.values.Value
import java.time.Instant
import kotlin.reflect.KProperty
class StateDelegate(private val stateName: String?) {
operator fun getValue(thisRef: Stateful, property: KProperty<*>): Value? =
thisRef.getState(stateName ?: property.name)
operator fun setValue(thisRef: Stateful, property: KProperty<*>, value: Value?) {
thisRef.setState(stateName ?: property.name, value);
}
}
class StringStateDelegate(private val stateName: String?) {
operator fun getValue(thisRef: Stateful, property: KProperty<*>): String? =
thisRef.getState(stateName ?: property.name).stringValue()
operator fun setValue(thisRef: Stateful, property: KProperty<*>, value: String?) {
thisRef.setState(stateName ?: property.name, value);
}
}
class BooleanStateDelegate(private val stateName: String?) {
operator fun getValue(thisRef: Stateful, property: KProperty<*>): Boolean? =
thisRef.getState(stateName ?: property.name).booleanValue()
operator fun setValue(thisRef: Stateful, property: KProperty<*>, value: Boolean?) {
thisRef.setState(stateName ?: property.name, value);
}
}
class TimeStateDelegate(private val stateName: String?) {
operator fun getValue(thisRef: Stateful, property: KProperty<*>): Instant? =
thisRef.getState(stateName ?: property.name).timeValue()
operator fun setValue(thisRef: Stateful, property: KProperty<*>, value: Instant?) {
thisRef.setState(stateName ?: property.name, value);
}
}
class NumberStateDelegate(private val stateName: String?) {
operator fun getValue(thisRef: Stateful, property: KProperty<*>): Number? =
thisRef.getState(stateName ?: property.name).numberValue()
operator fun setValue(thisRef: Stateful, property: KProperty<*>, value: Number?) {
thisRef.setState(stateName ?: property.name, value);
}
}
class DoubleStateDelegate(private val stateName: String?) {
operator fun getValue(thisRef: Stateful, property: KProperty<*>): Double? =
thisRef.getState(stateName ?: property.name).doubleValue()
operator fun setValue(thisRef: Stateful, property: KProperty<*>, value: Double?) {
thisRef.setState(stateName ?: property.name, value);
}
}
class IntStateDelegate(private val stateName: String?) {
operator fun getValue(thisRef: Stateful, property: KProperty<*>): Int? =
thisRef.getState(stateName ?: property.name).intValue()
operator fun setValue(thisRef: Stateful, property: KProperty<*>, value: Int?) {
thisRef.setState(stateName ?: property.name, value);
}
}
/**
* Delegate states to read/write property
*/
fun Stateful.state(stateName: String? = null) = StateDelegate(stateName)
fun Stateful.stringState(stateName: String? = null) = StringStateDelegate(stateName)
fun Stateful.booleanState(stateName: String? = null) = BooleanStateDelegate(stateName)
fun Stateful.timeState(stateName: String? = null) = TimeStateDelegate(stateName)
fun Stateful.numberState(stateName: String? = null) = NumberStateDelegate(stateName)
fun Stateful.doubleState(stateName: String? = null) = DoubleStateDelegate(stateName)
fun Stateful.intState(stateName: String? = null) = IntStateDelegate(stateName)

View File

@ -1,152 +0,0 @@
package inr.numass.data.api;
import hep.dataforge.meta.Meta;
import hep.dataforge.tables.*;
import hep.dataforge.values.Value;
import hep.dataforge.values.Values;
import inr.numass.data.analyzers.SmartAnalyzer;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import static hep.dataforge.tables.Adapters.*;
import static inr.numass.data.api.NumassPoint.HV_KEY;
/**
* A general raw data analysis utility. Could have different implementations
* Created by darksnake on 06-Jul-17.
*/
public interface NumassAnalyzer {
static NumassAnalyzer DEFAULT_ANALYZER = new SmartAnalyzer();
short MAX_CHANNEL = 10000;
/**
* Calculate number of counts in the given channel
*
* @param spectrum
* @param loChannel
* @param upChannel
* @return
*/
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;
}).mapToLong(it -> it.getValue(COUNT_KEY).numberValue().longValue()).sum();
}
String CHANNEL_KEY = "channel";
String COUNT_KEY = "count";
String LENGTH_KEY = "length";
String COUNT_RATE_KEY = "cr";
String COUNT_RATE_ERROR_KEY = "crErr";
/**
* Perform analysis on block. The values for count rate, its error and point length in nanos must
* exist, but occasionally additional values could also be presented.
*
* @param block
* @return
*/
Values analyze(NumassBlock block, Meta config);
/**
* Analysis result for point including hv information
* @param point
* @param config
* @return
*/
default Values analyzePoint(NumassPoint point, Meta config) {
Map<String, Value> map = new HashMap<>(analyze(point, config).asMap());
map.put(HV_KEY, Value.of(point.getVoltage()));
return new ValueMap(map);
}
/**
* Return unsorted stream of events including events from frames
*
* @param block
* @return
*/
Stream<NumassEvent> getEvents(NumassBlock block, Meta meta);
/**
* Analyze the whole set. And return results as a table
*
* @param set
* @param config
* @return
*/
Table analyzeSet(NumassSet set, Meta config);
/**
* Calculate the energy spectrum for a given block. The s
*
* @param block
* @param config
* @return
*/
default Table getSpectrum(NumassBlock block, Meta config) {
TableFormat format = new TableFormatBuilder()
.addNumber(CHANNEL_KEY, X_VALUE_KEY)
.addNumber(COUNT_KEY)
.addNumber(COUNT_RATE_KEY, Y_VALUE_KEY)
.addNumber(COUNT_RATE_ERROR_KEY, Y_ERROR_KEY)
.updateMeta(metaBuilder -> metaBuilder.setNode("config", config))
.build();
//optimized for fastest computation
//TODO requires additional performance optimization
AtomicLong[] spectrum = new AtomicLong[MAX_CHANNEL];
getEvents(block, config).forEach(event -> {
if (spectrum[event.getChanel()] == null) {
spectrum[event.getChanel()] = new AtomicLong(1);
} else {
spectrum[event.getChanel()].incrementAndGet();
}
});
double seconds = (double) block.getLength().toMillis() / 1000d;
return new ListTable.Builder(format)
.rows(IntStream.range(0, MAX_CHANNEL)
.filter(i -> spectrum[i] != null)
.mapToObj(i -> {
long value = spectrum[i].get();
return ValueMap.of(
format.namesAsArray(),
i,
value,
(double) value / seconds,
Math.sqrt(value) / seconds
);
})
).build();
}
/**
* Get the approximate number of events in block. Not all analyzers support precise event counting
*
* @param block
* @param config
* @return
*/
default long getCount(NumassBlock block, Meta config) {
return analyze(block, config).getValue(COUNT_KEY).numberValue().longValue();
}
/**
* Get approximate effective point length in nanos. It is not necessary corresponds to real point length.
*
* @param block
* @param config
* @return
*/
default long getLength(NumassBlock block, Meta config) {
return analyze(block, config).getValue(LENGTH_KEY).numberValue().longValue();
}
}