This page contains different overviews of the PyExpLabSys archive and can work as an entry point for a new user.

Section Project Overview contains a short explanation of the different components that PyExpLabSys consist of and the source code and documentation entries that are relevant for that part.

The table in section Module Overview contains an overview of all the modules in PyExpLabSys. The overview consist of a short description (the first line of the module docstring) and its Python 2/3 support status.

PyExpLabSys strive to support Python version 2.7 and >=3.3. See the section Python 3 support about Python 3 support.

Project Overview

This section will explain how the different components of PyExpLabSys (and its sister project cinfdata) fits together.


Figure illustrating how the different software components (boxes with blue edge) of PyExpLabSys (and cinfdata) fits together.

The overall structure is illustrated in the overview figure. On the aquisition level, there is a number of machines which could be e.g. Raspberry Pi’s or laboratory PC’s, which will use different parts of PyExpLabSys depending on its purpose.

Machine 1 e.g. is used to parse already aquired data from local data files (File parsers) and send that data to the database (Database Savers). Machine 2 aquires data via an equipment drivers (Drivers) and makes it available to other machines on the network (Sockets) and uploads it to the database (Database Savers). Like machine 2, machine 3 also aquires data directly (Drivers), but it also makes use of the data that machine 2 makes available (Sockets).

On the server level there is a MySQL servers to which all data is saved and a webserver. The webserver runs a webpage called “Cinfdata” (source code), which is used for data presentation and light data treatment.

On the user level, users will commonly access the data via the Cinfdata website in a browser on the desktop or on a smart phone. To get the data locally to do more extensive data treament, it is possible to fetch the data directly from MySQL server or to use an export function on the website.

In the following, each of these software components will be described in a little more detail.


At this point PyExpLabSys contains a reasonable amount of drivers (46 files, 81 classes May-16) for general purpose equipment (data cards, temperature readout etc.) and for equipment related specifically to the vacuum lab we work in (pressure gauge controllers, mass spectrometers etc).

The source code for the drivers are in the drivers folder, in which the file names are either manufacturer and model or just the manufacturer.

The documentation for the drivers are divided into two sections Hardware Drivers and Hardware Drivers Autogenerated Docs Only. The latter is the group for which there is only API documentation auto generated from the source code and the former are the drivers that has more specific documentation with example usage etc.

File parsers

PyExpLabSys also contains a small number of parsers for custom file formats. The source code for these are in the file_parsers folder and the documentation is in the File parsers section.

Database Savers

The database savers are some of the more frequently used classes in PyExpLabSys. Quite simply, they abstract away; the database layout, the SQL and the queuing of data ofloading (to prevent loosing data in the event of data loss). The source code for the database savers are in database_saver module in the common sub-package. The documentation is located at The database_saver module.


The sockets are another set of very important and highly used classes in PyExpLabSys. Most of the sockets are socket servers, which mean that they accept UDP requests and serves (or accepts) data. These are essentially used as network variables, by either exposing a measurement on the network or accepting input. A final type of socket is the LiveSocket which is used to live stream data to a live streaming proxy server. Furthermore, all sockets also expose system (health) information to the network. The code for the sockets are found in the sockets module in the common sub-package. The documentation is located at The sockets module.


The apps section contains stand alone programs which can be used directly and not only as service functions of larger programs. Typically the apps sports text based guis and several apps also have ambitions for graphical guis. Notable examples of apps are: socket supervisor This very simple app continously probes a port (typically a socket) and reports back if the socket is running correctly.

Mass Spectrometer Controls a number of Pfeiffer mass spectrometers. The app includes support for an infinite amount of meta-channels wich is pulled in via sockets.

Picture Logbook A graphical logbook system based on a barcode reader and a camera. The user of the equipment logs in before use and out after use. A picture of the equipment is acquired at login and logout. Also contains support for an external screen wich shows the currently logged in user.

Turbo pump controler Logs and controls Pfeiffer turbo pumps. A number of important parameters are shown in a terminal and the values are also availble as live sockets.


Besides from the items listed above PyExpLabSys contains a number of little helpers. The PyExpLabSys.common.utilities (code, doc) module contains a convenience function to get a logger, that is configured that way that we prefer, including email notification of anything warning level or above.

Python 3 support

We love Python 3. Unfortunately we are not hired to make software, but to keep a lab running. This means that modules are only ported to Python 3, when it is either convinient or we are touching the code anyway.

Module Overview

PyExpLabSys.combos (Python 2 only [1])

  • This module contains socket, database saver and logger heuristic combinations

PyExpLabSys.settings (Python 2 only [1])

  • This module contains the modules used for settings for PyExpLabSys

PyExpLabSys.common.plotters_backend_qwt (Python 2 only [1])

  • This module contains plotting backends that use the PyQwt library

