diff --git a/data/home/content/people/Muhina.md b/data/home/content/people/Muhina.md new file mode 100644 index 0000000..60ea1df --- /dev/null +++ b/data/home/content/people/Muhina.md @@ -0,0 +1,14 @@ +--- +type: team +title: Tatiana Muhina +id: muhina +order: 50 +language: en +image: + path: images/people/muhina.jpg + position: left +--- + +**Education manager** + +Student at MIPT. \ No newline at end of file diff --git a/data/home/content/people/Nozik.md b/data/home/content/people/Nozik.md index c564101..ad0e1ea 100644 --- a/data/home/content/people/Nozik.md +++ b/data/home/content/people/Nozik.md @@ -3,10 +3,11 @@ type: team title: Alexander Nozik id: nozik order: 1 -image: images/people/nozik_2.png language: en +image: images/people/nozik_2.png --- +** Director of the centre ** * PhD in particle physics. * Director of [Scientific Programming Centre](/). diff --git a/data/home/content/people/Nozik[info].md b/data/home/content/people/Nozik[info].md index f4de105..b0ee7ce 100644 --- a/data/home/content/people/Nozik[info].md +++ b/data/home/content/people/Nozik[info].md @@ -1,3 +1,5 @@ +**Director of the centre** + * PhD in particle physics. * Director of [Scientific Programming Centre](/). * Senior researcher at https://npm.mipt.ru. diff --git a/data/home/content/people/Palmin.md b/data/home/content/people/Palmin.md new file mode 100644 index 0000000..b621006 --- /dev/null +++ b/data/home/content/people/Palmin.md @@ -0,0 +1,14 @@ +--- +type: team +title: Vladimir Palmin +id: palmin +order: 10 +language: en +image: + path: images/people/palmin.jpg + position: left +--- + +**Researcher** + +Student at MIPT. \ No newline at end of file diff --git a/data/home/content/people/Svetlichnyi.md b/data/home/content/people/Svetlichnyi.md new file mode 100644 index 0000000..fc1de1b --- /dev/null +++ b/data/home/content/people/Svetlichnyi.md @@ -0,0 +1,20 @@ +--- +type: team +title: Aleksandr Svetlichnyi +id: svetlichnyi +order: 2 +language: en +image: + path: images/people/svetlichnyi.jpeg + position: left +--- + +**Vice-director for education** + +* Researcher at INR RAS. +* General physics teacher at MIPT. +* Deputy head of "scientific software" master program. + +[ORCID](https://orcid.org/0000-0002-2086-7045) + +[ResearchGate](https://www.researchgate.net/profile/Alexandr-Svetlichnyy) diff --git a/data/home/content/people/Svetlichnyi[info].md b/data/home/content/people/Svetlichnyi[info].md new file mode 100644 index 0000000..ee01128 --- /dev/null +++ b/data/home/content/people/Svetlichnyi[info].md @@ -0,0 +1 @@ +**Vice-director for education** \ No newline at end of file diff --git a/data/home/content/people/Terentyev.md b/data/home/content/people/Terentyev.md new file mode 100644 index 0000000..d018886 --- /dev/null +++ b/data/home/content/people/Terentyev.md @@ -0,0 +1,14 @@ +--- +type: team +title: Sergey Terentyev +id: terentyev +order: 5 +language: en +image: + path: images/people/terentyev.jpg + position: left +--- + +**Product manager for consulting** + +Student at MIPT and Space Research Institute RAS \ No newline at end of file diff --git a/data/home/content/projects/controls.md b/data/home/content/projects/controls.md new file mode 100644 index 0000000..6d84ee2 --- /dev/null +++ b/data/home/content/projects/controls.md @@ -0,0 +1,31 @@ +--- +type: project +title: Controls-kt +order: 10 +language: en +image: images/projects/controls-demo.png +--- +[![JetBrains Research](https://jb.gg/badges/research.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) + +[Repository and documentation](https://github.com/mipt-npm/controls.kt) + +Controls.kt is a data acquisition framework (work in progress). It is based on DataForge, a software framework for automated data processing. This repository contains a prototype of API and simple implementation +of a slow control system, including a demo. + +Controls.kt uses some concepts and modules of DataForge, +such as `Meta` (immutable tree-like structure) and `Meta` (which +includes a scalar value, or a tree of values, easily convertable to/from JSON +if needed). + +## Materials and publications + +* Video - [A general overview seminar](https://youtu.be/LO-qjWgXMWc) +* Video - [A seminar about the system mechanics](https://youtu.be/wES0RV5GpoQ) +* Article - [A Novel Solution for Controlling Hardware Components of Accelerators and Beamlines](https://www.preprints.org/manuscript/202108.0336/v1) + +### Features +Among other things, you can: +- Describe devices and their properties. +- Collect data from devices and execute arbitrary actions supported by a device. +- Property values can be cached in the system and requested from devices as needed, asynchronously. +- Connect devices to event bus via bidirectional message flows. \ No newline at end of file diff --git a/data/home/content/projects/controls[info].md b/data/home/content/projects/controls[info].md new file mode 100644 index 0000000..95249bf --- /dev/null +++ b/data/home/content/projects/controls[info].md @@ -0,0 +1 @@ +Controls.kt is a data acquisition framework (work in progress). It is based on DataForge, a software framework for automated data processing. \ No newline at end of file diff --git a/data/home/content/projects/dataforge.md b/data/home/content/projects/dataforge.md new file mode 100644 index 0000000..bd4d69b --- /dev/null +++ b/data/home/content/projects/dataforge.md @@ -0,0 +1,60 @@ +--- +type: project +title: DataForge +order: 2 +language: en +image: + path: images/projects/df.svg + position: left +--- +## Questions and Answers +In this section we will try to cover DataForge main ideas in the form of questions and answers. + +### General +**Q**: I have a lot of data to analyze. The analysis process is complicated, requires a lot of stages and data flow is not always obvious. To top it the data size is huge, so I don't want to perform operation I don't need (calculate something I won't need or calculate something twice). And yes, I need it to be performed in parallel and probably on remote computer. By the way, I am sick and tired of scripts that modify other scripts that control scripts. Could you help me? + +**A**: Yes, that is precisely the problem DataForge was made to solve. It allows to perform some automated data manipulations with automatic optimization and parallelization. The important thing that data processing recipes are made in the declarative way, so it is quite easy to perform computations on a remote station. Also, DataForge guarantees reproducibility of analysis results. + +**Q**: How does it work? + +**A**: At the core of DataForge lies the idea of metadata processor. It utilizes the fact that in order to analyze something you need data itself and some additional information about what does that data represent and what does user want as a result. This additional information is called metadata and could be organized in a regular structure (a tree of values not unlike XML or JSON). The important thing is that this distinction leaves no place for user instructions (or scripts). Indeed, the idea of DataForge logic is that one do not need imperative commands. The framework configures itself according to input meta-data and decides what operations should be performed in the most efficient way. + +**Q**: But where does it take algorithms to use? + +**A**: Of course algorithms must be written somewhere. No magic here. The logic is written in specialized modules. Some modules are provided out of the box at the system core, some need to be developed for specific problem. + +**Q**: So I still need to write the code? What is the difference then? + +**A**: Yes, someone still needs to write the code. But not necessary you. Simple operations could be performed using provided core logic. Also, your group can have one programmer writing the logic and all other using it without any real programming expertise. The framework organized in a such way that one writes some additional logic, they do not need to think about complicated thing like parallel computing, resource handling, logging, caching etc. Most of the things are done by the DataForge. + +### Platform + +**Q**: Which platform does DataForge use? Which operating system is it working on? + +**A**: The DataForge is mostly written in Kotlin-multiplatform and could be used on JVM, JS and native targets. Some modules and functions are supported only on JVM + +**Q**: Can I use my C++/Fortran/Python code in DataForge? + +A: Yes, as long as the code could be called from Java. Most of common languages have a bridge for Java access. There are completely no problems with compiled C/Fortran libraries. Python code could be called via one of existing python-java interfaces. It is also planned to implement remote method invocation for common languages, so your Python, or, say, Julia, code could run in its native environment. The metadata processor paradigm makes it much easier to do so. + +### Features +**Q**: What other features does DataForge provide? + +**A**: Alongside metadata processing (and a lot of tools for metadata manipulation and layering), DataForge has two additional important concepts: + +* **Modularisation**. Contrary to lot other frameworks, DataForge is intrinsically modular. The mandatory part is a rather tiny core module. Everything else could be customized. + +* **Context encapsulation**. Every DataForge task is executed in some context. The context isolates environment for the task and also works as dependency injection base and specifies interaction of the task with the external world. + +### Misc +**Q**: So everything looks great, can I replace my ROOT / other data analysis framework with DataForge? + +**A**: One must note, that DataForge is made for analysis, not for visualisation. The visualisation and user interaction capabilities of DataForge are rather limited compared to frameworks like ROOT, JAS3 or DataMelt. The idea is to provide reliable API and core functionality. In fact JAS3 and DataMelt could be used as a frontend for DataForge mechanics. + +**Q**: How does DataForge compare to cluster computation frameworks like Apache Spark? + +**A**: Again, it is not the purpose of DataForge to replace cluster software. DataForge has some internal parallelism mechanics and implementations, but they are most certainly worse than specially developed programs. Still, DataForge is not fixed on one single implementation. Your favourite parallel processing tool could be still used as a back-end for the DataForge. With full benefit of configuration tools, integrations and no performance overhead. + +**Q**: Is it possible to use DataForge in notebook mode? + +**A**: [Kotlin jupyter](https://github.com/Kotlin/kotlin-jupyter) allows to use any JVM program in a notebook mode. The dedicated module for DataForge is work in progress. \ No newline at end of file diff --git a/data/home/content/projects/dataforge[info].md b/data/home/content/projects/dataforge[info].md new file mode 100644 index 0000000..9d88337 --- /dev/null +++ b/data/home/content/projects/dataforge[info].md @@ -0,0 +1 @@ +A metadata processing workflow manipulation framework. \ No newline at end of file diff --git a/data/home/content/projects/kmath.md b/data/home/content/projects/kmath.md index 69bbd48..e187554 100644 --- a/data/home/content/projects/kmath.md +++ b/data/home/content/projects/kmath.md @@ -1,10 +1,45 @@ --- type: project title: KMath -order: 2 +order: 1 language: en +image: + path: images/projects/KMath.png + position: right --- -An experimental Kotlin library for mathematical operations, built on the principle of context-oriented programming using mathematical abstractions. +[![JetBrains Research](https://jb.gg/badges/research.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) +[![DOI](https://zenodo.org/badge/129486382.svg)](https://zenodo.org/badge/latestdoi/129486382) +[![Maven Central](https://img.shields.io/maven-central/v/space.kscience/kmath-core.svg?label=Maven%20Central)](https://search.maven.org/search?q=g:%22space.kscience%22) -[Repository and documentation](https://github.com/altavir/kmath) \ No newline at end of file +[Repository and documentation](https://github.com/mipt-npm/kmath) + + +Could be pronounced as `key-math`. The **K**otlin **Math**ematics library was initially intended as a Kotlin-based +analog to Python's NumPy library. Later we found that kotlin is much more flexible language and allows superior +architecture designs. In contrast to `numpy` and `scipy` it is modular and has a lightweight core. The `numpy`-like +experience could be achieved with [kmath-for-real](/kmath-for-real) extension module. + +[Documentation site (**WIP**)](https://mipt-npm.github.io/kmath/) + +## Publications and talks + +* [A conceptual article about context-oriented design](https://proandroiddev.com/an-introduction-context-oriented-programming-in-kotlin-2e79d316b0a2) +* [Another article about context-oriented design](https://proandroiddev.com/diving-deeper-into-context-oriented-programming-in-kotlin-3ecb4ec38814) +* [ACAT 2019 conference paper](https://aip.scitation.org/doi/abs/10.1063/1.5130103) + +## Goal + +* Provide a flexible and powerful API to work with mathematics abstractions in Kotlin-multiplatform (JVM, JS and Native) + . +* Provide basic multiplatform implementations for those abstractions (without significant performance optimization). +* Provide bindings and wrappers with those abstractions for popular optimized platform libraries. + +## Non-goals + +* Be like NumPy. It was the idea at the beginning, but we decided that we can do better in API. +* Provide the best performance out of the box. We have specialized libraries for that. Need only API wrappers for them. +* Cover all cases as immediately and in one bundle. We will modularize everything and add new features gradually. +* Provide specialized behavior in the core. API is made generic on purpose, so one needs to specialize for types, like + for `Double` in the core. For that we will have specialization modules like `kmath-for-real`, which will give better + experience for those, who want to work with specific types. \ No newline at end of file diff --git a/data/home/content/projects/kmath[info].md b/data/home/content/projects/kmath[info].md index 35cb9b6..67b5edb 100644 --- a/data/home/content/projects/kmath[info].md +++ b/data/home/content/projects/kmath[info].md @@ -1 +1,3 @@ -An experimental Kotlin library for mathematical operations, built on the principle of context-oriented programming using mathematical abstractions. \ No newline at end of file +An experimental Kotlin library for mathematical operations, built on the principle of context-oriented programming using mathematical abstractions. + +[Repository and documentation](https://github.com/mipt-npm/kmath) diff --git a/data/home/content/projects/plotly.md b/data/home/content/projects/plotly.md new file mode 100644 index 0000000..5a2d44e --- /dev/null +++ b/data/home/content/projects/plotly.md @@ -0,0 +1,11 @@ +--- +type: project +title: Plotly-kt +order: 8 +language: en +image: images/projects/plotly-kt.svg +--- + +A kotlin visualization library wrapping popular [Plotly](https://plotly.com/javascript/) library. + +[Repository and documentation](https://github.com/mipt-npm/plotly.kt) \ No newline at end of file diff --git a/data/home/content/projects/visionforge.md b/data/home/content/projects/visionforge.md new file mode 100644 index 0000000..e969eca --- /dev/null +++ b/data/home/content/projects/visionforge.md @@ -0,0 +1,30 @@ +--- +type: project +title: VisionForge +order: 5 +language: en +image: images/projects/muon-monitor.png +--- + +[![JetBrains Research](https://jb.gg/badges/research.svg)](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) +[![DOI](https://zenodo.org/badge/174502624.svg)](https://zenodo.org/badge/latestdoi/174502624) + +[![Slack](https://img.shields.io/badge/slack-channel-green?logo=slack)](https://kotlinlang.slack.com/archives/CEXV2QWNM) + +[Repository and documentation](https://github.com/mipt-npm/visionforge) + +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 developed as a [Kotlin multiplatform](https://kotlinlang.org/docs/reference/multiplatform.html) +application, currently targeting browser JavaScript and JVM. + +## Features + +- 3D visualization of complex experimental set-ups +- Event display such as particle tracks, etc. +- Scales up to few hundred thousands of elements +- Camera move, rotate, zoom-in and zoom-out +- Scene graph as an object tree with property editor +- Settings export and import +- Multiple platform support \ No newline at end of file diff --git a/data/home/content/projects/visionforge[info].md b/data/home/content/projects/visionforge[info].md new file mode 100644 index 0000000..2fd31ba --- /dev/null +++ b/data/home/content/projects/visionforge[info].md @@ -0,0 +1 @@ +A visualization framework written in Kotlin-multiplatform \ No newline at end of file diff --git a/data/home/content/research.md b/data/home/content/research.md index f16c173..eaae097 100644 --- a/data/home/content/research.md +++ b/data/home/content/research.md @@ -3,5 +3,3 @@ type: page title: Research language: en --- - -This page is work in progress. \ No newline at end of file diff --git a/data/home/content/team.md b/data/home/content/team.md index 658639e..2a314f0 100644 --- a/data/home/content/team.md +++ b/data/home/content/team.md @@ -3,5 +3,3 @@ type: page title: Team language: en --- - -This page is work in progress. \ No newline at end of file diff --git a/data/home/images/people/muhina.jpg b/data/home/images/people/muhina.jpg new file mode 100644 index 0000000..1838fd5 Binary files /dev/null and b/data/home/images/people/muhina.jpg differ diff --git a/data/home/images/people/palmin.jpg b/data/home/images/people/palmin.jpg new file mode 100644 index 0000000..a1cbb57 Binary files /dev/null and b/data/home/images/people/palmin.jpg differ diff --git a/data/home/images/people/svetlichnyi.jpeg b/data/home/images/people/svetlichnyi.jpeg new file mode 100644 index 0000000..1b3cd3f Binary files /dev/null and b/data/home/images/people/svetlichnyi.jpeg differ diff --git a/data/home/images/people/terentyev.jpg b/data/home/images/people/terentyev.jpg new file mode 100644 index 0000000..54d7b5a Binary files /dev/null and b/data/home/images/people/terentyev.jpg differ diff --git a/data/home/images/projects/KMath.png b/data/home/images/projects/KMath.png new file mode 100644 index 0000000..e8b17a1 Binary files /dev/null and b/data/home/images/projects/KMath.png differ diff --git a/data/home/images/projects/controls-demo.png b/data/home/images/projects/controls-demo.png new file mode 100644 index 0000000..b7df1eb Binary files /dev/null and b/data/home/images/projects/controls-demo.png differ diff --git a/data/home/images/projects/df.svg b/data/home/images/projects/df.svg new file mode 100644 index 0000000..b1d2fcd --- /dev/null +++ b/data/home/images/projects/df.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/home/images/projects/muon-monitor.png b/data/home/images/projects/muon-monitor.png new file mode 100644 index 0000000..fde07ab Binary files /dev/null and b/data/home/images/projects/muon-monitor.png differ diff --git a/data/home/images/projects/plotly-kt.svg b/data/home/images/projects/plotly-kt.svg new file mode 100644 index 0000000..81063c4 --- /dev/null +++ b/data/home/images/projects/plotly-kt.svg @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/kotlin/ru/mipt/spc/spcLanding.kt b/src/main/kotlin/ru/mipt/spc/spcCollection.kt similarity index 75% rename from src/main/kotlin/ru/mipt/spc/spcLanding.kt rename to src/main/kotlin/ru/mipt/spc/spcCollection.kt index dcb1b45..3d7763e 100644 --- a/src/main/kotlin/ru/mipt/spc/spcLanding.kt +++ b/src/main/kotlin/ru/mipt/spc/spcCollection.kt @@ -8,13 +8,15 @@ import io.ktor.server.routing.get import kotlinx.html.* import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.int import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.withIndex +import space.kscience.dataforge.values.string import space.kscience.snark.* -context(PageContext) private fun FlowContent.spcTeamContent( +context(PageContext) private fun FlowContent.spcSpotlightContent( landing: HtmlData, content: Map, ) { @@ -41,13 +43,15 @@ context(PageContext) private fun FlowContent.spcTeamContent( // Main div { id = "main" - content.forEach { (name, data) -> - val ref = resolveRef(name) - - section("spotlights") { - id = data.meta["id"].string ?: name.toString() + //TODO add smart SNARK ordering + section("spotlights") { + content.entries.sortedBy { it.value.meta["order"].int ?: Int.MAX_VALUE }.forEach { (name, data) -> + val ref = resolveRef(name) section { - data.meta["image"].string?.let { imagePath -> + id = data.meta["id"].string ?: name.toString() + data.meta["image"]?.let { imageMeta: Meta -> + val imagePath = + imageMeta.value?.string ?: imageMeta["path"].string ?: error("Image path not provided") a(classes = "image") { href = ref img { @@ -62,8 +66,11 @@ context(PageContext) private fun FlowContent.spcTeamContent( header("major") { h3 { +(data.meta["title"].string ?: "???") } } - resolveHtml(name.withIndex("info"))?.let { - htmlData(it) + val infoData = resolveHtml(name.withIndex("info")) + if (infoData == null) { + htmlData(data) + } else { + htmlData(infoData) } ul("actions") { li { @@ -82,7 +89,7 @@ context(PageContext) private fun FlowContent.spcTeamContent( } -context(PageContext) internal fun Route.spcLanding( +context(PageContext) internal fun Route.spcSpotlight( name: String, contentFilter: (Name, Meta) -> Boolean, ) { @@ -97,7 +104,7 @@ context(PageContext) internal fun Route.spcLanding( spcHead(title) body("is-preload") { wrapper { - spcTeamContent(body, content) + spcSpotlightContent(body, content) } fortyScripts() diff --git a/src/main/kotlin/ru/mipt/spc/spcHome.kt b/src/main/kotlin/ru/mipt/spc/spcHome.kt index 4bcbd39..f8dd819 100644 --- a/src/main/kotlin/ru/mipt/spc/spcHome.kt +++ b/src/main/kotlin/ru/mipt/spc/spcHome.kt @@ -16,6 +16,7 @@ import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.string import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.parseAsName +import space.kscience.dataforge.values.string import space.kscience.snark.* import java.nio.file.Path @@ -32,13 +33,14 @@ context(PageContext) internal fun HTML.spcPageContent( id = "main" // One section { - id = "one" div("inner") { header("major") { h1 { +title } } - meta["image"].string?.let { imagePath -> - span("image main") { + meta["image"]?.let { imageMeta -> + val imagePath = imageMeta.value?.string ?: imageMeta["path"].string ?: error("Image path not provided") + val imageClass = imageMeta["position"].string ?: "main" + span("image $imageClass") { img { src = resolveRef(imagePath) alt = imagePath @@ -157,7 +159,7 @@ context(PageContext) private fun HTML.spcHome() { } } p { - +"""Fundamental and applied research in analysis, scientific software design and data aquisition and control systems.""" + +"""Fundamental and applied research in analysis, scientific software design and data acquisition and control systems.""" } } } @@ -192,7 +194,6 @@ context(PageContext) private fun HTML.spcHome() { +"""Team""" } } - p { +"""Our team""" } } } // article { @@ -232,10 +233,9 @@ context(PageContext) private fun HTML.spcHome() { } // Two section { - id = "two" div("inner") { header("major") { - h2 { +"""Science, education and industry working together""" } + h2 { +"Science + education + industry" } } p { +""" @@ -290,8 +290,8 @@ internal fun Application.spcHome(context: Context, rootPath: Path, prefix: Strin spcPage("consulting") - spcLanding("team") { _, m -> m["type"].string == "team" } - spcLanding("research"){ _, m -> m["type"].string == "project" } + spcSpotlight("team") { _, m -> m["type"].string == "team" } + spcSpotlight("research") { _, m -> m["type"].string == "project" } } } }