pychemstation 0.10.11__tar.gz → 0.10.13__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 (387) hide show
  1. {pychemstation-0.10.11 → pychemstation-0.10.13}/.pre-commit-config.yaml +7 -1
  2. pychemstation-0.10.13/.vscode/settings.json +12 -0
  3. {pychemstation-0.10.11 → pychemstation-0.10.13}/PKG-INFO +2 -2
  4. {pychemstation-0.10.11 → pychemstation-0.10.13}/README.md +1 -1
  5. pychemstation-0.10.13/cmd +1 -0
  6. pychemstation-0.10.13/out.txt +8 -0
  7. pychemstation-0.10.13/paper.bib +89 -0
  8. pychemstation-0.10.13/paper.md +133 -0
  9. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/controllers/comm.py +1 -1
  10. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/controllers/data_aq/method.py +112 -136
  11. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/controllers/data_aq/sequence.py +67 -34
  12. pychemstation-0.10.13/pychemstation/control/controllers/devices/__init__.py +6 -0
  13. pychemstation-0.10.13/pychemstation/control/controllers/devices/column.py +61 -0
  14. pychemstation-0.10.13/pychemstation/control/controllers/devices/dad.py +85 -0
  15. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/controllers/devices/injector.py +18 -0
  16. pychemstation-0.10.13/pychemstation/control/controllers/devices/pump.py +131 -0
  17. pychemstation-0.10.13/pychemstation/control/controllers/devices/sample_info.py +27 -0
  18. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/hplc.py +36 -12
  19. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/abc_tables/device.py +17 -3
  20. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/abc_tables/table.py +146 -63
  21. pychemstation-0.10.13/pychemstation/utils/device_types.py +73 -0
  22. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/macro.py +2 -0
  23. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/table_types.py +65 -8
  24. {pychemstation-0.10.11 → pychemstation-0.10.13}/pyproject.toml +2 -2
  25. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/constants.py +3 -14
  26. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/dtypes/test_abc.py +3 -1
  27. pychemstation-0.10.13/tests/edit/__init__.py +0 -0
  28. pychemstation-0.10.13/tests/edit/test_edit_col.py +63 -0
  29. pychemstation-0.10.13/tests/edit/test_edit_dad.py +50 -0
  30. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/edit/test_edit_method.py +3 -5
  31. pychemstation-0.10.13/tests/files/__init__.py +0 -0
  32. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/test_offline.py +10 -0
  33. pychemstation-0.10.13/tests/load/__init__.py +0 -0
  34. pychemstation-0.10.13/tests/load/test_load_bottles.py +0 -0
  35. pychemstation-0.10.13/tests/load/test_load_column.py +48 -0
  36. pychemstation-0.10.13/tests/load/test_load_dad.py +41 -0
  37. pychemstation-0.10.13/tests/load/test_load_pump.py +46 -0
  38. pychemstation-0.10.13/tests/load/test_load_sample_info.py +37 -0
  39. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/load/test_switch_sequence.py +3 -5
  40. pychemstation-0.10.13/tests/run/__init__.py +0 -0
  41. {pychemstation-0.10.11 → pychemstation-0.10.13}/uv.lock +544 -517
  42. pychemstation-0.10.11/out.txt +0 -511
  43. pychemstation-0.10.11/pychemstation/control/controllers/devices/__init__.py +0 -3
  44. pychemstation-0.10.11/pychemstation/utils/device_types.py +0 -7
  45. pychemstation-0.10.11/tests/comm/out.txt +0 -309
  46. {pychemstation-0.10.11 → pychemstation-0.10.13}/.gitignore +0 -0
  47. {pychemstation-0.10.11 → pychemstation-0.10.13}/.gitlab-ci.yml +0 -0
  48. {pychemstation-0.10.11 → pychemstation-0.10.13}/CHANGELOG.md +0 -0
  49. {pychemstation-0.10.11 → pychemstation-0.10.13}/CONTRIBUTING.md +0 -0
  50. {pychemstation-0.10.11 → pychemstation-0.10.13}/LICENSE +0 -0
  51. {pychemstation-0.10.11 → pychemstation-0.10.13}/branch-rename.sh +0 -0
  52. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/index.html +0 -0
  53. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/analysis/base_spectrum.html +0 -0
  54. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/analysis/spec_utils.html +0 -0
  55. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/analysis/utils.html +0 -0
  56. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/analysis.html +0 -0
  57. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/control/chromatogram.html +0 -0
  58. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/control/hplc.html +0 -0
  59. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/control.html +0 -0
  60. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/generated.html +0 -0
  61. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/utils/chemstation.html +0 -0
  62. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/utils/constants.html +0 -0
  63. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/utils/hplc_param_types.html +0 -0
  64. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation/utils.html +0 -0
  65. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/pychemstation.html +0 -0
  66. {pychemstation-0.10.11 → pychemstation-0.10.13}/doc/search.js +0 -0
  67. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/__init__.py +0 -0
  68. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/analysis/__init__.py +0 -0
  69. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/analysis/base_spectrum.py +0 -0
  70. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/analysis/chromatogram.py +0 -0
  71. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/analysis/process_report.py +0 -0
  72. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/README.md +0 -0
  73. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/__init__.py +0 -0
  74. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/controllers/README.md +0 -0
  75. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/controllers/__init__.py +0 -0
  76. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/control/controllers/data_aq/__init__.py +0 -0
  77. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/generated/__init__.py +0 -0
  78. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/generated/dad_method.py +0 -0
  79. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/generated/pump_method.py +0 -0
  80. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/__init__.py +0 -0
  81. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/abc_tables/__init__.py +0 -0
  82. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/abc_tables/abc_comm.py +0 -0
  83. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/abc_tables/run.py +0 -0
  84. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/injector_types.py +0 -0
  85. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/method_types.py +0 -0
  86. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/mocking/__init__.py +0 -0
  87. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/mocking/mock_comm.py +0 -0
  88. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/mocking/mock_hplc.py +0 -0
  89. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/num_utils.py +0 -0
  90. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/parsing.py +0 -0
  91. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/sequence_types.py +0 -0
  92. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/spec_utils.py +0 -0
  93. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation/utils/tray_types.py +0 -0
  94. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation.egg-info/PKG-INFO +0 -0
  95. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation.egg-info/SOURCES.txt +0 -0
  96. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation.egg-info/dependency_links.txt +0 -0
  97. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation.egg-info/requires.txt +0 -0
  98. {pychemstation-0.10.11 → pychemstation-0.10.13}/pychemstation.egg-info/top_level.txt +0 -0
  99. /pychemstation-0.10.11/tests/__init__.py → /pychemstation-0.10.13/reply +0 -0
  100. /pychemstation-0.10.11/tests/load/test_load_bottles.py → /pychemstation-0.10.13/tests/__init__.py +0 -0
  101. /pychemstation-0.10.11/tests/load/test_load_dad.py → /pychemstation-0.10.13/tests/comm/__init__.py +0 -0
  102. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/comm/test_dirs.py +0 -0
  103. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/comm/test_hplc_comm.py +0 -0
  104. /pychemstation-0.10.11/tests/load/test_load_sample_info.py → /pychemstation-0.10.13/tests/dtypes/__init__.py +0 -0
  105. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/edit/test_edit_sequence.py +0 -0
  106. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/0_2025-03-15 19-14-35.PDF +0 -0
  107. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/ACQRES.REG +0 -0
  108. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/CSlbk.ini +0 -0
  109. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DA.M/DAMETHOD.REG +0 -0
  110. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DA.M/INFO.MTH +0 -0
  111. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DA.M/RECALIB.MTH +0 -0
  112. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DA.M/rpthead.txt +0 -0
  113. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1.UV +0 -0
  114. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1A.ch +0 -0
  115. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1A.npz +0 -0
  116. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1B.ch +0 -0
  117. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1B.npz +0 -0
  118. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1C.ch +0 -0
  119. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1C.npz +0 -0
  120. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1D.ch +0 -0
  121. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1D.npz +0 -0
  122. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1E.ch +0 -0
  123. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DAD1E.npz +0 -0
  124. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/DiagResults.REG +0 -0
  125. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/PMP1.AnalyticalResults.drvml +0 -0
  126. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/REPORT01.CSV +0 -0
  127. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/REPORT02.CSV +0 -0
  128. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/REPORT03.CSV +0 -0
  129. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/REPORT04.CSV +0 -0
  130. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/REPORT05.CSV +0 -0
  131. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/RUN.LOG +0 -0
  132. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/Report.TXT +0 -0
  133. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/Report00.CSV +0 -0
  134. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/Report01.xls +0 -0
  135. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/SAMPLE.XML +0 -0
  136. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/SAMPLE.XML.bak +0 -0
  137. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/WLS1.Sampler.scml +0 -0
  138. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/acq.macaml +0 -0
  139. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/acq.txt +0 -0
  140. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/acq_MethHist.txt +0 -0
  141. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/acq_damethod.reg +0 -0
  142. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/da.macaml +0 -0
  143. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/lcdiag.reg +0 -0
  144. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/sample.acaml +0 -0
  145. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/0_2025-03-15 19-14-35.D/single.B +0 -0
  146. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/ACQRES.REG +0 -0
  147. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/AUTOMATICALLY_GENERATED_REPORT01.CSV +0 -0
  148. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/AUTOMATICALLY_GENERATED_REPORT02.CSV +0 -0
  149. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/AUTOMATICALLY_GENERATED_REPORT03.CSV +0 -0
  150. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/AUTOMATICALLY_GENERATED_REPORT04.CSV +0 -0
  151. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/AUTOMATICALLY_GENERATED_REPORT05.CSV +0 -0
  152. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/Automatically_Generated_Report.TXT +0 -0
  153. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/Automatically_Generated_Report00.CSV +0 -0
  154. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/CSlbk.ini +0 -0
  155. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DA.M/DAMETHOD.REG +0 -0
  156. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DA.M/INFO.MTH +0 -0
  157. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DA.M/RECALIB.MTH +0 -0
  158. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DA.M/rpthead.txt +0 -0
  159. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1.UV +0 -0
  160. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1A.ch +0 -0
  161. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1A.npz +0 -0
  162. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1B.ch +0 -0
  163. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1B.npz +0 -0
  164. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1C.ch +0 -0
  165. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1C.npz +0 -0
  166. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1D.ch +0 -0
  167. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1D.npz +0 -0
  168. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1E.ch +0 -0
  169. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1E.npz +0 -0
  170. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1F.ch +0 -0
  171. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1F.npz +0 -0
  172. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1G.ch +0 -0
  173. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1G.npz +0 -0
  174. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1H.ch +0 -0
  175. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DAD1H.npz +0 -0
  176. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/DiagResults.REG +0 -0
  177. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/Limsinf.xml +0 -0
  178. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/PMP1.AnalyticalResults.drvml +0 -0
  179. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/RUN.LOG +0 -0
  180. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/SAMPLE.XML +0 -0
  181. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/SAMPLE.XML.bak +0 -0
  182. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/WLS1.Sampler.scml +0 -0
  183. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/acq.macaml +0 -0
  184. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/acq.txt +0 -0
  185. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/acq_MethHist.txt +0 -0
  186. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/acq_damethod.reg +0 -0
  187. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/da.macaml +0 -0
  188. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/lcdiag.reg +0 -0
  189. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/sample.acaml +0 -0
  190. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/10 IS 2025-02-10 23-41-33_10_2025-02-11 02-21-44.D/single.B +0 -0
  191. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/CSlbk.ini +0 -0
  192. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/ACQ.MS +0 -0
  193. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/Agilent1200erDadDriver1.RapidControl.ConfigXML.xml +0 -0
  194. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/Agilent1200erDadDriver1.RapidControl.MethodMetaData.xml +0 -0
  195. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/Agilent1200erDadDriver1.RapidControl.MethodXML.xml +0 -0
  196. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentColumnCompDriver1.RapidControl.ConfigXML.xml +0 -0
  197. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentColumnCompDriver1.RapidControl.MethodMetaData.xml +0 -0
  198. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentColumnCompDriver1.RapidControl.MethodXML.xml +0 -0
  199. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentPumpDriver1.RapidControl.ConfigXML.xml +0 -0
  200. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentPumpDriver1.RapidControl.MethodMetaData.xml +0 -0
  201. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentPumpDriver1.RapidControl.MethodXML.xml +0 -0
  202. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentSamplerDriver1.RapidControl.ConfigXML.xml +0 -0
  203. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentSamplerDriver1.RapidControl.MethodMetaData.xml +0 -0
  204. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentSamplerDriver1.RapidControl.MethodXML.xml +0 -0
  205. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/AgilentSamplerDriver1.RapidControl.PretreatXML.xml +0 -0
  206. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/DAMETHOD.REG +0 -0
  207. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/FIA.REG +0 -0
  208. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/INFO.MTH +0 -0
  209. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/INJECTOR.MTH +0 -0
  210. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/MassHunterIntegration.ini +0 -0
  211. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/RECALIB.MTH +0 -0
  212. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/RapidControl.InstrumentConfig.xml +0 -0
  213. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/rpthead.txt +0 -0
  214. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/GENERAL-POROSHELL-OPT.M/smpl_pur.mth +0 -0
  215. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/Methods.Reg +0 -0
  216. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/hplc_testing.B +0 -0
  217. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/hplc_testing.LOG +0 -0
  218. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/hplc_testing.S +0 -0
  219. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/hplc_testing.Start +0 -0
  220. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/ACQRES.REG +0 -0
  221. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/CSlbk.ini +0 -0
  222. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DA.M/DAMETHOD.REG +0 -0
  223. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DA.M/INFO.MTH +0 -0
  224. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DA.M/RECALIB.MTH +0 -0
  225. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DA.M/rpthead.txt +0 -0
  226. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1.UV +0 -0
  227. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1A.ch +0 -0
  228. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1A.npz +0 -0
  229. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1B.ch +0 -0
  230. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1B.npz +0 -0
  231. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1C.ch +0 -0
  232. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1C.npz +0 -0
  233. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1D.ch +0 -0
  234. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1D.npz +0 -0
  235. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1E.ch +0 -0
  236. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DAD1E.npz +0 -0
  237. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/DiagResults.REG +0 -0
  238. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/Limsinf.xml +0 -0
  239. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/PMP1.AnalyticalResults.drvml +0 -0
  240. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/REPORT01.CSV +0 -0
  241. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/REPORT02.CSV +0 -0
  242. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/REPORT03.CSV +0 -0
  243. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/REPORT04.CSV +0 -0
  244. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/REPORT05.CSV +0 -0
  245. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/RUN.LOG +0 -0
  246. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/Report.TXT +0 -0
  247. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/Report00.CSV +0 -0
  248. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/Report01.xls +0 -0
  249. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/SAMPLE.XML +0 -0
  250. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/SAMPLE.XML.bak +0 -0
  251. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/WLS1.Sampler.scml +0 -0
  252. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/acq.macaml +0 -0
  253. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/acq.txt +0 -0
  254. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/acq_MethHist.txt +0 -0
  255. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/acq_damethod.reg +0 -0
  256. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/da.macaml +0 -0
  257. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/hplc_testing 2025-03-27 17-13-47_run seq with new method.PDF +0 -0
  258. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/lcdiag.reg +0 -0
  259. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method.D/sequence.acam_ +0 -0
  260. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/ACQRES.REG +0 -0
  261. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/CSlbk.ini +0 -0
  262. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DA.M/DAMETHOD.REG +0 -0
  263. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DA.M/INFO.MTH +0 -0
  264. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DA.M/RECALIB.MTH +0 -0
  265. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DA.M/rpthead.txt +0 -0
  266. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1.UV +0 -0
  267. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1A.ch +0 -0
  268. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1A.npz +0 -0
  269. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1B.ch +0 -0
  270. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1B.npz +0 -0
  271. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1C.ch +0 -0
  272. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1C.npz +0 -0
  273. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1D.ch +0 -0
  274. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1D.npz +0 -0
  275. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1E.ch +0 -0
  276. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DAD1E.npz +0 -0
  277. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/DiagResults.REG +0 -0
  278. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/Limsinf.xml +0 -0
  279. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/PMP1.AnalyticalResults.drvml +0 -0
  280. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/REPORT01.CSV +0 -0
  281. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/REPORT02.CSV +0 -0
  282. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/REPORT03.CSV +0 -0
  283. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/REPORT04.CSV +0 -0
  284. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/REPORT05.CSV +0 -0
  285. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/RUN.LOG +0 -0
  286. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/Report.TXT +0 -0
  287. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/Report00.CSV +0 -0
  288. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/Report01.xls +0 -0
  289. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/SAMPLE.XML +0 -0
  290. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/SAMPLE.XML.bak +0 -0
  291. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/WLS1.Sampler.scml +0 -0
  292. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/acq.macaml +0 -0
  293. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/acq.txt +0 -0
  294. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/acq_MethHist.txt +0 -0
  295. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/acq_damethod.reg +0 -0
  296. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/da.macaml +0 -0
  297. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/hplc_testing 2025-03-27 17-13-47_run seq with new method.PDF +0 -0
  298. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/lcdiag.reg +0 -0
  299. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method1.D/sequence.acam_ +0 -0
  300. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/ACQRES.REG +0 -0
  301. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/CSlbk.ini +0 -0
  302. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DA.M/DAMETHOD.REG +0 -0
  303. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DA.M/INFO.MTH +0 -0
  304. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DA.M/RECALIB.MTH +0 -0
  305. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DA.M/rpthead.txt +0 -0
  306. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1.UV +0 -0
  307. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1A.ch +0 -0
  308. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1A.npz +0 -0
  309. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1B.ch +0 -0
  310. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1B.npz +0 -0
  311. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1C.ch +0 -0
  312. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1C.npz +0 -0
  313. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1D.ch +0 -0
  314. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1D.npz +0 -0
  315. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1E.ch +0 -0
  316. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DAD1E.npz +0 -0
  317. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/DiagResults.REG +0 -0
  318. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/Limsinf.xml +0 -0
  319. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/PMP1.AnalyticalResults.drvml +0 -0
  320. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/REPORT01.CSV +0 -0
  321. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/REPORT02.CSV +0 -0
  322. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/REPORT03.CSV +0 -0
  323. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/REPORT04.CSV +0 -0
  324. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/REPORT05.CSV +0 -0
  325. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/RUN.LOG +0 -0
  326. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/Report.TXT +0 -0
  327. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/Report00.CSV +0 -0
  328. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/Report01.xls +0 -0
  329. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/SAMPLE.XML +0 -0
  330. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/SAMPLE.XML.bak +0 -0
  331. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/WLS1.Sampler.scml +0 -0
  332. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/acq.macaml +0 -0
  333. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/acq.txt +0 -0
  334. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/acq_MethHist.txt +0 -0
  335. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/acq_damethod.reg +0 -0
  336. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/da.macaml +0 -0
  337. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/hplc_testing 2025-03-27 17-13-47_run seq with new method.PDF +0 -0
  338. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/lcdiag.reg +0 -0
  339. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method2.D/sequence.acam_ +0 -0
  340. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/ACQRES.REG +0 -0
  341. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/CSlbk.ini +0 -0
  342. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DA.M/DAMETHOD.REG +0 -0
  343. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DA.M/INFO.MTH +0 -0
  344. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DA.M/RECALIB.MTH +0 -0
  345. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DA.M/rpthead.txt +0 -0
  346. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1.UV +0 -0
  347. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1A.ch +0 -0
  348. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1A.npz +0 -0
  349. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1B.ch +0 -0
  350. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1B.npz +0 -0
  351. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1C.ch +0 -0
  352. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1C.npz +0 -0
  353. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1D.ch +0 -0
  354. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1D.npz +0 -0
  355. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1E.ch +0 -0
  356. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DAD1E.npz +0 -0
  357. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/DiagResults.REG +0 -0
  358. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/Limsinf.xml +0 -0
  359. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/PMP1.AnalyticalResults.drvml +0 -0
  360. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/REPORT01.CSV +0 -0
  361. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/REPORT02.CSV +0 -0
  362. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/REPORT03.CSV +0 -0
  363. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/REPORT04.CSV +0 -0
  364. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/REPORT05.CSV +0 -0
  365. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/RUN.LOG +0 -0
  366. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/Report.TXT +0 -0
  367. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/Report00.CSV +0 -0
  368. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/Report01.xls +0 -0
  369. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/SAMPLE.XML +0 -0
  370. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/SAMPLE.XML.bak +0 -0
  371. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/WLS1.Sampler.scml +0 -0
  372. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/acq.macaml +0 -0
  373. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/acq.txt +0 -0
  374. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/acq_MethHist.txt +0 -0
  375. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/acq_damethod.reg +0 -0
  376. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/da.macaml +0 -0
  377. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/hplc_testing 2025-03-27 17-13-47_run seq with new method.PDF +0 -0
  378. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/lcdiag.reg +0 -0
  379. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/run seq with new method3.D/sequence.acam_ +0 -0
  380. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/files/hplc_testing 2025-03-27 17-13-47/sequence.acaml +0 -0
  381. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/hplc_talk.mac +0 -0
  382. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/load/test_load_injector.py +0 -0
  383. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/load/test_switch_method.py +0 -0
  384. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/run/test_run_method.py +0 -0
  385. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/run/test_run_sequence.py +0 -0
  386. {pychemstation-0.10.11 → pychemstation-0.10.13}/tests/test_integration.py +0 -0
  387. {pychemstation-0.10.11 → pychemstation-0.10.13}/update-lib.sh +0 -0
@@ -11,4 +11,10 @@ repos:
11
11
  - repo: https://github.com/pre-commit/mirrors-mypy
12
12
  rev: v1.15.0
13
13
  hooks:
14
- - id: mypy
14
+ - id: mypy
15
+ - repo: local
16
+ hooks:
17
+ - id: delete-debug-files
18
+ name: delete-debug-files
19
+ entry: bash -c 'find . -name "out.txt" -type f -delete'
20
+ language: system
@@ -0,0 +1,12 @@
1
+ {
2
+ "python.testing.unittestArgs": [
3
+ "-v",
4
+ "-s",
5
+ "./tests",
6
+ "-p",
7
+ "test_*.py"
8
+ ],
9
+ "python.testing.pytestEnabled": false,
10
+ "python.testing.unittestEnabled": true,
11
+ "python.analysis.typeCheckingMode": "standard"
12
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pychemstation
3
- Version: 0.10.11
3
+ Version: 0.10.13
4
4
  Summary: Library to interact with Chemstation software, primarily used in Hein lab
5
5
  Project-URL: Documentation, https://pychemstation-e5a086.gitlab.io/pychemstation.html
6
6
  Project-URL: Repository, https://gitlab.com/heingroup/device-api/pychemstation
@@ -23,7 +23,7 @@ Requires-Dist: scipy>=1.10.1
23
23
  Requires-Dist: xsdata>=24.9
24
24
  Description-Content-Type: text/markdown
25
25
 
26
- # Agilent HPLC Macro Control
26
+ # pychemstation: A Python package for automated control of Chemstation using MACROs
27
27
 
28
28
  ![PyPI - Downloads](https://img.shields.io/pypi/dm/pychemstation)
29
29
 
@@ -1,4 +1,4 @@
1
- # Agilent HPLC Macro Control
1
+ # pychemstation: A Python package for automated control of Chemstation using MACROs
2
2
 
3
3
  ![PyPI - Downloads](https://img.shields.io/pypi/dm/pychemstation)
4
4
 
@@ -0,0 +1 @@
1
+ 8 response$ = _METHPATH$
@@ -0,0 +1,8 @@
1
+ response$ = AcqStatus$
2
+ response$ = _METHPATH$
3
+ response$ = _SEQUENCEPATHS$
4
+ response$ = _DATAPATHS$
5
+ response$ = _METHPATH$
6
+ response$ = _SEQUENCEPATHS$
7
+ response$ = _DATAPATHS$
8
+ response$ = _METHPATH$
@@ -0,0 +1,89 @@
1
+ @misc{AccelerationConsortium,
2
+ title = {Acceleration {{Consortium}}},
3
+ urldate = {2025-04-16},
4
+ howpublished = {https://acceleration.utoronto.ca/events/acceleration-consortium-fall-research-symposium},
5
+ file = {/Users/lucyhao/Zotero/storage/KJJAD45E/acceleration-consortium-fall-research-symposium.html}
6
+ }
7
+
8
+ @misc{BourneGroupHPLCMethodOptimisationGUIHPLC,
9
+ title = {Bourne-{{Group}}/{{HPLCMethodOptimisationGUI}}: {{HPLC}} Method Optimisation Using Machine Learning},
10
+ urldate = {2025-04-16},
11
+ howpublished = {https://github.com/Bourne-Group/HPLCMethodOptimisationGUI}
12
+ }
13
+
14
+ @misc{ChromatographyMethodDevelopment,
15
+ title = {Chromatography {{Method Development}} - {{OpenLab ChemStation}} {\textbar} {{Agilent}}},
16
+ urldate = {2025-04-16},
17
+ howpublished = {https://www.agilent.com/en/product/software-informatics/analytical-software-suite/chromatography-data-systems/openlab-chemstation},
18
+ file = {/Users/lucyhao/Zotero/storage/KBK2IZV3/openlab-chemstation.html}
19
+ }
20
+
21
+ @misc{CroningpAnalyticallabware2025,
22
+ title = {Croningp/Analyticallabware},
23
+ year = {2025},
24
+ month = mar,
25
+ urldate = {2025-04-16},
26
+ howpublished = {croningp}
27
+ }
28
+
29
+ @article{dixonOperatorfreeHPLCAutomated2024a,
30
+ title = {Operator-Free {{HPLC}} Automated Method Development Guided by {{Bayesian}} Optimization},
31
+ author = {Dixon, Thomas M. and Williams, Jeanine and Besenhard, Maximilian and Howard, Roger M. and MacGregor, James and Peach, Philip and Clayton, Adam D. and Warren, Nicholas J. and Bourne, Richard A.},
32
+ year = {2024},
33
+ month = aug,
34
+ journal = {Digital Discovery},
35
+ volume = {3},
36
+ number = {8},
37
+ pages = {1591--1601},
38
+ publisher = {RSC},
39
+ issn = {2635-098X},
40
+ doi = {10.1039/D4DD00062E},
41
+ urldate = {2025-04-16},
42
+ abstract = {The need to efficiently develop high performance liquid chromatography (HPLC) methods, whilst adhering to quality by design principles is of paramount importance when it comes to impurity detection in the synthesis of active pharmaceutical ingredients. This study highlights a novel approach that fully automates HPLC method development using black-box single and multi-objective Bayesian optimization algorithms. Three continuous variables including the initial isocratic hold time, initial organic modifier concentration and the gradient time were adjusted to simultaneously optimize the number of peaks detected, the resolution between peaks and the method length. Two mixtures of analytes, one with seven compounds and one with eleven compounds, were investigated. The system explored the design space to find a global optimum in chromatogram quality without human assistance, and methods that gave baseline resolution were identified. Optimal operating conditions were typically reached within just 13 experiments. The single and multi-objective Bayesian optimization algorithms were compared to show that multi-objective optimization was more suitable for HPLC method development. This allowed for multiple chromatogram acceptance criteria to be selected without having to repeat the entire optimization, making it a useful tool for robustness testing. Work in this paper presents a fully ``operator-free'' and closed loop HPLC method optimization process that can find optimal methods quickly when compared to other modern HPLC optimization techniques such as design of experiments, linear solvent strength models or quantitative structure retention relationships.},
43
+ langid = {english},
44
+ file = {/Users/lucyhao/Zotero/storage/R6J4X3FX/Dixon et al. - 2024 - Operator-free HPLC automated method development guided by Bayesian optimization.pdf;/Users/lucyhao/Zotero/storage/U6VQC54Q/Dixon et al. - 2024 - Operator-free HPLC automated method development guided by Bayesian optimization.pdf}
45
+ }
46
+
47
+ @misc{DynamicSamplingAutonomous,
48
+ title = {Dynamic Sampling in Autonomous Process Optimization - {{Chemical Science}} ({{RSC Publishing}})},
49
+ urldate = {2025-04-16},
50
+ howpublished = {https://pubs.rsc.org/en/content/articlelanding/2024/sc/d3sc06884f\#!divAbstract},
51
+ file = {/Users/lucyhao/Zotero/storage/V9P3MB47/d3sc06884f.html}
52
+ }
53
+
54
+ @misc{HeinGroupHplcmethodoptimization2025,
55
+ title = {Hein {{Group}} / Hplc-Method-Optimization {$\cdot$} {{GitLab}}},
56
+ year = {2025},
57
+ month = apr,
58
+ journal = {GitLab},
59
+ urldate = {2025-04-16},
60
+ abstract = {GitLab.com},
61
+ howpublished = {https://gitlab.com/heingroup/hplc-method-optimization},
62
+ langid = {english}
63
+ }
64
+
65
+ @article{robertsAutomatingStochasticAntibody2025,
66
+ title = {Automating Stochastic Antibody--Drug Conjugation: A Self-Driving Lab Approach for Enhanced Therapeutic Development},
67
+ shorttitle = {Automating Stochastic Antibody--Drug Conjugation},
68
+ author = {Roberts, Liam and Reish, Matthew E. and Yang, Jerrica and Zhang, Wenyu and Derasp, Joshua S. and Hein, Jason E.},
69
+ year = {2025},
70
+ month = apr,
71
+ journal = {Digital Discovery},
72
+ volume = {4},
73
+ number = {4},
74
+ pages = {979--986},
75
+ publisher = {RSC},
76
+ issn = {2635-098X},
77
+ doi = {10.1039/D4DD00363B},
78
+ urldate = {2025-04-16},
79
+ abstract = {Antibody--drug conjugates (ADCs) have become a promising cancer treatment over the past two decades due to their on-target drug-release capabilities. However, labor-intensive manual conjugations currently limit the throughput of ADC synthesis. Herein, we introduce a Self-Driving Lab (SDL) for automated stochastic antibody--drug conjugation and characterization. The robotic platform performs conjugations and determines drug to antibody ratios from chromatography data, enabling the production of target ADCs iteratively in a closed loop. Our SDL establishes a robust foundation for increasing ADC production throughput and accelerating the development of cancer therapeutics.},
80
+ langid = {english},
81
+ file = {/Users/lucyhao/Zotero/storage/ENB4N88F/Roberts et al. - 2025 - Automating stochastic antibody–drug conjugation a self-driving lab approach for enhanced therapeuti.pdf;/Users/lucyhao/Zotero/storage/MQW4T3ZY/Roberts et al. - 2025 - Automating stochastic antibody–drug conjugation a self-driving lab approach for enhanced therapeuti.pdf}
82
+ }
83
+
84
+ @article{schneiderMacroProgrammingGuide,
85
+ title = {Macro {{Programming Guide}}},
86
+ author = {Schneider, J{\"u}rgen},
87
+ langid = {english},
88
+ file = {/Users/lucyhao/Zotero/storage/QKT883DB/Schneider - Macro Programming Guide.pdf}
89
+ }
@@ -0,0 +1,133 @@
1
+ ---
2
+ title: 'pychemstation: A Python package for automated control of Chemstation using MACROs'
3
+ tags:
4
+ - Python
5
+ - Self Driving Labs
6
+ - SDL
7
+ - HPLC
8
+ - Automation
9
+ authors:
10
+ - name: Lucy Hao
11
+ email: lucyhao@chem.ubc.ca
12
+ orcid: 0000-0003-0296-3591
13
+ affiliation: 1
14
+ - name: Maria Politi
15
+ email: politim@chem.ubc.ca
16
+ orcid: 0000-0002-5815-3371
17
+ affiliation: "1, 3"
18
+ - name: Jason Hein
19
+ email: jhein@chem.ubc.ca
20
+ orcid: 0000-0002-4345-3005
21
+ affiliation: "1, 2, 3, 4"
22
+ affiliations:
23
+ - name: Department of Chemistry, The University of British Columbia, Vancouver, Canada
24
+ index: 1
25
+ - name: Department of Chemistry, University of Bergen, Norway
26
+ index: 2
27
+ - name: Acceleration Consortium, University of Toronto, Toronto, ON, Canada
28
+ index: 3
29
+ - name: Telescope Innovations Corp., Vancouver, BC, Canada
30
+ index: 4
31
+ date: 17 April 2025
32
+ bibliography: paper.bib
33
+ ---
34
+
35
+ # Summary
36
+
37
+ `pychemstation` is a Python package that automates the use of high-performance liquid chromatography (HPLC) machines using
38
+ Chemstation [@ChromatographyMethodDevelopment]. Python enables easy adoption by chemists and integrates smoothly with
39
+ existing data analysis and robotics packages used in developing automated chemical workflows. The `pychemstation` API
40
+ provides users with a simple class-based interface to automate common operations such as running analytical methods and
41
+ sequences, modifying methods and sequences, and extracting chromatograms after runs. `pychemstation` provides this functionality by generating MACROs (a command
42
+ protocol developed by Agilent) which are sent to ChemStation for execution. With HPLC being one of the most widely
43
+ used analytical methods in research and industry, `pychemstation` opens the doors to using this powerful analytical technique in automated chemical workflows.
44
+
45
+ # Statement of need
46
+
47
+ Chemists run hundreds of analytical measurements to gain insight into chemical reactions.
48
+ This amounts to hours of manual labour to interact with graphical user interfaces (GUIs) to modify analytical methods,
49
+ run the methods, and then extract data to gain scientific insight. Tasks such as these are amenable to automation, leading to a broader research
50
+ goal to automate experiments through self-driving labs (SDLs) [@robertsAutomatingStochasticAntibody2025; @DynamicSamplingAutonomous].
51
+ SDLs are robotic platforms that autonomously plan and execute hundreds of chemical reactions. Building an SDL requires
52
+ every step a chemist would do by hand to be automated, one of them being the running of analytical equipment such as HPLC.
53
+ Building autonomous chemical requires the development of robust software tools that enable control and communication with analytical hardware.
54
+
55
+ `pychemstation` was designed to be used by chemists to control Agilent-specific HPLC machines in their day-to-day
56
+ operations or in developing SDLs. The development of `pychemstation` stemmed from the desire for a
57
+ robust strategy to interact with Chemstation, moving away from the fragile and cumbersome development of the “mouse and
58
+ keyboard” interaction strategy with the GUI. Development began from the augmentation of an existing Python codebase for
59
+ sending MACROs to Chemstation, with addition more MACROs through trial-and-error and previous published work
60
+ [@CroningpAnalyticallabware2025; @dixonOperatorfreeHPLCAutomated2024a; @BourneGroupHPLCMethodOptimisationGUIHPLCl; @schneiderMacroProgrammingGuide].
61
+ `pychemstation` has already been used in several of the Hein group's projects, including SDLs for kinetics,
62
+ liquid-liquid extraction and development of a Python based tool for autonomous data-driven HPLC method
63
+ development [@AccelerationConsortium; @HeinGroupHplcmethodoptimization2025]. Built with robustness and ease-of-use in
64
+ mind, `pychemstation` frees the chemist from repetitive tasks and gives SDL developers the ability to seamlessly interact with
65
+ HPLC machines through an API, enhancing productivity and enabling more efficient software integration.
66
+
67
+ # Description
68
+
69
+ `pychemstation` controls the operation of Chemstation through a set of `Controller` classes which generate MACROs based
70
+ on Python dataclasses. A schematic describing the package architecture is shown below in figure 1.
71
+
72
+ ![A class architecture diagram for `pychemstation`. The
73
+ `CommunicationController` handles all communication between a user's Python program and a Chemstation instance. All other controllers extend an abstract
74
+ `ABCTableController` which provides table loading and editing functionality all controllers require. The
75
+ `RunController` is another abstract class including more functionality related to editing and triggering a run/runs.
76
+ `RunController` also provides a polling functionality to let the user know when a run is complete, and returns the file paths containing the data from the run. The
77
+ `DeviceController` load and edit details about hardware.](imgs/control.png)
78
+
79
+ MACROs enabling functionality beyond method editing were discovered using a MACRO editor and Chemstation's built in
80
+ MACRO help [@schneiderMacroProgrammingGuide; @ChromatographyMethodDevelopment].
81
+ Python tests were written to ensure proper functionality of all the methods available in the `HPLCController` class that
82
+ most users interact with, shown in figure 2. These tests include both unit (testing the individual controller
83
+ classes) and integration tests (such as editing of methods and running them immediately after with retrieval of run
84
+ data). Tests were run on two different HPLC machines in the Hein group.
85
+
86
+ ![All methods available for use in the `HPLCController` class](imgs/hplc.png)
87
+
88
+ The `HPLCController` class contains a series of subclasses of `RunController` and `DeviceController`.
89
+ `RunController` subclasses, `MethodController` and `SequenceController`, generate MACROs related to runs,
90
+ such as triggering runs and returning data. The `DeviceController` subclasses are a new edition, allowing users to load
91
+ details about the injector, diode array detector, column/thermostat and pumps. The subclasses extending
92
+ `DeviceController` are in active development.
93
+
94
+ The `RunController` subclasses provide `pychemstation`'s main functionality. The `MethodController` triggers method runs for one sample, while the `SequenceController` can trigger a runf o
95
+ After a run is triggered, the `RunController` can either block until the HPLC is done the run or immediately return. If the user
96
+ chooses to return before the HPLC is done a run, they choose to check how much time is remaining for the run. After the
97
+ run, the `RunController` returns all the necessary file paths for further data processing. The UV chromatogram is returned per active channel, or for the entire
98
+ scanned spectrum. There is limited data processing functionality for the auto-generated report in the `ReportProcessor`
99
+ classes, thus other Python libraries are recommended for more in depth processing.
100
+
101
+ The `MethodController` edits the pump timetable while the `SequenceController` edits the sequence table. An example is
102
+ shown below. Various combinations of parameters and editing scenarios were tested to ensure the generated MACROs could
103
+ handle different types of parameter updates.
104
+
105
+ ![An example of a Method pump timetable](imgs/method%20timetable.png)
106
+ ![An example of a Sequence table](imgs/img.png)
107
+
108
+ A summary of available methods and functionality are shown in the tables below.
109
+
110
+ | Run Controller | Features |
111
+ |----------------|------------------------------------------------------------------------------------------------------------|
112
+ | Sequence | Switch, Load sequence details, Edit sequence table entries, Run sequence, Retrieve sequence run data files |
113
+ | Method | Switch, Load method timetable, Edit method timetable, Run method, Retrieve method run data files |
114
+
115
+ | Device Controller | Features |
116
+ |----------------------|-------------------------------------------------------------------------------------|
117
+ | Pump | Edit parameters (flow, pressure, organic modifier), solvent and waste bottle status |
118
+ | Diode Array Detector | Read and set active wavelengths |
119
+ | Injector | Change injection volume |
120
+ | Columns | Read active column, edit active column |
121
+
122
+ Thus, `pychemstation` provides both high-level and low-level control of an HPLC machine that uses Agilent's Chemstation
123
+ software. More information and use case examples can be found in
124
+ the [documentation](https://pychemstation-e5a086.gitlab.io/pychemstation.html).
125
+
126
+ # Acknowledgements
127
+
128
+ We acknowledge contributions from Wesley McNutt, Matthew Reish and Clark Zhang and funding support from AC, NSERC,
129
+ Canada
130
+ NRC,
131
+ CFFI (?).
132
+
133
+ # References
@@ -54,7 +54,7 @@ class CommunicationController(ABCCommunicationController):
54
54
  raise RuntimeError("Failed to get number.")
55
55
 
56
56
  def get_text_val(self, cmd: str) -> str:
57
- tries = 10
57
+ tries = 5
58
58
  for _ in range(tries):
59
59
  self.send(Command.GET_TEXT_VAL_CMD.value.format(cmd=cmd))
60
60
  res = self.receive()
@@ -5,12 +5,16 @@ import time
5
5
  import warnings
6
6
  from typing import Dict, List, Optional, Union, Tuple
7
7
 
8
- from result import Err, Ok, Result
8
+ from result import Err, Result, Ok
9
9
 
10
- from pychemstation.analysis.chromatogram import (
10
+ from ..devices.column import ColumnController
11
+ from ..devices.dad import DADController
12
+ from ..devices.pump import PumpController
13
+ from ..devices.sample_info import SampleInfo
14
+ from ....analysis.chromatogram import (
11
15
  TIME_FORMAT,
12
- AgilentChannelChromatogramData,
13
16
  AgilentHPLCChromatogram,
17
+ AgilentChannelChromatogramData,
14
18
  )
15
19
 
16
20
  from ....analysis.process_report import AgilentReport, ReportType
@@ -20,12 +24,13 @@ from ....utils.macro import Command
20
24
  from ....utils.method_types import (
21
25
  HPLCMethodParams,
22
26
  MethodDetails,
27
+ TimeTableEntry,
23
28
  Param,
24
29
  PType,
25
- TimeTableEntry,
26
30
  )
27
- from ....utils.table_types import RegisterFlag, T, Table, TableOperation
31
+ from ....utils.table_types import RegisterFlag, T, Table
28
32
  from ..devices.injector import InjectorController
33
+ from ....utils.tray_types import Tray
29
34
 
30
35
 
31
36
  class MethodController(RunController):
@@ -38,9 +43,17 @@ class MethodController(RunController):
38
43
  data_dirs: Optional[List[str]],
39
44
  table: Table,
40
45
  offline: bool,
41
- injector_controller: InjectorController,
46
+ injector: InjectorController,
47
+ pump: PumpController,
48
+ dad: DADController,
49
+ column: ColumnController,
50
+ sample_info: SampleInfo,
42
51
  ):
43
- self.injector_controller = injector_controller
52
+ self.injector = injector
53
+ self.pump = pump
54
+ self.dad = dad
55
+ self.column = column
56
+ self.sample_info = sample_info
44
57
  self.data_files: List[str] = []
45
58
  super().__init__(
46
59
  controller=controller,
@@ -50,6 +63,9 @@ class MethodController(RunController):
50
63
  offline=offline,
51
64
  )
52
65
 
66
+ def get_sample_location(self) -> Tray:
67
+ return self.sample_info.get_location()
68
+
53
69
  def get_current_method_name(self) -> str:
54
70
  self.sleepy_send(Command.GET_METHOD_CMD)
55
71
  res = self.receive()
@@ -60,18 +76,8 @@ class MethodController(RunController):
60
76
  def get_method_params(self) -> HPLCMethodParams:
61
77
  if self.controller:
62
78
  return HPLCMethodParams(
63
- organic_modifier=self.controller.get_num_val(
64
- cmd=TableOperation.GET_OBJ_HDR_VAL.value.format(
65
- register=self.table_locator.register,
66
- register_flag=RegisterFlag.SOLVENT_B_COMPOSITION,
67
- )
68
- ),
69
- flow=self.controller.get_num_val(
70
- cmd=TableOperation.GET_OBJ_HDR_VAL.value.format(
71
- register=self.table_locator.register,
72
- register_flag=RegisterFlag.FLOW,
73
- )
74
- ),
79
+ organic_modifier=self.get_om(),
80
+ flow=self.get_flow(),
75
81
  )
76
82
  raise ValueError("Communication controller is offline!")
77
83
 
@@ -135,26 +141,6 @@ class MethodController(RunController):
135
141
  method_name = res.ok_value.string_response
136
142
  return method_name
137
143
 
138
- def get_post_time(self) -> Union[int, float]:
139
- if self.controller:
140
- return self.controller.get_num_val(
141
- cmd=TableOperation.GET_OBJ_HDR_VAL.value.format(
142
- register=self.table_locator.register,
143
- register_flag=RegisterFlag.POST_TIME,
144
- )
145
- )
146
- raise ValueError("Communication controller is not online!")
147
-
148
- def get_stop_time(self) -> Union[int, float]:
149
- if self.controller:
150
- return self.controller.get_num_val(
151
- cmd=TableOperation.GET_OBJ_HDR_VAL.value.format(
152
- register=self.table_locator.register,
153
- register_flag=RegisterFlag.MAX_TIME,
154
- )
155
- )
156
- raise ValueError("Communication controller is not online!")
157
-
158
144
  def get_total_runtime(self) -> Union[int, float]:
159
145
  """Returns total method runtime in minutes."""
160
146
  return self.get_post_time() + self.get_stop_time()
@@ -214,20 +200,14 @@ class MethodController(RunController):
214
200
  self.edit_method_timetable(updated_method.timetable)
215
201
 
216
202
  if save:
217
- self.send(
218
- Command.SAVE_METHOD_CMD.value.format(
219
- commit_msg=f"saved method at {str(time.time())}"
220
- )
221
- )
203
+ self.save_method()
222
204
 
223
- def edit_initial_om(self, new_om: Union[int, float]):
224
- self._validate_organic_modifier(new_om)
225
- initial_organic_modifier: Param = Param(
226
- val=new_om,
227
- chemstation_key=RegisterFlag.SOLVENT_B_COMPOSITION,
228
- ptype=PType.NUM,
205
+ def save_method(self):
206
+ self.send(
207
+ Command.SAVE_METHOD_CMD.value.format(
208
+ commit_msg=f"saved method at {str(time.time())}"
209
+ )
229
210
  )
230
- self._update_param(initial_organic_modifier)
231
211
 
232
212
  def _validate_organic_modifier(self, new_om):
233
213
  if not (isinstance(new_om, int) or isinstance(new_om, float)):
@@ -237,13 +217,6 @@ class MethodController(RunController):
237
217
  if new_om > 100:
238
218
  raise ValueError("Organic modifer must be less than 100.")
239
219
 
240
- def edit_flow(self, new_flow: Union[int, float]):
241
- self._validate_flow(new_flow)
242
- flow: Param = Param(
243
- val=new_flow, chemstation_key=RegisterFlag.FLOW, ptype=PType.NUM
244
- )
245
- self._update_param(flow)
246
-
247
220
  def _validate_flow(self, new_flow):
248
221
  if not (isinstance(new_flow, int) or isinstance(new_flow, float)):
249
222
  raise ValueError("Flow must be int or float")
@@ -252,38 +225,12 @@ class MethodController(RunController):
252
225
  if new_flow >= 5.0:
253
226
  raise ValueError("Flow must be less than 5.0")
254
227
 
255
- def edit_stop_time(self, new_stop_time: Union[int, float]):
256
- self.validate_stop_time(new_stop_time)
257
- stop_time: Param = Param(
258
- val=new_stop_time,
259
- chemstation_key=RegisterFlag.MAX_TIME,
260
- ptype=PType.NUM,
261
- )
262
- self._update_param(
263
- Param(
264
- val="Set", chemstation_key=RegisterFlag.STOPTIME_MODE, ptype=PType.STR
265
- )
266
- )
267
- self._update_param(stop_time)
268
-
269
228
  def validate_stop_time(self, new_stop_time):
270
229
  if not (isinstance(new_stop_time, int) or isinstance(new_stop_time, float)):
271
230
  raise ValueError("Stop time must be int or float")
272
231
  if new_stop_time < 0:
273
232
  raise ValueError("Stop time must be positive")
274
233
 
275
- def edit_post_time(self, new_post_time: Union[int, float]):
276
- self.validate_post_time(new_post_time)
277
- post_time: Param = Param(
278
- val=new_post_time,
279
- chemstation_key=RegisterFlag.POST_TIME,
280
- ptype=PType.NUM,
281
- )
282
- self._update_param(
283
- Param(val="Set", chemstation_key=RegisterFlag.POSTIME_MODE, ptype=PType.STR)
284
- )
285
- self._update_param(post_time)
286
-
287
234
  def validate_post_time(self, new_post_time):
288
235
  if not (isinstance(new_post_time, int) or isinstance(new_post_time, float)):
289
236
  raise ValueError("Post time must be int or float")
@@ -298,59 +245,14 @@ class MethodController(RunController):
298
245
  new_post_time: Union[int, float] | None,
299
246
  ):
300
247
  self.delete_table()
301
- self.edit_initial_om(new_initial_om)
248
+ self._validate_flow(new_flow)
249
+ self.validate_post_time(new_post_time)
250
+ self._validate_organic_modifier(new_initial_om)
251
+ self.validate_stop_time(new_stop_time)
302
252
  self.edit_flow(new_flow)
303
- if new_stop_time:
304
- self.edit_stop_time(new_stop_time)
305
- else:
306
- self._update_param(
307
- Param(
308
- val="Off",
309
- chemstation_key=RegisterFlag.STOPTIME_MODE,
310
- ptype=PType.STR,
311
- )
312
- )
313
- if new_post_time:
314
- self.edit_post_time(new_post_time)
315
- else:
316
- self._update_param(
317
- Param(
318
- val="Off",
319
- chemstation_key=RegisterFlag.POSTIME_MODE,
320
- ptype=PType.STR,
321
- )
322
- )
323
-
324
- def _update_param(self, method_param: Param):
325
- """Change a method parameter, changes what is visibly seen in Chemstation GUI.
326
- (changes the first row in the timetable)
327
-
328
- :param method_param: a parameter to update for currently loaded method.
329
- """
330
- register = self.table_locator.register
331
- setting_command = (
332
- TableOperation.UPDATE_OBJ_HDR_VAL
333
- if method_param.ptype == PType.NUM
334
- else TableOperation.UPDATE_OBJ_HDR_TEXT
335
- )
336
- if isinstance(method_param.chemstation_key, list):
337
- for register_flag in method_param.chemstation_key:
338
- self.sleepy_send(
339
- setting_command.value.format(
340
- register=register,
341
- register_flag=register_flag,
342
- val=method_param.val,
343
- )
344
- )
345
- else:
346
- self.sleepy_send(
347
- setting_command.value.format(
348
- register=register,
349
- register_flag=method_param.chemstation_key,
350
- val=method_param.val,
351
- )
352
- )
353
- self.download()
253
+ self.edit_initial_om(new_initial_om)
254
+ self.edit_stop_time(new_stop_time)
255
+ self.edit_post_time(new_post_time)
354
256
 
355
257
  def download(self):
356
258
  self.sleepy_send("DownloadRCMethod PMP1")
@@ -585,3 +487,77 @@ class MethodController(RunController):
585
487
  Row {i + 1} ({timetable[i].start_time}) has a smaller or equal starttime than row {i} ({start_time})"""
586
488
  )
587
489
  self._validate_row(row)
490
+
491
+ def get_om(self):
492
+ return self._read_num_param(RegisterFlag.SOLVENT_B_COMPOSITION)
493
+
494
+ def get_flow(self):
495
+ return self._read_num_param(RegisterFlag.FLOW)
496
+
497
+ def get_post_time(self) -> Union[int, float]:
498
+ return self._read_num_param(RegisterFlag.POST_TIME)
499
+
500
+ def get_stop_time(self) -> Union[int, float]:
501
+ return self._read_num_param(RegisterFlag.MAX_TIME)
502
+
503
+ def edit_post_time(self, new_post_time: Optional[int | float]):
504
+ if new_post_time:
505
+ post_time: Param = Param(
506
+ val=new_post_time,
507
+ chemstation_key=RegisterFlag.POST_TIME,
508
+ ptype=PType.NUM,
509
+ )
510
+ self._update_param(
511
+ Param(
512
+ val="Set",
513
+ chemstation_key=RegisterFlag.POSTIME_MODE,
514
+ ptype=PType.STR,
515
+ )
516
+ )
517
+ self._update_param(post_time)
518
+ else:
519
+ self._update_param(
520
+ Param(
521
+ val="Off",
522
+ chemstation_key=RegisterFlag.POSTIME_MODE,
523
+ ptype=PType.STR,
524
+ )
525
+ )
526
+
527
+ def edit_stop_time(self, new_stop_time: Optional[int | float]):
528
+ if new_stop_time:
529
+ stop_time: Param = Param(
530
+ val=new_stop_time,
531
+ chemstation_key=RegisterFlag.MAX_TIME,
532
+ ptype=PType.NUM,
533
+ )
534
+ self._update_param(
535
+ Param(
536
+ val="Set",
537
+ chemstation_key=RegisterFlag.STOPTIME_MODE,
538
+ ptype=PType.STR,
539
+ )
540
+ )
541
+ self._update_param(stop_time)
542
+ else:
543
+ self._update_param(
544
+ Param(
545
+ val="Off",
546
+ chemstation_key=RegisterFlag.STOPTIME_MODE,
547
+ ptype=PType.STR,
548
+ )
549
+ )
550
+
551
+ def edit_flow(self, new_flow: Union[int, float]):
552
+ flow: Param = Param(
553
+ val=new_flow, chemstation_key=RegisterFlag.FLOW, ptype=PType.NUM
554
+ )
555
+ self._update_param(flow)
556
+
557
+ def edit_initial_om(self, new_om: Union[int, float]):
558
+ initial_organic_modifier: Param = Param(
559
+ val=new_om,
560
+ chemstation_key=RegisterFlag.SOLVENT_B_COMPOSITION,
561
+ ptype=PType.NUM,
562
+ )
563
+ self._update_param(initial_organic_modifier)