Compare commits

...

16 Commits

Author SHA1 Message Date
6650353683 add cli parser to fit.kt 2023-11-29 12:57:15 +03:00
bc77af263b merge with dev (update to Kotlin 1.9.0) 2023-10-09 15:29:00 +03:00
7659bc41a0 Merge remote-tracking branch 'origin/dev' into feature/fit-analysis
# Conflicts:
#	numass-data-proto/src/gen/kotlin/ru/inr/mass/data/proto/Point.kt
#	numass-workspace/src/main/kotlin/ru/inr/mass/scripts/fit.kt
2023-10-09 14:55:39 +03:00
b7618cc08f update build versions 2023-10-09 13:35:39 +03:00
f67157b953 optimization 2023-10-03 14:58:16 +03:00
5fcff41db6 model correction 2023-07-09 13:53:13 +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
30 changed files with 738 additions and 302 deletions

View File

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

View File

@ -5,11 +5,11 @@
kotlin.code.style=official kotlin.code.style=official
kotlin.mpp.stability.nowarn=true kotlin.mpp.stability.nowarn=true
kotlin.js.compiler=ir
kotlin.jupyter.add.scanner=false
org.gradle.configureondemand=true org.gradle.configureondemand=true
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.jvmargs=-XX:MaxMetaspaceSize=1G 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.1

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists 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 zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

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

View File

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

View File

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

View File

