Skip to main content

Hardware Compatibility Matrix

This matrix covers every hardware category supported by Pychron as of the current main branch. It is derived from a direct audit of pychron/hardware/, pychron/spectrometer/, pychron/lasers/, pychron/furnace/, and related modules. Where limitations exist they are noted inline; see Known Issues at the bottom for items requiring attention before deployment.

Status Legend

SymbolMeaning
Production — fully implemented, in active use at one or more labs
Partial — functional for most operations but has documented gaps or workarounds
Stub — class exists in the codebase but the body is pass or near-empty; not usable
Lab-specific — implemented for one institution; may require adaptation elsewhere

Mass Spectrometers

ManufacturerModelProtocolStatusNotes
Thermo ScientificArgus VIEthernet TCP → QtegraAll commands proxied through Qtegra RemoteControlServer. Issues a Reset on connect. Class: ArgusSpectrometer
Thermo ScientificHelix MC+Ethernet TCP → QtegraSame Qtegra proxy pattern as Argus. Class: HelixSpectrometer
Thermo ScientificHelix SFTEthernet TCP → QtegraDedicated HelixSFTSpectrometerManager. Class: HelixSFTSpectrometer
IsotopxNGXEthernet TCP (custom ASCII)Requires username/password authentication on connect. Command lock and retry logic present for valve-state queries; intermittent drop-outs are handled by retry but should be monitored. Class: NGXSpectrometer
Pfeiffer VacuumQuaderaSerial/EthernetSpectrometer logic (magnet, detector, source) implemented, but hardware controller class QuaderaController is a stub (pass). Communication layer not functional. Class: QuaderaSpectrometer
GV InstrumentsMAP 215/216SerialOnly channel_select and magnet defined. No plugin registration. Appears to be legacy/incomplete. Class: MapSpectrometer

Laser Systems

ManufacturerModelProtocolStatusNotes
Photon MachinesFusions CO₂Serial or EthernetFull power calibration via polynomial coefficients; ADC1 power reading. Class: FusionsCO2LogicBoard
Photon MachinesFusions DiodeSerial or EthernetIntegrates Watlow temperature control and Kerr motor stage. Class: FusionsDiodeLogicBoard
Photon MachinesFusions UVSerialAdds Kerr-driven nitrogen flow control (NitrogenFlower). Class: FusionsUVLogicBoard
SynradCO₂Serial (via Agilent)Power set via AgilentDAC; enable/disable via AgilentGPActuator on address 120. Class: SynradCO2Manager
UC2000Nd:YAG (frequency-doubled)SerialSCPI-like protocol. Class: UC2000
OsTechDiodeSerialNMGRL-specific. Class: OsTechLaserController
ATLLaser Control UnitSerialFusions UV accessory. Class: ATLLaserControlUnit
TAPCO₂Class body is pass. No communication, power, or stage control implemented. Class: TAPLaserManager
TAPDiodeZaber (Ethernet)Stage control via Zaber motion controller. Laser power control not implemented. Class: TAPDiodeManager

Furnace Systems

ManufacturerModelProtocolStatusNotes
NMGRL (in-house)Resistance furnaceUSB (LabJack U3) + Serial (Eurotherm)Temperature via Eurotherm 818/3504 PID; sample feeder and funnel via stepper motors; camera and recorder integrated. Class: NMGRLFurnaceManager
LDEO (in-house)LabJack U3 furnaceUSB (LabJack U3, I2C DAC)Setpoint write executes I2C calls but temperature control loop is not closed — "Temperature control not implemented" warning fires at runtime (ldeo_furnace.py:159). Calibration loaded from I2C EEPROM (address 0x50). Class: LDEOFurnaceManager
Thermo ScientificFurnaceQtegra RPC + SerialTemperature control via Qtegra proxy; sample feeder (ThermoFurnaceFeeder) is minimal. Class: ThermoFurnaceController
USGS RestonIn-house furnaceMinimal implementation for USGS Reston lab only. Class: RestonFurnaceManager

Extraction Line Valve Actuators

