1 #pragma rtGlobals=3// Use modern global access method and strict wave access.
2 #pragma IgorVersion = 6.1
3 #pragma ModuleName = PearlAreaLive
5 #include "pearl-epics",
version >= 1.02
30 dfref savedf = GetDataFolderDFR()
34 newdatafolder /o/s $package_name
35 dfref epicsdf = GetDataFolderDFR()
37 string /g ad_nicknames
40 string foldername = nickname
41 newdatafolder /s/o $foldername
42 dfref detectordf = GetDataFolderDFR()
45 make /n=(1)/o arraydata, xscale, yscale
47 variable /g ndimensions
48 variable /g arraysize0, arraysize1
51 string /g controls, monitors
52 string /g xunits, yunits
54 print
"connecting EPICS channels..."
59 string imagename = epicsname +
"image1:"
60 string camname = epicsname +
"cam1:"
63 controls = ReplaceStringByKey(
"ArrayData", controls, imagename +
"ArrayData",
"=")
65 variable chidArrayData = epics_chid(imagename +
"ArrayData")
66 variable array_connected = chidArrayData > 0
68 monitors = ReplaceStringByKey(
"NDimensions", monitors, imagename +
"NDimensions_RBV",
"=")
69 monitors = ReplaceStringByKey(
"ArraySize0", monitors, imagename +
"ArraySize0_RBV",
"=")
70 monitors = ReplaceStringByKey(
"ArraySize1", monitors, imagename +
"ArraySize1_RBV",
"=")
71 monitors = ReplaceStringByKey(
"DataType", monitors, imagename +
"DataType_RBV",
"=")
72 monitors = ReplaceStringByKey(
"ColorMode", monitors, imagename +
"ColorMode_RBV",
"=")
73 monitors = ReplaceStringByKey(
"XScale", monitors, camname +
"CHANNEL_SCALE_RBV",
"=")
74 monitors = ReplaceStringByKey(
"YScale", monitors, camname +
"SLICE_SCALE_RBV",
"=")
78 string roikey, roiname
79 for (iroi = 0; iroi < nroi; iroi += 1)
80 roikey =
"ROI" + num2str(iroi + 1)
81 roiname = epicsname +
"ROI" + num2str(iroi + 1) +
":"
83 controls = ReplaceStringByKey(roikey +
"Enable", controls, roiname +
"EnableCallbacks",
"=")
84 controls = ReplaceStringByKey(roikey +
"EnableX", controls, roiname +
"EnableX",
"=")
85 controls = ReplaceStringByKey(roikey +
"MinX", controls, roiname +
"MinX",
"=")
86 controls = ReplaceStringByKey(roikey +
"SizeX", controls, roiname +
"SizeX",
"=")
87 controls = ReplaceStringByKey(roikey +
"EnableY", controls, roiname +
"EnableY",
"=")
88 controls = ReplaceStringByKey(roikey +
"MinY", controls, roiname +
"MinY",
"=")
89 controls = ReplaceStringByKey(roikey +
"SizeY", controls, roiname +
"SizeY",
"=")
91 monitors = ReplaceStringByKey(roikey +
"Enable", monitors, roiname +
"EnableCallbacks_RBV",
"=")
92 monitors = ReplaceStringByKey(roikey +
"EnableX", monitors, roiname +
"EnableX_RBV",
"=")
93 monitors = ReplaceStringByKey(roikey +
"MinX", monitors, roiname +
"MinX_RBV",
"=")
94 monitors = ReplaceStringByKey(roikey +
"SizeX", monitors, roiname +
"SizeX_RBV",
"=")
95 monitors = ReplaceStringByKey(roikey +
"EnableY", monitors, roiname +
"EnableY_RBV",
"=")
96 monitors = ReplaceStringByKey(roikey +
"MinY", monitors, roiname +
"MinY_RBV",
"=")
97 monitors = ReplaceStringByKey(roikey +
"SizeY", monitors, roiname +
"SizeY_RBV",
"=")
104 ad_nicknames = AddListItem(nickname, ad_nicknames)
105 variable iad = WhichListItem(nickname, ad_nicknames,
";", 0, 0)
106 ad_chids = AddListItem(num2istr(epics_chid(imagename +
"ArrayData")), ad_chids,
";", iad)
109 if (!array_connected)
120 dfref savedf = GetDataFolderDFR()
121 setdatafolder $package_path
126 variable iad = WhichListItem(num2istr(chan), ad_chids,
";", 0, 0)
128 string nickname = StringFromList(iad, ad_nicknames)
132 setdatafolder $nickname
137 variable chidArrayData = epics_chid(StringByKey(
"ArrayData", controls,
"="))
138 variable chidNDimensions = epics_chid(StringByKey(
"NDimensions", monitors,
"="))
139 variable chidArraySize0 = epics_chid(StringByKey(
"ArraySize0", monitors,
"="))
140 variable chidArraySize1 = epics_chid(StringByKey(
"ArraySize1", monitors,
"="))
141 variable chidDataType = epics_chid(StringByKey(
"DataType", monitors,
"="))
142 variable chidColorMode = epics_chid(StringByKey(
"ColorMode", monitors,
"="))
143 variable chidXScale = epics_chid(StringByKey(
"XScale", monitors,
"="))
144 variable chidYScale = epics_chid(StringByKey(
"YScale", monitors,
"="))
156 pvGet chidNDimensions, ndimensions
157 pvGet chidArraySize0, arraysize0
158 pvGet chidArraySize1, arraysize1
159 pvGet chidDataType, datatype
160 pvGet chidColorMode, colormode
163 if (ndimensions != 2)
170 redimension /n=(arraysize0 * arraysize1) arraydata
171 redimension /n=(arraysize0, arraysize1) image
172 redimension /n=(arraysize0) xscale
173 redimension /n=(arraysize1) yscale
177 redimension /b arraydata, image
180 redimension /b/u arraydata, image
183 redimension /w arraydata, image
186 redimension /w/u arraydata, image
189 redimension /i arraydata, image
192 redimension /i/u arraydata, image
195 redimension /s arraydata, image
198 redimension /d arraydata, image
202 pvGetWave chidArrayData, arraydata
203 pvGetWave chidXScale, xscale
204 pvGetWave chidYScale, yscale
206 image = arraydata[p + q * arraysize0]
207 setscale /i x xscale[0], xscale[numpnts(xscale)-1], image
208 setscale /i y yscale[0], yscale[numpnts(yscale)-1], image
213 svar /z graphname = :view_image:prof_graphname
214 if (svar_exists(graphname))
217 for (iroi = 0; iroi < nroi; iroi += 1)
239 variable sizeX = numpnts(xscale)
243 variable sizeY = numpnts(yscale)
245 roikey =
"ROI" + num2str(iroi + 1)
246 enable = epics_get_num(StringByKey(roikey +
"Enable", monitors,
"="))
248 enableX = epics_get_num(StringByKey(roikey +
"EnableX", monitors,
"="))
250 minX = epics_get_num(StringByKey(roikey +
"MinX", monitors,
"="))
251 sizeX = epics_get_num(StringByKey(roikey +
"SizeX", monitors,
"="))
254 enableY = epics_get_num(StringByKey(roikey +
"EnableY", monitors,
"="))
256 minY = epics_get_num(StringByKey(roikey +
"MinY", monitors,
"="))
257 sizeY = epics_get_num(StringByKey(roikey +
"SizeY", monitors,
"="))
260 variable x1 = xscale[minX]
261 variable x2 = xscale[minX + sizeX - 1]
262 variable y1 = yscale[minY]
263 variable y2 = yscale[minY + sizeY - 1]
269 static variable
ad_update_ROI_rect(
string graphname, variable iroi, variable x1, variable y1, variable x2, variable y2, variable enable){
274 string roiname =
"roi" + num2str(iroi + 1)
275 variable color = 65536 * (1 - iroi/8) - 1
278 DrawAction /w=$graphname getgroup=$roiname,
delete, begininsert
279 SetDrawEnv /w=$graphname gstart,gname=$roiname
280 SetDrawEnv /w=$graphname xcoord= bottom,ycoord= left
281 SetDrawEnv /w=$graphname linefgc= (65535,color,color)
282 SetDrawEnv /w=$graphname fillpat= 0
283 SetDrawEnv /w=$graphname linethick= 0.50
284 DrawRect /w=$graphname x1,y1,x2,y2
285 SetDrawEnv /w=$graphname gstop
286 DrawAction /w=$graphname endinsert
288 DrawAction /w=$graphname getgroup=$roiname,
delete
292 variable
ad_set_ROI(
string nickname, variable iroi, variable p1, variable q1, variable p2, variable q2, variable enable){
299 string roiname =
"roi" + num2str(iroi + 1)
302 dfref savedf = GetDataFolderDFR()
303 setdatafolder $package_path
304 setdatafolder $nickname
310 variable minX = min(p1, p2)
311 variable sizeX = max(p1, p2) - min(p1, p2) + 1
312 variable enableX = sizeX > 0
313 variable minY = min(q1, q2)
314 variable sizeY = max(q1, q2) - min(q1, q2) + 1
315 variable enableY = sizeY > 0
317 roikey =
"ROI" + num2str(iroi + 1)
318 epics_set_num(StringByKey(roikey +
"Enable", controls,
"="), enable)
320 epics_set_num(StringByKey(roikey +
"EnableX", controls,
"="), enableX)
322 epics_set_num(StringByKey(roikey +
"MinX", controls,
"="), minX)
323 epics_set_num(StringByKey(roikey +
"SizeX", controls,
"="), sizeX)
326 epics_set_num(StringByKey(roikey +
"EnableY", controls,
"="), enableY)
328 epics_set_num(StringByKey(roikey +
"MinY", controls,
"="), minY)
329 epics_set_num(StringByKey(roikey +
"SizeY", controls,
"="), sizeY)
333 svar graphname = :view_image:prof_graphname
340 PopupMenu pm_set_roi mode=0,value=
"ROI 1;ROI 2;ROI 3;ROI 4",title=
"Set ROI"
341 PopupMenu pm_set_roi pos={400,0},bodyWidth=60,proc=PearlAreaLive#
pmp_set_roi
342 PopupMenu pm_set_roi help={
"Set a detector ROI to the current cursor selection"}
347 STRUCT WMPopupAction &pa
349 switch( pa.eventCode )
351 variable popNum = pa.popNum
352 string imgname = StringFromList(0, ImageNameList(pa.win,
";"))
353 wave /z image = ImageNameToWaveRef(pa.win, imgname)
354 if (waveexists(image))
356 if (waveexists(source))
357 dfref sourcedf = GetWavesDataFolderDFR(source)
358 string nickname = GetDataFolder(0, sourcedf)
359 ad_set_ROI(nickname, popNum - 1, pcsr(A, pa.win), qcsr(A, pa.win), pcsr(B, pa.win), qcsr(B, pa.win), 1)
static variable epics_connect()
connect the angle scan tracker to EPICS
variable ad_update_profiles(wave image)
update a profiles graph with new data.
static const string package_path
static const string prefs_objects
instant visualization of angle scan and manipulator position.
static wave get_source_image(wave view)
find the source image wave corresponding to the given view.
static const string package_name
variable add_roi_controls()
static const string imgname
static variable ad_update_ROI(string graphname, variable iroi)
variable ad_set_ROI(string nickname, variable iroi, variable p1, variable q1, variable p2, variable q2, variable enable)
static const string camname
variable ad_live_callback(variable chan)
variable ad_connect(string epicsname, string nickname)
static variable ad_update_ROI_rect(string graphname, variable iroi, variable x1, variable y1, variable x2, variable y2, variable enable)
static variable pmp_set_roi(WMPopupAction *pa)