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.
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/PKG-INFO +1 -1
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/application.py +1 -1
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/mastermind.py +10 -3
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/moonilluminationconstraint.py +1 -1
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/moonseparationconstraint.py +4 -3
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/solarelevationconstraint.py +3 -2
- pyobs_core-2.0.0.dev66/pyobs/robotic/scheduler/dataprovider.py +49 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/observationarchiveevolution.py +9 -2
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/ondemandscheduler.py +7 -8
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyproject.toml +1 -1
- pyobs_core-2.0.0.dev64/pyobs/robotic/scheduler/_executor.py +0 -28
- pyobs_core-2.0.0.dev64/pyobs/robotic/scheduler/dataprovider.py +0 -78
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/.gitignore +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/LICENSE +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/background_task.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/_cli.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/pyobs.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/pyobsd.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/cli/pyobsw.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/comm.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/commlogging.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/dummy/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/dummy/dummycomm.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/local/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/local/localcomm.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/local/localnetwork.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/proxy.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/rpc.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/serializer.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009/binding.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009/rpc.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/rpc.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/stanza/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xmppclient.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xmppcomm.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/badweather.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/event.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/exposurestatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/filterchanged.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/focusfound.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/goodweather.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/log.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/modechanged.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/moduleclosed.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/moduleopened.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/motionstatuschanged.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/move.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/newimage.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/newspectrum.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/offsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/roofclosing.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/roofopened.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/taskfailed.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/taskfinished.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/taskstarted.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/events/testevent.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/image.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/altazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/exptime.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/genericoffset.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/onskydistance.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/radecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/meta/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processor.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/_daobackgroundremover.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/_pillow.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/circle.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/crosshair.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/text.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/_dotnet_request.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/_dotnet_request_builder.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/_dotnet_request_logger.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/_dotnet_response_saver.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/dotnet.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/_calibration_cache.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/_ccddata_calibrator.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/calibration.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/_pysep_stats_calculator.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/_source_catalog.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/daophot.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/pysep.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/simpledisk.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/sourcedetection.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/exptime/star.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/addfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/download.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/flip.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/grayscale.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/httpserver.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/normalize.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/save.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/saveimage.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/smooth.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/softbin.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/addmask.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/catalogcircularmask.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/circularmask.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/createfilename.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/imagesourcefilter.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/misc/removebackground.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/modules/getfitsheaders.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/astrometry.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/brighteststar.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/brighteststar_guiding.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/dummyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/dummyskyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/offsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/pixeloffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/projected.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/offsets/spilled_light.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/_photometry_calculator.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/_photutil_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/_sep_aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/aperture_photometry.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/photometry.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/photutil.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/photometry/pysep.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/wcs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/wcs/solarhelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAbortable.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAcquisition.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAutoFocus.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAutoGuiding.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IAutonomous.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IBinning.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ICalibrate.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ICamera.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IConfig.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ICooling.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IData.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IDataSequence.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IDome.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IExposure.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IExposureTime.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFilters.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFitsHeaderAfter.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFitsHeaderBefore.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFlatField.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFocusModel.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IFocuser.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IGain.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IImageFormat.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IImageType.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IMode.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IModule.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IMotion.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IMultiFiber.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IOffsetsAltAz.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IOffsetsRaDec.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingAltAz.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingBody.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingHeliocentricPolar.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingHeliographicStonyhurst.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingHelioprojective.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingOrbitalElements.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingRaDec.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IPointingSeries.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IReady.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IRoof.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IRotation.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IRunnable.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IRunning.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IScriptRunner.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ISpectrograph.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IStartStop.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IStructuredConfig.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ISyncTarget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ITelescope.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ITemperatures.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ITrackingMode.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/ITrackingRate.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IVideo.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IWeather.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/IWindow.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/interfaces/interface.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/camerasettings.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/fitsheader.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/fitsnamespace.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/follow.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/motionstatus.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/waitformotion.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/mixins/weatheraware.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/adaptive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/basecamera.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/basespectrograph.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/basevideo.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/dummycamera.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/dummyspectrograph.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/dummyvideo.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/camera/pipelinecamera.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/flatfield/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/flatfield/flatfield.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/flatfield/pointing.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/flatfield/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/focus/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/focus/dummyautofocus.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/focus/focusmodel.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/focus/focusseries.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/imagewatcher.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/imagewriter.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/image/seeing.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/module.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/_base.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/_baseguiding.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/acquisition.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/autoguiding.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/dummyacquisition.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/dummyguiding.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/guidingstatistics.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/pixeloffset.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/skyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/guidingstatistics/uptime.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/pointing/scienceframeguiding.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/pointing.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/robotic/scriptrunner.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/roof/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/roof/basedome.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/roof/baseroof.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/roof/dummyroof.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/_dummytelescopebase.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/basetelescope.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/dummyaltaztelescope.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/dummyradectelescope.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/telescope/dummysolartelescope.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/test/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/test/standalone.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/dummymode.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/fluentlogger.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/httpfilecache.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/kiosk.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/matrix.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/stellarium.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/telegram.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/utils/trigger.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/mockweather.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/weather.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/weather_api.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/modules/weather/weather_state.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/object.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/py.typed +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/observation.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/astroplanscheduler.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/airmassconstraint.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/constraint.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/constraints/timeconstraint.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/aftertime.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/beforetime.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/constant.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/follow.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/interval.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/merit.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/pernight.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/random.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/timewindow.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/merits/transit.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/dynamictarget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/heliocentricpolartarget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/helioprojectivetarget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/picker/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/picker/csvpicker.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/picker/picker.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/siderealtarget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/targets/target.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/taskscheduler.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/calibration/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/calibration/darkbias.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/calibration/pointing.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/calibration/skyflats.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/cases.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/conditional.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/parallel.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/selector.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/control/sequential.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/imaging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/imaging/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/imaging/imaging.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/imaging/transitimaging.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/utils/callmodule.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/utils/debugtrigger.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scripts/utils/log.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/backend/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/backend/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/backend/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/filesystem/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/filesystem/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/filesystem/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/_portal.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/_schedulereader.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/_schedulewriter.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/configdb.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/mockobservationarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/scripts/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/scripts/autofocus.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/scripts/default.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/scripts/script.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/task.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/lco/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/memory/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/memory/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/memory/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/observationarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/storage/taskarchive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/task.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/taskrunner.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/archive/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/archive/archive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/archive/local_archive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/archive/pyobs_archive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/exptime/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/exptime/exptime.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/exptime/stellarexptime.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/exptimeeval.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/flatfielder.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/pointing/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/pointing/base.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/pointing/static.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/priorities/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/priorities/archive.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/priorities/base.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/priorities/const.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/utils/skyflats/scheduler.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/average.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/cache.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/config.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/config_schema.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/coordinates.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/curvefit.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/enums.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/exceptions.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/fits.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/focusseries/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/focusseries/base.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/focusseries/photometry.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/focusseries/projection.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/filters.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/grid.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/gridnode.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/grids/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/binningwidget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/datadisplaywidget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/exposewidget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/exposuretimewidget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/imageformatwidget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/listpickerdialog.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/gui/camera/windowingwidget.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/http.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/influxdb.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/logger.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/logging/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/logging/context.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/logging/resolvableerror.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/modulegui.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/offsets/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/offsets/applyaltazoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/offsets/applyoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/offsets/applyradecoffsets.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/parallel.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/pipeline/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/pipeline/night.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/pipeline/pipeline.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/csv.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/http.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/log.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/multi.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/publisher/publisher.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/serialization.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/shellcommand.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/threads/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/threads/lockwithabort.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/time.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/utils/units.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/version.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/archivefile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/bufferedfile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/file.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/filelists/__init__.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/filelists/filelist.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/filelists/testing.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/httpfile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/localfile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/memfile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/sftpfile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/smbfile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/sshfile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/tempfile.py +0 -0
- {pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/vfs/vfs.py +0 -0
|
@@ -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.
|
|
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
|
-
#
|
|
173
|
-
|
|
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 =
|
|
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 =
|
|
39
|
-
separations = moon.separation(coords, origin_mismatch="ignore").deg
|
|
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 =
|
|
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
|
|
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
|
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/robotic/scheduler/ondemandscheduler.py
RENAMED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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,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"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/comm/xmpp/xep_0009_timeout/stanza/RPC.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/_daobackgroundremover.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/_pillow.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/circle.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/crosshair.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/annotation/text.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/astrometry.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/astrometry/dotnet.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/calibration/calibration.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/daophot.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/pysep.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/detection/simpledisk.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/exptime/__init__.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/exptime/exptime.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/addfitsheaders.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/grayscale.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/httpserver.py
RENAMED
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/normalize.py
RENAMED
|
File without changes
|
|
File without changes
|
{pyobs_core-2.0.0.dev64 → pyobs_core-2.0.0.dev66}/pyobs/images/processors/image/saveimage.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|