ManufacturerModelProtocolStatusNotes
Agilent34903A GP switchGPIB or EthernetPrimary actuator for multi-valve extraction lines. Class: AgilentGPActuator
ArduinoGP actuatorSerialFirst command after connect consistently times out (TODO at arduino_gp_actuator.py:45). Subsequent commands work normally.
IsotopxNGX controllerEthernetValve control routed through NGX spectrometer controller. Class: NGXGPActuator
MCCUSB DAQ relayUSBRelay output via MCC USB hardware. Class: MCCGPActuator
NCDProXR relayEthernetHTTP-style commands to ProXR module. Class: ProXRActuator
NMGRL (in-house)Furnace actuatorRPCControls NMGRL furnace sample loader remotely. Class: NMGRLFurnaceActuator
LabJackT4 ProUSB or EthernetGPIO relay output. Class: T4Actuator
LabJackU3USBGPIO relay output. Class: U3Actuator
ThermoQtegra proxyEthernet → QtegraValve commands proxied through Qtegra. Class: QtegraGPActuator
PLC2000Modbus relayModbus RTUModbus coil writes for relay control. Class: PLC2000GPActuator
PychronRemote actuatorZMQ/RPCConnects to a remote Pychron instance. Class: PychronGPActuator
WiscArIn-houseRPCUniversity of Wisconsin–Madison lab specific. Class: WiscArGPActuator
Switch ControllerSerialGeneric ASCII serial relay board. Class: SwitchController
Dummy actuatorSimulation and testing only. Class: DummyGPActuator

Vacuum Gauges

ManufacturerModelProtocolStatusNotes
MKS InstrumentsMulti-Gauge controllerSerialASCII command format @dd command;FF. Multi-channel; power on/off per channel. Class: MKSController
MKS InstrumentsSpinning Rotor Gauge (SRG)SerialClass: MKSSRG
Granville-PhillipsMicroIon controllerSerialMultiple variants: standard, headless, Qtegra proxy, Pychron remote. Class: MicroIonController
Pfeiffer VacuumMaxiGaugeSerial (Modbus RS-485)Class: PfeifferMaxiGaugeController
VarianXGS-600Serial SCPIClass: XGS600GaugeController
InficonIGC100Serial SCPIClass: IGC100GaugeController
PLC2000Modbus gauge/heaterModbus RTU or TCPCombined heater and gauge controller. Class: PLC2000GaugeController
LabJackU3 ADC gaugeUSBReads pressure via U3 analog input. Class: U3GaugeController
ThermoQtegra proxyEthernet → QtegraReads gauge values through Qtegra. Class: QtegraGaugeController
ADC gauge (generic)Analog (MCC USB / ADC)Generic ADC-backed gauge reading. Class: ADCGaugeController

Ion Pumps and Turbomolecular Pumps

ManufacturerModelProtocolStatusNotes
SPCIon pump controllerSerialOn/off control; current/voltage monitoring. Class: SPCIonPumpController
TerraNovaIon pump controllerSerialClass: TerraNovaIonPumpController
Pfeiffer VacuumHiPace turbomolecular pumpSerial (Modbus-like)On/off control; rotation speed monitoring. Class: HiPace

Temperature Controllers

ManufacturerModelProtocolStatusNotes
WatlowEZZone PM / PM6 / F4Modbus RTU or Standard ASCIIDual protocol (StandardProtocol and ModbusProtocol). Used in Fusions Diode and furnace systems. Class: WatlowEZZone
Eurotherm818Serial (Modbus RTU)Used in NMGRL furnace. Class: Eurotherm818
Eurotherm2408 / 3504Serial (Modbus RTU)Multi-zone controllers. Class: Eurotherm
LakeshoreModel 325Serial or GPIBDual-zone cryogenic. Class: Model325TemperatureController
LakeshoreModel 330Serial or GPIBClass: Model330TemperatureController
LakeshoreModel 331Serial or GPIBClass: Model331TemperatureController
LakeshoreModel 335SerialClass: Model335TemperatureController
LakeshoreModel 336SerialClass: Model336TemperatureController
Scientific InstrumentsSI9700SerialCryogenic/liquid helium controller. Class: SI9700Controller
OmegaDPi32 temperature monitorSerial RS-232Read-only temperature monitor. Class: DPi32TemperatureMonitor
AQUATemperature controllerSerialClass: AquaController

