MWorks is a suite of applications that is intended to allow users to quickly design and execute neurophysiological or psychophysical experiments. MWorks was conceived and developed in response to the limitations of currently available software. The overarching philosophy of MWorks is to abstract the user away from the underlying C/C++ software, while still allowing: easy, but highly flexible experimental design; robust performance (i.e. no crashes); and (pseudo) real-time, multi-threaded behavior. Some of the primary features of MWorks are:
- Users do not need to know C or C++
- Users can design experiments that run as if they were written in C/C++ (e.g. psuedo real-time, multi-threaded)
- Server-client architecture allows remote experimental control and monitoring
- Multiple experiments can be controlled from clients running on a single remote computer
- All variables at play in an experiment are automatically saved in data files
- Design allows developer expansion through plugins
At an implementation level, the following ideas will help a new user understand how MWorks actually works (but an understanding of the details of these principles is not needed to use MWorks):
Each MWorks experiment and other input files (e.g. stored parameter settings) to MWorks applications are stored in XML (Extensible Markup Language). XML is a widely-used, open format that is human readable (i.e. text files), highly flexible, and platform independent.
MWorks experiments run by flowing through one or more state systems that consist of a series of states, actions within those states (e.g. show a stimulus, give a reward, update variable values), and transitions between those states. The principles here largely follow those employed by Lablib (developed by JHR Maunsell).
At run time, all "communication" in to (e.g. I/O devices, user parameter change requests), out of (e.g. data stream, output devices), and within (e.g. which stimulus index to show next) an experiment is done through MWorks variables. (Under the hood, each MWorks variable is a C++ object). Thus, these provide the "glue" by which the experiment is held together and connected to the outside world.
This overarching principle means that any variable changes are automatically transmitted to all interested parties within an experiment and outside an experiment (e.g. MWorks client windows), and that all variable changes are automatically saved to an open data file. Thus, the user can never forget to save one of their experimental parameters.