diff --git a/numass-core/build.gradle b/numass-core/build.gradle index 1f3200bc..840da3c0 100644 --- a/numass-core/build.gradle +++ b/numass-core/build.gradle @@ -14,10 +14,11 @@ description = "A bse package with minimal dependencies for numass" dependencies { compile "hep.dataforge:dataforge-storage" //project(':dataforge-storage') + compile "hep.dataforge:kodex" compile 'com.google.protobuf:protobuf-java:3.5.0' // https://mvnrepository.com/artifact/com.github.robtimus/sftp-fs - compile group: 'com.github.robtimus', name: 'sftp-fs', version: '1.1.1' + compile group: 'com.github.robtimus', name: 'sftp-fs', version: '1.1.3' } protobuf { diff --git a/numass-main/build.gradle b/numass-main/build.gradle index 55121d7b..d6fcb8f4 100644 --- a/numass-main/build.gradle +++ b/numass-main/build.gradle @@ -74,3 +74,9 @@ task underflow(dependsOn: classes, type: JavaExec) { classpath = sourceSets.main.runtimeClasspath } +task scanTreeStartScript(type: CreateStartScripts, dependsOn: installDist) { + applicationName = 'scanTree' + classpath = fileTree('build/install/numass-main/lib') + mainClassName = 'inr.numass.scripts.ScanTreeKt' + outputDir = file('build/install/numass-main/bin') +} \ No newline at end of file diff --git a/numass-main/src/main/kotlin/inr/numass/actions/TimeAnalyzerAction.kt b/numass-main/src/main/kotlin/inr/numass/actions/TimeAnalyzerAction.kt index 9dfca90b..4ef5f303 100644 --- a/numass-main/src/main/kotlin/inr/numass/actions/TimeAnalyzerAction.kt +++ b/numass-main/src/main/kotlin/inr/numass/actions/TimeAnalyzerAction.kt @@ -21,7 +21,7 @@ import inr.numass.data.api.NumassPoint @ValueDefs( ValueDef(name = "normalize", type = arrayOf(ValueType.BOOLEAN), def = "true", info = "Normalize t0 dependencies"), ValueDef(name = "t0", type = arrayOf(ValueType.NUMBER), def = "30e3", info = "The default t0 in nanoseconds"), - ValueDef(name = "window.lo", type = arrayOf(ValueType.NUMBER), def = "500", info = "Lower boundary for amplitude window"), + ValueDef(name = "window.lo", type = arrayOf(ValueType.NUMBER), def = "0", info = "Lower boundary for amplitude window"), ValueDef(name = "window.up", type = arrayOf(ValueType.NUMBER), def = "10000", info = "Upper boundary for amplitude window"), ValueDef(name = "binNum", type = arrayOf(ValueType.NUMBER), def = "1000", info = "Number of bins for time histogram"), ValueDef(name = "binSize", type = arrayOf(ValueType.NUMBER), info = "Size of bin for time histogram. By default is defined automatically") @@ -39,8 +39,8 @@ class TimeAnalyzerAction : OneToOneAction() { //val t0 = inputMeta.getDouble("t0", 30e3); - val loChannel = inputMeta.getInt("window.lo", 500); - val upChannel = inputMeta.getInt("window.up", 10000); +// val loChannel = inputMeta.getInt("window.lo", 500); +// val upChannel = inputMeta.getInt("window.up", 10000); val pm = context.getFeature(PlotPlugin::class.java); @@ -101,7 +101,7 @@ class TimeAnalyzerAction : OneToOneAction() { pm.getPlotFrame(getName(), "stat-method").add(statPlot) - (1..100).map { 1000 * it }.map { t -> + (1..100).map { inputMeta.getDouble("t0Step", 1000.0) * it }.map { t -> val result = analyzer.analyze(input, inputMeta.builder.setValue("t0", t)) diff --git a/numass-main/src/main/kotlin/inr/numass/scripts/Bunches.kt b/numass-main/src/main/kotlin/inr/numass/scripts/Bunches.kt index 28f5f374..37400d53 100644 --- a/numass-main/src/main/kotlin/inr/numass/scripts/Bunches.kt +++ b/numass-main/src/main/kotlin/inr/numass/scripts/Bunches.kt @@ -1,8 +1,8 @@ package inr.numass.scripts +import hep.dataforge.fx.plots.PlotManager import hep.dataforge.kodex.buildMeta -import inr.numass.data.analyzers.NumassAnalyzer -import inr.numass.data.analyzers.SmartAnalyzer +import inr.numass.actions.TimeAnalyzerAction import inr.numass.data.api.SimpleNumassPoint import inr.numass.data.buildBunchChain import inr.numass.data.buildSimpleEventChain @@ -12,13 +12,15 @@ import java.time.Instant fun main(args: Array) { + PlotManager().startGlobal() + val cr = 10.0 val length = 1e12.toLong() - val num = 20; + val num = 60; val blocks = (1..num).map { val regularChain = buildSimpleEventChain(cr) - val bunchChain = buildBunchChain(20.0, 0.01, 5.0) + val bunchChain = buildBunchChain(40.0, 0.01, 5.0) val generator = mergeEventChains(regularChain, bunchChain) generateBlock(Instant.now().plusNanos(it * length), length, generator) @@ -27,14 +29,19 @@ fun main(args: Array) { val point = SimpleNumassPoint(10000.0, blocks) val meta = buildMeta { - "t0.crFraction" to 0.1 + "t0" to 1e7 + "t0Step" to 4e6 + "normalize" to false + "t0.crFraction" to 0.5 } println("actual count rate: ${point.events.count().toDouble() / point.length.seconds}") - val res = SmartAnalyzer().analyze(point, meta) - .getDouble(NumassAnalyzer.COUNT_RATE_KEY) + TimeAnalyzerAction().simpleRun(point,meta) - println("estimated count rate: $res") +// val res = SmartAnalyzer().analyze(point, meta) +// .getDouble(NumassAnalyzer.COUNT_RATE_KEY) +// +// println("estimated count rate: $res") } \ No newline at end of file diff --git a/numass-main/src/main/kotlin/inr/numass/scripts/ScanTree.kt b/numass-main/src/main/kotlin/inr/numass/scripts/ScanTree.kt new file mode 100644 index 00000000..f043c353 --- /dev/null +++ b/numass-main/src/main/kotlin/inr/numass/scripts/ScanTree.kt @@ -0,0 +1,103 @@ +package inr.numass.scripts + +import hep.dataforge.io.XMLMetaWriter +import hep.dataforge.kodex.buildMeta +import hep.dataforge.kodex.global +import hep.dataforge.kodex.useValue +import hep.dataforge.meta.Meta +import hep.dataforge.meta.MetaBuilder +import hep.dataforge.meta.MetaUtils +import hep.dataforge.storage.api.Storage +import inr.numass.data.storage.NumassDataLoader +import inr.numass.data.storage.NumassStorageFactory +import java.io.File +import java.nio.file.Paths + +private fun createSummaryNode(storage: Storage): MetaBuilder { + global.logger.info("Reading content of shelf {}", storage.fullName) + + val builder = MetaBuilder("shelf") + .setValue("name", storage.name) + .setValue("path", storage.fullName) + storage.shelves().filter { it.name.startsWith("Fill") }.forEach { + builder.putNode(createSummaryNode(it)) + } + storage.loaders().filterIsInstance(NumassDataLoader::class.java).forEach { set -> + + global.logger.info("Reading content of set {}", set.fullName) + + val setBuilder = MetaBuilder("set") + .setValue("name", set.name) + .setValue("path", set.fullName) + + if (set.name.endsWith("bad")) { + setBuilder.setValue("bad", true) + } + + set.points.forEach { point -> + val pointBuilder = MetaBuilder("point") + .setValue("index", point.index) + .setValue("hv", point.voltage) + .setValue("startTime", point.startTime) +// .setNode("meta", point.meta) + + point.meta.useValue("acquisition_time") { + pointBuilder.setValue("length", it.doubleValue()) + } + + point.meta.useValue("events") { + pointBuilder.setValue("count", it.listValue().stream().mapToInt { it.intValue() }.sum()) + } + + setBuilder.putNode(pointBuilder) + } + builder.putNode(setBuilder) + } + return builder +} + +fun calculateStatistics(summary: Meta, hv: Double): Meta { + var totalLength = 0.0 + var totalCount = 0L + MetaUtils.nodeStream(summary).map { it.value }.filter { it.name == "point" && it.getDouble("hv") == hv }.forEach { + totalCount += it.getInt("count") + totalLength += it.getDouble("length") + } + return buildMeta("point") { + "hv" to hv + "time" to totalLength + "count" to totalCount + } +} + +fun main(args: Array) { + val directory = if (args.isNotEmpty()) { + args.first() + } else { + "." + } + + val path = Paths.get(directory) + + val output = File(directory, "summary.xml") + output.createNewFile() + + + val storage = NumassStorageFactory.buildLocal(global, path, true, false) + val summary = createSummaryNode(storage) + + global.logger.info("Writing output meta") + output.outputStream().use { + XMLMetaWriter().write(it, summary) + } + global.logger.info("Calculating statistics") + val statistics = MetaBuilder("statistics") + (14000..18600).step(100).map { it.toDouble() }.forEach { + statistics.putNode(calculateStatistics(summary, it)) + } + + File(directory, "statistics.xml").outputStream().use { + XMLMetaWriter().write(it, statistics) + } + +} \ No newline at end of file diff --git a/numass-server/build.gradle b/numass-server/build.gradle index f2217a7a..c4c17a1b 100644 --- a/numass-server/build.gradle +++ b/numass-server/build.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { classpath 'io.ratpack:ratpack-gradle:1.4.6' - classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' + classpath 'com.github.jengelman.gradle.plugins:shadow:2.+' } }