{"status":"ok","message-type":"work","message-version":"1.0.0","message":{"indexed":{"date-parts":[[2026,2,23]],"date-time":"2026-02-23T19:56:53Z","timestamp":1771876613051,"version":"3.50.1"},"reference-count":34,"publisher":"Public Library of Science (PLoS)","issue":"2","license":[{"start":{"date-parts":[[2026,2,23]],"date-time":"2026-02-23T00:00:00Z","timestamp":1771804800000},"content-version":"vor","delay-in-days":0,"URL":"http:\/\/creativecommons.org\/licenses\/by\/4.0\/"}],"funder":[{"name":"Portuguese Funda\u00e7\u00e3o para a Ci\u00eancia e Tecnologia","award":["SFRH\/BD\/129843\/2017"],"award-info":[{"award-number":["SFRH\/BD\/129843\/2017"]}]},{"name":"Portuguese Funda\u00e7\u00e3o para a Ci\u00eancia e Tecnologia","award":["COVID\/BD\/152726\/2022"],"award-info":[{"award-number":["COVID\/BD\/152726\/2022"]}]},{"name":"the Volkswagen Stiftung Life? Initiative","award":["A126151"],"award-info":[{"award-number":["A126151"]}]},{"DOI":"10.13039\/501100000781","name":"European Research Council","doi-asserted-by":"publisher","award":["Neurofish-DLV-773012"],"award-info":[{"award-number":["Neurofish-DLV-773012"]}],"id":[{"id":"10.13039\/501100000781","id-type":"DOI","asserted-by":"publisher"}]},{"name":"Portuguese FCT - Foundation for Science and Technology","award":["2023.14873.PEX"],"award-info":[{"award-number":["2023.14873.PEX"]}]},{"name":"Portuguese FCT - Foundation for Science and Technology","award":["PTDC\/NEU-SCC\/5221\/2014"],"award-info":[{"award-number":["PTDC\/NEU-SCC\/5221\/2014"]}]},{"name":"the Champalimaud Foundation"}],"content-domain":{"domain":["www.plosone.org"],"crossmark-restriction":false},"short-container-title":["PLoS One"],"abstract":"<jats:p>We present Sardine, a software framework built with .NET to control experimental setups through the reliable execution of dynamic networks of independent modules, where each module can interface with a hardware device (e.g., camera, motor) or represent an operation over data (e.g., image filter, data stream). The Sardine framework delivers robust fault-tolerant hardware control and eliminates downstream delays by implementing dedicated data processing queues for each module. Any .NET class can be seamlessly adapted into a Sardine module, enabling effortless integration with existing codebases. Sardine\u2019s modular architecture ensures flexibility to accommodate changes in experimental paradigms, simplifying the adaptation of essential features, such as swapping hardware components or redefining the logic of their interactions. The core of Sardine is a novel aggregation system that connects modules in two layers, designed to streamline complex workflows such as those in microscopy applications. The first layer (link layer) enables concurrent operations between modules, such as synchronizing a camera module with a stage controller or a laser module, while maintaining a dependency tree to ensure devices operate as intended. For example, in an imaging experiment, Sardine oversees individual module malfunctions, such as a camera failure or stage misalignment, gracefully handling errors and dynamically restoring functionality to impacted network segments to minimize disruption. The second layer (data layer) facilitates the transmission of information across modules by associating them with operations that produce, consume, or transform data. In an imaging context, this could involve processing raw image data from a camera module, passing it through a real-time analysis module for feature detection, and forwarding the results to a visualization module for immediate feedback. This two-layer architecture ensures seamless data flow and robust error handling, making Sardine ideal for dynamic and complex experimental setups. Sardine also integrates logging, a metadata collection system, and tools to create graphical applications.<\/jats:p>","DOI":"10.1371\/journal.pone.0330591","type":"journal-article","created":{"date-parts":[[2026,2,23]],"date-time":"2026-02-23T18:57:27Z","timestamp":1771873047000},"page":"e0330591","update-policy":"https:\/\/doi.org\/10.1371\/journal.pone.corrections_policy","source":"Crossref","is-referenced-by-count":0,"title":["Sardine: A modular framework for developing data acquisition and near real-time analysis applications"],"prefix":"10.1371","volume":"21","author":[{"ORCID":"https:\/\/orcid.org\/0000-0002-7325-2466","authenticated-orcid":true,"given":"A. Lucas","family":"Martins","sequence":"first","affiliation":[]},{"given":"Alexandre","family":"Laborde","sequence":"additional","affiliation":[]},{"ORCID":"https:\/\/orcid.org\/0000-0002-9763-8902","authenticated-orcid":true,"given":"Michael B.","family":"Orger","sequence":"additional","affiliation":[]}],"member":"340","published-online":{"date-parts":[[2026,2,23]]},"reference":[{"key":"pone.0330591.ref001","doi-asserted-by":"crossref","unstructured":"Ramakrishnan L, Gunter D. Ten principles for creating usable software for science. In: 2017 IEEE 13th International Conference on e-Science (e-Science). 2017. p. 210\u20138. https:\/\/doi.org\/10.1109\/escience.2017.34","DOI":"10.1109\/eScience.2017.34"},{"key":"pone.0330591.ref002","doi-asserted-by":"crossref","unstructured":"Rios N, Sp\u00ednola RO, Mendon\u00e7a M, Seaman C. The most common causes and effects of technical debt: first results from a global family of industrial surveys. In: Proceedings of the 12th ACM\/IEEE International Symposium on Empirical Software Engineering and Measurement. Oulu Finland: ACM;2018. p. 1\u201310. https:\/\/dl.acm.org\/doi\/10.1145\/3239235.3268917","DOI":"10.1145\/3239235.3268917"},{"issue":"2","key":"pone.0330591.ref003","doi-asserted-by":"crossref","first-page":"1","DOI":"10.1145\/3054177","article-title":"A taxonomy and survey of cloud resource orchestration techniques","volume":"50","author":"D Weerasiri","year":"2017","journal-title":"ACM Comput Surv."},{"key":"pone.0330591.ref004","doi-asserted-by":"crossref","unstructured":"Bartlett RA, Heroux MA, Willenbring JM. Overview of the TriBITS lifecycle model: a Lean\/Agile software lifecycle model for research-based computational science and engineering software. In: 2012 IEEE 8th International Conference on E-Science. 2012. p. 1\u20138. https:\/\/doi.org\/10.1109\/escience.2012.6404448","DOI":"10.1109\/eScience.2012.6404448"},{"issue":"1","key":"pone.0330591.ref005","doi-asserted-by":"crossref","first-page":"97","DOI":"10.1109\/MS.2020.2973362","article-title":"The four pillars of research software engineering","volume":"38","author":"J Cohen","year":"2021","journal-title":"IEEE Softw."},{"issue":"1","key":"pone.0330591.ref006","doi-asserted-by":"crossref","DOI":"10.1371\/journal.pcbi.1005265","article-title":"Ten simple rules for developing usable software in computational biology","volume":"13","author":"M List","year":"2017","journal-title":"PLoS Comput Biol."},{"issue":"8034","key":"pone.0330591.ref007","doi-asserted-by":"crossref","first-page":"742","DOI":"10.1038\/d41586-024-03344-y","article-title":"Six tips for going public with your lab\u2019s software","volume":"634","author":"J Nowogrodzki","year":"2024","journal-title":"Nature."},{"key":"pone.0330591.ref008","doi-asserted-by":"crossref","unstructured":"Rajlich V, Hua J. Which practices are suitable for an academic software project?. In: 2013 IEEE International Conference on Software Maintenance. 2013. p. 440\u20133. http:\/\/ieeexplore.ieee.org\/document\/6676927\/","DOI":"10.1109\/ICSM.2013.67"},{"key":"pone.0330591.ref009","unstructured":"Manifesto for Agile Software Development. 2001. https:\/\/agilemanifesto.org\/iso\/en\/manifesto.html"},{"key":"pone.0330591.ref010","volume-title":"The agile software development series","author":"M Poppendieck","year":"2010"},{"issue":"2","key":"pone.0330591.ref011","doi-asserted-by":"crossref","DOI":"10.1162\/99608f92.018bf012","article-title":"Software engineering practices in academia: promoting the 3Rs\u2014readability, resilience, and reuse","volume":"5","author":"A Connolly","year":"2023","journal-title":"Harvard Data Science Review."},{"key":"pone.0330591.ref012","unstructured":"Heroux AM, Allen G. Computational Science and Engineering Software Sustainability and Productivity (CSESSP) Challenges Workshop Report. Networking and Information Technology Research and Development (NITRD) Program. 2016. https:\/\/www.nitrd.gov\/PUBS\/CSESSPWorkshopReport.pdf"},{"key":"pone.0330591.ref013","unstructured":"Hettrick S. Research Software Sustainability - Report on a Knowledge Exchange Workshop. Knowledge Exchange; 2016."},{"key":"pone.0330591.ref014","unstructured":"Microsoft. .NET | Build. Test. Deploy. 2024. https:\/\/dotnet.microsoft.com\/en-us\/"},{"key":"pone.0330591.ref015","doi-asserted-by":"crossref","DOI":"10.1017\/CBO9781139226424","volume-title":"Performance modeling and design of computer systems","author":"M Harchol-Balter","year":"2013"},{"key":"pone.0330591.ref016","doi-asserted-by":"crossref","unstructured":"Jouary A, Silva PTM, Laborde A, Mata JM, Marques JC, Collins EMD. Megabouts: a flexible pipeline for zebrafish locomotion analysis. 2024. https:\/\/www.biorxiv.org\/content\/10.1101\/2024.09.14.613078v2","DOI":"10.1101\/2024.09.14.613078"},{"issue":"8","key":"pone.0330591.ref017","article-title":"Structural and functional organization of visual responses in the inferior olive of larval zebrafish","volume":"44","author":"R F\u00e9lix","year":"2024","journal-title":"J Neurosci."},{"issue":"18","key":"pone.0330591.ref018","doi-asserted-by":"crossref","DOI":"10.1016\/j.cub.2023.08.037","article-title":"Dimensionality reduction reveals separate translation and rotation populations in the zebrafish hindbrain","volume":"33","author":"CE Feierstein","year":"2023","journal-title":"Curr Biol."},{"key":"pone.0330591.ref019","doi-asserted-by":"crossref","first-page":"7","DOI":"10.3389\/fninf.2015.00007","article-title":"Bonsai: an event-based framework for processing and controlling data streams","volume":"9","author":"G Lopes","year":"2015","journal-title":"Front Neuroinform."},{"issue":"1","key":"pone.0330591.ref020","doi-asserted-by":"crossref","first-page":"8148","DOI":"10.1038\/s41598-021-85896-x","article-title":"BonZeb: open-source, modular software tools for high-resolution zebrafish tracking and analysis","volume":"11","author":"NC Guilbeault","year":"2021","journal-title":"Sci Rep."},{"key":"pone.0330591.ref021","unstructured":"Microsoft. ReactiveX. 2021. https:\/\/reactivex.io\/"},{"issue":"1","key":"pone.0330591.ref022","first-page":"17","article-title":"National instruments LabVIEW: a programming environment for laboratory automation and measurement","volume":"12","author":"C Elliott","year":"2007","journal-title":"JALA: Journal of the Association for Laboratory Automation."},{"key":"pone.0330591.ref023","doi-asserted-by":"crossref","first-page":"103030","DOI":"10.1016\/j.simpat.2024.103030","article-title":"An algorithm for processing block diagram models of dynamical systems and an open-source visual-programming simulation tool","volume":"138","author":"M Torres-Torriti","year":"2025","journal-title":"Simulation Modelling Practice and Theory."},{"key":"pone.0330591.ref024","doi-asserted-by":"crossref","unstructured":"Dimitriadis G, Svahn E, MacAskill A, Akrami A. Heron: a knowledge graph editor for intuitive implementation of python based experimental pipelines; 2024. https:\/\/elifesciences.org\/reviewed-preprints\/91915v1.","DOI":"10.7554\/eLife.91915.1"},{"issue":"4","key":"pone.0330591.ref025","doi-asserted-by":"crossref","first-page":"045004","DOI":"10.1088\/1741-2552\/aa7526","article-title":"Falcon: a highly flexible open-source software for closed-loop neuroscience","volume":"14","author":"D Ciliberti","year":"2017","journal-title":"J Neural Eng."},{"issue":"2","key":"pone.0330591.ref026","doi-asserted-by":"crossref","first-page":"026046","DOI":"10.1088\/1741-2552\/ad3b3a","article-title":"BRAND: a platform for closed-loop experiments with deep network models","volume":"21","author":"YH Ali","year":"2024","journal-title":"J Neural Eng."},{"key":"pone.0330591.ref027","article-title":"Computer control of microscopes using \u03bcManager","author":"A Edelstein","year":"2010","journal-title":"Curr Protoc Mol Biol."},{"issue":"2","key":"pone.0330591.ref028","doi-asserted-by":"crossref","first-page":"1","DOI":"10.14440\/jbm.2014.36","article-title":"Advanced methods of microscope control using Manager software","volume":"1","author":"A D. Edelstein","year":"2014","journal-title":"JBM."},{"issue":"7","key":"pone.0330591.ref029","doi-asserted-by":"crossref","first-page":"671","DOI":"10.1038\/nmeth.2089","article-title":"NIH Image to ImageJ: 25 years of image analysis","volume":"9","author":"CA Schneider","year":"2012","journal-title":"Nat Methods."},{"issue":"4","key":"pone.0330591.ref030","doi-asserted-by":"crossref","DOI":"10.1371\/journal.pcbi.1006699","article-title":"Stytra: an open-source, integrated system for stimulation, tracking and closed-loop behavioral experiments","volume":"15","author":"V \u0160tih","year":"2019","journal-title":"PLoS Comput Biol."},{"issue":"9","key":"pone.0330591.ref031","doi-asserted-by":"crossref","first-page":"1281","DOI":"10.1038\/s41593-018-0209-y","article-title":"DeepLabCut: markerless pose estimation of user-defined body parts with deep learning","volume":"21","author":"A Mathis","year":"2018","journal-title":"Nat Neurosci."},{"key":"pone.0330591.ref032","doi-asserted-by":"crossref","unstructured":"Draelos A, Loring MD, Nikitchenko M, Sriworarat C, Gupta P, Sprague DY, et al. improv: A software platform for real-time and adaptive neuroscience experiments. openRxiv. 2021. https:\/\/doi.org\/10.1101\/2021.02.22.432006","DOI":"10.1101\/2021.02.22.432006"},{"key":"pone.0330591.ref033","unstructured":"AvaloniaUI. AvaloniaUI\/Avalonia. 2024. https:\/\/github.com\/AvaloniaUI\/Avalonia"},{"key":"pone.0330591.ref034","unstructured":"Microsoft. Dotnet\/maui. 2025. https:\/\/github.com\/dotnet\/maui"}],"container-title":["PLOS One"],"original-title":[],"language":"en","link":[{"URL":"https:\/\/dx.plos.org\/10.1371\/journal.pone.0330591","content-type":"unspecified","content-version":"vor","intended-application":"similarity-checking"}],"deposited":{"date-parts":[[2026,2,23]],"date-time":"2026-02-23T18:57:34Z","timestamp":1771873054000},"score":1,"resource":{"primary":{"URL":"https:\/\/dx.plos.org\/10.1371\/journal.pone.0330591"}},"subtitle":[],"editor":[{"given":"Inbakandan","family":"Dhinakarasamy","sequence":"first","affiliation":[]}],"short-title":[],"issued":{"date-parts":[[2026,2,23]]},"references-count":34,"journal-issue":{"issue":"2","published-online":{"date-parts":[[2026,2,23]]}},"URL":"https:\/\/doi.org\/10.1371\/journal.pone.0330591","relation":{},"ISSN":["1932-6203"],"issn-type":[{"value":"1932-6203","type":"electronic"}],"subject":[],"published":{"date-parts":[[2026,2,23]]}}}