def test_spherical_mirror(): print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test_spherical_mirror") beam1 = Beam(5000) beam1.set_point(0, 0, 0) beam1.set_flat_divergence(5e-3, 5e-2) p = 2. q = 1. theta = 30 theta = theta * np.pi / 180 alpha = 0 * np.pi / 180 spherical_mirror = Optical_element.initialize_as_spherical_mirror( p, q, theta, alpha) #spherical_mirror.set_spherical_mirror_radius_from_focal_distances() print(spherical_mirror.R) beam1 = spherical_mirror.trace_optical_element(beam1) beam1.plot_xz() beam1.plot_xpzp() print(np.mean(beam1.flag)) if do_plot: plt.show() assert_almost_equal(np.abs(beam1.x).mean(), 0.0, 2) assert_almost_equal(np.abs(beam1.y).mean(), 0.0, 2) assert_almost_equal(np.abs(beam1.z).mean(), 0.0, 2)
def test_compound_wolter1_with_hole(): print( ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test_compound_wolter1_with_hole" ) p = 100. beam1 = Beam.initialize_as_person(100000) beam1.x *= 50. beam1.z *= 50. beam1.set_point(p, 0., p) op_ax = Beam(1) op_ax.set_point(p, 0., p) beam = op_ax.merge(beam1) beam.set_divergences_collimated() beam.plot_xz() p = 6 * 1e8 R = 100. theta = 0.001 * np.pi / 180 wolter = CompoundOpticalElement.initialiaze_as_wolter_1_with_two_parameters( p1=p, R=R, theta=theta) #beam = wolter.trace_compound(beam) beam = wolter.trace_good_rays(beam) beam.plot_good_xz() beam.retrace(10.) beam.plot_good_xz() plt.show()
def test_plane_mirror(): print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test_plane_mirror") beam1 = Beam(5000) beam1.set_point(0, 0, 0) beam1.set_flat_divergence(5e-3, 5e-2) p = 1. q = 1. theta = np.pi / 4 alpha = 0 plane_mirror = Optical_element.initialize_as_plane_mirror( p, q, theta, alpha) xmin = -10**5 xmax = 10**5 ymin = 10**5 ymax = -10**5 bound = BoundaryRectangle(xmax, xmin, ymax, ymin) plane_mirror.rectangular_bound(bound) beam1 = plane_mirror.trace_optical_element(beam1) beam1.plot_xz() beam1.plot_xpzp() if do_plot: plt.show()
def test_clean_wolter3(): p = 50. beam1 = Beam.initialize_as_person() beam1.set_point(p, 0., p) #beam1.set_rectangular_spot(5 / 2 * 1e-5, -5 / 2 * 1e-5, 5 / 2 * 1e-5, -5 / 2 * 1e-5) op_ax = Beam(1) op_ax.set_point(p, 0., p) beam = op_ax.merge(beam1) beam.set_divergences_collimated() beam.plot_xz() distance_between_the_foci = 10. wolter3 = CompoundOpticalElement.initialize_as_wolter_3( 20., 5., distance_between_the_foci) print(wolter3.oe1.ccc_object.get_coefficients()) print(wolter3.oe2.ccc_object.get_coefficients()) #beam = wolter3.trace_wolter3(beam, z0) beam = wolter3.trace_compound(beam) beam.plot_xz() beam.retrace(0.1) beam.plot_xz() plt.show()
def test_gaussian_beam(self): print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test_gaussian_beam") beam=Beam(5000) beam.set_point(1.,1.,1.) beam.set_gaussian_divergence(0.05,0.0005) print(np.mean(beam.vx)) print(np.mean(beam.vz)) assert_almost_equal(np.mean(beam.vx),0.0,1) assert_almost_equal(np.mean(beam.vz),0.0,1)
def test_compound_wolter2_with_hole(): p = 0. #beam1 = Beam.initialize_as_person(10000) beam1 = Beam(100000) beam1.set_circular_spot(1.) #beam1.set_rectangular_spot(5 / 2 * 1e-5, -5 / 2 * 1e-5, 5 / 2 * 1e-5, -5 / 2 * 1e-5) beam1.x *= 10. beam1.z *= 10. beam1.set_point(p, 0., p) op_ax = Beam(1) op_ax.set_point(p, 0., p) beam = op_ax.merge(beam1) beam.set_divergences_collimated() beam.plot_xz(0) p = 20000. q = 30. z0 = 5. focal = 2 * z0 + q wolter2 = CompoundOpticalElement.initialiaze_as_wolter_2(p1=p, q1=q, z0=z0) #oe1 = Optical_element.initialize_as_surface_conic_paraboloid_from_focal_distances(p=p, q=0., theta=0., alpha=0., infinity_location="p", focal=focal) #oe2 = Optical_element.initialize_my_hyperboloid(p=0., q=-q, theta=90*np.pi/180, alpha=0., wolter=2, z0=z0, distance_of_focalization=focal) #oe1.rotation_to_the_optical_element(beam) #oe1.translation_to_the_optical_element(beam) #[beam, t] = oe1.intersection_with_optical_element(beam) #oe1.output_direction_from_optical_element(beam) #[beam, t] = oe2.intersection_with_optical_element(beam) #oe2. output_direction_from_optical_element(beam) #oe2.theta = 0. #oe2.rotation_to_the_screen(beam) #oe2.translation_to_the_screen(beam) #oe2.intersection_with_the_screen(beam) beam = wolter2.trace_compound(beam) beam.plot_xz() print("mean(beam.x)=%f, mean(beam.y)=%f, mean(beam.z)=%f" % (np.mean(beam.x), np.mean(beam.y), np.mean(beam.z))) beam.retrace(10.) beam.plot_xz() plt.show()
def test_wolter2_good_rays(self): print( ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test_wolter2_good_rays" ) p = 100. ##### if p=100 the trace_good_ray goes crazy beam1 = Beam.initialize_as_person(10000) #beam1 = Beam(100000) #beam1.set_circular_spot(1.) # beam1.set_rectangular_spot(5 / 2 * 1e-5, -5 / 2 * 1e-5, 5 / 2 * 1e-5, -5 / 2 * 1e-5) beam1.x *= 10. beam1.z *= 10. beam1.set_point(p, 0., p) op_ax = Beam(1) op_ax.set_point(p, 0., p) beam = op_ax.merge(beam1) beam.set_divergences_collimated() beam.plot_xz(0) p = 20000. q = 30. z0 = 5. focal = 2 * z0 + q wolter2 = CompoundOpticalElement.initialiaze_as_wolter_2(p1=p, q1=q, z0=z0) beam = wolter2.trace_good_rays(beam) beam.plot_good_xz() beam.retrace(10.) beam.plot_good_xz() plt.title("test_wolter2_good_rays") print(beam.flag) if do_plot: plt.show()
def test_optimezed_wolter1_good_rays(self): print( ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> test_optimezed_wolter1_good_rays" ) p = 100. beam1 = Beam.initialize_as_person() beam1.x *= 50. beam1.z *= 50. beam1.set_point(p, 0., p) op_ax = Beam(1) op_ax.set_point(p, 0., p) beam = op_ax.merge(beam1) beam.set_divergences_collimated() beam.plot_xz() p = 1e12 R = 100. theta = 1e-3 * np.pi / 180 wolter1 = CompoundOpticalElement.initialiaze_as_wolter_1_with_two_parameters( p1=p, R=R, theta=theta) beam = wolter1.trace_good_rays(beam) beam.plot_good_xz() indices = np.where(beam.flag >= 0) assert_almost_equal(beam.x[indices], 0., 8) assert_almost_equal(beam.z[indices], 0., 8) beam.retrace(100.) beam.plot_good_xz() plt.title("optimezed_wolter1_good_rays") if do_plot: plt.show()
# #prova = Optical_element.initialize_as_surface_conic_paraboloid_from_focal_distances(p,q,theta,alpha,"p") #print(prova.ccc_object.get_coefficients()) # #beam=prova.trace_Wolter_2(beam) # #print(np.mean(beam.z)) #beam.plot_xy() #beam.plot_xz() #plt.show() beam1=Beam() beam1.set_divergences_collimated() beam1.set_point(0.+100,0.,20.+100) beam1.set_circular_spot(5.) beam2=Beam() beam2.set_divergences_collimated() beam2.set_point(0.+100,0.,0.+100) beam2.set_rectangular_spot(20.,-20.,15.,10.) beam=beam1.merge(beam2) beam3=Beam() beam3.set_divergences_collimated() beam3.set_point(0.+100,0.,0.+100) beam3.set_rectangular_spot(5.,-5.,10.,-40.)
from Beam import Beam from OpticalElement import Optical_element from Shape import BoundaryRectangle import numpy as np import matplotlib.pyplot as plt from numpy.testing import assert_almost_equal beam = Beam(1) #beam.set_flat_divergence(0.000005,0.001) beam.set_point(0., 0., 100.) beam.plot_xz() p = 2000. q = 2 * np.sqrt(2) theta = 0 * np.pi / 180 hyp_mirror = Optical_element.initialize_my_hyperboloid(p, q, theta) beam = hyp_mirror.trace_optical_element(beam) beam.plot_xz() beam.plot_xy() #print (hyp_mirror.ccc_object.get_coefficients()) print(np.mean(beam.z)) plt.show() # #beam=Beam()
def test_wolter_1_microscope(): p = 0. beam1 = Beam.initialize_as_person() beam1.set_flat_divergence_with_different_optical_axis(0.005, 0.005) beam1.set_point(p, 0., p) op_ax = Beam (1) op_ax.set_point(p, 0., p) beam = op_ax.merge(beam1) beam.x = beam.x beam.z = beam.z #beam.set_divergences_collimated() beam.plot_xz() distance_of_focalization = 5. hyp = Optical_element.initialize_my_hyperboloid(p=distance_of_focalization, q=0., theta=0., alpha=0., wolter=1.1, z0=0., distance_of_focalization=distance_of_focalization) ah = distance_of_focalization/np.sqrt(2) q = 20. z0 = 0.5*(q - np.sqrt(2)*ah) c = z0 + np.sqrt(2)*ah #b = c + 0.1 #a=np.sqrt(b**2-c**2) b = c*1.5 a = np.sqrt(b**2-c**2) ccc = np.array ([1/a**2, 1/a**2, 1/b**2, 0., 0., 0., 0., 0., -2*z0/b**2, z0**2/b**2-1]) ellips = Optical_element.initialize_as_surface_conic_from_coefficients(ccc) hyp.effect_of_optical_element(beam) beam.plot_yx(0) plt.title("footprint %s" % (hyp.type)) ellips.p = 0. ellips.theta = 90*np.pi/180 ellips.effect_of_optical_element(beam) beam.plot_yx(0) plt.title("footprint %s" % (ellips.type)) t = -beam.y/beam.vy beam.x = beam.x + beam.vx * t beam.y = beam.y + beam.vy * t beam.z = beam.z + beam.vz * t beam.plot_yx(0) beam.plot_xz() print("a of ellips is: %f" %(a)) print("b of ellips is: %f" %(b)) print("c of ellips is: %f" %(c)) print(np.mean(beam.z)) beam.histogram() plt.show()