Skip to content

Commit 2f32718

Browse files
Merge pull request #11 from pyobs/moon-masker
Added moon masker for night pipeline
2 parents 56cd1a5 + a0a619b commit 2f32718

File tree

11 files changed

+59
-47
lines changed

11 files changed

+59
-47
lines changed

example.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ pipelines:
146146
# Under which limiting magnitude a pixel is considered cloudy (in mag)
147147
threshold: 5.5
148148

149+
# Apparent size of the moon in the allsky image in degree
150+
moon_apparent_size: 0.5
151+
149152
coverage_info:
150153
# Altitude which is considered to be the lower boundary of the zenith to average for the zenith cloud fraction measurement (in degree)
151154
zenith_altitude: 80

night_integration_test.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ modules:
7777
cloud_map:
7878
threshold: 5.5
7979

80+
moon_apparent_size: 10.0
81+
8082
coverage_info:
8183
zenith_altitude: 80
8284

pyobs_cloudcover/pipeline/night/cloud_coverage_calculator/coverage_change_calculator.py

Lines changed: 0 additions & 28 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import datetime
2+
3+
import numpy as np
4+
from cloudmap_rs import SkyPixelQuery, AltAzCoord
5+
6+
from astroplan import Observer
7+
8+
9+
class MoonMasker:
10+
def __init__(self, moon_apparent_size: float, observer: Observer):
11+
self._moon_apparent_size = moon_apparent_size
12+
self._observer = observer
13+
14+
def __call__(self, sky_query: SkyPixelQuery, obs_time: datetime.datetime) -> SkyPixelQuery:
15+
moon_alt_az = self._observer.moon_altaz(obs_time)
16+
sky_query.mask_radius(AltAzCoord(moon_alt_az.alt.rad, moon_alt_az.az.rad), np.deg2rad(self._moon_apparent_size))
17+
18+
return sky_query

pyobs_cloudcover/pipeline/night/pipeline.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from pyobs_cloudcover.pipeline.night.lim_magnitude_map_generator.lim_magnitude_map_generator import LimMagnitudeMapGenerator
1414
from pyobs_cloudcover.pipeline.night.preprocessor.preprocessor import Preprocessor
1515
from pyobs_cloudcover.pipeline.night.star_reverse_matcher.star_reverse_matcher import StarReverseMatcher
16+
from pyobs_cloudcover.pipeline.night.moon_masker import MoonMasker
1617
from pyobs_cloudcover.pipeline.pipeline import Pipeline
1718

1819

@@ -24,6 +25,7 @@ def __init__(self,
2425
star_reverse_matcher: StarReverseMatcher,
2526
lim_magnitude_map_generator: LimMagnitudeMapGenerator,
2627
cloud_map_generator: CloudMapGenerator,
28+
moon_masker: MoonMasker,
2729
coverage_info_calculator: CoverageInfoCalculator) -> None:
2830

