Client Example

This python script reads the energy from the monocromator and, according to the analyzer selected by the first given argument, computes the distance hkl and thana offset values. Giving 1 as a second argument, these values would be written to the analyzer device together with the energy value, so the motors will be moved. The limits of the energy are also set to the analyzer device with the computed values.

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"