@ -2,10 +2,27 @@
// Source: ru.inr.mass.data.proto.Point in numass-proto.proto // Source: ru.inr.mass.data.proto.Point in numass-proto.proto
package ru.inr.mass.`data`.proto package ru.inr.mass.`data`.proto
import com.squareup.wire.* import com.squareup.wire.FieldEncoding
import com.squareup.wire.Message
import com.squareup.wire.ProtoAdapter
import com.squareup.wire.ProtoReader
import com.squareup.wire.ProtoWriter
import com.squareup.wire.ReverseProtoWriter
import com.squareup.wire.Syntax.PROTO_3 import com.squareup.wire.Syntax.PROTO_3
import com.squareup.wire.internal.immutableCopyOf import com.squareup.wire.WireField
import com.squareup.wire.internal.redactElements import com.squareup.wire.`internal`.JvmField
import com.squareup.wire.`internal`.immutableCopyOf
import com.squareup.wire.`internal`.redactElements
import kotlin.Any
import kotlin.AssertionError
import kotlin.Boolean
import kotlin.Deprecated
import kotlin.DeprecationLevel
import kotlin.Int
import kotlin.Long
import kotlin.Nothing
import kotlin.String
import kotlin.collections.List
import okio.ByteString import okio.ByteString
public class Point( public class Point(
@ -19,6 +36,7 @@ public class Point(
tag = 1, tag = 1,
adapter = "ru.inr.mass.data.proto.Point${'$'}Channel#ADAPTER", adapter = "ru.inr.mass.data.proto.Point${'$'}Channel#ADAPTER",
label = WireField.Label.REPEATED, label = WireField.Label.REPEATED,
schemaIndex = 0,
) )
public val channels: List<Channel> = immutableCopyOf("channels", channels) public val channels: List<Channel> = immutableCopyOf("channels", channels)
@ -26,10 +44,10 @@ public class Point(
message = "Shouldn't be used in Kotlin", message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN, 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") 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 === this) return true
if (other !is Point) return false if (other !is Point) return false
if (unknownFields != other.unknownFields) return false if (unknownFields != other.unknownFields) return false
@ -37,7 +55,7 @@ public class Point(
return true return true
} }
public override fun hashCode(): Int { override fun hashCode(): Int {
var result = super.hashCode var result = super.hashCode
if (result == 0) { if (result == 0) {
result = unknownFields.hashCode() result = unknownFields.hashCode()
@ -47,7 +65,7 @@ public class Point(
return result return result
} }
public override fun toString(): String { override fun toString(): String {
val result = mutableListOf<String>() val result = mutableListOf<String>()
if (channels.isNotEmpty()) result += """channels=$channels""" if (channels.isNotEmpty()) result += """channels=$channels"""
return result.joinToString(prefix = "Point{", separator = ", ", postfix = "}") return result.joinToString(prefix = "Point{", separator = ", ", postfix = "}")
@ -66,23 +84,23 @@ public class Point(
null, null,
"numass-proto.proto" "numass-proto.proto"
) { ) {
public override fun encodedSize(`value`: Point): Int { override fun encodedSize(`value`: Point): Int {
var size = value.unknownFields.size var size = value.unknownFields.size
size += Channel.ADAPTER.asRepeated().encodedSizeWithTag(1, value.channels) size += Channel.ADAPTER.asRepeated().encodedSizeWithTag(1, value.channels)
return size 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) Channel.ADAPTER.asRepeated().encodeWithTag(writer, 1, value.channels)
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
} }
public override fun encode(writer: ReverseProtoWriter, `value`: Point): Unit { override fun encode(writer: ReverseProtoWriter, `value`: Point) {
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
Channel.ADAPTER.asRepeated().encodeWithTag(writer, 1, value.channels) 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 channels = mutableListOf<Channel>()
val unknownFields = reader.forEachTag { tag -> val unknownFields = reader.forEachTag { tag ->
when (tag) { when (tag) {
@ -96,7 +114,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), channels = value.channels.redactElements(Channel.ADAPTER),
unknownFields = ByteString.EMPTY unknownFields = ByteString.EMPTY
) )
@ -116,6 +134,7 @@ public class Point(
tag = 1, tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#UINT64", adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY, label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 0,
) )
public val id: Long = 0L, public val id: Long = 0L,
blocks: List<Block> = emptyList(), blocks: List<Block> = emptyList(),
@ -128,6 +147,7 @@ public class Point(
tag = 2, tag = 2,
adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block#ADAPTER", adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block#ADAPTER",
label = WireField.Label.REPEATED, label = WireField.Label.REPEATED,
schemaIndex = 1,
) )
public val blocks: List<Block> = immutableCopyOf("blocks", blocks) public val blocks: List<Block> = immutableCopyOf("blocks", blocks)
@ -135,10 +155,10 @@ public class Point(
message = "Shouldn't be used in Kotlin", message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN, 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") 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 === this) return true
if (other !is Channel) return false if (other !is Channel) return false
if (unknownFields != other.unknownFields) return false if (unknownFields != other.unknownFields) return false
@ -147,7 +167,7 @@ public class Point(
return true return true
} }
public override fun hashCode(): Int { override fun hashCode(): Int {
var result = super.hashCode var result = super.hashCode
if (result == 0) { if (result == 0) {
result = unknownFields.hashCode() result = unknownFields.hashCode()
@ -158,7 +178,7 @@ public class Point(
return result return result
} }
public override fun toString(): String { override fun toString(): String {
val result = mutableListOf<String>() val result = mutableListOf<String>()
result += """id=$id""" result += """id=$id"""
if (blocks.isNotEmpty()) result += """blocks=$blocks""" if (blocks.isNotEmpty()) result += """blocks=$blocks"""
@ -181,26 +201,26 @@ public class Point(
null, null,
"numass-proto.proto" "numass-proto.proto"
) { ) {
public override fun encodedSize(`value`: Channel): Int { override fun encodedSize(`value`: Channel): Int {
var size = value.unknownFields.size var size = value.unknownFields.size
if (value.id != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.id) if (value.id != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.id)
size += Block.ADAPTER.asRepeated().encodedSizeWithTag(2, value.blocks) size += Block.ADAPTER.asRepeated().encodedSizeWithTag(2, value.blocks)
return size 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) if (value.id != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.id)
Block.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.blocks) Block.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.blocks)
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
} }
public override fun encode(writer: ReverseProtoWriter, `value`: Channel): Unit { override fun encode(writer: ReverseProtoWriter, `value`: Channel) {
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
Block.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.blocks) Block.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.blocks)
if (value.id != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.id) 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 var id: Long = 0L
val blocks = mutableListOf<Block>() val blocks = mutableListOf<Block>()
val unknownFields = reader.forEachTag { tag -> val unknownFields = reader.forEachTag { tag ->
@ -217,7 +237,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), blocks = value.blocks.redactElements(Block.ADAPTER),
unknownFields = ByteString.EMPTY unknownFields = ByteString.EMPTY
) )
@ -237,6 +257,7 @@ public class Point(
tag = 1, tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#UINT64", adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY, label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 0,
) )
public val time: Long = 0L, public val time: Long = 0L,
frames: List<Frame> = emptyList(), frames: List<Frame> = emptyList(),
@ -247,6 +268,7 @@ public class Point(
tag = 3, tag = 3,
adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block${'$'}Events#ADAPTER", adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block${'$'}Events#ADAPTER",
label = WireField.Label.OMIT_IDENTITY, label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 2,
) )
public val events: Events? = null, public val events: Events? = null,
/** /**
@ -256,6 +278,7 @@ public class Point(
tag = 4, tag = 4,
adapter = "com.squareup.wire.ProtoAdapter#UINT64", adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY, label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 3,
) )
public val length: Long = 0L, public val length: Long = 0L,
/** /**
@ -266,6 +289,7 @@ public class Point(
adapter = "com.squareup.wire.ProtoAdapter#UINT64", adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY, label = WireField.Label.OMIT_IDENTITY,
jsonName = "binSize", jsonName = "binSize",
schemaIndex = 4,
) )
public val bin_size: Long = 0L, public val bin_size: Long = 0L,
unknownFields: ByteString = ByteString.EMPTY, unknownFields: ByteString = ByteString.EMPTY,
@ -277,6 +301,7 @@ public class Point(
tag = 2, tag = 2,
adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block${'$'}Frame#ADAPTER", adapter = "ru.inr.mass.data.proto.Point${'$'}Channel${'$'}Block${'$'}Frame#ADAPTER",
label = WireField.Label.REPEATED, label = WireField.Label.REPEATED,
schemaIndex = 1,
) )
public val frames: List<Frame> = immutableCopyOf("frames", frames) public val frames: List<Frame> = immutableCopyOf("frames", frames)
@ -284,10 +309,10 @@ public class Point(
message = "Shouldn't be used in Kotlin", message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN, 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") 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 === this) return true
if (other !is Block) return false if (other !is Block) return false
if (unknownFields != other.unknownFields) return false if (unknownFields != other.unknownFields) return false
@ -299,7 +324,7 @@ public class Point(
return true return true
} }
public override fun hashCode(): Int { override fun hashCode(): Int {
var result = super.hashCode var result = super.hashCode
if (result == 0) { if (result == 0) {
result = unknownFields.hashCode() result = unknownFields.hashCode()
@ -313,7 +338,7 @@ public class Point(
return result return result
} }
public override fun toString(): String { override fun toString(): String {
val result = mutableListOf<String>() val result = mutableListOf<String>()
result += """time=$time""" result += """time=$time"""
if (frames.isNotEmpty()) result += """frames=$frames""" if (frames.isNotEmpty()) result += """frames=$frames"""
@ -342,7 +367,7 @@ public class Point(
null, null,
"numass-proto.proto" "numass-proto.proto"
) { ) {
public override fun encodedSize(`value`: Block): Int { override fun encodedSize(`value`: Block): Int {
var size = value.unknownFields.size var size = value.unknownFields.size
if (value.time != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.time) if (value.time != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.time)
size += Frame.ADAPTER.asRepeated().encodedSizeWithTag(2, value.frames) size += Frame.ADAPTER.asRepeated().encodedSizeWithTag(2, value.frames)
@ -353,7 +378,7 @@ public class Point(
return size 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) if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time)
Frame.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.frames) Frame.ADAPTER.asRepeated().encodeWithTag(writer, 2, value.frames)
if (value.events != null) Events.ADAPTER.encodeWithTag(writer, 3, value.events) if (value.events != null) Events.ADAPTER.encodeWithTag(writer, 3, value.events)
@ -362,7 +387,7 @@ public class Point(
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
} }
public override fun encode(writer: ReverseProtoWriter, `value`: Block): Unit { override fun encode(writer: ReverseProtoWriter, `value`: Block) {
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
if (value.bin_size != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 5, value.bin_size) if (value.bin_size != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 5, value.bin_size)
if (value.length != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 4, value.length) if (value.length != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 4, value.length)
@ -371,7 +396,7 @@ public class Point(
if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time) 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 var time: Long = 0L
val frames = mutableListOf<Frame>() val frames = mutableListOf<Frame>()
var events: Events? = null var events: Events? = null
@ -397,7 +422,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), frames = value.frames.redactElements(Frame.ADAPTER),
events = value.events?.let(Events.ADAPTER::redact), events = value.events?.let(Events.ADAPTER::redact),
unknownFields = ByteString.EMPTY unknownFields = ByteString.EMPTY
@ -418,6 +443,7 @@ public class Point(
tag = 1, tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#UINT64", adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.OMIT_IDENTITY, label = WireField.Label.OMIT_IDENTITY,
schemaIndex = 0,
) )
public val time: Long = 0L, public val time: Long = 0L,
/** /**
@ -428,6 +454,7 @@ public class Point(
adapter = "com.squareup.wire.ProtoAdapter#BYTES", adapter = "com.squareup.wire.ProtoAdapter#BYTES",
label = WireField.Label.OMIT_IDENTITY, label = WireField.Label.OMIT_IDENTITY,
declaredName = "data", declaredName = "data",
schemaIndex = 1,
) )
public val data_: ByteString = ByteString.EMPTY, public val data_: ByteString = ByteString.EMPTY,
unknownFields: ByteString = ByteString.EMPTY, unknownFields: ByteString = ByteString.EMPTY,
@ -436,10 +463,10 @@ public class Point(
message = "Shouldn't be used in Kotlin", message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN, 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") 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 === this) return true
if (other !is Frame) return false if (other !is Frame) return false
if (unknownFields != other.unknownFields) return false if (unknownFields != other.unknownFields) return false
@ -448,7 +475,7 @@ public class Point(
return true return true
} }
public override fun hashCode(): Int { override fun hashCode(): Int {
var result = super.hashCode var result = super.hashCode
if (result == 0) { if (result == 0) {
result = unknownFields.hashCode() result = unknownFields.hashCode()
@ -459,7 +486,7 @@ public class Point(
return result return result
} }
public override fun toString(): String { override fun toString(): String {
val result = mutableListOf<String>() val result = mutableListOf<String>()
result += """time=$time""" result += """time=$time"""
result += """data_=$data_""" result += """data_=$data_"""
@ -482,7 +509,7 @@ public class Point(
null, null,
"numass-proto.proto" "numass-proto.proto"
) { ) {
public override fun encodedSize(`value`: Frame): Int { override fun encodedSize(`value`: Frame): Int {
var size = value.unknownFields.size var size = value.unknownFields.size
if (value.time != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.time) if (value.time != 0L) size += ProtoAdapter.UINT64.encodedSizeWithTag(1, value.time)
if (value.data_ != ByteString.EMPTY) size += ProtoAdapter.BYTES.encodedSizeWithTag(2, if (value.data_ != ByteString.EMPTY) size += ProtoAdapter.BYTES.encodedSizeWithTag(2,
@ -490,21 +517,21 @@ public class Point(
return size 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.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time)
if (value.data_ != ByteString.EMPTY) ProtoAdapter.BYTES.encodeWithTag(writer, 2, if (value.data_ != ByteString.EMPTY) ProtoAdapter.BYTES.encodeWithTag(writer, 2,
value.data_) value.data_)
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
} }
public override fun encode(writer: ReverseProtoWriter, `value`: Frame): Unit { override fun encode(writer: ReverseProtoWriter, `value`: Frame) {
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
if (value.data_ != ByteString.EMPTY) ProtoAdapter.BYTES.encodeWithTag(writer, 2, if (value.data_ != ByteString.EMPTY) ProtoAdapter.BYTES.encodeWithTag(writer, 2,
value.data_) value.data_)
if (value.time != 0L) ProtoAdapter.UINT64.encodeWithTag(writer, 1, value.time) 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 time: Long = 0L
var data_: ByteString = ByteString.EMPTY var data_: ByteString = ByteString.EMPTY
val unknownFields = reader.forEachTag { tag -> val unknownFields = reader.forEachTag { tag ->
@ -521,7 +548,7 @@ public class Point(
) )
} }
public override fun redact(`value`: Frame): Frame = value.copy( override fun redact(`value`: Frame): Frame = value.copy(
unknownFields = ByteString.EMPTY unknownFields = ByteString.EMPTY
) )
} }
@ -547,6 +574,7 @@ public class Point(
tag = 1, tag = 1,
adapter = "com.squareup.wire.ProtoAdapter#UINT64", adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.PACKED, label = WireField.Label.PACKED,
schemaIndex = 0,
) )
public val times: List<Long> = immutableCopyOf("times", times) public val times: List<Long> = immutableCopyOf("times", times)
@ -557,6 +585,7 @@ public class Point(
tag = 2, tag = 2,
adapter = "com.squareup.wire.ProtoAdapter#UINT64", adapter = "com.squareup.wire.ProtoAdapter#UINT64",
label = WireField.Label.PACKED, label = WireField.Label.PACKED,
schemaIndex = 1,
) )
public val amplitudes: List<Long> = immutableCopyOf("amplitudes", amplitudes) public val amplitudes: List<Long> = immutableCopyOf("amplitudes", amplitudes)
@ -564,10 +593,10 @@ public class Point(
message = "Shouldn't be used in Kotlin", message = "Shouldn't be used in Kotlin",
level = DeprecationLevel.HIDDEN, 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") 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 === this) return true
if (other !is Events) return false if (other !is Events) return false
if (unknownFields != other.unknownFields) return false if (unknownFields != other.unknownFields) return false
@ -576,7 +605,7 @@ public class Point(
return true return true
} }
public override fun hashCode(): Int { override fun hashCode(): Int {
var result = super.hashCode var result = super.hashCode
if (result == 0) { if (result == 0) {
result = unknownFields.hashCode() result = unknownFields.hashCode()
@ -587,7 +616,7 @@ public class Point(
return result return result
} }
public override fun toString(): String { override fun toString(): String {
val result = mutableListOf<String>() val result = mutableListOf<String>()
if (times.isNotEmpty()) result += """times=$times""" if (times.isNotEmpty()) result += """times=$times"""
if (amplitudes.isNotEmpty()) result += """amplitudes=$amplitudes""" if (amplitudes.isNotEmpty()) result += """amplitudes=$amplitudes"""
@ -610,43 +639,61 @@ public class Point(
null, null,
"numass-proto.proto" "numass-proto.proto"
) { ) {
public override fun encodedSize(`value`: Events): Int { override fun encodedSize(`value`: Events): Int {
var size = value.unknownFields.size var size = value.unknownFields.size
size += ProtoAdapter.UINT64.asPacked().encodedSizeWithTag(1, value.times) size += ProtoAdapter.UINT64.asPacked().encodedSizeWithTag(1, value.times)
size += ProtoAdapter.UINT64.asPacked().encodedSizeWithTag(2, value.amplitudes) size += ProtoAdapter.UINT64.asPacked().encodedSizeWithTag(2, value.amplitudes)
return size 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, 1, value.times)
ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 2, value.amplitudes) ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 2, value.amplitudes)
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
} }
public override fun encode(writer: ReverseProtoWriter, `value`: Events): Unit { override fun encode(writer: ReverseProtoWriter, `value`: Events) {
writer.writeBytes(value.unknownFields) writer.writeBytes(value.unknownFields)
ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 2, value.amplitudes) ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 2, value.amplitudes)
ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 1, value.times) ProtoAdapter.UINT64.asPacked().encodeWithTag(writer, 1, value.times)
} }
public override fun decode(reader: ProtoReader): Events { override fun decode(reader: ProtoReader): Events {
val times = mutableListOf<Long>() var times: MutableList<Long>? = null
val amplitudes = mutableListOf<Long>() var amplitudes: MutableList<Long>? = null
val unknownFields = reader.forEachTag { tag -> val unknownFields = reader.forEachTag { tag ->
when (tag) { when (tag) {
1 -> times.add(ProtoAdapter.UINT64.decode(reader)) 1 -> {
2 -> amplitudes.add(ProtoAdapter.UINT64.decode(reader)) 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) else -> reader.readUnknownField(tag)
} }
} }
return Events( return Events(
times = times, times = times ?: listOf(),
amplitudes = amplitudes, amplitudes = amplitudes ?: listOf(),
unknownFields = unknownFields unknownFields = unknownFields
) )
} }
public override fun redact(`value`: Events): Events = value.copy( override fun redact(`value`: Events): Events = value.copy(
unknownFields = ByteString.EMPTY unknownFields = ByteString.EMPTY
) )
} }

View File

@ -20,7 +20,6 @@ import java.nio.file.Path
import kotlin.io.path.exists import kotlin.io.path.exists
import kotlin.io.path.isDirectory import kotlin.io.path.isDirectory
import kotlin.io.path.relativeTo import kotlin.io.path.relativeTo
import kotlin.reflect.KClass
public class NumassProtoPlugin : AbstractPlugin() { public class NumassProtoPlugin : AbstractPlugin() {
public val io: IOPlugin by require(IOPlugin) public val io: IOPlugin by require(IOPlugin)
@ -35,7 +34,6 @@ public class NumassProtoPlugin : AbstractPlugin() {
public companion object : PluginFactory<NumassProtoPlugin> { public companion object : PluginFactory<NumassProtoPlugin> {
override fun build(context: Context, meta: Meta): NumassProtoPlugin = NumassProtoPlugin() override fun build(context: Context, meta: Meta): NumassProtoPlugin = NumassProtoPlugin()
override val tag: PluginTag = PluginTag("numass-proto", group = "ru.inr.mass") 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) writeRawString(END_SEQUENCE)
} }
override fun writeEnvelope( override fun writeObject(output: Output, obj: Envelope) {
output: Output,
envelope: Envelope,
metaFormatFactory: MetaFormatFactory,
formatMeta: Meta,
) {
error("Don't write legacy formats") 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 { override fun readObject(input: Input): Envelope {
val tag = input.readTag() val tag = input.readTag()
val metaFormat = io.resolveMetaFormat(tag.metaFormatKey) val metaFormat = io.resolveMetaFormat(tag.metaFormatKey) ?: JsonMetaFormat
?: error("Meta format with key ${tag.metaFormatKey} not found")
val meta: Meta = metaFormat.readObjectFrom(input.readBinary(tag.metaSize.toInt())) val meta: Meta = metaFormat.readObjectFrom(input.readBinary(tag.metaSize.toInt()))
val data = input.readBinary(tag.dataSize.toInt()) val data = input.readBinary(tag.dataSize.toInt())
return SimpleEnvelope(meta, data) 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)
} }
//
// 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( private data class Tag(
val metaFormatKey: Short, val metaFormatKey: Short,
@ -149,23 +132,11 @@ public class TaggedNumassEnvelopeFormat(private val io: IOPlugin) : EnvelopeForm
private val default by lazy { invoke() } private val default by lazy { invoke() }
override fun readPartial(input: Input): PartialEnvelope = override fun writeObject(output: Output, obj: Envelope) {
default.run { readPartial(input) } error("Don't write legacy formats")
override fun writeEnvelope(
output: Output,
envelope: Envelope,
metaFormatFactory: MetaFormatFactory,
formatMeta: Meta,
): Unit = default.run {
writeEnvelope(
output,
envelope,
metaFormatFactory,
formatMeta
)
} }
override fun readObject(input: Input): Envelope = default.readObject(input) override fun readObject(input: Input): Envelope = default.readObject(input)
} }
} }

View File

@ -1,5 +1,6 @@
plugins { plugins {
id("space.kscience.gradle.mpp") id("space.kscience.gradle.mpp")
id("org.jetbrains.compose")
`maven-publish` `maven-publish`
} }
@ -7,54 +8,41 @@ val visionForgeVersion: String by rootProject.extra
val production: Boolean by rootProject.extra(true) val production: Boolean by rootProject.extra(true)
kotlin {
js(IR) {
browser {
webpackTask {
this.outputFileName = "js/numass-web.js"
}
}
binaries.executable()
}
sourceSets {
commonMain {
dependencies {
implementation(project(":numass-data-model"))
implementation("space.kscience:visionforge-core:$visionForgeVersion")
implementation("space.kscience:visionforge-plotly:$visionForgeVersion")
}
}
jvmMain {
dependencies {
implementation(project(":numass-data-proto"))
implementation("space.kscience:visionforge-server:$visionForgeVersion")
}
}
}
}
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 { kscience {
fullStack("js/numass-web.js")
useSerialization { useSerialization {
json() json()
} }
withContextReceivers()
useContextReceivers()
useKtor()
commonMain {
dependencies {
implementation(project(":numass-data-model"))
implementation("space.kscience:visionforge-core:$visionForgeVersion")
implementation("space.kscience:visionforge-plotly:$visionForgeVersion")
}
}
}
kotlin{
sourceSets{
getByName("jvmMain"){
dependencies{
implementation(compose.runtime)
implementation(project(":numass-data-proto"))
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)
}
}
}
} }

View File

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

View File

@ -18,7 +18,6 @@ import space.kscience.visionforge.ElementVisionRenderer
import space.kscience.visionforge.Vision import space.kscience.visionforge.Vision
import space.kscience.visionforge.VisionClient import space.kscience.visionforge.VisionClient
import space.kscience.visionforge.plotly.PlotlyPlugin import space.kscience.visionforge.plotly.PlotlyPlugin
import kotlin.reflect.KClass
public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer { public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer {
public val client: VisionClient by require(VisionClient) public val client: VisionClient by require(VisionClient)
@ -37,7 +36,7 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer {
else -> super.content(target) 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) { when (vision) {
is VisionOfNumassHv -> element.append { is VisionOfNumassHv -> element.append {
h1 { +"HV" } h1 { +"HV" }
@ -64,7 +63,7 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer {
vision.spectra.forEach { (channel, spectrum) -> vision.spectra.forEach { (channel, spectrum) ->
val pairs = spectrum.entries.sortedBy { it.key } val pairs = spectrum.entries.sortedBy { it.key }
scatter { scatter {
name = channel this.name = channel
mode = ScatterMode.lines mode = ScatterMode.lines
line { line {
shape = LineShape.hv shape = LineShape.hv
@ -83,8 +82,6 @@ public class NumassJsPlugin : AbstractPlugin(), ElementVisionRenderer {
public companion object : PluginFactory<NumassJsPlugin> { public companion object : PluginFactory<NumassJsPlugin> {
override val tag: PluginTag = PluginTag("numass.js", "ru.inr.mass") 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() 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 package ru.inr.mass.data.server
import io.ktor.http.ContentType
import io.ktor.http.HttpStatusCode 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.application.call
import io.ktor.server.cio.CIO import io.ktor.server.cio.CIO
import io.ktor.server.engine.embeddedServer 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.response.respondText
import io.ktor.server.routing.get import io.ktor.server.routing.get
import io.ktor.server.routing.routing import io.ktor.server.routing.routing
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import kotlinx.html.*
import ru.inr.mass.data.api.NumassPoint import ru.inr.mass.data.api.NumassPoint
import ru.inr.mass.data.proto.NumassDirectorySet import ru.inr.mass.data.proto.NumassDirectorySet
import ru.inr.mass.data.proto.NumassProtoPlugin 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.NameToken
import space.kscience.dataforge.names.cutLast import space.kscience.dataforge.names.cutLast
import space.kscience.dataforge.names.lastOrNull 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") { val context = Context("Numass") {
plugin(NumassProtoPlugin) plugin(NumassProtoPlugin)
plugin(NumassCommonPlugin) plugin(NumassCommonPlugin)
@ -37,96 +45,98 @@ public suspend fun main() {
val numassCommon = context.fetch(NumassCommonPlugin) val numassCommon = context.fetch(NumassCommonPlugin)
val visionManager = numassCommon.visionManager val visionManager = numassCommon.visionManager
val repository: DataTree<NumassDirectorySet> = runBlocking { numassProto.readRepository(repositoryName) }
val repositroyName = "D:\\Work\\Numass\\data\\test" routing {
resources()
val port = 7777 get("/") {
val host = "localhost" call.respondHtml {
head {
val url = URLBuilder(host = host, port = port).build() meta { charset = "utf-8" }
meta {
val repository: DataTree<NumassDirectorySet> = numassProto.readRepository(repositroyName) name = "viewport"
content = "width=device-width, initial-scale=1"
val visionOfNumassRepository = VisionOfNumassRepository(Name.EMPTY, repository) }
title("Numass Data Viewer")
val server = context.embeddedServer(CIO, port, host) { link {
routing { href = "https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css"
get("/repository") { rel = "stylesheet"
call.respondText { attributes["integrity"] =
visionManager.encodeToString(visionOfNumassRepository) "sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65"
attributes["crossorigin"] = "anonymous"
}
} }
} body {
div {
get("/sets/{name...}") { id = "application"
val setName: Name? = call.parameters.getAll("name") }
?.map { NameToken.parse(it) }?.let(::Name) script {
src = "js/numass-web.js"
if (setName == null) { }
call.respondText(status = HttpStatusCode.BadRequest) { "Set name is empty" } script {
return@get 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"
val set: NumassDirectorySet? = withContext(Dispatchers.IO) { repository[setName]?.await() } }
if (set == null) {
call.respondText(status = HttpStatusCode.NotFound) { "A set with name $setName not found in the repository" }
return@get
}
call.respondText {
visionManager.encodeToString(VisionOfNumassSet(setName, set))
}
}
get("/points/{name...}") {
val fullName: Name? = call.parameters.getAll("name")
?.map { NameToken.parse(it) }?.let(::Name)
if (fullName == null) {
call.respondText(status = HttpStatusCode.BadRequest) { "Point name is empty" }
return@get
}
val setName = fullName.cutLast()
val set: NumassDirectorySet? = withContext(Dispatchers.IO) { repository[setName]?.await() }
if (set == null) {
call.respondText(status = HttpStatusCode.NotFound) { "A set with name $setName not found in the repository" }
return@get
}
val pointIndex: Int? = fullName.lastOrNull()?.body?.toIntOrNull()
val point: NumassPoint? = set.points.find { it.index == pointIndex }
if (point == null) {
call.respondText(status = HttpStatusCode.NotFound) { "A point with name $setName/$pointIndex not found in the repository" }
return@get
}
call.respondText {
visionManager.encodeToString(point.toVision())
} }
} }
} }
visionServer(numassCommon.visionManager, url)
}.start()
// val server = context.visionManager.serve { get("/repository") {
// header("numass", VisionPage.scriptHeader("js/numass-web.js")) call.respondText(ContentType.Application.Json) {
// page { visionManager.encodeToString(VisionOfNumassRepository(Name.EMPTY, repository))
// div("flex-column") { }
// h1 { +"Visionforge file demo" } }
// vision { visionOfNumass }
// }
// }
// }
server.openInBrowser() get("/sets/{name...}") {
val setName: Name? = call.parameters.getAll("name")
?.map { NameToken.parse(it) }?.let(::Name)
if (setName == null) {
call.respondText(status = HttpStatusCode.BadRequest) { "Set name is empty" }
return@get
}
println("Enter 'exit' to close server") val set: NumassDirectorySet? = withContext(Dispatchers.IO) { repository[setName]?.await() }
while (readLine() != "exit") { if (set == null) {
// call.respondText(status = HttpStatusCode.NotFound) { "A set with name $setName not found in the repository" }
return@get
}
call.respondText(ContentType.Application.Json) {
visionManager.encodeToString(VisionOfNumassSet(setName, set))
}
}
get("/points/{name...}") {
val fullName: Name? = call.parameters.getAll("name")
?.map { NameToken.parse(it) }?.let(::Name)
if (fullName == null) {
call.respondText(status = HttpStatusCode.BadRequest) { "Point name is empty" }
return@get
}
val setName = fullName.cutLast()
val set: NumassDirectorySet? = withContext(Dispatchers.IO) { repository[setName]?.await() }
if (set == null) {
call.respondText(status = HttpStatusCode.NotFound) { "A set with name $setName not found in the repository" }
return@get
}
val pointIndex: Int? = fullName.lastOrNull()?.body?.toIntOrNull()
val point: NumassPoint? = set.points.find { it.index == pointIndex }
if (point == null) {
call.respondText(status = HttpStatusCode.NotFound) { "A point with name $setName/$pointIndex not found in the repository" }
return@get
}
call.respondText(ContentType.Application.Json) {
visionManager.encodeToString(point.toVision())
}
}
} }
//serveVisionData(VisionRoute("/visions", visionManager))
server.close()
} }

View File

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

View File

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

View File

@ -15,10 +15,10 @@
*/ */
package ru.inr.mass.models package ru.inr.mass.models
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.data.ColumnarData import space.kscience.kmath.data.ColumnarData
import space.kscience.kmath.expressions.Symbol import space.kscience.kmath.expressions.Symbol
import space.kscience.kmath.expressions.symbol import space.kscience.kmath.expressions.symbol
import space.kscience.kmath.misc.UnstableKMathAPI
import space.kscience.kmath.structures.Buffer 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 { override fun derivativeOrNull(symbols: List<Symbol>): Spectrum? = when {
symbols.isEmpty() -> this symbols.isEmpty() -> this
symbols.size == 1 -> when (symbols.first()) { symbols.size == 1 -> when (symbols.first()) {
norm -> Spectrum { x, arguments -> source(x, arguments) + (arguments[bkg] ?: 0.0) } norm -> Spectrum { x, arguments -> source(x, arguments) }
bkg -> Spectrum { x, arguments -> (arguments[norm] ?: 1.0) * source(x, arguments) } bkg -> Spectrum { _, _ -> 1.0 }
else -> (source as? DifferentiableSpectrum)?.derivativeOrNull(symbols)?.let { NBkgSpectrum(it) } else -> (source as? DifferentiableSpectrum)?.derivativeOrNull(symbols)?.let { NBkgSpectrum(it) }
} }
else -> null else -> null

View File

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

View File

@ -12,10 +12,13 @@ import kotlin.math.sqrt
/** /**
* @author [Alexander Nozik](mailto:altavir@gmail.com) * @author [Alexander Nozik](mailto:altavir@gmail.com)
*/ */
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
public class NumassResolution( public class NumassResolution(
public val resA: Double = 8.3e-5, public val resA: Double = 1.7e-4,
public val resB: Double = 0.0, public val resB: Double = 0.0,
public val tailFunction: (Double, Double) -> Double = { _, _ -> 1.0 }, // Recent formula for adiabacity
public val tailFunction: (Double, Double) -> Double = { e, u -> -1.75559e-13 * (e - u) * (e - u) * (e - u) - 5.97479e-11 * (e - u) * (e - u) + 3.26473e-7 * (e - u) + 1.0 },
) : DifferentiableKernel { ) : DifferentiableKernel {
// private val tailFunction: Kernel = when { // private val tailFunction: Kernel = when {
@ -43,12 +46,12 @@ public class NumassResolution(
// else -> ResolutionFunction.getConstantTail() // else -> ResolutionFunction.getConstantTail()
// } // }
private fun getValueFast(E: Double, U: Double): Double { private fun getValueFast(e: Double, u: Double): Double {
val delta = resA * E val delta = resA * e
return when { return when {
E - U < 0 -> 0.0 e - u < 0 -> 0.0
E - U > delta -> tailFunction(E, U) e - u > delta -> tailFunction(e, u)
else -> (E - U) / delta else -> (e - u) / delta
} }
} }
@ -57,15 +60,15 @@ public class NumassResolution(
override val x: Symbol get() = e override val x: Symbol get() = e
override val y: Symbol get() = u 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) { if (resB <= 0) {
return this.getValueFast(E, U) return this.getValueFast(e, u)
} }
val delta = resA * E val delta = resA * e
return when { return when {
E - U < 0 -> 0.0 e - u < 0 -> 0.0
E - U > delta -> tailFunction(E, U) e - u > delta -> tailFunction(e, u)
else -> (1 - sqrt(1 - (E - U) / E * resB)) / (1 - sqrt(1 - resA * resB)) else -> (1 - sqrt(1 - (e - u) / e * resB)) / (1 - sqrt(1 - resA * resB))
} }
} }

View File

@ -20,7 +20,7 @@ import kotlin.math.*
* @author [Alexander Nozik](mailto:altavir@gmail.com) * @author [Alexander Nozik](mailto:altavir@gmail.com)
*/ */
public class NumassTransmission( public class NumassTransmission(
public val trapFunc: Kernel = defaultTrapping, public val trapFunc: Kernel = trapFunction,
// private val adjustX: Boolean = false, // private val adjustX: Boolean = false,
) : DifferentiableKernel { ) : DifferentiableKernel {
// private val trapFunc: Kernel = if (meta.hasValue("trapping")) { // private val trapFunc: Kernel = if (meta.hasValue("trapping")) {
@ -54,8 +54,10 @@ public class NumassTransmission(
} }
sum sum
} }
else -> null else -> null
} }
else -> null else -> null
} }
@ -63,6 +65,7 @@ public class NumassTransmission(
// loss part // loss part
val thickness = arguments[thickness] ?: 0.0 val thickness = arguments[thickness] ?: 0.0
val loss = getTotalLossValue(thickness, ei, ef) val loss = getTotalLossValue(thickness, ei, ef)
//val loss = 0.0
// double loss; // double loss;
// //
// if(eIn-eOut >= 300){ // if(eIn-eOut >= 300){
@ -76,7 +79,9 @@ public class NumassTransmission(
// } // }
//trapping part //trapping part
//
val trap = (arguments[trap] ?: 1.0) * trapFunc(ei, ef, arguments) val trap = (arguments[trap] ?: 1.0) * trapFunc(ei, ef, arguments)
//val trap = 0.0
return loss + trap return loss + trap
} }
@ -86,7 +91,7 @@ public class NumassTransmission(
private val cache = HashMap<Int, Function1D<Double>>() private val cache = HashMap<Int, Function1D<Double>>()
private const val ION_POTENTIAL = 15.4//eV private const val ION_POTENTIAL = 13.6//eV
private fun getX(arguments: Map<Symbol, Double>, eIn: Double, adjustX: Boolean = false): Double { private fun getX(arguments: Map<Symbol, Double>, eIn: Double, adjustX: Boolean = false): Double {
@ -131,6 +136,7 @@ public class NumassTransmission(
} }
private fun getCachedSpectrum(order: Int): Function1D<Double> { private fun getCachedSpectrum(order: Int): Function1D<Double> {
//println("-------------------ORDER $order ------------------------")
return when { return when {
order <= 0 -> error("Non-positive loss cache order") order <= 0 -> error("Non-positive loss cache order")
order == 1 -> singleScatterFunction order == 1 -> singleScatterFunction
@ -274,13 +280,13 @@ public class NumassTransmission(
* Значение полной производной функции потерь с учетом всех неисчезающих * Значение полной производной функции потерь с учетом всех неисчезающих
* порядков * порядков
* *
* @param X * @param thickness
* @param eIn * @param eIn
* @param eOut * @param eOut
* @return * @return
*/ */
private fun getTotalLossDeriv(X: Double, eIn: Double, eOut: Double): Double { private fun getTotalLossDeriv(thickness: Double, eIn: Double, eOut: Double): Double {
val probs = getLossProbDerivs(X) val probs = getLossProbDerivs(thickness)
var sum = 0.0 var sum = 0.0
for (i in 1 until probs.size) { for (i in 1 until probs.size) {
@ -331,6 +337,7 @@ public class NumassTransmission(
val z = eps - pos1 val z = eps - pos1
A1 * exp(-2.0 * z * z / w1 / w1) A1 * exp(-2.0 * z * z / w1 / w1)
} }
else -> { else -> {
val z = 4.0 * (eps - pos2) * (eps - pos2) val z = 4.0 * (eps - pos2) * (eps - pos2)
A2 / (1 + z / w2 / w2) A2 / (1 + z / w2 / w2)
@ -399,8 +406,8 @@ public class NumassTransmission(
// return getSingleScatterFunction(exPos, ionPos, exW, ionW, exIonRatio) // return getSingleScatterFunction(exPos, ionPos, exW, ionW, exIonRatio)
// } // }
public val trapFunction: (Double, Double) -> Double = { Ei: Double, Ef: Double -> public val trapFunction: Kernel = Kernel { ei: Double, ef: Double, _ ->
val eps = Ei - Ef val eps = ei - ef
if (eps > 10) { if (eps > 10) {
1.86e-04 * exp(-eps / 25.0) + 5.5e-05 1.86e-04 * exp(-eps / 25.0) + 5.5e-05
} else { } else {

View File

@ -2,6 +2,7 @@ plugins {
id("space.kscience.gradle.jvm") id("space.kscience.gradle.jvm")
id("com.github.johnrengelman.shadow") version "7.1.2" id("com.github.johnrengelman.shadow") version "7.1.2"
`maven-publish` `maven-publish`
application
} }
kotlin { kotlin {
@ -9,7 +10,7 @@ kotlin {
} }
val dataforgeVersion: String by rootProject.extra val dataforgeVersion: String by rootProject.extra
val visionForgeVersion: String by rootProject.extra val plotlyKtVersion = "0.6.0"
val kmathVersion: String by rootProject.extra val kmathVersion: String by rootProject.extra
val tablesVersion: String by rootProject.extra val tablesVersion: String by rootProject.extra
@ -21,9 +22,15 @@ dependencies {
implementation("space.kscience:kmath-jupyter:$kmathVersion") implementation("space.kscience:kmath-jupyter:$kmathVersion")
implementation("space.kscience:tables-kt:$tablesVersion") implementation("space.kscience:tables-kt:$tablesVersion")
implementation("space.kscience:visionforge-plotly:$visionForgeVersion") implementation("space.kscience:plotlykt-core:$plotlyKtVersion")
implementation("com.github.ajalt.clikt:clikt:4.2.1")
} }
kscience{ kscience{
jupyterLibrary("ru.inr.mass.notebook.NumassJupyter") jupyterLibrary("ru.inr.mass.notebook.NumassJupyter")
} }
//application {
// mainClass.set("ru.inr.mass.scripts.Get_spectrumKt")
//}

View File

@ -0,0 +1,196 @@
package ru.inr.mass.scripts
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.core.context
import com.github.ajalt.clikt.output.MordantHelpFormatter
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.arguments.help
import com.github.ajalt.clikt.parameters.options.default
import com.github.ajalt.clikt.parameters.options.help
import com.github.ajalt.clikt.parameters.options.option
import com.github.ajalt.clikt.parameters.options.prompt
import com.github.ajalt.clikt.parameters.types.double
import com.github.ajalt.clikt.parameters.types.int
import kotlinx.coroutines.runBlocking
import ru.inr.mass.models.*
import ru.inr.mass.workspace.buffer
import ru.inr.mass.workspace.fitWith
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.data.XYColumnarData
import space.kscience.kmath.data.XYErrorColumnarData
import space.kscience.kmath.data.indices
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.kmath.structures.asBuffer
import space.kscience.plotly.*
import space.kscience.plotly.models.ScatterMode
import java.io.File
import kotlin.math.pow
@OptIn(UnstableKMathAPI::class)
fun parse(filename: String): XYErrorColumnarData<Double, Double, Double> {
val x: MutableList<Double> = mutableListOf()
val y: MutableList<Double> = mutableListOf()
val errors: MutableList<Double> = mutableListOf()
File(filename).forEachLine {
val array = it.split("\t").map { it.toDouble() }
x.add(array[0])
y.add(array[1])
errors.add(array[2])
//errors.add(array[1] / 100)
}
return XYErrorColumnarData.of(
x.asBuffer(),
y.asBuffer(),
errors.map { it }.asBuffer()
)
}
class Args : CliktCommand() {
init {
context {
helpFormatter = { MordantHelpFormatter(it, showDefaultValues = true) }
}
}
val spectrum: String by argument().help("path to spectrum TSV file")
val norm: Double by option().double().default(8.311751921319484E8).help("NBkgSpectrum.norm")
val bkg: Double by option().double().default(1612.626961212948).help("NBkgSpectrum.bkg")
val mnu2: Double by option().double().default(0.0).help("NumassBeta.mnu2")
val e0: Double by option().double().default(18572.0).help("NumassBeta.e0")
val msterile2: Double by option().double().default(0.0.pow(2)).help("NumassBeta.msterile2")
val u2: Double by option().double().default(1e-2).help("NumassBeta.u2")
val thickness: Double by option().double().default(0.3).help("NumassTransmission.thickness")
val trap: Double by option().double().default(1.0).help("NumassTransmission.trap")
@UnstableKMathAPI
override fun run() {
val fitParams: Map<Symbol, Double> = mapOf(
NBkgSpectrum.norm to norm,
NBkgSpectrum.bkg to bkg,
NumassBeta.mnu2 to mnu2,
NumassBeta.e0 to e0,
NumassBeta.msterile2 to msterile2,
NumassBeta.u2 to u2,
NumassTransmission.thickness to thickness,
NumassTransmission.trap to trap
)
runBlocking {
process(spectrum, fitParams)
}
}
}
fun main(args: Array<String>) = Args().main(args)
suspend fun fitNumassSpectrum(data: XYErrorColumnarData<Double, Double, Double>, initial: Map<Symbol, Double>): XYFit {
val spectrum: NBkgSpectrum = SterileNeutrinoSpectrum(
// fss = FSS.default,
transmission = NumassTransmission(NumassTransmission.trapFunction),
// resolution = NumassResolution(1.7e-4)
).withNBkg()
return data.fitWith(
optimizer = QowOptimizer,
modelExpression = spectrum,
startingPoint = initial,
OptimizationParameters(NumassBeta.e0, NBkgSpectrum.norm, NBkgSpectrum.bkg,
// NumassTransmission.trap
),
OptimizationIterations(20)
)
}
@UnstableKMathAPI
suspend fun process(spectrumFile: String, fitParams: Map<Symbol, Double>) {
val data = parse(spectrumFile)
val spectrum: NBkgSpectrum = SterileNeutrinoSpectrum(
// fss = FSS.default,
transmission = NumassTransmission(NumassTransmission.trapFunction),
// resolution = NumassResolution(1.7e-4)
).withNBkg()
val fit = fitNumassSpectrum(data, fitParams)
println(fit.resultPoint)
Plotly.page {
plot {
scatter {
name = "Data"
mode = ScatterMode.markers
x.buffer = data.x
y.buffer = data.y
}
scatter {
name = "Initial"
mode = ScatterMode.lines
x.buffer = data.x
y.numbers = x.doubles.map { spectrum(it, fitParams + fit.resultPoint) }
File(spectrumFile + "-fit").printWriter().use { out ->
out.println("U_sp\tcounts\tresidials")
data.indices.map{
val value = spectrum(data.x[it], fitParams + fit.resultPoint)
val dif = data.y[it] - value
out.println("${data.x[it]}\t${data.y[it]}\t${dif/data.yErr[it]}")
}
}
}
scatter {
name = "Fit"
mode = ScatterMode.lines
x.buffer = 12000.0..18600.0 step 10.0
y.numbers = x.doubles.map { spectrum(it, fitParams + fit.resultPoint) }
}
}
plot{
scatter {
name = "Residuals"
mode = ScatterMode.markers
x.buffer = data.x
y.numbers = data.indices.map{
val value = spectrum(data.x[it], fitParams + fit.resultPoint)
val dif = data.y[it] - value
dif/data.yErr[it]
}
}
}
plot{
histogram {
x.numbers = data.indices.map{
val value = spectrum(data.x[it], fitParams + fit.resultPoint)
val dif = data.y[it] - value
dif/data.yErr[it]
}
name = "Res histo"
}
}
plot {
scatter {
name = "Residuals_lines"
mode = ScatterMode.lines
x.buffer = data.x
y.numbers = data.indices.map {
val value = spectrum(data.x[it], fitParams + fit.resultPoint)
val dif = data.y[it] - value
dif / data.yErr[it]
}
}
}
}.makeFile()
}

View File

@ -0,0 +1,89 @@
package ru.inr.mass.scripts
import com.github.ajalt.clikt.core.CliktCommand
import com.github.ajalt.clikt.core.context
import com.github.ajalt.clikt.output.MordantHelpFormatter
import com.github.ajalt.clikt.parameters.arguments.argument
import com.github.ajalt.clikt.parameters.arguments.help
import com.github.ajalt.clikt.parameters.options.default
import com.github.ajalt.clikt.parameters.options.help
import com.github.ajalt.clikt.parameters.options.option
import com.github.ajalt.clikt.parameters.types.double
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
import ru.inr.mass.models.*
import space.kscience.kmath.data.XYErrorColumnarData
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.expressions.Symbol
import space.kscience.kmath.operations.toTypedArray
import space.kscience.kmath.real.plus
import space.kscience.kmath.real.step
import space.kscience.plotly.models.HoverMode
import kotlin.math.pow
private class CalcSpectrum : CliktCommand() {
init {
context {
helpFormatter = { MordantHelpFormatter(it, showDefaultValues = true) }
}
}
val spectrum: String by argument().help("path to spectrum TSV file")
val norm: Double by option().double().default(8.84e8).help("NBkgSpectrum.norm")
val bkg: Double by option().double().default(-1.702).help("NBkgSpectrum.bkg")
val mnu2: Double by option().double().default(0.0).help("NumassBeta.mnu2")
val e0: Double by option().double().default(18572.0).help("NumassBeta.e0")
val msterile2: Double by option().double().default(0.0.pow(2)).help("NumassBeta.msterile2")
val u2: Double by option().double().default(1e-2).help("NumassBeta.u2")
val thickness: Double by option().double().default(0.3).help("NumassTransmission.thickness")
val trap: Double by option().double().default(1.0).help("NumassTransmission.trap")
@UnstableKMathAPI
override fun run() {
val fitParams: Map<Symbol, Double> = mapOf(
NBkgSpectrum.norm to norm,
NBkgSpectrum.bkg to bkg,
NumassBeta.mnu2 to mnu2,
NumassBeta.e0 to e0,
NumassBeta.msterile2 to msterile2,
NumassBeta.u2 to u2,
NumassTransmission.thickness to thickness,
NumassTransmission.trap to trap
)
runBlocking {
calcSpectrum(spectrum, fitParams)
}
}
}
fun main(args: Array<String>) = CalcSpectrum().main(args)
suspend fun calcSpectrum(spectrumFile: String, fitParams: Map<Symbol, Double>) {
val data = parse(spectrumFile)
val range = data.x.toTypedArray();
runBlocking(Dispatchers.Default) {
val handles = range.map {
async(Dispatchers.Default) {
val spectrum: NBkgSpectrum = SterileNeutrinoSpectrum(
transmission = NumassTransmission(NumassTransmission.trapFunction),
).withNBkg()
val res = spectrum.invoke(it, fitParams)
return@async res
}
}
val out = handles.map { it.await() }
println(out.joinToString("\n"))
}
}

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

@ -18,7 +18,6 @@ import space.kscience.dataforge.workspace.WorkspacePlugin
import space.kscience.dataforge.workspace.pipeFrom import space.kscience.dataforge.workspace.pipeFrom
import space.kscience.dataforge.workspace.task import space.kscience.dataforge.workspace.task
import space.kscience.tables.Table import space.kscience.tables.Table
import kotlin.reflect.KClass
class NumassWorkspacePlugin : WorkspacePlugin() { class NumassWorkspacePlugin : WorkspacePlugin() {
override val tag: PluginTag get() = Companion.tag override val tag: PluginTag get() = Companion.tag
@ -128,7 +127,6 @@ class NumassWorkspacePlugin : WorkspacePlugin() {
companion object : PluginFactory<NumassWorkspacePlugin> { companion object : PluginFactory<NumassWorkspacePlugin> {
override val tag: PluginTag = PluginTag("numass", "ru.mipt.npm") 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() 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 ru.inr.mass.data.proto.NumassDirectorySet
import space.kscience.dataforge.meta.asValue import space.kscience.dataforge.meta.asValue
import space.kscience.dataforge.meta.double import space.kscience.dataforge.meta.double
import space.kscience.kmath.UnstableKMathAPI
import space.kscience.kmath.domains.center import space.kscience.kmath.domains.center
import space.kscience.kmath.histogram.Histogram1D import space.kscience.kmath.histogram.Histogram1D
import space.kscience.kmath.misc.UnstableKMathAPI
import space.kscience.kmath.operations.asIterable import space.kscience.kmath.operations.asIterable
import space.kscience.kmath.structures.Buffer import space.kscience.kmath.structures.Buffer
import space.kscience.kmath.structures.DoubleBuffer import space.kscience.kmath.structures.DoubleBuffer

View File

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