Ronchigrams

Scott Prahl

April 2021

[1]:
import numpy as np
import matplotlib.pyplot as plt
import lenstest

%config InlineBackend.figure_format='retina'

Introduction

Ronchigrams are often used in the field of optics to test the quality of mirrors and other optical elements. They can also be used to determine the curvature of a mirror.

To create a ronchigram, you will need the following materials:

  • A Ronchi grating, characterized by a series of opaque lines with same with as interline spacing

  • A point source of light source.

  • A screen or surface to project the ronchigram onto.

  • A lens or mirror that is the device under test.

If a mirror is being tested then the Ronchi ruling may be placed before or after the focus. When the ruling is after the focus then the layout looks like this

[2]:
D=50
RoC=100
z_offset = 20
lenstest.ronchi.plot_mirror_layout(D, RoC, z_offset)
plt.show()
_images/ronchi-basic_4_0.png

If a lens is being tested, then the layout is a 4f system. Note that the code treats the lens with focal length f as identical to a f=RoC/2 mirror.

[3]:
D=50
RoC=100
z_offset = 20
lenstest.ronchi.plot_lens_layout(D, RoC, z_offset)
plt.show()
_images/ronchi-basic_6_0.png

10 inch parabolic mirror comparison

[4]:

conic = -1 # parabolic D = 10 * 25.4 # mirror diameter [mm] z_offset = -0.62*25.4 # Ronchi location relative to focus [mm} RoC = 160 * 25.4 # mm lines_per_in = 100 # grating freq: (clear + opaque) lines/inch lp_per_mm = (lines_per_in/2)/25.4 # line pairs per mm print(" Mirror Diameter = %.3f inches" % (D/25.4)) print(" Focal Length = %.3f inches" % (RoC/25.4/2)) print(" F number = %.3f" % (RoC/2/D)) print(" Radius of curvature = %.3f inches" % (RoC/25.4)) print("Ronchi grating frequency = %.3f line pairs / inch" % (lp_per_mm*25.4)) print(" Ronchi position = %.3f inches after focus" % (z_offset/25.4)) lenstest.ronchi.plot_ruling_and_screen(D, RoC, lp_per_mm, z_offset, conic=conic) plt.show()
         Mirror Diameter = 10.000 inches
            Focal Length = 80.000 inches
                F number = 8.000
     Radius of curvature = 160.000 inches
Ronchi grating frequency = 50.000 line pairs / inch
         Ronchi position = -0.620 inches after focus
_images/ronchi-basic_8_1.png

Here is what it should look like

simulation

[5]:
# spherical mirror

D = 8000  # 10 meter mirror
F_number = 7
conic = 0
lp_per_mm = 0.133  # grating frequency lp/mm

RoC =  F_number * D * 2
f = RoC/2

print("    Mirror Diameter = %.0f mm" % D)
print("                 F# = %.1f" % F_number)
print("Radius of Curvature = %.0f mm" % RoC)
print("       Focal Length = %.0f mm" % f)
print("   Ronchi Frequency = %.3f lp/mm" % lp_per_mm)

plt.subplots(2,3,figsize=(13,8))

for i, z_offset in enumerate([-192,-55,82,219,356,493]):
    plt.subplot(2,3,i+1)
    x,y = lenstest.ronchi.gram(D, RoC, lp_per_mm, z_offset, conic=conic, invert=True)
    plt.plot(x,y,'o', markersize=0.1, color='blue')
#    for r in [0.37*D/2,0.7*D/2,0.93*D/2]:
#        lenstest.lenstest.draw_circle(r, color='red')
    lenstest.lenstest.draw_circle(D/2)
    plt.title("%.0fmm from focus"%z_offset)
    plt.gca().set_aspect("equal")
    if i in [1,2,4,5]:
        plt.yticks([])
    if i in [0,1,2]:
        plt.xticks([])
plt.show()
    Mirror Diameter = 8000 mm
                 F# = 7.0
Radius of Curvature = 112000 mm
       Focal Length = 56000 mm
   Ronchi Frequency = 0.133 lp/mm
_images/ronchi-basic_10_1.png

Oblate spheroid

[6]:
# oblate ellipsoid

D = 8000  # 8 meter mirror
F = 7
conic = 1
lp_per_mm = 0.133  # grating frequency lp/mm

RoC =  F * D * 2

print("    Mirror Diameter = %.0f mm" % D)
print("                 F# = %.1f" % F)
print("Radius of Curvature = %.0f mm" % RoC)
print("       Focal Length = %.0f mm" % (RoC/2))
print("   Ronchi Frequency = %.3f lp/mm" % lp_per_mm)

