pyobs-core 2.0.0.dev93__tar.gz → 2.0.0.dev95__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 (449) hide show
  1. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/PKG-INFO +1 -1
  2. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/basevideo.py +14 -2
  3. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/robotic/mastermind.py +2 -0
  4. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/calibration/darkbias.py +9 -5
  5. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/calibration/pointing.py +5 -3
  6. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/calibration/skyflats.py +28 -12
  7. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/control/cases.py +6 -2
  8. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/control/conditional.py +7 -3
  9. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/control/parallel.py +7 -2
  10. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/control/selector.py +5 -3
  11. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/control/sequential.py +6 -2
  12. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/imaging/autofocus.py +12 -6
  13. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/imaging/imaging.py +57 -22
  14. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/script.py +3 -1
  15. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/utils/callmodule.py +6 -4
  16. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/utils/debugtrigger.py +3 -1
  17. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/utils/log.py +3 -1
  18. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/archive/archive.py +0 -2
  19. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/archive/local_archive.py +0 -2
  20. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -2
  21. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -2
  22. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -2
  23. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/priorities/archive.py +6 -7
  24. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -2
  25. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/priorities/const.py +5 -3
  26. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyproject.toml +1 -1
  27. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/.gitignore +0 -0
  28. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/LICENSE +0 -0
  29. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/__init__.py +0 -0
  30. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/application.py +0 -0
  31. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/background_task.py +0 -0
  32. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/cli/__init__.py +0 -0
  33. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/cli/_cli.py +0 -0
  34. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/cli/pyobs.py +0 -0
  35. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/cli/pyobsd.py +0 -0
  36. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/cli/pyobsw.py +0 -0
  37. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/__init__.py +0 -0
  38. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/comm.py +0 -0
  39. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/commlogging.py +0 -0
  40. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/dummy/__init__.py +0 -0
  41. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/dummy/dummycomm.py +0 -0
  42. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/local/__init__.py +0 -0
  43. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/local/localcomm.py +0 -0
  44. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/local/localnetwork.py +0 -0
  45. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/proxy.py +0 -0
  46. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/__init__.py +0 -0
  47. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/rpc.py +0 -0
  48. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/serializer.py +0 -0
  49. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
  50. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
  51. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
  52. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
  53. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
  54. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
  55. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
  56. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xmppclient.py +0 -0
  57. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/comm/xmpp/xmppcomm.py +0 -0
  58. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/__init__.py +0 -0
  59. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/badweather.py +0 -0
  60. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/event.py +0 -0
  61. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/exposurestatuschanged.py +0 -0
  62. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/filterchanged.py +0 -0
  63. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/focusfound.py +0 -0
  64. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/goodweather.py +0 -0
  65. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/log.py +0 -0
  66. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/modechanged.py +0 -0
  67. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/moduleclosed.py +0 -0
  68. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/moduleopened.py +0 -0
  69. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/motionstatuschanged.py +0 -0
  70. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/move.py +0 -0
  71. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/newimage.py +0 -0
  72. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/newspectrum.py +0 -0
  73. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/offsets.py +0 -0
  74. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/roofclosing.py +0 -0
  75. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/roofopened.py +0 -0
  76. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/taskfailed.py +0 -0
  77. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/taskfinished.py +0 -0
  78. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/taskstarted.py +0 -0
  79. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/events/testevent.py +0 -0
  80. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/__init__.py +0 -0
  81. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/image.py +0 -0
  82. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/meta/__init__.py +0 -0
  83. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/meta/altazoffsets.py +0 -0
  84. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/meta/exptime.py +0 -0
  85. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/meta/genericoffset.py +0 -0
  86. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/meta/onskydistance.py +0 -0
  87. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/meta/pixeloffsets.py +0 -0
  88. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/meta/radecoffsets.py +0 -0
  89. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/meta/skyoffsets.py +0 -0
  90. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processor.py +0 -0
  91. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/__init__.py +0 -0
  92. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/_daobackgroundremover.py +0 -0
  93. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/annotation/__init__.py +0 -0
  94. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/annotation/_pillow.py +0 -0
  95. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/annotation/circle.py +0 -0
  96. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/annotation/crosshair.py +0 -0
  97. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/annotation/text.py +0 -0
  98. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/astrometry/__init__.py +0 -0
  99. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
  100. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
  101. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
  102. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
  103. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/astrometry/astrometry.py +0 -0
  104. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/astrometry/dotnet.py +0 -0
  105. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/calibration/__init__.py +0 -0
  106. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
  107. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
  108. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/calibration/calibration.py +0 -0
  109. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/detection/__init__.py +0 -0
  110. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
  111. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/detection/_source_catalog.py +0 -0
  112. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/detection/daophot.py +0 -0
  113. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/detection/pysep.py +0 -0
  114. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/detection/simpledisk.py +0 -0
  115. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/detection/sourcedetection.py +0 -0
  116. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/exptime/__init__.py +0 -0
  117. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/exptime/exptime.py +0 -0
  118. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/exptime/star.py +0 -0
  119. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/__init__.py +0 -0
  120. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/addfitsheaders.py +0 -0
  121. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/download.py +0 -0
  122. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/flip.py +0 -0
  123. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/grayscale.py +0 -0
  124. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/httpserver.py +0 -0
  125. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/normalize.py +0 -0
  126. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/save.py +0 -0
  127. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/saveimage.py +0 -0
  128. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/smooth.py +0 -0
  129. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/image/softbin.py +0 -0
  130. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/misc/__init__.py +0 -0
  131. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/misc/addmask.py +0 -0
  132. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
  133. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/misc/circularmask.py +0 -0
  134. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/misc/createfilename.py +0 -0
  135. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
  136. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/misc/removebackground.py +0 -0
  137. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/modules/__init__.py +0 -0
  138. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
  139. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/__init__.py +0 -0
  140. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/astrometry.py +0 -0
  141. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/brighteststar.py +0 -0
  142. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
  143. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
  144. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
  145. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/fitsheader.py +0 -0
  146. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/offsets.py +0 -0
  147. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
  148. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/projected.py +0 -0
  149. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/offsets/spilled_light.py +0 -0
  150. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/photometry/__init__.py +0 -0
  151. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
  152. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
  153. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
  154. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
  155. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/photometry/photometry.py +0 -0
  156. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/photometry/photutil.py +0 -0
  157. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/photometry/pysep.py +0 -0
  158. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/wcs/__init__.py +0 -0
  159. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
  160. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IAbortable.py +0 -0
  161. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IAcquisition.py +0 -0
  162. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IAutoFocus.py +0 -0
  163. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IAutoGuiding.py +0 -0
  164. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IAutonomous.py +0 -0
  165. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IBinning.py +0 -0
  166. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ICalibrate.py +0 -0
  167. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ICamera.py +0 -0
  168. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IConfig.py +0 -0
  169. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ICooling.py +0 -0
  170. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IData.py +0 -0
  171. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IDataSequence.py +0 -0
  172. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IDome.py +0 -0
  173. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IExposure.py +0 -0
  174. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IExposureTime.py +0 -0
  175. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IFilters.py +0 -0
  176. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
  177. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
  178. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IFlatField.py +0 -0
  179. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IFocusModel.py +0 -0
  180. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IFocuser.py +0 -0
  181. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IGain.py +0 -0
  182. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IImageFormat.py +0 -0
  183. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IImageType.py +0 -0
  184. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IMode.py +0 -0
  185. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IModule.py +0 -0
  186. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IMotion.py +0 -0
  187. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IMultiFiber.py +0 -0
  188. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
  189. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
  190. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IPointingAltAz.py +0 -0
  191. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IPointingBody.py +0 -0
  192. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IPointingHeliocentricPolar.py +0 -0
  193. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IPointingHeliographicStonyhurst.py +0 -0
  194. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
  195. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IPointingOrbitalElements.py +0 -0
  196. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IPointingRaDec.py +0 -0
  197. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IPointingSeries.py +0 -0
  198. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IReady.py +0 -0
  199. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IRoof.py +0 -0
  200. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IRotation.py +0 -0
  201. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IRunnable.py +0 -0
  202. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IRunning.py +0 -0
  203. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IScriptRunner.py +0 -0
  204. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ISpectrograph.py +0 -0
  205. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IStartStop.py +0 -0
  206. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IStructuredConfig.py +0 -0
  207. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ISyncTarget.py +0 -0
  208. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ITelescope.py +0 -0
  209. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ITemperatures.py +0 -0
  210. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ITrackingMode.py +0 -0
  211. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/ITrackingRate.py +0 -0
  212. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IVideo.py +0 -0
  213. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IWeather.py +0 -0
  214. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/IWindow.py +0 -0
  215. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/__init__.py +0 -0
  216. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/interfaces/interface.py +0 -0
  217. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/__init__.py +0 -0
  218. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/camerasettings.py +0 -0
  219. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/fitsheader.py +0 -0
  220. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/fitsnamespace.py +0 -0
  221. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/follow.py +0 -0
  222. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/motionstatus.py +0 -0
  223. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/pipeline.py +0 -0
  224. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/waitformotion.py +0 -0
  225. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/mixins/weatheraware.py +0 -0
  226. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/__init__.py +0 -0
  227. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/__init__.py +0 -0
  228. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/adaptive.py +0 -0
  229. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/basecamera.py +0 -0
  230. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/basespectrograph.py +0 -0
  231. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/dummycamera.py +0 -0
  232. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/dummyspectrograph.py +0 -0
  233. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/dummyvideo.py +0 -0
  234. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/camera/pipelinecamera.py +0 -0
  235. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/flatfield/__init__.py +0 -0
  236. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/flatfield/flatfield.py +0 -0
  237. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/flatfield/pointing.py +0 -0
  238. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/flatfield/scheduler.py +0 -0
  239. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/focus/__init__.py +0 -0
  240. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/focus/dummyautofocus.py +0 -0
  241. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/focus/focusmodel.py +0 -0
  242. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/focus/focusseries.py +0 -0
  243. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/image/__init__.py +0 -0
  244. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/image/imagewatcher.py +0 -0
  245. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/image/imagewriter.py +0 -0
  246. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/image/pipeline.py +0 -0
  247. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/image/seeing.py +0 -0
  248. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/module.py +0 -0
  249. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/__init__.py +0 -0
  250. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/_base.py +0 -0
  251. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/_baseguiding.py +0 -0
  252. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/acquisition.py +0 -0
  253. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/autoguiding.py +0 -0
  254. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/dummyacquisition.py +0 -0
  255. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/dummyguiding.py +0 -0
  256. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
  257. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
  258. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
  259. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
  260. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
  261. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
  262. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/robotic/__init__.py +0 -0
  263. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/robotic/pointing.py +0 -0
  264. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/robotic/scheduler.py +0 -0
  265. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/robotic/scriptrunner.py +0 -0
  266. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/roof/__init__.py +0 -0
  267. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/roof/basedome.py +0 -0
  268. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/roof/baseroof.py +0 -0
  269. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/roof/dummyroof.py +0 -0
  270. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/telescope/__init__.py +0 -0
  271. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/telescope/_dummytelescopebase.py +0 -0
  272. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/telescope/basetelescope.py +0 -0
  273. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/telescope/dummyaltaztelescope.py +0 -0
  274. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/telescope/dummyradectelescope.py +0 -0
  275. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/telescope/dummysolartelescope.py +0 -0
  276. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/test/__init__.py +0 -0
  277. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/test/standalone.py +0 -0
  278. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/__init__.py +0 -0
  279. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/dummymode.py +0 -0
  280. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/fluentlogger.py +0 -0
  281. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/httpfilecache.py +0 -0
  282. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/kiosk.py +0 -0
  283. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/matrix.py +0 -0
  284. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/stellarium.py +0 -0
  285. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/telegram.py +0 -0
  286. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/utils/trigger.py +0 -0
  287. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/weather/__init__.py +0 -0
  288. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/weather/mockweather.py +0 -0
  289. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/weather/weather.py +0 -0
  290. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/weather/weather_api.py +0 -0
  291. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/modules/weather/weather_state.py +0 -0
  292. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/object.py +0 -0
  293. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/py.typed +0 -0
  294. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/__init__.py +0 -0
  295. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/observation.py +0 -0
  296. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/__init__.py +0 -0
  297. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/_executor.py +0 -0
  298. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
  299. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
  300. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
  301. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
  302. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +0 -0
  303. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +0 -0
  304. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +0 -0
  305. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
  306. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/dataprovider.py +0 -0
  307. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
  308. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
  309. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
  310. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/constant.py +0 -0
  311. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/follow.py +0 -0
  312. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/interval.py +0 -0
  313. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/merit.py +0 -0
  314. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
  315. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/random.py +0 -0
  316. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
  317. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/merits/transit.py +0 -0
  318. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/observationarchiveevolution.py +0 -0
  319. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/ondemandscheduler.py +0 -0
  320. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
  321. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
  322. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +0 -0
  323. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +0 -0
  324. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
  325. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
  326. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
  327. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
  328. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/targets/target.py +0 -0
  329. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
  330. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/__init__.py +0 -0
  331. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
  332. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/control/__init__.py +0 -0
  333. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/exceptions.py +0 -0
  334. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
  335. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
  336. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/scripts/utils/__init__.py +0 -0
  337. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/__init__.py +0 -0
  338. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/backend/__init__.py +0 -0
  339. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
  340. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
  341. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
  342. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
  343. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
  344. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/__init__.py +0 -0
  345. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/_portal.py +0 -0
  346. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
  347. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
  348. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/configdb.py +0 -0
  349. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
  350. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
  351. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
  352. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
  353. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
  354. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
  355. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/task.py +0 -0
  356. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
  357. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
  358. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/memory/__init__.py +0 -0
  359. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
  360. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
  361. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/observationarchive.py +0 -0
  362. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/storage/taskarchive.py +0 -0
  363. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/task.py +0 -0
  364. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/taskrunner.py +0 -0
  365. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/__init__.py +0 -0
  366. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/archive/__init__.py +0 -0
  367. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/exptime/__init__.py +0 -0
  368. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/exptime/exptime.py +0 -0
  369. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
  370. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
  371. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
  372. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
  373. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
  374. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
  375. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
  376. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/__init__.py +0 -0
  377. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/average.py +0 -0
  378. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/cache.py +0 -0
  379. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/config.py +0 -0
  380. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/config_schema.py +0 -0
  381. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/coordinates.py +0 -0
  382. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/curvefit.py +0 -0
  383. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/enums.py +0 -0
  384. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/exceptions.py +0 -0
  385. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/fits.py +0 -0
  386. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/focusseries/__init__.py +0 -0
  387. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/focusseries/base.py +0 -0
  388. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/focusseries/photometry.py +0 -0
  389. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/focusseries/projection.py +0 -0
  390. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/grids/__init__.py +0 -0
  391. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/grids/filters.py +0 -0
  392. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/grids/grid.py +0 -0
  393. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/grids/gridnode.py +0 -0
  394. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/grids/pipeline.py +0 -0
  395. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/__init__.py +0 -0
  396. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/camera/__init__.py +0 -0
  397. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/camera/binningwidget.py +0 -0
  398. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
  399. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/camera/exposewidget.py +0 -0
  400. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
  401. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
  402. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
  403. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
  404. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/http.py +0 -0
  405. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/influxdb.py +0 -0
  406. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/logger.py +0 -0
  407. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/logging/__init__.py +0 -0
  408. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/logging/context.py +0 -0
  409. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/logging/resolvableerror.py +0 -0
  410. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/modulegui.py +0 -0
  411. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/offsets/__init__.py +0 -0
  412. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
  413. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/offsets/applyoffsets.py +0 -0
  414. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
  415. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/parallel.py +0 -0
  416. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/pipeline/__init__.py +0 -0
  417. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/pipeline/pipeline.py +0 -0
  418. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/pipeline/progress.py +0 -0
  419. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/pipeline/reduction.py +0 -0
  420. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/pipeline/reduction_base.py +0 -0
  421. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/publisher/__init__.py +0 -0
  422. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/publisher/csv.py +0 -0
  423. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/publisher/http.py +0 -0
  424. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/publisher/log.py +0 -0
  425. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/publisher/multi.py +0 -0
  426. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/publisher/publisher.py +0 -0
  427. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/serialization.py +0 -0
  428. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/shellcommand.py +0 -0
  429. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/threads/__init__.py +0 -0
  430. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/threads/lockwithabort.py +0 -0
  431. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/time.py +0 -0
  432. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/units.py +0 -0
  433. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/utils/versions.py +0 -0
  434. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/version.py +0 -0
  435. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/__init__.py +0 -0
  436. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/archivefile.py +0 -0
  437. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/bufferedfile.py +0 -0
  438. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/file.py +0 -0
  439. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/filelists/__init__.py +0 -0
  440. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/filelists/filelist.py +0 -0
  441. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/filelists/testing.py +0 -0
  442. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/httpfile.py +0 -0
  443. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/localfile.py +0 -0
  444. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/memfile.py +0 -0
  445. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/sftpfile.py +0 -0
  446. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/smbfile.py +0 -0
  447. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/sshfile.py +0 -0
  448. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/tempfile.py +0 -0
  449. {pyobs_core-2.0.0.dev93 → pyobs_core-2.0.0.dev95}/pyobs/vfs/vfs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pyobs-core
