Compare commits

...

12 Commits
main ... dev

Author SHA1 Message Date
232669af80 Updates and fixes 2023-10-25 20:22:20 +03:00
b7618cc08f update build versions 2023-10-09 13:35:39 +03:00
bbfa0483b6 update version 2023-01-24 21:22:05 +03:00
047551fef7 update version 2023-01-24 21:10:16 +03:00
43d79db6bb Fix derivative for the spectrum and introduce fit example 2023-01-24 21:07:04 +03:00
26f5e7461c Merge branch 'feature/data-viewer' into dev
# Conflicts:
#	build.gradle.kts
#	gradle.properties
#	gradle/wrapper/gradle-wrapper.properties
#	kotlin-js-store/yarn.lock
#	numass-analysis/build.gradle.kts
#	numass-data-proto/build.gradle.kts
#	numass-data-server/build.gradle.kts
#	numass-workspace/build.gradle.kts
#	numass-workspace/src/main/kotlin/ru/inr/mass/workspace/Numass.kt
#	numass-workspace/src/main/kotlin/ru/inr/mass/workspace/NumassPlugin.kt
#	settings.gradle.kts
2023-01-24 15:34:40 +03:00
64bae18644 Add explicit path to repository in viewer 2023-01-24 15:27:14 +03:00
cf02b2d8ba Add fit demo (not working yet) 2023-01-24 13:05:38 +03:00
d9b4707da1 Update versions 2023-01-24 12:08:29 +03:00
17d681bd42
Add response type 2022-12-06 22:51:09 +03:00
e95f73d94d
Working on data viewer UI 2022-12-06 22:49:02 +03:00
4c67d8b0a0
Cloud read 2022-03-08 23:25:23 +03:00
31 changed files with 705 additions and 297 deletions

View File