Pyrometers

ManufacturerModelProtocolStatusNotes
Micro-EpsilonIR thermometerSerialUsed in Fusions laser systems. Class: MicroEpsilonPyrometer
MikronGA140SerialInfrared pyrometer for high-temperature measurement. Class: MikronGA140Pyrometer
ADC-based pyrometerAnalog (ADC)Generic pyrometer via analog voltage input. Class: PyrometerTemperatureMonitor

Motion Controllers

ManufacturerModelProtocolStatusNotes
AerotechSerial (proprietary)Multi-axis motion controller. Class: AerotechMotionController
NewportESP301 / ESP302Serial ASCIIuse_hack_axis=True workaround active: uses displacement-based positioning instead of native axis commands (newport_motion_controller.py:306–319). Class: NewportMotionController
Zaber TechnologiesLinear stagesSerial (binary or ASCII)Legacy binary protocol and modern ASCII protocol both supported. Class: ZaberMotionController
ThorlabsKinesisUSB (Kinesis SDK)Class: KinesisMotionController
Schneider ElectricMDriveSerial (MDrive ASCII)Stepper motor controllers. Headless variant available. Class: MDriveMotor
Photon MachinesKerr microcontrollerSerial (proprietary)Internal stage controller for Fusions laser systems. Home move uses velocity-profile-mode workaround (kerr_motor.py:716). Classes: KerrMotor, KerrMicrocontroller

Data Acquisition

ManufacturerModelProtocolStatusNotes
Agilent / Keysight34970A multiplexer / DACGPIB or EthernetMulti-channel with polynomial channel-mapping equations. Classes: AgilentMultiplexer, AgilentDAC, AgilentDMM
Agilent / KeysightU2351AGPIB or EthernetModular DAQ. Class: U2351A
LabJackU3 / U3-LVUSBMulti-channel ADC, GPIO, I2C, SPI, timers. Classes: U3LV, HeadlessU3LV
LabJackT4 ProUSB or EthernetSuccessor to U3; higher resolution ADC. Class: T4
Measurement ComputingUSB DAQ (MCC)USBDAQmx-compatible interface. Class: MccCommunicator
NCDProXR ADCEthernetADC expansion for ProXR relay modules. Class: ProXRADC
KeithleyADCSerial or GPIBSCPI-based. Class: KeithleyADC
OmegaADCSerialClass: OmegaADC

Environmental and Lab Monitoring

ManufacturerModelProtocolStatusNotes
TempHum MicroServerEthernetStandalone Ethernet sensor for lab temperature and humidity. Class: TempHumMicroServer
DHT11GPIO (Raspberry Pi)Direct-read temperature and humidity via GPIO. Class: DHT11
Air transducerAnalog (ADC)Pressure transducer via ADC input. Class: AirTransducer
Thermocouple transducerAnalog (ADC)Thermocouple voltage via ADC. Class: ThermocoupleTransducer
Analog power meterADCLaser power monitoring via analog voltage. Class: AnalogPowerMeter
Eaton / PowerwareFerrups UPSSerialUninterruptible power supply monitoring. Class: FerrupsUPS
Bakeout PLCModbus RTUModbus-based bakeout heater controller. Class: BakeoutPLC
Pneumatics controllerModbusPolynomial-mapped pressure/output control. Class: Pneumatics
SS CoolingThermoRackSerialRack-mount chiller controller. Class: ThermoRack
Pychron chillerRPCRemote chiller connected via Pychron RPC. Class: PychronChiller
Raspberry PiGPIOGPIOGeneral-purpose digital I/O. Class: RPiGPIO

Sample Handling

ManufacturerModelProtocolStatusNotes
NMGRL (in-house)Furnace feeder / funnelGPIO (motor) + SerialStepper motor-driven sample drop into NMGRL resistance furnace. Classes: NMGRLFurnaceFeeder, NMGRLFurnaceFunnel
Rotary dumper (Arduino)SerialArduino-controlled rotary sample dumper. Class: RotaryDumper
Sample changerRPC / Extraction lineIntegrates with the valve network and extraction line state machine. Class: SampleChanger
Photon MachinesFiber light controllerGPIO / Serial / USBIllumination for stage camera. Variants: U3 (LabJack), Arduino. Class: FiberLight

