esrf

Beamline Instrument Software Support
SPEC Macro documentation: [ Macro Index | BCU Home ]

#%TITLE% ElementsServer.mac
#%DESCRIPTION%
# Macros to interface with python element server
#%SETUP%
# If the python server is defined in the database, use %B%elt_setup%B% to setup device_name. 
# Otherwise, the server is used with localhost and port number.
#%END%


#%UU% <device_name>
#%MDESC% Set device_name for ElementsServer
#
def elt_setup '{
    if ($#!=1) {
	print "$0 <device_name>"
    }
    else {
	global PYELEMENT_DEV
	PYELEMENT_DEV= "$1"
	elt_checkserver()
    }
}'

#%UU% ()
#%MDESC% Checks if ElementsServer is running
#%BR%
#
def elt_checkserver() '{
    global PYELEMENT_DEV

    if (whatis("PYELEMENT_DEV")&0x08000000) {
        elt_print_error "call first elt_setup <device_name> to set your device server"
        exit
    }
    
    if (tango_io(PYELEMENT_DEV, "State")==-1) {
        elt_print_error "Elements Server "PYELEMENT_DEV " not running "
        exit
    }
}'

def elt_print_error 'print  "ElementsServer ERROR> "'

#%UU% (material)
#%MDESC% Return server ID for material
#
def elt_ID(material) '{
    return (tango_io(PYELEMENT_DEV, "GetMaterialID", material))
}'

#%UU% (material)
#%MDESC% Return material density
#
def elt_density(material) '{
    local id density
    id= elt_ID(material)
    if (id != -1) {
        density= tango_io(PYELEMENT_DEV, "GetDensity", id)
    } else {
        density= -1
    }
    return (density)
}'

#%UU% (material, energy)
#%MDESC% Return material cross-section at given energy
#
def elt_crosssection(material, energy) '{
    local float array inargs[2]
    local float array outargs[6]

    inargs[0]= elt_ID(material)
    if (inargs[0]==-1)
        return (-1)
    inargs[1]= energy

    if (tango_io(PYELEMENT_DEV, "GetCrossSection", inargs, outargs)!=6)
        return (-1)
    
    return outargs[1]
}'

#%UU% (material, thickness, density, energy)
#%MDESC% Return material transmission
#%BR% thickness (mm)
#%BR% density (g/cm3)
#%BR% energy (kev)
def elt_transmission(material, thickness, density, energy) '{
    local cross trans

    cross= elt_crosssection(material, energy)
    if (cross==-1)
        return (-1)
    trans= exp(-cross * density * thickness * 0.1)
    return (trans)
}'

#%UU% (material, thickness, transmission, energy)
#%MDESC% Calculates apparent density to fit given thickness/transmission/energy
#%BR% thickness (mm)
#%BR% energy (kev)
#
def elt_calcdensity(material, thickness, transmission, energy) '{
    local cross density
    cross= elt_crosssection(material, energy)
    if (cross==-1)
        return (-1)
    density= -log(transmission)/(cross*thickness*0.1)
    return (density)
}'

#%UU% (material, thickness, transm0, ene0m transm1, ene1, energy)
#%MDESC% Interpolates apparent density to fit given thickness/transmission/energy
#%BR% Return apparent density at given energy
#
def elt_interpoledensity(material, thickness, transm0, ene0, transm1, ene1, energy) '{
   local den0 den1 density

   den0= elt_calcdensity(material, thickness, transm0, ene0)
   if (den0 == -1)
      return (-1)

   den1= elt_calcdensity(material, thickness, transm1, ene1)
   if (den1 == -1)
      return (-1)

   density= (den1-den0)*(energy-ene0)/(ene1-ene0) + den0
   return (density)
}'
  
#%MACROS%
#%IMACROS%
#%TOC%
#%AUTHOR%