Atmospheric Refraction Analysis — Pikes Peak / 39 Aquarii¶

Event: Stellar occultation of 39 Aquarii behind Pikes Peak · 2025-01-27 18:43 UTC−7
Observer: Dr. Heffron · 38.9997°N, 104.497°W · 2073 m
Atmosphere: Grand Junction radiosonde · 2025-01-28 UTC
Software: refraction.py · Ciddor refractive-index model + WGS-84 spherical ray tracing

Intent of Below Analysis¶

Investigate the software provided by Astronomy Live to apply ray traced per globe model assumptions. Main purpose was to understand clearly the globe claim.

No conlcusions to be drawn here, this document will ultimately be provided as an appendix and methodolgy will be used for further anaylsis within a wider project.

Observer   2073 m  ->  787.8 mbar   T = -0.2 C
Pikes Peak 4300 m  ->  592.7 mbar
Balloon data: 6369 levels,  1474 - 33435 m
dms test: +02°19'04.44"
=== Pikes Peak / 39 Aquarii  Full Refraction Results ===
  Ground distance :  50.65 km
  Slant range     :  50.72 km
  Angular sep     :  phi = +00°27'16.59"
  Peak geom elev  :  +02°17'20.60"
  Peak app  elev  :  +02°19'04.39"
  Peak uplift     :  1.730 arcmin
  Star geom elev  :  +02°05'44.47"
  Star uplift     :  13.332 arcmin

Section 1 · Software Overview¶

refraction.py calculates atmospheric refraction corrections for stellar occultation observations.

Physics¶

Starlight from a distant point source travels in a curved path, bending downward through the atmosphere as it passes through layers of increasing air density. At the observer, the tangent drawn to the ray at that endpoint points to the star's apparent position — which is higher than the true geometric position. That angular difference is the uplift.

Star  (at infinity)
       |  geometric direction (straight line in vacuum)
  ~~~~~|~~~~~~~~~~~~~  top of atmosphere
       |  ray curves downward through density gradient
  ~~~~~|~~~~~~~~~~~~~  ground level
       /  <- tangent at observer = apparent direction (higher)
  [Observer]

The software pipeline:

  1. Load a real atmospheric profile (T, P, RH vs altitude) from the balloon sounding
  2. Calculate refractive index n(z) at every altitude using the Ciddor (1996) model
  3. Trace a ray through the atmosphere using Snell's law in spherical coordinates: n(r)·r·cos(α) = b (constant impact parameter)
  4. Return the uplift — how many arcminutes the atmosphere shifts the apparent position

For this analysis: Pikes Peak is the blocking object and 39 Aquarii is the star being occulted.


Section 2 · Function Reference¶

Each group below describes what the functions do, followed by a live demonstration using the Pikes Peak observation inputs.

Group A — Interpolation¶

Function Purpose
interpolated_pressure_to_alt(baropress, groundtruth) Convert a pressure value (hPa) to altitude (m) by linear interpolation through the balloon profile
interpolated_at_altitude(alt_m, groundtruth) Return any profile quantity (T, P, RH) at a given altitude by linear interpolation

Both rely on the five global arrays populated by target_and_star_geometry_bundle. They are used throughout the atmosphere model to look up T, P, and RH during ray tracing.

Interpolated T and P at selected altitudes:
    2073 m  ->  T =   +4.3 C   P =  790.47 hPa
    3000 m  ->  T =   -2.7 C   P =  704.30 hPa
    5000 m  ->  T =  -20.2 C   P =  542.20 hPa
   10000 m  ->  T =  -49.0 C   P =  262.57 hPa
   20000 m  ->  T =  -59.9 C   P =   54.60 hPa

Group B — Ciddor Refractive Index Model¶

Function Purpose
ciddor_Z(T_k, p_pa, xw) Compressibility factor Z of air (non-ideal gas correction)
ciddor(lambda_nm, t_c, p_pa, rh_percent, xc_ppm) Refractive index n of moist air at a given wavelength, T, P, humidity, and CO₂

The Ciddor (1996) model is the BIPM-recommended formula for air refractive index. At observer altitude n ≈ 1.000277; it approaches 1.0 at the top of the atmosphere. The gradient dn/dz drives refraction — light bends toward regions of higher n (denser, lower air).

At observer (2073 m):  T=4.3 C  P=790.5 hPa  RH=19%
  Ciddor n = 1.000225051   (n-1 = 225.05 ppm)

