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.
Files changed (83) hide show
  1. atomize_py-0.0.2/PKG-INFO +298 -0
  2. atomize_py-0.0.2/atomize/__init__.py +1 -0
  3. atomize_py-0.0.2/atomize/__main__.py +2 -0
  4. atomize_py-0.0.2/atomize/codeeditor.py +103 -0
  5. atomize_py-0.0.2/atomize/device_modules/Agilent_53131a.py +546 -0
  6. atomize_py-0.0.2/atomize/device_modules/Agilent_53181a.py +527 -0
  7. atomize_py-0.0.2/atomize/device_modules/Agilent_5343a.py +214 -0
  8. atomize_py-0.0.2/atomize/device_modules/BH_15.py +953 -0
  9. atomize_py-0.0.2/atomize/device_modules/CPWplus_150.py +115 -0
  10. atomize_py-0.0.2/atomize/device_modules/Cryomagnetics_4G.py +604 -0
  11. atomize_py-0.0.2/atomize/device_modules/Cryomagnetics_LM510.py +489 -0
  12. atomize_py-0.0.2/atomize/device_modules/Cryomech_CPA1110.py +226 -0
  13. atomize_py-0.0.2/atomize/device_modules/ECC_15K.py +229 -0
  14. atomize_py-0.0.2/atomize/device_modules/ER_031M.py +152 -0
  15. atomize_py-0.0.2/atomize/device_modules/ITC_503.py +416 -0
  16. atomize_py-0.0.2/atomize/device_modules/ITC_FC.py +220 -0
  17. atomize_py-0.0.2/atomize/device_modules/IVG_1_1.py +111 -0
  18. atomize_py-0.0.2/atomize/device_modules/Insys_FPGA.py +5853 -0
  19. atomize_py-0.0.2/atomize/device_modules/Keysight_2000_Xseries.py +1141 -0
  20. atomize_py-0.0.2/atomize/device_modules/Keysight_3000_Xseries.py +1237 -0
  21. atomize_py-0.0.2/atomize/device_modules/Keysight_4000_Xseries.py +1291 -0
  22. atomize_py-0.0.2/atomize/device_modules/Keysight_53230a.py +478 -0
  23. atomize_py-0.0.2/atomize/device_modules/L_card_L502.py +544 -0
  24. atomize_py-0.0.2/atomize/device_modules/Lakeshore_325.py +367 -0
  25. atomize_py-0.0.2/atomize/device_modules/Lakeshore_331.py +369 -0
  26. atomize_py-0.0.2/atomize/device_modules/Lakeshore_332.py +367 -0
  27. atomize_py-0.0.2/atomize/device_modules/Lakeshore_335.py +378 -0
  28. atomize_py-0.0.2/atomize/device_modules/Lakeshore_336.py +381 -0
  29. atomize_py-0.0.2/atomize/device_modules/Lakeshore_340.py +378 -0
  30. atomize_py-0.0.2/atomize/device_modules/Lakeshore_455_DSP.py +178 -0
  31. atomize_py-0.0.2/atomize/device_modules/Metrolab_PT2025.py +149 -0
  32. atomize_py-0.0.2/atomize/device_modules/Micran_Q_band_MW_bridge.py +583 -0
  33. atomize_py-0.0.2/atomize/device_modules/Micran_X_band_MW_bridge.py +402 -0
  34. atomize_py-0.0.2/atomize/device_modules/Micran_X_band_MW_bridge_v2.py +535 -0
  35. atomize_py-0.0.2/atomize/device_modules/Owen_MK110_220_4DN_4R.py +185 -0
  36. atomize_py-0.0.2/atomize/device_modules/PB_ESR_500_pro.py +3001 -0
  37. atomize_py-0.0.2/atomize/device_modules/PB_Micran.py +3489 -0
  38. atomize_py-0.0.2/atomize/device_modules/Planar_C2220.py +452 -0
  39. atomize_py-0.0.2/atomize/device_modules/Rigol_DP800_Series.py +530 -0
  40. atomize_py-0.0.2/atomize/device_modules/Rodos_10N.py +45 -0
  41. atomize_py-0.0.2/atomize/device_modules/SR_810.py +567 -0
  42. atomize_py-0.0.2/atomize/device_modules/SR_830.py +567 -0
  43. atomize_py-0.0.2/atomize/device_modules/SR_844.py +547 -0
  44. atomize_py-0.0.2/atomize/device_modules/SR_850.py +567 -0
  45. atomize_py-0.0.2/atomize/device_modules/SR_860.py +605 -0
  46. atomize_py-0.0.2/atomize/device_modules/SR_865a.py +603 -0
  47. atomize_py-0.0.2/atomize/device_modules/SR_DC205.py +333 -0
  48. atomize_py-0.0.2/atomize/device_modules/SR_DG535.py +411 -0
  49. atomize_py-0.0.2/atomize/device_modules/SR_PS300_Series.py +452 -0
  50. atomize_py-0.0.2/atomize/device_modules/SR_PTC_10.py +185 -0
  51. atomize_py-0.0.2/atomize/device_modules/Scientific_Instruments_SCM10.py +164 -0
  52. atomize_py-0.0.2/atomize/device_modules/Sibir_1.py +866 -0
  53. atomize_py-0.0.2/atomize/device_modules/Spectrum_M4I_2211_X8.py +1512 -0
  54. atomize_py-0.0.2/atomize/device_modules/Spectrum_M4I_4450_X8.py +1704 -0
  55. atomize_py-0.0.2/atomize/device_modules/Spectrum_M4I_6631_X8.py +4517 -0
  56. atomize_py-0.0.2/atomize/device_modules/Tektronix_3000_Series.py +877 -0
  57. atomize_py-0.0.2/atomize/device_modules/Tektronix_4000_Series.py +891 -0
  58. atomize_py-0.0.2/atomize/device_modules/Tektronix_5_Series_MSO.py +893 -0
  59. atomize_py-0.0.2/atomize/device_modules/Termodat_11M6.py +497 -0
  60. atomize_py-0.0.2/atomize/device_modules/Termodat_13KX3.py +432 -0
  61. atomize_py-0.0.2/atomize/device_modules/__init__.py +0 -0
  62. atomize_py-0.0.2/atomize/device_modules/config/L502_regs.py +40 -0
  63. atomize_py-0.0.2/atomize/device_modules/config/__init__.py +0 -0
  64. atomize_py-0.0.2/atomize/device_modules/config/config_utils.py +134 -0
  65. atomize_py-0.0.2/atomize/general_modules/__init__.py +1 -0
  66. atomize_py-0.0.2/atomize/general_modules/csv_opener_saver.py +285 -0
  67. atomize_py-0.0.2/atomize/general_modules/csv_opener_saver_tk_kinter.py +260 -0
  68. atomize_py-0.0.2/atomize/general_modules/general_functions.py +262 -0
  69. atomize_py-0.0.2/atomize/general_modules/returned_thread.py +30 -0
  70. atomize_py-0.0.2/atomize/general_modules/spinapi.py +218 -0
  71. atomize_py-0.0.2/atomize/math_modules/__init__.py +0 -0
  72. atomize_py-0.0.2/atomize/math_modules/fft.py +102 -0
  73. atomize_py-0.0.2/atomize/math_modules/least_square_fitting_modules.py +31 -0
  74. atomize_py-0.0.2/atomize_py.egg-info/PKG-INFO +298 -0
  75. atomize_py-0.0.2/atomize_py.egg-info/SOURCES.txt +81 -0
  76. atomize_py-0.0.2/atomize_py.egg-info/dependency_links.txt +1 -0
  77. atomize_py-0.0.2/atomize_py.egg-info/requires.txt +17 -0
  78. atomize_py-0.0.2/atomize_py.egg-info/top_level.txt +1 -0
  79. atomize_py-0.0.2/license.md +21 -0
  80. atomize_py-0.0.2/pyproject.toml +42 -0
  81. atomize_py-0.0.2/readme.md +258 -0
  82. atomize_py-0.0.2/setup.cfg +4 -0
  83. 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
+ ![](https://github.com/Anatoly1010/Atomize/blob/master/screenshots/logoAtomize.png)<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
+ ![](https://github.com/Anatoly1010/Atomize/blob/master/screenshots/screenshot.png)
297
+ ![](https://github.com/Anatoly1010/Atomize/blob/master/screenshots/screenshot2.png)
298
+ ![](https://github.com/Anatoly1010/Atomize/blob/master/screenshots/screenshot3.png)
@@ -0,0 +1 @@
1
+ from atomize.main.client import LivePlotClient
@@ -0,0 +1,2 @@
1
+ from atomize.main.main_window import main
2
+ main()
@@ -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_())