#%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%
|