n(z) across altitudes:
    2073 m  n = 1.000225051  (n-1 = 225.05 ppm)
    3000 m  n = 1.000205720  (n-1 = 205.72 ppm)
    5000 m  n = 1.000169360  (n-1 = 169.36 ppm)
   10000 m  n = 1.000092553  (n-1 = 92.55 ppm)
   20000 m  n = 1.000020224  (n-1 = 20.22 ppm)
   35000 m  n = 1.000002359  (n-1 = 2.36 ppm)

Group C — WGS-84 Ellipsoid Geometry¶

Function Purpose
wgs84_radii_of_curvature(lat_deg) Meridional (M) and normal (N) radii at a latitude
wgs84_normal_section_radius(lat_deg, azimuth_deg) Earth radius along a specific azimuth — used for ground distance → arc angle
wgs84_gauss_radius(lat_deg) Gaussian mean radius √(M·N) — used for star refraction
haversine_central_angle_rad(...) Great-circle angle between two lat/lon points (spherical fallback)

Earth is oblate — the local radius of curvature varies with latitude and azimuth. Using WGS-84 instead of a sphere changes ground distances by tens of metres over 50 km.

At latitude 38.9997 deg N:
  Meridional radius M = 6360.718 km
  Normal radius     N = 6386.609 km
  Gauss radius sqrt(MN) = 6373.650 km
  Sphere reference      = 6371.000 km
  WGS84 - sphere        = 2650.4 m
Ground distance observer -> peak:
  WGS-84 geodesic : 50.649 km
  Haversine       : 50.551 km

Group D — Atmosphere Model (AmbianceAtmosphereWithRH)¶

AmbianceAtmosphereWithRH is the central atmosphere object used during ray tracing. For each queried altitude it:

  1. Retrieves T and P from the balloon profile (or ISO standard atmosphere above the balloon ceiling)
  2. Retrieves RH from the balloon profile (set to zero above ceiling)
  3. Calls ciddor() to compute n
  4. Caches the result at 50 m resolution to avoid recomputing during the ray stepping loop

Above 80 km it returns n = 1.0 (vacuum).

n(z) from AmbianceAtmosphereWithRH:
     2073 m  n = 1.000225051
     3000 m  n = 1.000205720
     5000 m  n = 1.000169360
    10000 m  n = 1.000092553
    20000 m  n = 1.000020224
    35000 m  n = 1.000001919
    60000 m  n = 1.000000070
    79999 m  n = 1.000000004
    80000 m  n = 1.000000000

Group E — Ray Tracing¶

Function Purpose
_trace_to_radius(atm, b, observer_alt_m, ...) Step a ray outward from the observer until it reaches target radius r_target. Returns (φ, r, s, ok) — accumulated angle, final radius, path length, success flag
_trace_infinite_exit_direction(...) Trace to the top of atmosphere and return the exit direction as a unit vector — that direction in vacuum is the geometric star position

Snell's law in polar form — the impact parameter b is conserved:

b = n(r) · r · cos(α)   (α = angle from local vertical)
Δr   = Δs · sin(α)
Δφ   = Δs · cos(α) / r
Impact parameter b = 6371940.551 m
Ray hit at phi     = +00°27'18.90"  (target phi_t = +00°27'16.59")
Path length s      = 50.72 km
Success            = True

Group F — Apparent → Geometric (Stars at Infinity)¶

geometric_from_apparent_infinite(apparent_elev_deg, observer_lat_deg, observer_alt_m, settings)

For a star at infinite distance the function:

  1. Traces a ray outward from the observer in the apparent direction
  2. Records the ray direction in vacuum at the top of atmosphere
  3. Returns the geometric elevation — where the star truly is in the sky

This is the core correction applied when matching an observed star position to a catalogue.

Apparent elevation (Pikes Peak direction) : +02°19'04.39"
Geometric star elevation                  : +02°05'44.47"
Star uplift                               : 13.332 arcmin
  (matches pipeline star_uplift: 13.332 arcmin)

Group G — Full Pipeline¶

Function Purpose
apparent_geometric_uplift_target_lla(...) For a finite target (peak, aircraft): uses bisection to find the apparent elevation angle whose traced ray lands at exactly the target's angular position φ_t. Returns apparent, geometric, uplift, ground distance, φ_t
target_and_star_geometry_bundle(...) Sets global atmosphere arrays, calls the above, computes slant range via law of cosines, and calls geometric_from_apparent_infinite for the star. Returns the complete result set

How apparent_geometric_uplift_target_lla Works¶

