#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