plt.subplots(2,3,figsize=(13,8))

for i, z_offset in enumerate([-192,-55,82,219,356,493]):
    plt.subplot(2,3,i+1)
    x,y = lenstest.ronchi.gram(D, RoC, lp_per_mm, z_offset, conic=conic, invert=True)
    plt.plot(x,y,'o', markersize=0.1, color='blue')
#    for r in [0.37*D/2,0.7*D/2,0.93*D/2]:
#        lenstest.lenstest.draw_circle(r, color='red')
    lenstest.lenstest.draw_circle(D/2)
    plt.title("%.0fmm from focus"%z_offset)
    plt.gca().set_aspect("equal")
    if i in [1,2,4,5]:
        plt.yticks([])
    if i in [0,1,2]:
        plt.xticks([])
plt.show()
    Mirror Diameter = 8000 mm
                 F# = 7.0
Radius of Curvature = 112000 mm
       Focal Length = 56000 mm
   Ronchi Frequency = 0.133 lp/mm
_images/ronchi-basic_12_1.png

Hyperboloidal mirror

[7]:
D = 8000  # 8 meter mirror
F = 7
conic = 2
lp_per_mm = 0.133  # grating frequency lp/mm

RoC =  F * D * 2

print("    Mirror Diameter = %.0f mm" % D)
print("                 F# = %.1f" % F)
print("Radius of Curvature = %.0f mm" % RoC)
print("       Focal Length = %.0f mm" % (RoC/2))
print("   Ronchi Frequency = %.3f lp/mm" % lp_per_mm)

plt.subplots(2,3,figsize=(13,8))

for i, z_offset in enumerate([-192,-55,82,219,356,493]):
    plt.subplot(2,3,i+1)
    x,y = lenstest.ronchi.gram(D, RoC, lp_per_mm, z_offset, conic=conic, invert=True)
    plt.plot(x,y,'o', markersize=0.1, color='blue')
#    for r in [0.37*D/2,0.7*D/2,0.93*D/2]:
#        lenstest.lenstest.draw_circle(r, color='red')
    lenstest.lenstest.draw_circle(D/2)
    plt.title("%.0fmm from focus"%z_offset)
    plt.gca().set_aspect("equal")
    if i in [1,2,4,5]:
        plt.yticks([])
    if i in [0,1,2]:
        plt.xticks([])
plt.show()
    Mirror Diameter = 8000 mm
                 F# = 7.0
Radius of Curvature = 112000 mm
       Focal Length = 56000 mm
   Ronchi Frequency = 0.133 lp/mm
_images/ronchi-basic_14_1.png

10 meter parabolic mirror comparison

Ronchigrams passing through focus

Here are six ronchigrams at different locations inside and outside the focus.

[8]:
D = 10000  # 10 meter mirror
F = 5
conic = -1
lp_per_mm = 0.133  # grating frequency lp/mm

RoC =  F * D * 2

print("    Mirror Diameter = %.0f mm" % D)
print("                 F# = %.1f" % F)
print("Radius of Curvature = %.0f mm" % RoC)
print("       Focal Length = %.0f mm" % (RoC/2))
print("   Ronchi Frequency = %.3f lp/mm" % lp_per_mm)

plt.subplots(2,3,figsize=(13,8))

for i, z_offset in enumerate([-63,35,133,231,329,429]):
    plt.subplot(2,3,i+1)
    x,y = lenstest.ronchi.gram(D, RoC, lp_per_mm, z_offset, conic=conic)
    plt.plot(x,y,'o', markersize=0.1, color='blue')
#    for r in [0.37*D/2,0.7*D/2,0.93*D/2]:
#        lenstest.lenstest.draw_circle(r, color='red')
    lenstest.lenstest.draw_circle(D/2)
    plt.title("%.0fmm from focus"%z_offset)
    plt.gca().set_aspect("equal")
    if i in [1,2,4,5]:
        plt.yticks([])
    if i in [0,1,2]:
        plt.xticks([])
plt.show()
    Mirror Diameter = 10000 mm
                 F# = 5.0
Radius of Curvature = 100000 mm
       Focal Length = 50000 mm
   Ronchi Frequency = 0.133 lp/mm
_images/ronchi-basic_16_1.png

We an compare this to figure 2 from Upton’s page on simulating the Ronchi test

ronchi simulation

[ ]: