def init(self, theta1, clen, lambda0, center, angle, extras): grating_offset=-0.075 exit_height=-1.0*inch exit_z=-0.275 my=blue_compressor basebeam=beam((0,0,-1.0), qtens(lambda0, w=0.001, r=Infinity)) optics=self.setup_reflectors_blue(basebeam, theta1, clen, grating_offset, lam0=lambda0, inside_retro_err=0.0) cs=Numeric.array((0, exit_height, -0.44)) #entrance to compressor, before rotation optics[my.IPERI1]=reflector("input peri bot", angle=0, center=cs, width=.025) optics[my.IPERI2]=reflector("input peri top", angle=0, center=cs+(0.0,-exit_height, 0), width=.025) optics[my.EXP1]=lens("expander diverge", f=-.15).place_between(cs+(-.1,0,0), optics[my.IPERI1], -0.09) optics[my.EXP2]=lens("expander re-coll", f=0.3).place_between(optics[my.IPERI2], (0,0,0), 0.037) #optics[my.EXP2]=lens("expander re-coll", f=0.3).place_between(optics[my.IPERI2], (0,0,0), 0.0357) optics[my.IPERI1].set_direction(optics[my.EXP1], optics[my.IPERI2]) optics[my.IPERI2].set_direction(optics[my.IPERI1], optics[my.EXP2]) optics[my.OPERI1]=reflector("output peri top", angle=0, center=(0,my.y_offset,exit_z), width=.025) optics[my.OPERI2]=reflector("output peri bot", angle=0, center=(0,exit_height,exit_z), width=.025) optics[my.TM1]=reflector("output turn 1", angle=90, center=(0.30, exit_height,exit_z), width=.025) optics[my.OPERI1].set_direction((0,my.y_offset,0), optics[my.OPERI2]) optics[my.OPERI2].set_direction(optics[my.OPERI1], optics[my.TM1]) comp_order=(my.EXP1, my.IPERI1, my.IPERI2, my.EXP2, my.GRATE, my.IR2, my.IR1, my.GRATE, my.VR1, my.VR2, my.GRATE, my.IR1, my.IR2, my.GRATE, my.OPERI1, my.OPERI2, my.TM1) composite_optic.init(self, "compressor", optics, comp_order, None, center=center, angle=angle, extras=extras )
def init(self, theta1, clen, lambda0, center, angle, extras): my=ir_compressor input_height=18*inch output_height=12*inch center_height=(input_height+output_height)/2.0 basebeam=beam((0,input_height,-1.0), qtens(lambda0, w=0.005, r=Infinity)) optics={} optics[my.INPUT]=m1=reflector("input mirror", center=(0, input_height, 0), width=8*inch, angle=-45) optics[my.G1]=g1=grating("g1", angle=theta1+90, center=(52*inch,center_height, 0), pitch=1740e3, order=1, width=16*inch, thickness=2.0*inch) mybeam=basebeam.clone() m1.transport_to_here(mybeam) m1.transform(mybeam) g1.transport_to_here(mybeam) g1.transform(mybeam) mybeam.free_drift(clen) #this is where grating 2 should be optics[my.G2]=g2=grating("g2", angle=theta1-90, center=mybeam.x0+(0,0,1e-8), pitch=1740e3, order=1, width=16*inch, thickness=2.0*inch) optics[my.VR1]=reflector("retro", center=(40*inch, center_height, g2.center[2]), angle=90.0, width=8*inch, thickness=1.0*inch) out=optics[my.OUTPUT]=reflector("output mirror", center=(8*inch, output_height, 0.0), width=8.0*inch, thickness=1.0*inch) focus=optics[my.FOCUS]=lens("output focus", center=out.center+(35*inch, 0, 7*inch), angle=90-math.atan(0.2)/deg, f=2.0, width=8.0*inch, height=8.0*inch, thickness=1.0*inch).tilt_off_axis(0) out.set_direction(g1.center-(0, center_height-output_height, 0), focus) comp_order=(my.INPUT, my.G1, my.G2, my.VR1, my.G2, my.G1, my.OUTPUT, my.FOCUS) composite_optic.init(self, "ir compressor", optics, comp_order, None, center=center, angle=0, extras=extras ) #prepare to handle to downslope in the beam through the compressor while we are still #not rotated to the funny beam axis m1label=self.mark_label(my.INPUT) g1label=self.mark_label(my.G1) m2label=self.mark_label(my.OUTPUT) ir_trace=trace_path(self, basebeam.clone()) path_len=(ir_trace[(m2label,0)].total_drift-ir_trace[(m1label,0)].total_drift) slope=(output_height-input_height)/path_len #distance from entrance to first g1 hit g1_first_distance=(ir_trace[(g1label,0)].total_drift-ir_trace[(m1label,0)].total_drift) #distance from entrance to second g1 hit g1_second_distance=(ir_trace[(g1label,1)].total_drift-ir_trace[(m1label,0)].total_drift) #now, rotate us to the real beam direction self.update_coordinates(self.center, self.center, general_optics.eulermat(angle, 0, 0)) #and set up the aiming points self.g1target1=g1.center+(0, (input_height-center_height)+g1_first_distance*slope, 0) self.g1target2=g1.center+(0, (input_height-center_height)+g1_second_distance*slope, 0) out.set_direction(self.g1target2, focus)
def __init__(self, center, from_optic, **extras): my=quadrupler optics={} ent=optics[my.ENTRANCE]=mir("quadrupler entrance") exit=optics[my.EXIT]=null_optic("quadrupler exit", (0,0,-1.0)) l1=optics[my.L1]=lens("quadrupler telescope 1", f=+0.300) l2=optics[my.L2]=lens("quadrupler telescope 2", f=-0.150).place_between(ent, exit, 0.111).tilt_off_axis(4.0) #print l2.strength green=optics[my.DOUBLE]=null_optic("green crystal").place_between(l2, exit, 0.1) optics[my.QUADRUPLE]=null_optic("UV crystal").place_between(green, exit, 0.1) order=(my.L1, my.ENTRANCE, my.L2, my.DOUBLE, my.QUADRUPLE, my.EXIT) composite_optic.init(self, "quadrupler", optics, order, (0,0,0), center, 0, extras=extras ) l1.place_between(from_optic, ent, -0.04)
def __init__(self, **extras): inch=0.0254 entrance_y=5.0*inch y0=2.5*inch #height of main line off table) my=blue_through_ylf optics={} #first, list all mirrors, and point them at each other optics[my.UVM1]=mir("UVM1", (13*inch, entrance_y, 7.5*inch)) optics[my.UVM2]=mir("UVM2", (7.5*inch, entrance_y, 7.5*inch)) optics[my.PS1u]=mir("Blue Peri 1 upper", (8*inch, entrance_y, 37*inch)) optics[my.PS1d]=mir("Blue Peri 1 lower", (8*inch, y0, 37*inch)) optics[my.UVM3]=mir("UVM3", (36*inch, y0, 38*inch)) optics[my.UVM4]=mir("UVM4", (36*inch, y0, 137.5*inch)) optics[my.UVM5]=mir("UVM5", (43.5*inch, y0, 49.5*inch)) optics[my.UVM6]=mir("UVM6", (46.5*inch, y0, 137.5*inch)) optics[my.UVM7]=mir("UVM7", (38*inch, y0, 38*inch)) optics[my.UVM8]=mir("UVM8", (41.5*inch, y0, 136*inch)) optics[my.UVM9]=mir("UVM9", (53*inch, y0, 136*inch)) optics[my.UVM10]=mir("UVM10", (53*inch, y0, 41*inch)) optics[my.UVM11]=mir("UVM11", (48*inch, y0, 41*inch)) optics[my.UVM12]=mir("YLF retro", (48*inch, y0,80.5*inch)) optics[my.YLF_SPLIT]=mir("YLF exit splitter", (48*inch, y0, 47.8*inch)) optics[my.UVL1]=lens("UVL1", f=+0.75).place_between(optics[my.UVM3], optics[my.UVM4], 4.0*inch) optics[my.UVL2]=lens("UVL2", f=+1.00).place_between(optics[my.UVL1], optics[my.UVM4], 83*inch-0.0*inch) optics[my.DEMAG1]=lens("UVL3", f=+0.75).place_between(optics[my.UVM9], optics[my.UVM10], 23.0*inch) optics[my.DEMAG2]=lens("UVL4", f=+1.00).place_between(optics[my.DEMAG1], optics[my.UVM10], 1.7+5.0*inch) optics[my.SERR]=null_optic("Serr. Aperture", width=1.0*inch, thickness=0.1*inch).place_between(optics[my.DEMAG1], optics[my.DEMAG2], 3*inch) optics[my.FILTER]=null_optic("Filter Aperture", width=1.0*inch, thickness=0.1*inch).place_between(optics[my.DEMAG1], optics[my.DEMAG2], 0.75) looks=[my.UVM1, my.UVM2, my.PS1u, my.PS1d, my.UVM3, my.UVM4, my.UVM5, my.UVM6, my.UVM7, my.UVM8, my.UVM9, my.UVM10, my.UVM11, my.UVM12, my.YLF_SPLIT] #align all mirrors for i in range(1, len(looks)-1): optics[looks[i]].set_direction(optics[looks[i-1]], optics[looks[i+1]]) order=[my.UVM1, my.UVM2, my.PS1u, my.PS1d, my.UVM3, my.UVL1, my.UVL2, my.UVM4, my.UVM5, my.UVM6, my.UVM7, my.UVM8, my.UVM9, my.DEMAG1, my.SERR, my.FILTER, my.DEMAG2, my.UVM10, my.UVM11, my.UVM12, my.YLF_SPLIT] #specify center and reference as (0,0,0) to make our coordinates absolute composite_optic.init(self, "blue line", optics, order, (0,0,0), (0,0,0), 0, extras=extras )
def __init__(self, center, from_optic, **extras): my = quadrupler optics = {} ent = optics[my.ENTRANCE] = mir("quadrupler entrance") exit = optics[my.EXIT] = null_optic("quadrupler exit", (0, 0, -1.0)) l1 = optics[my.L1] = lens("quadrupler telescope 1", f=+0.300) l2 = optics[my.L2] = lens("quadrupler telescope 2", f=-0.150).place_between( ent, exit, 0.111).tilt_off_axis(4.0) # print l2.strength green = optics[my.DOUBLE] = null_optic("green crystal").place_between( l2, exit, 0.1) optics[my.QUADRUPLE] = null_optic("UV crystal").place_between( green, exit, 0.1) order = (my.L1, my.ENTRANCE, my.L2, my.DOUBLE, my.QUADRUPLE, my.EXIT) composite_optic.init(self, "quadrupler", optics, order, (0, 0, 0), center, 0, extras=extras) l1.place_between(from_optic, ent, -0.04)
def init(self, theta1, clen, lambda0, center, angle, extras): grating_offset = -0.075 exit_height = -1.0 * inch exit_z = -0.275 my = blue_compressor basebeam = beam((0, 0, -1.0), qtens(lambda0, w=0.001, r=Infinity)) optics = self.setup_reflectors_blue(basebeam, theta1, clen, grating_offset, lam0=lambda0, inside_retro_err=0.0) # entrance to compressor, before rotation cs = Numeric.array((0, exit_height, -0.44)) optics[my.IPERI1] = reflector("input peri bot", angle=0, center=cs, width=.025) optics[my.IPERI2] = reflector("input peri top", angle=0, center=cs + (0.0, -exit_height, 0), width=.025) optics[my.EXP1] = lens("expander diverge", f=-.15).place_between(cs + (-.1, 0, 0), optics[my.IPERI1], -0.09) optics[my.EXP2] = lens("expander re-coll", f=0.3).place_between(optics[my.IPERI2], (0, 0, 0), 0.037) #optics[my.EXP2]=lens("expander re-coll", f=0.3).place_between(optics[my.IPERI2], (0,0,0), 0.0357) optics[my.IPERI1].set_direction(optics[my.EXP1], optics[my.IPERI2]) optics[my.IPERI2].set_direction(optics[my.IPERI1], optics[my.EXP2]) optics[my.OPERI1] = reflector("output peri top", angle=0, center=(0, my.y_offset, exit_z), width=.025) optics[my.OPERI2] = reflector("output peri bot", angle=0, center=(0, exit_height, exit_z), width=.025) optics[my.TM1] = reflector("output turn 1", angle=90, center=(0.30, exit_height, exit_z), width=.025) optics[my.OPERI1].set_direction((0, my.y_offset, 0), optics[my.OPERI2]) optics[my.OPERI2].set_direction(optics[my.OPERI1], optics[my.TM1]) comp_order = (my.EXP1, my.IPERI1, my.IPERI2, my.EXP2, my.GRATE, my.IR2, my.IR1, my.GRATE, my.VR1, my.VR2, my.GRATE, my.IR1, my.IR2, my.GRATE, my.OPERI1, my.OPERI2, my.TM1) composite_optic.init(self, "compressor", optics, comp_order, None, center=center, angle=angle, extras=extras)
def init(self, theta1, clen, lambda0, center, angle, extras): my = ir_compressor input_height = 18 * inch output_height = 12 * inch center_height = (input_height + output_height) / 2.0 basebeam = beam((0, input_height, -1.0), qtens(lambda0, w=0.005, r=Infinity)) optics = {} optics[my.INPUT] = m1 = reflector("input mirror", center=(0, input_height, 0), width=8 * inch, angle=-45) optics[my.G1] = g1 = grating("g1", angle=theta1 + 90, center=(52 * inch, center_height, 0), pitch=1740e3, order=1, width=16 * inch, thickness=2.0 * inch) mybeam = basebeam.clone() m1.transport_to_here(mybeam) m1.transform(mybeam) g1.transport_to_here(mybeam) g1.transform(mybeam) mybeam.free_drift(clen) # this is where grating 2 should be optics[my.G2] = g2 = grating("g2", angle=theta1 - 90, center=mybeam.x0 + (0, 0, 1e-8), pitch=1740e3, order=1, width=16 * inch, thickness=2.0 * inch) optics[my.VR1] = reflector("retro", center=(40 * inch, center_height, g2.center[2]), angle=90.0, width=8 * inch, thickness=1.0 * inch) out = optics[my.OUTPUT] = reflector("output mirror", center=(8 * inch, output_height, 0.0), width=8.0 * inch, thickness=1.0 * inch) focus = optics[my.FOCUS] = lens("output focus", center=out.center + (35 * inch, 0, 7 * inch), angle=90 - math.atan(0.2) / deg, f=2.0, width=8.0 * inch, height=8.0 * inch, thickness=1.0 * inch).tilt_off_axis(0) out.set_direction(g1.center - (0, center_height - output_height, 0), focus) comp_order = (my.INPUT, my.G1, my.G2, my.VR1, my.G2, my.G1, my.OUTPUT, my.FOCUS) composite_optic.init(self, "ir compressor", optics, comp_order, None, center=center, angle=0, extras=extras) # prepare to handle to downslope in the beam through the compressor while we are still # not rotated to the funny beam axis m1label = self.mark_label(my.INPUT) g1label = self.mark_label(my.G1) m2label = self.mark_label(my.OUTPUT) ir_trace = trace_path(self, basebeam.clone()) path_len = (ir_trace[(m2label, 0)].total_drift - ir_trace[(m1label, 0)].total_drift) slope = (output_height - input_height) / path_len # distance from entrance to first g1 hit g1_first_distance = (ir_trace[(g1label, 0)].total_drift - ir_trace[(m1label, 0)].total_drift) # distance from entrance to second g1 hit g1_second_distance = (ir_trace[(g1label, 1)].total_drift - ir_trace[(m1label, 0)].total_drift) # now, rotate us to the real beam direction self.update_coordinates(self.center, self.center, general_optics.eulermat(angle, 0, 0)) # and set up the aiming points self.g1target1 = g1.center + (0, (input_height - center_height) + g1_first_distance * slope, 0) self.g1target2 = g1.center + (0, (input_height - center_height) + g1_second_distance * slope, 0) out.set_direction(self.g1target2, focus)
def __init__(self, **extras): inch = 0.0254 entrance_y = 5.0 * inch exit_y = 13.5 * inch my = ir_line optics = {} # first, list all mirrors, and point them at each other optics[my.M1] = mir("M1", (2 * inch, entrance_y, 10 * inch)) optics[my.M2] = mir("M2", (4 * inch, entrance_y, 10 * inch)) optics[my.TrM1] = mir("TrM1", (4 * inch, entrance_y, 96 * inch)) optics[my.TrM2] = mir("TrM2", (6 * inch, entrance_y, 96 * inch)) optics[my.TrM3] = mir("TrM3", (6 * inch, entrance_y, 82.5 * inch)) optics[my.TrM4] = mir("TrM4", (2 * inch, entrance_y, 82.5 * inch)) optics[my.M3] = mir("M3", (4 * inch, entrance_y, 135 * inch)) optics[my.M4] = mir("M4", (12 * inch, entrance_y, 135 * inch)) optics[my.M5] = mir("M5", (13 * inch, entrance_y, 105 * inch)) optics[my.M6] = mir("M6", (14 * inch, entrance_y, 105 * inch)) optics[my.M7] = mir("M7", (16.5 * inch, entrance_y, 3 * inch)) optics[my.M8] = mir("M8", (24 * inch, entrance_y, 3 * inch)) optics[my.M9] = mir("M9", (23 * inch, entrance_y, 135 * inch)) optics[my.M10] = mir("M10", (33 * inch, entrance_y, 134.5 * inch)) optics[my.M11] = mir("M11", (33 * inch, entrance_y, -6 * inch)) optics[my.BP4] = PL_brewster_filter("BP4", (33 * inch, entrance_y, 27 * inch), reversed=1) optics[my.M12] = mir("M12", (20 * inch, entrance_y, 33 * inch)) optics[my.M13] = mir("M13", (20 * inch, entrance_y, 12 * inch)) optics[my.M14] = mir("M14", (8.5 * inch, entrance_y, 11.5 * inch)) optics[my.M15] = mir("M15", (8.5 * inch, exit_y, 11.5 * inch)) optics[my.EXIT] = sys_exit = null_optic( "exit", (10.0 * inch, exit_y, 142.0 * inch)) optics[my.L1] = lens("L1", f=+0.400).place_between(optics[my.M2], optics[my.TrM1], 12.0 * inch) optics[my.L2] = lens("L2", f=+0.800).place_between(optics[my.L1], optics[my.TrM1], 1.30) optics[my.L3] = lens("L3", f=+0.750).place_between(optics[my.M6], optics[my.M7], 10 * inch) optics[my.L4] = lens("L4", f=+1.500).place_between(optics[my.L3], optics[my.M7], 2.25) optics[my.L5] = lens("L5", f=+0.750).place_between(optics[my.M10], optics[my.M11], 5 * inch) optics[my.L6] = lens("L6", f=+1.500).place_between(optics[my.L5], optics[my.M11], 95.5 * inch) optics[my.L7] = lens("L7", f=+0.750).place_between(optics[my.M15], sys_exit, 4.5 * inch) optics[my.L8] = lens("L8", f=+2.500, width=6 * inch, thickness=0.25 * inch).place_between( optics[my.M15], sys_exit, -1 * inch).tilt_off_axis((0, 45, 0)) optics[my.G9a] = laser_head("9mm-1", width=2.0 * inch, thickness=6.0 * inch, rodsize=0.009).\ place_between(optics[my.M4], optics[my.M5], 9 * inch) optics[my.G9b] = laser_head("9mm-2", width=2.0 * inch, thickness=6.0 * inch, rodsize=0.009).\ place_between(optics[my.M4], optics[my.M5], 23 * inch) optics[my.G25a] = laser_head("25mm-1", width=6.0 * inch, thickness=12.0 * inch, rodsize=0.025).\ place_between(optics[my.M8], optics[my.M9], 74 * inch) optics[my.G25b] = laser_head("25mm-2", width=6.0 * inch, thickness=12.0 * inch, rodsize=0.025).\ place_between(optics[my.M8], optics[my.M9], 94 * inch) optics[my.G50] = laser_head("50mm", width=9.0 * inch, thickness=15.0 * inch, rodsize=0.050).\ place_between(optics[my.M10], optics[my.M11], -19 * inch) optics[my.SERR1] = serrated_aperture("serrated aperture", diameter=0.003).\ place_between(optics[my.M2], optics[my.TrM1], 10 * inch) optics[my.SF1] = plain_aperture("spatial filter 1", diameter=0.001).\ place_between(optics[my.M2], optics[my.TrM1], 35 * inch) optics[my.QR1] = halfwave_plate("QR1", width=1 * inch, thickness=0.5 * inch).place_between( optics[my.G9a], optics[my.G9b], 8 * inch).rotate_axis(22.5) optics[my.FR12] = faraday_rotator("FR12", width=0.5 * inch, thickness=6 * inch, rotation=45).\ place_between(optics[my.M6], optics[my.M7], 5 * inch) optics[my.VSF1] = vacuum_spatial_filter("VSF1", thickness=24 * inch, width=2 * inch).\ place_between(optics[my.L3], optics[my.L4], 0.750) optics[my.QR2] = halfwave_plate("QR2", width=1 * inch, thickness=0.5 * inch).place_between( optics[my.G25a], optics[my.G25b], 8 * inch).rotate_axis(22.5) optics[my.BP2] = PL_brewster_filter("BP2", transmit=1).place_between( optics[my.G25b], optics[my.M9], 13 * inch).rotate_axis(90) optics[my.QR3] = halfwave_plate("QR3", width=1 * inch, thickness=0.5 * inch).place_between( optics[my.G25b], optics[my.M9], 19 * inch).rotate_axis(22.5) optics[my.FR25] = faraday_rotator("FR25", width=1.0 * inch, thickness=6.0 * inch, rotation=45).\ place_between(optics[my.G25b], optics[my.M9], 23 * inch) optics[my.BP3] = PL_brewster_filter("BP3", transmit=1).\ place_between(optics[my.G25b], optics[my.M9], 30 * inch).rotate_axis(0) looks = [ my.M1, my.M2, my.TrM1, my.TrM2, my.TrM3, my.TrM4, my.M3, my.M4, my.M5, my.M6, my.M7, my.M8, my.M9, my.M10, my.M11, my.BP4, my.M12, my.M13, my.M14, my.M15, my.EXIT ] # align all mirrors for i in range(1, len(looks) - 1): optics[looks[i]].set_direction(optics[looks[i - 1]], optics[looks[i + 1]]) order = [ my.M1, my.M2, my.SERR1, my.L1, my.SF1, my.L2, my.TrM1, my.TrM2, my.TrM3, my.TrM4, my.M3, my.M4, my.G9a, my.QR1, my.G9b, my.M5, my.M6, my.FR12, my.L3, my.VSF1, my.L4, my.M7, my.M8, my.G25a, my.QR2, my.G25b, my.BP2, my.QR3, my.FR25, my.BP3, my.M9, my.M10, my.L5, my.L6, my.G50, my.M11, my.BP4, my.M12, my.M13, my.M14, my.M15, my.L7, my.L8 ] # specify center and reference as (0,0,0) to make our coordinates absolute composite_optic.init(self, "IR line", optics, order, (0, 0, 0), (0, 0, 0), 0, extras=extras)
def __init__(self, **extras): inch = 0.0254 entrance_y = 5.0 * inch y0 = 2.5 * inch # height of main line off table) my = blue_through_ylf optics = {} # first, list all mirrors, and point them at each other optics[my.UVM1] = mir("UVM1", (13 * inch, entrance_y, 7.5 * inch)) optics[my.UVM2] = mir("UVM2", (7.5 * inch, entrance_y, 7.5 * inch)) optics[my.PS1u] = mir("Blue Peri 1 upper", (8 * inch, entrance_y, 37 * inch)) optics[my.PS1d] = mir("Blue Peri 1 lower", (8 * inch, y0, 37 * inch)) optics[my.UVM3] = mir("UVM3", (36 * inch, y0, 38 * inch)) optics[my.UVM4] = mir("UVM4", (36 * inch, y0, 137.5 * inch)) optics[my.UVM5] = mir("UVM5", (43.5 * inch, y0, 49.5 * inch)) optics[my.UVM6] = mir("UVM6", (46.5 * inch, y0, 137.5 * inch)) optics[my.UVM7] = mir("UVM7", (38 * inch, y0, 38 * inch)) optics[my.UVM8] = mir("UVM8", (41.5 * inch, y0, 136 * inch)) optics[my.UVM9] = mir("UVM9", (53 * inch, y0, 136 * inch)) optics[my.UVM10] = mir("UVM10", (53 * inch, y0, 41 * inch)) optics[my.UVM11] = mir("UVM11", (48 * inch, y0, 41 * inch)) optics[my.UVM12] = mir("YLF retro", (48 * inch, y0, 80.5 * inch)) optics[my.YLF_SPLIT] = mir("YLF exit splitter", (48 * inch, y0, 47.8 * inch)) optics[my.UVL1] = lens("UVL1", f=+0.75).place_between(optics[my.UVM3], optics[my.UVM4], 4.0 * inch) optics[my.UVL2] = lens("UVL2", f=+1.00).place_between(optics[my.UVL1], optics[my.UVM4], 83 * inch - 0.0 * inch) optics[my.DEMAG1] = lens("UVL3", f=+0.75).place_between( optics[my.UVM9], optics[my.UVM10], 23.0 * inch) optics[my.DEMAG2] = lens("UVL4", f=+1.00).place_between( optics[my.DEMAG1], optics[my.UVM10], 1.7 + 5.0 * inch) optics[my.SERR] = null_optic("Serr. Aperture", width=1.0 * inch, thickness=0.1 * inch).place_between( optics[my.DEMAG1], optics[my.DEMAG2], 3 * inch) optics[my.FILTER] = null_optic("Filter Aperture", width=1.0 * inch, thickness=0.1 * inch).place_between( optics[my.DEMAG1], optics[my.DEMAG2], 0.75) looks = [ my.UVM1, my.UVM2, my.PS1u, my.PS1d, my.UVM3, my.UVM4, my.UVM5, my.UVM6, my.UVM7, my.UVM8, my.UVM9, my.UVM10, my.UVM11, my.UVM12, my.YLF_SPLIT ] # align all mirrors for i in range(1, len(looks) - 1): optics[looks[i]].set_direction(optics[looks[i - 1]], optics[looks[i + 1]]) order = [ my.UVM1, my.UVM2, my.PS1u, my.PS1d, my.UVM3, my.UVL1, my.UVL2, my.UVM4, my.UVM5, my.UVM6, my.UVM7, my.UVM8, my.UVM9, my.DEMAG1, my.SERR, my.FILTER, my.DEMAG2, my.UVM10, my.UVM11, my.UVM12, my.YLF_SPLIT ] # specify center and reference as (0,0,0) to make our coordinates absolute composite_optic.init(self, "blue line", optics, order, (0, 0, 0), (0, 0, 0), 0, extras=extras)
def __init__(self, **extras): inch=0.0254 entrance_y=5.0*inch exit_y=13.5*inch my=ir_line optics={} #first, list all mirrors, and point them at each other optics[my.M1]=mir("M1", (2*inch, entrance_y, 10*inch)) optics[my.M2]=mir("M2", (4*inch, entrance_y, 10*inch)) optics[my.TrM1]=mir("TrM1", (4*inch, entrance_y, 96*inch)) optics[my.TrM2]=mir("TrM2", (6*inch, entrance_y, 96*inch)) optics[my.TrM3]=mir("TrM3", (6*inch, entrance_y, 82.5*inch)) optics[my.TrM4]=mir("TrM4", (2*inch, entrance_y, 82.5*inch)) optics[my.M3]=mir("M3", (4*inch, entrance_y, 135*inch)) optics[my.M4]=mir("M4", (12*inch, entrance_y, 135*inch)) optics[my.M5]=mir("M5", (13*inch, entrance_y, 105*inch)) optics[my.M6]=mir("M6", (14*inch, entrance_y, 105*inch)) optics[my.M7]=mir("M7", (16.5*inch, entrance_y, 3*inch)) optics[my.M8]=mir("M8", (24*inch, entrance_y, 3*inch)) optics[my.M9]=mir("M9", (23*inch, entrance_y, 135*inch)) optics[my.M10]=mir("M10", (33*inch, entrance_y, 134.5*inch)) optics[my.M11]=mir("M11", (33*inch, entrance_y, -6*inch)) optics[my.BP4]=PL_brewster_filter("BP4", (33*inch, entrance_y, 27*inch), reversed=1) optics[my.M12]=mir("M12", (20*inch, entrance_y, 33*inch)) optics[my.M13]=mir("M13", (20*inch, entrance_y, 12*inch)) optics[my.M14]=mir("M14", (8.5*inch, entrance_y, 11.5*inch)) optics[my.M15]=mir("M15", (8.5*inch, exit_y, 11.5*inch)) optics[my.EXIT]=sys_exit=null_optic("exit", (10.0*inch, exit_y, 142.0*inch)) optics[my.L1]=lens("L1", f=+0.400).place_between(optics[my.M2], optics[my.TrM1], 12.0*inch) optics[my.L2]=lens("L2", f=+0.800).place_between(optics[my.L1], optics[my.TrM1], 1.30) optics[my.L3]=lens("L3", f=+0.750).place_between(optics[my.M6], optics[my.M7], 10*inch) optics[my.L4]=lens("L4", f=+1.500).place_between(optics[my.L3], optics[my.M7], 2.25) optics[my.L5]=lens("L5", f=+0.750).place_between(optics[my.M10], optics[my.M11], 5*inch) optics[my.L6]=lens("L6", f=+1.500).place_between(optics[my.L5], optics[my.M11], 95.5*inch) optics[my.L7]=lens("L7", f=+0.750).place_between(optics[my.M15], sys_exit, 4.5*inch) optics[my.L8]=lens("L8", f=+2.500, width=6*inch, thickness=0.25*inch).\ place_between(optics[my.M15], sys_exit, -1*inch).tilt_off_axis((0,45,0)) optics[my.G9a]=laser_head("9mm-1", width=2.0*inch, thickness=6.0*inch, rodsize=0.009).\ place_between(optics[my.M4], optics[my.M5], 9*inch) optics[my.G9b]=laser_head("9mm-2", width=2.0*inch, thickness=6.0*inch, rodsize=0.009).\ place_between(optics[my.M4], optics[my.M5], 23*inch) optics[my.G25a]=laser_head("25mm-1", width=6.0*inch, thickness=12.0*inch, rodsize=0.025).\ place_between(optics[my.M8], optics[my.M9], 74*inch) optics[my.G25b]=laser_head("25mm-2", width=6.0*inch, thickness=12.0*inch, rodsize=0.025).\ place_between(optics[my.M8], optics[my.M9], 94*inch) optics[my.G50]=laser_head("50mm", width=9.0*inch, thickness=15.0*inch, rodsize=0.050).\ place_between(optics[my.M10], optics[my.M11], -19*inch) optics[my.SERR1]=serrated_aperture("serrated aperture", diameter=0.003).\ place_between(optics[my.M2], optics[my.TrM1], 10*inch) optics[my.SF1]=plain_aperture("spatial filter 1", diameter=0.001).\ place_between(optics[my.M2], optics[my.TrM1], 35*inch) optics[my.QR1]=halfwave_plate("QR1", width=1*inch, thickness=0.5*inch).\ place_between(optics[my.G9a], optics[my.G9b], 8*inch).rotate_axis(22.5) optics[my.FR12]=faraday_rotator("FR12", width=0.5*inch, thickness=6*inch, rotation=45).\ place_between(optics[my.M6], optics[my.M7], 5*inch) optics[my.VSF1]=vacuum_spatial_filter("VSF1", thickness=24*inch, width=2*inch).\ place_between(optics[my.L3], optics[my.L4], 0.750) optics[my.QR2]=halfwave_plate("QR2", width=1*inch, thickness=0.5*inch).\ place_between(optics[my.G25a], optics[my.G25b], 8*inch).rotate_axis(22.5) optics[my.BP2]=PL_brewster_filter("BP2", transmit=1).\ place_between(optics[my.G25b], optics[my.M9], 13*inch).rotate_axis(90) optics[my.QR3]=halfwave_plate("QR3", width=1*inch, thickness=0.5*inch).\ place_between(optics[my.G25b], optics[my.M9], 19*inch).rotate_axis(22.5) optics[my.FR25]=faraday_rotator("FR25", width=1.0*inch, thickness=6.0*inch, rotation=45).\ place_between(optics[my.G25b], optics[my.M9], 23*inch) optics[my.BP3]=PL_brewster_filter("BP3", transmit=1).\ place_between(optics[my.G25b], optics[my.M9], 30*inch).rotate_axis(0) looks=[my.M1, my.M2, my.TrM1, my.TrM2, my.TrM3, my.TrM4, my.M3, my.M4, my.M5, my.M6, my.M7, my.M8, my.M9, my.M10, my.M11, my.BP4, my.M12, my.M13, my.M14, my.M15, my.EXIT] #align all mirrors for i in range(1, len(looks)-1): optics[looks[i]].set_direction(optics[looks[i-1]], optics[looks[i+1]]) order=[my.M1, my.M2, my.SERR1, my.L1, my.SF1, my.L2, my.TrM1, my.TrM2, my.TrM3, my.TrM4, my.M3, my.M4, my.G9a, my.QR1, my.G9b, my.M5, my.M6, my.FR12, my.L3, my.VSF1, my.L4, my.M7, my.M8, my.G25a, my.QR2, my.G25b, my.BP2, my.QR3, my.FR25, my.BP3, my.M9, my.M10, my.L5, my.L6, my.G50, my.M11, my.BP4, my.M12, my.M13, my.M14, my.M15, my.L7, my.L8] #specify center and reference as (0,0,0) to make our coordinates absolute composite_optic.init(self, "IR line", optics, order, (0,0,0), (0,0,0), 0, extras=extras )