from PyTango import * from math import sqrt,sin,asin import sys import time if( len( sys.argv) < 3): print " " print "This program requires 2 arguments:" print "--> Analyzer Id" print "--> flag for choosing if writting the computed dhkl " print " and thana_offset values to the Analyzer Tango device and move" print " move the motors (0 -> no, 1 -> yes)." print "Possible analyser values: " print "\n" print " (0) no Analyser \n" print " (1) Al 100 \n" print " (2) Al 110 \n" print " (3) Al 111 \n" print " (4) Au 111 \n" print " (5) Cu 100 \n" print " (6) Cu 110 \n" print " (7) Cu 111 \n" print " (8) Dy 001 \n" print " (9) Ge 100 \n" print " (10) Ge 110 \n" print " (11) Ge 111 \n" print " (12) LiF 100 \n" print " (13) LiF 110 \n" print " (14) MgO 110 \n" print " (15) MgO 111 \n" print " (16) PG 001 \n" print " (17) Si 100 \n" print " (18) Si 110 \n" print " (19) Si 111 \n" print " (100) Analyser is not listed \n" print "Run 'python ana_setup.py energy_value analyzer_id'" else: energy_device = DeviceProxy("p09/dcmener/mono.01") energy = energy_device.Position print energy energy = energy/1000. print energy analyser = int(sys.argv[1]) analyser_option = analyser flag_write_to_device = int(sys.argv[2]) status = 1 theta_motor = DeviceProxy( "p09/motor/exp.17") thana = theta_motor.Position etaana_motor = DeviceProxy( "p09/motor/exp.19") etaana = etaana_motor.Position #$energy=12.39842/$wavelength; wavelength=12.39842/energy; my_pi=3.14159265 finish1 = 0 ana ="nan" h = 0 k = 0 l = 0 dhkl = 0 exception = 0 mismatch = 0 continue_ana_setup = 0 if analyser == 0: ana="nan" dhkl="nan" print " You are not using any polarisation analyzer \n\n" finish1 = 1 elif analyser == 1: ana="Al 100" h = 2 k = 0 l = 0 dhkl=4.0496/2 exception=0; elif analyser == 2: ana="Al 110" h = 2 k = 2 l = 0 dhkl=4.0496/sqrt(8) exception=0 elif analyser == 3: ana="Al 111" h = 1 k = 1 l = 1 dhkl=4.0496/sqrt(3) exception=0 elif analyser == 4: ana="Au 111" h = 1 k = 1 l = 1 dhkl=4.080/sqrt(3) exception=0 elif analyser == 5: ana="Cu 100" h = 2 k = 0 l = 0 dhkl=3.610/2 exception=0 elif analyser == 6: ana="Cu 110" h = 2 k = 2 l = 0 dhkl=3.610/sqrt(8) exception=0 elif analyser == 7: ana="Cu 111" h = 1 k = 1 l = 1 dhkl=3.610/sqrt(3) exception=0 elif analyser == 8: ana="Dy 001" h = 0 k = 0 l = 2 dhkl=5.6475/2 exception=0 elif analyser == 9: ana="Ge 100" h = 2 k = 0 l = 0 dhkl=5.64613/2 exception=1 elif analyser == 10: ana="Ge 110" h = 2 k = 2 l = 0 dhkl=5.64613/sqrt(8) exception=0 elif analyser == 11: ana="Ge 111" h = 1 k = 1 l = 1 dhkl=5.64613/sqrt(3) exception=2 elif analyser == 12: ana="LiF 100" h = 2 k = 0 l = 0 dhkl=4.0258/2 exception=0 elif analyser == 13: ana="LiF 110" h = 2 k = 2 l = 0 dhkl=4.0258/sqrt(8) exception=0 elif analyser == 14: ana="MgO 110" h = 2 k = 2 l = 0 dhkl=4.2120/sqrt(8) exception=0 elif analyser == 15: ana="MgO 111" h = 1 k = 1 l = 1 dhkl=4.2120/sqrt(3) exception=0 elif analyser == 16: ana="PG 001" h = 0 k = 0 l = 2 dhkl=6.7079/2 exception=0 elif analyser == 17: ana="Si 100" h = 2 k = 0 l = 0 dhkl=5.43095/2 exception=1 elif analyser == 18: ana="Si 110" h = 2 k = 2 l = 0 dhkl=5.43095/sqrt(8) exception=0 elif analyser == 19: ana="Si 111" h = 1 k = 1 l = 1 dhkl=5.43095/sqrt(3) exception=2 elif analyser == 100: dhkl="nan" ana="nan" print "\n" print "\n" print " Please update file ana_setup.pl in directory /home/p09/prog/spec_macros/ \n\n" print "\n" finish1 = 1 if finish1 == 0: analyser = sin(82*my_pi/360) ana_estop_1=12.39842/(2*dhkl*analyser/1) ana_estop_2=12.39842/(2*dhkl*analyser/2) ana_estop_3=12.39842/(2*dhkl*analyser/3) ana_estop_4=12.39842/(2*dhkl*analyser/4) analyser=sin(98*my_pi/360) ana_estart_1=12.39842/(2*dhkl*analyser/1) ana_estart_2=12.39842/(2*dhkl*analyser/2) ana_estart_3=12.39842/(2*dhkl*analyser/3) ana_estart_4=12.39842/(2*dhkl*analyser/4) if energy > ana_estart_1 and energy < ana_estop_1 and (exception == 0 or exception == 2): dhkl=dhkl h=h k=k l=l elif energy > ana_estart_1 and energy < ana_estop_1 and exception == 1: h=h k=k l=l mismatch = 1 elif energy > ana_estart_2 and energy < ana_estop_2 and ( exception == 0 or exception) == 1: dhkl=dhkl/2 h=2*h k=2*k l=2*l elif energy > ana_estart_2 and energy < ana_estop_2 and exception == 2: h=h k=k l=l mismatch = 1 elif energy > ana_estart_3 and energy < ana_estop_3 and ( exception == 0 or exception == 2): dhkl=dhkl/3 h=3*h k=3*k l=3*l elif energy > ana_estart_3 and energy < ana_estop_3 and exception == 1: h=h k=k l=l mismatch = 1 elif energy > ana_estart_4 and energy < ana_estop_4: dhkl=dhkl/4 h=4*h k=4*k l=4*l else: h=h k=k l=l mismatch = 1 if mismatch == 0: thana_calc= asin( wavelength/(2*dhkl))*180/my_pi thana_offset=thana-thana_calc analyser=sin(82*my_pi/360) ana_estop=12.39842/(2*dhkl*analyser/1) analyser=sin(98*my_pi/360) ana_estart=12.39842/(2*dhkl*analyser/1) if energy > ana_estart and energy < ana_estop: print "\n" print "\n" print " Did you center pth (y/n) ?. If not start again the program" print "\n" print "\n" onoff=1 ana_flag = onoff print " You are using " + str(h) + str(k) + str(l) + " reflexion of analyser " + ana + " \n" print " Lattice spacing is " + str(dhkl) + " Angstroem" print " Calculated value for position of pth is " + str(thana_calc) + " degrees " print " Current centered position of pth (at peta = " + str(etaana) + ") is " + str(thana) + " degrees" print " Offset in pth is " + str(thana_offset) + " degrees \n" f = open('ana_setup.output','w') f.write(str(ana_flag) + " \n") f.write(str(ana) + " " + str(h) + str(k) + str(l) + " " + str(energy) + " " + str(analyser_option) + " " + str(thana_offset) + " " + str(etaana)) print " Remark: centered position of pth might change when changing peta \n" print " If this is the case, enter this menu again after centering pth at" print " the new position of peta \n" print "\n" print "\n" if flag_write_to_device == 1: analyzer_device = DeviceProxy("p09/analyzer/exp.01") analyzer_device.Dhkl = dhkl analyzer_device.ThanaOffset = thana_offset energy = energy*1000. print energy ana_estop = ana_estop*1000. ana_estart = ana_estart*1000. analyzer_device.UnitLimitMax = ana_estop analyzer_device.UnitLimitMin = ana_estart analyzer_device.Position = energy else: # mismatch: print "\n" print "\n" print " Energy = " print energy print " keV \n" print "\n" if exception != 1: print str(ana) + " works best between " print ana_estart_1 print " and " print ana_estop_1 print " keV \n" if exception == 1: print str(ana) +" works best between " print ana_estart_2 print " and " print ana_estop_2 print " keV \n" if exception != 2 and exception != 1: print " " print ana_estart_2 print " and " print ana_estop_2 print " keV \n" if exception != 1: print " " print ana_estart_3 print " and " print ana_estop_3 print " keV \n" if exception == 2 or exception == 1 or analyser_option == 16 or analyser_option == 8: print " " print ana_estart_4 print " and " print ana_estop_4 print " keV \n" print " \n" print " Select another analyser or move the energy ! \n\n\n" else: #finish1: onoff=0 ana_flag = onoff thana_offset="nan" dhkl="nan" analyser_option="nan" f = open('ana_setup.output','w') f.write(str(ana_flag) + " \n") f.write(str(ana) + " " + str(h) + str(k) + str(l) + " " + str(energy) + " " + str(analyser_option) + " " + str(thana_offset) + " " + str(etaana)) print " Wrong use of the program: \n" print " Posible errors: " print " -- You are not using any polarisation analyzer" print " -- Please center pth"