Skip to main content
Advertisement
Browse Subject Areas
?

Click through the PLOS taxonomy to find articles in your field.

For more information about PLOS Subject Areas, click here.

< Back to Article

Fig 1.

An overview of the Sardine framework.

Sardine is an open-source framework written in C# and built with .NET 8. It is designed for developing and executing complex scientific workflows. This framework allows users to quickly create and run data acquisition and processing desktop applications using a modular approach. In Sardine, complex systems are divided into components that are developed separately and encapsulated into modular units called vessels. The framework orchestrates the coordinated operation of these vessels.

More »

Fig 1 Expand

Fig 2.

Diagram of a vessel.

In Sardine, system components are adapted into a vessel, providing components with extra features while safeguarding their state. The Freighter class is responsible for instantiating Vessels. The Vessel class has the Builder, Initializer, and Invalidator methods. The builder is responsible for creating a component object, and the initializer is responsible for setting up the component after its creation. The invalidator properly marks the component as invalid in cases of termination or failure. A vessel may depend hierarchically on other vessels, meaning that the creation of its component requires access to other components, which must be properly initialized beforehand. These correspond to upstream nodes in the link graph. Conversely, a vessel is a dependency on downstream nodes in the link graph. The component’s state (online or offline) is observable through the IsOnline state variable. A wrapping call called Execute Call is provided to access the component code properly. Any data operations may be associated with a vessel - sources, transformers, or sinks, depending on whether they produce, modify, or consume data, respectively. The control variable IsActive toggles the data operations on and off. Sources are triggered by the Generate Data method, which can be polled periodically (at the rate defined by the Source Rate variable) or at will by the user. Incoming data is either immediately processed, or placed in a processing queue. The Data Handling Strategy variable defines this behavior. The link graph is represented by pink arrows, and blue dashed arrows represent the data graph. Vessel methods are represented by yellow boxes, and light green boxes represent vessel control variables. External actions are represented by large block arrows, and internal control flow by black arrows.

More »

Fig 2 Expand

Fig 3.

A representation of a fleet.

Vessels labeled A through H are interconnected through hierarchical dependencies, which are illustrated by the pink arrows in the link graph and by data operations, shown with dashed blue arrows in the data graph. A malfunctioning component does not lead to the failure of the entire application. Left: the fleet is in a normal state when vessel B malfunctions. Right: the fleet’s status after the malfunction. In this scenario, vessel B and its downstream nodes C and D are invalidated, but the remaining network continues to operate normally. E can still operate over data that arrives from H.

More »

Fig 3 Expand

Fig 4.

An example Sardine application running on Windows.

A The application’s main window displays a list of all vessels, providing information on their status and access to reload methods, as well as control over data connections. B The fleet graph diagram, as generated by Sardine. The link graph edges are represented by blue arrows, and the data graph edges are represented by purple arrows. C An example control displays various user interfaces for one vessel through a tabbed layout.

More »

Fig 4 Expand

Table 1.

Sardine settings available by default.

The settings name column is the XML path where that setting is stored.

More »

Table 1 Expand

Fig 5.

The fleet graph diagram of the VirtualFishTracker application.

Sardine automatically generated this graph. The link graph edges are represented by blue arrows, and the data graph edges are represented by purple arrows.

More »

Fig 5 Expand

Fig 6.

A screenshot of the VirtualFishTracker application.

The main window is visible, together with a set of UI components that are associated with vessels. The display shows data that is being transmitted as messages, originating from the video source and the tail tracker.

More »

Fig 6 Expand

Fig 7.

Fleet graph diagram for an example microscope application.

Blue arrows represent the link graph edges, and purple arrows represent the data graph edges.

More »

Fig 7 Expand

Fig 8.

A model for real-time control of hardware with Sardine.

A set of waveform synthesizers or other signal providers is associated with physical hardware channels (here represented as A for analog channels and D for digital channels) and virtual channels (represented as V) consisting of a series of instructions that the software will execute at given moments in time, forming pattern blocks. Then, an Experiment Controller component aggregates those blocks, together with an execution schedule provided by the user, and sends it to a Sequencer component, which builds the final waveforms sent to the corresponding hardware devices.

More »

Fig 8 Expand

Fig 9.

Sardine performance, measured against Bonsai and a baseline reference.

A Time taken to complete one test operation for different difficulty levels. Dots indicate the mean, and bars indicate the standard deviation. The frameworks were set to request test operations at 50 Hz. B Overhead of Sardine and Bonsai, calculated as the percentage of extra time required to complete a test operation with a framework versus without one. Data points were fit using a simple linear regression with no intercept.

More »

Fig 9 Expand