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"