pyobs-core 2.0.0.dev64__tar.gz → 2.0.0.dev66__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 (447) hide show
  1. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/PKG-INFO +1 -1
  2. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/application.py +1 -1
  3. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/mastermind.py +10 -3
  4. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +1 -1
  5. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +4 -3
  6. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +3 -2
  7. pyobs_core-2.0.0.dev66/pyobs/robotic/scheduler/dataprovider.py +49 -0
  8. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/observationarchiveevolution.py +9 -2
  9. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/ondemandscheduler.py +7 -8
  10. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyproject.toml +1 -1
  11. pyobs_core-2.0.0.dev64/pyobs/robotic/scheduler/_executor.py +0 -28
  12. pyobs_core-2.0.0.dev64/pyobs/robotic/scheduler/dataprovider.py +0 -78
  13. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/.gitignore +0 -0
  14. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/LICENSE +0 -0
  15. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/__init__.py +0 -0
  16. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/background_task.py +0 -0
  17. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/__init__.py +0 -0
  18. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/_cli.py +0 -0
  19. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/pyobs.py +0 -0
  20. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/pyobsd.py +0 -0
  21. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/pyobsw.py +0 -0
  22. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/__init__.py +0 -0
  23. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/comm.py +0 -0
  24. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/commlogging.py +0 -0
  25. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/dummy/__init__.py +0 -0
  26. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/dummy/dummycomm.py +0 -0
  27. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/local/__init__.py +0 -0
  28. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/local/localcomm.py +0 -0
  29. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/local/localnetwork.py +0 -0
  30. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/proxy.py +0 -0
  31. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/__init__.py +0 -0
  32. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/rpc.py +0 -0
  33. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/serializer.py +0 -0
  34. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
  35. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
  36. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
  37. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
  38. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
  39. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
  40. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
  41. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xmppclient.py +0 -0
  42. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xmppcomm.py +0 -0
  43. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/__init__.py +0 -0
  44. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/badweather.py +0 -0
  45. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/event.py +0 -0
  46. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/exposurestatuschanged.py +0 -0
  47. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/filterchanged.py +0 -0
  48. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/focusfound.py +0 -0
  49. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/goodweather.py +0 -0
  50. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/log.py +0 -0
  51. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/modechanged.py +0 -0
  52. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/moduleclosed.py +0 -0
  53. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/moduleopened.py +0 -0
  54. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/motionstatuschanged.py +0 -0
  55. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/move.py +0 -0
  56. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/newimage.py +0 -0
  57. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/newspectrum.py +0 -0
  58. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/offsets.py +0 -0
  59. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/roofclosing.py +0 -0
  60. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/roofopened.py +0 -0
  61. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/taskfailed.py +0 -0
  62. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/taskfinished.py +0 -0
  63. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/taskstarted.py +0 -0
  64. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/testevent.py +0 -0
  65. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/__init__.py +0 -0
  66. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/image.py +0 -0
  67. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/__init__.py +0 -0
  68. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/altazoffsets.py +0 -0
  69. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/exptime.py +0 -0
  70. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/genericoffset.py +0 -0
  71. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/onskydistance.py +0 -0
  72. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/pixeloffsets.py +0 -0
  73. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/radecoffsets.py +0 -0
  74. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/skyoffsets.py +0 -0
  75. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processor.py +0 -0
  76. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/__init__.py +0 -0
  77. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/_daobackgroundremover.py +0 -0
  78. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/__init__.py +0 -0
  79. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/_pillow.py +0 -0
  80. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/circle.py +0 -0
  81. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/crosshair.py +0 -0
  82. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/text.py +0 -0
  83. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/__init__.py +0 -0
  84. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
  85. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
  86. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
  87. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
  88. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/astrometry.py +0 -0
  89. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/dotnet.py +0 -0
  90. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/__init__.py +0 -0
  91. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
  92. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
  93. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/calibration.py +0 -0
  94. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/__init__.py +0 -0
  95. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
  96. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/_source_catalog.py +0 -0
  97. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/daophot.py +0 -0
  98. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/pysep.py +0 -0
  99. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/simpledisk.py +0 -0
  100. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/sourcedetection.py +0 -0
  101. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/exptime/__init__.py +0 -0
  102. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/exptime/exptime.py +0 -0
  103. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/exptime/star.py +0 -0
  104. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/__init__.py +0 -0
  105. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/addfitsheaders.py +0 -0
  106. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/download.py +0 -0
  107. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/flip.py +0 -0
  108. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/grayscale.py +0 -0
  109. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/httpserver.py +0 -0
  110. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/normalize.py +0 -0
  111. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/save.py +0 -0
  112. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/saveimage.py +0 -0
  113. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/smooth.py +0 -0
  114. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/softbin.py +0 -0
  115. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/__init__.py +0 -0
  116. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/addmask.py +0 -0
  117. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
  118. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/circularmask.py +0 -0
  119. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/createfilename.py +0 -0
  120. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
  121. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/removebackground.py +0 -0
  122. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/modules/__init__.py +0 -0
  123. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
  124. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/__init__.py +0 -0
  125. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/astrometry.py +0 -0
  126. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/brighteststar.py +0 -0
  127. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
  128. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
  129. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
  130. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/fitsheader.py +0 -0
  131. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/offsets.py +0 -0
  132. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
  133. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/projected.py +0 -0
  134. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/spilled_light.py +0 -0
  135. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/__init__.py +0 -0
  136. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
  137. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
  138. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
  139. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
  140. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/photometry.py +0 -0
  141. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/photutil.py +0 -0
  142. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/pysep.py +0 -0
  143. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/wcs/__init__.py +0 -0
  144. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
  145. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAbortable.py +0 -0
  146. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAcquisition.py +0 -0
  147. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAutoFocus.py +0 -0
  148. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAutoGuiding.py +0 -0
  149. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAutonomous.py +0 -0
  150. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IBinning.py +0 -0
  151. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ICalibrate.py +0 -0
  152. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ICamera.py +0 -0
  153. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IConfig.py +0 -0
  154. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ICooling.py +0 -0
  155. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IData.py +0 -0
  156. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IDataSequence.py +0 -0
  157. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IDome.py +0 -0
  158. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IExposure.py +0 -0
  159. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IExposureTime.py +0 -0
  160. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFilters.py +0 -0
  161. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
  162. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
  163. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFlatField.py +0 -0
  164. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFocusModel.py +0 -0
  165. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFocuser.py +0 -0
  166. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IGain.py +0 -0
  167. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IImageFormat.py +0 -0
  168. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IImageType.py +0 -0
  169. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IMode.py +0 -0
  170. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IModule.py +0 -0
  171. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IMotion.py +0 -0
  172. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IMultiFiber.py +0 -0
  173. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
  174. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
  175. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingAltAz.py +0 -0
  176. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingBody.py +0 -0
  177. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingHeliocentricPolar.py +0 -0
  178. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingHeliographicStonyhurst.py +0 -0
  179. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
  180. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingOrbitalElements.py +0 -0
  181. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingRaDec.py +0 -0
  182. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingSeries.py +0 -0
  183. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IReady.py +0 -0
  184. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IRoof.py +0 -0
  185. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IRotation.py +0 -0
  186. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IRunnable.py +0 -0
  187. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IRunning.py +0 -0
  188. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IScriptRunner.py +0 -0
  189. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ISpectrograph.py +0 -0
  190. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IStartStop.py +0 -0
  191. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IStructuredConfig.py +0 -0
  192. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ISyncTarget.py +0 -0
  193. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ITelescope.py +0 -0
  194. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ITemperatures.py +0 -0
  195. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ITrackingMode.py +0 -0
  196. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ITrackingRate.py +0 -0
  197. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IVideo.py +0 -0
  198. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IWeather.py +0 -0
  199. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IWindow.py +0 -0
  200. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/__init__.py +0 -0
  201. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/interface.py +0 -0
  202. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/__init__.py +0 -0
  203. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/camerasettings.py +0 -0
  204. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/fitsheader.py +0 -0
  205. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/fitsnamespace.py +0 -0
  206. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/follow.py +0 -0
  207. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/motionstatus.py +0 -0
  208. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/pipeline.py +0 -0
  209. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/waitformotion.py +0 -0
  210. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/weatheraware.py +0 -0
  211. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/__init__.py +0 -0
  212. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/__init__.py +0 -0
  213. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/adaptive.py +0 -0
  214. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/basecamera.py +0 -0
  215. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/basespectrograph.py +0 -0
  216. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/basevideo.py +0 -0
  217. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/dummycamera.py +0 -0
  218. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/dummyspectrograph.py +0 -0
  219. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/dummyvideo.py +0 -0
  220. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/pipelinecamera.py +0 -0
  221. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/flatfield/__init__.py +0 -0
  222. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/flatfield/flatfield.py +0 -0
  223. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/flatfield/pointing.py +0 -0
  224. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/flatfield/scheduler.py +0 -0
  225. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/focus/__init__.py +0 -0
  226. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/focus/dummyautofocus.py +0 -0
  227. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/focus/focusmodel.py +0 -0
  228. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/focus/focusseries.py +0 -0
  229. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/__init__.py +0 -0
  230. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/imagewatcher.py +0 -0
  231. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/imagewriter.py +0 -0
  232. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/pipeline.py +0 -0
  233. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/seeing.py +0 -0
  234. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/module.py +0 -0
  235. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/__init__.py +0 -0
  236. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/_base.py +0 -0
  237. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/_baseguiding.py +0 -0
  238. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/acquisition.py +0 -0
  239. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/autoguiding.py +0 -0
  240. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/dummyacquisition.py +0 -0
  241. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/dummyguiding.py +0 -0
  242. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
  243. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
  244. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
  245. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
  246. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
  247. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
  248. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/__init__.py +0 -0
  249. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/pointing.py +0 -0
  250. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/scheduler.py +0 -0
  251. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/scriptrunner.py +0 -0
  252. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/roof/__init__.py +0 -0
  253. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/roof/basedome.py +0 -0
  254. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/roof/baseroof.py +0 -0
  255. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/roof/dummyroof.py +0 -0
  256. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/__init__.py +0 -0
  257. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/_dummytelescopebase.py +0 -0
  258. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/basetelescope.py +0 -0
  259. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/dummyaltaztelescope.py +0 -0
  260. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/dummyradectelescope.py +0 -0
  261. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/dummysolartelescope.py +0 -0
  262. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/test/__init__.py +0 -0
  263. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/test/standalone.py +0 -0
  264. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/__init__.py +0 -0
  265. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/dummymode.py +0 -0
  266. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/fluentlogger.py +0 -0
  267. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/httpfilecache.py +0 -0
  268. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/kiosk.py +0 -0
  269. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/matrix.py +0 -0
  270. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/stellarium.py +0 -0
  271. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/telegram.py +0 -0
  272. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/trigger.py +0 -0
  273. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/__init__.py +0 -0
  274. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/mockweather.py +0 -0
  275. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/weather.py +0 -0
  276. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/weather_api.py +0 -0
  277. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/weather_state.py +0 -0
  278. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/object.py +0 -0
  279. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/py.typed +0 -0
  280. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/__init__.py +0 -0
  281. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/observation.py +0 -0
  282. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/__init__.py +0 -0
  283. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
  284. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
  285. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
  286. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
  287. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
  288. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
  289. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
  290. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
  291. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/constant.py +0 -0
  292. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/follow.py +0 -0
  293. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/interval.py +0 -0
  294. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/merit.py +0 -0
  295. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
  296. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/random.py +0 -0
  297. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
  298. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/transit.py +0 -0
  299. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
  300. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
  301. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +0 -0
  302. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +0 -0
  303. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
  304. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
  305. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
  306. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
  307. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/target.py +0 -0
  308. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
  309. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/__init__.py +0 -0
  310. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
  311. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
  312. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
  313. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
  314. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/__init__.py +0 -0
  315. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/cases.py +0 -0
  316. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/conditional.py +0 -0
  317. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/parallel.py +0 -0
  318. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/selector.py +0 -0
  319. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/sequential.py +0 -0
  320. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/exceptions.py +0 -0
  321. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
  322. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
  323. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
  324. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
  325. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/script.py +0 -0
  326. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/utils/__init__.py +0 -0
  327. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
  328. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
  329. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/utils/log.py +0 -0
  330. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/__init__.py +0 -0
  331. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/backend/__init__.py +0 -0
  332. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
  333. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
  334. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
  335. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
  336. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
  337. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/__init__.py +0 -0
  338. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/_portal.py +0 -0
  339. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
  340. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
  341. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/configdb.py +0 -0
  342. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
  343. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
  344. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
  345. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
  346. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
  347. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
  348. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/task.py +0 -0
  349. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
  350. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
  351. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/memory/__init__.py +0 -0
  352. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
  353. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
  354. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/observationarchive.py +0 -0
  355. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/taskarchive.py +0 -0
  356. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/task.py +0 -0
  357. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/taskrunner.py +0 -0
  358. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/__init__.py +0 -0
  359. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/archive/__init__.py +0 -0
  360. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/archive/archive.py +0 -0
  361. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/archive/local_archive.py +0 -0
  362. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
  363. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/exptime/__init__.py +0 -0
  364. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/exptime/exptime.py +0 -0
  365. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
  366. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
  367. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
  368. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
  369. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
  370. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
  371. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
  372. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
  373. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
  374. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
  375. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
  376. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
  377. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/__init__.py +0 -0
  378. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/average.py +0 -0
  379. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/cache.py +0 -0
  380. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/config.py +0 -0
  381. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/config_schema.py +0 -0
  382. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/coordinates.py +0 -0
  383. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/curvefit.py +0 -0
  384. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/enums.py +0 -0
  385. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/exceptions.py +0 -0
  386. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/fits.py +0 -0
  387. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/focusseries/__init__.py +0 -0
  388. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/focusseries/base.py +0 -0
  389. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/focusseries/photometry.py +0 -0
  390. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/focusseries/projection.py +0 -0
  391. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/__init__.py +0 -0
  392. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/filters.py +0 -0
  393. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/grid.py +0 -0
  394. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/gridnode.py +0 -0
  395. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/pipeline.py +0 -0
  396. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/__init__.py +0 -0
  397. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/__init__.py +0 -0
  398. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/binningwidget.py +0 -0
  399. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
  400. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/exposewidget.py +0 -0
  401. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
  402. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
  403. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
  404. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
  405. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/http.py +0 -0
  406. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/influxdb.py +0 -0
  407. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/logger.py +0 -0
  408. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/logging/__init__.py +0 -0
  409. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/logging/context.py +0 -0
  410. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/logging/resolvableerror.py +0 -0
  411. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/modulegui.py +0 -0
  412. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/offsets/__init__.py +0 -0
  413. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
  414. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/offsets/applyoffsets.py +0 -0
  415. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
  416. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/parallel.py +0 -0
  417. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/pipeline/__init__.py +0 -0
  418. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/pipeline/night.py +0 -0
  419. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/pipeline/pipeline.py +0 -0
  420. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/__init__.py +0 -0
  421. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/csv.py +0 -0
  422. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/http.py +0 -0
  423. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/log.py +0 -0
  424. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/multi.py +0 -0
  425. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/publisher.py +0 -0
  426. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/serialization.py +0 -0
  427. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/shellcommand.py +0 -0
  428. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/threads/__init__.py +0 -0
  429. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/threads/lockwithabort.py +0 -0
  430. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/time.py +0 -0
  431. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/units.py +0 -0
  432. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/version.py +0 -0
  433. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/__init__.py +0 -0
  434. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/archivefile.py +0 -0
  435. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/bufferedfile.py +0 -0
  436. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/file.py +0 -0
  437. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/filelists/__init__.py +0 -0
  438. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/filelists/filelist.py +0 -0
  439. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/filelists/testing.py +0 -0
  440. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/httpfile.py +0 -0
  441. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/localfile.py +0 -0
  442. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/memfile.py +0 -0
  443. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/sftpfile.py +0 -0
  444. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/smbfile.py +0 -0
  445. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/sshfile.py +0 -0
  446. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/tempfile.py +0 -0
  447. {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/vfs.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyobs-core
3
- Version: 2.0.0.dev64
3
+ Version: 2.0.0.dev66
4
4
  Summary: robotic telescope software
5
5
  Author-email: Tim-Oliver Husser <thusser@uni-goettingen.de>
6
6
  License-Expression: MIT
@@ -36,7 +36,7 @@ def _disable_iers_auto_download() -> None:
36
36
  iers_conf.auto_max_age = None
37
37
  iers_conf.iers_degraded_accuracy = "warn"
38
38
 
39
- log.warning(
39
+ log.info(
40
40
  "IERS auto-download disabled — relying on the bundled astropy-iers-data snapshot. "
41
41
  "Earth orientation/UT1-UTC accuracy may degrade for predictions far from the "
42
42
  "snapshot date."
@@ -17,6 +17,7 @@ from pyobs.robotic import (
17
17
  TaskRunner,
18
18
  )
19
19
  from pyobs.robotic.scheduler.targets import Target
20
+ from pyobs.utils import exceptions as exc
20
21
  from pyobs.utils.time import Time
21
22
 
22
23
  log = logging.getLogger(__name__)
@@ -168,9 +169,15 @@ class Mastermind(Module, IAutonomous, IFitsHeaderBefore):
168
169
  log.info("Running task %s...", self._task.name)
169
170
  try:
170
171
  await self._task_runner.run_task(self._task, self._task_target)
171
- except Exception:
172
- # something went wrong
173
- log.exception("Task %s failed.", self._task.name)
172
+ except Exception as e:
173
+ # a PyobsError is an expected/domain failure (e.g. acquisition out of tolerance) --
174
+ # quiet INFO line, no traceback. Anything else is unexpected and needs a full
175
+ # traceback to debug. e.log() also skips re-logging if some deeper layer (e.g. the
176
+ # module's own execute()) already logged this same exception.
177
+ if isinstance(e, exc.PyobsError):
178
+ e.log(log, "INFO", f"Task {self._task.name} failed: {e}")
179
+ else:
180
+ log.exception("Task %s failed.", self._task.name)
174
181
  observation.end = Time.now()
175
182
  observation.state = ObservationState.FAILED
176
183
  await self._observation_archive.update_observation(observation)
@@ -24,7 +24,7 @@ class MoonIlluminationConstraint(Constraint):
24
24
  return astroplan.MoonIlluminationConstraint(max=self.max_phase)
25
25
 
26
26
  async def __call__(self, time: Time, task: Task, data: DataProvider) -> bool:
27
- moon_illumination = data.moon_illumination(time)
27
+ moon_illumination = float(data.observer.moon_illumination(time))
28
28
  return moon_illumination <= self.max_phase
29
29
 
30
30
 
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  from typing import TYPE_CHECKING
4
4
 
5
5
  import astroplan
6
+ import astropy.coordinates
6
7
  import astropy.units as u
7
8
  import numpy as np
8
9
  from astropy.coordinates import SkyCoord
@@ -31,12 +32,12 @@ class MoonSeparationConstraint(Constraint):
31
32
  if task.target is None:
32
33
  return True
33
34
  coord = task.target.coordinates(time)
34
- moon_separation = data.moon(time).separation(coord, origin_mismatch="ignore") # type: ignore[unexpected-keyword]
35
+ moon_separation = astropy.coordinates.get_body("moon", time).separation(coord, origin_mismatch="ignore")
35
36
  return float(moon_separation.degree) >= self.min_distance
36
37
 
37
38
  async def filter_skycoord(self, time: Time, coords: SkyCoord, data: DataProvider) -> np.ndarray:
38
- moon = data.moon(time)
39
- separations = moon.separation(coords, origin_mismatch="ignore").deg # type: ignore[unexpected-keyword]
39
+ moon = astropy.coordinates.get_body("moon", time)
40
+ separations = moon.separation(coords, origin_mismatch="ignore").deg
40
41
  return np.asarray(separations >= self.min_distance, dtype=np.bool_)
41
42
 
42
43
 
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, Literal
5
5
 
6
6
  import astroplan
7
7
  import astropy.units as u
8
+ from astropy.coordinates import get_sun
8
9
  from pydantic import Field
9
10
 
10
11
  from pyobs.utils.time import Time
@@ -33,12 +34,12 @@ class SolarElevationConstraint(Constraint):
33
34
  return astroplan.AtNightConstraint(max_solar_altitude=self.max_elevation * u.deg)
34
35
 
35
36
  async def __call__(self, time: Time, task: Task, data: DataProvider) -> bool:
36
- sun = data.sun_altaz(time)
37
+ sun = data.observer.sun_altaz(time)
37
38
  in_range = self.min_elevation <= float(sun.alt.degree) <= self.max_elevation
38
39
  if self.direction == "both":
39
40
  return in_range
40
41
  else:
41
- sun_coord = data.sun(time)
42
+ sun_coord = get_sun(time)
42
43
  transit = data.observer.target_meridian_transit_time(time, sun_coord, which="nearest")
43
44
  midnight = data.observer.midnight(time, which="nearest")
44
45
 
@@ -0,0 +1,49 @@
1
+ from __future__ import annotations
2
+
3
+ import datetime
4
+ from dataclasses import dataclass
5
+ from functools import cache
6
+
7
+ from astroplan import Observer
8
+
9
+ from pyobs.robotic.scheduler.observationarchiveevolution import (
10
+ ObservationArchiveEvolution,
11
+ )
12
+ from pyobs.utils.time import Time
13
+
14
+
15
+ @dataclass
16
+ class TaskSuccess:
17
+ date: Time
18
+ night: Time
19
+
20
+
21
+ class DataProvider:
22
+ """Data provider for Merit classes."""
23
+
24
+ def __init__(self, observer: Observer, archive: ObservationArchiveEvolution | None = None):
25
+ self.observer = observer
26
+ self.archive = archive if archive else ObservationArchiveEvolution(observer)
27
+
28
+ @cache
29
+ def last_sunset(self, time: Time) -> Time:
30
+ """Returns the time of the last sunset."""
31
+
32
+ # get last sunset
33
+ return Time(self.observer.sun_set_time(time, which="previous"))
34
+
35
+ @cache
36
+ def last_sunrise(self, time: Time) -> Time:
37
+ """Returns the time of the last sunrise."""
38
+
39
+ # get last sunset
40
+ return Time(self.observer.sun_rise_time(time, which="previous"))
41
+
42
+ @cache
43
+ def night(self, time: Time) -> datetime.date:
44
+ """Returns the time of the last sunset."""
45
+ sunset = self.last_sunset(time)
46
+ return sunset.to_datetime().date()
47
+
48
+
49
+ __all__ = ["DataProvider"]
@@ -21,7 +21,7 @@ class ObservationArchiveEvolution:
21
21
  self._obs_for_night: dict[datetime.date, ObservationList] = {}
22
22
  self._observer = observer
23
23
 
24
- async def evolve(self, scheduled_task: Observation) -> None:
24
+ async def evolve(self, scheduled_task: Observation, night: datetime.date) -> None:
25
25
  from pyobs.robotic.observation import Observation, ObservationState
26
26
 
27
27
  obs = Observation(
@@ -35,7 +35,14 @@ class ObservationArchiveEvolution:
35
35
  await self.observations_for_task(scheduled_task.task)
36
36
  self._obs_for_task[scheduled_task.task.id].append(obs)
37
37
 
38
- night = Time.now().night_obs(self._observer)
38
+ # `night` is the caller's responsibility (DataProvider.night(scheduled_task.start), see
39
+ # OnDemandScheduler.schedule()) rather than computed here from Time.now(): a schedule() run
40
+ # covers up to `schedule_range` (~24h) ahead, so "the night this task happens" can differ
41
+ # from "the night it is right now" when evolve() runs -- using Time.now() filed every task
42
+ # under whichever night was current at evolve()-time, not the night it was actually
43
+ # scheduled into, which a later FollowMerit/PerNightMerit lookup (keyed by the task's own
44
+ # time) would then miss. Also avoids redoing an uncached astropy sunset computation here
45
+ # when DataProvider.night() already has a cached one for this exact time.
39
46
  await self.observations_for_night(night)
40
47
  self._obs_for_night[night].append(obs)
41
48
 
@@ -14,7 +14,6 @@ from pyobs.robotic.storage.observationarchive import ObservationArchive
14
14
  from pyobs.utils.time import Time
15
15
 
16
16
  from . import DataProvider
17
- from ._executor import run_cpu_bound
18
17
  from .constraints import Constraint
19
18
  from .observationarchiveevolution import ObservationArchiveEvolution
20
19
  from .taskscheduler import TaskScheduler
@@ -70,8 +69,10 @@ class OnDemandScheduler(TaskScheduler):
70
69
 
71
70
  # schedule from start to end
72
71
  async for task in self.schedule_in_interval(tasks, projects_dict, start, end, data):
73
- # evolve archive
74
- await data.archive.evolve(task)
72
+ # evolve archive -- night is keyed by the task's own scheduled time, not "now", since
73
+ # a run can schedule up to schedule_range ahead into a different night (see
74
+ # ObservationArchiveEvolution.evolve()'s docstring/comment for why)
75
+ await data.archive.evolve(task, data.night(task.start))
75
76
 
76
77
  # yield to caller
77
78
  yield task
@@ -251,7 +252,7 @@ class OnDemandScheduler(TaskScheduler):
251
252
  ) -> tuple[Task | None, float]:
252
253
 
253
254
  # evaluate all merit functions at given time
254
- merits = await run_cpu_bound(self.evaluate_constraints_and_merits, tasks, projects, start, end, data)
255
+ merits = await self.evaluate_constraints_and_merits(tasks, projects, start, end, data)
255
256
 
256
257
  # find max one
257
258
  idx = np.argmax(merits)
@@ -275,7 +276,7 @@ class OnDemandScheduler(TaskScheduler):
275
276
  other_tasks = [t for t in tasks if t is not task]
276
277
  t = start + TimeDelta(step * u.second)
277
278
  while t < start + TimeDelta(task.estimate_duration(time=start) * u.second):
278
- merits = await run_cpu_bound(self.evaluate_constraints_and_merits, other_tasks, projects, t, end, data)
279
+ merits = await self.evaluate_constraints_and_merits(other_tasks, projects, t, end, data)
279
280
  for i, m in enumerate(merits):
280
281
  if m > merit:
281
282
  return other_tasks[i], t, m
@@ -296,9 +297,7 @@ class OnDemandScheduler(TaskScheduler):
296
297
  better_start: Time = start + TimeDelta(task.estimate_duration(time=start) * u.second)
297
298
 
298
299
  # evaluate merit of better_task at new start time
299
- merit = (
300
- await run_cpu_bound(self.evaluate_constraints_and_merits, [better_task], projects, better_start, end, data)
301
- )[0]
300
+ merit = (await self.evaluate_constraints_and_merits([better_task], projects, better_start, end, data))[0]
302
301
 
303
302
  # if it got better, return it, otherwise return Nones
304
303
  if merit >= better_merit:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "pyobs-core"
3
- version = "2.0.0.dev64"
3
+ version = "2.0.0.dev66"
4
4
  description = "robotic telescope software"
5
5
  authors = [{ name = "Tim-Oliver Husser", email = "thusser@uni-goettingen.de" }]
6
6
  requires-python = ">=3.11"
@@ -1,28 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import asyncio
4
- from collections.abc import Callable, Coroutine
5
- from concurrent.futures import ThreadPoolExecutor
6
- from typing import Any, TypeVar
7
-
8
- _T = TypeVar("_T")
9
-
10
- # single worker: evaluate_constraints_and_merits calls are always awaited sequentially by the
11
- # caller (never fired concurrently), and DataProvider's functools.cache is not safe under real
12
- # concurrent access -- one worker keeps that access serialized while still freeing the main loop.
13
- _executor = ThreadPoolExecutor(max_workers=1, thread_name_prefix="pyobs-scheduler")
14
-
15
-
16
- async def run_cpu_bound(coro_fn: Callable[..., Coroutine[Any, Any, _T]], *args: object) -> _T:
17
- """Runs an async callable to completion on a dedicated worker thread, off the caller's loop.
18
-
19
- Args:
20
- coro_fn: An async callable whose body does not itself need to run on the caller's
21
- event loop (no dependency on the caller's other tasks, timers, or comm state).
22
- args: Positional args for coro_fn.
23
- """
24
- loop = asyncio.get_running_loop()
25
- return await loop.run_in_executor(_executor, lambda: asyncio.run(coro_fn(*args)))
26
-
27
-
28
- __all__ = ["run_cpu_bound"]
@@ -1,78 +0,0 @@
1
- from __future__ import annotations
2
-
3
- import datetime
4
- from dataclasses import dataclass
5
- from functools import cache
6
-
7
- import astropy.coordinates
8
- from astroplan import Observer
9
- from astropy.coordinates import SkyCoord
10
-
11
- from pyobs.robotic.scheduler.observationarchiveevolution import (
12
- ObservationArchiveEvolution,
13
- )
14
- from pyobs.utils.time import Time
15
-
16
-
17
- @dataclass
18
- class TaskSuccess:
19
- date: Time
20
- night: Time
21
-
22
-
23
- class DataProvider:
24
- """Data provider for Merit classes.
25
-
26
- The ``@cache``d methods below are only safe to call from a single thread at a time -- they're
27
- used exclusively from within the scheduler's dedicated single-worker executor
28
- (`pyobs.robotic.scheduler._executor.run_cpu_bound`), never concurrently from the caller's main
29
- event loop. A new `DataProvider` is created per `schedule()` call, so cache lifetime is bounded
30
- to one schedule computation and never leaks stale values across runs.
31
- """
32
-
33
- def __init__(self, observer: Observer, archive: ObservationArchiveEvolution | None = None):
34
- self.observer = observer
35
- self.archive = archive if archive else ObservationArchiveEvolution(observer)
36
-
37
- @cache
38
- def last_sunset(self, time: Time) -> Time:
39
- """Returns the time of the last sunset."""
40
-
41
- # get last sunset
42
- return Time(self.observer.sun_set_time(time, which="previous"))
43
-
44
- @cache
45
- def last_sunrise(self, time: Time) -> Time:
46
- """Returns the time of the last sunrise."""
47
-
48
- # get last sunset
49
- return Time(self.observer.sun_rise_time(time, which="previous"))
50
-
51
- @cache
52
- def night(self, time: Time) -> datetime.date:
53
- """Returns the time of the last sunset."""
54
- sunset = self.last_sunset(time)
55
- return sunset.to_datetime().date()
56
-
57
- @cache
58
- def sun(self, time: Time) -> SkyCoord:
59
- """Returns the Sun's coordinates at the given time."""
60
- return astropy.coordinates.get_sun(time)
61
-
62
- @cache
63
- def sun_altaz(self, time: Time) -> SkyCoord:
64
- """Returns the Sun's AltAz coordinates at the given time, as seen by the observer."""
65
- return self.observer.sun_altaz(time)
66
-
67
- @cache
68
- def moon(self, time: Time) -> SkyCoord:
69
- """Returns the Moon's coordinates at the given time."""
70
- return astropy.coordinates.get_body("moon", time)
71
-
72
- @cache
73
- def moon_illumination(self, time: Time) -> float:
74
- """Returns the Moon's illumination fraction at the given time."""
75
- return float(self.observer.moon_illumination(time))
76
-
77
-
78
- __all__ = ["DataProvider"]