2931
self._preprocess = preprocess
@@ -32,6 +34,7 @@ def __init__(self,
3234
self._alt_az_list_generator = alt_az_list_generator
3335
self._lim_magnitude_map_generator = lim_magnitude_map_generator
3436
self._cloud_map_generator = cloud_map_generator
37+
self._moon_masker = moon_masker
3538
self._coverage_info_calculator = coverage_info_calculator
3639

3740
def __call__(self, image: npt.NDArray[np.float_], obs_time: datetime.datetime) -> CloudCoverageInfo:
@@ -46,5 +49,6 @@ def __call__(self, image: npt.NDArray[np.float_], obs_time: datetime.datetime) -
4649
lim_mag_map = self._lim_magnitude_map_generator(catalog, matches, alt_az_list)
4750
cloud_map = self._cloud_map_generator(lim_mag_map)
4851
sky_query = SkyPixelQuery(alt_az_list, cloud_map)
52+
sky_query = self._moon_masker(sky_query, obs_time)
4953

5054
return self._coverage_info_calculator(sky_query, obs_time)

pyobs_cloudcover/pipeline/night/pipeline_factory.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from pyobs_cloudcover.cloud_info_calculator import CloudInfoCalculatorFactory
77
from pyobs_cloudcover.pipeline.night.cloud_map_generator.cloud_map_generator_factory import CloudMapGeneratorFactory
88
from pyobs_cloudcover.pipeline.night.lim_magnitude_map_generator.lim_magnitude_map_generator_factory import LimMagnitudeMapGeneratorFactory
9+
from pyobs_cloudcover.pipeline.night.moon_masker import MoonMasker
910
from pyobs_cloudcover.pipeline.night.pipeline import NightPipeline
1011
from pyobs_cloudcover.pipeline.night.pipeline_options import NightPipelineOptions
1112
from pyobs_cloudcover.pipeline.night.preprocessor.preprocessor_factory import PreprocessorFactory
@@ -37,6 +38,7 @@ def __call__(self, options: NightPipelineOptions) -> NightPipeline:
3738
lin_mag_map_generator = lim_mag_map_generator_factory()
3839
cloud_map_generator = cloud_map_generator_factory()
3940
coverage_info_calculator = coverage_info_calculator_factory()
41+
moon_masker = MoonMasker(options.moon_apparent_size, self._observer)
4042

4143
pipeline = NightPipeline(
4244
preprocessor,
@@ -45,6 +47,7 @@ def __call__(self, options: NightPipelineOptions) -> NightPipeline:
4547
star_reverse_matcher,
4648
lin_mag_map_generator,
4749
cloud_map_generator,
50+
moon_masker,
4851
coverage_info_calculator
4952
)
5053

pyobs_cloudcover/pipeline/night/pipeline_options.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from typing import Dict, Any
3+
from typing import Dict, Any, cast
44

55
from pyobs_cloudcover.pipeline.night.altaz_grid_generator.altaz_grid_options import AltAzGridOptions
66
from pyobs_cloudcover.pipeline.night.catalog.catalog_constructor_options import CatalogConstructorOptions
@@ -19,7 +19,8 @@ def __init__(self,
1919
star_matcher_options: StarReverseMatcherOptions,
2020
lim_mag_map_generator_options: LimMagnitudeMapGeneratorOptions,
2121
cloud_generator_options: CloudMapGeneratorOptions,
22-
altaz_grid_options: AltAzGridOptions
22+
altaz_grid_options: AltAzGridOptions,
23+
moon_apparent_size: float
2324
) -> None:
2425

2526
self.model_options = model_options
@@ -29,6 +30,7 @@ def __init__(self,
2930
self.star_matcher_options = star_matcher_options
3031
self.lim_mag_map_generator_options = lim_mag_map_generator_options
3132
self.cloud_generator_options = cloud_generator_options
33+
self.moon_apparent_size = moon_apparent_size
3234

3335
@classmethod
3436
def from_dict(cls, options: Dict[str, Dict[str, Any]]) -> NightPipelineOptions:
@@ -39,12 +41,14 @@ def from_dict(cls, options: Dict[str, Dict[str, Any]]) -> NightPipelineOptions:
3941
lim_mag_map_generator_options = LimMagnitudeMapGeneratorOptions.from_dict(options.get("lim_mag_map", {}))
4042
cloud_map_generator_options = CloudMapGeneratorOptions.from_dict(options.get("cloud_map", {}))
4143
altaz_grid_generator = AltAzGridOptions.from_dict(options.get("altaz_grid", {}))
44+
moon_apparent_size = cast(float, options.get("moon_apparent_size", 10.0))
4245

4346
return cls(model_options,
4447
preprocessor_options,
4548
catalog_options,
4649
star_matcher_options,
4750
lim_mag_map_generator_options,
4851
cloud_map_generator_options,
49-
altaz_grid_generator
52+
altaz_grid_generator,
53+
moon_apparent_size
5054
)

tests/integration/test_night_pipeline.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from pyobs_cloudcover.pipeline.night.cloud_map_generator.cloud_map_generator import CloudMapGenerator
1414
from pyobs_cloudcover.pipeline.night.lim_magnitude_map_generator.lim_magnitude_map_generator import \
1515
LimMagnitudeMapGenerator
16+
from pyobs_cloudcover.pipeline.night.moon_masker import MoonMasker
1617
from pyobs_cloudcover.pipeline.night.pipeline import NightPipeline
1718
from pyobs_cloudcover.pipeline.night.preprocessor.image_binner import ImageBinner
1819
from pyobs_cloudcover.pipeline.night.preprocessor.image_masker import ImageMasker
@@ -53,9 +54,11 @@ def test_night_pipeline() -> None:
5354
cloud_map_gen = CloudMapGenerator(0.5)
5455
lim_mag_map_generator = LimMagnitudeMapGenerator(50.0)
5556

57+
moon_masker = MoonMasker(10, observer)
58+
5659
coverage_change_calculator = CoverageChangeCalculator()
5760
cloud_coverage_info_calculator = CoverageInfoCalculator(coverage_change_calculator)
5861

59-
pipeline = NightPipeline(preprocessor, catalog_constructor, altaz_list_generator, reverse_matcher, lim_mag_map_generator, cloud_map_gen, cloud_coverage_info_calculator)
62+
pipeline = NightPipeline(preprocessor, catalog_constructor, altaz_list_generator, reverse_matcher, lim_mag_map_generator, cloud_map_gen, moon_masker, cloud_coverage_info_calculator)
6063

6164
pipeline(image, obs_time)

tests/integration/test_night_pipeline_factory.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ def test_night_pipeline() -> None:
5555
},
5656
"cloud_map": {
5757
"threshold": 0.5
58-
}
58+
},
59+
60+
"moon_apparent_size": 10.0
5961
}
6062

6163
pipeline_options = NightPipelineOptions.from_dict(pipeline_kwargs)

tests/integration/test_pipeline_controller.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ def test_night_pipeline() -> None:
6262
},
6363
"cloud_map": {
6464
"threshold": 0.5
65-
}
65+
},
66+
"moon_apparent_size": 10.0
67+
6668
}
6769
}
6870

0 commit comments

Comments
 (0)