apparent_geometric_uplift_target_lla answers: "At what apparent angle must I aim my theodolite so a refracted ray lands on Pikes Peak?"

It does three things:

  1. Computes geometry — ground distance observer→peak (50.65 km), central angle φ_t, and plane_geom (pure geometric elevation from coordinates, no atmosphere)
  2. Runs a bisection — iterates over trial apparent angles α_app, tracing a refracted ray for each one, until it finds the α_app where the refracted ray arrives at exactly φ_t at radius R_earth + 4300 m
  3. Returns — plane_app (the winning α_app), plane_geom, their difference (peak uplift 1.73 arcmin), ground distance, φ_t in degrees

plane_app is the bisection output (the answer). The bisection target is g(α_app) = φ_hit(α_app) − φ_t = 0, where φ_t is fixed.


What is φ_t?¶

φ_t is the central angle — the angle at Earth's centre subtended by the arc from observer to Pikes Peak:

φ_t = ground_distance / R_earth = 50,650 m / 6,385,560 m ≈ 0.007934 rad = +00°27'16.59"

In refraction.py's 2D spherical cross-section the observer sits at φ = 0 and the peak sits at φ = φ_t. The bisection tests: does this trial ray arrive at the right φ when it reaches r = R_earth + 4300 m?


Bisection step-by-step (real values from this run)¶

Setup:

  • Geometric elevation (vacuum): plane_geom = +02°17'20.60"
  • Initial bracket: lo = +01°47'20.60" (geometric − 0.5°), hi = +02°47'20.60" (geometric + 0.5°)
  • g(lo) = +6.47 arcmin → ray overshoots (φ_hit > φ_t, the ray sweeps too far horizontally)
  • g(hi) = −4.08 arcmin → ray undershoots (φ_hit < φ_t, too steep, not enough horizontal travel)
  • Signs are opposite → bracket confirmed, bisection begins

How g(α_app) works: compute impact parameter b = n₀·r₀·cos(α_app), trace the ray in 50 m steps until it reaches r = R_earth + 4300 m, record the angular position φ_hit. Then g = φ_hit − φ_t.

Iter Trial angle α_app g (arcsec) Action
1 +02°17'20.60" (geom) +17.6" overshoots → raise lo
2 +02°32'20.60" −124.1" undershoots → lower hi
3 +02°24'50.60" −56.2" undershoots → lower hi
4 +02°21'05.60" −20.1" undershoots → lower hi
5 +02°19'13.10" −1.5" undershoots → lower hi
6 +02°18'16.85" +8.0" overshoots → raise lo
7 +02°18'44.98" +3.3" overshoots → raise lo
… … … bracket halves each step
30 +02°19'04.39" 0.000" converged → plane_app

Why lo moves up when g > 0: a positive g means the ray swept too far (φ_hit > φ_t) — the angle was too shallow, too much horizontal travel. The fix is to raise the lower bound and try a steeper angle.

Why hi moves down when g < 0: a negative g means the ray undershot (φ_hit < φ_t) — the angle was too steep, not enough horizontal travel. The fix is to lower the upper bound and try a shallower angle.

After 30 iterations the bracket width is 1° / 2³⁰ ≈ 0.000000001° ≈ 0.000003 arcsec — effectively machine precision.


Geometric vs apparent peak elevation:

  • +02°17'20.60" = plane_geom — geometric elevation of Pikes Peak, computed from coordinates alone (vacuum, no atmosphere)
  • +02°19'04.39" = plane_app — apparent elevation you would actually observe with a theodolite — refraction bends the peak up 1.73 arcmin

The +02°19' is what the atmosphere makes it look like. The +02°17' is where it actually is geometrically. If you measured it with a physical theodolite, you would see +02°19'.

=== Full results summary ===
  Ground dist   50.65 km    Slant range 50.72 km
  Angular sep   phi = +00°27'16.59"
  Peak geom     +02°17'20.60"   apparent +02°19'04.39"   uplift 1.730 arcmin
  Star geom     +02°05'44.47"   uplift 13.332 arcmin

Section 2h · Apparent vs Geometric Star Position¶

target_and_star_geometry_bundle returns several elevation angles. It is important to be clear about which is which:

Variable Value What it is
plane_app +02°19'04" Apparent elevation of Pikes Peak = apparent position of 39 Aquarii at occultation. The direction the observer looks to see both peak and star through the atmosphere.
plane_geom +02°17'21" True geometric elevation of Pikes Peak — where the summit truly is in vacuum.
star_geom +02°05'44" True geometric position of 39 Aquarii — where the star actually is in space, no atmosphere.
star_uplift 13.332 arcmin plane_app − star_geom — total atmospheric refraction.
peak_uplift 1.730 arcmin plane_app − plane_geom — refraction to the finite Pikes Peak summit.

