esrf

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

#$Log: wagoaux.mac,v $
#Revision 1.1  2008/12/10 13:05:13  beteva
#Initial revision
#
#%TITLE% WAGOAUX.MAC
#%NAME% %B%wagoaux.mac%B% - Auxilary macros to change gains and calibrate wago
#counters.
#%DESCRIPTION%B% - The counters are read from a Wago ADC, using the WagoCt
#device server. They are configured in SPEC as VCT6 counters only, with factor
#of 1000. The gains (if any) are connected to WAGO relay modules and are
#controlled using the same WagoCt device servers.
#%END%

#%UU% [ctmne gain_factor scale_factor offset]
#%MDESC%
def wagoaux_setup '{
local inp[] nb_gf nb_s nb gf
global W_CTMNE W_GAINF W_SCALEF W_OFFSET W_CTDEV
  if ($# == 0) {
    ctmne = getval("Counter mnemonic (i.e. i0):", W_CTMNE[ctmne])
    W_CTMNE[ctmne] = ctmne
    nb_gf = yesno("Do you have different gain factors for each gain?:",0)
    if (!nb_gf) {
      W_GAINF[W_CTMNE[ctmne]][0] = getval ("Gain factor (i.e. 100):", \
					W_GAINF[W_CTMNE[ctmne]][0])
      gf = W_GAINF[W_CTMNE[ctmne]][0]
      for (nb_gf = 0; nb_gf < 3; nb_gf++)
        W_GAINF[W_CTMNE[ctmne]][nb_gf] = pow(gf,(nb_gf+1))
    } else {
      for (nb_gf = 0; nb_gf < 3; nb_gf++) {
        W_GAINF[W_CTMNE[ctmne]][nb_gf] = \
	  getval ("Gain factor (i.e. 100):", W_GAINF[W_CTMNE[ctmne]][nb_gf])
      }
    }
    nb_s = \
	yesno("Do you have different scale factors for different energies?:",0)
    if (!nb_s) {
      W_SCALEF[W_CTMNE[ctmne]] = getval ("Scale factor:", W_SCALEF[W_CTMNE[ctmne]])
      W_OFFSET[W_CTMNE[ctmne]] = getval ("Scale offset:", W_OFFSET[W_CTMNE[ctmne]])
    } else {
      #to be discussed
    }
  } else {
    nb = split("$*", inp) - 1
    ctmne = inp [0]
    W_CTMNE[ctmne] = ctmne
    nb_gf = inp[1]
    if (nb_gf > 3) {
      for (gf = 0; gf < 3; gf++)
        W_GAINF[W_CTMNE[ctmne]][gf] = pow(nb_gf,(gf+1))
      nb_gf = 1
    } else {
      for (nb_gf = 0; nb_gf < 3; nb_gf++) {
        W_GAINF[W_CTMNE[ctmne]][nb_gf] = inp[nb_gf + 2]
      }
    }
    if ((nb - nb_gf) == 2) {
      W_SCALEF[W_CTMNE[ctmne]] = inp[nb_gf + 1]
      W_OFFSET[W_CTMNE[ctmne]] = inp[nb_gf + 2]
    } else {
      #to be discussed
    } 
  }
  W_CTDEV[W_CTMNE[ctmne]] = counter_par(W_CTMNE[W_CTMNE[ctmne]],"device_id")
}'

#%UU% [ctmne value]
#%MDESC%
#  Sets a gain for a counter or show all gains if no parameter is given
def wcgain '{

  if ($# != 2 ) { 
    print "Usage: wcgain [ ctmne value ]"
    wcshowgain()
  } else {
    if ($2 < 1 || $2 > 3) { 
      eprint ("Values for wago gain must be 1, 2 or 3!\n")
    } else if ("$1" in W_CTMNE) {
      wcsetgain("$1", $2)
    } else
      eprint ("Unknown wago counter. Define it with \"wagoaux_setup\".\n")
  }
}'


def wcsetgain(ctmne, gain) '{
  return(esrf_io(W_CTDEV[ctmne], "DevSetChanGain", gain))
}'

def wcreadgain(ctmne) '{
  return(esrf_io(W_CTDEV[ctmne],"DevReadChanGain"))
}'

def wc_photon_scale(ctmne,ctval) '{
  if (ctval != 0) {
    gain = wcreadgain(ctmne)
    gain_scale_factor = W_GAINF[ctmne][gain-1]
    printf("Gain is %s, scale up by factor %d.\n",gain,gain_scale_factor)
    ctval *= gain_scale_factor
    scaled_value = ctval*W_SCALEF[ctmne] + W_OFFSET[ctmne]
  } else {
    scaled_value = 0
  }
  return(scaled_value)
}'

#%IU% ()
#%MDESC% show all current gain values.
def wcshowgain() '{
local ctmne
  tty_cntl("md")
  printf ("Current WAGO Gains:\n")
  tty_cntl("me")
  for (ctmne in W_CTMNE) {
    printf("% 8s - %s\n", ctmne, wcreadgain(ctmne))
  }
}'

#%IU% ()
#%MDESC%

#%MACROS%
#%IMACROS%
#%TOC%
#%AUTHOR% A.Beteva
#%DEPENDENCIES% %BR%
#$Revision: 1.1 $ $Date: 2008/12/10 13:05:13 $