Architecture ============ The layers of a typical application are: .. graphviz:: digraph architecture { rankdir=TB; node [shape=box]; "Script or GUI" -> "Measure subclass"; "Measure subclass" -> "MGraph"; "MGraph" -> "Device drivers"; "Device drivers" -> "Communication classes"; "Measure subclass" -> "Autosave and history"; "Measure subclass" -> "EUT monitor"; "Measure subclass" -> "Report"; "SCUQ" -> "Measure subclass" [style=dashed]; "SCUQ" -> "MGraph" [style=dashed]; "SCUQ" -> "Device drivers" [style=dashed]; } Script or GUI ------------- The operator layer loads configuration, creates or restores the measurement class, and starts measurement and evaluation. Qt applications move long hardware operations into worker threads. ``Measure`` and measurement classes ----------------------------------- ``Measure`` provides shared infrastructure for logging, user interaction, autosave, pickle history, device initialization, and safe shutdown. ``MSC``, ``TEMCell``, and ``AmplifierTest`` add their domain workflows. ``MGraph`` ---------- ``MGraph`` reads DOT topology, evaluates conditions with an explicit context, creates device instances, and calculates path corrections. Leveling and amplifier protection also use the measurement graph. Device drivers and communication -------------------------------- Base drivers define the common API for a device class. Instrument-specific drivers map that API to SCPI or proprietary commands. Communication classes encapsulate GPIB, serial, Prologix, and other transports. SCUQ ---- SCUQ carries nominal value, unit, uncertainty, and correlation through the calculation. mpylab's centralized helpers convert between linear and logarithmic representations.