atomize-py 0.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- atomize_py-0.0.2/PKG-INFO +298 -0
- atomize_py-0.0.2/atomize/__init__.py +1 -0
- atomize_py-0.0.2/atomize/__main__.py +2 -0
- atomize_py-0.0.2/atomize/codeeditor.py +103 -0
- atomize_py-0.0.2/atomize/device_modules/Agilent_53131a.py +546 -0
- atomize_py-0.0.2/atomize/device_modules/Agilent_53181a.py +527 -0
- atomize_py-0.0.2/atomize/device_modules/Agilent_5343a.py +214 -0
- atomize_py-0.0.2/atomize/device_modules/BH_15.py +953 -0
- atomize_py-0.0.2/atomize/device_modules/CPWplus_150.py +115 -0
- atomize_py-0.0.2/atomize/device_modules/Cryomagnetics_4G.py +604 -0
- atomize_py-0.0.2/atomize/device_modules/Cryomagnetics_LM510.py +489 -0
- atomize_py-0.0.2/atomize/device_modules/Cryomech_CPA1110.py +226 -0
- atomize_py-0.0.2/atomize/device_modules/ECC_15K.py +229 -0
- atomize_py-0.0.2/atomize/device_modules/ER_031M.py +152 -0
- atomize_py-0.0.2/atomize/device_modules/ITC_503.py +416 -0
- atomize_py-0.0.2/atomize/device_modules/ITC_FC.py +220 -0
- atomize_py-0.0.2/atomize/device_modules/IVG_1_1.py +111 -0
- atomize_py-0.0.2/atomize/device_modules/Insys_FPGA.py +5853 -0
- atomize_py-0.0.2/atomize/device_modules/Keysight_2000_Xseries.py +1141 -0
- atomize_py-0.0.2/atomize/device_modules/Keysight_3000_Xseries.py +1237 -0
- atomize_py-0.0.2/atomize/device_modules/Keysight_4000_Xseries.py +1291 -0
- atomize_py-0.0.2/atomize/device_modules/Keysight_53230a.py +478 -0
- atomize_py-0.0.2/atomize/device_modules/L_card_L502.py +544 -0
- atomize_py-0.0.2/atomize/device_modules/Lakeshore_325.py +367 -0
- atomize_py-0.0.2/atomize/device_modules/Lakeshore_331.py +369 -0
- atomize_py-0.0.2/atomize/device_modules/Lakeshore_332.py +367 -0
- atomize_py-0.0.2/atomize/device_modules/Lakeshore_335.py +378 -0
- atomize_py-0.0.2/atomize/device_modules/Lakeshore_336.py +381 -0
- atomize_py-0.0.2/atomize/device_modules/Lakeshore_340.py +378 -0
- atomize_py-0.0.2/atomize/device_modules/Lakeshore_455_DSP.py +178 -0
- atomize_py-0.0.2/atomize/device_modules/Metrolab_PT2025.py +149 -0
- atomize_py-0.0.2/atomize/device_modules/Micran_Q_band_MW_bridge.py +583 -0
- atomize_py-0.0.2/atomize/device_modules/Micran_X_band_MW_bridge.py +402 -0
- atomize_py-0.0.2/atomize/device_modules/Micran_X_band_MW_bridge_v2.py +535 -0
- atomize_py-0.0.2/atomize/device_modules/Owen_MK110_220_4DN_4R.py +185 -0
- atomize_py-0.0.2/atomize/device_modules/PB_ESR_500_pro.py +3001 -0
- atomize_py-0.0.2/atomize/device_modules/PB_Micran.py +3489 -0
- atomize_py-0.0.2/atomize/device_modules/Planar_C2220.py +452 -0
- atomize_py-0.0.2/atomize/device_modules/Rigol_DP800_Series.py +530 -0
- atomize_py-0.0.2/atomize/device_modules/Rodos_10N.py +45 -0
- atomize_py-0.0.2/atomize/device_modules/SR_810.py +567 -0
- atomize_py-0.0.2/atomize/device_modules/SR_830.py +567 -0
- atomize_py-0.0.2/atomize/device_modules/SR_844.py +547 -0
- atomize_py-0.0.2/atomize/device_modules/SR_850.py +567 -0
- atomize_py-0.0.2/atomize/device_modules/SR_860.py +605 -0
- atomize_py-0.0.2/atomize/device_modules/SR_865a.py +603 -0
- atomize_py-0.0.2/atomize/device_modules/SR_DC205.py +333 -0
- atomize_py-0.0.2/atomize/device_modules/SR_DG535.py +411 -0
- atomize_py-0.0.2/atomize/device_modules/SR_PS300_Series.py +452 -0
- atomize_py-0.0.2/atomize/device_modules/SR_PTC_10.py +185 -0
- atomize_py-0.0.2/atomize/device_modules/Scientific_Instruments_SCM10.py +164 -0
- atomize_py-0.0.2/atomize/device_modules/Sibir_1.py +866 -0
- atomize_py-0.0.2/atomize/device_modules/Spectrum_M4I_2211_X8.py +1512 -0
- atomize_py-0.0.2/atomize/device_modules/Spectrum_M4I_4450_X8.py +1704 -0
- atomize_py-0.0.2/atomize/device_modules/Spectrum_M4I_6631_X8.py +4517 -0
- atomize_py-0.0.2/atomize/device_modules/Tektronix_3000_Series.py +877 -0
- atomize_py-0.0.2/atomize/device_modules/Tektronix_4000_Series.py +891 -0
- atomize_py-0.0.2/atomize/device_modules/Tektronix_5_Series_MSO.py +893 -0
- atomize_py-0.0.2/atomize/device_modules/Termodat_11M6.py +497 -0
- atomize_py-0.0.2/atomize/device_modules/Termodat_13KX3.py +432 -0
- atomize_py-0.0.2/atomize/device_modules/__init__.py +0 -0
- atomize_py-0.0.2/atomize/device_modules/config/L502_regs.py +40 -0
- atomize_py-0.0.2/atomize/device_modules/config/__init__.py +0 -0
- atomize_py-0.0.2/atomize/device_modules/config/config_utils.py +134 -0
- atomize_py-0.0.2/atomize/general_modules/__init__.py +1 -0
- atomize_py-0.0.2/atomize/general_modules/csv_opener_saver.py +285 -0
- atomize_py-0.0.2/atomize/general_modules/csv_opener_saver_tk_kinter.py +260 -0
- atomize_py-0.0.2/atomize/general_modules/general_functions.py +262 -0
- atomize_py-0.0.2/atomize/general_modules/returned_thread.py +30 -0
- atomize_py-0.0.2/atomize/general_modules/spinapi.py +218 -0
- atomize_py-0.0.2/atomize/math_modules/__init__.py +0 -0
- atomize_py-0.0.2/atomize/math_modules/fft.py +102 -0
- atomize_py-0.0.2/atomize/math_modules/least_square_fitting_modules.py +31 -0
- atomize_py-0.0.2/atomize_py.egg-info/PKG-INFO +298 -0
- atomize_py-0.0.2/atomize_py.egg-info/SOURCES.txt +81 -0
- atomize_py-0.0.2/atomize_py.egg-info/dependency_links.txt +1 -0
- atomize_py-0.0.2/atomize_py.egg-info/requires.txt +17 -0
- atomize_py-0.0.2/atomize_py.egg-info/top_level.txt +1 -0
- atomize_py-0.0.2/license.md +21 -0
- atomize_py-0.0.2/pyproject.toml +42 -0
- atomize_py-0.0.2/readme.md +258 -0
- atomize_py-0.0.2/setup.cfg +4 -0
- atomize_py-0.0.2/setup.py +29 -0
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: atomize-py
|
|
3
|
+
Version: 0.0.2
|
|
4
|
+
Summary: A modular software for working with scientific devices and combining them into unified multifunctional setup
|
|
5
|
+
Home-page: https://github.com/Anatoly1010/Atomize
|
|
6
|
+
Author: Atomize Developers
|
|
7
|
+
Author-email: anatoly.melnikov@tomo.nsc.ru
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
Project-URL: Homepage, https://github.com/Anatoly1010/Atomize
|
|
10
|
+
Project-URL: Issues, https://github.com/Anatoly1010/Atomize/issues
|
|
11
|
+
Project-URL: Documentation, https://github.com/Anatoly1010/Atomize/tree/master/atomize/documentation
|
|
12
|
+
Keywords: automation,measurement,instrument control,experimental script,graph,scientific instruments,industrial instruments
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Operating System :: MacOS
|
|
16
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
17
|
+
Classifier: Operating System :: POSIX
|
|
18
|
+
Classifier: Operating System :: Unix
|
|
19
|
+
Classifier: Topic :: Scientific/Engineering
|
|
20
|
+
Requires-Python: >=3.9
|
|
21
|
+
Description-Content-Type: text/markdown
|
|
22
|
+
License-File: license.md
|
|
23
|
+
Requires-Dist: numpy>=1.25
|
|
24
|
+
Requires-Dist: pyvisa>=1.11
|
|
25
|
+
Requires-Dist: pyvisa-py>=0.5
|
|
26
|
+
Requires-Dist: pyqtgraph>=0.12
|
|
27
|
+
Requires-Dist: PyQt6>=6.2
|
|
28
|
+
Provides-Extra: serial
|
|
29
|
+
Requires-Dist: pyserial>=3.5; extra == "serial"
|
|
30
|
+
Provides-Extra: modbus
|
|
31
|
+
Requires-Dist: minimalmodbus>=1.0; extra == "modbus"
|
|
32
|
+
Provides-Extra: gui
|
|
33
|
+
Requires-Dist: tkinter>=8.6; extra == "gui"
|
|
34
|
+
Provides-Extra: bots
|
|
35
|
+
Requires-Dist: pyTelegramBotAPI>=4.15; extra == "bots"
|
|
36
|
+
Dynamic: author-email
|
|
37
|
+
Dynamic: home-page
|
|
38
|
+
Dynamic: license-file
|
|
39
|
+
Dynamic: requires-python
|
|
40
|
+
|
|
41
|
+
# Atomize - Split your spectrometer apart!
|
|
42
|
+
<br/>
|
|
43
|
+
A modular open source software for working with scientific devices and combining them into spectrometer.<br/>
|
|
44
|
+
The general idea is close to [FSC2 software](http://users.physik.fu-berlin.de/~jtt/fsc2.phtml) developed by Jens Thomas Törring.<br/>
|
|
45
|
+
Remote control of spectrometers is usually carried out using home-written programs, which are often restricted to doing a certain experiment with a specific set of devices. In contrast, the programs like [FSC2](http://users.physik.fu-berlin.de/~jtt/fsc2.phtml) and [Atomize](https://github.com/Anatoly1010/Atomize) are much more flexible, since they are based on a modular approach for communication with device and scripting language (EDL in FSC2; Python in Atomize) for data measuring.
|
|
46
|
+
|
|
47
|
+
Atomize uses [liveplot library](https://github.com/PhilReinhold/liveplot) based on pyqtgraph as a main graphics library. [Liveplot](https://github.com/PhilReinhold/liveplot) was originally developed by Phil Reinhold. Since several minor improvements have been made to use it in Atomize.
|
|
48
|
+
|
|
49
|
+
[Python Programming Language](https://www.python.org/) is used inside experimental scripts, which opens up almost unlimited possibilities for raw experimental data treatment. In addition, with PyQt, one can create experimental scripts with a simple graphical interface, allowing users not familiar with Python to use it. Several examples of scripts (with dummy data) are provided in /atomize/tests/ directory, including a GUI script with extended comments inside. Also a variant of the Atomize with GUI Control Window extension can be found [here.](https://github.com/Anatoly1010/Atomize_NIOCH)<br/>
|
|
50
|
+
|
|
51
|
+
Currently there are more than 200 device specific and general functions available for over 27 different devices, including 6 series of devices. If you would like to write a module for the device that is not currently available, please, read this short [instruction.](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/writing_modules.md)
|
|
52
|
+
|
|
53
|
+
Detailed documentation can be found [here.](https://github.com/Anatoly1010/Atomize/tree/master/atomize/documentation)
|
|
54
|
+
|
|
55
|
+
## Status
|
|
56
|
+
|
|
57
|
+
At the moment, Atomize has been tested and is currently used for controlling several EPR spectrometers using a broad range of different devices. Examples of experimental scripts for standard pulsed EPR methods can be found in /atomize/tests/pulse_epr directory. The program has been tested on Ubuntu 18.04 LTS, 20.04 LTS, and 22.04 LTS.
|
|
58
|
+
|
|
59
|
+
## Contents
|
|
60
|
+
- [Requirements](#requirements)<br/>
|
|
61
|
+
- [Basic usage](#basic-usage)<br/>
|
|
62
|
+
- [Available devices](#available-devices)<br/>
|
|
63
|
+
- [Temperature Controllers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/temperature_controller_functions.md)<br/>
|
|
64
|
+
- [Lock-in Amplifiers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/lock_in_amplifier_functions.md)<br/>
|
|
65
|
+
- [Oscilloscopes](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/oscilloscope_functions.md)<br/>
|
|
66
|
+
- [Digitizers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/digitizer_functions.md)<br/>
|
|
67
|
+
- [Oscilloscope Wave Generators](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/oscilloscope_wave_generator_functions.md)<br/>
|
|
68
|
+
- [Arbitrary Wave Generators](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/awg_functions.md)<br/>
|
|
69
|
+
- [Pulse Programmers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/pulse_programmers_functions.md)<br/>
|
|
70
|
+
- [Frequency Counters](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/frequency_counter_functions.md)<br/>
|
|
71
|
+
- [Magnetic Field Controllers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/magnet_functions.md)<br/>
|
|
72
|
+
- [Microwave Bridge Controllers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/microwave_bridge_functions.md)<br/>
|
|
73
|
+
- [Gaussmeters](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/gaussmeter_functions.md)<br/>
|
|
74
|
+
- [Power Supplies](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/power_supply_functions.md)<br/>
|
|
75
|
+
- [Magnet Power Supplies](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/magnet_power_supply_functions.md)<br/>
|
|
76
|
+
- [Delay Generators](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/delay_generator_functions.md)<br/>
|
|
77
|
+
- [Moisture Meters](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/moisture_meter_functions.md)<br/>
|
|
78
|
+
- [Balances](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/other_device_functions.md)<br/>
|
|
79
|
+
- [Other](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/other_device_functions.md)<br/>
|
|
80
|
+
- [Function for devices](#available-function-for-devices)<br/>
|
|
81
|
+
- [General functions](#available-general-functions)<br/>
|
|
82
|
+
- [Plotting functions](#available-plotting-functions)<br/>
|
|
83
|
+
- [Experimental script examples](https://github.com/Anatoly1010/Atomize/tree/master/atomize/tests)<br/>
|
|
84
|
+
- [Screenshots](#screenshots)<br/>
|
|
85
|
+
- [Writing modules](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/writing_modules.md)<br/>
|
|
86
|
+
- [Protocol settings](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/protocol_settings.md)<br/>
|
|
87
|
+
|
|
88
|
+
## Requirements
|
|
89
|
+
- [Python (3.8+)](https://www.python.org/)
|
|
90
|
+
- [Numpy](https://numpy.org/)
|
|
91
|
+
- [PyQt6; 6.1.0+](http://www.riverbankcomputing.com/software/pyqt/download)
|
|
92
|
+
- [pyqtgraph 0.12.2](http://www.pyqtgraph.org)
|
|
93
|
+
- [PyVisa](https://pyvisa.readthedocs.io/en/latest/)
|
|
94
|
+
- [PyVisa-py](https://github.com/pyvisa/pyvisa-py)<br/>
|
|
95
|
+
Optional:
|
|
96
|
+
- [PySerial;](https://pypi.org/project/pyserial/) for serial instruments
|
|
97
|
+
- [Minimalmodbus;](https://minimalmodbus.readthedocs.io/en/stable/index.html) for Modbus instruments
|
|
98
|
+
- [GPIB driver;](https://linux-gpib.sourceforge.io/) for GPIB devices
|
|
99
|
+
- [Telegram bot API;](https://github.com/eternnoir/pyTelegramBotAPI) for Telegram bot messages
|
|
100
|
+
- [SpinAPI;](http://www.spincore.com/support/spinapi/) for Pulse Blaster ESR 500 Pro
|
|
101
|
+
- [Spcm driver;](https://spectrum-instrumentation.com/en/m4i4450-x8) for Spectrum M4I 6631 X8; M4I 4450 X8
|
|
102
|
+
|
|
103
|
+
## Basic usage
|
|
104
|
+
|
|
105
|
+
1. Atomize
|
|
106
|
+
|
|
107
|
+
Install from the source directory:
|
|
108
|
+
|
|
109
|
+
pip3 install -e .
|
|
110
|
+
|
|
111
|
+
run from the source directory:
|
|
112
|
+
|
|
113
|
+
python3 atomize
|
|
114
|
+
|
|
115
|
+
or using bash option to open specified script:
|
|
116
|
+
|
|
117
|
+
python3 atomize /path/to/experimental/script
|
|
118
|
+
|
|
119
|
+
To communicate with Liveplot inside a script the general function module should be imported.
|
|
120
|
+
```python
|
|
121
|
+
import atomize.general_modules.general_functions as general
|
|
122
|
+
general.plot_1d(arguments)
|
|
123
|
+
```
|
|
124
|
+
The text editor used for editing can be specified in atomize/config.ini. The Telegram bot token and message chat ID can be specified in the same file.
|
|
125
|
+
|
|
126
|
+
2. Setting up general configuration data
|
|
127
|
+
|
|
128
|
+
The /atomize directory contains a general configuration file with the name config.ini. It should be changed at will according to the description below:
|
|
129
|
+
```python
|
|
130
|
+
[DEFAULT]
|
|
131
|
+
# configure the text editor that will opened when Edit is pressed:
|
|
132
|
+
editor = subl # Linux
|
|
133
|
+
editorW = /path/to/text_editor/on/Windows/ # Windows
|
|
134
|
+
# configure the directory that will opened when Open 1D Data or Open 2D Data
|
|
135
|
+
# feature is used in Liveplot:
|
|
136
|
+
open_dir = /path/to/experimental/data/to/open/
|
|
137
|
+
# configure the directory that will be opened when Open Script is pressed:
|
|
138
|
+
script_dir = /Atomize/atomize/tests
|
|
139
|
+
# configure Telegram bot
|
|
140
|
+
telegram_bot_token =
|
|
141
|
+
message_id =
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
3. Using device modules
|
|
145
|
+
|
|
146
|
+
To communicate with a device one should:
|
|
147
|
+
1) modify the config file (/atomize/device_modules/config/) of the desired device accordingly. Choose the desired protocol (rs-232, gpib, ethernet, etc.) and correct the settings of the specified protocol in accordance with device settings. A little bit more detailed information about protocol settings can be found [here.](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/protocol_settings.md)
|
|
148
|
+
2) import the module or modules in your script and initialize the appropriate class. A class always
|
|
149
|
+
has the same name as the module file. Initialization connect the desired device, if the settings are correct.
|
|
150
|
+
```python
|
|
151
|
+
import atomize.device_modules.Keysight_3000_Xseries as keys
|
|
152
|
+
import atomize.device_modules.Lakeshore331 as tc
|
|
153
|
+
dsox3034t = keys.Keysight_3000_Xseries()
|
|
154
|
+
lakeshore331 = tc.Lakeshore331()
|
|
155
|
+
name_oscilloscope = dsox3034t.oscilloscope_name()
|
|
156
|
+
temperature = lakeshore331.tc_temperature('CH A')
|
|
157
|
+
```
|
|
158
|
+
The same idea is valid for plotting and file handling modules. The description of available
|
|
159
|
+
functions is given below.
|
|
160
|
+
```python
|
|
161
|
+
import atomize.general_modules.general_functions as general
|
|
162
|
+
import atomize.general_modules.csv_opener_saver_tk_kinter as openfile
|
|
163
|
+
file_handler = openfile.Saver_Opener()
|
|
164
|
+
head, data = file_handler.open_1D_dialog(header = 0)
|
|
165
|
+
general.plot_1d('1D Plot', data[0], data[1], label = 'test_data', yname = 'Y axis', yscale = 'V')
|
|
166
|
+
```
|
|
167
|
+
4. Experimental scripts
|
|
168
|
+
|
|
169
|
+
Python is used to write an experimental script. Examples (with dummy data) can be found in
|
|
170
|
+
/atomize/tests/ directory.
|
|
171
|
+
|
|
172
|
+
## Available devices
|
|
173
|
+
#### [Temperature Controllers](#temperature-controllers-1)
|
|
174
|
+
- Lakeshore (GPIB, RS-232)
|
|
175
|
+
325; 331; 332; 335; 336; 340; Tested 01/2021
|
|
176
|
+
- Oxford Instruments (RS-232)
|
|
177
|
+
ITC 503; Tested 01/2021
|
|
178
|
+
- Termodat (RS-485)
|
|
179
|
+
11M6; 13KX3; Tested 04/2021
|
|
180
|
+
- Stanford Research (TCP/IP Socket)
|
|
181
|
+
PTC10; Tested 07/2021
|
|
182
|
+
- Scientific Instruments (TCP/IP Socket, RS-232)
|
|
183
|
+
SCM10 Temperature Monitor; 07/2022
|
|
184
|
+
|
|
185
|
+
#### [Lock-in Amplifiers](#lock-in-amplifiers-1)
|
|
186
|
+
- Stanford Research Lock-In Amplifier (GPIB, RS-232)
|
|
187
|
+
SR-810; SR-830; SR-850; Tested 02/2021
|
|
188
|
+
- Stanford Research Lock-In Amplifier (GPIB, RS-232, Ethernet)
|
|
189
|
+
SR-860; SR-865a; Tested 01/2021
|
|
190
|
+
|
|
191
|
+
#### [Oscilloscopes](#oscilloscopes-1)
|
|
192
|
+
- Keysight InfiniiVision 2000 X-Series (Ethernet); Untested
|
|
193
|
+
- Keysight InfiniiVision 3000 X-Series (Ethernet); Tested 06/2021
|
|
194
|
+
- Keysight InfiniiVision 4000 X-Series (Ethernet); Untested
|
|
195
|
+
- Tektronix 3000 Series (Ethernet); Tested 09/2022
|
|
196
|
+
- Tektronix 4000 Series (Ethernet); Tested 01/2021
|
|
197
|
+
- Tektronix 5 Series MSO (Ethernet); Tested 12/2023
|
|
198
|
+
|
|
199
|
+
#### [Digitizers](#digitizers-1)
|
|
200
|
+
- Spectrum M4I 4450 X8; Tested 08/2021
|
|
201
|
+
- Spectrum M4I 2211 X8; Tested 01/2021
|
|
202
|
+
The original [library](https://spectrum-instrumentation.com/en/m4i4450-x8) was written by Spectrum.
|
|
203
|
+
- [Insys FM214x3GDA](https://www.insys.ru/mezzanine/fm214x3gda) as ADC; Tested 03/2025
|
|
204
|
+
The device is available via ctypes. The original library can be found [here](https://github.com/Anatoly1010/Atomize_ITC/tree/master/libs).
|
|
205
|
+
|
|
206
|
+
#### [Oscilloscope Wave Generators](#oscilloscope-wave-generators-1)
|
|
207
|
+
- Wave Generator of Keysight InfiniiVision 2000 X-Series (Ethernet)
|
|
208
|
+
Available via corresponding oscilloscope module.
|
|
209
|
+
- Wave Generator of Keysight InfiniiVision 3000 X-Series (Ethernet)
|
|
210
|
+
Available via corresponding oscilloscope module.
|
|
211
|
+
- Wave Generator of Keysight InfiniiVision 4000 X-Series (Ethernet)
|
|
212
|
+
Available via corresponding oscilloscope module.
|
|
213
|
+
|
|
214
|
+
#### [Arbitrary Wave Generators](#arbitrary-wave-generators-1)
|
|
215
|
+
- Spectrum M4I 6631 X8; Tested 07/2021
|
|
216
|
+
The original [library](https://spectrum-instrumentation.com/en/m4i6631-x8) was written by Spectrum.
|
|
217
|
+
- [Insys FM214x3GDA](https://www.insys.ru/mezzanine/fm214x3gda) as DAC; Tested 03/2025
|
|
218
|
+
The device is available via ctypes. The original library can be found [here](https://github.com/Anatoly1010/Atomize_ITC/tree/master/libs).
|
|
219
|
+
|
|
220
|
+
#### [Pulse Programmers](#pulse-programmers-1)
|
|
221
|
+
- Pulse Blaster ESR 500 Pro; Tested 06/2021
|
|
222
|
+
The device is available via ctypes. The original [C library](http://www.spincore.com/support/spinapi/using_spin_api_pb.shtml) was written by SpinCore Technologies.
|
|
223
|
+
- Pulse Programmer Micran based on [Insys FMC126P](https://www.insys.ru/fmc/fmc126p); Tested 12/2023
|
|
224
|
+
- [Insys FM214x3GDA](https://www.insys.ru/mezzanine/fm214x3gda) as multichannel TTL pulse generator; Tested 03/2025
|
|
225
|
+
The Insys device is available via ctypes. The original library can be found [here](https://github.com/Anatoly1010/Atomize_ITC/tree/master/libs).
|
|
226
|
+
|
|
227
|
+
#### [Frequency Counters](#frequency-counters-1)
|
|
228
|
+
- Agilent Frequency Counter (GPIB, RS-232)
|
|
229
|
+
53181A; 53131A/132A; Tested 02/2021
|
|
230
|
+
5343A; GPIB, Tested 02/2023
|
|
231
|
+
- Keysight Frequency Counter (GPIB, RS-232, Ethernet)
|
|
232
|
+
53230A/220A; Untested
|
|
233
|
+
|
|
234
|
+
#### [Magnetic Field Controllers](#magnetic-field-controllers-1)
|
|
235
|
+
- Bruker BH15 (GPIB); Tested 01/2021
|
|
236
|
+
- Bruker ER032M (GPIB); Available via BH15 module
|
|
237
|
+
- Bruker ER031M (RS-232 using arduino emulated keyboard); Tested 01/2021
|
|
238
|
+
- [Homemade](https://patents.google.com/patent/RU2799103C1/en?oq=RU2799103C1) magnetic field controller (RS-232); Tested 04/2023
|
|
239
|
+
|
|
240
|
+
#### [Microwave Bridge Controllers](#microwave-bridge-controllers-1)
|
|
241
|
+
- Micran X-band MW Bridge (TCP/IP Socket); Tested 06/2021
|
|
242
|
+
- Micran X-band MW Bridge v2 (TCP/IP Socket); Tested 12/2022
|
|
243
|
+
- Micran Q-band MW Bridge; Tested 12/2023
|
|
244
|
+
|
|
245
|
+
#### [Gaussmeters](#gaussmeters-1)
|
|
246
|
+
- Lakeshore 455 DSP (RS-232); Tested 01/2021
|
|
247
|
+
- NMR Gaussmeter Sibir 1 (UDP/IP Socket); Tested 04/2024
|
|
248
|
+
|
|
249
|
+
#### [Power Supplies](#power-supplies-1)
|
|
250
|
+
- Rigol DP800 Series (RS-232, Ethernet); Tested 01/2021
|
|
251
|
+
- Stanford Research DC205 (RS-232); Untested
|
|
252
|
+
- Stanford Research PS300 High Voltage Series (RS-232, GPIB); Untested
|
|
253
|
+
|
|
254
|
+
#### [Magnet Power Supplies](#magnet-power-supplies-1)
|
|
255
|
+
- Cryomagnetics 4G (Ethernet); Tested 11/2023
|
|
256
|
+
|
|
257
|
+
#### [Delay Generators](#delay-generators-1)
|
|
258
|
+
- Stanford Research DG535 (GPIB); Untested
|
|
259
|
+
|
|
260
|
+
#### [Moisture Meters](#moisture-meters-1)
|
|
261
|
+
- IVG-1/1 (RS-485); Tested 02/2023
|
|
262
|
+
|
|
263
|
+
#### [Balance](#balances-1)
|
|
264
|
+
- CPWplus 150 (RS-232); Tested 01/2021
|
|
265
|
+
|
|
266
|
+
#### [Other](#other-1)
|
|
267
|
+
- RODOS-10N Solid-State Relay (Ethernet); Tested 01/2021
|
|
268
|
+
- Owen-MK110-220.4DN.4R Discrete IO Module (RS-485); Tested 04/2021
|
|
269
|
+
- Cryomagnetics LM-510 Liquid Cryogen Monitor (TCP/IP Socket); Tested 07/2022
|
|
270
|
+
- Cryomech CPA2896, CPA1110 Digital Panels (RS-485); Tested 07/2022
|
|
271
|
+
|
|
272
|
+
## [Available general functions](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/general_functions.md)
|
|
273
|
+
|
|
274
|
+
## [Available plotting functions](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/plotting_functions.md)
|
|
275
|
+
|
|
276
|
+
## Available functions for devices
|
|
277
|
+
### [Temperature controllers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/temperature_controller_functions.md)
|
|
278
|
+
### [Oscilloscopes](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/oscilloscope_functions.md)
|
|
279
|
+
### [Digitizers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/digitizer_functions.md)
|
|
280
|
+
### [Oscilloscope wave generators](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/oscilloscope_wave_generator_functions.md)
|
|
281
|
+
### [Arbitrary wave generators](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/awg_functions.md)
|
|
282
|
+
### [Pulse programmers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/pulse_programmers_functions.md)
|
|
283
|
+
### [Lock-in amplifiers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/lock_in_amplifier_functions.md)
|
|
284
|
+
### [Frequency counters](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/frequency_counter_functions.md)
|
|
285
|
+
### [Magnetic field controllers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/magnet_functions.md)
|
|
286
|
+
### [Microwave bridge controllers](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/microwave_bridge_functions.md)
|
|
287
|
+
### [Gaussmeters](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/gaussmeter_functions.md)
|
|
288
|
+
### [Power supplies](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/power_supply_functions.md)
|
|
289
|
+
### [Magnet power supplies](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/magnet_power_supply_functions.md)
|
|
290
|
+
### [Delay generators](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/delay_generator_functions.md)
|
|
291
|
+
### [Moisture meters](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/moisture_meter_functions.md)
|
|
292
|
+
### [Balance](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/other_device_functions.md)
|
|
293
|
+
### [Other](https://github.com/Anatoly1010/Atomize/blob/master/atomize/documentation/other_device_functions.md)
|
|
294
|
+
|
|
295
|
+
## Screenshots
|
|
296
|
+

|
|
297
|
+

|
|
298
|
+

|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from atomize.main.client import LivePlotClient
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
|
|
4
|
+
# a nice numeration of the line number for QPlainTextEdit
|
|
5
|
+
# mainly from https://gist.github.com/eyllanesc/e614ea9689e025c16b10fc92b68f0afd
|
|
6
|
+
# with a little bit of appearance changes
|
|
7
|
+
|
|
8
|
+
from PyQt6 import QtGui
|
|
9
|
+
from PyQt6.QtCore import QRect, pyqtSlot, Qt, QSize
|
|
10
|
+
from PyQt6.QtGui import QColor, QTextFormat, QPainter, QFont
|
|
11
|
+
from PyQt6.QtWidgets import QWidget, QPlainTextEdit, QApplication, QTextEdit
|
|
12
|
+
|
|
13
|
+
class LineNumberArea(QWidget):
|
|
14
|
+
def __init__(self, editor):
|
|
15
|
+
QWidget.__init__(self, parent = editor)
|
|
16
|
+
self.codeEditor = editor
|
|
17
|
+
|
|
18
|
+
def sizeHint(self):
|
|
19
|
+
return QSize(self.codeEditor.lineNumberAreaWidth(), 0)
|
|
20
|
+
|
|
21
|
+
def paintEvent(self, event):
|
|
22
|
+
self.codeEditor.lineNumberAreaPaintEvent(event)
|
|
23
|
+
|
|
24
|
+
class CodeEditor(QPlainTextEdit):
|
|
25
|
+
|
|
26
|
+
def __init__(self, parent=None):
|
|
27
|
+
QPlainTextEdit.__init__(self, parent)
|
|
28
|
+
|
|
29
|
+
self.top_margin = 0
|
|
30
|
+
self.setTabStopDistance(30) # set the tab width
|
|
31
|
+
self.lineNumberArea = LineNumberArea(self)
|
|
32
|
+
self.blockCountChanged.connect(self.updateLineNumberAreaWidth)
|
|
33
|
+
self.updateRequest.connect(self.updateLineNumberArea)
|
|
34
|
+
self.cursorPositionChanged.connect(self.highlightCurrentLine)
|
|
35
|
+
self.updateLineNumberAreaWidth(0)
|
|
36
|
+
self.highlightCurrentLine()
|
|
37
|
+
|
|
38
|
+
def lineNumberAreaPaintEvent(self, event):
|
|
39
|
+
painter = QPainter(self.lineNumberArea)
|
|
40
|
+
painter.fillRect(event.rect(), QColor(63, 63, 97)) # color of the line column
|
|
41
|
+
|
|
42
|
+
block = self.firstVisibleBlock()
|
|
43
|
+
blockNumber = block.blockNumber();
|
|
44
|
+
top = self.blockBoundingGeometry(block).translated(self.contentOffset()).top()
|
|
45
|
+
bottom = top + self.blockBoundingRect(block).height()
|
|
46
|
+
|
|
47
|
+
while block.isValid() and top <= event.rect().bottom():
|
|
48
|
+
if block.isVisible() and bottom >= event.rect().top():
|
|
49
|
+
number = str(blockNumber + 1)
|
|
50
|
+
painter.setPen(QColor(192, 202, 227))
|
|
51
|
+
painter.setFont(QtGui.QFont("Ubuntu", 9, QtGui.QFont.Weight.Bold))
|
|
52
|
+
painter.drawText(-4, int(top + 1), self.lineNumberArea.width(),
|
|
53
|
+
self.fontMetrics().height(),
|
|
54
|
+
Qt.AlignmentFlag.AlignRight, number)
|
|
55
|
+
block = block.next()
|
|
56
|
+
top = bottom
|
|
57
|
+
bottom = top + self.blockBoundingRect(block).height() + 0.1
|
|
58
|
+
blockNumber += 1
|
|
59
|
+
|
|
60
|
+
def lineNumberAreaWidth(self):
|
|
61
|
+
digits = len(str(self.blockCount()))
|
|
62
|
+
space = 8 + self.fontMetrics().horizontalAdvance('9')*digits
|
|
63
|
+
return space
|
|
64
|
+
|
|
65
|
+
def resizeEvent(self, event):
|
|
66
|
+
QPlainTextEdit.resizeEvent(self, event)
|
|
67
|
+
cr = self.contentsRect()
|
|
68
|
+
self.lineNumberArea.setGeometry(QRect(cr.left(), cr.top(), self.lineNumberAreaWidth(), cr.height()))
|
|
69
|
+
|
|
70
|
+
@pyqtSlot(int)
|
|
71
|
+
def updateLineNumberAreaWidth(self, newBlockCount):
|
|
72
|
+
self.setViewportMargins(self.lineNumberAreaWidth() + 2, self.top_margin, 0, 0);
|
|
73
|
+
|
|
74
|
+
@pyqtSlot()
|
|
75
|
+
def highlightCurrentLine(self):
|
|
76
|
+
extraSelections = []
|
|
77
|
+
if not self.isReadOnly():
|
|
78
|
+
selection = QTextEdit.ExtraSelection()
|
|
79
|
+
lineColor = QColor(48, 48, 75) #color of the line highlighter QColor(136, 138, 133)
|
|
80
|
+
selection.format.setBackground(lineColor)
|
|
81
|
+
selection.format.setProperty( 24576, True)
|
|
82
|
+
selection.cursor = self.textCursor()
|
|
83
|
+
selection.cursor.clearSelection()
|
|
84
|
+
extraSelections.append(selection)
|
|
85
|
+
self.setExtraSelections(extraSelections)
|
|
86
|
+
|
|
87
|
+
@pyqtSlot(QRect, int)
|
|
88
|
+
def updateLineNumberArea(self, rect, dy):
|
|
89
|
+
if dy:
|
|
90
|
+
self.lineNumberArea.scroll(0, dy)
|
|
91
|
+
else:
|
|
92
|
+
self.lineNumberArea.update(0, rect.y(), self.lineNumberArea.width(), rect.height())
|
|
93
|
+
if rect.contains(self.viewport().rect()):
|
|
94
|
+
self.updateLineNumberAreaWidth(0)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
if __name__ == '__main__':
|
|
98
|
+
import sys
|
|
99
|
+
|
|
100
|
+
app = QApplication(sys.argv)
|
|
101
|
+
w = CodeEditor()
|
|
102
|
+
w.show()
|
|
103
|
+
sys.exit(app.exec_())
|