1 #pragma TextEncoding = "Windows-1252"
4 #pragma IgorVersion = 6.2
5 #pragma ModuleName = PearlAnglescanTracker
6 #include "pearl-area-profiles",
version > 1.04
7 #include
"pearl-area-import",
version > 1.05
8 #include
"pearl-scienta-preprocess",
version > 1.00
9 #include
"pearl-anglescan-process",
version >= 1.6
10 #include <New Polar Graphs>
67 static strconstant
package_name =
"pearl_anglescan_tracker"
69 static strconstant
package_path =
"root:packages:pearl_anglescan_tracker:"
71 static strconstant
prefs_objects =
"projection;theta_offset;tilt_offset;phi_offset;reduction_func;reduction_params"
76 dfref savedf = GetDataFolderDFR()
81 if (nvar_exists(init_done))
92 variable /g init_done = 1
100 dfref savedf = getdatafolderdfr()
102 newdatafolder /o/s packages
103 newdatafolder /o/s $package_name
106 string /g graphname = "graph_anglescan_tracker"
107 string /g dataname = "tracker"
108 string /g projection = "stereographic"
111 variable /g theta_offset = 0
112 variable /g tilt_offset = 0
113 variable /g phi_offset = 0
115 string /g reduction_params = "Lcrop=0.1;Hcrop=0.1;Lsize=0.2;Hsize=0.2;Cpos=0.5;Csize=0.4"
118 string /g export_folderpath = "root:"
119 variable /g export_format = 1
122 string /g detector_tracename
123 variable /g capturing = 0
124 variable /g buf_size = 0
125 variable /g buf_count = 0
126 variable /g buf_width = 0
129 string path = FunctionPath("")
130 path = ParseFilePath(1, path, ":", 1, 0) + "tracker-sample-picture.png"
131 LoadPict /O/Q path, pict_tracker_sample
141 dfref saveDF = GetDataFolderDFR()
143 string fullPath = SpecialDirPath("Packages", 0, 0, 0)
145 NewPath/O/C/Q tempPackagePrefsPath, fullPath
146 fullPath += ":preferences.pxp"
148 SetDataFolder root:packages
149 SetDataFolder $package_name
152 KillPath/Z tempPackagePrefsPath
165 dfref saveDF = GetDataFolderDFR()
169 NewDataFolder /O/S packages
170 NewDataFolder /O/S $package_name
171 string fullPath = SpecialDirPath("Packages", 0, 0, 0)
174 GetFileFolderInfo /Q /Z fullPath
176 fullPath += ":preferences.pxp"
177 GetFileFolderInfo /Q /Z fullPath
179 LoadData /O /R /Q fullPath
213 variable theta_offset
217 dfref savedf = getdatafolderdfr()
220 if (!ParamIsDefault(theta_offset))
221 nvar v_theta_offset = theta_offset
222 v_theta_offset = theta_offset
224 if (!ParamIsDefault(tilt_offset))
225 nvar v_tilt_offset = tilt_offset
226 v_tilt_offset = tilt_offset
228 if (!ParamIsDefault(phi_offset))
229 nvar v_phi_offset = phi_offset
230 v_phi_offset = phi_offset
243 wave values = $(dataname + "_i")
244 values[numpnts(values) - 1] = 0
263 string reduction_func
264 string reduction_params
266 dfref savedf = getdatafolderdfr()
269 svar red_func = reduction_func
270 svar red_params = reduction_params
272 red_func = reduction_func
273 red_params = reduction_params
313 if (ParamIsDefault(xpdplot))
317 dfref savedf = getdatafolderdfr()
333 dfref savedf = getdatafolderdfr()
362 dfref savedf = getdatafolderdfr()
368 KillWindow $graphname
374 dfref savedf = getdatafolderdfr()
383 make /n=(1,1) /o buf_i
384 make /n=(1) /o buf_th, buf_ph, buf_ti
391 wave values = $(dataname + "_i")
392 values[numpnts(values) - 1] = 0
406 dfref savedf = getdatafolderdfr()
413 variable new_size = buf_size + 91
414 buf_width = num_slices
421 redimension /n=(buf_width,new_size) buf_i
422 redimension /n=(new_size) buf_th, buf_ph, buf_ti
424 buf_i[][buf_size, new_size-1] = nan
425 buf_th[buf_size, new_size-1] = nan
426 buf_ph[buf_size, new_size-1] = nan
427 buf_ti[buf_size, new_size-1] = nan
436 dfref savedf = getdatafolderdfr()
439 make /n=31 /o detector_angle, detector_pol, detector_az, detector_rad
440 setscale /i x -30, 30, "°", detector_angle, detector_pol, detector_az, detector_rad
460 dfref savedf = getdatafolderdfr()
468 svar red_func_name = reduction_func
469 svar red_params = reduction_params
471 variable nx = dimsize(image, 0)
472 string loc_params = red_params
473 wave /wave red_results = red_func(image, loc_params)
474 if (numpnts(red_results) < 1)
479 wave profile1 = red_results[0]
480 nx = numpnts(profile1)
491 if ((buf_count >= buf_size) || (nx > buf_width))
493 setscale /p x dimoffset(profile1,0), dimdelta(profile1,0), waveunits(profile1,0), buf_i
496 buf_i[][buf_count] = profile1[p]
497 buf_th[buf_count] = theta - theta_offset
498 buf_ti[buf_count] = -(tilt - tilt_offset)
499 buf_ph[buf_count] = phi - phi_offset
514 dfref savedf = getdatafolderdfr()
527 duplicate /free /R=[0,buf_width-1][0,buf_count-1] buf_i, buf_n
528 duplicate /free /R=[0,buf_count-1] buf_th, w_th
529 duplicate /free /R=[0,buf_count-1] buf_ti, w_ti
530 duplicate /free /R=[0,buf_count-1] buf_ph, w_ph
536 if (dimoffset(buf_i,0) < -20)
542 make /n=1 /free d_polar, d_azi
545 d_azi = d_azi >= 360 ? d_azi - 360 : d_azi
566 dfref savedf = getdatafolderdfr()
572 make /n=1 /free m_theta
573 make /n=1 /free m_tilt
574 make /n=1 /free m_phi
575 m_theta = theta - theta_offset
576 m_tilt = tilt - tilt_offset
578 m_phi = phi - phi_offset
581 wave detector_angle, detector_pol, detector_az, detector_rad
582 setscale /i x -range/2, +range/2, "°", detector_angle
586 redimension /n=(numpnts(detector_pol)) detector_rad
587 detector_rad = 2 * tan(detector_pol / 2 * pi / 180)
589 detector_az = detector_az >= 360 ? detector_az - 360 : detector_az
596 dfref savedf = getdatafolderdfr()
604 svar tracename = detector_tracename
607 tracename = WMPolarAppendTrace(graphname, detector_rad, detector_az, 360)
608 ModifyGraph /w=$graphname lstyle($tracename)=0
609 ModifyGraph /w=$graphname lsize($tracename)=1.5
610 ModifyGraph /w=$graphname zColor($tracename)={detector_angle,*,*,RedWhiteBlue,0}
611 ColorScale /w=$graphname /C /N=text1 trace=$tracename
612 ColorScale /w=$graphname /C /N=text1 /F=0 /B=1 /A=LB /X=0.00 /Y=0.00
613 ColorScale /w=$graphname /C /N=text1 width=1.5, heightPct=20, frame=0.00
614 ColorScale /w=$graphname /C /N=text1 lblMargin=0
615 ColorScale /w=$graphname /C /N=text1 nticks=2, tickLen=2.00, tickThick=0.50
617 TextBox /w=$graphname /C /N=tb_manip /F=0 /B=1 /X=0.00 /Y=0.00 /E=2
"\\{\"manip = (%.1f, %.1f, %.1f)\", "
618 AppendText /w=$graphname /N=tb_manip /NOCR
"root:packages:pearl_anglescan_tracker:curTheta, "
619 AppendText /w=$graphname /N=tb_manip /NOCR
"root:packages:pearl_anglescan_tracker:curTilt, "
620 AppendText /w=$graphname /N=tb_manip /NOCR
"root:packages:pearl_anglescan_tracker:curPhi}"
623 DoWindow /T $graphname,
"Angle Scan Tracker"
626 ControlBar /w=$graphname 21
628 Button b_capture win=$graphname, fColor=(65535,65535,65535), fSize=10
629 Button b_capture win=$graphname, help={
"Start/stop capturing."}
630 PopupMenu pm_params win=$graphname, mode=0, value=
"load preferences;save preferences;reduction parameters;manipulator offsets", title=
"parameters"
632 PopupMenu pm_params win=$graphname, help={
"Load/save/edit data processing parameters"}
633 PopupMenu pm_data win=$graphname, mode=0, value=
"import;export;load file;save file", title=
"data"
635 PopupMenu pm_data win=$graphname, help={
"Load/save data from/to independent dataset or file"}
637 SetDrawLayer /w=$graphname ProgFront
638 SetDrawEnv /w=$graphname xcoord=rel, ycoord=rel
639 DrawPict /w=$graphname 0, 0, 1, 1, pict_tracker_sample
647 dfref savedf = getdatafolderdfr()
659 dfref savedf = getdatafolderdfr()
682 dfref savedf = getdatafolderdfr()
689 make /n=(1)/o arraydata, xscale, yscale
690 make /n=(1,1)/o image
691 variable /g ndimensions
692 variable /g arraysize0, arraysize1
694 variable /g colormode
695 string /g controls, monitors
696 string /g xunits, yunits
699 variable /g chidDetectorState = 0
700 variable /g chidArrayData = 0
701 variable /g chidXScale = 0
702 variable /g chidYScale = 0
703 variable /g chidNDimensions = 0
704 variable /g chidArraySize0 = 0
705 variable /g chidArraySize1 = 0
706 variable /g chidDataType = 0
707 variable /g chidColorMode = 0
708 variable /g chidLensMode = 0
709 variable /g chidTheta = 0
710 variable /g chidTilt = 0
711 variable /g chidPhi = 0
712 variable /g curDetectorState = 0
713 variable /g curLensMode = 0
714 variable /g curTheta = 0
715 variable /g curTilt = 0
716 variable /g curPhi = 0
717 variable /g acqTheta = 0
718 variable /g acqTilt = 0
719 variable /g acqPhi = 0
720 variable /g connected = 0
722 string epicsname = "X03DA-SCIENTA:"
723 string imagename = epicsname + "image1:"
724 string camname = epicsname + "cam1:"
725 string manipname = "X03DA-ES2-MA:"
730 pvOpen /Q chidDetectorState, camname +
"DetectorState_RBV"
731 pvOpen /Q chidLensMode, camname +
"LENS_MODE_RBV"
732 pvOpen /Q chidXScale, camname +
"CHANNEL_SCALE_RBV"
733 pvOpen /Q chidYScale, camname +
"SLICE_SCALE_RBV"
734 pvOpen /Q chidArrayData, imagename +
"ArrayData"
735 pvOpen /Q chidNDimensions, imagename +
"NDimensions_RBV"
736 pvOpen /Q chidArraySize0, imagename +
"ArraySize0_RBV"
737 pvOpen /Q chidArraySize1, imagename +
"ArraySize1_RBV"
738 pvOpen /Q chidDataType, imagename +
"DataType_RBV"
739 pvOpen /Q chidColorMode, imagename +
"ColorMode_RBV"
741 pvOpen /Q chidTheta, manipname +
"THT.RBV"
742 pvOpen /Q chidTilt, manipname +
"TLT.RBV"
743 pvOpen /Q chidPhi, manipname +
"PHI.RBV"
750 #elif exists("pvOpen")
752 pvOpen /T=(timeout) chidDetectorState, camname +
"DetectorState_RBV"
753 pvOpen /T=(timeout) chidLensMode, camname +
"LENS_MODE_RBV"
754 pvOpen /T=(timeout) chidXScale, camname +
"CHANNEL_SCALE_RBV"
755 pvOpen /T=(timeout) chidYScale, camname +
"SLICE_SCALE_RBV"
756 pvOpen /T=(timeout) chidArrayData, imagename +
"ArrayData"
757 pvOpen /T=(timeout) chidNDimensions, imagename +
"NDimensions_RBV"
758 pvOpen /T=(timeout) chidArraySize0, imagename +
"ArraySize0_RBV"
759 pvOpen /T=(timeout) chidArraySize1, imagename +
"ArraySize1_RBV"
760 pvOpen /T=(timeout) chidDataType, imagename +
"DataType_RBV"
761 pvOpen /T=(timeout) chidColorMode, imagename +
"ColorMode_RBV"
763 pvOpen /T=(timeout) chidTheta, manipname +
"THT.RBV"
764 pvOpen /T=(timeout) chidTilt, manipname +
"TLT.RBV"
765 pvOpen /T=(timeout) chidPhi, manipname +
"PHI.RBV"
772 #
if exists(
"pvMonitor")
784 print
"angle scan tracker: online"
786 print
"angle scan tracker: offline"
796 #if exists("pvClose")
797 nvar /z chid = $chid_var_name
798 if (nvar_exists(chid))
808 dfref savedf = GetDataFolderDFR()
832 print "angle scan tracker: offline"
843 STRUCT WMWinHookStruct &s
845 Variable hookResult = 0
865 dfref savedf = GetDataFolderDFR()
867 #if exists("pvGetWave")
897 pvGet chidNDimensions, ndimensions
898 pvGet chidArraySize0, arraysize0
899 pvGet chidArraySize1, arraysize1
900 pvGet chidDataType, datatype
901 pvGet chidColorMode, colormode
904 if (ndimensions != 2)
911 redimension /n=(arraysize0 * arraysize1) arraydata
912 redimension /n=(arraysize0, arraysize1) image
913 redimension /n=(arraysize0) xscale
914 redimension /n=(arraysize1) yscale
918 redimension /b arraydata, image
921 redimension /b/u arraydata, image
924 redimension /w arraydata, image
927 redimension /w/u arraydata, image
930 redimension /i arraydata, image
933 redimension /i/u arraydata, image
936 redimension /s arraydata, image
939 redimension /d arraydata, image
943 pvGetWave chidArrayData, arraydata
944 pvGetWave chidXScale, xscale
945 pvGetWave chidYScale, yscale
947 image = arraydata[p + q * arraysize0]
948 setscale /i x xscale[0], xscale[numpnts(xscale)-1], image
949 setscale /i y yscale[0], yscale[numpnts(yscale)-1], image
965 dfref savedf = GetDataFolderDFR()
969 nvar curDetectorState
978 if (curDetectorState == 1)
994 dfref savedf = GetDataFolderDFR()
998 nvar lensmode = curLensMode
999 nvar theta = curTheta
1018 setdatafolder savedf
1025 STRUCT WMButtonAction &ba
1027 switch( ba.eventCode )
1039 dfref savedf = getdatafolderdfr()
1045 capturing = !capturing
1048 Button b_capture win=$graphname, title="stop"
1050 Button b_capture win=$graphname, title="start"
1053 setdatafolder saveDF
1057 dfref savedf = getdatafolderdfr()
1064 Button b_capture win=$graphname, title="stop"
1066 Button b_capture win=$graphname, title="start"
1069 setdatafolder saveDF
1073 STRUCT WMPopupAction &pa
1075 switch( pa.eventCode )
1087 STRUCT WMPopupAction &pa
1107 dfref savedf = getdatafolderdfr()
1110 svar export_folderpath
1113 string folderpath = export_folderpath
1114 string nickname = ""
1115 variable format = export_format
1117 prompt folderpath, "Folder Path"
1118 prompt nickname, "Nick Name"
1119 prompt format, "Format", popup, "PEARL;XPDplot"
1121 doprompt "Export Parameters", folderpath, nickname, format
1124 export_folderpath = folderpath
1125 export_format = format
1127 newdatafolder /o $folderpath
1128 variable xpdplot = format == 2
1129 ast_export($folderpath, nickname, xpdplot=xpdplot)
1132 setdatafolder saveDF
1137 dfref savedf = getdatafolderdfr()
1140 svar export_folderpath
1141 string folderpath = export_folderpath
1142 string nickname = ""
1144 dfref dfBefore = GetDataFolderDFR()
1145 Execute /q/z "CreateBrowser prompt=\"Select wave from dataset\", showWaves=1, showVars=0, showStrs=0"
1146 dfref dfAfter = GetDataFolderDFR()
1147 SetDataFolder dfBefore
1149 SVAR list = S_BrowserList
1152 if ((flag != 0) && (ItemsInList(list) >= 1))
1153 string wname = StringFromList(0, list)
1156 dfref df = GetWavesDataFolderDFR(w)
1161 setdatafolder saveDF
1166 dfref savedf = getdatafolderdfr()
1172 setdatafolder saveDF
1177 dfref savedf = getdatafolderdfr()
1180 NewDataFolder /O/S load_data
1183 string wname = StringFromList(0, s_wavenames, ";")
1190 KillDataFolder /Z load_data
1192 setdatafolder saveDF
1196 STRUCT WMPopupAction &pa
1198 switch( pa.eventCode )
1210 STRUCT WMPopupAction &pa
1230 dfref savedf = getdatafolderdfr()
1233 svar pref_func = reduction_func
1234 svar pref_params = reduction_params
1236 string loc_func = pref_func
1237 string loc_params = pref_params
1242 setdatafolder saveDF
1246 dfref savedf = getdatafolderdfr()
1253 variable loc_theta = theta_offset
1254 variable loc_tilt = tilt_offset
1255 variable loc_phi = phi_offset
1257 prompt loc_theta, "theta offset"
1258 prompt loc_tilt, "tilt offset"
1259 prompt loc_phi, "phi offset"
1261 doprompt "manipulator offsets", loc_theta, loc_tilt, loc_phi
1263 theta_offset = loc_theta
1264 tilt_offset = loc_tilt
1265 phi_offset = loc_phi
1268 setdatafolder saveDF