152 lines
4.8 KiB
Igor
152 lines
4.8 KiB
Igor
#pragma rtGlobals=3 // Use modern global access method and strict wave access.
|
|
#pragma IgorVersion = 6.1
|
|
#pragma ModuleName = PearlArpesScans
|
|
#pragma version = 1.01
|
|
#include "mm-physconst"
|
|
#include "pearl-optics-theory"
|
|
#include "pearl-epics", version >= 1.01
|
|
|
|
// EPICS scans of Scienta
|
|
// matthias muntwiler, 2013-03-15
|
|
// $Id: pearl-optics-scans.ipf 129 2013-06-26 15:53:13Z muntwiler_m $
|
|
|
|
static strconstant basename = "X03DA-SCIENTA:"
|
|
static strconstant camname = "cam1:"
|
|
static strconstant hdfname = "HDF1:"
|
|
static strconstant imgname = "image1:"
|
|
static strconstant statsname = "Stats1:"
|
|
|
|
function scienta_connect()
|
|
|
|
dfref savedf = GetDataFolderDFR()
|
|
print "connecting EPICS channels..."
|
|
|
|
// channel lists
|
|
string controls = ""
|
|
controls += basename + camname + "PASS_ENERGY;"
|
|
controls += basename + camname + "LOW_ENERGY;"
|
|
controls += basename + camname + "CENTRE_ENERGY;"
|
|
controls += basename + camname + "HIGH_ENERGY;"
|
|
controls += basename + camname + "LENS_MODE;"
|
|
controls += basename + camname + "ACQ_MODE;"
|
|
controls += basename + camname + "ENERGY_MODE;"
|
|
controls += basename + camname + "DETECTOR_MODE;"
|
|
controls += basename + camname + "ELEMENT_SET;"
|
|
controls += basename + camname + "STEP_SIZE;"
|
|
controls += basename + camname + "SLICES;"
|
|
controls += basename + camname + "NumExposures;"
|
|
controls += basename + camname + "FRAMES;"
|
|
controls += basename + camname + "STEP_TIME;"
|
|
|
|
string monitors = ""
|
|
monitors += basename + camname + "PASS_ENERGY_RBV;"
|
|
monitors += basename + camname + "LOW_ENERGY_RBV;"
|
|
monitors += basename + camname + "CENTRE_ENERGY_RBV;"
|
|
monitors += basename + camname + "HIGH_ENERGY_RBV;"
|
|
monitors += basename + camname + "ENERGY_WIDTH_RBV;"
|
|
monitors += basename + camname + "LENS_MODE_RBV;"
|
|
monitors += basename + camname + "ACQ_MODE_RBV;"
|
|
monitors += basename + camname + "ENERGY_MODE_RBV;"
|
|
monitors += basename + camname + "DETECTOR_MODE_RBV;"
|
|
monitors += basename + camname + "ELEMENT_SET_RBV;"
|
|
monitors += basename + camname + "STEP_SIZE_RBV;"
|
|
monitors += basename + camname + "SLICES_RBV;"
|
|
monitors += basename + camname + "NumExposures_RBV;"
|
|
monitors += basename + camname + "CURRENT_CHANNEL_RBV;"
|
|
monitors += basename + camname + "TOTAL_POINTS_RBV;"
|
|
monitors += basename + camname + "PROGRESS_RBV;"
|
|
//monitors += basename + camname + "INT_SPECTRUM;"
|
|
monitors += basename + camname + "BinX_RBV;"
|
|
monitors += basename + camname + "BinY_RBV;"
|
|
monitors += basename + camname + "MinX_RBV;"
|
|
monitors += basename + camname + "MinY_RBV;"
|
|
monitors += basename + camname + "SizeX_RBV;"
|
|
monitors += basename + camname + "SizeY_RBV;"
|
|
monitors += basename + camname + "ReverseX_RBV;"
|
|
monitors += basename + camname + "ReverseY_RBV;"
|
|
|
|
// variable name list corresponding to channel lists
|
|
string variables = ""
|
|
variables = AddListItem("ArrayData", variables, ";", ItemsInList(variables))
|
|
|
|
// connect EPICS channels
|
|
epics_connect(controls, monitors)
|
|
|
|
|
|
print "...done"
|
|
setdatafolder savedf
|
|
|
|
end
|
|
|
|
function pearl_set_attr_ch(attr_wave_name, attr_channel_name)
|
|
string attr_wave_name
|
|
string attr_channel_name
|
|
|
|
variable result
|
|
variable chid
|
|
pvOpen chid, attr_channel_name
|
|
|
|
switch(wavetype($attr_wave_name, 1))
|
|
case 1: // numeric
|
|
wave w_attr = $attr_wave_name
|
|
pvPutNumber /Q chid, w_attr[0]
|
|
result = 0
|
|
break
|
|
case 2: // text
|
|
wave /t wt_attr = $attr_wave_name
|
|
pvPutString /Q chid, wt_attr[0]
|
|
result = 0
|
|
break
|
|
default: // error
|
|
result = -1
|
|
endswitch
|
|
|
|
pvClose chid
|
|
|
|
return result
|
|
end
|
|
|
|
function pearl_set_sscan(scan_rec_num)
|
|
variable scan_rec_num
|
|
|
|
string chan_base = "X03DA-PC:scan" + num2str(scan_rec_num) + ":"
|
|
string wave_base = "Scan" + num2str(scan_rec_num)
|
|
|
|
variable nfields
|
|
variable ifield
|
|
string wave_name
|
|
string chan_name
|
|
wave /z w_active = $(wave_base + "Active")
|
|
if (WaveExists(w_active))
|
|
if (w_active[0] != 0)
|
|
nfields = 4
|
|
for (ifield = 1; ifield <= nfields; ifield += 1)
|
|
sscanf wave_name, "%sPositioner%u", ifield
|
|
sscanf chan_name, "%sP%uPV", chan_base, ifield
|
|
pearl_set_attr_ch(wave_name, chan_name)
|
|
sscanf wave_name, "%sReadback%u", ifield
|
|
sscanf chan_name, "%sR%uPV", chan_base, ifield
|
|
pearl_set_attr_ch(wave_name, chan_name)
|
|
sscanf wave_name, "%sTrigger%u", ifield
|
|
sscanf chan_name, "%sT%uPV", chan_base, ifield
|
|
pearl_set_attr_ch(wave_name, chan_name)
|
|
endfor
|
|
nfields = 20
|
|
for (ifield = 1; ifield <= nfields; ifield += 1)
|
|
sscanf wave_name, "%sDetector%u", ifield
|
|
sscanf chan_name, "%sD%uPV", chan_base, ifield
|
|
pearl_set_attr_ch(wave_name, chan_name)
|
|
endfor
|
|
endif
|
|
endif
|
|
end
|
|
|
|
function pearl_repeat_scan()
|
|
// set up a scan according to the attributes of the given dataset
|
|
dfref savedf = GetDataFolderDFR()
|
|
|
|
setdatafolder :attr
|
|
|
|
|
|
setdatafolder savedf
|
|
end |