diff --git a/CHANGELOG.unreleased.md b/CHANGELOG.unreleased.md index cdc2a80a374..1f0225d766c 100644 --- a/CHANGELOG.unreleased.md +++ b/CHANGELOG.unreleased.md @@ -20,6 +20,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.released - Datasets can now be renamed and can have duplicate names. [#8075](https://github.com/scalableminds/webknossos/pull/8075) - Improved the default colors for skeleton trees. [#8228](https://github.com/scalableminds/webknossos/pull/8228) - Allowed to train an AI model using differently sized bounding boxes. We recommend all bounding boxes to have equal dimensions or to have dimensions which are multiples of the smallest bounding box. [#8222](https://github.com/scalableminds/webknossos/pull/8222) +- Within the bounding box tool, the cursor updates immediately after pressing `ctrl`, indicating that a bounding box can be moved instead of resized. [#8253](https://github.com/scalableminds/webknossos/pull/8253) ### Fixed - Fixed that listing datasets with the `api/datasets` route without compression failed due to missing permissions regarding public datasets. [#8249](https://github.com/scalableminds/webknossos/pull/8249) @@ -30,6 +31,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.released - Fixed that the frontend did not ensure a minimum length for annotation layer names. Moreover, names starting with a `.` are also disallowed now. [#8244](https://github.com/scalableminds/webknossos/pull/8244) - Fixed a bug where in the add remote dataset view the dataset name setting was not in sync with the datasource setting of the advanced tab making the form not submittable. [#8245](https://github.com/scalableminds/webknossos/pull/8245) - Fix read and update dataset route for versions 8 and lower. [#8263](https://github.com/scalableminds/webknossos/pull/8263) +- Fixed that task bounding boxes are again converted to user bounding boxes when uploading annotations via nmls. [#8280](https://github.com/scalableminds/webknossos/pull/8280) - Added missing legacy support for `isValidNewName` route. [#8252](https://github.com/scalableminds/webknossos/pull/8252) - Fixed some layout issues in the upload view. [#8231](https://github.com/scalableminds/webknossos/pull/8231) - Fixed `FATAL: role "postgres" does not exist` error message in Docker compose. [#8240](https://github.com/scalableminds/webknossos/pull/8240) diff --git a/MIGRATIONS.unreleased.md b/MIGRATIONS.unreleased.md index 681f5a88093..6e0d5ec66d8 100644 --- a/MIGRATIONS.unreleased.md +++ b/MIGRATIONS.unreleased.md @@ -8,6 +8,7 @@ User-facing changes are documented in the [changelog](CHANGELOG.released.md). ## Unreleased [Commits](https://github.com/scalableminds/webknossos/compare/24.12.0...HEAD) - Removed support for HTTP API versions 3 and 4. [#8075](https://github.com/scalableminds/webknossos/pull/8075) +- New FossilDB version `0.1.33` (docker image `scalableminds/fossildb:master__504`) is required. ### Postgres Evolutions: - [124-decouple-dataset-directory-from-name](conf/evolutions/124-decouple-dataset-directory-from-name) diff --git a/app/models/annotation/nml/NmlParser.scala b/app/models/annotation/nml/NmlParser.scala index 05c36ff3f88..7918f6eed4f 100755 --- a/app/models/annotation/nml/NmlParser.scala +++ b/app/models/annotation/nml/NmlParser.scala @@ -156,11 +156,11 @@ class NmlParser @Inject()(datasetDAO: DatasetDAO) extends LazyLogging with Proto taskBoundingBox: Option[BoundingBox] = if (sharedParsingParameters.isTaskUpload) parseTaskBoundingBox(parameters \ "taskBoundingBox") else None - userBoundingBoxes = parseBoundingBoxes(parameters \ "userBoundingBox") } yield { + var userBoundingBoxes = parseBoundingBoxes(parameters \ "userBoundingBox") if (!sharedParsingParameters.isTaskUpload) { parseTaskBoundingBoxAsUserBoundingBox(parameters \ "taskBoundingBox", userBoundingBoxes) - .map(asUserBoundingBox => userBoundingBoxes :+ asUserBoundingBox) + .foreach(asUserBoundingBox => userBoundingBoxes = userBoundingBoxes :+ asUserBoundingBox) } NmlParsedParameters( datasetIdOpt, diff --git a/docker-compose.yml b/docker-compose.yml index 879f777e4f7..8d811af7dfe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -269,7 +269,7 @@ services: # FossilDB fossildb: - image: scalableminds/fossildb:master__484 + image: scalableminds/fossildb:master__504 command: - fossildb - -c diff --git a/docs/publications.md b/docs/publications.md index 5fd7d9aa347..bab84496141 100644 --- a/docs/publications.md +++ b/docs/publications.md @@ -1,6 +1,105 @@ # Publications The following publications used WEBKNOSSOS for exploring large 3D electron-microscopy (EM) and light-microscopy (LM) datasets as well as collaboratively generating annotations or other tasks. Please [get in touch with us](mailto:hello@webknossos.org) if your publication is missing. +## 2024 +* Andrea Nathansen, Matthis Clausen, Manuel Berning, Ethan MacKenzie, Yuxin Zhang, Alexandra Pacureanu, Andreas T. Schaefer, Norman Rzepka, & Carles Bosch. + Cell nuclei segmentation in mm-scale x-ray holographic nanotomography images of mouse brain tissue. + [Developments in X-Ray Tomography XV. Vol. 13152. SPIE (2024). DOI: 10.1117/12.3028309](https://doi.org/10.1117/12.3028309) + **View data [#1](https://wklink.org/9238) [#2](https://wklink.org/9123)** in WEBKNOSSOS + +* Anja Günther, Silke Haverkamp, Stephan Irsen, Paul V. Watkins, Karin Dedek, Henrik Mouritsen & Kevin L. Briggman. + Species–specific circuitry of double cone photoreceptors in two avian retinas. + [Communications Biology 7.1 (2024). DOI: 10.1038/s42003-024-06697-2](https://doi.org/10.1038/s42003-024-06697-2) + [**View data**](https://webknossos.mpinb.mpg.de/datasets/Briggman%20Lab/robin-retina-compressed-3/view#145000,59392,512,0,1.3) in WEBKNOSSOS + +* Yan Lu, Jing Liu, Bei Li, Haoyu Wang , Fangfang Wang , Shengxiong Wang , Hao Wu , Hua Han & Yunfeng Hua. + Spatial patterns of noise-induced inner hair cell ribbon loss in the mouse mid-cochlea. + [Iscience 27.2 (2024). DOI: 10.1016/j.isci.2024.108825](https://doi.org/10.1016/j.isci.2024.108825) + **View data + [#1](https://wklink.org/3892) + [#2](https://wklink.org/7172) + [#3](https://wklink.org/1329) + [#4](https://wklink.org/9122) + [#5](https://wklink.org/7842) + [#6](https://wklink.org/1728)** in WEBKNOSSOS + +* Meike Sievers, Alessandro Motta, Martin Schmidt, Yagmur Yener, Sahil Loomba, Kun Song, Johannes Bruett, & Moritz Helmstaedter. + Connectomic reconstruction of a cortical column. + [bioRxiv (2024). DOI: 2024.03.22.586254](https://doi.org/10.1101/2024.03.22.586254) + +* Martin Schmidt, Alessandro Motta, Meike Sievers & Moritz Helmstaedter. + RoboEM: automated 3D flight tracing for synaptic-resolution connectomics. + [Nature Methods 21.5 (2024). DOI: 10.1038/s41592-024-02226-5](https://doi.org/10.1038/s41592-024-02226-5) + +* Rosanna P. Sammons, Mourat Vezir, Laura Moreno-Velasquez, Gaspar Cano, Marta Orlando, Meike Sievers, Eleonora Grasso, Verjinia D. Metodieva, Richard Kempter, Helene Schmidt, & Dietmar Schmitz. + Structure and function of the hippocampal CA3 module. + [Proceedings of the National Academy of Sciences 121.6 (2024). DOI: 10.1073/pnas.2312281120](https://doi.org/10.1073/pnas.2312281120) + +* Julia M. Michalska, Julia Lyudchik, Philipp Velicky, Hana Štefaničková, Jake F. Watson, Alban Cenameri, Christoph Sommer, Nicole Amberg, Alessandro Venturino, Karl Roessler, Thomas Czech, Romana Höftberger, Sandra Siegert, Gaia Novarino, Peter Jonas & Johann G. Danzl. + Imaging brain tissue architecture across millimeter to nanometer scales. + [Nature Biotechnology 42.7 (2024). DOI: 10.1038/s41587-023-01911-8](https://doi.org/10.1038/s41587-023-01911-8) + +* Hongcheng Mai, Jie Luo, Luciano Hoeher, Rami Al-Maskari, Izabela Horvath, Ying Chen, Florian Kofler, Marie Piraud, Johannes C. Paetzold, Jennifer Modamio, Mihail Todorov, Markus Elsner, Farida Hellal & Ali Ertürk. + Whole-body cellular mapping in mouse using standard IgG antibodies. + [Nature Biotechnology 42.4 (2024). DOI: 10.1038/s41587-023-01846-0](https://doi.org/10.1038/s41587-023-01846-0) + [**View data**](https://webknossos.org/publications/64aeaa06fcf33704ca101ceb) in WEBKNOSSOS. + +* Kievits, Arent J., Duinkerken, B. H. Peter, Lane, Ryan, de Heus, Cecilia, van Beijeren Bergen en Henegouwen, Daan, Höppener, Tibbe, Wolters, Anouk H. G., Liv, Nalan, Giepmans, Ben N. G. and Hoogenboom, Jacob P.. + FAST-EM array tomography: a workflow for multibeam volume electron microscopy + [Methods in Microscopy (2024). DOI: 10.1515/mim-2024-0005](https://doi.org/10.1515/mim-2024-0005) + +* Yan Lu, Yi Jiang, Fangfang Wang, Hao Wu & Yunfeng Hua. + Electron Microscopic Mapping of Mitochondrial Morphology in the Cochlear Nerve Fibers. + [Journal of the Association for Research in Otolaryngology 25.4 (2024). DOI: 10.1007/s10162-024-00957-y](https://doi.org/10.1007/s10162-024-00957-y) + +* Vandana Sampathkumar, Kevin P. Koster, Briana J. Carroll, S. Murray Sherman, & Narayanan Kasthuri. + Synaptic integration of somatosensory and motor cortical inputs onto spiny projection neurons of mice caudoputamen. + [European Journal of Neuroscience 60.8 (2024). DOI: 10.1111/ejn.16538](https://doi.org/10.1111/ejn.16538) + +* Angeles Salles, Emely Loscalzo, Jessica Montoya, Rosa Mendoza, Kevin M. Boergens & Cynthia F. Moss. + Auditory processing of communication calls in interacting bats. + [Iscience 27.6 (2024). DOI: 10.1016/j.isci.2024.109872](https://doi.org/10.1016/j.isci.2024.109872) + +* Wen-Qing Huang, Haibin Sheng, Haoyu Wang, Yumeng Qi, Fangfang Wang, & Yunfeng Hua. + Volume electron microscopy reveals age-related ultrastructural differences of globular bush cell axons in mouse central auditory system. + [Neurobiology of Aging 136 (2024). DOI: 10.1016/j.neurobiolaging.2024.01.016](https://doi.org/10.1016/j.neurobiolaging.2024.01.016) + +* Yi Jiang, Haoyu Wang, Kevin Boergens, Norman Rzepka, Fangfang Wang, & Yunfeng Hua. + Efficient cell-wide mapping of mitochondria in electron microscopic volumes using webKnossos. + [bioRxiv (2024). DOI: 10.1101/2024.10.20.619271](https://doi.org/10.1101/2024.10.20.619271) + +* Yuh-Tarng Chen, Dominica de Thomas Wagner, Alastair J. Loutit, Ali Nourizonoz, Mary-Claude Croisier-Coeytaux, Jérôme Blanc, Graham Knott, Kuo-Sheng Lee, & Daniel Huber. + Lamellar Schwann cells in the Pacinian corpuscle potentiate vibration perception. + [bioRxiv (2024). DOI: 10.1101/2024.08.23.609459](https://doi.org/10.1101/2024.08.23.609459) + +* Rafael Luján, Marta Turegano-Lopez, Carolina Aguado, & Angel Merchan-Perez. + Two- and three-dimensional electron microscopy techniques: powerful tools for studying the brain under physiological and pathological conditions. + [Advanced Technology in Neuroscience 1.2 (2024). DOI: 10.4103/ATN.ATN-D-24-00009](https://doi.org/10.4103/atn.atn-d-24-00009) + +* Nare Karagulyan, Maja Überegger, Yumeng Qi, Norbert Babai, Florian Hofer, Lejo Johnson Chacko, Fangfang Wang, Maria Luque, Rudolf Glueckert, Anneliese Schrott-Fischer, Yunfeng Hua, Tobias Moser, & Christine Bandtlow. + Probing the role of synaptic adhesion molecule RTN4RL2 in setting up cochlear connectivity. + [bioRxiv (2024). DOI: 10.1101/2024.09.16.613011](https://doi.org/10.1101/2024.09.16.613011) + +* Kristina D Micheva, Anish K Simhal, Jenna Schardt, Stephen J Smith, Richard J Weinberg, & Scott F Owen. + Data-driven synapse classification reveals a logic of glutamate receptor composition. + [bioRxiv (2024). DOI: 10.1101/2024.12.11.628056](https://doi.org/10.1101/2024.12.11.628056) + +* Guangmei Liu, Shruthi Bandyadka, & Kimberly McCall. + Protocol to analyze 3D neurodegenerative vacuoles in Drosophila melanogaster. + [STAR protocols 5.2 (2024). DOI: 10.1016/j.xpro.2024.103017](https://doi.org/10.1016/j.xpro.2024.103017) + +* Jakob Reichmann, Jonas Franz, Marina Eckermann, Katja Schulz, Brit Mollenhauer, Christine Stadelmann, & Tim Salditt. + 3D imaging of neuronal inclusions and protein aggregates in human neurodegeneration by multiscale X-ray phase-contrast tomography. + [medRxiv (2024). DOI: 10.1101/2024.03.26.24304193](https://doi.org/10.1101/2024.03.26.24304193) + +* Tay Won Shin, Hao Wang, Chi Zhang, Bobae An, Yangning Lu, Elizabeth Zhang, Xiaotang Lu, Emmanouil D. Karagiannis, Jeong Seuk Kang, Amauche Emenari, Panagiotis Symvoulidis, Shoh Asano, Leanne Lin, Emma K. Costa; IMAXT Grand Challenge Consortium, Adam H. Marblestone, Narayanan Kasthuri, Li-Huei Tsai, Edward S. Boyden. + Dense, Continuous Membrane Labeling and Expansion Microscopy Visualization of Ultrastructure in Tissues. + [bioRxiv (2024). DOI: 10.1101/2024.03.07.583776](https://doi.org/10.1101/2024.03.07.583776) + +* Norman Rzepka. + Next-generation file formats (NGFF), RFC 2: Specification for using Zarr v3 in OME-Zarr + [NGFF RFC 2 (2024)](https://ngff.openmicroscopy.org/rfc/2/index.html). + ## 2023 * Tri M. Nguyen, Logan A. Thomas, Jeff L. Rhoades, Ilaria Ricchi, Xintong Cindy Yuan, Arlo Sheridan, David G. C. Hildebrand, Jan Funke, Wade G. Regehr & Wei-Chung Allen Lee. Structured cerebellar connectivity supports resilient pattern separation. diff --git a/fossildb/version b/fossildb/version index db7a480479e..50140e35363 100644 --- a/fossildb/version +++ b/fossildb/version @@ -1 +1 @@ -0.1.31 +0.1.33 diff --git a/frontend/javascripts/libs/input.ts b/frontend/javascripts/libs/input.ts index 19e952ffe9c..cd3d385e518 100644 --- a/frontend/javascripts/libs/input.ts +++ b/frontend/javascripts/libs/input.ts @@ -84,6 +84,7 @@ export class InputKeyboardNoLoop { supportInputElements?: boolean; }, extendedCommands?: KeyBindingMap, + keyUpBindings?: KeyBindingMap, ) { if (options) { this.supportInputElements = options.supportInputElements || this.supportInputElements; @@ -100,16 +101,17 @@ export class InputKeyboardNoLoop { document.addEventListener("keydown", this.preventBrowserSearchbarShortcut); this.attach(EXTENDED_COMMAND_KEYS, this.toggleExtendedMode); // Add empty callback in extended mode to deactivate the extended mode via the same EXTENDED_COMMAND_KEYS. - this.attach(EXTENDED_COMMAND_KEYS, _.noop, true); + this.attach(EXTENDED_COMMAND_KEYS, _.noop, _.noop, true); for (const key of Object.keys(extendedCommands)) { const callback = extendedCommands[key]; - this.attach(key, callback, true); + this.attach(key, callback, _.noop, true); } } for (const key of Object.keys(initialBindings)) { const callback = initialBindings[key]; - this.attach(key, callback); + const keyUpCallback = keyUpBindings != null ? keyUpBindings[key] : _.noop; + this.attach(key, callback, keyUpCallback); } } @@ -141,7 +143,12 @@ export class InputKeyboardNoLoop { } } - attach(key: KeyboardKey, callback: KeyboardHandler, isExtendedCommand: boolean = false) { + attach( + key: KeyboardKey, + keyDownCallback: KeyboardHandler, + keyUpCallback: KeyboardHandler = _.noop, + isExtendedCommand: boolean = false, + ) { const binding = [ key, (event: KeyboardEvent) => { @@ -163,13 +170,15 @@ export class InputKeyboardNoLoop { } if (!event.repeat) { - callback(event); + keyDownCallback(event); } else { event.preventDefault(); event.stopPropagation(); } }, - _.noop, + (event: KeyboardEvent) => { + keyUpCallback(event); + }, ]; if (isExtendedCommand) { KeyboardJS.withContext("extended", () => { diff --git a/frontend/javascripts/oxalis/controller/combinations/bounding_box_handlers.ts b/frontend/javascripts/oxalis/controller/combinations/bounding_box_handlers.ts index 10f39ed3aea..8bba7bd64c9 100644 --- a/frontend/javascripts/oxalis/controller/combinations/bounding_box_handlers.ts +++ b/frontend/javascripts/oxalis/controller/combinations/bounding_box_handlers.ts @@ -265,7 +265,7 @@ export function createBoundingBoxAndGetEdges( } export const highlightAndSetCursorOnHoveredBoundingBox = _.throttle( - (position: Point2, planeId: OrthoView, event: MouseEvent) => { + (position: Point2, planeId: OrthoView, event: MouseEvent | KeyboardEvent) => { const hoveredEdgesInfo = getClosestHoveredBoundingBox(position, planeId); // Access the parent element as that is where the cursor style property is set const inputCatcher = document.getElementById(`inputcatcher_${planeId}`)?.parentElement; diff --git a/frontend/javascripts/oxalis/controller/viewmodes/plane_controller.tsx b/frontend/javascripts/oxalis/controller/viewmodes/plane_controller.tsx index 0158940dd1d..99dfb486eea 100644 --- a/frontend/javascripts/oxalis/controller/viewmodes/plane_controller.tsx +++ b/frontend/javascripts/oxalis/controller/viewmodes/plane_controller.tsx @@ -66,6 +66,7 @@ import { import { showToastWarningForLargestSegmentIdMissing } from "oxalis/view/largest_segment_id_modal"; import { getDefaultBrushSizes } from "oxalis/view/action-bar/toolbar_view"; import { userSettings } from "types/schemas/user_settings.schema"; +import { highlightAndSetCursorOnHoveredBoundingBox } from "../combinations/bounding_box_handlers"; function ensureNonConflictingHandlers( skeletonControls: Record, @@ -183,12 +184,29 @@ class BoundingBoxKeybindings { static getKeyboardControls() { return { c: () => Store.dispatch(addUserBoundingBoxAction()), + meta: BoundingBoxKeybindings.createKeyDownAndUpHandler(), + ctrl: BoundingBoxKeybindings.createKeyDownAndUpHandler(), }; } + static handleUpdateCursor = (event: KeyboardEvent) => { + const { viewModeData, temporaryConfiguration } = Store.getState(); + const { mousePosition } = temporaryConfiguration; + if (mousePosition == null) return; + highlightAndSetCursorOnHoveredBoundingBox( + { x: mousePosition[0], y: mousePosition[1] }, + viewModeData.plane.activeViewport, + event, + ); + }; + static getExtendedKeyboardControls() { return { x: () => setTool(AnnotationToolEnum.BOUNDING_BOX) }; } + + static createKeyDownAndUpHandler() { + return (event: KeyboardEvent) => BoundingBoxKeybindings.handleUpdateCursor(event); + } } function createDelayAwareMoveHandler(multiplier: number) { @@ -364,6 +382,7 @@ class PlaneController extends React.PureComponent { }); const { baseControls: notLoopedKeyboardControls, + keyUpControls, extendedControls: extendedNotLoopedKeyboardControls, } = this.getNotLoopedKeyboardControls(); const loopedKeyboardControls = this.getLoopedKeyboardControls(); @@ -397,6 +416,7 @@ class PlaneController extends React.PureComponent { notLoopedKeyboardControls, {}, extendedNotLoopedKeyboardControls, + keyUpControls, ); this.storePropertyUnsubscribers.push( listenToStoreProperty( @@ -501,7 +521,11 @@ class PlaneController extends React.PureComponent { this.props.tracing.volumes.length > 0 ? VolumeKeybindings.getKeyboardControls() : emptyDefaultHandler; - const { c: boundingBoxCHandler } = BoundingBoxKeybindings.getKeyboardControls(); + const { + c: boundingBoxCHandler, + meta: boundingBoxMetaHandler, + ctrl: boundingBoxCtrlHandler, + } = BoundingBoxKeybindings.getKeyboardControls(); ensureNonConflictingHandlers(skeletonControls, volumeControls); const extendedSkeletonControls = this.props.tracing.skeleton != null ? SkeletonKeybindings.getExtendedKeyboardControls() : {}; @@ -524,6 +548,12 @@ class PlaneController extends React.PureComponent { volumeCHandler, boundingBoxCHandler, ), + ctrl: this.createToolDependentKeyboardHandler(null, null, boundingBoxCtrlHandler), + meta: this.createToolDependentKeyboardHandler(null, null, boundingBoxMetaHandler), + }, + keyUpControls: { + ctrl: this.createToolDependentKeyboardHandler(null, null, boundingBoxCtrlHandler), + meta: this.createToolDependentKeyboardHandler(null, null, boundingBoxMetaHandler), }, extendedControls, }; diff --git a/tools/hosting/docker-compose.yml b/tools/hosting/docker-compose.yml index f60b1c09b55..997cd9ead41 100644 --- a/tools/hosting/docker-compose.yml +++ b/tools/hosting/docker-compose.yml @@ -2,7 +2,7 @@ version: "2.2" services: webknossos: - image: scalableminds/webknossos:${DOCKER_TAG:-23.04.0} + image: scalableminds/webknossos:${DOCKER_TAG:-24.12.0} ports: - "127.0.0.1:9000:9000" depends_on: @@ -58,7 +58,7 @@ services: # FossilDB fossildb: - image: scalableminds/fossildb:master__489 + image: scalableminds/fossildb:master__504 command: - fossildb - -c diff --git a/yarn.lock b/yarn.lock index f1575bb6d87..f0f5be91425 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9330,11 +9330,11 @@ __metadata: linkType: hard "nanoid@npm:^3.3.1": - version: 3.3.2 - resolution: "nanoid@npm:3.3.2" + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" bin: nanoid: bin/nanoid.cjs - checksum: 10c0/48a0e9e9f80ced7a7eedf4017236e355eb48284b2bc65e7d75df6348e679b5762ce2e4b375977222c9b4399729a4e564c53bcde814d405c135b0f77a24ecb27c + checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 languageName: node linkType: hard