Communication Protocols

This table summarises the protocols Pychron uses and the Python library that implements each one.

ProtocolLibraryTypical Use
Serial RS-232 / RS-485pyserialTemperature controllers, gauges, laser logic boards, motion controllers
Ethernet TCPsocket / requestsSpectrometer proxy (Qtegra), NGX, Agilent DAQ, remote actuators
GPIB / IEEE-488PyVISA + NI-VISAAgilent instruments, LakeShore controllers
Modbus RTU (Serial)pymodbusWatlow, Eurotherm, PLC2000, Pfeiffer gauges
Modbus TCPpymodbusPLC2000 in networked configurations
USB (LabJack)LabJackPythonLabJack U3 and T4 for ADC, GPIO, I2C
USB (MCC)MCC Universal LibraryMCC DAQ cards for relay and analog I/O
USB (Kinesis)Thorlabs Kinesis SDKThorlabs motion stages (Windows only)
ZMQ PUB/SUBpyzmqDashboard data stream; inter-process instrument broadcasts
Pychron RPCInternal (ZMQ/socket)Cross-node hardware commands (pyExperiment → pyValve / furPi)
I2CLabJack U3 (bit-bang)LDEO furnace DAC and EEPROM (LJTick-DAC)
GPIORPi.GPIORaspberry Pi direct I/O; DHT11 sensor

Known Issues

The following are documented defects or incomplete implementations in the main branch. Each entry includes the relevant file so issues can be tracked to source.

  • NGX command reliability — The NGX controller (pychron/hardware/isotopx_spectrometer_controller.py) uses a threading lock and retry logic for valve-state queries. Intermittent command drop-outs have been observed; they are handled silently by retry. Labs using NGX should monitor logs for repeated retry events, which may indicate a network or Ethernet adapter issue on the NGX instrument.

  • LDEO furnace temperature control not implementedpychron/hardware/labjack/ldeo_furnace.py:159 emits a "Temperature control not implemented" warning at runtime. The I2C DAC setpoint path executes but there is no closed-loop control. The furnace can write setpoints but cannot regulate temperature autonomously.

  • Quadera spectrometer hardware controller is a stubpychron/hardware/quadera_spectrometer_controller.py contains only pass. The higher-level spectrometer, magnet, source, and detector classes exist, but no communication with the instrument is possible. QuaderaSpectrometer cannot be used in production.

  • TAP CO₂ laser class body is passpychron/lasers/laser_managers/tap_laser_manager.py (TAPLaserManager). No power control, stage control, or communication implemented. Not deployable.

  • TAP Diode laser power control missingTAPDiodeManager (same file) has Zaber stage motion wired up but no mechanism to set or read laser power. Stage positioning works; laser output control does not.

  • Arduino actuator first-command timeoutpychron/hardware/arduino/arduino_gp_actuator.py:45 has a TODO noting that the first command after connection reliably times out. A workaround (send a dummy command on connect) is noted but not implemented. Labs using Arduino actuators should expect the first valve command after startup to fail.

  • MAP spectrometer is a legacy stubpychron/spectrometer/map/ contains channel selection and magnet movement but no acquisition, source control, or plugin registration. Not usable with pyExperiment.

  • Newport motion controller hack axispychron/hardware/newport/newport_motion_controller.py:306–319 enables use_hack_axis=True, substituting a displacement-based positioning workaround for native ESP axis commands. This works for laser stages but may break for other Newport ESP301/302 configurations.

  • APIS controller partialpychron/hardware/apis_controller.py has multiple methods with pass bodies, including power and intensity control. Status is Partial; do not rely on power regulation through this class.

  • LDEO/Lamont furnace unit-conversion logic errorpychron/hardware/labjack/ldeo_furnace.py:124–126 contains if not units == "volts" or units == "temperature" which evaluates incorrectly due to operator precedence. Should be if not (units == "volts" or units == "temperature"). The bug may cause incorrect unit handling when reading temperature in some configurations.