fix hg
This commit is contained in:
parent
5e8db547eb
commit
4f8b2fef11
@ -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)
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user