@ -1,3 +1,6 @@
import space.kscience.gradle.useApache2Licence
import space.kscience.gradle.useSPCTeam
plugins {
id("space.kscience.gradle.project")
}
@ -10,17 +13,22 @@ allprojects {
}
group = "ru.inr.mass"
version = "0.1.3"
version = "0.1.4-dev-3"
}
val dataforgeVersion by extra("0.6.0-dev-15")
val tablesVersion: String by extra("0.2.0-dev-3")
val kmathVersion by extra("0.3.1-dev-6")
val visionForgeVersion: String by rootProject.extra("0.3.0-dev-4")
val dataforgeVersion by extra("0.6.2")
val tablesVersion: String by extra("0.2.1")
val kmathVersion by extra("0.3.1")
val visionForgeVersion: String by rootProject.extra("0.3.0-dev-14")
ksciencePublish{
space("https://maven.pkg.jetbrains.space/mipt-npm/p/numass/maven")
ksciencePublish {
pom("https://spc.jetbrains.space/p/numass/repositories/numass/") {
useApache2Licence()
useSPCTeam()
}
space("https://maven.pkg.jetbrains.space/spc/p/numass/maven")
//repository("spc","https://maven.sciprog.center/spc")
}
apiValidation {

View File

@ -5,11 +5,11 @@
kotlin.code.style=official
kotlin.mpp.stability.nowarn=true
kotlin.jupyter.add.scanner=false
kotlin.js.compiler=ir
org.gradle.configureondemand=true
org.gradle.parallel=true
org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G
toolsVersion=0.13.3-kotlin-1.7.20
toolsVersion=0.14.10-kotlin-1.9.0
compose.version=1.5.3

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -8,7 +8,9 @@ val dataforgeVersion: String by rootProject.extra
val kmathVersion: String by rootProject.extra
val tablesVersion: String by rootProject.extra
kotlin.sourceSets {
kscience {
jvm()
js()
commonMain {
dependencies {
api(projects.numass.numassDataModel)
@ -20,7 +22,7 @@ kotlin.sourceSets {
}
}
}
//
//kscience{
// useAtomic()
//}

View File

@ -6,7 +6,11 @@ plugins {
val dataforgeVersion: String by rootProject.extra
kotlin.sourceSets {
kscience{
jvm()
js()
useSerialization()
commonMain {
dependencies {
api("space.kscience:dataforge-context:$dataforgeVersion")
@ -14,15 +18,14 @@ kotlin.sourceSets {
api("org.jetbrains.kotlinx:kotlinx-datetime:${space.kscience.gradle.KScienceVersions.dateTimeVersion}")
}
}
jvmMain{
}
kotlin.sourceSets{
getByName("jvmMain"){
dependencies{
api("ch.qos.logback:logback-classic:1.2.3")
}
}
}
kscience{
useSerialization()
}

View File

@ -1,6 +1,6 @@
plugins {
id("space.kscience.gradle.jvm")
id("com.squareup.wire") version "4.4.1"
id("com.squareup.wire") version "4.9.1"
`maven-publish`
}

View File

@ -4,6 +4,7 @@ package ru.inr.mass.`data`.proto
import com.squareup.wire.*
import com.squareup.wire.Syntax.PROTO_3
import com.squareup.wire.internal.JvmField
import com.squareup.wire.internal.immutableCopyOf
import com.squareup.wire.internal.redactElements
import okio.ByteString
@ -19,6 +20,7 @@ public class Point(
tag = 1,
adapter = "ru.inr.mass.data.proto.Point${'$'}Channel#ADAPTER",
label = WireField.Label.REPEATED,
schemaIndex = 0,
)
public val channels: List<Channel> = immutableCopyOf("channels", channels)
@ -26,10 +28,10 @@ public class Point(
message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN,
)
public override fun newBuilder(): Nothing = throw
override fun newBuilder(): Nothing = throw
AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin")
public override fun equals(other: Any?): Boolean {
override fun equals(other: Any?): Boolean {
if (other === this) return true
if (other !is Point) return false
if (unknownFields != other.unknownFields) return false
@ -37,7 +39,7 @@ public class Point(
return true
}
public override fun hashCode(): Int {
override fun hashCode(): Int {
var result = super.hashCode
if (result == 0) {
result = unknownFields.hashCode()
@ -47,7 +49,7 @@ public class Point(
return result
}
public override fun toString(): String {
override fun toString(): String {
val result = mutableListOf<String>()
if (channels.isNotEmpty()) result += """channels=$channels"""
return result.joinToString(prefix = "Point{", separator = ", ", postfix = "}")
@ -66,23 +68,23 @@ public class Point(
null,
"numass-proto.proto"
) {
public override fun encodedSize(`value`: Point): Int {
override fun encodedSize(`value`: Point): Int {
var size = value.unknownFields.size
size += Channel.ADAPTER.asRepeated().encodedSizeWithTag(1, value.channels)
return size
}
public override fun encode(writer: ProtoWriter, `value`: Point): Unit {
override fun encode(writer: ProtoWriter, `value`: Point) {
Channel.ADAPTER.asRepeated().encodeWithTag(writer, 1, value.channels)
writer.writeBytes(value.unknownFields)
}
public override fun encode(writer: ReverseProtoWriter, `value`: Point): Unit {
override fun encode(writer: ReverseProtoWriter, `value`: Point) {
writer.writeBytes(value.unknownFields)
Channel.ADAPTER.asRepeated().encodeWithTag(writer, 1, value.channels)
}
public override fun decode(reader: ProtoReader): Point {
override fun decode(reader: ProtoReader): Point {
val channels = mutableListOf<Channel>()
val unknownFields = reader.forEachTag { tag ->
when (tag) {
@ -96,7 +98,7 @@ public class Point(
)
}
public override fun redact(`value`: Point): Point = value.copy(
override fun redact(`value`: Point): Point = value.copy(
channels = value.channels.redactElements(Channel.ADAPTER),
unknownFields = ByteString.EMPTY
)
@ -116,6 +118,7 @@ public class Point(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 0,
)
public val id: Long = 0L,
blocks: List<Block> = emptyList(),
@ -128,6 +131,7 @@ public class Point(
tag = 2,
adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block#ADAPTER",
label = WireField.Label.REPEATED,
schemaIndex = 1,
)
public val blocks: List<Block> = immutableCopyOf("blocks", blocks)
@ -135,10 +139,10 @@ public class Point(
message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN,
)
public override fun newBuilder(): Nothing = throw
override fun newBuilder(): Nothing = throw
AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin")
public override fun equals(other: Any?): Boolean {
override fun equals(other: Any?): Boolean {
if (other === this) return true
if (other !is Channel) return false
if (unknownFields != other.unknownFields) return false
@ -147,7 +151,7 @@ public class Point(
return true
}
public override fun hashCode(): Int {
override fun hashCode(): Int {
var result = super.hashCode
if (result == 0) {
result = unknownFields.hashCode()
@ -158,7 +162,7 @@ public class Point(
return result
}
public override fun toString(): String {
override fun toString(): String {
val result = mutableListOf<String>()
result += """id=$id"""
if (blocks.isNotEmpty()) result += """blocks=$blocks"""
@ -181,26 +185,26 @@ public class Point(
null,
"numass-proto.proto"
) {
public override fun encodedSize(`value`: Channel): Int {
override fun encodedSize(`value`: Channel): Int {
var size = value.unknownFields.size
if (value.id != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.id)
size += Block.ADAPTER.asRepeated().encodedSizeWithTag(2, value.blocks)
return size
}
public override fun encode(writer: ProtoWriter, `value`: Channel): Unit {
override fun encode(writer: ProtoWriter, `value`: Channel) {
if (value.id != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.id)
Block.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.blocks)
writer.writeBytes(value.unknownFields)
}
public override fun encode(writer: ReverseProtoWriter, `value`: Channel): Unit {
override fun encode(writer: ReverseProtoWriter, `value`: Channel) {
writer.writeBytes(value.unknownFields)
Block.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.blocks)
if (value.id != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.id)
}
public override fun decode(reader: ProtoReader): Channel {
override fun decode(reader: ProtoReader): Channel {
var id: Long = 0L
val blocks = mutableListOf<Block>()
val unknownFields = reader.forEachTag { tag ->
@ -217,7 +221,7 @@ public class Point(
)
}
public override fun redact(`value`: Channel): Channel = value.copy(
override fun redact(`value`: Channel): Channel = value.copy(
blocks = value.blocks.redactElements(Block.ADAPTER),
unknownFields = ByteString.EMPTY
)
@ -237,6 +241,7 @@ public class Point(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 0,
)
public val time: Long = 0L,
frames: List<Frame> = emptyList(),
@ -247,6 +252,7 @@ public class Point(
tag = 3,
adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block${'$'}Events#ADAPTER",
label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 2,
)
public val events: Events? = null,
/**
@ -256,6 +262,7 @@ public class Point(
tag = 4,
adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 3,
)
public val length: Long = 0L,
/**
@ -266,6 +273,7 @@ public class Point(
adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY,
jsonName = "binSize",
schemaIndex = 4,
)
public val bin_size: Long = 0L,
unknownFields: ByteString = ByteString.EMPTY,
@ -277,6 +285,7 @@ public class Point(
tag = 2,
adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block${'$'}Frame#ADAPTER",
label = WireField.Label.REPEATED,
schemaIndex = 1,
)
public val frames: List<Frame> = immutableCopyOf("frames", frames)
@ -284,10 +293,10 @@ public class Point(
message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN,
)
public override fun newBuilder(): Nothing = throw
override fun newBuilder(): Nothing = throw
AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin")
public override fun equals(other: Any?): Boolean {
override fun equals(other: Any?): Boolean {
if (other === this) return true
if (other !is Block) return false
if (unknownFields != other.unknownFields) return false
@ -299,7 +308,7 @@ public class Point(
return true
}
public override fun hashCode(): Int {
override fun hashCode(): Int {
var result = super.hashCode
if (result == 0) {
result = unknownFields.hashCode()
@ -313,7 +322,7 @@ public class Point(
return result
}
public override fun toString(): String {
override fun toString(): String {
val result = mutableListOf<String>()
result += """time=$time"""
if (frames.isNotEmpty()) result += """frames=$frames"""
@ -342,7 +351,7 @@ public class Point(
null,
"numass-proto.proto"
) {
public override fun encodedSize(`value`: Block): Int {
override fun encodedSize(`value`: Block): Int {
var size = value.unknownFields.size
if (value.time != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.time)
size += Frame.ADAPTER.asRepeated().encodedSizeWithTag(2, value.frames)
@ -353,7 +362,7 @@ public class Point(
return size
}
public override fun encode(writer: ProtoWriter, `value`: Block): Unit {
override fun encode(writer: ProtoWriter, `value`: Block) {
if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time)
Frame.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.frames)
if (value.events != null) Events.ADAPTER.encodeWithTag(writer, 3, value.events)
@ -362,7 +371,7 @@ public class Point(
writer.writeBytes(value.unknownFields)
}
public override fun encode(writer: ReverseProtoWriter, `value`: Block): Unit {
override fun encode(writer: ReverseProtoWriter, `value`: Block) {
writer.writeBytes(value.unknownFields)
if (value.bin_size != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 5, value.bin_size)
if (value.length != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 4, value.length)
@ -371,7 +380,7 @@ public class Point(
if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time)
}
public override fun decode(reader: ProtoReader): Block {
override fun decode(reader: ProtoReader): Block {
var time: Long = 0L
val frames = mutableListOf<Frame>()
var events: Events? = null
@ -397,7 +406,7 @@ public class Point(
)
}
public override fun redact(`value`: Block): Block = value.copy(
override fun redact(`value`: Block): Block = value.copy(
frames = value.frames.redactElements(Frame.ADAPTER),
events = value.events?.let(Events.ADAPTER::redact),
unknownFields = ByteString.EMPTY
@ -418,6 +427,7 @@ public class Point(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 0,
)
public val time: Long = 0L,
/**
@ -428,6 +438,7 @@ public class Point(
adapter = "com.squareup.wire.ProtoAdapter#BYTES",
label = WireField.Label.OMIT_IDENTITY,
declaredName = "data",
schemaIndex = 1,
)
public val data_: ByteString = ByteString.EMPTY,
unknownFields: ByteString = ByteString.EMPTY,
@ -436,10 +447,10 @@ public class Point(
message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN,
)
public override fun newBuilder(): Nothing = throw
override fun newBuilder(): Nothing = throw
AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin")
public override fun equals(other: Any?): Boolean {
override fun equals(other: Any?): Boolean {
if (other === this) return true
if (other !is Frame) return false
if (unknownFields != other.unknownFields) return false
@ -448,7 +459,7 @@ public class Point(
return true
}
public override fun hashCode(): Int {
override fun hashCode(): Int {
var result = super.hashCode
if (result == 0) {
result = unknownFields.hashCode()
@ -459,7 +470,7 @@ public class Point(
return result
}
public override fun toString(): String {
override fun toString(): String {
val result = mutableListOf<String>()
result += """time=$time"""
result += """data_=$data_"""
@ -482,7 +493,7 @@ public class Point(
null,
"numass-proto.proto"
) {
public override fun encodedSize(`value`: Frame): Int {
override fun encodedSize(`value`: Frame): Int {
var size = value.unknownFields.size
if (value.time != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.time)
if (value.data_ != ByteString.EMPTY) size += ProtoAdapter.BYTES.encodedSizeWithTag(2,
@ -490,21 +501,21 @@ public class Point(
return size
}
public override fun encode(writer: ProtoWriter, `value`: Frame): Unit {
override fun encode(writer: ProtoWriter, `value`: Frame) {
if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time)
if (value.data_ != ByteString.EMPTY) ProtoAdapter.BYTES.encodeWithTag(writer, 2,
value.data_)
writer.writeBytes(value.unknownFields)
}
public override fun encode(writer: ReverseProtoWriter, `value`: Frame): Unit {
override fun encode(writer: ReverseProtoWriter, `value`: Frame) {
writer.writeBytes(value.unknownFields)
if (value.data_ != ByteString.EMPTY) ProtoAdapter.BYTES.encodeWithTag(writer, 2,
value.data_)
if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time)
}
public override fun decode(reader: ProtoReader): Frame {
override fun decode(reader: ProtoReader): Frame {
var time: Long = 0L
var data_: ByteString = ByteString.EMPTY
val unknownFields = reader.forEachTag { tag ->
@ -521,7 +532,7 @@ public class Point(
)
}
public override fun redact(`value`: Frame): Frame = value.copy(
override fun redact(`value`: Frame): Frame = value.copy(
unknownFields = ByteString.EMPTY
)
}
@ -547,6 +558,7 @@ public class Point(
tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.PACKED,
schemaIndex = 0,
)
public val times: List<Long> = immutableCopyOf("times", times)
@ -557,6 +569,7 @@ public class Point(
tag = 2,
adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.PACKED,
schemaIndex = 1,
)
public val amplitudes: List<Long> = immutableCopyOf("amplitudes", amplitudes)
@ -564,10 +577,10 @@ public class Point(
message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN,
)
public override fun newBuilder(): Nothing = throw
override fun newBuilder(): Nothing = throw
AssertionError("Builders are deprecated and only available in a javaInterop build; see https://square.github.io/wire/wire_compiler/#kotlin")
public override fun equals(other: Any?): Boolean {
override fun equals(other: Any?): Boolean {
if (other === this) return true
if (other !is Events) return false
if (unknownFields != other.unknownFields) return false
@ -576,7 +589,7 @@ public class Point(
return true
}
public override fun hashCode(): Int {
override fun hashCode(): Int {
var result = super.hashCode
if (result == 0) {
result = unknownFields.hashCode()
@ -587,7 +600,7 @@ public class Point(
return result
}
public override fun toString(): String {
override fun toString(): String {
val result = mutableListOf<String>()
if (times.isNotEmpty()) result += """times=$times"""
if (amplitudes.isNotEmpty()) result += """amplitudes=$amplitudes"""
@ -610,43 +623,61 @@ public class Point(
null,
"numass-proto.proto"
) {
public override fun encodedSize(`value`: Events): Int {
override fun encodedSize(`value`: Events): Int {
var size = value.unknownFields.size
size += ProtoAdapter.UINT64.asPacked().encodedSizeWithTag(1, value.times)
size += ProtoAdapter.UINT64.asPacked().encodedSizeWithTag(2, value.amplitudes)
return size
}
public override fun encode(writer: ProtoWriter, `value`: Events): Unit {
override fun encode(writer: ProtoWriter, `value`: Events) {
ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 1, value.times)
ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 2, value.amplitudes)
writer.writeBytes(value.unknownFields)
}
public override fun encode(writer: ReverseProtoWriter, `value`: Events): Unit {
override fun encode(writer: ReverseProtoWriter, `value`: Events) {
writer.writeBytes(value.unknownFields)
ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 2, value.amplitudes)
ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 1, value.times)
}
public override fun decode(reader: ProtoReader): Events {
val times = mutableListOf<Long>()
val amplitudes = mutableListOf<Long>()
override fun decode(reader: ProtoReader): Events {
var times: MutableList<Long>? = null
var amplitudes: MutableList<Long>? = null
val unknownFields = reader.forEachTag { tag ->
when (tag) {
1 -> times.add(ProtoAdapter.UINT64.decode(reader))
2 -> amplitudes.add(ProtoAdapter.UINT64.decode(reader))
1 -> {
if (times == null) {
val minimumByteSize = 1
val initialCapacity = (reader.nextFieldMinLengthInBytes() / minimumByteSize)
.coerceAtMost(Int.MAX_VALUE.toLong())
.toInt()
times = ArrayList(initialCapacity)
}
times!!.add(ProtoAdapter.UINT64.decode(reader))
}
2 -> {
if (amplitudes == null) {
val minimumByteSize = 1
val initialCapacity = (reader.nextFieldMinLengthInBytes() / minimumByteSize)
.coerceAtMost(Int.MAX_VALUE.toLong())
.toInt()
amplitudes = ArrayList(initialCapacity)
}
amplitudes!!.add(ProtoAdapter.UINT64.decode(reader))
}
else -> reader.readUnknownField(tag)
}
}
return Events(
times = times,
amplitudes = amplitudes,
times = times ?: listOf(),
amplitudes = amplitudes ?: listOf(),
unknownFields = unknownFields
)
}
public override fun redact(`value`: Events): Events = value.copy(
override fun redact(`value`: Events): Events = value.copy(
unknownFields = ByteString.EMPTY
)
}

View File

@ -20,7 +20,6 @@ import java.nio.file.Path
import kotlin.io.path.exists
import kotlin.io.path.isDirectory
import kotlin.io.path.relativeTo
import kotlin.reflect.KClass
public class NumassProtoPlugin : AbstractPlugin() {
public val io: IOPlugin by require(IOPlugin)
@ -35,7 +34,6 @@ public class NumassProtoPlugin : AbstractPlugin() {
public companion object : PluginFactory<NumassProtoPlugin> {
override fun build(context: Context, meta: Meta): NumassProtoPlugin = NumassProtoPlugin()
override val tag: PluginTag = PluginTag("numass-proto", group = "ru.inr.mass")
override val type: KClass<out NumassProtoPlugin> = NumassProtoPlugin::class
}
}

View File

@ -39,24 +39,8 @@ public class TaggedNumassEnvelopeFormat(private val io: IOPlugin) : EnvelopeForm
writeRawString(END_SEQUENCE)
}
override fun writeEnvelope(
output: Output,
envelope: Envelope,
metaFormatFactory: MetaFormatFactory,
formatMeta: Meta,
) {
override fun writeObject(output: Output, obj: Envelope) {
error("Don't write legacy formats")
// val metaFormat = metaFormatFactory.invoke(formatMeta, io.context)
// val metaBytes = metaFormat.toBinary(envelope.meta)
// val actualSize: ULong = (envelope.data?.size ?: 0).toULong()
// val tag = Tag(metaFormatFactory.key, metaBytes.size.toUInt() + 2u, actualSize)
// output.writeBinary(tag.toBinary())
// output.writeBinary(metaBytes)
// output.writeRawString("\r\n")
// envelope.data?.let {
// output.writeBinary(it)
// }
// output.flush()
}
/**
@ -68,31 +52,30 @@ public class TaggedNumassEnvelopeFormat(private val io: IOPlugin) : EnvelopeForm
override fun readObject(input: Input): Envelope {
val tag = input.readTag()
val metaFormat = io.resolveMetaFormat(tag.metaFormatKey)
?: error("Meta format with key ${tag.metaFormatKey} not found")
val metaFormat = io.resolveMetaFormat(tag.metaFormatKey) ?: JsonMetaFormat
val meta: Meta = metaFormat.readObjectFrom(input.readBinary(tag.metaSize.toInt()))
val data = input.readBinary(tag.dataSize.toInt())
return SimpleEnvelope(meta, data)
}
override fun readPartial(input: Input): PartialEnvelope {
val tag = input.readTag()
val metaFormat = if (tag.metaFormatKey == 1.toShort()) {
JsonMetaFormat
} else {
io.resolveMetaFormat(tag.metaFormatKey)
?: error("Meta format with key ${tag.metaFormatKey} not found")
}
val meta: Meta = metaFormat.readObjectFrom(input.readBinary(tag.metaSize.toInt()))
return PartialEnvelope(meta, 30 + tag.metaSize.toInt(), tag.dataSize)
return Envelope(meta, data)
}
//
// override fun readPartial(input: Input): PartialEnvelope {
// val tag = input.readTag()
//
// val metaFormat = if (tag.metaFormatKey == 1.toShort()) {
// JsonMetaFormat
// } else {
// io.resolveMetaFormat(tag.metaFormatKey)
// ?: error("Meta format with key ${tag.metaFormatKey} not found")
// }
//
// val meta: Meta = metaFormat.readObjectFrom(input.readBinary(tag.metaSize.toInt()))
//
//
// return PartialEnvelope(meta, 30 + tag.metaSize.toInt(), tag.dataSize)
// }
private data class Tag(
val metaFormatKey: Short,
@ -149,23 +132,11 @@ public class TaggedNumassEnvelopeFormat(private val io: IOPlugin) : EnvelopeForm
private val default by lazy { invoke() }
override fun readPartial(input: Input): PartialEnvelope =
default.run { readPartial(input) }
override fun writeEnvelope(
output: Output,
envelope: Envelope,
metaFormatFactory: MetaFormatFactory,
formatMeta: Meta,
): Unit = default.run {
writeEnvelope(
output,
envelope,
metaFormatFactory,
formatMeta
)
override fun writeObject(output: Output, obj: Envelope) {
error("Don't write legacy formats")
}
override fun readObject(input: Input): Envelope = default.readObject(input)
}
}

View File

@ -1,5 +1,6 @@
plugins {
id("space.kscience.gradle.mpp")
id("org.jetbrains.compose")
`maven-publish`
}
@ -7,17 +8,17 @@ val visionForgeVersion: String by rootProject.extra
val production: Boolean by rootProject.extra(true)
kotlin {
js(IR) {
browser {
webpackTask {
this.outputFileName = "js/numass-web.js"
}
}
binaries.executable()
kscience {
fullStack("js/numass-web.js")
useSerialization {
json()
}
sourceSets {
useContextReceivers()
useKtor()
commonMain {
dependencies {
implementation(project(":numass-data-model"))
@ -25,36 +26,23 @@ kotlin {
implementation("space.kscience:visionforge-plotly:$visionForgeVersion")
}
}
jvmMain {
dependencies {
}
kotlin{
sourceSets{
getByName("jvmMain"){
dependencies{
implementation(compose.runtime)
implementation(project(":numass-data-proto"))
implementation("space.kscience:visionforge-server:$visionForgeVersion")
implementation("io.ktor:ktor-server-cio")
implementation("io.ktor:ktor-server-html-builder")
implementation("space.kscience:visionforge-plotly:$visionForgeVersion")
}
}
getByName("jsMain"){
dependencies{
implementation(compose.html.core)
}
}
afterEvaluate {
val distributionTask = if (production) {
tasks.getByName("jsBrowserDistribution")
} else {
tasks.getByName("jsBrowserDevelopmentExecutableDistribution")
}
tasks.getByName<ProcessResources>("jvmProcessResources") {
dependsOn(distributionTask)
from(distributionTask)
include("**/*.js")
if (production) {
include("**/*.map")
}
}
}
kscience {
useSerialization {
json()
}
withContextReceivers()
}

View File

@ -9,7 +9,6 @@ import space.kscience.dataforge.context.PluginTag
import space.kscience.dataforge.meta.Meta
import space.kscience.visionforge.Vision
import space.kscience.visionforge.VisionPlugin
import kotlin.reflect.KClass
public class NumassCommonPlugin(meta: Meta = Meta.EMPTY) : VisionPlugin(meta) {
override val tag: PluginTag get() = Companion.tag
@ -18,7 +17,6 @@ public class NumassCommonPlugin(meta: Meta = Meta.EMPTY) : VisionPlugin(meta) {
public companion object : PluginFactory<NumassCommonPlugin> {
override val tag: PluginTag = PluginTag("numass.common", "ru.inr.mass")
override val type: KClass<NumassCommonPlugin> = NumassCommonPlugin::class
override fun build(context: Context, meta: Meta): NumassCommonPlugin = NumassCommonPlugin()

View File

@ -12,16 +12,16 @@ import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.asName
import space.kscience.plotly.models.LineShape
import space.kscience.plotly.models.ScatterMode
import space.kscience.plotly.plotElement
import space.kscience.plotly.plotDiv
import space.kscience.plotly.scatter
import space.kscience.visionforge.ElementVisionRenderer
import space.kscience.visionforge.JsVisionClient
import space.kscience.visionforge.Vision
import space.kscience.visionforge.VisionClient
import space.kscience.visionforge.plotly.PlotlyPlugin
import kotlin.reflect.KClass
public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer {
public val client: VisionClient by require(VisionClient)
public val client: VisionClient by require(JsVisionClient)
public val numassCommon: NumassCommonPlugin by require(NumassCommonPlugin)
public val plotly: PlotlyPlugin by require(PlotlyPlugin)
@ -37,7 +37,7 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer {
else -> super.content(target)
}
override fun render(element: Element, vision: Vision, meta: Meta) {
override fun render(element: Element, name: Name, vision: Vision, meta: Meta) {
when (vision) {
is VisionOfNumassHv -> element.append {
h1 { +"HV" }
@ -60,11 +60,11 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer {
is VisionOfNumassPoint -> element.append {
h1 { +"Point" }
plotElement {
plotDiv {
vision.spectra.forEach { (channel, spectrum) ->
val pairs = spectrum.entries.sortedBy { it.key }
scatter {
name = channel
this.name = channel
mode = ScatterMode.lines
line {
shape = LineShape.hv
@ -83,8 +83,6 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer {
public companion object : PluginFactory<NumassJsPlugin> {
override val tag: PluginTag = PluginTag("numass.js", "ru.inr.mass")
override val type: KClass<NumassJsPlugin> = NumassJsPlugin::class
override fun build(context: Context, meta: Meta): NumassJsPlugin = NumassJsPlugin()
}

View File

@ -0,0 +1,27 @@
package ru.inr.mass.data.server
import org.jetbrains.compose.web.dom.Div
import org.jetbrains.compose.web.renderComposable
import org.w3c.dom.Document
import space.kscience.dataforge.context.Context
import space.kscience.visionforge.Application
public class NumassViewerApplication : Application {
private val context = Context("NumassViewer") {
plugin(NumassJsPlugin)
}
override fun start(document: Document, state: Map<String, Any>) {
renderComposable(rootElementId = "application") {
Div({ classes("container") }) {
Div({ classes("row") })
Div({ classes("col-md-3") }) {
}
Div({ classes("col-md-9") }) {
}
}
}
}
}

View File

@ -1,15 +1,20 @@
package ru.inr.mass.data.server
import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode
import io.ktor.http.URLBuilder
import io.ktor.server.application.Application
import io.ktor.server.application.call
import io.ktor.server.cio.CIO
import io.ktor.server.engine.embeddedServer
import io.ktor.server.html.respondHtml
import io.ktor.server.http.content.resources
import io.ktor.server.response.respondText
import io.ktor.server.routing.get
import io.ktor.server.routing.routing
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
import kotlinx.html.*
import ru.inr.mass.data.api.NumassPoint
import ru.inr.mass.data.proto.NumassDirectorySet
import ru.inr.mass.data.proto.NumassProtoPlugin
@ -22,12 +27,15 @@ import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.NameToken
import space.kscience.dataforge.names.cutLast
import space.kscience.dataforge.names.lastOrNull
import space.kscience.visionforge.server.close
import space.kscience.visionforge.server.openInBrowser
import space.kscience.visionforge.server.visionServer
public suspend fun main() {
public fun main() {
val port = 7777
val host = "localhost"
embeddedServer(CIO, port, host, module = Application::numassModule).start()
}
public fun Application.numassModule(repositoryName: String = "D:\\Work\\Numass\\data\\test") {
val context = Context("Numass") {
plugin(NumassProtoPlugin)
plugin(NumassCommonPlugin)
@ -37,23 +45,47 @@ public suspend fun main() {
val numassCommon = context.fetch(NumassCommonPlugin)
val visionManager = numassCommon.visionManager
val repository: DataTree<NumassDirectorySet> = runBlocking { numassProto.readRepository(repositoryName) }
val repositroyName = "D:\\Work\\Numass\\data\\test"
val port = 7777
val host = "localhost"
val url = URLBuilder(host = host, port = port).build()
val repository: DataTree<NumassDirectorySet> = numassProto.readRepository(repositroyName)
val visionOfNumassRepository = VisionOfNumassRepository(Name.EMPTY, repository)
val server = context.embeddedServer(CIO, port, host) {
routing {
resources()
get("/") {
call.respondHtml {
head {
meta { charset = "utf-8" }
meta {
name = "viewport"
content = "width=device-width, initial-scale=1"
}
title("Numass Data Viewer")
link {
href = "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css"
rel = "stylesheet"
attributes["integrity"] =
"sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65"
attributes["crossorigin"] = "anonymous"
}
}
body {
div {
id = "application"
}
script {
src = "js/numass-web.js"
}
script {
src = "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"
integrity = "sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4"
attributes["crossorigin"] = "anonymous"
}
}
}
}
get("/repository") {
call.respondText {
visionManager.encodeToString(visionOfNumassRepository)
call.respondText(ContentType.Application.Json) {
visionManager.encodeToString(VisionOfNumassRepository(Name.EMPTY, repository))
}
}
@ -72,7 +104,7 @@ public suspend fun main() {
return@get
}
call.respondText {
call.respondText(ContentType.Application.Json) {
visionManager.encodeToString(VisionOfNumassSet(setName, set))
}
}
@ -101,32 +133,10 @@ public suspend fun main() {
call.respondText(status = HttpStatusCode.NotFound) { "A point with name $setName/$pointIndex not found in the repository" }
return@get
}
call.respondText {
call.respondText(ContentType.Application.Json) {
visionManager.encodeToString(point.toVision())
}
}
}
visionServer(numassCommon.visionManager, url)
}.start()
// val server = context.visionManager.serve {
// header("numass", VisionPage.scriptHeader("js/numass-web.js"))
// page {
// div("flex-column") {
// h1 { +"Visionforge file demo" }
// vision { visionOfNumass }
// }
// }
// }
server.openInBrowser()
println("Enter 'exit' to close server")
while (readLine() != "exit") {
//
}
server.close()
//serveVisionData(VisionRoute("/visions", visionManager))
}

View File

@ -2,11 +2,8 @@ package ru.inr.mass.data.server
import space.kscience.dataforge.context.Context
import space.kscience.dataforge.misc.DFExperimental
import space.kscience.visionforge.html.HtmlVisionFragment
import space.kscience.visionforge.html.ResourceLocation
import space.kscience.visionforge.html.VisionPage
import space.kscience.visionforge.html.importScriptHeader
import space.kscience.visionforge.makeFile
import space.kscience.visionforge.html.*
import space.kscience.visionforge.visionManager
import java.awt.Desktop
import java.nio.file.Path
@ -19,7 +16,7 @@ public fun Context.makeNumassWebFile(
show: Boolean = true,
content: HtmlVisionFragment,
): Unit {
val actualPath = VisionPage(this, content = content).makeFile(path) { actualPath: Path ->
val actualPath = VisionPage(visionManager, content = content).makeFile(path) { actualPath: Path ->
mapOf(
"title" to VisionPage.title(title),
"numassWeb" to VisionPage.importScriptHeader("js/numass-web.js", resourceLocation, actualPath)

View File

@ -7,7 +7,9 @@ plugins {
val dataforgeVersion: String by rootProject.extra
val kmathVersion: String by rootProject.extra
kotlin.sourceSets {
kscience{
jvm()
js()
commonMain {
dependencies {
api("space.kscience:dataforge-context:$dataforgeVersion")
@ -15,7 +17,10 @@ kotlin.sourceSets {
api("space.kscience:kmath-functions:$kmathVersion")
}
}
jvmMain {
}
kotlin.sourceSets{
getByName("jvmMain"){
dependencies {
api("space.kscience:kmath-commons:$kmathVersion")
api("ch.qos.logback:logback-classic:1.2.3")

View File

@ -15,10 +15,10 @@
*/
package ru.inr.mass.models
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.data.ColumnarData
import space.kscience.kmath.expressions.Symbol
import space.kscience.kmath.expressions.symbol
import space.kscience.kmath.misc.UnstableKMathAPI
import space.kscience.kmath.structures.Buffer

View File

@ -32,8 +32,8 @@ public class NBkgSpectrum(public val source: Spectrum) : DifferentiableSpectrum
override fun derivativeOrNull(symbols: List<Symbol>): Spectrum? = when {
symbols.isEmpty() -> this
symbols.size == 1 -> when (symbols.first()) {
norm -> Spectrum { x, arguments -> source(x, arguments) + (arguments[bkg] ?: 0.0) }
bkg -> Spectrum { x, arguments -> (arguments[norm] ?: 1.0) * source(x, arguments) }
norm -> Spectrum { x, arguments -> source(x, arguments) }
bkg -> Spectrum { _, _ -> 1.0 }
else -> (source as? DifferentiableSpectrum)?.derivativeOrNull(symbols)?.let { NBkgSpectrum(it) }
}
else -> null

View File

@ -3,6 +3,8 @@
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
@file:Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
package ru.inr.mass.models
import space.kscience.kmath.expressions.Symbol

View File

@ -12,6 +12,8 @@ import kotlin.math.sqrt
/**
* @author [Alexander Nozik](mailto:altavir@gmail.com)
*/
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
public class NumassResolution(
public val resA: Double = 8.3e-5,
public val resB: Double = 0.0,
@ -43,12 +45,12 @@ public class NumassResolution(
// else -> ResolutionFunction.getConstantTail()
// }
private fun getValueFast(E: Double, U: Double): Double {
val delta = resA * E
private fun getValueFast(e: Double, u: Double): Double {
val delta = resA * e
return when {
E - U < 0 -> 0.0
E - U > delta -> tailFunction(E, U)
else -> (E - U) / delta
e - u < 0 -> 0.0
e - u > delta -> tailFunction(e, u)
else -> (e - u) / delta
}
}
@ -57,15 +59,15 @@ public class NumassResolution(
override val x: Symbol get() = e
override val y: Symbol get() = u
override fun invoke(E: Double, U: Double, arguments: Map<Symbol, Double>): Double {
override fun invoke(e: Double, u: Double, arguments: Map<Symbol, Double>): Double {
if (resB <= 0) {
return this.getValueFast(E, U)
return this.getValueFast(e, u)
}
val delta = resA * E
val delta = resA * e
return when {
E - U < 0 -> 0.0
E - U > delta -> tailFunction(E, U)
else -> (1 - sqrt(1 - (E - U) / E * resB)) / (1 - sqrt(1 - resA * resB))
e - u < 0 -> 0.0
e - u > delta -> tailFunction(e, u)
else -> (1 - sqrt(1 - (e - u) / e * resB)) / (1 - sqrt(1 - resA * resB))
}
}

View File

@ -274,13 +274,13 @@ public class NumassTransmission(
* Значение полной производной функции потерь с учетом всех неисчезающих
* порядков
*
* @param X
* @param thickness
* @param eIn
* @param eOut
* @return
*/
private fun getTotalLossDeriv(X: Double, eIn: Double, eOut: Double): Double {
val probs = getLossProbDerivs(X)
private fun getTotalLossDeriv(thickness: Double, eIn: Double, eOut: Double): Double {
val probs = getLossProbDerivs(thickness)
var sum = 0.0
for (i in 1 until probs.size) {
@ -399,8 +399,8 @@ public class NumassTransmission(
// return getSingleScatterFunction(exPos, ionPos, exW, ionW, exIonRatio)
// }
public val trapFunction: (Double, Double) -> Double = { Ei: Double, Ef: Double ->
val eps = Ei - Ef
public val trapFunction: (Double, Double) -> Double = { ei: Double, ef: Double ->
val eps = ei - ef
if (eps > 10) {
1.86e-04 * exp(-eps / 25.0) + 5.5e-05
} else {

View File

@ -20,7 +20,8 @@ dependencies {
implementation("space.kscience:dataforge-workspace:$dataforgeVersion")
implementation("space.kscience:kmath-jupyter:$kmathVersion")
implementation("space.kscience:tables-kt:$tablesVersion")
implementation("space.kscience:tables-kt-csv:$tablesVersion")
implementation("org.apache.commons:commons-csv:1.10.0")
implementation("space.kscience:visionforge-plotly:$visionForgeVersion")
}

View File

@ -0,0 +1,80 @@
package ru.inr.mass.scripts
import ru.inr.mass.models.*
import ru.inr.mass.workspace.buffer
import ru.inr.mass.workspace.fitWith
import ru.inr.mass.workspace.generate
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.expressions.Symbol
import space.kscience.kmath.expressions.derivative
import space.kscience.kmath.operations.asSequence
import space.kscience.kmath.optimization.*
import space.kscience.kmath.real.step
import space.kscience.plotly.Plotly
import space.kscience.plotly.makeFile
import space.kscience.plotly.models.ScatterMode
import space.kscience.plotly.scatter
import kotlin.math.pow
@OptIn(UnstableKMathAPI::class)
suspend fun main() {
val spectrum: NBkgSpectrum = SterileNeutrinoSpectrum(
fss = FSS.default,
// resolution = NumassResolution(8.2e-5)
).withNBkg()
val args: Map<Symbol, Double> = mapOf(
NBkgSpectrum.norm to 8e5,
NBkgSpectrum.bkg to 2.0,
NumassBeta.mnu2 to 0.0,
NumassBeta.e0 to 18575.0,
NumassBeta.msterile2 to 1000.0.pow(2),
NumassBeta.u2 to 1e-2,
NumassTransmission.thickness to 0.3,
NumassTransmission.trap to 1.0
)
listOf(NBkgSpectrum.norm, NBkgSpectrum.bkg, NumassBeta.e0).forEach {
println("$it: ${spectrum.derivative(it).invoke(14000.0, args)}")
}
val timePerPoint = 30.0
val strategy = (12000.0..19000.0 step 100.0).asSequence().associateWith { timePerPoint }
val generatedData = spectrum.generate(strategy, args)
val fit: XYFit = generatedData.fitWith(
optimizer = QowOptimizer,
modelExpression = spectrum,
startingPoint = args + mapOf(NBkgSpectrum.norm to 8.1e5),
OptimizationParameters(NBkgSpectrum.norm, NBkgSpectrum.bkg, NumassBeta.e0),
OptimizationIterations(20)
)
println("Chi squared/dof: ${fit.chiSquaredOrNull}/${fit.dof}")
Plotly.plot {
scatter {
name = "Generated"
mode = ScatterMode.markers
x.buffer = generatedData.x
y.buffer = generatedData.y
}
scatter {
name = "Initial"
mode = ScatterMode.lines
x.buffer = 12000.0..18600.0 step 50.0
y.numbers = x.doubles.map { spectrum(it, args) }
}
scatter {
name = "Fit"
mode = ScatterMode.lines
x.buffer = 12000.0..18600.0 step 10.0
y.numbers = x.doubles.map { spectrum(it, args + fit.resultPoint) }
}
}.makeFile()
}

View File

@ -0,0 +1,17 @@
package ru.inr.mass.scripts
//import com.google.cloud.storage.contrib.nio.CloudStorageFileSystem
//import ru.inr.mass.data.proto.NumassDirectorySet
//import ru.inr.mass.workspace.Numass
//import space.kscience.dataforge.data.DataTree
//
//// https://storage.cloud.google.com/numass-data/2020_12/Adiabaticity/16/set_3/p10(10s)(HV1%3D13750)
//
//suspend fun main() {
// CloudStorageFileSystem.forBucket("numass-data").use { fs ->
// val repo: DataTree<NumassDirectorySet> = Numass.readRepository(fs.getPath("2020_12/Adiabaticity"))
// repo.items().forEach{ (key,item)->
// println(key)
// }
// }
//}

View File

@ -0,0 +1,97 @@
package ru.inr.mass.scripts
import org.apache.commons.csv.CSVFormat
import ru.inr.mass.models.*
import ru.inr.mass.workspace.Numass
import ru.inr.mass.workspace.buffer
import ru.inr.mass.workspace.fitWith
import space.kscience.dataforge.meta.Value
import space.kscience.dataforge.meta.double
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.data.XYErrorColumnarData
import space.kscience.kmath.expressions.Symbol
import space.kscience.kmath.optimization.*
import space.kscience.kmath.real.map
import space.kscience.kmath.real.step
import space.kscience.kmath.structures.DoubleBuffer
import space.kscience.kmath.structures.indices
import space.kscience.plotly.*
import space.kscience.plotly.models.ScatterMode
import space.kscience.tables.Column
import space.kscience.tables.Table
import space.kscience.tables.csv.readAsCsv
import space.kscience.tables.get
import kotlin.math.pow
fun Column<Value>.toDoubleBuffer() = DoubleBuffer(size) { get(it).double }
@OptIn(UnstableKMathAPI::class)
suspend fun main() {
val input = Table.readAsCsv(
Numass::class.java.getResource("/data/2023_events.tsv")!!,
csvFormat = CSVFormat.TDF
)
val timePerPoint = 30.0 * 129
val data: XYErrorColumnarData<Double, Double, Double> = XYErrorColumnarData.of(
input.columns["U"].toDoubleBuffer(),
input.columns["events"].toDoubleBuffer().map { it / timePerPoint },
input.columns["error"].toDoubleBuffer().map { it / timePerPoint }
)
val spectrum: NBkgSpectrum = SterileNeutrinoSpectrum(fss = FSS.default).withNBkg()
val args: Map<Symbol, Double> = mapOf(
NBkgSpectrum.norm to 215443.0,
NBkgSpectrum.bkg to 2.0,
NumassBeta.mnu2 to 0.0,
NumassBeta.e0 to 18575.0,
NumassBeta.msterile2 to 2000.0.pow(2),
NumassBeta.u2 to 0.0,
NumassTransmission.thickness to 0.3,
NumassTransmission.trap to 1.0
)
val fit: XYFit = data.fitWith(
optimizer = QowOptimizer,
modelExpression = spectrum,
startingPoint = args,
OptimizationParameters(NBkgSpectrum.norm, NBkgSpectrum.bkg, NumassBeta.e0),
OptimizationIterations(20)
)
println("Chi squared/dof: ${fit.chiSquaredOrNull}/${fit.dof}")
Plotly.page {
plot {
scatter {
name = "Data"
mode = ScatterMode.markers
x.buffer = data.x
y.buffer = data.y
}
scatter {
name = "Fit"
mode = ScatterMode.lines
x.buffer = 12000.0..18600.0 step 10.0
y.numbers = x.doubles.map { spectrum(it, args + fit.resultPoint) }
}
}
plot {
layout.title = "residuals"
scatter {
mode = ScatterMode.markers
x.buffer = data.x
y.numbers = data.x.indices.map {
(data.y[it] - spectrum(data.x[it], args + fit.resultPoint))/data.yErr[it]
}
}
}
}.makeFile()
}

View File

@ -18,7 +18,6 @@ import space.kscience.dataforge.workspace.WorkspacePlugin
import space.kscience.dataforge.workspace.pipeFrom
import space.kscience.dataforge.workspace.task
import space.kscience.tables.Table
import kotlin.reflect.KClass
class NumassWorkspacePlugin : WorkspacePlugin() {
override val tag: PluginTag get() = Companion.tag
@ -128,7 +127,6 @@ class NumassWorkspacePlugin : WorkspacePlugin() {
companion object : PluginFactory<NumassWorkspacePlugin> {
override val tag: PluginTag = PluginTag("numass", "ru.mipt.npm")
override val type: KClass<out NumassWorkspacePlugin> = NumassWorkspacePlugin::class
override fun build(context: Context, meta: Meta): NumassWorkspacePlugin = NumassWorkspacePlugin()
}
}

View File

@ -0,0 +1,67 @@
@file:OptIn(UnstableKMathAPI::class)
package ru.inr.mass.workspace
import ru.inr.mass.models.Spectrum
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.data.XYColumnarData
import space.kscience.kmath.data.XYErrorColumnarData
import space.kscience.kmath.expressions.DifferentiableExpression
import space.kscience.kmath.expressions.Symbol
import space.kscience.kmath.misc.FeatureSet
import space.kscience.kmath.misc.Loggable
import space.kscience.kmath.optimization.*
import space.kscience.kmath.random.RandomGenerator
import space.kscience.kmath.samplers.PoissonSampler
import space.kscience.kmath.stat.next
import space.kscience.kmath.structures.asBuffer
import kotlin.math.sqrt
public suspend fun XYColumnarData<Double, Double, Double>.fitWith(
optimizer: Optimizer<Double, XYFit>,
modelExpression: DifferentiableExpression<Double>,
startingPoint: Map<Symbol, Double>,
vararg features: OptimizationFeature = emptyArray(),
xSymbol: Symbol = Symbol.x,
pointToCurveDistance: PointToCurveDistance = PointToCurveDistance.byY,
pointWeight: PointWeight = PointWeight.byYSigma,
): XYFit {
var actualFeatures = FeatureSet.of(*features, OptimizationStartPoint(startingPoint))
if (actualFeatures.getFeature<OptimizationLog>() == null) {
actualFeatures = actualFeatures.with(OptimizationLog(Loggable.console))
}
val problem = XYFit(
this,
modelExpression,
actualFeatures,
pointToCurveDistance,
pointWeight,
xSymbol
)
return optimizer.optimize(problem)
}
public suspend fun Spectrum.generate(
strategy: Map<Double, Double>,
arguments: Map<Symbol, Double>,
generator: RandomGenerator = RandomGenerator.default,
): XYErrorColumnarData<Double, Double, Double> {
val xs = mutableListOf<Double>()
val ys = mutableListOf<Double>()
val errors = mutableListOf<Double>()
strategy.forEach { (x, time) ->
xs.add(x)
val mu = invoke(x, arguments) * time
val y = PoissonSampler(mu).next(generator) / time
val error = sqrt(mu) / time
ys.add(y)
errors.add(error)
}
return XYErrorColumnarData.of(
xs.toTypedArray().asBuffer(),
ys.toTypedArray().asBuffer(),
errors.toTypedArray().asBuffer()
)
}

View File

@ -12,9 +12,9 @@ import ru.inr.mass.data.proto.HVData
import ru.inr.mass.data.proto.NumassDirectorySet
import space.kscience.dataforge.meta.asValue
import space.kscience.dataforge.meta.double
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.domains.center
import space.kscience.kmath.histogram.Histogram1D
import space.kscience.kmath.misc.UnstableKMathAPI
import space.kscience.kmath.operations.asIterable
import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.DoubleBuffer

View File

@ -0,0 +1,108 @@
U events error
12000 6.452460E+07 8032.720335
12050 6.308058E+07 7942.32812
12100 6.166233E+07 7852.536369
12150 6.026178E+07 7762.846435
12200 5.888044E+07 7673.359382
12250 5.752020E+07 7584.207129
12300 5.618589E+07 7495.725049
12350 5.486976E+07 7407.412404
12400 5.357057E+07 7319.192132
12450 5.229649E+07 7231.631507
12500 5.104097E+07 7144.295993
12550 4.980586E+07 7057.326711
12600 4.858747E+07 6970.471306
12650 4.739252E+07 6884.222328
12700 4.621748E+07 6798.344134
12750 4.505844E+07 6712.55872
12800 4.392086E+07 6627.281125
12850 4.280192E+07 6542.317643
12900 4.170236E+07 6457.736238
12950 4.062241E+07 6373.571204
13000 3.955862E+07 6289.564579
13050 3.851518E+07 6206.059556
13100 3.748997E+07 6122.905734
13150 3.648207E+07 6040.03875
13200 3.549434E+07 5957.712236
13250 3.452146E+07 5875.496153
13300 3.356598E+07 5793.615159
13350 3.263059E+07 5712.318869
13400 3.171169E+07 5631.313607
13450 3.080984E+07 5550.661274
13500 2.992572E+07 5470.440919
13550 2.905686E+07 5390.441869
13600 2.820575E+07 5310.908839
13650 2.737116E+07 5231.745008
13700 2.655560E+07 5153.212589
13750 2.575232E+07 5074.674515
13800 2.496715E+07 4996.713422
13850 2.419569E+07 4918.911404
13900 2.344232E+07 4841.727268
13950 2.270363E+07 4764.832291
14000 2.198215E+07 4688.512852
14050 2.127411E+07 4612.386446
14100 2.058196E+07 4536.734227
14150 1.990347E+07 4461.330615
14200 1.924117E+07 4386.475463
14250 1.859371E+07 4312.041926
14300 1.796066E+07 4238.001528
14350 1.734144E+07 4164.305627
14400 1.673491E+07 4090.832005
14450 1.614486E+07 4018.066921
14500 1.556582E+07 3945.354348
14550 1.500395E+07 3873.492826
14600 1.445357E+07 3801.785423
14650 1.391677E+07 3730.51812
14700 1.339411E+07 3659.796472
14750 1.288430E+07 3589.470303
14800 1.238646E+07 3519.440284
14850 1.190164E+07 3449.875909
14900 1.143011E+07 3380.844281
14950 1.097078E+07 3312.217027
15000 1.052425E+07 3244.109423
15050 1.008924E+07 3176.356172
15100 9.665787E+06 3108.984892
15150 9.254249E+06 3042.079724
15200 8.854339E+06 2975.624154
15250 8.467155E+06 2909.837666
15300 8.090963E+06 2844.46187
15350 7.725603E+06 2779.496931
15400 7.370687E+06 2714.900844
15450 7.028022E+06 2651.041609
15500 6.694518E+06 2587.376647
15550 6.372090E+06 2524.299879
15600 6.058846E+06 2461.472259
15650 5.758606E+06 2399.709617
15700 5.466336E+06 2338.019685
15750 5.183979E+06 2276.835393
15800 4.912587E+06 2216.435542
15850 4.648231E+06 2155.975548
15900 4.396058E+06 2096.677784
15950 4.151727E+06 2037.578662
16000 3.916397E+06 1978.98901
16100 3.473288E+06 1863.676016
16200 3.065010E+06 1750.717128
16300 2.688767E+06 1639.746111
16400 2.344119E+06 1531.051707
16500 2.029421E+06 1424.577365
16600 1.743956E+06 1320.589413
16700 1.487062E+06 1219.45145
16800 1.255541E+06 1120.509421
16900 1.049216E+06 1024.312329
17000 8.724297E+05 934.0394267
17100 7.157295E+05 846.0079518
17200 5.750288E+05 758.3065238
17300 4.560588E+05 675.3212528
17400 3.553991E+05 596.1536111
17500 2.697442E+05 519.3690855
17600 2.005270E+05 447.8024159
17700 1.434300E+05 378.7215839
17800 9.860455E+04 314.0136092
17900 6.354514E+04 252.0816166
18000 3.898907E+04 197.456499
18100 2.149273E+04 146.6039915
18200 1.010559E+04 100.5265405
18300 4.910901E+03 70.07781835
18400 2.252190E+03 47.4572434
18500 1.860929E+03 43.13848425
18600 1.760000E+03 41.95235393
1 U events error
2 12000 6.452460E+07 8032.720335
3 12050 6.308058E+07 7942.32812
4 12100 6.166233E+07 7852.536369
5 12150 6.026178E+07 7762.846435
6 12200 5.888044E+07 7673.359382
7 12250 5.752020E+07 7584.207129
8 12300 5.618589E+07 7495.725049
9 12350 5.486976E+07 7407.412404
10 12400 5.357057E+07 7319.192132
11 12450 5.229649E+07 7231.631507
12 12500 5.104097E+07 7144.295993
13 12550 4.980586E+07 7057.326711
14 12600 4.858747E+07 6970.471306
15 12650 4.739252E+07 6884.222328
16 12700 4.621748E+07 6798.344134
17 12750 4.505844E+07 6712.55872
18 12800 4.392086E+07 6627.281125
19 12850 4.280192E+07 6542.317643
20 12900 4.170236E+07 6457.736238
21 12950 4.062241E+07 6373.571204
22 13000 3.955862E+07 6289.564579
23 13050 3.851518E+07 6206.059556
24 13100 3.748997E+07 6122.905734
25 13150 3.648207E+07 6040.03875
26 13200 3.549434E+07 5957.712236
27 13250 3.452146E+07 5875.496153
28 13300 3.356598E+07 5793.615159
29 13350 3.263059E+07 5712.318869
30 13400 3.171169E+07 5631.313607
31 13450 3.080984E+07 5550.661274
32 13500 2.992572E+07 5470.440919
33 13550 2.905686E+07 5390.441869
34 13600 2.820575E+07 5310.908839
35 13650 2.737116E+07 5231.745008
36 13700 2.655560E+07 5153.212589
37 13750 2.575232E+07 5074.674515
38 13800 2.496715E+07 4996.713422
39 13850 2.419569E+07 4918.911404
40 13900 2.344232E+07 4841.727268
41 13950 2.270363E+07 4764.832291
42 14000 2.198215E+07 4688.512852
43 14050 2.127411E+07 4612.386446
44 14100 2.058196E+07 4536.734227
45 14150 1.990347E+07 4461.330615
46 14200 1.924117E+07 4386.475463
47 14250 1.859371E+07 4312.041926
48 14300 1.796066E+07 4238.001528
49 14350 1.734144E+07 4164.305627
50 14400 1.673491E+07 4090.832005
51 14450 1.614486E+07 4018.066921
52 14500 1.556582E+07 3945.354348
53 14550 1.500395E+07 3873.492826
54 14600 1.445357E+07 3801.785423
55 14650 1.391677E+07 3730.51812
56 14700 1.339411E+07 3659.796472
57 14750 1.288430E+07 3589.470303
58 14800 1.238646E+07 3519.440284
59 14850 1.190164E+07 3449.875909
60 14900 1.143011E+07 3380.844281
61 14950 1.097078E+07 3312.217027
62 15000 1.052425E+07 3244.109423
63 15050 1.008924E+07 3176.356172
64 15100 9.665787E+06 3108.984892
65 15150 9.254249E+06 3042.079724
66 15200 8.854339E+06 2975.624154
67 15250 8.467155E+06 2909.837666
68 15300 8.090963E+06 2844.46187
69 15350 7.725603E+06 2779.496931
70 15400 7.370687E+06 2714.900844
71 15450 7.028022E+06 2651.041609
72 15500 6.694518E+06 2587.376647
73 15550 6.372090E+06 2524.299879
74 15600 6.058846E+06 2461.472259
75 15650 5.758606E+06 2399.709617
76 15700 5.466336E+06 2338.019685
77 15750 5.183979E+06 2276.835393
78 15800 4.912587E+06 2216.435542
79 15850 4.648231E+06 2155.975548
80 15900 4.396058E+06 2096.677784
81 15950 4.151727E+06 2037.578662
82 16000 3.916397E+06 1978.98901
83 16100 3.473288E+06 1863.676016
84 16200 3.065010E+06 1750.717128
85 16300 2.688767E+06 1639.746111
86 16400 2.344119E+06 1531.051707
87 16500 2.029421E+06 1424.577365
88 16600 1.743956E+06 1320.589413
89 16700 1.487062E+06 1219.45145
90 16800 1.255541E+06 1120.509421
91 16900 1.049216E+06 1024.312329
92 17000 8.724297E+05 934.0394267
93 17100 7.157295E+05 846.0079518
94 17200 5.750288E+05 758.3065238
95 17300 4.560588E+05 675.3212528
96 17400 3.553991E+05 596.1536111
97 17500 2.697442E+05 519.3690855
98 17600 2.005270E+05 447.8024159
99 17700 1.434300E+05 378.7215839
100 17800 9.860455E+04 314.0136092
101 17900 6.354514E+04 252.0816166
102 18000 3.898907E+04 197.456499
103 18100 2.149273E+04 146.6039915
104 18200 1.010559E+04 100.5265405
105 18300 4.910901E+03 70.07781835
106 18400 2.252190E+03 47.4572434
107 18500 1.860929E+03 43.13848425
108 18600 1.760000E+03 41.95235393

View File

@ -1,7 +1,6 @@
rootProject.name = "numass"
enableFeaturePreview("TYPESAFE_PROJECT_ACCESSORS")
enableFeaturePreview("VERSION_CATALOGS")
pluginManagement {
@ -15,6 +14,7 @@ pluginManagement {
}
plugins {
id("org.jetbrains.compose").version(extra["compose.version"] as String)
id("space.kscience.gradle.project") version toolsVersion
id("space.kscience.gradle.mpp") version toolsVersion
id("space.kscience.gradle.jvm") version toolsVersion