pychemstation 0.4.7.dev1__py3-none-any.whl

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 (109) hide show
  1. ag_hplc_macro/__init__.py +3 -0
  2. ag_hplc_macro/analysis/__init__.py +1 -0
  3. ag_hplc_macro/analysis/base_spectrum.py +509 -0
  4. ag_hplc_macro/analysis/spec_utils.py +304 -0
  5. ag_hplc_macro/analysis/utils.py +63 -0
  6. ag_hplc_macro/control/__init__.py +5 -0
  7. ag_hplc_macro/control/chromatogram.py +128 -0
  8. ag_hplc_macro/control/hplc.py +673 -0
  9. ag_hplc_macro/generated/__init__.py +56 -0
  10. ag_hplc_macro/generated/dad_method.py +367 -0
  11. ag_hplc_macro/generated/pump_method.py +519 -0
  12. ag_hplc_macro/utils/__init__.py +2 -0
  13. ag_hplc_macro/utils/chemstation.py +290 -0
  14. ag_hplc_macro/utils/constants.py +15 -0
  15. ag_hplc_macro/utils/hplc_param_types.py +185 -0
  16. hein-analytical-control/__init__.py +3 -0
  17. hein-analytical-control/analysis/__init__.py +1 -0
  18. hein-analytical-control/analysis/base_spectrum.py +509 -0
  19. hein-analytical-control/analysis/spec_utils.py +304 -0
  20. hein-analytical-control/analysis/utils.py +63 -0
  21. hein-analytical-control/devices/Agilent/__init__.py +3 -0
  22. hein-analytical-control/devices/Agilent/chemstation.py +290 -0
  23. hein-analytical-control/devices/Agilent/chromatogram.py +129 -0
  24. hein-analytical-control/devices/Agilent/hplc.py +436 -0
  25. hein-analytical-control/devices/Agilent/hplc_param_types.py +141 -0
  26. hein-analytical-control/devices/Magritek/Spinsolve/__init__.py +0 -0
  27. hein-analytical-control/devices/Magritek/Spinsolve/commands.py +495 -0
  28. hein-analytical-control/devices/Magritek/Spinsolve/spectrum.py +822 -0
  29. hein-analytical-control/devices/Magritek/Spinsolve/spinsolve.py +425 -0
  30. hein-analytical-control/devices/Magritek/Spinsolve/utils/__init__.py +5 -0
  31. hein-analytical-control/devices/Magritek/Spinsolve/utils/connection.py +168 -0
  32. hein-analytical-control/devices/Magritek/Spinsolve/utils/constants.py +8 -0
  33. hein-analytical-control/devices/Magritek/Spinsolve/utils/exceptions.py +25 -0
  34. hein-analytical-control/devices/Magritek/Spinsolve/utils/parser.py +340 -0
  35. hein-analytical-control/devices/Magritek/Spinsolve/utils/shimming.py +55 -0
  36. hein-analytical-control/devices/Magritek/Spinsolve/utils/spinsolve_logging.py +43 -0
  37. hein-analytical-control/devices/Magritek/__init__.py +0 -0
  38. hein-analytical-control/devices/OceanOptics/IR/NIRQuest512.py +90 -0
  39. hein-analytical-control/devices/OceanOptics/IR/__init__.py +0 -0
  40. hein-analytical-control/devices/OceanOptics/IR/ir_spectrum.py +191 -0
  41. hein-analytical-control/devices/OceanOptics/Raman/__init__.py +0 -0
  42. hein-analytical-control/devices/OceanOptics/Raman/raman_control.py +46 -0
  43. hein-analytical-control/devices/OceanOptics/Raman/raman_spectrum.py +148 -0
  44. hein-analytical-control/devices/OceanOptics/UV/QEPro2192.py +90 -0
  45. hein-analytical-control/devices/OceanOptics/UV/__init__.py +0 -0
  46. hein-analytical-control/devices/OceanOptics/UV/uv_spectrum.py +227 -0
  47. hein-analytical-control/devices/OceanOptics/__init__.py +0 -0
  48. hein-analytical-control/devices/OceanOptics/oceanoptics.py +115 -0
  49. hein-analytical-control/devices/__init__.py +15 -0
  50. hein-analytical-control/generated/__init__.py +56 -0
  51. hein-analytical-control/generated/dad_method.py +367 -0
  52. hein-analytical-control/generated/pump_method.py +519 -0
  53. hein_analytical_control/__init__.py +3 -0
  54. hein_analytical_control/analysis/__init__.py +1 -0
  55. hein_analytical_control/analysis/base_spectrum.py +509 -0
  56. hein_analytical_control/analysis/spec_utils.py +304 -0
  57. hein_analytical_control/analysis/utils.py +63 -0
  58. hein_analytical_control/devices/Agilent/__init__.py +3 -0
  59. hein_analytical_control/devices/Agilent/chemstation.py +290 -0
  60. hein_analytical_control/devices/Agilent/chromatogram.py +129 -0
  61. hein_analytical_control/devices/Agilent/hplc.py +436 -0
  62. hein_analytical_control/devices/Agilent/hplc_param_types.py +141 -0
  63. hein_analytical_control/devices/Magritek/Spinsolve/__init__.py +0 -0
  64. hein_analytical_control/devices/Magritek/Spinsolve/commands.py +495 -0
  65. hein_analytical_control/devices/Magritek/Spinsolve/spectrum.py +822 -0
  66. hein_analytical_control/devices/Magritek/Spinsolve/spinsolve.py +425 -0
  67. hein_analytical_control/devices/Magritek/Spinsolve/utils/__init__.py +5 -0
  68. hein_analytical_control/devices/Magritek/Spinsolve/utils/connection.py +168 -0
  69. hein_analytical_control/devices/Magritek/Spinsolve/utils/constants.py +8 -0
  70. hein_analytical_control/devices/Magritek/Spinsolve/utils/exceptions.py +25 -0
  71. hein_analytical_control/devices/Magritek/Spinsolve/utils/parser.py +340 -0
  72. hein_analytical_control/devices/Magritek/Spinsolve/utils/shimming.py +55 -0
  73. hein_analytical_control/devices/Magritek/Spinsolve/utils/spinsolve_logging.py +43 -0
  74. hein_analytical_control/devices/Magritek/__init__.py +0 -0
  75. hein_analytical_control/devices/OceanOptics/IR/NIRQuest512.py +90 -0
  76. hein_analytical_control/devices/OceanOptics/IR/__init__.py +0 -0
  77. hein_analytical_control/devices/OceanOptics/IR/ir_spectrum.py +191 -0
  78. hein_analytical_control/devices/OceanOptics/Raman/__init__.py +0 -0
  79. hein_analytical_control/devices/OceanOptics/Raman/raman_control.py +46 -0
  80. hein_analytical_control/devices/OceanOptics/Raman/raman_spectrum.py +148 -0
  81. hein_analytical_control/devices/OceanOptics/UV/QEPro2192.py +90 -0
  82. hein_analytical_control/devices/OceanOptics/UV/__init__.py +0 -0
  83. hein_analytical_control/devices/OceanOptics/UV/uv_spectrum.py +227 -0
  84. hein_analytical_control/devices/OceanOptics/__init__.py +0 -0
  85. hein_analytical_control/devices/OceanOptics/oceanoptics.py +115 -0
  86. hein_analytical_control/devices/__init__.py +15 -0
  87. hein_analytical_control/generated/__init__.py +56 -0
  88. hein_analytical_control/generated/dad_method.py +367 -0
  89. hein_analytical_control/generated/pump_method.py +519 -0
  90. pychemstation/__init__.py +3 -0
  91. pychemstation/analysis/__init__.py +1 -0
  92. pychemstation/analysis/base_spectrum.py +509 -0
  93. pychemstation/analysis/spec_utils.py +304 -0
  94. pychemstation/analysis/utils.py +63 -0
  95. pychemstation/control/__init__.py +5 -0
  96. pychemstation/control/chromatogram.py +128 -0
  97. pychemstation/control/hplc.py +673 -0
  98. pychemstation/generated/__init__.py +56 -0
  99. pychemstation/generated/dad_method.py +367 -0
  100. pychemstation/generated/pump_method.py +519 -0
  101. pychemstation/utils/__init__.py +2 -0
  102. pychemstation/utils/chemstation.py +290 -0
  103. pychemstation/utils/constants.py +15 -0
  104. pychemstation/utils/hplc_param_types.py +185 -0
  105. pychemstation-0.4.7.dev1.dist-info/LICENSE +395 -0
  106. pychemstation-0.4.7.dev1.dist-info/METADATA +102 -0
  107. pychemstation-0.4.7.dev1.dist-info/RECORD +109 -0
  108. pychemstation-0.4.7.dev1.dist-info/WHEEL +5 -0
  109. pychemstation-0.4.7.dev1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,115 @@
