From 8c8f4adc2e48e19a937360e970500bfc6e364999 Mon Sep 17 00:00:00 2001 From: Peter Klimai Date: Thu, 7 May 2020 16:52:57 +0300 Subject: [PATCH 1/2] Create README files per demo project --- README.md | 35 ++++++++++++++------------------- demo/gdml/README.md | 15 ++++++++++++++ demo/muon-monitor/README.md | 17 ++++++++++++++++ demo/spatial-showcase/README.md | 13 ++++++++++++ 4 files changed, 60 insertions(+), 20 deletions(-) create mode 100644 demo/gdml/README.md create mode 100644 demo/muon-monitor/README.md create mode 100644 demo/spatial-showcase/README.md diff --git a/README.md b/README.md index 51eba421..17804d8f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # DataForge Visualization Platform -## Table of contents +## Table of Contents * [Introduction](#introduction) * [Features](#features) @@ -13,8 +13,8 @@ * [dataforge-vis-spatial-gdml](#dataforge-vis-spatial-gdml) * [dataforge-vis-jsroot](#dataforge-vis-jsroot) * [Demonstrations](#demonstrations) - * [Spatial Showcase](#spatial-showcase) - * [Muon Monitor](#muon-monitor-visualization) + * [Simple Example - Spatial Showcase](#simple-example-spatial-showcase) + * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example-muon-monitor-visualization) * [GDML Example](#gdml-example) @@ -26,8 +26,8 @@ used for visualization in various scientific applications. The main framework's use case for now is 3D visualization for particle physics experiments. Other applications including 2D plots are planned for the future. -The project is being developed as a Kotlin multiplatform application, currently targeting browser -JavaScript and JVM. +The project is being developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) +application, currently targeting browser JavaScript and JVM. ## Features @@ -105,42 +105,37 @@ Note: Currently, this part is experimental and put here for completeness. This m ## Demonstrations -The `demo` module contains several demonstrations of using the `dataforge-vis` framework: +The `demo` module contains several example projects (demonstrations) of using the `dataforge-vis` framework: -### Spatial Showcase +### Simple Example - Spatial Showcase Contains a simple demonstration with a grid including a few shapes that you can rotate, move camera, and so on. -Some shapes will also periodically change their color and visibility. - -To see the demo: run `demo/spatial-showcase/Tasks/distribution/installJsDist` Gradle task, then open -`build/distribuions/spatial-showcase-js-0.1.0-dev/index.html` file in your browser. +Some shapes will also periodically change their color and visibility. + +[More details](demo/spatial-showcase/README.md) ##### Example view: ![](doc/resources/spatial-showcase.png) -### Muon Monitor Visualization + +### Full-Stack Application Example - Muon Monitor Visualization A full-stack application example, showing the [Muon Monitor](http://npm.mipt.ru/projects/physics.html#mounMonitor) experiment set-up. -Includes server back-end generating events, as well as visualization front-end. - -To run full-stack app (both server and browser front-end), run -`demo/muon-monitor/application/run` task. +[More details](demo/muon-monitor/README.md) ##### Example view: ![](doc/resources/muon-monitor.png) + ### GDML Example Visualization example for geometry defined as GDML file. -To build the app, run `demo/gdml/Tasks/distribution/installJsDist` task, then open -`build/distribuions/gdml-js-0.1.0-dev/index.html` file in your browser, and -drag-and-drop GDML file to the window to see visualization. For an example file, use -`demo/gdml/src/jsMain/resources/cubes.gdml`. +[More details](demo/gdml/README.md) ##### Example view: diff --git a/demo/gdml/README.md b/demo/gdml/README.md new file mode 100644 index 00000000..5bdee058 --- /dev/null +++ b/demo/gdml/README.md @@ -0,0 +1,15 @@ + +### GDML Example + +Visualization example for geometry defined as GDML file. + +##### Building project + +To build the app, run `demo/gdml/Tasks/distribution/jsBrowserDistribution` Gradle task, then open +`demo/gdml/build/distribuions/gdml-js-0.1.3-dev/index.html` file in your browser, and +drag-and-drop GDML file to the window to see visualization. For an example file, you can use +`demo/gdml/src/jsMain/resources/cubes.gdml`. + +##### Example view: + +![](../../doc/resources/gdml-demo.png) diff --git a/demo/muon-monitor/README.md b/demo/muon-monitor/README.md new file mode 100644 index 00000000..c39b5329 --- /dev/null +++ b/demo/muon-monitor/README.md @@ -0,0 +1,17 @@ + +### Muon Monitor Visualization + +A full-stack application example, showing the +[Muon Monitor](http://npm.mipt.ru/projects/physics.html#mounMonitor) experiment set-up. + +Includes server back-end generating events, as well as visualization front-end. + +##### Building project + +To run full-stack Muon Monitor Visualization application (both server and browser front-end), run +`demo/muon-monitor/application/run` task. + +##### Example view: + +![](../../doc/resources/muon-monitor.png) + diff --git a/demo/spatial-showcase/README.md b/demo/spatial-showcase/README.md new file mode 100644 index 00000000..d93d6c2d --- /dev/null +++ b/demo/spatial-showcase/README.md @@ -0,0 +1,13 @@ +### Spatial Showcase + +Contains a simple demonstration with a grid including a few shapes that you can rotate, move camera, and so on. +Some shapes will also periodically change their color and visibility. + +##### Building project + +To see the demo: run `demo/spatial-showcase/Tasks/distribution/jsBrowserDistribution` Gradle task, then open +`build/distribuions/spatial-showcase-js-0.1.3-dev/index.html` file in your browser. + +##### Example view: + +![](../../doc/resources/spatial-showcase.png) From f8222adfe7991fdb00210853f8b8787269712748 Mon Sep 17 00:00:00 2001 From: Peter Klimai Date: Fri, 8 May 2020 00:42:10 +0300 Subject: [PATCH 2/2] Update READMEs --- README.md | 21 ++++++++++++++++----- demo/muon-monitor/README.md | 26 +++++++++++++++++++++----- demo/spatial-showcase/README.md | 10 ++++++++-- doc/resources/spatial-showcase-FX.png | Bin 0 -> 28876 bytes 4 files changed, 45 insertions(+), 12 deletions(-) create mode 100644 doc/resources/spatial-showcase-FX.png diff --git a/README.md b/README.md index 17804d8f..7e69faa4 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,10 @@ * [dataforge-vis-spatial](#dataforge-vis-spatial) * [dataforge-vis-spatial-gdml](#dataforge-vis-spatial-gdml) * [dataforge-vis-jsroot](#dataforge-vis-jsroot) +* [Visualization for External Systems](#visualization-for-external-systems) * [Demonstrations](#demonstrations) - * [Simple Example - Spatial Showcase](#simple-example-spatial-showcase) - * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example-muon-monitor-visualization) + * [Simple Example - Spatial Showcase](#simple-example---spatial-showcase) + * [Full-Stack Application Example - Muon Monitor](#full-stack-application-example---muon-monitor-visualization) * [GDML Example](#gdml-example) @@ -26,7 +27,7 @@ used for visualization in various scientific applications. The main framework's use case for now is 3D visualization for particle physics experiments. Other applications including 2D plots are planned for the future. -The project is being developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) +The project is developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) application, currently targeting browser JavaScript and JVM. @@ -103,9 +104,19 @@ Some JSROOT bindings. Note: Currently, this part is experimental and put here for completeness. This module may not build. +## Visualization for External Systems + +The `dataforge-vis` framework can be used to visualize geometry and events from external, +non-Kotlin based systems, such as ROOT. This will require a plugin to convert data model +of the external system to that of `dataforge-vis`. Performing such integration is a work +currently in progress. + + ## Demonstrations -The `demo` module contains several example projects (demonstrations) of using the `dataforge-vis` framework: +The `demo` module contains several example projects (demonstrations) of using the `dataforge-vis` framework. +They are briefly described in this section, for more details please consult the corresponding per-project +README file. ### Simple Example - Spatial Showcase @@ -122,7 +133,7 @@ Some shapes will also periodically change their color and visibility. ### Full-Stack Application Example - Muon Monitor Visualization A full-stack application example, showing the -[Muon Monitor](http://npm.mipt.ru/projects/physics.html#mounMonitor) experiment set-up. +[Muon Monitor](http://npm.mipt.ru/en/projects/physics#mounMonitor) experiment set-up. [More details](demo/muon-monitor/README.md) diff --git a/demo/muon-monitor/README.md b/demo/muon-monitor/README.md index c39b5329..322056fc 100644 --- a/demo/muon-monitor/README.md +++ b/demo/muon-monitor/README.md @@ -1,15 +1,31 @@ ### Muon Monitor Visualization -A full-stack application example, showing the -[Muon Monitor](http://npm.mipt.ru/projects/physics.html#mounMonitor) experiment set-up. +This directory contains a full-stack application example built with `dataforge-vis`. +It is visualizing the +[Muon Monitor](http://npm.mipt.ru/projects/physics.html#mounMonitor) experiment set-up, +including experiment's geometry and events (particle tracks). -Includes server back-end generating events, as well as visualization front-end. +#### Reusing code and going Full-Stack with Kotlin Multiplatform + +The application includes both server back-end generating events, as well as client +visualization front-end. + +As is common for Kotlin multiplatform projects, the code base of this simple application +is put in the following main directories: +* `commonMain` - common code, used by both JS client and JVM server. For example, the `Monitor` +object describes general geometry definitions needed in all parts of the application. +* `jsMain` - JavaScript client code. It performs visualization and reads events from the server. +* `jvmMain` - JVM server code. It runs `ktor` HTTP server, responding with event data when +client requests them. + +Note that in a more traditional approach when client and server are developed separately +and possibly using different languages, there would be no benefit of reusing common code. ##### Building project -To run full-stack Muon Monitor Visualization application (both server and browser front-end), run -`demo/muon-monitor/application/run` task. +To run full-stack Muon Monitor Visualization application (both JVM server and Web browser front-end), +run `demo/muon-monitor/application/run` task. ##### Example view: diff --git a/demo/spatial-showcase/README.md b/demo/spatial-showcase/README.md index d93d6c2d..6537f7f2 100644 --- a/demo/spatial-showcase/README.md +++ b/demo/spatial-showcase/README.md @@ -5,9 +5,15 @@ Some shapes will also periodically change their color and visibility. ##### Building project -To see the demo: run `demo/spatial-showcase/Tasks/distribution/jsBrowserDistribution` Gradle task, then open +To see the JS demo: run `demo/spatial-showcase/Tasks/distribution/jsBrowserDistribution` Gradle task, then open `build/distribuions/spatial-showcase-js-0.1.3-dev/index.html` file in your browser. -##### Example view: +To see Java FX demo, run `main()` from `FXDemoApp.kt`. + +##### Example view for JS: ![](../../doc/resources/spatial-showcase.png) + +##### Example view for Java FX: + +![](../../doc/resources/spatial-showcase-FX.png) diff --git a/doc/resources/spatial-showcase-FX.png b/doc/resources/spatial-showcase-FX.png new file mode 100644 index 0000000000000000000000000000000000000000..86300d767d0285d65ec8d8cae2398f1ddebe661f GIT binary patch literal 28876 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Π*pjd_B-LgbdK(JuH-xUR|EnyC*z_e)CfGS)dQ=NM8FnNRs>a+ z0puyndU2t5Tr=hXR`ad5;P+PlGq%uQBv)}r7?_33;|;Dj__Okeyh{jtXy&@Oi0t8w z|IWasy8(yV z@6^dWcQ$2ZrLosjt7iP-@ZmkF|9kr@<7+%0_aG67r*Jvq|K~$}f4}BqD!IDL#BYJ* WR`%L^5WYb8&qZBRbcy!Wd;bUcvt3#M literal 0 HcmV?d00001