PyExpLabSys.common.system_status (Python 2 only [1])

  • This module contains the SystemStatus class

PyExpLabSys.common.utilities (Python 2 only [1])

  • This module contains a convenience function for easily setting up a logger with the logging module.

PyExpLabSys.common.value_logger (Python 2 and 3)

  • Read a continuously updated values and decides whether it is time to log a new point

PyExpLabSys.common.valve_control (Python 2 and 3)

  • This module implements the necessary interface to control a valve box using standard gpio commands

PyExpLabSys.common.socket_clients (Python 2 only [1])

  • This file implements Python clients for the DateDataPullSocket

PyExpLabSys.common.microreactor_temperature_control (Python 2 and 3)

  • Common code for microreactor heaters

PyExpLabSys.common.supported_versions (Python 2 and 3)

  • Functions used to indicate and check for supported Python versions

PyExpLabSys.common.analog_flow_control (Python 2 only [1])

  • Control app for analog pressure controller on sniffer setup

PyExpLabSys.common.loggers (Python 2 only [1])

  • This module contains convinience classes for database logging. The classes implement queues to contain the data before of loading to the database to ensure against network or server problems.

PyExpLabSys.common.flow_control_bronkhorst (Python 2 and 3)

  • Common code for Bronkhorst boxes

PyExpLabSys.common.plotters (Python 2 only [1])

  • This module contains plotters for experimental data gathering applications. It contains a plotter for data sets.

PyExpLabSys.common.decorators (Python 2 only [1])

  • This module contains general purpose decorators

PyExpLabSys.common.text_plot (Python 2 only [1])

  • GNU plot based plots direcly into a curses window

PyExpLabSys.common.chiller_reader (Python 2 and 3)

  • Module for monitoring a polyscience chiller

PyExpLabSys.common.sockets (Python 2 and 3)

  • The sockets module contains various implementations of UDP socket servers (at present 4 in total) for transmission of data over the network. The different implementations are tailored for a specific purposes, as described below.

PyExpLabSys.common.database_saver (Python 2 and 3)

  • Classes for saving coninuous data and data sets to a database

PyExpLabSys.common.massspec.channel (Python 2 only [1])

  • This module contains the implementation of a general purpose mass spectrometer channel

PyExpLabSys.common.massspec.test (Python 2 only [1])

  • Module to test the mass spec common components

PyExpLabSys.common.massspec.qt (Python 2 only [1])

  • Module that contains QT widgets for mass spectrometer channels and channel lists

PyExpLabSys.drivers.pfeiffer_turbo_pump (Python 2 and 3)

  • Self contained module to run a Pfeiffer turbo pump including fall-back text gui and data logging.

PyExpLabSys.drivers.brooks_s_protocol (Python 2 and 3)

  • Driver for Brooks s-protocol

PyExpLabSys.drivers.honeywell_6000 (Python 2 and 3)

  • Driver for HIH6000 class temperature and humidity sensors

PyExpLabSys.drivers.stmicroelectronics_ais328dq (Python 2 and 3)

  • Driver for STMicroelectronics AIS328DQTR 3 axis accelerometer

PyExpLabSys.drivers.four_d_systems (Python 2 and 3)

  • Drivers for the 4d systems displays

PyExpLabSys.drivers.specs_XRC1000 (Python 2 only [1])

  • Self contained module to run a SPECS sputter gun including fall-back text gui

PyExpLabSys.drivers.omega_D6400 (Python 2 and 3)

  • Driver for Omega D6400 daq card

PyExpLabSys.drivers.mks_937b (Python 2 and 3)

  • Driver for MKS 937b gauge controller

PyExpLabSys.drivers.freescale_mma7660fc (Python 2 and 3)

  • Driver for AIS328DQTR 3 axis accelerometer

PyExpLabSys.drivers.mks_925_pirani (Python 2 and 3)

  • Driver for MKS 925 micro pirani

PyExpLabSys.drivers.omega_cni (Python 2 and 3)

  • This module contains drivers for equipment from Omega. Specifically it contains a driver for the ??? thermo couple read out unit.

PyExpLabSys.drivers.rosemount_nga2000 (Python 2 only [1])


PyExpLabSys.drivers.innova (Python 2 only [1])

  • Driver for the Innova RT 6K UPS

PyExpLabSys.drivers.agilent_34972A (Python 2 and 3)

  • Driver class for Agilent 34972A multiplexer

PyExpLabSys.drivers.edwards_nxds (Python 2 and 3)

  • Driver for Edwards, nXDS pumps

PyExpLabSys.drivers.omegabus (Python 2 and 3)

  • Driver for OmegaBus devices

