igor-public/pearl/pearl-data-explorer.ipf
matthias muntwiler 80a01f2bdb updates: pshell import, angle-scans, elog
- pshell import: fix units and data scaling.
- pshell import: support new multi-region scans.
- angle scans: add trim function.
- angle scans: update import_tpi_scan function.
- angle scans: fix scales of check waves in normalization.
- area display: new cursor mode for background selection.
- elog: bugfixes (attachment list, check existing logbook).
2017-07-04 11:06:49 +02:00

1743 lines
47 KiB
Igor

#pragma rtGlobals=3 // Use modern global access method and strict wave access.
#pragma IgorVersion = 6.1
#pragma ModuleName = PearlDataExplorer
#pragma version = 1.50
#include "pearl-area-import"
#include "pearl-area-profiles"
#include "pearl-area-display"
#include "pearl-pshell-import"
#if exists("MFR_OpenResultFile")
#include "pearl-matrix-import"
#endif
// copyright (c) 2013-16 Paul Scherrer Institut
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// http:///www.apache.org/licenses/LICENSE-2.0
/// @file
/// @brief preview and import panel for PEARL data
/// @ingroup ArpesPackage
///
///
/// preview and import panel for PEARL data:
/// @arg area detector (HDF5) files from scienta analyser and prosilica cameras (if HDF5.xop is installed).
/// @arg igor text files from s-scans and otf-scans.
/// @arg pshell (HDF5) data files (if HDF5.xop is installed).
/// @arg matrix STM files (if MatrixFileReader.xop is installed).
/// @namespace PearlDataExplorer
/// @brief preview and import panel for PEARL data
///
/// PearlDataExplorer is declared in @ref pearl-data-explorer.ipf.
static strconstant package_name = "pearl_explorer"
static strconstant package_path = "root:packages:pearl_explorer:"
static strconstant ks_filematch_adh5 = "*.h5"
static strconstant ks_filematch_pshell = "psh*.h5"
static strconstant ks_filematch_itx = "*.itx"
static strconstant ks_filematch_mtrx = "*_mtrx"
function pearl_data_explorer()
init_package()
load_prefs()
execute /q/z "PearlDataExplorer()"
end
/// initialize the global variables of the data explorer.
///
/// initializes the global variables and data folder for this procedure file
/// must be called once before the panel is created
/// warning: this function overwrites previous values
static function init_package()
dfref savefolder = GetDataFolderDFR()
SetDataFolder root:
newdatafolder /o/s packages
newdatafolder /o/s $package_name
if (exists("v_InitPanelDone") == 2)
SetDataFolder savefolder
return 0
endif
make /o/n=0/t wtFiles
make /o/n=0/i wSelectedFiles,wSelectedDatasets
make /o/n=0/t wtDatasets
make /o/n=0/t wtPositioners,wtDetectors
make /o/n=0/i wSelectedPositioners,wSelectedDetectors
make /o/n=(1,1) preview_image // preview 2D data
make /o/n=0 preview_trace // preview 1D data
make /o/n=0/t attr_names, attr_values, attr_filter, attr_filter_summary
// persistent strings and variables. persistent = saved in preferences
string /g s_filepath = "" // directory path to be listed
string /g s_hdf_options = "" // recently used HDF5 load options
string /g s_reduction_params = "" // recently used reduction parameters
string /g s_preview_pvs = "" // semicolon-separated list of EPICS PVs to display in preview.
// the list items can contain wildcards for StringMatch
s_preview_pvs = "*OP:CURRENT*;*Stats*Total*;*CADC*"
// non-persistent strings and variables
string /g s_preview_file = "" // file or folder name of the current preview
string /g s_preview_source = "" // data source, e.g. EPICS channel name, of the current preview
string /g s_profiles_graph = "" // window name of the current preview if the data is two-dimensional
string /g s_preview_trace_graph = "" // window name of the current preview if the data is one-dimensional
string /g s_file_info = "" // description of selected file
variable/g v_InitPanelDone = 1
SetDataFolder savefolder
end
static function save_prefs()
// saves persistent package data to the preferences file
// the data saved in the file are: data file path, attributes filter
dfref saveDF = GetDataFolderDFR()
string fullPath = SpecialDirPath("Packages", 0, 0, 0)
fullPath += package_name
NewPath/O/C/Q tempPackagePrefsPath, fullPath
fullPath += ":preferences.pxp"
SetDataFolder root:packages
SetDataFolder $package_name
string objects = "attr_filter;attr_filter_summary;s_filepath;s_hdf_options;s_reduction_params;s_preview_pvs"
SaveData /O /Q /J=objects fullPath
KillPath/Z tempPackagePrefsPath
SetDataFolder saveDF
end
static function load_prefs()
// loads persistent package data from the preferences file
// the preferences file is an Igor packed experiment file in a special preferences folder
dfref saveDF = GetDataFolderDFR()
variable result = -1
setdatafolder root:
NewDataFolder /O/S packages
NewDataFolder /O/S $package_name
dfref packageDF = GetDataFolderDFR()
string fullPath = SpecialDirPath("Packages", 0, 0, 0)
fullPath += package_name
GetFileFolderInfo /Q /Z fullPath
if (V_Flag == 0) // Disk directory exists?
fullPath += ":preferences.pxp"
GetFileFolderInfo /Q /Z fullPath
if (V_Flag == 0) // Preference file exist?
LoadData /O /R /Q fullPath
result = 0
endif
endif
if (result == 0)
svar /sdfr=packageDF filepath = s_filepath
NewPath /O/Z pearl_explorer_filepath, filepath
update_filelist()
update_datasets()
endif
SetDataFolder saveDF
return result
end
/// check whether a file can be imported by this module.
///
/// the file type is determined by the extension of the file name.
///
/// @return file type
/// @arg 0 not a recognized file type
/// @arg 1 PShell file (HDF5, name starts with psh_)
/// @arg 2 area detector HDF5 file
/// @arg 3 Igor text (itx) file
/// @arg 4 Matrix STM file (*_mtrx)
///
static function pearl_file_type(filename)
string filename
if (StringMatch(filename, ks_filematch_pshell))
return 1
elseif (StringMatch(filename, ks_filematch_adh5))
return 2
elseif (StringMatch(filename, ks_filematch_itx))
return 3
#if exists("MFR_OpenResultFile")
elseif (StringMatch(filename, ks_filematch_mtrx))
return 4
#endif
else
return 0
endif
end
/// read a list of PEARL files from the file system
///
/// wtFiles and wSelectedFiles in the package data folder are updated.
/// only files for which pearl_file_type() returns non-zero are listed.
///
static function update_filelist()
dfref saveDF = GetDataFolderDFR()
string all_files
wave /t wtFiles = $(package_path + "wtFiles")
wave wSelectedFiles = $(package_path + "wSelectedFiles")
variable nn
PathInfo pearl_explorer_filepath
if (v_flag == 1)
all_files = IndexedFile(pearl_explorer_filepath, -1, "????")
nn = ItemsInList(all_files)
else
all_files = ""
nn = 0
endif
make /n=(nn) /t /free wtAllFiles
wtAllFiles = StringFromList(p, all_files)
Extract /o /t wtAllFiles, wtFiles, pearl_file_type(wtAllFiles[p])
Sort /A /R wtFiles, wtFiles
redimension /n=(numpnts(wtFiles)) wSelectedFiles
wSelectedFiles = 0
setdatafolder saveDF
end
static function update_datasets()
// updates the list of imported datasets.
// a dataset means any top-level data folder
// which includes a string variable named pearl_explorer_import.
dfref saveDF = GetDataFolderDFR()
setdatafolder root:
dfref rootdf = GetDataFolderDFR()
setdatafolder $package_path
dfref privatedf = GetDataFolderDFR()
wave /t wtDatasets
wave wSelectedDatasets
variable maxdf = CountObjectsDFR(rootdf, 4)
redimension /n=(maxdf) wtDatasets
variable idf = 0
variable ndf = 0
string sdf
do
sdf = GetIndexedObjNameDFR(rootdf, 4, idf)
if (strlen(sdf) >= 1)
setdatafolder rootdf
setdatafolder $sdf
svar /z importer = pearl_explorer_import
if (svar_exists(importer))
wtDatasets[ndf] = sdf
ndf += 1
endif
else
break
endif
idf += 1
while(1)
redimension /n=(ndf) wtDatasets, wSelectedDatasets
wSelectedDatasets = 0
sort wtDatasets, wtDatasets
setdatafolder saveDF
end
static function preview_file(filename)
string filename
dfref saveDF = GetDataFolderDFR()
variable ft = pearl_file_type(filename)
switch(ft)
case 1:
wave /z image = preview_pshell_file(filename)
break
case 2:
wave /z image = preview_hdf_file(filename)
break
case 3:
wave /z image = preview_itx_file(filename)
break
case 4:
wave /z image = preview_mtrx_file(filename)
break
default:
wave /z image = $""
endswitch
if (WaveExists(image))
string graphname = show_preview_graph(image)
// preset ELOG panel - if available
if (exists("PearlElog#set_panel_attributes") == 6)
string cmd
sprintf cmd, "PearlElog#set_panel_attributes(\"\", \"File=%s\")", ParseFilePath(0, filename, ":", 1, 0)
execute /Q/Z cmd
if (strlen(graphname) > 0)
sprintf cmd, "PearlElog#set_panel_graphs(\"\", \"%s\")", graphname
execute /Q/Z cmd
endif
endif
endif
setdatafolder saveDF
return 0
end
/// load the preview of a PShell HDF5 file.
///
/// the preview is an arbitrary detector image extracted from the file, see adh5_load_preview().
/// the preview is loaded to the preview_image wave in the pear_explorer data folder.
///
/// the s_file_info string is updated with information about the scan dimensions.
///
/// @param filename name of a file in the directory specified by the pearl_explorer_filepath path object.
///
/// @return wave reference of the preview image
///
static function /wave preview_pshell_file(filename)
string filename
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
svar s_preview_file
svar s_preview_source
psh5_load_preview("preview_image", "pearl_explorer_filepath", filename)
s_preview_file = filename
s_preview_source = ""
wave /z preview_image
svar /z s_file_info
if (! svar_exists(s_file_info))
string /g s_file_info
endif
if (strlen(s_preview_file) > 0)
s_file_info = psh5_load_info("pearl_explorer_filepath", filename)
else
s_file_info = ""
endif
if (DataFolderExists("attr"))
setdatafolder attr
preview_attributes(GetDataFolderDFR())
setdatafolder ::
endif
setdatafolder saveDF
return preview_image
end
/// load the preview of a PEARL HDF5 file.
///
/// the preview is an arbitrary detector image extracted from the file, see adh5_load_preview().
/// the preview is loaded to the preview_image wave in the pear_explorer data folder.
///
/// the s_file_info string is updated with information about the scan dimensions.
///
/// @param filename name of a file in the directory specified by the pearl_explorer_filepath path object.
///
/// @return wave reference of the preview image
///
static function /wave preview_hdf_file(filename)
string filename
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
svar s_preview_file
svar s_preview_source
adh5_load_preview("preview_image", "pearl_explorer_filepath", filename)
s_preview_file = filename
s_preview_source = ""
wave /z preview_image
svar /z s_file_info
if (! svar_exists(s_file_info))
string /g s_file_info
endif
if (strlen(s_preview_file) > 0)
s_file_info = adh5_load_info("pearl_explorer_filepath", filename)
else
s_file_info = ""
endif
if (DataFolderExists("attr"))
setdatafolder attr
preview_attributes(GetDataFolderDFR())
setdatafolder ::
endif
setdatafolder saveDF
return preview_image
end
static function /wave preview_itx_file(filename)
string filename
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
svar s_preview_file
svar s_preview_source
wave preview_image
// note: some versions of PEARL data files save data to a new data folder,
// and leave the newly created folder as the current folder.
// the free data folder is used by those files which don't create their own data folder.
// this is the new recommended behaviour
dfref dataDF = newfreedatafolder()
setdatafolder dataDF
LoadWave /t/p=pearl_explorer_filepath/q filename
s_preview_file = s_filename
s_preview_source = ""
preview_datafolder()
preview_attributes(dataDF, include_datawaves=0)
setdatafolder saveDF
return preview_image
end
/// load the preview of a Matrix STM file.
///
/// the preview is loaded to the preview_image wave in the pearl_explorer data folder.
///
/// the s_file_info string is updated with information about the scan dimensions.
///
/// this function requires the MatrixFileReader.xop and pearl-matrix-import.ipf to be loaded.
/// otherwise it will return an empty wave reference.
///
/// @param filename name of a file in the directory specified by the pearl_explorer_filepath path object.
///
/// @return wave reference of the preview image.
/// empty wave reference if the function failed.
///
static function /wave preview_mtrx_file(filename)
string filename
#if exists("MFR_OpenResultFile")
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
variable /g V_MatrixFileReaderOverwrite = 1
variable /g V_MatrixFileReaderFolder = 0
variable /g V_MatrixFileReaderDouble = 0
svar s_preview_file
svar s_preview_source
string datanames
string dataname
datanames = mtrx_load_preview("preview", "pearl_explorer_filepath", filename)
if (strlen(datanames) > 0)
s_preview_file = filename
dataname = StringFromList(0, datanames)
wave data = $dataname
duplicate /o $dataname, preview_image
s_preview_source = StringByKey("Dataset", note(data), "=", "\r")
svar /z s_file_info
if (svar_exists(s_file_info))
s_file_info = ""
endif
variable i
variable n = ItemsInList(datanames)
string s
for (i = 0; i < n; i += 1)
s = StringFromList(i, datanames)
killwaves /z $s
endfor
endif
wave /z preview_image
setdatafolder saveDF
#else
wave /z preview_image = $""
#endif
return preview_image
end
static function extract_preview_image(data, preview)
// extracts a preview image from a wave of arbitrary dimension
wave data
wave preview
variable z1, z2
// extract image
switch (WaveDims(data))
case 1:
redimension /n=(numpnts(data)) preview
preview = data[p]
break
case 2:
redimension /n=(dimsize(data, 0), dimsize(data, 1)) preview
preview = data
break
case 3:
redimension /n=(dimsize(data, 0), dimsize(data, 1)) preview
z1 = floor(DimSize(data, 2) / 2)
z2 = z1
wave slab = ad_extract_slab(data, nan, nan, nan, nan, z1, z2, "", pscale=1)
preview = slab
break
case 4:
// not implemented
endswitch
switch (WaveDims(data))
case 4:
case 3:
case 2:
setscale /p y dimoffset(data, 1), dimdelta(data, 1), waveunits(data, 1), preview
case 1:
setscale /p x dimoffset(data, 0), dimdelta(data, 0), waveunits(data, 0), preview
setscale d 0, 0, waveunits(data, -1), preview
endswitch
end
static function preview_dataset(datasetname)
string datasetname // name of a data folder under root
dfref saveDF = GetDataFolderDFR()
if (!DataFolderExists("root:" + datasetname))
return -1
endif
setdatafolder root:
setdatafolder $datasetname
dfref datadf = GetDataFolderDFR()
wave /z data
setdatafolder $package_path
svar s_preview_file
svar s_preview_source
wave preview_image
if (WaveExists(data))
s_preview_file = datasetname
s_preview_source = ""
extract_preview_image(data, preview_image)
show_preview_graph(preview_image)
else
preview_image = nan
s_preview_file = datasetname
setdatafolder datadf
preview_datafolder()
show_preview_graph(preview_image)
endif
// attributes
setdatafolder datadf
if (DataFolderExists("attr"))
setdatafolder attr
preview_attributes(GetDataFolderDFR())
else
preview_attributes(GetDataFolderDFR(), include_datawaves=0)
endif
setdatafolder saveDF
return 0
end
static function preview_datafolder()
// preview data in the current data folder
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
svar s_preview_file
svar s_preview_source
svar s_preview_pvs
wave preview_image
setdatafolder saveDF
// select a wave to display
// consider only double-precision waves, i.e. ignore text and other special waves
// filter by matching PV name to s_preview_pvs
string d_names = WaveList("*", ";", "DP:1")
variable nw = ItemsInList(d_names, ";")
variable npv = ItemsInList(s_preview_pvs, ";")
variable iw, ipv
string wname, wnote, pv_name, pv_match
for (iw = 0; iw < nw; iw += 1)
wname = StringFromList(iw, d_names, ";")
wnote = note($wname)
pv_name = StringByKey("PV", wnote, "=", "\r")
// find matching data wave by PV name
for (ipv = 0; ipv < npv; ipv += 1)
pv_match = StringFromList(ipv, s_preview_pvs)
if (StringMatch(pv_name, pv_match))
wave data = $wname
s_preview_source = pv_name
extract_preview_image(data, preview_image)
preview_setscale_x(data, preview_image)
npv = 0
nw = 0
endif
endfor
endfor
setdatafolder saveDF
end
static function preview_setscale_x(data, preview)
// sets the approximate x scale of OTF data.
// requires an Axis1 tag with name of x wave in the wave note.
// if any of these conditions is true, the function does not change the scaling:
// 1) Axis1 tag or referenced wave is missing.
// 2) preview wave is not set to point scaling.
// 3) x wave is not monotonic (90% of the steps in the same direction).
wave data
wave preview
if ((DimOffset(preview, 0) == 0) && (DimDelta(preview, 0) == 1))
string xname = StringByKey("Axis1", note(data), "=", "\r")
wave /z xwave = $xname
if (WaveExists(xwave))
// check for monotonicity
variable monotonic = 0
duplicate /free xwave, xdiff
differentiate /p xwave /D=xdiff
duplicate /free xdiff, xflag
xflag = xdiff > 0
monotonic = sum(xflag) > numpnts(xwave) * 0.9
xflag = xdiff < 0
monotonic = monotonic || (sum(xflag) > numpnts(xwave) * 0.9)
if (monotonic)
setscale /i x xwave[0], xwave[numpnts(xwave)-1], waveunits(xwave, -1), preview
endif
endif
endif
end
static function preview_attributes(attr_folder, [dest_folder, attr_filter, include_datawaves, include_infowaves])
// copies the first elements of attributes in the specified folder to the preview waves
// by default, all existing attributes are copied
// if a text wave attr_filter exists in the pear_explorer folder, only the attributes referenced therein are copied
// to set up a filter, duplicate the attr_names wave of a template dataset, and remove unwanted items
dfref attr_folder // data folder which contains the attribute waves
dfref dest_folder // destination folder. the output is written to the attr_names and attr_values waves
// default = package folder
wave /t attr_filter // list of attributes allowed in the output
// default = use attr_filter of package folder
variable include_datawaves // 1 (default) = include data waves (any numeric wave which has a PV=name note)
// 0 = don't include attributes from data waves
variable include_infowaves // 1 (default) = include attributes from info waves (IN, ID, IV, IU)
// 0 = don't include attributes from info waves
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
if (ParamIsDefault(dest_folder))
dest_folder = GetDataFolderDFR() // package folder
endif
if (ParamIsDefault(attr_filter))
wave /t /z attr_filter
endif
if (ParamIsDefault(include_datawaves))
include_datawaves = 1
endif
if (ParamIsDefault(include_infowaves))
include_infowaves = 1
endif
setdatafolder dest_folder
wave /t /z attr_names, attr_values
if (!WaveExists(attr_names) || !WaveExists(attr_values))
make /n=(1) /o /t attr_names, attr_values
endif
attr_names = ""
attr_values = ""
string /g s_attr_folder = GetDataFolder(1, attr_folder)
setdatafolder attr_folder
wave /t /z IN
wave /t /z ID
wave /t /z IV
wave /t /z IU
// compile list of attributes
variable nattr // destination attributes
variable iattr
variable ninfo // info wave elements
variable iinfo
variable nw // attribute waves
variable iw
string sw
string ss
if (WaveExists(IN) && include_infowaves)
ninfo = numpnts(IN)
else
ninfo = 0
endif
if (include_datawaves)
string waves = WaveList("*", ";", "")
string exceptions = "ID;IN;IU;IV"
waves = RemoveFromList(exceptions, waves)
nw = ItemsInList(waves, ";")
else
nw = 0
endif
if (WaveExists(attr_filter) && (numpnts(attr_filter) >= 1))
nattr = numpnts(attr_filter)
redimension /n=(nattr) attr_names
attr_names = attr_filter
else
if(ninfo > 0)
redimension /n=(ninfo) attr_names
attr_names = SelectString(strlen(ID[p]) >= 0, IN[p], ID[p]) // use ID unless empty
endif
nattr = ninfo + nw
iattr = ninfo
redimension /n=(nattr) attr_names
for (iw = 0; iw < nw; iw +=1 )
sw = StringFromList(iw, waves, ";")
ss = StringByKey("PV", note($sw), "=", "\r")
FindValue /text=sw attr_names
if ((v_value < 0) && (strlen(ss) >= 0))
attr_names[iattr] = sw
iattr += 1
endif
endfor
nattr = iattr
endif
redimension /n=(nattr) attr_names, attr_values
sort attr_names, attr_names
// look up attribute values
for (iattr = 0; iattr < nattr; iattr += 1)
sw = attr_names[iattr]
// try info waves
if (ninfo > 0)
FindValue /text=sw ID
if (v_value >= 0)
attr_values[iattr] = IV[v_value]
endif
FindValue /text=sw IN
if (v_value >= 0)
attr_values[iattr] = IV[v_value]
endif
endif
// override from attribute wave if existent
if (nw > 0)
switch (WaveType($sw, 1))
case 1: // numeric
wave /z w = $sw
if (WaveExists(w) && (numpnts(w) >= 1))
sprintf ss, "%g", w[0]
attr_values[iattr] = ss
endif
break
case 2: // text
wave /t/z wt = $sw
if (WaveExists(wt) && (numpnts(wt) >= 1))
attr_values[iattr] = wt[0]
endif
break
endswitch
endif
endfor
setdatafolder saveDF
end
static function display_dataset(datasetname)
// displays the graph of a loaded dataset in its own window
string datasetname // name of a data folder under root
dfref saveDF = GetDataFolderDFR()
if (!DataFolderExists("root:" + datasetname))
return -1
endif
setdatafolder root:
setdatafolder $datasetname
dfref datadf = GetDataFolderDFR()
wave /z data
if (!WaveExists(data))
wave /z data = data1
endif
if (WaveExists(data))
switch(WaveDims(data))
case 2:
ad_display_profiles(data)
break
case 3:
ad_display_slice(data)
ad_brick_slicer(data)
break
endswitch
endif
setdatafolder saveDF
return 0
end
function test_attributes_notebook()
dfref df = GetDataFolderDFR()
wave /t /sdfr=df attr_names
wave /t /sdfr=df attr_values
attributes_notebook(attr_names, attr_values, GetDataFolder(0))
end
static function attributes_notebook(attr_names, attr_values, title)
wave /t attr_names
wave /t attr_values
string title
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
wave /t/z attr_filter, attr_filter_summary
string name = CleanupName("nb_" + title[0,28], 0)
if (WinType(name) == 5)
Notebook $name selection={startOfFile, endOfFile}
Notebook $name text=""
else
NewNotebook /F=1 /K=1 /N=$name as title
GetWindow $name wsize
v_right = v_left + 260
v_bottom = v_top + 360
MoveWindow /W=$name v_left, v_top, v_right, v_bottom
Notebook $name tabs={2*72}
endif
// summary
if (WaveExists(attr_filter_summary) && (numpnts(attr_filter_summary) >= 1))
notebook $name fStyle=1, text="Summary\r\r"
notebook $name fStyle=0
notebook_add_attributes(name, attr_filter_summary, attr_names, attr_values)
notebook $name text="\r"
endif
// all attributes
notebook $name fStyle=1, text="All Attributes\r\r"
notebook $name fStyle=0
notebook_add_attributes(name, $"", attr_names, attr_values)
notebook $name selection={startOfFile,startOfFile}, findText={"",1}
setdatafolder saveDF
end
static function notebook_add_attributes(notebook_name, attr_filter, attr_names, attr_values)
string notebook_name
wave /t /z attr_filter
wave /t attr_names
wave /t attr_values
variable nw = numpnts(attr_names)
variable iw
string sw
string ss
variable do_filter = WaveExists(attr_filter)
for (iw = 0; iw < nw; iw += 1)
if (do_filter)
sw = attr_names[iw]
FindValue /text=sw attr_filter
else
v_value = 0
endif
if (v_value >= 0)
sprintf ss, "%s\t%s\r", attr_names[iw], attr_values[iw]
notebook $notebook_name text=ss
endif
endfor
end
static function /s show_preview_graph(data, [xdata])
// displays a preview of one- or two-dimensional data
wave data // data to be displayed. must either one-dimensional or two-dimensional
wave xdata // positions on x axis
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
svar s_profiles_graph
svar s_preview_file
svar s_preview_source
svar s_preview_trace_graph
if ((strlen(s_profiles_graph) > 0) && (WinType(s_profiles_graph) == 1))
KillWindow $s_profiles_graph
endif
if ((strlen(s_preview_trace_graph) > 0) && (WinType(s_preview_trace_graph) == 1))
KillWindow $s_preview_trace_graph
endif
string graphname
if (wavedims(data) == 2)
s_profiles_graph = ad_display_profiles(data)
ModifyGraph /w=$s_profiles_graph /z wbRGB=(48640,56832,60160)
graphname = s_profiles_graph
elseif (wavedims(data) == 1)
duplicate /o data, preview_trace
if (!ParamIsDefault(xdata))
duplicate /o xdata, preview_trace_x
else
duplicate /o data, preview_trace_x
preview_trace_x = x
setscale d 0, 0, WaveUnits(data, 0), preview_trace_x
endif
s_preview_trace_graph = display_preview_trace(preview_trace_x, preview_trace)
ModifyGraph /w=$s_preview_trace_graph wbRGB=(48640,56832,60160)
graphname = s_preview_trace_graph
else
return ""
endif
string title = "Preview " + s_preview_file
if (strlen(s_preview_source) > 0)
title = title + " (" + s_preview_source[0,31] + ")"
endif
dowindow /f/t $graphname, title
setdatafolder saveDF
return graphname
end
static function /s display_preview_trace(xtrace, ytrace)
wave xtrace
wave ytrace
display /n=pearl_explorer_1d /k=1 ytrace vs xtrace as "Preview"
string graphname = s_name
ModifyGraph /w=$graphname rgb[0]=(0,0,0)
ModifyGraph /w=$graphname grid=2
ModifyGraph /w=$graphname mirror=1
ModifyGraph /w=$graphname minor=1
ModifyGraph /w=$graphname axThick=0.5
ModifyGraph /w=$graphname gridRGB=(52224,52224,52224)
ModifyGraph /w=$graphname gridHair=0
ModifyGraph /w=$graphname tick=0
ModifyGraph /w=$graphname btLen=4
// axis labels
string labels = note(ytrace)
string lab
lab = StringByKey("AxisLabelX", labels, "=", "\r")
if (!strlen(lab))
lab = "X"
endif
Label /w=$graphname bottom lab + " (\\U)"
lab = StringByKey("AxisLabelD", labels, "=", "\r")
if (!strlen(lab))
lab = "value"
endif
Label /w=$graphname left lab + " (\\U)"
return s_name
end
static function load_selected_files([options])
string options
dfref saveDF = GetDataFolderDFR()
setdatafolder $package_path
wave wSelectedFiles
wave/t wtFiles
variable nn = numpnts(wSelectedFiles)
variable ii
for (ii = 0; ii < nn; ii += 1)
if (wSelectedFiles[ii])
if (ParamIsDefault(options))
load_file(wtFiles[ii])
else
load_file(wtFiles[ii], options=options)
endif
endif
endfor
update_datasets()
setdatafolder saveDF
end
static function load_file(filename, [options])
string filename
string options
dfref saveDF = GetDataFolderDFR()
variable ft = pearl_file_type(filename)
switch(ft)
case 1:
if (ParamIsDefault(options))
load_pshell_file(filename)
else
load_pshell_file(filename, options=options)
endif
break
case 2:
if (ParamIsDefault(options))
load_hdf_file(filename)
else
load_hdf_file(filename, options=options)
endif
break
case 3:
load_itx_file(filename)
break
case 4:
load_mtrx_file(filename)
break
default:
break
endswitch
setdatafolder saveDF
end
static function prompt_hdf_options(options)
string &options
string mode = StringByKey("mode", options, ":", ";")
string reduction_func = StringByKey("reduction_func", options, ":", ";")
string modes = "load_reduced"
string reduction_functions = adh5_list_reduction_funcs()
if (strlen(mode) == 0)
mode = StringFromList(0, modes, ";")
endif
if (strlen(reduction_func) == 0)
reduction_func = StringFromList(0, reduction_functions, ";")
endif
prompt mode, "Mode", popup, modes
prompt reduction_func, "Reduction Function", popup, reduction_functions
doprompt "HDF5 Loading Options", mode, reduction_func
if (v_flag == 0)
options = ReplaceStringByKey("mode", options, mode, ":", ";")
options = ReplaceStringByKey("reduction_func", options, reduction_func, ":", ";")
endif
return v_flag // 0 = OK, 1 = cancel
end
/// prototype for prompting for processing function parameters.
///
/// the function should prompt the user for function parameters,
/// and update the param argument if the user clicked OK.
/// returns 0 if the user clicked OK, 1 if the user cancelled.
///
/// prompt functions must have the same name as the corresponding reduction function
/// with the prefix "prompt_".
/// be aware of the limited length of function names in Igor.
///
/// this function is a prototype. it does nothing but returns OK.
///
function prompt_default_process(param)
string &param
return 0
end
function prompt_func_params(func_name, func_param)
string func_name
string &func_param
string prompt_name = "prompt_" + func_name
if (exists(prompt_name) == 6)
funcref prompt_default_process prompt_func = $prompt_name
return prompt_func(func_param)
else
// ignore missing prompt function
return 0
endif
end
static function /df load_pshell_file(filename, [options])
string filename
string options
dfref saveDF = GetDataFolderDFR()
string nickname = ad_suggest_foldername(filename)
string loaded_filename = ""
if (ParamIsDefault(options))
loaded_filename = psh5_load_complete(nickname, "pearl_explorer_filepath", filename)
else
if (strlen(options) == 0)
svar pref_options = $(package_path + "s_hdf_options")
options = pref_options
if (prompt_hdf_options(options) == 0)
// OK
pref_options = options
else
// cancel
options = ""
endif
endif
string mode = StringByKey("mode", options, ":", ";")
strswitch(mode)
case "load_reduced":
string reduction_func = StringByKey("reduction_func", options, ":", ";")
svar pref_params = $(package_path + "s_reduction_params")
string reduction_params = pref_params
if (prompt_func_params(reduction_func, reduction_params) == 0)
pref_params = reduction_params
print reduction_func, reduction_params
psh5_load_reduced(nickname, "pearl_explorer_filepath", filename, $reduction_func, reduction_params)
svar s_filepath
loaded_filename = s_filepath
endif
break
endswitch
endif
dfref dataDF
if (strlen(loaded_filename) > 0)
setdatafolder $("root:" + nickname)
dataDF = GetDataFolderDFR()
string /g pearl_explorer_import = "load_pshell_file"
endif
setdatafolder saveDF
return dataDF
end
static function /df load_hdf_file(filename, [options])
string filename
string options
dfref saveDF = GetDataFolderDFR()
string nickname = ad_suggest_foldername(filename)
string loaded_filename = ""
if (ParamIsDefault(options))
loaded_filename = adh5_load_complete(nickname, "pearl_explorer_filepath", filename)
else
if (strlen(options) == 0)
svar pref_options = $(package_path + "s_hdf_options")
options = pref_options
if (prompt_hdf_options(options) == 0)
// OK
pref_options = options
else
// cancel
options = ""
endif
endif
string mode = StringByKey("mode", options, ":", ";")
strswitch(mode)
case "load_reduced":
string reduction_func = StringByKey("reduction_func", options, ":", ";")
svar pref_params = $(package_path + "s_reduction_params")
string reduction_params = pref_params
if (prompt_func_params(reduction_func, reduction_params) == 0)
pref_params = reduction_params
print reduction_func, reduction_params
loaded_filename = adh5_load_reduced(nickname, "pearl_explorer_filepath", filename, $reduction_func, reduction_params)
endif
break
endswitch
endif
dfref dataDF
if (strlen(loaded_filename) > 0)
setdatafolder $("root:" + nickname)
dataDF = GetDataFolderDFR()
string /g pearl_explorer_import = "load_hdf_file"
endif
setdatafolder saveDF
return dataDF
end
static function /df load_itx_file(filename, [options])
string filename
string options
dfref saveDF = GetDataFolderDFR()
string nickname = itx_suggest_foldername(filename)
if (ParamIsDefault(options))
options = ""
endif
setdatafolder root:
newdatafolder /s/o $("root:" + nickname)
dfref dataDF = GetDataFolderDFR()
// note: some versions of PEARL data files save data to a new data folder,
// and leave the newly created folder as the current folder.
// the free data folder is used by those files which don't create their own data folder.
// this is the new recommended behaviour
LoadWave /t/p=pearl_explorer_filepath/q filename
svar waves = s_wavenames
dfref actDF = GetDataFolderDFR()
if (v_flag > 0)
string /g pearl_explorer_import = "load_itx_file"
endif
if (!DataFolderRefsEqual(actDF, dataDF))
// the file created its own data folder.
// let's kill the pre-allocated folder
setdatafolder dataDF
if (ItemsInList(WaveList("*", ";", ""), ";") == 0)
killdatafolder /z dataDF
endif
endif
setdatafolder saveDF
return actDF
end
/// load a matrix (STM) data file
///
///
static function /df load_mtrx_file(filename, [options])
string filename
string options
dfref saveDF = GetDataFolderDFR()
dfref dataDF = $""
#if exists("MFR_OpenResultFile")
setdatafolder root:
string datasets = ""
datasets = mtrx_load_file("pearl_explorer_filepath", filename)
if (strlen(datasets) > 0)
string /g pearl_explorer_import = "load_mtrx_file"
string s1 = StringFromList(0, datasets)
wave w1 = $s1
dataDF = GetWavesDataFolderDFR(w1)
endif
#endif
setdatafolder saveDF
return dataDF
end
function /s itx_suggest_foldername(filename, [ignoredate,sourcename,unique])
// suggests the name of a data folder based on a file name
// if the file name follows the naming convention source-date-index.extension,
// the function tries to generate the nick name as source_date_index.
// otherwise it's just a cleaned up version of the file name.
string filename // file name, including extension. can also include a folder path (which is ignored)
// the extension is currently ignored, but may be used later to select the parent folder
variable ignoredate // if non-zero, the nick name will not include the date part
// defaults to zero
string sourcename // nick name of the data source
// the function tries to detect the source from the file name
// this option can be used to override auto-detection
// allowed values: sscan, otf
variable unique // if non-zero, the resulting name is made a unique data folder name in the current data folder
// defaults to zero
if (ParamIsDefault(ignoredate))
ignoredate = 0
endif
if (ParamIsDefault(unique))
unique = 0
endif
string basename = ParseFilePath(3, filename, ":", 0, 0)
string extension = ParseFilePath(4, filename, ":", 0, 0)
string nickname
string autosource
if (strsearch(basename, "X03DA_PC", 0, 2) >= 0)
autosource = "sscan"
basename = ReplaceString("_", basename, "-")
ignoredate = 1
elseif (strsearch(basename, "otf", 0, 2) >= 0)
autosource = "otf"
endif
if (ParamIsDefault(sourcename))
sourcename = autosource
endif
variable nparts = ItemsInList(basename, "-")
if (nparts >= 3)
string datepart = StringFromList(nparts - 2, basename, "-")
string indexpart = StringFromList(nparts - 1, basename, "-")
if (ignoredate)
sprintf nickname, "%s_%s", sourcename, indexpart
else
sprintf nickname, "%s_%s_%s", sourcename, datepart, indexpart
endif
else
nickname = CleanupName(basename, 0)
endif
if (unique && CheckName(nickname, 11))
nickname = UniqueName(nickname + "_", 11, 0)
endif
return nickname
end
Window PearlDataExplorer() : Panel
PauseUpdate; Silent 1 // building window...
NewPanel /K=1 /W=(800,0,1530,444) as "PEARL Data Explorer"
ModifyPanel cbRGB=(48640,56832,60160)
GroupBox gb_filepath,pos={8,4},size={224,52},title="file system folder"
TitleBox tb_filepath,pos={20,24},size={174,20},frame=2
TitleBox tb_filepath,variable=root:packages:pearl_explorer:s_filepath,fixedSize=1
Button b_browse_filepath,pos={200,24},size={20,20},proc=PearlDataExplorer#bp_browse_filepath,title="..."
Button b_browse_filepath,fColor=(65280,48896,32768)
GroupBox gb_prefs,pos={240,4},size={58,52},title="prefs",help={"explorer package preferences"}
Button b_save_prefs,pos={252,20},size={32,17},proc=PearlDataExplorer#bp_save_prefs,title="save"
Button b_save_prefs,help={"save preferences of the data explorer package (data file path, attributes filter)"}
Button b_save_prefs,fColor=(65280,48896,32768)
Button b_load_prefs,pos={252,36},size={32,17},proc=PearlDataExplorer#bp_load_prefs,title="load"
Button b_load_prefs,help={"load preferences of the data explorer package"}
Button b_load_prefs,fColor=(65280,48896,32768)
GroupBox gb_filelist,pos={8,64},size={224,372},title="data files"
ListBox lb_files,pos={20,84},size={200,212},proc=PearlDataExplorer#lbp_filelist
ListBox lb_files,listWave=root:packages:pearl_explorer:wtFiles
ListBox lb_files,selWave=root:packages:pearl_explorer:wSelectedFiles,row= 11,mode= 4
TitleBox tb_file_info,pos={20,300},size={198,78},frame=2,fixedSize=1
TitleBox tb_file_info,variable= root:packages:pearl_explorer:s_file_info
Button b_update_filelist,pos={20,386},size={60,20},proc=PearlDataExplorer#bp_update_filelist,title="update list"
Button b_update_filelist,fColor=(65280,48896,32768)
CheckBox cb_file_preview,pos={84,390},size={60,20},title="preview"
CheckBox cb_file_preview,help={"enable/disable automatic preview window when selecting a data file"}
CheckBox cb_file_preview,value=1
Button b_file_prev,pos={176,386},size={20,20},proc=PearlDataExplorer#bp_file_prev,title="\\W646"
Button b_file_prev,help={"previous file"}
Button b_file_prev,fColor=(65280,48896,32768)
Button b_file_next,pos={200,386},size={20,20},proc=PearlDataExplorer#bp_file_next,title="\\W649"
Button b_file_next,help={"next file"}
Button b_file_next,fColor=(65280,48896,32768)
Button b_load_files,pos={20,410},size={76,20},proc=PearlDataExplorer#bp_load_files,title="load complete"
Button b_load_files,help={"load the complete contents from the selected files"}
Button b_load_files,fColor=(65280,48896,32768)
Button b_load_files_opt,pos={100,410},size={76,20},proc=PearlDataExplorer#bp_load_files_opt,title="load reduced"
Button b_load_files_opt,help={"load data from the selected files with options (reduced dimensions)"}
Button b_load_files_opt,fColor=(65280,48896,32768)
// datasets group
GroupBox gb_datasets,pos={240,64},size={224,372},title="datasets"
ListBox lb_datasets,pos={252,84},size={200,300},proc=PearlDataExplorer#lbp_datasets,help={"list of loaded datasets"}
ListBox lb_datasets,listWave=root:packages:pearl_explorer:wtDatasets
ListBox lb_datasets,selWave=root:packages:pearl_explorer:wSelectedDatasets,mode= 1
ListBox lb_datasets,selRow= -1
Button b_update_datasets,pos={252,386},size={60,20},proc=PearlDataExplorer#bp_update_datasets,title="update list"
Button b_update_datasets,help={"update the list of datasets"}
Button b_update_datasets,fColor=(65280,48896,32768)
CheckBox cb_dataset_preview,pos={316,390},size={60,20},title="preview"
CheckBox cb_dataset_preview,help={"enable/disable automatic preview window when selecting a dataset"}
CheckBox cb_dataset_preview,value=0
Button b_dataset_prev,pos={408,386},size={20,20},proc=PearlDataExplorer#bp_dataset_prev,title="\\W646"
Button b_dataset_prev,help={"goto previous dataset"}
Button b_dataset_prev,fColor=(65280,48896,32768)
Button b_dataset_next,pos={432,386},size={20,20},proc=PearlDataExplorer#bp_dataset_next,title="\\W649"
Button b_dataset_next,help={"goto next dataset"}
Button b_dataset_next,fColor=(65280,48896,32768)
Button b_dataset_folder,pos={252,410},size={50,20},proc=PearlDataExplorer#bp_dataset_folder,title="goto DF"
Button b_dataset_folder,help={"set the current data folder of the selected dataset"}
Button b_dataset_folder,fColor=(65280,48896,32768)
Button b_dataset_display,pos={306,410},size={50,20},proc=PearlDataExplorer#bp_dataset_display,title="display"
Button b_dataset_display,help={"display the selected dataset in its own window"}
Button b_dataset_display,fColor=(65280,48896,32768)
GroupBox gb_preview,pos={472,4},size={250,52},title="preview"
TitleBox tb_preview_file,pos={484,24},size={226,20},frame=2
TitleBox tb_preview_file,variable=root:packages:pearl_explorer:s_preview_file,fixedSize=1
GroupBox gb_attributes,pos={472,64},size={250,372},title="attributes"
Button b_attr_notebook,pos={484,386},size={60,20},proc=PearlDataExplorer#bp_attr_notebook,title="notebook"
Button b_attr_notebook,help={"show attribute list in a notebook"}
Button b_attr_notebook,fColor=(65280,48896,32768)
String fldrSav0= GetDataFolder(1)
SetDataFolder root:packages:pearl_explorer:
Edit/W=(484,84,710,384)/HOST=# attr_names,attr_values
ModifyTable format(Point)=1,width(Point)=0,width(attr_names)=103,width(attr_values)=103
ModifyTable statsArea=85
SetDataFolder fldrSav0
RenameWindow #,T0
SetActiveSubwindow ##
EndMacro
static function bp_load_prefs(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
load_prefs()
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_save_prefs(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
save_prefs()
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_browse_filepath(ba) : ButtonControl
STRUCT WMButtonAction &ba
dfref saveDF = GetDataFolderDFR()
switch( ba.eventCode )
case 2: // mouse up
PathInfo /S pearl_explorer_filepath
NewPath /M="select data file folder" /O/Z pearl_explorer_filepath
if (v_flag == 0)
PathInfo /S pearl_explorer_filepath
svar filepath = $(package_path + "s_filepath")
filepath = s_path
update_filelist()
endif
break
case -1: // control being killed
break
endswitch
setdatafolder saveDF
return 0
End
static function bp_update_filelist(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
update_filelist()
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_load_files(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
load_selected_files()
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_load_files_opt(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
load_selected_files(options="")
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_file_next(ba) : ButtonControl
STRUCT WMButtonAction &ba
dfref saveDF = GetDataFolderDFR()
switch( ba.eventCode )
case 2: // mouse up
setdatafolder $package_path
wave /t wtFiles
wave wSelectedFiles
FindValue /i=1 wSelectedFiles
v_value += 1
if (v_value >= numpnts(wtFiles))
v_value = min(numpnts(wtFiles) - 1, 0)
endif
wSelectedFiles = p == v_value
if (v_value >= 0)
variable ifile = v_value
ControlInfo /W=PearlDataExplorer cb_file_preview
if (v_value)
preview_file(wtFiles[ifile])
endif
endif
break
case -1: // control being killed
break
endswitch
setdatafolder saveDF
return 0
End
static function bp_file_prev(ba) : ButtonControl
STRUCT WMButtonAction &ba
dfref saveDF = GetDataFolderDFR()
switch( ba.eventCode )
case 2: // mouse up
setdatafolder $package_path
wave /t wtFiles
wave wSelectedFiles
FindValue /i=1 wSelectedFiles
v_value -= 1
if (v_value < 0)
v_value = numpnts(wtFiles) - 1
endif
wSelectedFiles = p == v_value
if (v_value >= 0)
variable ifile = v_value
ControlInfo /W=PearlDataExplorer cb_file_preview
if (v_value)
preview_file(wtFiles[ifile])
endif
endif
break
case -1: // control being killed
break
endswitch
setdatafolder saveDF
return 0
End
static function lbp_filelist(lba) : ListBoxControl
STRUCT WMListboxAction &lba
Variable row = lba.row
Variable col = lba.col
WAVE/T/Z listWave = lba.listWave
WAVE/Z selWave = lba.selWave
switch( lba.eventCode )
case -1: // control being killed
break
case 1: // mouse down
if (selWave[row])
ControlInfo /W=PearlDataExplorer cb_file_preview
if (v_value)
preview_file(listWave[row])
endif
endif
break
case 3: // double click
break
case 4: // cell selection
case 5: // cell selection plus shift key
break
case 6: // begin edit
break
case 7: // finish edit
break
case 13: // checkbox clicked (Igor 6.2 or later)
break
endswitch
return 0
End
static function bp_update_datasets(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
update_datasets()
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_dataset_folder(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
ControlInfo /W=PearlDataExplorer lb_datasets
if (v_value >= 0)
setdatafolder $package_path
wave /t wtDatasets
string dataset = wtDatasets[v_value]
string cmd
sprintf cmd, "setdatafolder root:%s", PossiblyQuoteName(dataset)
execute /q /z cmd
cmd = "setdatafolder :scan1"
execute /q /z cmd
sprintf cmd, "setdatafolder %s", GetDataFolder(1)
print cmd
endif
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_dataset_display(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
ControlInfo /W=PearlDataExplorer lb_datasets
if (v_value >= 0)
setdatafolder $package_path
wave /t wtDatasets
string dataset = wtDatasets[v_value]
display_dataset(dataset)
endif
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_dataset_next(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
ControlInfo /W=PearlDataExplorer lb_datasets
wave /t wtDatasets = $(s_datafolder + s_value)
v_value += 1
if (v_value >= numpnts(wtDatasets))
v_value = min(0, numpnts(wtDatasets) - 1)
endif
ListBox lb_datasets win=PearlDataExplorer, selRow=v_value
if (v_value >= 0)
variable ids = v_value
ControlInfo /W=PearlDataExplorer cb_dataset_preview
if (v_value)
preview_dataset(wtDatasets[ids])
endif
endif
break
case -1: // control being killed
break
endswitch
return 0
End
static function bp_dataset_prev(ba) : ButtonControl
STRUCT WMButtonAction &ba
switch( ba.eventCode )
case 2: // mouse up
ControlInfo /W=PearlDataExplorer lb_datasets
wave /t wtDatasets = $(s_datafolder + s_value)
v_value -= 1
if (v_value < 0)
v_value = max(-1, numpnts(wtDatasets) - 1)
endif
ListBox lb_datasets win=PearlDataExplorer, selRow=v_value
if (v_value >= 0)
variable ids = v_value
ControlInfo /W=PearlDataExplorer cb_dataset_preview
if (v_value)
preview_dataset(wtDatasets[ids])
endif
endif
break
case -1: // control being killed
break
endswitch
return 0
End
static function lbp_datasets(lba) : ListBoxControl
STRUCT WMListboxAction &lba
Variable row = lba.row
Variable col = lba.col
WAVE/T/Z listWave = lba.listWave
WAVE/Z selWave = lba.selWave
switch( lba.eventCode )
case -1: // control being killed
break
case 1: // mouse down
if (row >= 0)
ControlInfo /W=PearlDataExplorer cb_dataset_preview
if (v_value)
preview_dataset(listWave[row])
endif
endif
break
case 3: // double click
break
case 4: // cell selection
case 5: // cell selection plus shift key
break
case 6: // begin edit
break
case 7: // finish edit
break
case 13: // checkbox clicked (Igor 6.2 or later)
break
endswitch
return 0
End
static function bp_attr_notebook(ba) : ButtonControl
STRUCT WMButtonAction &ba
dfref saveDF = GetDataFolderDFR()
switch( ba.eventCode )
case 2: // mouse up
setdatafolder $package_path
svar s_preview_file
wave /t /z attr_names
wave /t /z attr_values
if (WaveExists(attr_names))
attributes_notebook(attr_names, attr_values, s_preview_file)
endif
break
case -1: // control being killed
break
endswitch
setdatafolder saveDF
return 0
End