The apparent star position is plane_app, not a separate output. At the moment of occultation the star and the peak share the same apparent direction — that is the definition of occultation. refraction.py finds plane_app by bisecting rays until one lands on the summit, then derives star_geom by running the refraction correction in reverse for a star at infinity in that same direction.

Star uplift = plane_app − star_geom is the full atmospheric shift between where the star appears (+02°19'04") and where it truly is (+02°05'44").

39 Aquarii ICRS (J2000 / Simbad):
  RA  22h12m25.76s
  Dec -14d11m38.3s

True geometric altitude — three independent methods:
  astropy (ICRS + WGS-84, vacuum)   : +02°07'25.32"
  refraction.py (WGS-84 ray trace)   : +02°05'44.47"
  GP dist / Gauss radius (spherical) : +02°08'12.49"

  astropy vs refraction.py           : 1.68 arcmin
  astropy vs GP-dist approx          : 0.79 arcmin
  Azimuth                            : +249°56'00.37"

Section 3 · Grand Junction Radiosonde Atmospheric Profile¶

Weather balloon data from Grand Junction, CO (2025-01-28 UTC) — the real atmospheric profile used for all refraction calculations.
The balloon ascended from ~1,474 m to ~33,435 m, measuring T, P, humidity at 6,369 levels.

No description has been provided for this image

Section 4 · Refractive Index Profile n(z)¶

n decreases monotonically with altitude as air density falls. The gradient dn/dz drives refraction: light bends toward regions of higher n (denser, lower air), which is downward — consistent with the physics in Section 1.
Below the balloon ceiling the profile uses measured T, P, RH. Above it falls back to the ISO standard atmosphere.

No description has been provided for this image

Section 4b · Raw Ciddor Values — Balloon Data Points¶

Layer model used by refraction.py: Concentric spherical shells (coincident spherical layer model). Each atmospheric layer is a spherical shell at constant radius r from Earth's centre. Snell's law takes the form:

b = n(r) · r · cos(α)  =  constant  (impact parameter)

This is not a flat-stacked layer model (which would use n₁·sin(θ₁) = n₂·sin(θ₂) with horizontal planes). The spherical form correctly accounts for Earth's curvature over the ~50 km path from observer to Pikes Peak.

The plot below shows raw Ciddor n values computed directly from each balloon measurement level (6,369 points) vs the smooth interpolated curve used during ray tracing.

No description has been provided for this image

Section 5a · Full Ray Path — Observer to Balloon Ceiling¶

Traces the light ray from the observer all the way to the weather balloon data ceiling (~33,435 m) at the same apparent elevation angle as the Pikes Peak observation.

The two panels show:

  • Left: cross-section of the ray path — refracted (Ciddor) vs vacuum straight line, with key altitude reference lines. The horizontal separation between the two rays at the ceiling quantifies total atmospheric deflection over the full path.
  • Right: refractive index n(z) profile at 200 m steps — the density gradient the ray travels through. Steeper gradient = more bending per unit path length.
No description has been provided for this image
Path length        : 438.0 km
Horizontal extent  : 437.2 km
Launch angle       : +02°19'04.39"
Angle at ceiling   : +83°59'32.71"
Δ height (ref-vac) : 13741.9 m

Section 5b · Where Does refraction.py Calculate To?¶

refraction.py supports two distinct endpoint types, depending on the function called:

Function Target Endpoint
apparent_geometric_uplift_target_lla Finite target (e.g. Pikes Peak) Bisects ray path to hit target at 4,300 m
geometric_from_apparent_infinite Star at infinity Traces ray to top of atmosphere (80,000 m), then projects to infinity
39 Aquarii  .............................  (infinity — direction only)
      ↑  ← geometric (vacuum) direction
 80,000 m ─────────────────────────────── top of atmosphere  ← ray exits here
      │  ray bends through decreasing n(z); impact parameter b = n·r·cos(α) conserved
 33,435 m ─────────────────────────────── balloon data ceiling
      │  (above here: Ambiance ISO standard atmosphere, anchored to balloon surface)
      │
  4,300 m ─────────────────────────────── Pikes Peak summit  ← finite target endpoint
  2,073 m ─────────────────────────────── Observer

The plot below traces the full refracted ray from the observer to the 80,000 m boundary, then overlays the straight vacuum line pointing in the true geometric direction of 39 Aquarii (derived from the Star GP Distance in the observation spreadsheet). The gap between the two lines at any altitude is the cumulative effect of atmospheric refraction.

No description has been provided for this image
Refracted ray exit  : x = 790.05 km   y = 31.465 km (local Cartesian)
Vacuum line at exit : y = 31.370 km
Separation at exit  : 95.2 m  /  0.41 arcmin (chord)
star_uplift (refraction.py): 13.332 arcmin

Section 5c · Bennett Reference Formula¶

The Bennett (1982) formula gives a fast analytic estimate of refraction using a standard atmosphere:

Standard refraction (arcmin):

$$R_0 = \frac{1}{\tan\!\left(H_2 + \dfrac{7.31}{H_2 + 4.4}\right)}$$

Improved correction (max error 0.015'):

$$R_{0,\text{imp}} = R_0 - 0.06 \cdot \sin(14.7 R_0 + 13)$$

Pressure/temperature correction (P in mbar, T in °C):

$$f = \frac{P}{1010} \cdot \frac{283}{273 + T} \qquad R = R_{0,\text{imp}} \times f$$

Standard conditions: P = 1010 mbar, T = 10 °C (f = 1).
Used here as a sanity check against refraction.py's full Ciddor ray-trace. Bennett assumes a standard atmosphere; small differences from the balloon-profile result are expected.

Bennett at apparent elev +02°19'04.39"   : 13.643 arcmin
  refraction.py star_uplift (same quantity)    : 13.332 arcmin
  Difference (standard vs balloon atmosphere)  : 0.311 arcmin (2.3%)

Note: peak_uplift = 1.730 arcmin is the finite-target uplift to Pikes Peak summit,
      not the star uplift. Bennett does not compute finite-target corrections.

Bennett at 1 deg  : 19.68 arcmin
Bennett at 0.1 deg: 26.85 arcmin  (near horizon)

Section 5d · BAA Article vs refraction.py — Contrast & Comparison¶

Source: britastro.org/2019/atmospheric-refraction


Shared Foundation¶

Both start from the same physics: Snell's law, light bending at density boundaries, and a pressure/temperature correction factor. The BAA's Sæmundsson formula and the Bennett formula used in Section 5c are the same class of solution — empirical closed-form approximations that assume a standard atmosphere.


1 — Atmospheric Profile¶

BAA / Sæmundsson refraction.py
Profile source Standard conditions (10°C, 101 kPa) Real balloon sounding — 6,369 measured levels
Humidity Ignored Full water vapour via Ciddor (molar fraction xw)
CO₂ Ignored Variable ppm input
Profile updates Fixed published table Loaded fresh per observation

The BAA explicitly states humidity has a small effect and can be ignored. The Ciddor model includes it because at low elevation angles over long paths the water vapour contribution accumulates.


2 — Refractive Index Formula¶

BAA / Sæmundsson refraction.py (Ciddor 1996)
Method Empirical polynomial fit First-principles physics (BIPM reference standard)
Humidity Excluded Included via saturation vapour pressure & molar fractions
Wavelength Not modelled Any wavelength (default 550 nm green)
CO₂ correction None Explicit: ±0.534×10⁻⁶ per ppm offset from 450 ppm
Accuracy ~1 arcmin Sub-arcsecond

3 — Layer Geometry (Key Difference)¶

The BAA describes discrete atmospheric layers — this implies flat stacked horizontal planes where Snell's law is applied at each flat interface:

n₁ · sin(θ₁) = n₂ · sin(θ₂)     ← flat layer assumption

refraction.py uses coincident spherical shells — each layer is a sphere centred on Earth. The conserved quantity is the impact parameter:

b = n(r) · r · cos(α) = constant     ← spherical Snell's law (refraction.py)

Over the 50 km path to Pikes Peak at 2.3° elevation, the flat model accumulates geometric error from Earth's curvature. Over the 435 km full path to the balloon ceiling this error grows substantially.


4 — Ray Tracing vs Closed Form¶

BAA / Sæmundsson refraction.py
Method Single formula, one evaluation Numerical integration, 50 m steps
Path shape Assumed (standard curve) Actually computed from measured T/P/RH at every step
Finite targets Not possible Full bisection search to hit a specific peak altitude
Near-horizon validity BAA notes "fails below ~20°" Designed for 0–5° range

The BAA article explicitly warns the simple formula breaks below 20°. The Pikes Peak observation is at +02°19'04" — squarely in the regime where only a full ray trace through a real atmosphere profile is trustworthy.


5 — Scope and Purpose¶

BAA Article refraction.py
Target distance Stars at infinity only Stars (∞) and finite targets (peaks, aircraft)
Use case General telescope pointing Stellar occultation prediction
Earth model Not addressed WGS-84 ellipsoid (latitude-dependent radius)
Outputs Uplift in arcmin (one number) Apparent elev, geometric elev, uplift, slant range, ground distance

6 — Numerical Cross-Check¶

The BAA table gives 28'59" (~29 arcmin) at the horizon under standard conditions. The code cell below computes all three methods side-by-side at matching angles and conditions to show where they agree and where they diverge.

=== Numerical Cross-Check: BAA/Saemundsson vs Bennett vs refraction.py ===

  Elevation              BAA Saemundsson     Bennett   refraction.py  Notes
                               (std atm)   (std atm)       (balloon)
  --------------------------------------------------------------------------------
  +90°00'00.00"             -0.002 arcmin    -0.015'       0.000'  Zenith
  +30°00'00.00"              1.746 arcmin     1.680'       1.334'  BAA table ref: 1 arcmin 45 arcsec
  +10°00'00.00"              5.408 arcmin     5.332'       4.237'  
  +05°00'00.00"              9.674 arcmin     9.861'       7.848'  BAA table ref: 9 arcmin 40 arcsec
  +02°19'04.39"             15.754 arcmin    16.861'      13.332'  Pikes Peak obs
  +01°00'00.00"             21.744 arcmin    24.318'      18.982'  
  +00°30'00.00"             25.004 arcmin    28.696'      22.144'  
  +00°06'00.00"             28.126 arcmin    33.178'      24.958'  Near horizon

Conditions:
  BAA / Bennett standard : T = 10.0 C   P = 101.0 kPa (1010 mbar)
  refraction.py (balloon): T = -0.2 C  P = 787.8 mbar  (Grand Junction Jan 2025)

Key divergence at Pikes Peak (+02°19'04.39"):
  Saemundsson (std atm)  : 15.754 arcmin
  refraction.py (balloon): 13.332 arcmin
  Difference             : 2.422 arcmin
  BAA formula valid above ~20 deg; Pikes Peak obs at +02°19'04.39" is in the invalid range.

Section 6 · Refraction Uplift Curve — Bennett vs Ciddor Ray-Trace¶

Uplift vs apparent elevation across the full sky:

  • Bennett — fast analytic, standard atmosphere with P/T correction at observer altitude
  • refraction.py — full Ciddor model + ray tracing with actual balloon profile

The vertical dashed line marks the Pikes Peak observation angle.

Computing refraction.py uplift curve ...
Done.
No description has been provided for this image

Section 7 · Observation Geometry — Pikes Peak / 39 Aquarii¶

Cross-section view showing the observer, Pikes Peak, and three key directions from the observer:

  • Geometric elevation of Pikes Peak — the true line-of-sight in vacuum
  • Apparent elevation — what the observer sees (shifted up by refraction)
  • Star geometric elevation — where 39 Aquarii truly is after correcting for refraction

The refraction uplift determines whether the star was geometrically behind the peak at the moment of observation.

No description has been provided for this image

Section 7b · Forced Apparent Elevation — 2.52°¶

Same geometry diagram as Section 7 but with the apparent elevation forced to 2.52° instead of the occultation-derived plane_app. This shows what refraction.py computes when the star is observed 13 arcmin above the peak direction — i.e., the star is clearing the peak and is visible to the observer.

Forced apparent elevation : +02°31'12.00"
Geometric elevation       : +02°18'29.49"
Star uplift               : 12.709 arcmin

Compare to occultation geometry:
  plane_app  : +02°19'04.39"   star_geom : +02°05'44.47"   uplift : 13.332 arcmin
No description has been provided for this image

Section 8 · Export to HTML¶

Exports the two key charts as self-contained HTML files.
Each file embeds the full Plotly JS bundle — no server required for S3/CloudFront hosting.

  section3_radiosonde_profile.html  (4995 KB)
  section4_refractive_index.html  (4741 KB)
  section4b_ciddor_raw.html  (4893 KB)
  section5a_balloon_ceiling_ray.html  (4852 KB)
  section5c_cartesian_80km.html  (5365 KB)
  section6_uplift_curve.html  (4743 KB)
  section7_geometry_diagram.html  (4739 KB)
  section7b_geometry_forced.html  (4740 KB)

Exported 8 plots.