PyExpLabSys.drivers.omega_cn7800 (Python 2 only [1])

  • Omega CN7800 Modbus driver. Might also work with other CN units

PyExpLabSys.drivers.vogtlin (Python 2 and 3)

  • Minimal MODBUS driver for the red-y smart - meter GSM, - controller GSC, - pressure controller GSP and - back pressure controller GSB.

PyExpLabSys.drivers.xgs600 (Python 2 and 3)

  • Driver class for XGS600 gauge controll

PyExpLabSys.drivers.pfeiffer (Python 2 only [1])

  • This module contains drivers for the following equipment from Pfeiffer Vacuum:

PyExpLabSys.drivers.dataq_comm (Python 2 and 3)

  • Driver for DATAQ dac units

PyExpLabSys.drivers.polyscience_4100 (Python 2 and 3)

  • Driver and test case for Polyscience 4100

PyExpLabSys.drivers.keithley_2700 (Python 2 and 3)

  • Simple driver for Keithley Model 2700

PyExpLabSys.drivers.scpi (Python 2 and 3)

  • Implementation of SCPI standard

PyExpLabSys.drivers.NGC2D (Python 2 only [1])


PyExpLabSys.drivers.stahl_hv_400 (Python 2 and 3)

  • Driver for Stahl HV 400 Ion Optics Supply

PyExpLabSys.drivers.omron_d6fph (Python 2 and 3)

PyExpLabSys.drivers.keithley_smu (Python 2 and 3)

  • Simple driver for Keithley SMU

PyExpLabSys.drivers.mks_g_series (Python 2 and 3)

  • Driver for MKS g-series flow controller

PyExpLabSys.drivers.vivo_technologies (Python 2 only [1])

  • Driver for a Vivo Technologies LS-689A barcode scanner

PyExpLabSys.drivers.deltaco_TB_298 (Python 3 only)

  • Driver with line reader for the Deltaco TB-298 Keypad

PyExpLabSys.drivers.mks_pi_pc (Python 2 only [1])


PyExpLabSys.drivers.srs_sr630 (Python 2 and 3)

  • Driver for Standford Research Systems, Model SR630

PyExpLabSys.drivers.dataq_binary (Python 2 and 3)

  • DataQ Binary protocol driver

PyExpLabSys.drivers.bio_logic (Python 2 only [1])

  • This module is a Python implementation of a driver around the EC-lib DLL. It can be used to control at least the SP-150 potentiostat from Bio-Logic under 32 bit Windows.

PyExpLabSys.drivers.fug (Python 2 only)

  • Driver for “fug NTN 140 - 6,5 17965-01-01” power supply Communication via the Probus V serial interface.

PyExpLabSys.drivers.cpx400dp (Python 2 and 3)

  • Driver for CPX400DP power supply

PyExpLabSys.drivers.epimax (Python 2 and 3)

  • Driver for the Epimax PVCi process vacuum controller

PyExpLabSys.drivers.bronkhorst (Python 2 and 3)

  • Driver for Bronkhorst flow controllers, including simple test case

PyExpLabSys.drivers.agilent_34410A (Python 2 and 3)

  • Driver class for Agilent 34410A DMM

PyExpLabSys.drivers.microchip_tech_mcp3428 (Python 2 and 3)

  • Driver for Microchip Technology MCP3428 Analog Input device Calibrated to PR33-13 from ncd.io other products will use different voltage references.

PyExpLabSys.drivers.isotech_ips (Python 2 only [1])

  • Driver for ISO-TECH IPS power supply series

PyExpLabSys.drivers.galaxy_3500 (Python 2 and 3)

  • Python interface for Galaxy 3500 UPS. The driver uses the telnet interface of the device.

PyExpLabSys.drivers.lascar (Python 2 only [1])

  • Driver for the EL-USB-RT temperature and humidity USB device from Lascar

PyExpLabSys.drivers.pfeiffer_qmg420 (Python 2 only [1])


PyExpLabSys.drivers.tenma (Python 2 and 3)

  • from __future__ import unicode_literals, print_function

PyExpLabSys.drivers.inficon_sqm160 (Python 2 only [1])

  • Driver for Inficon SQM160 QCM controller

PyExpLabSys.drivers.crowcon (Python 2 and 3)

  • This module contains a driver for the Vortex gas alarm central

PyExpLabSys.drivers.analogdevices_ad5667 (Python 3 only)

  • Driver for the Analog Devices AD5667 2 channel analog output DAC

PyExpLabSys.drivers.kjlc_pressure_gauge (Python 2 and 3)

  • Module contains driver for KJLC 3000 pressure gauge

