Skip to content

Commit db11881

Browse files
committed
add near meridian constraint
1 parent 7880daa commit db11881

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

astroplan/constraints.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
"LocalTimeConstraint", "PrimaryEclipseConstraint",
3636
"SecondaryEclipseConstraint", "Constraint", "TimeConstraint",
3737
"observability_table", "months_observable", "max_best_rescale",
38-
"min_best_rescale", "PhaseConstraint", "is_event_observable"]
38+
"min_best_rescale", "PhaseConstraint", "is_event_observable", "NearMeridianConstraint"]
3939

4040
_current_year = time.localtime().tm_year # needed for backward compatibility
4141
_current_year_time_range = Time( # needed for backward compatibility
@@ -938,6 +938,46 @@ def compute_constraint(self, times, observer=None, targets=None):
938938
return mask
939939

940940

941+
class NearMeridianConstraint(Constraint):
942+
"""
943+
Constraint near the Meridian.
944+
"""
945+
def __init__(self, min=None, boolean_constraint=True):
946+
"""
947+
Parameters
948+
----------
949+
min : `~astropy.units.Quantity` or `None`, optional
950+
Minimum acceptable distance to meridian.
951+
`None` indicates no limit.
952+
953+
boolean_constraint : bool
954+
955+
Examples
956+
--------
957+
Constrain observations to targets that are 3 degrees away from the meridian.
958+
>>> import astropy.units as u
959+
>>> constraint = NearMeridianConstraint(min=3*u.deg)
960+
961+
This can be useful for observations using German-Equatorial Mounts, to avoid
962+
flipping the side of the pier during exposures.
963+
"""
964+
self.min = min if min is not None else 0*u.hourangle
965+
self.boolean_constraint = boolean_constraint
966+
967+
def compute_constraint(self, times, observer, targets):
968+
lst = observer.local_sidereal_time(times)
969+
meridian = SkyCoord(ra=lst, dec=targets.dec)
970+
971+
meridian_separation = meridian.separation(targets)
972+
973+
if self.boolean_constraint:
974+
mask = (self.min < meridian_separation)
975+
return mask
976+
else:
977+
rescale = min_best_rescale(meridian_separation, self.min, less_than_min=0)
978+
return rescale
979+
980+
941981
def is_always_observable(constraints, observer, targets, times=None,
942982
time_range=None, time_grid_resolution=0.5*u.hour):
943983
"""

astroplan/tests/test_constraints.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import numpy as np
66
import astropy.units as u
77
from astropy.time import Time
8-
from astropy.coordinates import Galactic, SkyCoord, get_sun, get_body
8+
from astropy.coordinates import Galactic, SkyCoord, EarthLocation, get_sun, get_body
99
from astropy.utils import minversion
1010
import pytest
1111

@@ -20,7 +20,7 @@
2020
TimeConstraint, LocalTimeConstraint, months_observable,
2121
max_best_rescale, min_best_rescale, PhaseConstraint,
2222
PrimaryEclipseConstraint, SecondaryEclipseConstraint,
23-
is_event_observable)
23+
is_event_observable, NearMeridianConstraint)
2424
from ..periodic import EclipsingSystem
2525
from ..exceptions import MissingConstraintWarning
2626

@@ -200,6 +200,18 @@ def test_sun_separation():
200200
assert np.all(is_constraint_met == [False, True, True])
201201

202202

203+
def test_near_meridian():
204+
time_range = Time(["2024-10-08 20:28", "2024-10-08 22:30"])
205+
target = FixedTarget(coord=SkyCoord(ra=19.75*u.hour, dec=-22.05*u.deg), name="name")
206+
207+
# Pico dos Dias Observatory (Brazil)
208+
opd = Observer(location=EarthLocation(lat=-22.53, lon=-45.58, height=1864))
209+
constraint = NearMeridianConstraint(min=3*u.deg)
210+
211+
results = constraint(opd, target, times=time_grid_from_range(time_range))
212+
assert np.all(results == [True, True, False, True, True])
213+
214+
203215
def test_moon_separation():
204216
time = Time('2003-04-05 06:07:08')
205217
apo = Observer.at_site("APO")
@@ -419,6 +431,7 @@ def test_rescale_minmax():
419431
AtNightConstraint(),
420432
SunSeparationConstraint(min=90*u.deg),
421433
MoonSeparationConstraint(min=20*u.deg),
434+
NearMeridianConstraint(min=3*u.deg),
422435
LocalTimeConstraint(min=dt.time(23, 50), max=dt.time(4, 8)),
423436
TimeConstraint(*Time(["2015-08-28 03:30", "2015-09-05 10:30"]))
424437
]

0 commit comments

Comments
 (0)