1
+ """Base module for interfacing with OceanOptics Spectrometers
2
+
3
+ .. moduleauthor:: Artem Leonov, Graham Keenan
4
+ """
5
+ import time
6
+ import logging
7
+ import numpy as np
8
+ import seabreeze
9
+ from seabreeze.pyseabreeze import SeaBreezeDevice
10
+
11
+ seabreeze.use("cseabreeze")
12
+ import seabreeze.spectrometers as sb
13
+
14
+ # Spectrometer Types:
15
+ SPECS = {"UV": "2192", "RAMAN": "QE-PRO", "IR": "NIRQUEST"}
16
+
17
+
18
+ class UnsupportedSpectrometer(Exception):
19
+ """Exception for unsupported spectrometer types"""
20
+
21
+
22
+ class NoSpectrometerDetected(Exception):
23
+ """Exception for when no spectrometer is detected"""
24
+
25
+
26
+ def _get_spectrometer(spec_type: str) -> SeaBreezeDevice:
27
+ """Gets the Spectrometer from Seabreeze that matches given type
28
+
29
+ Arguments:
30
+ spec_type {str} -- Type of spectrometer to look for
31
+
32
+ Raises:
33
+ UnsupportedSpectrometer -- If the spec_type is not present
34
+
35
+ Returns:
36
+ str -- Name of the spectrometer
37
+ """
38
+
39
+ devices = sb.list_devices()
40
+
41
+ if not devices:
42
+ raise NoSpectrometerDetected("Are the spectrometers plugged in?")
43
+ if spec_type in SPECS.keys():
44
+ for dev in devices:
45
+ if SPECS[spec_type] in str(dev):
46
+ return dev
47
+ raise UnsupportedSpectrometer("Spectrometer {} unsupported!".format(spec_type))
48
+
49
+
50
+ class OceanOpticsSpectrometer:
51
+ """Base class for interfacing with OceanOptics Spectrometers"""
52
+
53
+ def __init__(self, spec_type, name=None):
54
+ """
55
+ Args:
56
+ spec_type (str): The type of spectrometer, e.g. 'IR', 'raman', etc.
57
+ name (str, optional): Device name for easier access
58
+ """
59
+ self.integration_time = 0.01 # in seconds
60
+ self.__spec = _get_spectrometer(spec_type)
61
+ self._spectrometer = sb.Spectrometer(self.__spec)
62
+ self.name = name
63
+ self._delay = 0.01
64
+
65
+ self.logger = logging.getLogger("oceanoptics.spectrometer")
66
+ self.logger.setLevel(logging.INFO)
67
+ # Removing default handlers
68
+ self.logger.handlers = []
69
+ ch = logging.StreamHandler()
70
+ ch.setLevel(logging.INFO)
71
+ console_formatter = logging.Formatter(
72
+ "%(asctime)s ; %(module)s ; %(name)s ; %(message)s"
73
+ )
74
+ ch.setFormatter(console_formatter)
75
+ self.logger.addHandler(ch)
76
+ self.set_integration_time(self.integration_time)
77
+
78
+ def set_integration_time(self, integration_time):
79
+ """Sets the integration time for the spectrometer
80
+
81
+ Args:
82
+ integration_time (float): Desired integration time in seconds!
83
+ """
84
+
85
+ self._spectrometer.open()
86
+ self.integration_time = integration_time
87
+ integration_time *= 1000 * 1000 # converting to microseconds
88
+ self.logger.debug(
89
+ "Setting the integration time to %s microseconds", integration_time
90
+ )
91
+ self._spectrometer.integration_time_micros(integration_time)
92
+ self._spectrometer.close()
93
+
94
+ def scan(self, n=3):
95
+ """Reads the spectrometer and returns the spectrum
96
+
97
+ Args:
98
+ n (int, opitonal): Number of 'scans'
99
+
100
+ Returns:
101
+ (Tuple): Tuple containing spectrum wavelengths and intensities as numpy arrays
102
+ Example: (array(wavelengths), array(intensities))
103
+ """
104
+
105
+ i_mean = []
106
+ self.logger.debug("Scanning")
107
+ self._spectrometer.open()
108
+ for i in range(n):
109
+ wavelengths, intensities = self._spectrometer.spectrum()
110
+ i_mean.append(intensities)
111
+ time.sleep(self._delay)
112
+
113
+ intensities = np.mean(i_mean, axis=0)
114
+ self._spectrometer.close()
115
+ return (wavelengths, intensities)
@@ -0,0 +1,15 @@
1
+ """
2
+ .. include:: README.md
3
+ """
4
+
5
+ # physical instruments
6
+ from .Magritek.Spinsolve.spinsolve import SpinsolveNMR
7
+ from .OceanOptics.Raman.raman_control import OceanOpticsRaman
8
+ from .OceanOptics.UV.QEPro2192 import QEPro2192
9
+ from .OceanOptics.IR.NIRQuest512 import NIRQuest512
10
+ from .Agilent.hplc import HPLCController
11
+
12
+ # classes for spectra processing
13
+ from .OceanOptics.Raman.raman_spectrum import RamanSpectrum
14
+ from .Magritek.Spinsolve.spectrum import SpinsolveNMRSpectrum
15
+ from .Agilent.chromatogram import AgilentHPLCChromatogram
@@ -0,0 +1,56 @@
1
+ from .pump_method import (
2
+ Channel1ExtendedSolventType,
3
+ Channel2ExtendedSolventType,
4
+ CompressA,
5
+ CompressB,
6
+ Definition,
7
+ PostTime,
8
+ PumpMethod,
9
+ SolventComposition,
10
+ SolventDescription,
11
+ SolventElement,
12
+ StopTime,
13
+ StrokeA,
14
+ Timetable,
15
+ TimetableEntry,
16
+ )
17
+
18
+ from .dad_method import (
19
+ AnalogOutput1,
20
+ AnalogOutput2,
21
+ DadMethod,
22
+ PostTime,
23
+ PrepareAutomation,
24
+ PrepareMode,
25
+ Signal,
26
+ Signals,
27
+ SpectraAcquisition,
28
+ StopTime,
29
+ )
30
+
31
+ __all__ = [
32
+ "Channel1ExtendedSolventType",
33
+ "Channel2ExtendedSolventType",
34
+ "CompressA",
35
+ "CompressB",
36
+ "Definition",
37
+ "PostTime",
38
+ "PumpMethod",
39
+ "SolventComposition",
40
+ "SolventDescription",
41
+ "SolventElement",
42
+ "StopTime",
43
+ "StrokeA",
44
+ "Timetable",
45
+ "TimetableEntry",
46
+ "AnalogOutput1",
47
+ "AnalogOutput2",
48
+ "DadMethod",
49
+ "PostTime",
50
+ "PrepareAutomation",
51
+ "PrepareMode",
52
+ "Signal",
53
+ "Signals",
54
+ "SpectraAcquisition",
55
+ "StopTime",
56
+ ]
@@ -0,0 +1,367 @@
1
+ from dataclasses import dataclass, field
2
+ from typing import Optional
3
+
4
+
5
+ @dataclass
6
+ class AnalogOutput1:
7
+ analog_zero: Optional[int] = field(
8
+ default=None,
9
+ metadata={
10
+ "name": "AnalogZero",
11
+ "type": "Element",
12
+ "required": True,
13
+ },
14
+ )
15
+ analog_att: Optional[int] = field(
16
+ default=None,
17
+ metadata={
18
+ "name": "AnalogAtt",
19
+ "type": "Element",
20
+ "required": True,
21
+ },
22
+ )
23
+
24
+
25
+ @dataclass
26
+ class AnalogOutput2:
27
+ analog_zero: Optional[int] = field(
28
+ default=None,
29
+ metadata={
30
+ "name": "AnalogZero",
31
+ "type": "Element",
32
+ "required": True,
33
+ },
34
+ )
35
+ analog_att: Optional[int] = field(
36
+ default=None,
37
+ metadata={
38
+ "name": "AnalogAtt",
39
+ "type": "Element",
40
+ "required": True,
41
+ },
42
+ )
43
+
44
+
45
+ @dataclass
46
+ class PostTime:
47
+ post_time_mode: Optional[str] = field(
48
+ default=None,
49
+ metadata={
50
+ "name": "PostTimeMode",
51
+ "type": "Element",
52
+ "required": True,
53
+ },
54
+ )
55
+
56
+
57
+ @dataclass
58
+ class PrepareAutomation:
59
+ do_prep_run_balance: Optional[bool] = field(
60
+ default=None,
61
+ metadata={
62
+ "name": "DoPrepRunBalance",
63
+ "type": "Element",
64
+ "required": True,
65
+ },
66
+ )
67
+ do_start_run_balance: Optional[bool] = field(
68
+ default=None,
69
+ metadata={
70
+ "name": "DoStartRunBalance",
71
+ "type": "Element",
72
+ "required": True,
73
+ },
74
+ )
75
+ do_post_run_balance: Optional[bool] = field(
76
+ default=None,
77
+ metadata={
78
+ "name": "DoPostRunBalance",
79
+ "type": "Element",
80
+ "required": True,
81
+ },
82
+ )
83
+
84
+
85
+ @dataclass
86
+ class PrepareMode:
87
+ balance_mode: Optional[str] = field(
88
+ default=None,
89
+ metadata={
90
+ "name": "BalanceMode",
91
+ "type": "Element",
92
+ "required": True,
93
+ },
94
+ )
95
+ headroom: Optional[int] = field(
96
+ default=None,
97
+ metadata={
98
+ "name": "Headroom",
99
+ "type": "Element",
100
+ "required": True,
101
+ },
102
+ )
103
+ smpgain: Optional[int] = field(
104
+ default=None,
105
+ metadata={
106
+ "name": "SMPGain",
107
+ "type": "Element",
108
+ "required": True,
109
+ },
110
+ )
111
+
112
+
113
+ @dataclass
114
+ class Signal:
115
+ use_signal: Optional[bool] = field(
116
+ default=None,
117
+ metadata={
118
+ "name": "UseSignal",
119
+ "type": "Element",
120
+ "required": True,
121
+ },
122
+ )
123
+ id: Optional[str] = field(
124
+ default=None,
125
+ metadata={
126
+ "name": "ID",
127
+ "type": "Element",
128
+ "required": True,
129
+ },
130
+ )
131
+ wavelength: Optional[int] = field(
132
+ default=None,
133
+ metadata={
134
+ "name": "Wavelength",
135
+ "type": "Element",
136
+ },
137
+ )
138
+ bandwidth: Optional[int] = field(
139
+ default=None,
140
+ metadata={
141
+ "name": "Bandwidth",
142
+ "type": "Element",
143
+ },
144
+ )
145
+ use_reference: Optional[bool] = field(
146
+ default=None,
147
+ metadata={
148
+ "name": "UseReference",
149
+ "type": "Element",
150
+ "required": True,
151
+ },
152
+ )
153
+
154
+
155
+ @dataclass
156
+ class SpectraAcquisition:
157
+ spectra_range_from: Optional[int] = field(
158
+ default=None,
159
+ metadata={
160
+ "name": "SpectraRangeFrom",
161
+ "type": "Element",
162
+ "required": True,
163
+ },
164
+ )
165
+ spectra_range_to: Optional[int] = field(
166
+ default=None,
167
+ metadata={
168
+ "name": "SpectraRangeTo",
169
+ "type": "Element",
170
+ "required": True,
171
+ },
172
+ )
173
+ spectra_step: Optional[int] = field(
174
+ default=None,
175
+ metadata={
176
+ "name": "SpectraStep",
177
+ "type": "Element",
178
+ "required": True,
179
+ },
180
+ )
181
+ spectra_acq_mode: Optional[str] = field(
182
+ default=None,
183
+ metadata={
184
+ "name": "SpectraAcqMode",
185
+ "type": "Element",
186
+ "required": True,
187
+ },
188
+ )
189
+
190
+
191
+ @dataclass
192
+ class StopTime:
193
+ stop_time_mode: Optional[str] = field(
194
+ default=None,
195
+ metadata={
196
+ "name": "StopTimeMode",
197
+ "type": "Element",
198
+ "required": True,
199
+ },
200
+ )
201
+
202
+
203
+ @dataclass
204
+ class Signals:
205
+ signal: list[Signal] = field(
206
+ default_factory=list,
207
+ metadata={
208
+ "name": "Signal",
209
+ "type": "Element",
210
+ "min_occurs": 1,
211
+ },
212
+ )
213
+
214
+
215
+ @dataclass
216
+ class DadMethod:
217
+ module_type: Optional[str] = field(
218
+ default=None,
219
+ metadata={
220
+ "name": "ModuleType",
221
+ "type": "Attribute",
222
+ "required": True,
223
+ },
224
+ )
225
+ schema_version: Optional[str] = field(
226
+ default=None,
227
+ metadata={
228
+ "name": "schemaVersion",
229
+ "type": "Attribute",
230
+ "required": True,
231
+ },
232
+ )
233
+ schema_si: Optional[int] = field(
234
+ default=None,
235
+ metadata={
236
+ "name": "schemaSI",
237
+ "type": "Attribute",
238
+ "required": True,
239
+ },
240
+ )
241
+ module_options: Optional[object] = field(
242
+ default=None,
243
+ metadata={
244
+ "name": "ModuleOptions",
245
+ "type": "Attribute",
246
+ "required": True,
247
+ },
248
+ )
249
+ configuration_xml: Optional[str] = field(
250
+ default=None,
251
+ metadata={
252
+ "name": "ConfigurationXml",
253
+ "type": "Element",
254
+ "required": True,
255
+ },
256
+ )
257
+ timetable: Optional[object] = field(
258
+ default=None,
259
+ metadata={
260
+ "name": "Timetable",
261
+ "type": "Element",
262
+ },
263
+ )
264
+ stop_time: Optional[StopTime] = field(
265
+ default=None,
266
+ metadata={
267
+ "name": "StopTime",
268
+ "type": "Element",
269
+ "required": True,
270
+ },
271
+ )
272
+ post_time: Optional[PostTime] = field(
273
+ default=None,
274
+ metadata={
275
+ "name": "PostTime",
276
+ "type": "Element",
277
+ "required": True,
278
+ },
279
+ )
280
+ delay: Optional[int] = field(
281
+ default=None,
282
+ metadata={
283
+ "name": "Delay",
284
+ "type": "Element",
285
+ "required": True,
286
+ },
287
+ )
288
+ analog_output1: Optional[AnalogOutput1] = field(
289
+ default=None,
290
+ metadata={
291
+ "name": "AnalogOutput1",
292
+ "type": "Element",
293
+ "required": True,
294
+ },
295
+ )
296
+ analog_output2: Optional[AnalogOutput2] = field(
297
+ default=None,
298
+ metadata={
299
+ "name": "AnalogOutput2",
300
+ "type": "Element",
301
+ "required": True,
302
+ },
303
+ )
304
+ signals: Optional[Signals] = field(
305
+ default=None,
306
+ metadata={
307
+ "name": "Signals",
308
+ "type": "Element",
309
+ "required": True,
310
+ },
311
+ )
312
+ peakwidth: Optional[int] = field(
313
+ default=None,
314
+ metadata={
315
+ "name": "Peakwidth",
316
+ "type": "Element",
317
+ "required": True,
318
+ },
319
+ )
320
+ slitwidth: Optional[int] = field(
321
+ default=None,
322
+ metadata={
323
+ "name": "Slitwidth",
324
+ "type": "Element",
325
+ "required": True,
326
+ },
327
+ )
328
+ uvlamp_required: Optional[bool] = field(
329
+ default=None,
330
+ metadata={
331
+ "name": "UVLampRequired",
332
+ "type": "Element",
333
+ "required": True,
334
+ },
335
+ )
336
+ vislamp_required: Optional[bool] = field(
337
+ default=None,
338
+ metadata={
339
+ "name": "VISLampRequired",
340
+ "type": "Element",
341
+ "required": True,
342
+ },
343
+ )
344
+ prepare_mode: Optional[PrepareMode] = field(
345
+ default=None,
346
+ metadata={
347
+ "name": "PrepareMode",
348
+ "type": "Element",
349
+ "required": True,
350
+ },
351
+ )
352
+ prepare_automation: Optional[PrepareAutomation] = field(
353
+ default=None,
354
+ metadata={
355
+ "name": "PrepareAutomation",
356
+ "type": "Element",
357
+ "required": True,
358
+ },
359
+ )
360
+ spectra_acquisition: Optional[SpectraAcquisition] = field(
361
+ default=None,
362
+ metadata={
363
+ "name": "SpectraAcquisition",
364
+ "type": "Element",
365
+ "required": True,
366
+ },
367
+ )