3
- Version: 2.0.0.dev93
3
+ Version: 2.0.0.dev95
4
4
  Summary: robotic telescope software
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -154,6 +154,10 @@ class BaseVideo(Module, ImageFitsHeaderMixin, IVideo, IImageType, metaclass=ABCM
154
154
  self._image_requests: list[ImageRequest] = []
155
155
  self._next_image: NextImage | None = None
156
156
  self._last_image: LastImage | None = None
157
+ # lazy per-frame cache for raw_handler: the first of N simultaneous raw
158
+ # consumers to wake for a given frame computes (meta, frame) bytes and the
159
+ # rest reuse it, instead of each redoing the header build/JSON/copy (#769)
160
+ self._raw_frame_cache: tuple[int, bytes, bytes] | None = None
157
161
  self._last_time = 0.0
158
162
  self._flip = flip
159
163
  # 60s is a starting point, not measured -- trades off against _activate_camera()/
@@ -500,8 +504,16 @@ class BaseVideo(Module, ImageFitsHeaderMixin, IVideo, IImageType, metaclass=ABCM
500
504
  if last is None:
501
505
  continue
502
506
 
503
- # build frame bytes (JSON meta header + raw little-endian bytes)
504
- meta, frame = self._raw_frame(last.data, last.date_obs)
507
+ # build frame bytes (JSON meta header + raw little-endian bytes), reusing
508
+ # the cached result if another consumer already built this frame -- safe
509
+ # without a lock since _raw_frame() is synchronous, so no other task can
510
+ # interleave between the cache check and the store (#769)
511
+ cached = self._raw_frame_cache
512
+ if cached is not None and cached[0] == self._frame_num:
513
+ _, meta, frame = cached
514
+ else:
515
+ meta, frame = self._raw_frame(last.data, last.date_obs)
516
+ self._raw_frame_cache = (self._frame_num, meta, frame)
505
517
 
506
518
  # now send it!
507
519
  try:
@@ -253,6 +253,8 @@ class Mastermind(Module, IAutonomous, IFitsHeaderBefore):
253
253
  hdr = self._task.get_fits_headers()
254
254
  hdr["TASK"] = FitsHeaderEntry(self._task.name, "Name of task")
255
255
  hdr["REQNUM"] = FitsHeaderEntry(str(self._task.id), "Unique ID of task")
256
+ if self._task.project:
257
+ hdr["PROJECT"] = FitsHeaderEntry(self._task.project, "Project code")
256
258
  if self._obsnum is not None:
257
259
  hdr["OBSNUM"] = FitsHeaderEntry(self._obsnum, "Observation number (night-obsnum)")
258
260
  return hdr
@@ -1,7 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING
4
+ from typing import TYPE_CHECKING, Annotated
5
+
6
+ from pydantic import Field
5
7
 
6
8
  from pyobs.interfaces import (
7
9
  IBinning,
@@ -23,10 +25,12 @@ log = logging.getLogger(__name__)
23
25
  class DarkBiasScript(Script):
24
26
  """Script for running darks or biases."""
25
27
 
26
- camera: str
27
- count: int = 20
28
- exptime: float = 0
29
- binning: tuple[int, int] = (1, 1)
28
+ camera: Annotated[str, IData, IBinning, IWindow, IExposureTime, IImageType] = Field(
29
+ description="Name of the camera module to expose with."
30
+ )
31
+ count: int = Field(default=20, description="Number of exposures to take.")
32
+ exptime: float = Field(default=0, description="Exposure time in seconds. 0 takes a bias, anything else a dark.")
33
+ binning: tuple[int, int] = Field(default=(1, 1), description="Detector binning as (x, y).")
30
34
 
31
35
  async def can_run(self, data: TaskData | None) -> bool:
32
36
  """Whether this config can currently run.
@@ -1,7 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING
4
+ from typing import TYPE_CHECKING, Annotated
5
+
6
+ from pydantic import Field
5
7
 
6
8
  from pyobs.interfaces import IPointingAltAz, IReady
7
9
  from pyobs.robotic.scripts import Script
@@ -17,8 +19,8 @@ log = logging.getLogger(__name__)
17
19
  class PointingScript(Script):
18
20
  """Script for pointing the telescope for flats."""
19
21
 
20
- telescope: str
21
- pointing: SkyFlatsBasePointing
22
+ telescope: Annotated[str, IPointingAltAz, IReady] = Field(description="Name of the telescope module to point.")
23
+ pointing: SkyFlatsBasePointing = Field(description="Strategy used to compute the flat-field pointing.")
22
24
 
23
25
  async def can_run(self, data: TaskData | None) -> bool:
24
26
  """Whether this config can currently run.
@@ -1,7 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING
4
+ from typing import TYPE_CHECKING, Annotated
5
+
6
+ from pydantic import Field
5
7
 
6
8
  from pyobs.interfaces import IBinning, IFilters, IFlatField, IReady, IRoof, ITelescope
7
9
  from pyobs.robotic.scripts import Script
@@ -21,17 +23,31 @@ FlatFunctions = str | dict[str, str | dict[str, str]]
21
23
  class SkyFlatsScript(Script):
22
24
  """Script for scheduling and running skyflats using an IFlatField module."""
23
25
 
24
- roof: str
25
- telescope: str
26
- flatfield: str
27
- functions: FlatFunctions = {}
28
- priorities: SkyflatPriorities
29
- min_exptime: float = 0.5
30
- max_exptime: float = 5
31
- timespan: float = 7200
32
- filter_change: float = 30
33
- count: int = 20
34
- readout: dict[str, float] | None = None
26
+ roof: Annotated[str, IRoof] = Field(description="Name of the roof module, checked to be open before starting.")
27
+ telescope: Annotated[str, ITelescope] = Field(
28
+ description="Name of the telescope module, checked to be ready before starting."
29
+ )
30
+ flatfield: Annotated[str, IBinning, IFilters, IFlatField] = Field(
31
+ description="Name of the module that takes the flat-field exposures."
32
+ )
33
+ functions: FlatFunctions = Field(
34
+ default={},
35
+ description=(
36
+ "Exposure-time function(s) of solar altitude `h` in degrees, e.g. 'exp(-0.9*(h+3.9))'. "
37
+ "Either a single expression for all filters/binnings, a dict keyed by binning ('1x1') or "
38
+ "filter, or a nested dict of binning -> filter -> expression."
39
+ ),
40
+ )
41
+ priorities: SkyflatPriorities = Field(description="Strategy for prioritizing filter/binning combinations.")
42
+ min_exptime: float = Field(default=0.5, description="Minimum acceptable exposure time in seconds.")
43
+ max_exptime: float = Field(default=5, description="Maximum acceptable exposure time in seconds.")
44
+ timespan: float = Field(default=7200, description="Time span in seconds to schedule flats over.")
45
+ filter_change: float = Field(default=30, description="Estimated time in seconds to change a filter.")
46
+ count: int = Field(default=20, description="Number of exposures to take per filter/binning combination.")
47
+ readout: dict[str, float] | None = Field(
48
+ default=None,
49
+ description='Readout time in seconds per binning, keyed as "BxB" (e.g. "2x2"). Assumes 0s if unset.',
50
+ )
35
51
 
36
52
  async def can_run(self, data: TaskData | None) -> bool:
37
53
  """Whether this config can currently run.
@@ -4,6 +4,8 @@ import logging
4
4
  from datetime import UTC, datetime
5
5
  from typing import TYPE_CHECKING
6
6
 
7
+ from pydantic import Field
8
+
7
9
  if TYPE_CHECKING:
8
10
  from pyobs.robotic.task import TaskData
9
11
  from pyobs.utils.time import Time
@@ -16,8 +18,10 @@ log = logging.getLogger(__name__)
16
18
  class CasesRunner(Script):
17
19
  """Script for distinguishing cases."""
18
20
 
19
- expression: str
20
- cases: dict[str | int | float, Script]
21
+ expression: str = Field(description="Python expression to evaluate; its value selects which script to run.")
22
+ cases: dict[str | int | float, Script] = Field(
23
+ description='Scripts to run, keyed by the value of `expression`. Use key "else" for a fallback.'
24
+ )
21
25
 
22
26
  def __get_script(self) -> Script:
23
27
  # evaluate condition
@@ -4,6 +4,8 @@ import logging
4
4
  from datetime import UTC, datetime
5
5
  from typing import TYPE_CHECKING
6
6
 
7
+ from pydantic import Field
8
+
7
9
  if TYPE_CHECKING:
8
10
  from pyobs.robotic.task import TaskData
9
11
  from pyobs.utils.time import Time
@@ -16,9 +18,11 @@ log = logging.getLogger(__name__)
16
18
  class ConditionalRunner(Script):
17
19
  """Script for running an if condition."""
18
20
 
19
- condition: str
20
- true: Script
21
- false: Script | None = None
21
+ condition: str = Field(description="Python expression to evaluate; run `true` if truthy, `false` otherwise.")
22
+ true: Script = Field(description="Script to run if `condition` is truthy.")
23
+ false: Script | None = Field(
24
+ default=None, description="Script to run if `condition` is falsy. Does nothing if unset."
25
+ )
22
26
 
23
27
  def __get_script(self) -> Script | None:
24
28
  # evaluate condition
@@ -4,6 +4,8 @@ import asyncio
4
4
  import logging
5
5
  from typing import TYPE_CHECKING
6
6
 
7
+ from pydantic import Field
8
+
7
9
  if TYPE_CHECKING:
8
10
  from pyobs.robotic.task import TaskData
9
11
  from pyobs.utils.time import Time
@@ -22,8 +24,11 @@ async def _run_script(script: Script, data: TaskData | None) -> None:
22
24
  class ParallelRunner(Script):
23
25
  """Script for running other scripts in parallel."""
24
26
 
25
- scripts: list[Script]
26
- check_all_can_run: bool = True
27
+ scripts: list[Script] = Field(description="Scripts to run concurrently.")
28
+ check_all_can_run: bool = Field(
29
+ default=True,
30
+ description="If set, all scripts must be able to run for this script to run; otherwise, any one suffices.",
31
+ )
27
32
 
28
33
  async def can_run(self, data: TaskData | None) -> bool:
29
34
  results = [await s.can_run(data) for s in self.scripts]
@@ -1,7 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING
4
+ from typing import TYPE_CHECKING, Annotated
5
+
6
+ from pydantic import Field
5
7
 
6
8
  from pyobs.interfaces import IMotion
7
9
  from pyobs.interfaces.IMode import IMode
@@ -18,8 +20,8 @@ log = logging.getLogger(__name__)
18
20
  class SelectorScript(Script):
19
21
  """Script for running Mode Selection."""
20
22
 
21
- mode: str
22
- selector: str
23
+ mode: str = Field(description="Name of the mode to select.")
24
+ selector: Annotated[str, IMode, IMotion] = Field(description="Name of the mode-selection module.")
23
25
 
24
26
  async def can_run(self, data: TaskData | None) -> bool:
25
27
  """Whether this config can currently run.
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING
5
5
 
6
6
  import astropy.units as u
7
7
  from astropy.time import TimeDelta
8
+ from pydantic import Field
8
9
 
9
10
  if TYPE_CHECKING:
10
11
  from pyobs.robotic.task import TaskData
@@ -17,8 +18,11 @@ log = logging.getLogger(__name__)
17
18
  class SequentialRunner(Script):
18
19
  """Script for running a sequence of other scripts."""
19
20
 
20
- scripts: list[Script]
21
- check_all_can_run: bool = True
21
+ scripts: list[Script] = Field(description="Scripts to run in sequence, each only if it can run.")
22
+ check_all_can_run: bool = Field(
23
+ default=True,
24
+ description="If set, all scripts must be able to run for this script to run; otherwise, only the first must.",
25
+ )
22
26
 
23
27
  async def can_run(self, data: TaskData | None) -> bool:
24
28
  if self.check_all_can_run:
@@ -1,7 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import logging
4
- from typing import TYPE_CHECKING
4
+ from typing import TYPE_CHECKING, Annotated
5
+
6
+ from pydantic import Field
5
7
 
6
8
  from pyobs.interfaces import IAutoFocus, IMotion, IPointingRaDec, IReady, ITelescope
7
9
  from pyobs.robotic.scripts import Script
@@ -16,11 +18,15 @@ log = logging.getLogger(__name__)
16
18
  class AutoFocusScript(Script):
17
19
  """Script for running autofocus series."""
18
20
 
19
- autofocus: str = "autofocus"
20
- telescope: str = "telescope"
21
- count: int = 5
22
- step: float = 0.1
23
- exposure_time: float = 2.0
21
+ autofocus: Annotated[str, IAutoFocus] = Field(
22
+ default="autofocus", description="Name of the auto-focus module to run the series with."
23
+ )
24
+ telescope: Annotated[str, ITelescope, IPointingRaDec] = Field(
25
+ default="telescope", description="Name of the telescope module, moved to the target and stopped afterwards."
26
+ )
27
+ count: int = Field(default=5, description="Number of focus steps to take in the series.")
28
+ step: float = Field(default=0.1, description="Focus step size.")
29
+ exposure_time: float = Field(default=2.0, description="Exposure time in seconds for each focus step.")
24
30
 
25
31
  async def can_run(self, data: TaskData | None) -> bool:
26
32
  """Whether this config can currently run.
@@ -2,7 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  import logging
5
- from typing import TYPE_CHECKING, Any
5
+ from typing import TYPE_CHECKING, Annotated, Any
6
6
 
7
7
  from pydantic import BaseModel, ConfigDict, Field, PrivateAttr
8
8
 
@@ -38,26 +38,42 @@ log = logging.getLogger(__name__)
38
38
  class AcquisitionConfig(BaseModel):
39
39
  model_config = ConfigDict(extra="forbid")
40
40
 
41
- enabled: bool = True
42
- optional: bool = False
41
+ enabled: bool = Field(
42
+ default=True, description="Whether to perform acquisition before starting this configuration."
43
+ )
44
+ optional: bool = Field(
45
+ default=False, description="If acquisition fails, continue without it instead of aborting the script."
46
+ )
43
47
 
44
48
 
45
49
  class GuidingConfig(BaseModel):
46
50
  model_config = ConfigDict(extra="forbid")
47
51
 
48
- enabled: bool = True
49
- optional: bool = False
52
+ enabled: bool = Field(default=True, description="Whether to start auto-guiding before starting this configuration.")
53
+ optional: bool = Field(
54
+ default=False, description="If starting auto-guiding fails, continue without it instead of aborting the script."
55
+ )
50
56
 
51
57
 
52
58
  class InstrumentConfig(BaseModel):
53
59
  model_config = ConfigDict(extra="forbid")
54
60
 
55
- exposure_time: float | ExposureTimeProvider = 0.0
56
- count: int = 1
57
- image_type: ImageType = ImageType.OBJECT
58
- binning: tuple[int, int] = (1, 1)
59
- window: tuple[int, int, int, int] | None = None
60
- optical_filter: str | None = None
61
+ exposure_time: float | ExposureTimeProvider = Field(
62
+ default=0.0, description="Exposure time in seconds, or a provider that computes it dynamically."
63
+ )
64
+ count: int = Field(default=1, description="Number of exposures to take with this configuration.")
65
+ image_type: ImageType = Field(
66
+ default=ImageType.OBJECT,
67
+ description="Type of image to take: OBJECT (science), BIAS, DARK, SKYFLAT, FOCUS, ACQUISITION, or GUIDING.",
68
+ )
69
+ binning: tuple[int, int] = Field(default=(1, 1), description="Detector binning as (x, y).")
70
+ window: tuple[int, int, int, int] | None = Field(
71
+ default=None,
72
+ description="Detector sub-window as (left, top, width, height). Uses the full frame if unset.",
73
+ )
74
+ optical_filter: str | None = Field(
75
+ default=None, description="Name of the filter to use. Uses the camera's current filter if unset."
76
+ )
61
77
 
62
78
  async def get_exposure_time(self) -> float:
63
79
  """Return the exposure time, computing it dynamically if needed."""
@@ -69,22 +85,41 @@ class InstrumentConfig(BaseModel):
69
85
  class Configuration(BaseModel):
70
86
  model_config = ConfigDict(extra="forbid")
71
87
 
72
- acquisition_config: AcquisitionConfig = Field(default_factory=AcquisitionConfig)
73
- guiding_config: GuidingConfig = Field(default_factory=GuidingConfig)
74
- instrument_configs: list[InstrumentConfig] = Field(default_factory=lambda: [InstrumentConfig()])
75
- repeats: int = 1
88
+ acquisition_config: AcquisitionConfig = Field(
89
+ default_factory=AcquisitionConfig, description="Settings for acquiring the target before exposing."
90
+ )
91
+ guiding_config: GuidingConfig = Field(
92
+ default_factory=GuidingConfig, description="Settings for auto-guiding while exposing."
93
+ )
94
+ instrument_configs: list[InstrumentConfig] = Field(
95
+ default_factory=lambda: [InstrumentConfig()],
96
+ description="Sequence of instrument configurations to run, in order, once per repeat.",
97
+ )
98
+ repeats: int = Field(
99
+ default=1, description="Number of times to repeat the full sequence of instrument configurations."
100
+ )
76
101
 
77
102
 
78
103
  class ImagingScript(Script):
79
104
  """Default script for imaging configs."""
80
105
 
81
- configuration: Configuration = Field(default_factory=Configuration)
82
-
83
- camera: str
84
- telescope: str | None = None
85
- filters: str | None = None
86
- autoguider: str | None = None
87
- acquisition: str | None = None
106
+ configuration: Configuration = Field(default_factory=Configuration, description="What to expose and how.")
107
+
108
+ camera: Annotated[str, ICamera, IBinning, IWindow, IExposureTime, IImageType] = Field(
109
+ description="Name of the camera module to expose with."
110
+ )
111
+ telescope: Annotated[str | None, ITelescope, IPointingRaDec] = Field(
112
+ default=None, description="Name of the telescope module to point at the target. Required for OBJECT exposures."
113
+ )
114
+ filters: Annotated[str | None, IFilters] = Field(
115
+ default=None, description="Name of the filter wheel module. Required if any instrument config sets a filter."
116
+ )
117
+ autoguider: Annotated[str | None, IAutoGuiding] = Field(
118
+ default=None, description="Name of the auto-guiding module. Required if guiding is enabled."
119
+ )
120
+ acquisition: Annotated[str | None, IAcquisition] = Field(
121
+ default=None, description="Name of the acquisition module. Required if acquisition is enabled."
122
+ )
88
123
 
89
124
  _object_name: str | None = PrivateAttr(default=None)
90
125
 
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
  import logging
4
4
  from typing import TYPE_CHECKING
5
5
 
6
+ from pydantic import Field
7
+
6
8
  from pyobs.interfaces import FitsHeaderEntry
7
9
  from pyobs.utils.serialization import PolymorphicBaseModel
8
10
  from pyobs.utils.time import Time
@@ -14,7 +16,7 @@ log = logging.getLogger(__name__)
14
16
 
15
17
 
16
18
  class Script(PolymorphicBaseModel):
17
- exptime_done: float = 0.0
19
+ exptime_done: float = Field(default=0.0, description="Exposure time accumulated so far while running this script.")
18
20
 
19
21
  _cant_run_reason: str | None = None
20
22
 
@@ -41,10 +41,12 @@ def _build_params_model(method, provided_keys):
41
41
  class CallModuleScript(Script):
42
42
  """Script for calling a method on a module."""
43
43
 
44
- module: str
45
- interface: str
46
- method: str
47
- params: dict[str, str | int | float] = Field(default_factory=dict)
44
+ module: str = Field(description="Name of the module to call the method on.")
45
+ interface: str = Field(description="Full class path of the interface that declares `method`.")
46
+ method: str = Field(description="Name of the method to call.")
47
+ params: dict[str, str | int | float] = Field(
48
+ default_factory=dict, description="Keyword arguments to pass to the method, validated against its signature."
49
+ )
48
50
 
49
51
  @model_validator(mode="after")
50
52
  def _validate_params(self) -> CallModuleScript:
@@ -3,6 +3,8 @@ from __future__ import annotations
3
3
  import logging
4
4
  from typing import TYPE_CHECKING
5
5
 
6
+ from pydantic import Field
7
+
6
8
  if TYPE_CHECKING:
7
9
  from pyobs.robotic.task import TaskData
8
10
  from pyobs.robotic.scripts import Script
@@ -13,7 +15,7 @@ log = logging.getLogger(__name__)
13
15
  class DebugTriggerScript(Script):
14
16
  """Script for a debug trigger."""
15
17
 
16
- triggered: bool = False
18
+ triggered: bool = Field(default=False, description="Set to True once this script has run.")
17
19
 
18
20
  async def can_run(self, data: TaskData | None) -> bool:
19
21
  return True
@@ -4,6 +4,8 @@ import logging
4
4
  from datetime import UTC, datetime
5
5
  from typing import TYPE_CHECKING
6
6
 
7
+ from pydantic import Field
8
+
7
9
  if TYPE_CHECKING:
8
10
  from pyobs.robotic.task import TaskData
9
11
  from pyobs.robotic.scripts import Script
@@ -14,7 +16,7 @@ log = logging.getLogger(__name__)
14
16
  class LogScript(Script):
15
17
  """Script for logging something."""
16
18
 
17
- expression: str
19
+ expression: str = Field(description="Python expression to evaluate and log the value of.")
18
20
 
19
21
  async def can_run(self, data: TaskData | None) -> bool:
20
22
  return True
@@ -25,8 +25,6 @@ class FrameInfo:
25
25
  class Archive(PolymorphicBaseModel, metaclass=ABCMeta):
26
26
  """Base class for image archives."""
27
27
 
28
- __module__ = "pyobs.utils.archive"
29
-
30
28
  model_config = {"arbitrary_types_allowed": True}
31
29
 
32
30
  @abstractmethod
@@ -19,8 +19,6 @@ log = logging.getLogger(__name__)
19
19
  class LocalArchive(Archive):
20
20
  """Connector class to a local image archive."""
21
21
 
22
- __module__ = "pyobs.utils.archive"
23
-
24
22
  root: str
25
23
 
26
24
  _root_path: Path = PrivateAttr()
@@ -41,8 +41,6 @@ class PyobsArchiveFrameInfo(FrameInfo):
41
41
  class PyobsArchive(Archive):
42
42
  """Connector class to running pyobs-archive instance."""
43
43
 
44
- __module__ = "pyobs.utils.archive"
45
-
46
44
  url: str
47
45
  token: str
48
46
  proxies: dict[str, str] | None = None
@@ -7,8 +7,6 @@ from pyobs.utils.serialization import PolymorphicBaseModel
7
7
  class SkyFlatsBasePointing(PolymorphicBaseModel, metaclass=ABCMeta):
8
8
  """Base class for flat pointings."""
9
9
 
10
- __module__ = "pyobs.utils.skyflats.pointing"
11
-
12
10
  @abstractmethod
13
11
  async def __call__(self, telescope: IPointingAltAz) -> None:
14
12
  """Move telescope.
@@ -16,8 +16,6 @@ log = logging.getLogger(__name__)
16
16
  class SkyFlatsStaticPointing(SkyFlatsBasePointing):
17
17
  """Static flat pointing."""
18
18
 
19
- __module__ = "pyobs.utils.skyflats.pointing"
20
-
21
19
  _initialized: bool = False
22
20
 
23
21
  @model_validator(mode="after")
@@ -1,5 +1,6 @@
1
1
  import astropy.units as u
2
2
  from astropy.time import TimeDelta
3
+ from pydantic import Field
3
4
 
4
5
  from pyobs.robotic.utils.archive import Archive
5
6
  from pyobs.utils.enums import ImageType
@@ -11,13 +12,11 @@ from .base import SkyflatPriorities
11
12
  class ArchiveSkyflatPriorities(SkyflatPriorities):
12
13
  """Calculate flat priorities from an archive."""
13
14
 
14
- __module__ = "pyobs.utils.skyflats.priorities"
15
-
16
- archive: Archive
17
- site: str
18
- instrument: str
19
- filter_names: list[str]
20
- binnings: list[int]
15
+ archive: Archive = Field(description="Archive to query for the timestamp of the last flat per filter/binning.")
16
+ site: str = Field(description="Site code to filter archive frames by.")
17
+ instrument: str = Field(description="Instrument code to filter archive frames by.")
18
+ filter_names: list[str] = Field(description="Filters to compute priorities for.")
19
+ binnings: list[int] = Field(description="Binnings (as N for NxN) to compute priorities for.")
21
20
 
22
21
  model_config = {"arbitrary_types_allowed": True}
23
22
 
@@ -6,8 +6,6 @@ from pyobs.utils.serialization import PolymorphicBaseModel
6
6
  class SkyflatPriorities(PolymorphicBaseModel, metaclass=ABCMeta):
7
7
  """Base class for sky flat priorities."""
8
8
 
9
- __module__ = "pyobs.utils.skyflats.priorities"
10
-
11
9
  @abstractmethod
12
10
  async def __call__(self) -> dict[tuple[str, tuple[int, int]], float]: ...
13
11
 
@@ -1,12 +1,14 @@
1
+ from pydantic import Field
2
+
1
3
  from .base import SkyflatPriorities
2
4
 
3
5
 
4
6
  class ConstSkyflatPriorities(SkyflatPriorities):
5
7
  """Constant flat priorities."""
6
8
 
7
- __module__ = "pyobs.utils.skyflats.priorities"
8
-
9
- priorities: dict[tuple[str, tuple[int, int]], float]
9
+ priorities: dict[tuple[str, tuple[int, int]], float] = Field(
10
+ description="Fixed priority per (filter, binning) combination."
11
+ )
10
12
 
11
13
  async def __call__(self) -> dict[tuple[str, tuple[int, int]], float]:
12
14
  return self.priorities
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyobs-core"
3
- version = "2.0.0.dev93"
3
+ version = "2.0.0.dev95"
4
4
  description = "robotic telescope software"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11"