PyExpLabSys.drivers.pfeiffer_qmg422 (Python 2 and 3)

  • This module contains the driver code for the QMG422 control box for a pfeiffer mass-spectrometer. The code should in principle work for multiple type of electronics. It has so far been tested with a qme-125 box and a qme-??? box. The module is ment as a driver and has very little function in itself. The module is ment to be used as a sub-module for a large program providing the functionality to actually use the mass-spectrometer.

PyExpLabSys.drivers.stmicroelectronics_l3g4200d (Python 2 and 3)

  • Driver for STMicroelectronics L3G4200D 3 axis gyroscope

PyExpLabSys.drivers.specs_iqe11 (Python 2 only [1])

  • Self contained module to run a SPECS sputter gun including fall-back text gui

PyExpLabSys.drivers.wpi_al1000 (Python 2 only [1])

  • This module implements a driver for the AL1000 syringe pump from World Precision Instruments

PyExpLabSys.drivers.intellemetrics_il800 (Python 2 only [1])

  • Driver for IL800 deposition controller

PyExpLabSys.drivers.edwards_agc (Python 2 only [1])

  • Driver and simple test case for Edwards Active Gauge Controler

PyExpLabSys.auxiliary.rtd_calculator (Python 2 and 3)

  • Calculates temperatures for an RTD

PyExpLabSys.auxiliary.pid (Python 2 and 3)

  • PID calculator

PyExpLabSys.auxiliary.tc_calculator (Python 2 only [1])


PyExpLabSys.thirdparty.cached_property (Python 2 only [1])

PyExpLabSys.thirdparty.olefile (Python 2 only [1])

  • Launched from the command line, this script parses OLE files and prints info.

PyExpLabSys.apps.mass_finder (Python 2 only [1])


PyExpLabSys.apps.wind_speed_logger (Python 2 and 3)

  • Logs fume hood wind speed

PyExpLabSys.apps.bakeout (Python 2 and 3)

  • App to control PW-modulated bakeout boxes

PyExpLabSys.apps.socket_tester (Python 2 only [1])

  • A socket tester program for linux

PyExpLabSys.apps.picture_logbook (Python 2 only [1])

  • Module to run a graphical logbook of a specific area

PyExpLabSys.apps.edwards_nxds_logger (Python 2 and 3)

  • Logger for nXDSni roughing pump

PyExpLabSys.apps.emission_control (Python 2 only [1])


PyExpLabSys.apps.turbo_logger (Python 2 and 3)

  • App to log output from Pfeiffer Turbo Pumps

PyExpLabSys.apps.rampreader (Python 2 only [1])


PyExpLabSys.apps.socket_supervisor (Python 2 and 3)

  • Module to check that local machine is living up to its duties

PyExpLabSys.apps.socket_logger (Python 2 and 3)

  • App for logging specific sockets into dateplots

PyExpLabSys.apps.ion_optics_controller (Python 2 and 3)

  • Ion Optics Control software

PyExpLabSys.apps.tof.spectrum_plotter (Python 2 only [1])


PyExpLabSys.apps.tof.fix_mass_axis (Python 2 and 3)

  • Program to fix x-axis on TOF-spectra

PyExpLabSys.apps.tof.helper_scripts.lm_test (Python 2 only [1])


PyExpLabSys.apps.bakeoutweb.bakeoutweb (Python 2 only [1])

  • Web app for the magnificient bakeout app

PyExpLabSys.apps.qms.qms (Python 2 and 3)

  • Mass Spec Main program

PyExpLabSys.apps.qms.mass_spec (Python 2 and 3)

  • Mass spec program

PyExpLabSys.apps.qms.qmg_meta_channels (Python 2 and 3)

  • Module to perform read-out of meta channels for qms

PyExpLabSys.apps.qms.qmg_status_output (Python 2 and 3)

  • Text UI for mass spec program

PyExpLabSys.apps.stepped_program_runner.stepped_program_runner (Python 2 only [1])

  • A general stepped program runner

PyExpLabSys.file_parsers.specs (Python 2 and 3)

  • This file is used to parse XPS and ISS data from XML files from the SPECS program.

PyExpLabSys.file_parsers.chemstation (Python 2 and 3)

  • File parser for Chemstation files

PyExpLabSys.file_parsers.total_chrom (Python 3 only)

  • Experimental parser for total_chrom files from Perkin-Elmer GC’s

PyExpLabSys.file_parsers.omicron (Python 2 only [1])

  • File parser for the Omicron “Flattener” format

PyExpLabSys.file_parsers.avantage (Python 2 only [1])

  • Test module for Avantage files

PyExpLabSys.file_parsers.avantage_xlsx_export (Python 2 only [1])

  • File parser for the Avantage xlsx export format


[1](1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46) For these modules the Python 2/3 status is not indicated directly in the source code file and so the status is inferred.