PEARL Procedures  rev-distro-1.4.0-0-g80a01f2
Igor procedures for the analysis of PEARL data
pearl-data-explorer.ipf
Go to the documentation of this file.
1 #pragma rtGlobals=3// Use modern global access method and strict wave access.
2 #pragma IgorVersion = 6.1
3 #pragma ModuleName = PearlDataExplorer
4 #pragma version = 1.50
5 #include "pearl-area-import"
6 #include "pearl-area-profiles"
7 #include "pearl-area-display"
8 #include "pearl-pshell-import"
9 #if exists("MFR_OpenResultFile")
10 #include "pearl-matrix-import"
11 #endif
12 
13 // copyright (c) 2013-16 Paul Scherrer Institut
14 //
15 // Licensed under the Apache License, Version 2.0 (the "License");
16 // you may not use this file except in compliance with the License.
17 // You may obtain a copy of the License at
18 // http:///www.apache.org/licenses/LICENSE-2.0
19 
30 
35 
36 static const string package_name = "pearl_explorer";
37 static const string package_path = "root:packages:pearl_explorer:";
38 
39 static const string ks_filematch_adh5 = "*.h5";
40 static const string ks_filematch_pshell = "psh*.h5";
41 static const string ks_filematch_itx = "*.itx";
42 static const string ks_filematch_mtrx = "*_mtrx";
43 
45  init_package()
46  load_prefs()
47  execute /q/z "PearlDataExplorer()"
48 };
49 
55 static variable init_package(){
56 
57  dfref savefolder = GetDataFolderDFR()
58  SetDataFolder root:
59  newdatafolder /o/s packages
60  newdatafolder /o/s $package_name
61  if (exists("v_InitPanelDone") == 2)
62  SetDataFolder savefolder
63  return 0
64  endif
65 
66  make /o/n=0/t wtFiles
67  make /o/n=0/i wSelectedFiles,wSelectedDatasets
68  make /o/n=0/t wtDatasets
69  make /o/n=0/t wtPositioners,wtDetectors
70  make /o/n=0/i wSelectedPositioners,wSelectedDetectors
71 
72  make /o/n=(1,1) preview_image// preview 2D data
73  make /o/n=0 preview_trace// preview 1D data
74  make /o/n=0/t attr_names, attr_values, attr_filter, attr_filter_summary
75 
76  // persistent strings and variables. persistent = saved in preferences
77  string /g s_filepath = ""// directory path to be listed
78  string /g s_hdf_options = ""// recently used HDF5 load options
79  string /g s_reduction_params = ""// recently used reduction parameters
80  string /g s_preview_pvs = ""// semicolon-separated list of EPICS PVs to display in preview.
81  // the list items can contain wildcards for StringMatch
82  s_preview_pvs = "*OP:CURRENT*;*Stats*Total*;*CADC*"
83 
84  // non-persistent strings and variables
85  string /g s_preview_file = ""// file or folder name of the current preview
86  string /g s_preview_source = ""// data source, e.g. EPICS channel name, of the current preview
87  string /g s_profiles_graph = ""// window name of the current preview if the data is two-dimensional
88  string /g s_preview_trace_graph = ""// window name of the current preview if the data is one-dimensional
89  string /g s_file_info = ""// description of selected file
90 
91  variable/g v_InitPanelDone = 1
92 
93  SetDataFolder savefolder
94 };
95 
96 static variable save_prefs(){
97  // saves persistent package data to the preferences file
98  // the data saved in the file are: data file path, attributes filter
99  dfref saveDF = GetDataFolderDFR()
100 
101  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
102  fullPath += package_name
103  NewPath/O/C/Q tempPackagePrefsPath, fullPath
104  fullPath += ":preferences.pxp"
105 
106  SetDataFolder root:packages
107  SetDataFolder $package_name
108  string objects = "attr_filter;attr_filter_summary;s_filepath;s_hdf_options;s_reduction_params;s_preview_pvs"
109  SaveData /O /Q /J=objects fullPath
110 
111  KillPath/Z tempPackagePrefsPath
112 
113  SetDataFolder saveDF
114 };
115 
116 static variable load_prefs(){
117  // loads persistent package data from the preferences file
118  // the preferences file is an Igor packed experiment file in a special preferences folder
119  dfref saveDF = GetDataFolderDFR()
120 
121  variable result = -1
122  setdatafolder root:
123  NewDataFolder /O/S packages
124  NewDataFolder /O/S $package_name
125  dfref packageDF = GetDataFolderDFR()
126  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
127  fullPath += package_name
128 
129  GetFileFolderInfo /Q /Z fullPath
130  if (V_Flag == 0)// Disk directory exists?
131  fullPath += ":preferences.pxp"
132  GetFileFolderInfo /Q /Z fullPath
133  if (V_Flag == 0)// Preference file exist?
134  LoadData /O /R /Q fullPath
135  result = 0
136  endif
137  endif
138 
139  if (result == 0)
140  svar /sdfr=packageDF filepath = s_filepath
141  NewPath /O/Z pearl_explorer_filepath, filepath
144  endif
145 
146  SetDataFolder saveDF
147  return result
148 };
149 
161 static variable pearl_file_type(string filename){
162  string filename
163 
164  if (StringMatch(filename, ks_filematch_pshell))
165  return 1
166  else if (StringMatch(filename, ks_filematch_adh5))
167  return 2
168  else if (StringMatch(filename, ks_filematch_itx))
169  return 3
170 #if exists("MFR_OpenResultFile")
171  else if (StringMatch(filename, ks_filematch_mtrx))
172  return 4
173 #endif
174  else
175  return 0
176  endif
177 };
178 
184 static variable update_filelist(){
185  dfref saveDF = GetDataFolderDFR()
186 
187  string all_files
188  wave /t wtFiles = $(package_path + "wtFiles")
189  wave wSelectedFiles = $(package_path + "wSelectedFiles")
190  variable nn
191 
192  PathInfo pearl_explorer_filepath
193  if (v_flag == 1)
194  all_files = IndexedFile(pearl_explorer_filepath, -1, "????")
195  nn = ItemsInList(all_files)
196  else
197  all_files = ""
198  nn = 0
199  endif
200 
201  make /n=(nn) /t /free wtAllFiles
202  wtAllFiles = StringFromList(p, all_files)
203  Extract /o /t wtAllFiles, wtFiles, pearl_file_type(wtAllFiles[p])
204  Sort /A /R wtFiles, wtFiles
205 
206  redimension /n=(numpnts(wtFiles)) wSelectedFiles
207  wSelectedFiles = 0
208 
209  setdatafolder saveDF
210 };
211 
212 static variable update_datasets(){
213  // updates the list of imported datasets.
214  // a dataset means any top-level data folder
215  // which includes a string variable named pearl_explorer_import.
216  dfref saveDF = GetDataFolderDFR()
217 
218  setdatafolder root:
219  dfref rootdf = GetDataFolderDFR()
220  setdatafolder $package_path
221  dfref privatedf = GetDataFolderDFR()
222 
223  wave /t wtDatasets
224  wave wSelectedDatasets
225  variable maxdf = CountObjectsDFR(rootdf, 4)
226  redimension /n=(maxdf) wtDatasets
227 
228  variable idf = 0
229  variable ndf = 0
230  string sdf
231 
232  do
233  sdf = GetIndexedObjNameDFR(rootdf, 4, idf)
234  if (strlen(sdf) >= 1)
235  setdatafolder rootdf
236  setdatafolder $sdf
237  svar /z importer = pearl_explorer_import
238  if (svar_exists(importer))
239  wtDatasets[ndf] = sdf
240  ndf += 1
241  endif
242  else
243  break
244  endif
245  idf += 1
246  while(1)
247 
248  redimension /n=(ndf) wtDatasets, wSelectedDatasets
249  wSelectedDatasets = 0
250  sort wtDatasets, wtDatasets
251 
252  setdatafolder saveDF
253 };
254 
255 static variable preview_file(string filename){
256  string filename
257 
258  dfref saveDF = GetDataFolderDFR()
259 
260  variable ft = pearl_file_type(filename)
261  switch(ft)
262  case 1:
263  wave /z image = preview_pshell_file(filename)
264  break
265  case 2:
266  wave /z image = preview_hdf_file(filename)
267  break
268  case 3:
269  wave /z image = preview_itx_file(filename)
270  break
271  case 4:
272  wave /z image = preview_mtrx_file(filename)
273  break
274  default:
275  wave /z image = $""
276  endswitch
277 
278  if (WaveExists(image))
279  string graphname = show_preview_graph(image)
280  // preset ELOG panel - if available
281  if (exists("PearlElog#set_panel_attributes") == 6)
282  string cmd
283  sprintf cmd, "PearlElog#set_panel_attributes(\"\", \"File=%s\")", ParseFilePath(0, filename, ":", 1, 0)
284  execute /Q/Z cmd
285  if (strlen(graphname) > 0)
286  sprintf cmd, "PearlElog#set_panel_graphs(\"\", \"%s\")", graphname
287  execute /Q/Z cmd
288  endif
289  endif
290  endif
291 
292  setdatafolder saveDF
293  return 0
294 };
295 
307 static wave preview_pshell_file(string filename){
308  string filename
309 
310  dfref saveDF = GetDataFolderDFR()
311  setdatafolder $package_path
312  svar s_preview_file
313  svar s_preview_source
314  psh5_load_preview("preview_image", "pearl_explorer_filepath", filename)
315  s_preview_file = filename
316  s_preview_source = ""
317  wave /z preview_image
318 
319  svar /z s_file_info
320  if (! svar_exists(s_file_info))
321  string /g s_file_info
322  endif
323  if (strlen(s_preview_file) > 0)
324  s_file_info = psh5_load_info("pearl_explorer_filepath", filename)
325  else
326  s_file_info = ""
327  endif
328 
329  if (DataFolderExists("attr"))
330  setdatafolder attr
331  preview_attributes(GetDataFolderDFR())
332  setdatafolder ::
333  endif
334 
335  setdatafolder saveDF
336  return preview_image
337 };
338 
350 static wave preview_hdf_file(string filename){
351  string filename
352 
353  dfref saveDF = GetDataFolderDFR()
354  setdatafolder $package_path
355  svar s_preview_file
356  svar s_preview_source
357  adh5_load_preview("preview_image", "pearl_explorer_filepath", filename)
358  s_preview_file = filename
359  s_preview_source = ""
360  wave /z preview_image
361 
362  svar /z s_file_info
363  if (! svar_exists(s_file_info))
364  string /g s_file_info
365  endif
366  if (strlen(s_preview_file) > 0)
367  s_file_info = adh5_load_info("pearl_explorer_filepath", filename)
368  else
369  s_file_info = ""
370  endif
371 
372  if (DataFolderExists("attr"))
373  setdatafolder attr
374  preview_attributes(GetDataFolderDFR())
375  setdatafolder ::
376  endif
377 
378  setdatafolder saveDF
379  return preview_image
380 };
381 
382 static wave preview_itx_file(string filename){
383  string filename
384 
385  dfref saveDF = GetDataFolderDFR()
386  setdatafolder $package_path
387  svar s_preview_file
388  svar s_preview_source
389  wave preview_image
390 
391  // note: some versions of PEARL data files save data to a new data folder,
392  // and leave the newly created folder as the current folder.
393  // the free data folder is used by those files which don't create their own data folder.
394  // this is the new recommended behaviour
395  dfref dataDF = newfreedatafolder()
396  setdatafolder dataDF
397  LoadWave /t/p=pearl_explorer_filepath/q filename
398  s_preview_file = s_filename
399  s_preview_source = ""
400 
402  preview_attributes(dataDF, include_datawaves=0)
403 
404  setdatafolder saveDF
405  return preview_image
406 };
407 
422 static wave preview_mtrx_file(string filename){
423  string filename
424 
425 #if exists("MFR_OpenResultFile")
426  dfref saveDF = GetDataFolderDFR()
427  setdatafolder $package_path
428  variable /g V_MatrixFileReaderOverwrite = 1
429  variable /g V_MatrixFileReaderFolder = 0
430  variable /g V_MatrixFileReaderDouble = 0
431  svar s_preview_file
432  svar s_preview_source
433  string datanames
434  string dataname
435  datanames = mtrx_load_preview("preview", "pearl_explorer_filepath", filename)
436  if (strlen(datanames) > 0)
437  s_preview_file = filename
438 
439  dataname = StringFromList(0, datanames)
440  wave data = $dataname
441  duplicate /o $dataname, preview_image
442  s_preview_source = StringByKey("Dataset", note(data), "=", "\r")
443 
444  svar /z s_file_info
445  if (svar_exists(s_file_info))
446  s_file_info = ""
447  endif
448 
449  variable i
450  variable n = ItemsInList(datanames)
451  string s
452  for (i = 0; i < n; i += 1)
453  s = StringFromList(i, datanames)
454  killwaves /z $s
455  endfor
456  endif
457  wave /z preview_image
458  setdatafolder saveDF
459 #else
460  wave /z preview_image = $""
461 #endif
462  return preview_image
463 };
464 
465 static variable extract_preview_image(wave data, wave preview){
466  // extracts a preview image from a wave of arbitrary dimension
467  wave data
468  wave preview
469 
470  variable z1, z2
471 
472  // extract image
473  switch (WaveDims(data))
474  case 1:
475  redimension /n=(numpnts(data)) preview
476  preview = data[p]
477  break
478  case 2:
479  redimension /n=(dimsize(data, 0), dimsize(data, 1)) preview
480  preview = data
481  break
482  case 3:
483  redimension /n=(dimsize(data, 0), dimsize(data, 1)) preview
484  z1 = floor(DimSize(data, 2) / 2)
485  z2 = z1
486  wave slab = ad_extract_slab(data, nan, nan, nan, nan, z1, z2, "", pscale=1)
487  preview = slab
488  break
489  case 4:
490  // not implemented
491  endswitch
492 
493  switch (WaveDims(data))
494  case 4:
495  case 3:
496  case 2:
497  setscale /p y dimoffset(data, 1), dimdelta(data, 1), waveunits(data, 1), preview
498  case 1:
499  setscale /p x dimoffset(data, 0), dimdelta(data, 0), waveunits(data, 0), preview
500  setscale d 0, 0, waveunits(data, -1), preview
501  endswitch
502 };
503 
504 static variable preview_dataset(string datasetname){
505  string datasetname// name of a data folder under root
506 
507  dfref saveDF = GetDataFolderDFR()
508 
509  if (!DataFolderExists("root:" + datasetname))
510  return -1
511  endif
512  setdatafolder root:
513  setdatafolder $datasetname
514  dfref datadf = GetDataFolderDFR()
515  wave /z data
516 
517  setdatafolder $package_path
518  svar s_preview_file
519  svar s_preview_source
520  wave preview_image
521  if (WaveExists(data))
522  s_preview_file = datasetname
523  s_preview_source = ""
524  extract_preview_image(data, preview_image)
525  show_preview_graph(preview_image)
526  else
527  preview_image = nan
528  s_preview_file = datasetname
529  setdatafolder datadf
531  show_preview_graph(preview_image)
532  endif
533 
534  // attributes
535  setdatafolder datadf
536  if (DataFolderExists("attr"))
537  setdatafolder attr
538  preview_attributes(GetDataFolderDFR())
539  else
540  preview_attributes(GetDataFolderDFR(), include_datawaves=0)
541  endif
542 
543  setdatafolder saveDF
544  return 0
545 };
546 
547 static variable preview_datafolder(){
548  // preview data in the current data folder
549  dfref saveDF = GetDataFolderDFR()
550 
551  setdatafolder $package_path
552  svar s_preview_file
553  svar s_preview_source
554  svar s_preview_pvs
555  wave preview_image
556 
557  setdatafolder saveDF
558 
559  // select a wave to display
560  // consider only double-precision waves, i.e. ignore text and other special waves
561  // filter by matching PV name to s_preview_pvs
562  string d_names = WaveList("*", ";", "DP:1")
563  variable nw = ItemsInList(d_names, ";")
564  variable npv = ItemsInList(s_preview_pvs, ";")
565  variable iw, ipv
566  string wname, wnote, pv_name, pv_match
567  for (iw = 0; iw < nw; iw += 1)
568  wname = StringFromList(iw, d_names, ";")
569  wnote = note($wname)
570  pv_name = StringByKey("PV", wnote, "=", "\r")
571  // find matching data wave by PV name
572  for (ipv = 0; ipv < npv; ipv += 1)
573  pv_match = StringFromList(ipv, s_preview_pvs)
574  if (StringMatch(pv_name, pv_match))
575  wave data = $wname
576  s_preview_source = pv_name
577  extract_preview_image(data, preview_image)
578  preview_setscale_x(data, preview_image)
579  npv = 0
580  nw = 0
581  endif
582  endfor
583  endfor
584 
585  setdatafolder saveDF
586 };
587 
588 static variable preview_setscale_x(wave data, wave preview){
589  // sets the approximate x scale of OTF data.
590  // requires an Axis1 tag with name of x wave in the wave note.
591  // if any of these conditions is true, the function does not change the scaling:
592  // 1) Axis1 tag or referenced wave is missing.
593  // 2) preview wave is not set to point scaling.
594  // 3) x wave is not monotonic (90% of the steps in the same direction).
595  wave data
596  wave preview
597 
598  if ((DimOffset(preview, 0) == 0) && (DimDelta(preview, 0) == 1))
599  string xname = StringByKey("Axis1", note(data), "=", "\r")
600  wave /z xwave = $xname
601  if (WaveExists(xwave))
602  // check for monotonicity
603  variable monotonic = 0
604  duplicate /free xwave, xdiff
605  differentiate /p xwave /D=xdiff
606  duplicate /free xdiff, xflag
607  xflag = xdiff > 0
608  monotonic = sum(xflag) > numpnts(xwave) * 0.9
609  xflag = xdiff < 0
610  monotonic = monotonic || (sum(xflag) > numpnts(xwave) * 0.9)
611  if (monotonic)
612  setscale /i x xwave[0], xwave[numpnts(xwave)-1], waveunits(xwave, -1), preview
613  endif
614  endif
615  endif
616 };
617 
618 static variable preview_attributes(dfref attr_folder, dfref dest_folder = defaultValue, wave attr_filter = defaultValue, variable include_datawaves = defaultValue, variable include_infowaves = defaultValue){
619  // copies the first elements of attributes in the specified folder to the preview waves
620  // by default, all existing attributes are copied
621  // if a text wave attr_filter exists in the pear_explorer folder, only the attributes referenced therein are copied
622  // to set up a filter, duplicate the attr_names wave of a template dataset, and remove unwanted items
623  dfref attr_folder// data folder which contains the attribute waves
624  dfref dest_folder// destination folder. the output is written to the attr_names and attr_values waves
625  // default = package folder
626  wave /t attr_filter// list of attributes allowed in the output
627  // default = use attr_filter of package folder
628  variable include_datawaves// 1 (default) = include data waves (any numeric wave which has a PV=name note)
629  // 0 = don't include attributes from data waves
630  variable include_infowaves// 1 (default) = include attributes from info waves (IN, ID, IV, IU)
631  // 0 = don't include attributes from info waves
632 
633  dfref saveDF = GetDataFolderDFR()
634  setdatafolder $package_path
635 
636  if (ParamIsDefault(dest_folder))
637  dest_folder = GetDataFolderDFR()// package folder
638  endif
639  if (ParamIsDefault(attr_filter))
640  wave /t /z attr_filter
641  endif
642  if (ParamIsDefault(include_datawaves))
643  include_datawaves = 1
644  endif
645  if (ParamIsDefault(include_infowaves))
646  include_infowaves = 1
647  endif
648 
649  setdatafolder dest_folder
650  wave /t /z attr_names, attr_values
651  if (!WaveExists(attr_names) || !WaveExists(attr_values))
652  make /n=(1) /o /t attr_names, attr_values
653  endif
654  attr_names = ""
655  attr_values = ""
656 
657  string /g s_attr_folder = GetDataFolder(1, attr_folder)
658  setdatafolder attr_folder
659  wave /t /z IN
660  wave /t /z ID
661  wave /t /z IV
662  wave /t /z IU
663 
664  // compile list of attributes
665  variable nattr// destination attributes
666  variable iattr
667  variable ninfo// info wave elements
668  variable iinfo
669  variable nw// attribute waves
670  variable iw
671  string sw
672  string ss
673 
674  if (WaveExists(IN) && include_infowaves)
675  ninfo = numpnts(IN)
676  else
677  ninfo = 0
678  endif
679  if (include_datawaves)
680  string waves = WaveList("*", ";", "")
681  string exceptions = "ID;IN;IU;IV"
682  waves = RemoveFromList(exceptions, waves)
683  nw = ItemsInList(waves, ";")
684  else
685  nw = 0
686  endif
687 
688  if (WaveExists(attr_filter) && (numpnts(attr_filter) >= 1))
689  nattr = numpnts(attr_filter)
690  redimension /n=(nattr) attr_names
691  attr_names = attr_filter
692  else
693  if(ninfo > 0)
694  redimension /n=(ninfo) attr_names
695  attr_names = SelectString(strlen(ID[p]) >= 0, IN[p], ID[p])// use ID unless empty
696  endif
697 
698  nattr = ninfo + nw
699  iattr = ninfo
700  redimension /n=(nattr) attr_names
701  for (iw = 0; iw < nw; iw +=1 )
702  sw = StringFromList(iw, waves, ";")
703  ss = StringByKey("PV", note($sw), "=", "\r")
704  FindValue /text=sw attr_names
705  if ((v_value < 0) && (strlen(ss) >= 0))
706  attr_names[iattr] = sw
707  iattr += 1
708  endif
709  endfor
710  nattr = iattr
711  endif
712  redimension /n=(nattr) attr_names, attr_values
713  sort attr_names, attr_names
714 
715  // look up attribute values
716  for (iattr = 0; iattr < nattr; iattr += 1)
717  sw = attr_names[iattr]
718  // try info waves
719  if (ninfo > 0)
720  FindValue /text=sw ID
721  if (v_value >= 0)
722  attr_values[iattr] = IV[v_value]
723  endif
724  FindValue /text=sw IN
725  if (v_value >= 0)
726  attr_values[iattr] = IV[v_value]
727  endif
728  endif
729 
730  // override from attribute wave if existent
731  if (nw > 0)
732  switch (WaveType($sw, 1))
733  case 1:// numeric
734  wave /z w = $sw
735  if (WaveExists(w) && (numpnts(w) >= 1))
736  sprintf ss, "%g", w[0]
737  attr_values[iattr] = ss
738  endif
739  break
740  case 2:// text
741  wave /t/z wt = $sw
742  if (WaveExists(wt) && (numpnts(wt) >= 1))
743  attr_values[iattr] = wt[0]
744  endif
745  break
746  endswitch
747  endif
748  endfor
749 
750  setdatafolder saveDF
751 };
752 
753 static variable display_dataset(string datasetname){
754  // displays the graph of a loaded dataset in its own window
755  string datasetname// name of a data folder under root
756 
757  dfref saveDF = GetDataFolderDFR()
758 
759  if (!DataFolderExists("root:" + datasetname))
760  return -1
761  endif
762  setdatafolder root:
763  setdatafolder $datasetname
764  dfref datadf = GetDataFolderDFR()
765  wave /z data
766  if (!WaveExists(data))
767  wave /z data = data1
768  endif
769 
770  if (WaveExists(data))
771  switch(WaveDims(data))
772  case 2:
773  ad_display_profiles(data)
774  break
775  case 3:
776  ad_display_slice(data)
777  ad_brick_slicer(data)
778  break
779  endswitch
780  endif
781 
782  setdatafolder saveDF
783  return 0
784 };
785 
787  dfref df = GetDataFolderDFR()
788  wave /t /sdfr=df attr_names
789  wave /t /sdfr=df attr_values
790  attributes_notebook(attr_names, attr_values, GetDataFolder(0))
791 };
792 
793 static variable attributes_notebook(wave attr_names, wave attr_values, string title){
794  wave /t attr_names
795  wave /t attr_values
796  string title
797 
798  dfref saveDF = GetDataFolderDFR()
799  setdatafolder $package_path
800  wave /t/z attr_filter, attr_filter_summary
801 
802  string name = CleanupName("nb_" + title[0,28], 0)
803  if (WinType(name) == 5)
804  Notebook $name selection={startOfFile, endOfFile}
805  Notebook $name text=""
806  else
807  NewNotebook /F=1 /K=1 /N=$name as title
808  GetWindow $name wsize
809  v_right = v_left + 260
810  v_bottom = v_top + 360
811  MoveWindow /W=$name v_left, v_top, v_right, v_bottom
812  Notebook $name tabs={2*72}
813  endif
814 
815  // summary
816  if (WaveExists(attr_filter_summary) && (numpnts(attr_filter_summary) >= 1))
817  notebook $name fStyle=1, text="Summary\r\r"
818  notebook $name fStyle=0
819  notebook_add_attributes(name, attr_filter_summary, attr_names, attr_values)
820  notebook $name text="\r"
821  endif
822 
823  // all attributes
824  notebook $name fStyle=1, text="All Attributes\r\r"
825  notebook $name fStyle=0
826  notebook_add_attributes(name, $"", attr_names, attr_values)
827  notebook $name selection={startOfFile,startOfFile}, findText={"",1}
828 
829  setdatafolder saveDF
830 };
831 
832 static variable notebook_add_attributes(string notebook_name, wave attr_filter, wave attr_names, wave attr_values){
833  string notebook_name
834  wave /t /z attr_filter
835  wave /t attr_names
836  wave /t attr_values
837 
838  variable nw = numpnts(attr_names)
839  variable iw
840  string sw
841  string ss
842 
843  variable do_filter = WaveExists(attr_filter)
844 
845  for (iw = 0; iw < nw; iw += 1)
846  if (do_filter)
847  sw = attr_names[iw]
848  FindValue /text=sw attr_filter
849  else
850  v_value = 0
851  endif
852  if (v_value >= 0)
853  sprintf ss, "%s\t%s\r", attr_names[iw], attr_values[iw]
854  notebook $notebook_name text=ss
855  endif
856  endfor
857 };
858 
859 static string show_preview_graph(wave data, wave xdata = defaultValue){
860  // displays a preview of one- or two-dimensional data
861  wave data// data to be displayed. must either one-dimensional or two-dimensional
862  wave xdata// positions on x axis
863 
864  dfref saveDF = GetDataFolderDFR()
865  setdatafolder $package_path
866 
867  svar s_profiles_graph
868  svar s_preview_file
869  svar s_preview_source
870  svar s_preview_trace_graph
871 
872  if ((strlen(s_profiles_graph) > 0) && (WinType(s_profiles_graph) == 1))
873  KillWindow $s_profiles_graph
874  endif
875  if ((strlen(s_preview_trace_graph) > 0) && (WinType(s_preview_trace_graph) == 1))
876  KillWindow $s_preview_trace_graph
877  endif
878 
879  string graphname
880  if (wavedims(data) == 2)
881  s_profiles_graph = ad_display_profiles(data)
882  ModifyGraph /w=$s_profiles_graph /z wbRGB=(48640,56832,60160)
883  graphname = s_profiles_graph
884  else if (wavedims(data) == 1)
885  duplicate /o data, preview_trace
886  if (!ParamIsDefault(xdata))
887  duplicate /o xdata, preview_trace_x
888  else
889  duplicate /o data, preview_trace_x
890  preview_trace_x = x
891  setscale d 0, 0, WaveUnits(data, 0), preview_trace_x
892  endif
893  s_preview_trace_graph = display_preview_trace(preview_trace_x, preview_trace)
894  ModifyGraph /w=$s_preview_trace_graph wbRGB=(48640,56832,60160)
895  graphname = s_preview_trace_graph
896  else
897  return ""
898  endif
899 
900  string title = "Preview " + s_preview_file
901  if (strlen(s_preview_source) > 0)
902  title = title + " (" + s_preview_source[0,31] + ")"
903  endif
904  dowindow /f/t $graphname, title
905 
906  setdatafolder saveDF
907  return graphname
908 };
909 
910 static string display_preview_trace(wave xtrace, wave ytrace){
911  wave xtrace
912  wave ytrace
913 
914  display /n=pearl_explorer_1d /k=1 ytrace vs xtrace as "Preview"
915  string graphname = s_name
916  ModifyGraph /w=$graphname rgb[0]=(0,0,0)
917  ModifyGraph /w=$graphname grid=2
918  ModifyGraph /w=$graphname mirror=1
919  ModifyGraph /w=$graphname minor=1
920  ModifyGraph /w=$graphname axThick=0.5
921  ModifyGraph /w=$graphname gridRGB=(52224,52224,52224)
922  ModifyGraph /w=$graphname gridHair=0
923  ModifyGraph /w=$graphname tick=0
924  ModifyGraph /w=$graphname btLen=4
925 
926  // axis labels
927  string labels = note(ytrace)
928  string lab
929  lab = StringByKey("AxisLabelX", labels, "=", "\r")
930  if (!strlen(lab))
931  lab = "X"
932  endif
933  Label /w=$graphname bottom lab + " (\\U)"
934  lab = StringByKey("AxisLabelD", labels, "=", "\r")
935  if (!strlen(lab))
936  lab = "value"
937  endif
938  Label /w=$graphname left lab + " (\\U)"
939 
940  return s_name
941 };
942 
943 static variable load_selected_files(string options = defaultValue){
944  string options
945 
946  dfref saveDF = GetDataFolderDFR()
947  setdatafolder $package_path
948 
949  wave wSelectedFiles
950  wave/t wtFiles
951  variable nn = numpnts(wSelectedFiles)
952  variable ii
953  for (ii = 0; ii < nn; ii += 1)
954  if (wSelectedFiles[ii])
955  if (ParamIsDefault(options))
956  load_file(wtFiles[ii])
957  else
958  load_file(wtFiles[ii], options=options)
959  endif
960  endif
961  endfor
962 
964  setdatafolder saveDF
965 };
966 
967 static variable load_file(string filename, string options = defaultValue){
968  string filename
969  string options
970 
971  dfref saveDF = GetDataFolderDFR()
972 
973  variable ft = pearl_file_type(filename)
974  switch(ft)
975  case 1:
976  if (ParamIsDefault(options))
977  load_pshell_file(filename)
978  else
979  load_pshell_file(filename, options=options)
980  endif
981  break
982  case 2:
983  if (ParamIsDefault(options))
984  load_hdf_file(filename)
985  else
986  load_hdf_file(filename, options=options)
987  endif
988  break
989  case 3:
990  load_itx_file(filename)
991  break
992  case 4:
993  load_mtrx_file(filename)
994  break
995  default:
996  break
997  endswitch
998 
999  setdatafolder saveDF
1000 };
1001 
1002 static variable prompt_hdf_options(string* options){
1003  string &options
1004 
1005  string mode = StringByKey("mode", options, ":", ";")
1006  string reduction_func = StringByKey("reduction_func", options, ":", ";")
1007 
1008  string modes = "load_reduced"
1009  string reduction_functions = adh5_list_reduction_funcs()
1010 
1011  if (strlen(mode) == 0)
1012  mode = StringFromList(0, modes, ";")
1013  endif
1014  if (strlen(reduction_func) == 0)
1015  reduction_func = StringFromList(0, reduction_functions, ";")
1016  endif
1017 
1018  prompt mode, "Mode", popup, modes
1019  prompt reduction_func, "Reduction Function", popup, reduction_functions
1020  doprompt "HDF5 Loading Options", mode, reduction_func
1021 
1022  if (v_flag == 0)
1023  options = ReplaceStringByKey("mode", options, mode, ":", ";")
1024  options = ReplaceStringByKey("reduction_func", options, reduction_func, ":", ";")
1025  endif
1026  return v_flag// 0 = OK, 1 = cancel
1027 };
1028 
1041 variable prompt_default_process(string* param){
1042  string &param
1043 
1044  return 0
1045 };
1046 
1047 variable prompt_func_params(string func_name, string* func_param){
1048  string func_name
1049  string &func_param
1050 
1051  string prompt_name = "prompt_" + func_name
1052  if (exists(prompt_name) == 6)
1053  funcref prompt_default_process prompt_func = $prompt_name
1054  return prompt_func(func_param)
1055  else
1056  // ignore missing prompt function
1057  return 0
1058  endif
1059 };
1060 
1061 static dfr load_pshell_file(string filename, string options = defaultValue){
1062  string filename
1063  string options
1064 
1065  dfref saveDF = GetDataFolderDFR()
1066  string nickname = ad_suggest_foldername(filename)
1067  string loaded_filename = ""
1068 
1069  if (ParamIsDefault(options))
1070  loaded_filename = psh5_load_complete(nickname, "pearl_explorer_filepath", filename)
1071  else
1072  if (strlen(options) == 0)
1073  svar pref_options = $(package_path + "s_hdf_options")
1074  options = pref_options
1075  if (prompt_hdf_options(options) == 0)
1076  // OK
1077  pref_options = options
1078  else
1079  // cancel
1080  options = ""
1081  endif
1082  endif
1083 
1084  string mode = StringByKey("mode", options, ":", ";")
1085 
1086  strswitch(mode)
1087  case "load_reduced":
1088  string reduction_func = StringByKey("reduction_func", options, ":", ";")
1089  svar pref_params = $(package_path + "s_reduction_params")
1090  string reduction_params = pref_params
1091  if (prompt_func_params(reduction_func, reduction_params) == 0)
1092  pref_params = reduction_params
1093  print reduction_func, reduction_params
1094  psh5_load_reduced(nickname, "pearl_explorer_filepath", filename, $reduction_func, reduction_params)
1095  svar s_filepath
1096  loaded_filename = s_filepath
1097  endif
1098  break
1099  endswitch
1100  endif
1101 
1102  dfref dataDF
1103  if (strlen(loaded_filename) > 0)
1104  setdatafolder $("root:" + nickname)
1105  dataDF = GetDataFolderDFR()
1106  string /g pearl_explorer_import = "load_pshell_file"
1107  endif
1108 
1109  setdatafolder saveDF
1110  return dataDF
1111 };
1112 
1113 static dfr load_hdf_file(string filename, string options = defaultValue){
1114  string filename
1115  string options
1116 
1117  dfref saveDF = GetDataFolderDFR()
1118  string nickname = ad_suggest_foldername(filename)
1119  string loaded_filename = ""
1120 
1121  if (ParamIsDefault(options))
1122  loaded_filename = adh5_load_complete(nickname, "pearl_explorer_filepath", filename)
1123  else
1124  if (strlen(options) == 0)
1125  svar pref_options = $(package_path + "s_hdf_options")
1126  options = pref_options
1127  if (prompt_hdf_options(options) == 0)
1128  // OK
1129  pref_options = options
1130  else
1131  // cancel
1132  options = ""
1133  endif
1134  endif
1135 
1136  string mode = StringByKey("mode", options, ":", ";")
1137 
1138  strswitch(mode)
1139  case "load_reduced":
1140  string reduction_func = StringByKey("reduction_func", options, ":", ";")
1141  svar pref_params = $(package_path + "s_reduction_params")
1142  string reduction_params = pref_params
1143  if (prompt_func_params(reduction_func, reduction_params) == 0)
1144  pref_params = reduction_params
1145  print reduction_func, reduction_params
1146  loaded_filename = adh5_load_reduced(nickname, "pearl_explorer_filepath", filename, $reduction_func, reduction_params)
1147  endif
1148  break
1149  endswitch
1150  endif
1151 
1152  dfref dataDF
1153  if (strlen(loaded_filename) > 0)
1154  setdatafolder $("root:" + nickname)
1155  dataDF = GetDataFolderDFR()
1156  string /g pearl_explorer_import = "load_hdf_file"
1157  endif
1158 
1159  setdatafolder saveDF
1160  return dataDF
1161 };
1162 
1163 static dfr load_itx_file(string filename, string options = defaultValue){
1164  string filename
1165  string options
1166 
1167  dfref saveDF = GetDataFolderDFR()
1168  string nickname = itx_suggest_foldername(filename)
1169 
1170  if (ParamIsDefault(options))
1171  options = ""
1172  endif
1173 
1174  setdatafolder root:
1175  newdatafolder /s/o $("root:" + nickname)
1176  dfref dataDF = GetDataFolderDFR()
1177 
1178  // note: some versions of PEARL data files save data to a new data folder,
1179  // and leave the newly created folder as the current folder.
1180  // the free data folder is used by those files which don't create their own data folder.
1181  // this is the new recommended behaviour
1182 
1183  LoadWave /t/p=pearl_explorer_filepath/q filename
1184  svar waves = s_wavenames
1185  dfref actDF = GetDataFolderDFR()
1186  if (v_flag > 0)
1187  string /g pearl_explorer_import = "load_itx_file"
1188  endif
1189 
1190  if (!DataFolderRefsEqual(actDF, dataDF))
1191  // the file created its own data folder.
1192  // let's kill the pre-allocated folder
1193  setdatafolder dataDF
1194  if (ItemsInList(WaveList("*", ";", ""), ";") == 0)
1195  killdatafolder /z dataDF
1196  endif
1197  endif
1198 
1199  setdatafolder saveDF
1200  return actDF
1201 };
1202 
1206 static dfr load_mtrx_file(string filename, string options = defaultValue){
1207  string filename
1208  string options
1209 
1210  dfref saveDF = GetDataFolderDFR()
1211  dfref dataDF = $""
1212 
1213 #if exists("MFR_OpenResultFile")
1214  setdatafolder root:
1215  string datasets = ""
1216  datasets = mtrx_load_file("pearl_explorer_filepath", filename)
1217  if (strlen(datasets) > 0)
1218  string /g pearl_explorer_import = "load_mtrx_file"
1219  string s1 = StringFromList(0, datasets)
1220  wave w1 = $s1
1221  dataDF = GetWavesDataFolderDFR(w1)
1222  endif
1223 #endif
1224 
1225  setdatafolder saveDF
1226  return dataDF
1227 };
1228 
1229 string itx_suggest_foldername(string filename, variable ignoredate = defaultValue, string sourcename = defaultValue, variable unique = defaultValue){
1230  // suggests the name of a data folder based on a file name
1231  // if the file name follows the naming convention source-date-index.extension,
1232  // the function tries to generate the nick name as source_date_index.
1233  // otherwise it's just a cleaned up version of the file name.
1234  string filename// file name, including extension. can also include a folder path (which is ignored)
1235  // the extension is currently ignored, but may be used later to select the parent folder
1236  variable ignoredate// if non-zero, the nick name will not include the date part
1237  // defaults to zero
1238  string sourcename// nick name of the data source
1239  // the function tries to detect the source from the file name
1240  // this option can be used to override auto-detection
1241  // allowed values: sscan, otf
1242  variable unique// if non-zero, the resulting name is made a unique data folder name in the current data folder
1243  // defaults to zero
1244 
1245  if (ParamIsDefault(ignoredate))
1246  ignoredate = 0
1247  endif
1248  if (ParamIsDefault(unique))
1249  unique = 0
1250  endif
1251 
1252  string basename = ParseFilePath(3, filename, ":", 0, 0)
1253  string extension = ParseFilePath(4, filename, ":", 0, 0)
1254  string nickname
1255 
1256  string autosource
1257  if (strsearch(basename, "X03DA_PC", 0, 2) >= 0)
1258  autosource = "sscan"
1259  basename = ReplaceString("_", basename, "-")
1260  ignoredate = 1
1261  else if (strsearch(basename, "otf", 0, 2) >= 0)
1262  autosource = "otf"
1263  endif
1264  if (ParamIsDefault(sourcename))
1265  sourcename = autosource
1266  endif
1267 
1268  variable nparts = ItemsInList(basename, "-")
1269  if (nparts >= 3)
1270  string datepart = StringFromList(nparts - 2, basename, "-")
1271  string indexpart = StringFromList(nparts - 1, basename, "-")
1272  if (ignoredate)
1273  sprintf nickname, "%s_%s", sourcename, indexpart
1274  else
1275  sprintf nickname, "%s_%s_%s", sourcename, datepart, indexpart
1276  endif
1277  else
1278  nickname = CleanupName(basename, 0)
1279  endif
1280 
1281  if (unique && CheckName(nickname, 11))
1282  nickname = UniqueName(nickname + "_", 11, 0)
1283  endif
1284 
1285  return nickname
1286 };
1287 
1289  PauseUpdate; Silent 1// building window...
1290  NewPanel /K=1 /W=(800,0,1530,444) as "PEARL Data Explorer"
1291  ModifyPanel cbRGB=(48640,56832,60160)
1292 
1293  GroupBox gb_filepath,pos={8,4},size={224,52},title="file system folder"
1294  TitleBox tb_filepath,pos={20,24},size={174,20},frame=2
1295  TitleBox tb_filepath,variable=root:packages:pearl_explorer:s_filepath,fixedSize=1
1296  Button b_browse_filepath,pos={200,24},size={20,20},proc=PearlDataExplorer#bp_browse_filepath,title="..."
1297  Button b_browse_filepath,fColor=(65280,48896,32768)
1298 
1299  GroupBox gb_prefs,pos={240,4},size={58,52},title="prefs",help={"explorer package preferences"}
1300  Button b_save_prefs,pos={252,20},size={32,17},proc=PearlDataExplorer#bp_save_prefs,title="save"
1301  Button b_save_prefs,help={"save preferences of the data explorer package (data file path, attributes filter)"}
1302  Button b_save_prefs,fColor=(65280,48896,32768)
1303  Button b_load_prefs,pos={252,36},size={32,17},proc=PearlDataExplorer#bp_load_prefs,title="load"
1304  Button b_load_prefs,help={"load preferences of the data explorer package"}
1305  Button b_load_prefs,fColor=(65280,48896,32768)
1306 
1307  GroupBox gb_filelist,pos={8,64},size={224,372},title="data files"
1308  ListBox lb_files,pos={20,84},size={200,212},proc=PearlDataExplorer#lbp_filelist
1309  ListBox lb_files,listWave=root:packages:pearl_explorer:wtFiles
1310  ListBox lb_files,selWave=root:packages:pearl_explorer:wSelectedFiles,row= 11,mode= 4
1311  TitleBox tb_file_info,pos={20,300},size={198,78},frame=2,fixedSize=1
1312  TitleBox tb_file_info,variable= root:packages:pearl_explorer:s_file_info
1313 
1314  Button b_update_filelist,pos={20,386},size={60,20},proc=PearlDataExplorer#bp_update_filelist,title="update list"
1315  Button b_update_filelist,fColor=(65280,48896,32768)
1316  CheckBox cb_file_preview,pos={84,390},size={60,20},title="preview"
1317  CheckBox cb_file_preview,help={"enable/disable automatic preview window when selecting a data file"}
1318  CheckBox cb_file_preview,value=1
1319  Button b_file_prev,pos={176,386},size={20,20},proc=PearlDataExplorer#bp_file_prev,title="\\W646"
1320  Button b_file_prev,help={"previous file"}
1321  Button b_file_prev,fColor=(65280,48896,32768)
1322  Button b_file_next,pos={200,386},size={20,20},proc=PearlDataExplorer#bp_file_next,title="\\W649"
1323  Button b_file_next,help={"next file"}
1324  Button b_file_next,fColor=(65280,48896,32768)
1325 
1326  Button b_load_files,pos={20,410},size={76,20},proc=PearlDataExplorer#bp_load_files,title="load complete"
1327  Button b_load_files,help={"load the complete contents from the selected files"}
1328  Button b_load_files,fColor=(65280,48896,32768)
1329  Button b_load_files_opt,pos={100,410},size={76,20},proc=PearlDataExplorer#bp_load_files_opt,title="load reduced"
1330  Button b_load_files_opt,help={"load data from the selected files with options (reduced dimensions)"}
1331  Button b_load_files_opt,fColor=(65280,48896,32768)
1332 
1333  // datasets group
1334  GroupBox gb_datasets,pos={240,64},size={224,372},title="datasets"
1335  ListBox lb_datasets,pos={252,84},size={200,300},proc=PearlDataExplorer#lbp_datasets,help={"list of loaded datasets"}
1336  ListBox lb_datasets,listWave=root:packages:pearl_explorer:wtDatasets
1337  ListBox lb_datasets,selWave=root:packages:pearl_explorer:wSelectedDatasets,mode= 1
1338  ListBox lb_datasets,selRow= -1
1339 
1340  Button b_update_datasets,pos={252,386},size={60,20},proc=PearlDataExplorer#bp_update_datasets,title="update list"
1341  Button b_update_datasets,help={"update the list of datasets"}
1342  Button b_update_datasets,fColor=(65280,48896,32768)
1343  CheckBox cb_dataset_preview,pos={316,390},size={60,20},title="preview"
1344  CheckBox cb_dataset_preview,help={"enable/disable automatic preview window when selecting a dataset"}
1345  CheckBox cb_dataset_preview,value=0
1346  Button b_dataset_prev,pos={408,386},size={20,20},proc=PearlDataExplorer#bp_dataset_prev,title="\\W646"
1347  Button b_dataset_prev,help={"goto previous dataset"}
1348  Button b_dataset_prev,fColor=(65280,48896,32768)
1349  Button b_dataset_next,pos={432,386},size={20,20},proc=PearlDataExplorer#bp_dataset_next,title="\\W649"
1350  Button b_dataset_next,help={"goto next dataset"}
1351  Button b_dataset_next,fColor=(65280,48896,32768)
1352 
1353  Button b_dataset_folder,pos={252,410},size={50,20},proc=PearlDataExplorer#bp_dataset_folder,title="goto DF"
1354  Button b_dataset_folder,help={"set the current data folder of the selected dataset"}
1355  Button b_dataset_folder,fColor=(65280,48896,32768)
1356  Button b_dataset_display,pos={306,410},size={50,20},proc=PearlDataExplorer#bp_dataset_display,title="display"
1357  Button b_dataset_display,help={"display the selected dataset in its own window"}
1358  Button b_dataset_display,fColor=(65280,48896,32768)
1359 
1360  GroupBox gb_preview,pos={472,4},size={250,52},title="preview"
1361  TitleBox tb_preview_file,pos={484,24},size={226,20},frame=2
1362  TitleBox tb_preview_file,variable=root:packages:pearl_explorer:s_preview_file,fixedSize=1
1363 
1364  GroupBox gb_attributes,pos={472,64},size={250,372},title="attributes"
1365  Button b_attr_notebook,pos={484,386},size={60,20},proc=PearlDataExplorer#bp_attr_notebook,title="notebook"
1366  Button b_attr_notebook,help={"show attribute list in a notebook"}
1367  Button b_attr_notebook,fColor=(65280,48896,32768)
1368 
1369  String fldrSav0= GetDataFolder(1)
1370  SetDataFolder root:packages:pearl_explorer:
1371  Edit/W=(484,84,710,384)/HOST=# attr_names,attr_values
1372  ModifyTable format(Point)=1,width(Point)=0,width(attr_names)=103,width(attr_values)=103
1373  ModifyTable statsArea=85
1374  SetDataFolder fldrSav0
1375  RenameWindow #,T0
1376  SetActiveSubwindow ##
1377 };
1378 
1379 static variable bp_load_prefs(WMButtonAction* ba){
1380  STRUCT WMButtonAction &ba
1381 
1382  switch( ba.eventCode )
1383  case 2:// mouse up
1384  load_prefs()
1385  break
1386  case -1:// control being killed
1387  break
1388  endswitch
1389 
1390  return 0
1391 };
1392 
1393 static variable bp_save_prefs(WMButtonAction* ba){
1394  STRUCT WMButtonAction &ba
1395 
1396  switch( ba.eventCode )
1397  case 2:// mouse up
1398  save_prefs()
1399  break
1400  case -1:// control being killed
1401  break
1402  endswitch
1403 
1404  return 0
1405 };
1406 
1407 static variable bp_browse_filepath(WMButtonAction* ba){
1408  STRUCT WMButtonAction &ba
1409 
1410  dfref saveDF = GetDataFolderDFR()
1411 
1412  switch( ba.eventCode )
1413  case 2:// mouse up
1414  PathInfo /S pearl_explorer_filepath
1415  NewPath /M="select data file folder" /O/Z pearl_explorer_filepath
1416  if (v_flag == 0)
1417  PathInfo /S pearl_explorer_filepath
1418  svar filepath = $(package_path + "s_filepath")
1419  filepath = s_path
1420  update_filelist()
1421  endif
1422  break
1423  case -1:// control being killed
1424  break
1425  endswitch
1426 
1427  setdatafolder saveDF
1428  return 0
1429 };
1430 
1431 static variable bp_update_filelist(WMButtonAction* ba){
1432  STRUCT WMButtonAction &ba
1433 
1434  switch( ba.eventCode )
1435  case 2:// mouse up
1436  update_filelist()
1437  break
1438  case -1:// control being killed
1439  break
1440  endswitch
1441 
1442  return 0
1443 };
1444 
1445 static variable bp_load_files(WMButtonAction* ba){
1446  STRUCT WMButtonAction &ba
1447 
1448  switch( ba.eventCode )
1449  case 2:// mouse up
1451  break
1452  case -1:// control being killed
1453  break
1454  endswitch
1455 
1456  return 0
1457 };
1458 
1459 static variable bp_load_files_opt(WMButtonAction* ba){
1460  STRUCT WMButtonAction &ba
1461 
1462  switch( ba.eventCode )
1463  case 2:// mouse up
1464  load_selected_files(options="")
1465  break
1466  case -1:// control being killed
1467  break
1468  endswitch
1469 
1470  return 0
1471 };
1472 
1473 static variable bp_file_next(WMButtonAction* ba){
1474  STRUCT WMButtonAction &ba
1475 
1476  dfref saveDF = GetDataFolderDFR()
1477 
1478  switch( ba.eventCode )
1479  case 2:// mouse up
1480  setdatafolder $package_path
1481  wave /t wtFiles
1482  wave wSelectedFiles
1483  FindValue /i=1 wSelectedFiles
1484  v_value += 1
1485  if (v_value >= numpnts(wtFiles))
1486  v_value = min(numpnts(wtFiles) - 1, 0)
1487  endif
1488  wSelectedFiles = p == v_value
1489  if (v_value >= 0)
1490  variable ifile = v_value
1491  ControlInfo /W=PearlDataExplorer cb_file_preview
1492  if (v_value)
1493  preview_file(wtFiles[ifile])
1494  endif
1495  endif
1496  break
1497  case -1:// control being killed
1498  break
1499  endswitch
1500 
1501  setdatafolder saveDF
1502  return 0
1503 };
1504 
1505 static variable bp_file_prev(WMButtonAction* ba){
1506  STRUCT WMButtonAction &ba
1507 
1508  dfref saveDF = GetDataFolderDFR()
1509 
1510  switch( ba.eventCode )
1511  case 2:// mouse up
1512  setdatafolder $package_path
1513  wave /t wtFiles
1514  wave wSelectedFiles
1515  FindValue /i=1 wSelectedFiles
1516  v_value -= 1
1517  if (v_value < 0)
1518  v_value = numpnts(wtFiles) - 1
1519  endif
1520  wSelectedFiles = p == v_value
1521  if (v_value >= 0)
1522  variable ifile = v_value
1523  ControlInfo /W=PearlDataExplorer cb_file_preview
1524  if (v_value)
1525  preview_file(wtFiles[ifile])
1526  endif
1527  endif
1528  break
1529  case -1:// control being killed
1530  break
1531  endswitch
1532 
1533  setdatafolder saveDF
1534  return 0
1535 };
1536 
1537 static variable lbp_filelist(WMListboxAction* lba){
1538  STRUCT WMListboxAction &lba
1539 
1540  Variable row = lba.row
1541  Variable col = lba.col
1542  WAVE/T/Z listWave = lba.listWave
1543  WAVE/Z selWave = lba.selWave
1544 
1545  switch( lba.eventCode )
1546  case -1:// control being killed
1547  break
1548  case 1:// mouse down
1549  if (selWave[row])
1550  ControlInfo /W=PearlDataExplorer cb_file_preview
1551  if (v_value)
1552  preview_file(listWave[row])
1553  endif
1554  endif
1555  break
1556  case 3:// double click
1557  break
1558  case 4:// cell selection
1559  case 5:// cell selection plus shift key
1560  break
1561  case 6:// begin edit
1562  break
1563  case 7:// finish edit
1564  break
1565  case 13:// checkbox clicked (Igor 6.2 or later)
1566  break
1567  endswitch
1568 
1569  return 0
1570 };
1571 
1572 static variable bp_update_datasets(WMButtonAction* ba){
1573  STRUCT WMButtonAction &ba
1574 
1575  switch( ba.eventCode )
1576  case 2:// mouse up
1577  update_datasets()
1578  break
1579  case -1:// control being killed
1580  break
1581  endswitch
1582 
1583  return 0
1584 };
1585 
1586 static variable bp_dataset_folder(WMButtonAction* ba){
1587  STRUCT WMButtonAction &ba
1588 
1589  switch( ba.eventCode )
1590  case 2:// mouse up
1591  ControlInfo /W=PearlDataExplorer lb_datasets
1592  if (v_value >= 0)
1593  setdatafolder $package_path
1594  wave /t wtDatasets
1595  string dataset = wtDatasets[v_value]
1596  string cmd
1597  sprintf cmd, "setdatafolder root:%s", PossiblyQuoteName(dataset)
1598  execute /q /z cmd
1599  cmd = "setdatafolder :scan1"
1600  execute /q /z cmd
1601  sprintf cmd, "setdatafolder %s", GetDataFolder(1)
1602  print cmd
1603  endif
1604  break
1605  case -1:// control being killed
1606  break
1607  endswitch
1608 
1609  return 0
1610 };
1611 
1612 static variable bp_dataset_display(WMButtonAction* ba){
1613  STRUCT WMButtonAction &ba
1614 
1615  switch( ba.eventCode )
1616  case 2:// mouse up
1617  ControlInfo /W=PearlDataExplorer lb_datasets
1618  if (v_value >= 0)
1619  setdatafolder $package_path
1620  wave /t wtDatasets
1621  string dataset = wtDatasets[v_value]
1622  display_dataset(dataset)
1623  endif
1624  break
1625  case -1:// control being killed
1626  break
1627  endswitch
1628 
1629  return 0
1630 };
1631 
1632 static variable bp_dataset_next(WMButtonAction* ba){
1633  STRUCT WMButtonAction &ba
1634 
1635  switch( ba.eventCode )
1636  case 2:// mouse up
1637  ControlInfo /W=PearlDataExplorer lb_datasets
1638  wave /t wtDatasets = $(s_datafolder + s_value)
1639  v_value += 1
1640  if (v_value >= numpnts(wtDatasets))
1641  v_value = min(0, numpnts(wtDatasets) - 1)
1642  endif
1643  ListBox lb_datasets win=PearlDataExplorer, selRow=v_value
1644  if (v_value >= 0)
1645  variable ids = v_value
1646  ControlInfo /W=PearlDataExplorer cb_dataset_preview
1647  if (v_value)
1648  preview_dataset(wtDatasets[ids])
1649  endif
1650  endif
1651  break
1652  case -1:// control being killed
1653  break
1654  endswitch
1655 
1656  return 0
1657 };
1658 
1659 static variable bp_dataset_prev(WMButtonAction* ba){
1660  STRUCT WMButtonAction &ba
1661 
1662  switch( ba.eventCode )
1663  case 2:// mouse up
1664  ControlInfo /W=PearlDataExplorer lb_datasets
1665  wave /t wtDatasets = $(s_datafolder + s_value)
1666  v_value -= 1
1667  if (v_value < 0)
1668  v_value = max(-1, numpnts(wtDatasets) - 1)
1669  endif
1670  ListBox lb_datasets win=PearlDataExplorer, selRow=v_value
1671  if (v_value >= 0)
1672  variable ids = v_value
1673  ControlInfo /W=PearlDataExplorer cb_dataset_preview
1674  if (v_value)
1675  preview_dataset(wtDatasets[ids])
1676  endif
1677  endif
1678  break
1679  case -1:// control being killed
1680  break
1681  endswitch
1682 
1683  return 0
1684 };
1685 
1686 static variable lbp_datasets(WMListboxAction* lba){
1687  STRUCT WMListboxAction &lba
1688 
1689  Variable row = lba.row
1690  Variable col = lba.col
1691  WAVE/T/Z listWave = lba.listWave
1692  WAVE/Z selWave = lba.selWave
1693 
1694  switch( lba.eventCode )
1695  case -1:// control being killed
1696  break
1697  case 1:// mouse down
1698  if (row >= 0)
1699  ControlInfo /W=PearlDataExplorer cb_dataset_preview
1700  if (v_value)
1701  preview_dataset(listWave[row])
1702  endif
1703  endif
1704  break
1705  case 3:// double click
1706  break
1707  case 4:// cell selection
1708  case 5:// cell selection plus shift key
1709  break
1710  case 6:// begin edit
1711  break
1712  case 7:// finish edit
1713  break
1714  case 13:// checkbox clicked (Igor 6.2 or later)
1715  break
1716  endswitch
1717 
1718  return 0
1719 };
1720 
1721 static variable bp_attr_notebook(WMButtonAction* ba){
1722  STRUCT WMButtonAction &ba
1723 
1724  dfref saveDF = GetDataFolderDFR()
1725 
1726  switch( ba.eventCode )
1727  case 2:// mouse up
1728  setdatafolder $package_path
1729  svar s_preview_file
1730  wave /t /z attr_names
1731  wave /t /z attr_values
1732  if (WaveExists(attr_names))
1733  attributes_notebook(attr_names, attr_values, s_preview_file)
1734  endif
1735  break
1736  case -1:// control being killed
1737  break
1738  endswitch
1739 
1740  setdatafolder saveDF
1741  return 0
1742 };
1743 
static dfr load_mtrx_file(string filename, string options=defaultValue)
load a matrix (STM) data file
static const string package_path
string psh5_load_reduced(string ANickName, string APathName, string AFileName, funcref reduction_func, string reduction_param, variable progress=defaultValue)
load and reduce the ScientaImage dataset of the first scan of a PShell data file. ...
string adh5_load_preview(string ANickName, string APathName, string AFileName, variable load_data=defaultValue, variable load_attr=defaultValue)
load a single image from a HDF5 file created by the Area Detector software.
static variable update_datasets()
static variable bp_browse_filepath(WMButtonAction *ba)
static variable preview_file(string filename)
variable prompt_default_process(string *param)
prototype for prompting for processing function parameters.
string adh5_load_info(string APathName, string AFileName)
load descriptive info from a HDF5 file created by the Area Detector software.
static variable bp_dataset_prev(WMButtonAction *ba)
static string display_preview_trace(wave xtrace, wave ytrace)
static variable bp_file_prev(WMButtonAction *ba)
variable ad_brick_slicer(wave data)
open a slicer panel for 3D data.
static variable lbp_datasets(WMListboxAction *lba)
void PearlDataExplorer()
static variable bp_load_files_opt(WMButtonAction *ba)
static variable load_selected_files(string options=defaultValue)
static variable bp_load_files(WMButtonAction *ba)
static variable preview_datafolder()
static variable bp_file_next(WMButtonAction *ba)
static variable lbp_filelist(WMListboxAction *lba)
static variable prompt_hdf_options(string *options)
static variable bp_update_datasets(WMButtonAction *ba)
static const string ks_filematch_pshell
static const string ks_filematch_adh5
static wave preview_mtrx_file(string filename)
load the preview of a Matrix STM file.
string psh5_load_preview(string ANickName, string APathName, string AFileName, variable load_data=defaultValue, variable load_attr=defaultValue, string pref_scans=defaultValue, string pref_datasets=defaultValue)
load a preview image from a PShell data file.
static variable init_package()
initialize the global variables of the data explorer.
static wave preview_pshell_file(string filename)
load the preview of a PShell HDF5 file.
static variable bp_dataset_folder(WMButtonAction *ba)
static variable preview_dataset(string datasetname)
static const string package_name
static variable update_filelist()
read a list of PEARL files from the file system
static dfr load_itx_file(string filename, string options=defaultValue)
static variable bp_attr_notebook(WMButtonAction *ba)
static variable load_file(string filename, string options=defaultValue)
preview and import panel for PEARL data
static variable bp_load_prefs(WMButtonAction *ba)
static variable preview_setscale_x(wave data, wave preview)
static variable bp_save_prefs(WMButtonAction *ba)
static dfr load_hdf_file(string filename, string options=defaultValue)
string ad_suggest_foldername(string filename, variable ignoredate=defaultValue, string sourcename=defaultValue, variable unique=defaultValue)
generate the name of a data folder based on a file name.
static wave preview_hdf_file(string filename)
load the preview of a PEARL HDF5 file.
static variable pearl_file_type(string filename)
check whether a file can be imported by this module.
static variable bp_dataset_display(WMButtonAction *ba)
static const string ks_filematch_itx
string adh5_load_complete(string ANickName, string APathName, string AFileName, variable load_data=defaultValue, variable load_attr=defaultValue)
import everything from a HDF5 file created by the Area Detector software.
static variable bp_dataset_next(WMButtonAction *ba)
static variable extract_preview_image(wave data, wave preview)
string psh5_load_info(string APathName, string AFileName)
load descriptive info from a PShell data file.
string adh5_load_reduced(string ANickName, string APathName, string AFileName, funcref reduction_func, string reduction_param, variable load_data=defaultValue, variable load_attr=defaultValue, variable progress=defaultValue)
load and reduce a dataset from a HDF5 file created by the Area Detector software. ...
string ad_display_profiles(wave image, string filter=defaultValue)
open a new profiles graph window.
static variable bp_update_filelist(WMButtonAction *ba)
variable pearl_data_explorer()
string itx_suggest_foldername(string filename, variable ignoredate=defaultValue, string sourcename=defaultValue, variable unique=defaultValue)
string psh5_load_complete(string ANickName, string APathName, string AFileName, variable load_data=defaultValue, variable load_attr=defaultValue)
load everything from a PShell data file.
static variable load_prefs()
variable prompt_func_params(string func_name, string *func_param)
static wave preview_itx_file(string filename)
static variable display_dataset(string datasetname)
static dfr load_pshell_file(string filename, string options=defaultValue)
static variable save_prefs()
variable test_attributes_notebook()
static string show_preview_graph(wave data, wave xdata=defaultValue)
string mtrx_load_preview(string destName, string pathName, string fileName, string traces=defaultValue)
load a preview image from a Matrix data file.
string ad_display_slice(wave data)
display three-dimensional data by 2D slice.
static const string ks_filematch_mtrx
static variable attributes_notebook(wave attr_names, wave attr_values, string title)
string mtrx_load_file(string pathName, string fileName, string traces=defaultValue)
load all data from a Matrix data file.
static variable preview_attributes(dfref attr_folder, dfref dest_folder=defaultValue, wave attr_filter=defaultValue, variable include_datawaves=defaultValue, variable include_infowaves=defaultValue)
string adh5_list_reduction_funcs()
get a list of functions which can be used as reduction functions.
static variable notebook_add_attributes(string notebook_name, wave attr_filter, wave attr_names, wave attr_values)
threadsafe wave ad_extract_slab(wave dataset, variable x1, variable x2, variable y1, variable y2, variable z1, variable z2, string destname, variable noavg=defaultValue, variable pscale=defaultValue)
2D cut through 3D dataset, integrate in normal dimension