PEARL Procedures  rev-distro-2.0.3-0-g0fb0fd9
Igor procedures for the analysis of PEARL data
pearl-anglescan-panel.ipf
Go to the documentation of this file.
1 #pragma rtGlobals=3 // Use modern global access method and strict wave access.
2 #pragma version = 1.7
3 #pragma IgorVersion = 6.2
4 #pragma ModuleName = PearlAnglescanPanel
5 #include "pearl-anglescan-process"
6 #include "pearl-pmsco-import"
7 
8 // copyright (c) 2018 Paul Scherrer Institut
9 //
10 // Licensed under the Apache License, Version 2.0 (the "License");
11 // you may not use this file except in compliance with the License.
12 // You may obtain a copy of the License at
13 // http:///www.apache.org/licenses/LICENSE-2.0
14 //
15 // Please acknowledge the use of this code.
16 
38 
43 
45 static strconstant package_name = "pearl_anglescan_panel"
47 static strconstant package_path = "root:packages:pearl_anglescan_panel:"
49 static strconstant prefs_objects = "theta_offset;tilt_offset;phi_offset;alpha_offset;crop_alpha_enable;crop_alpha_value;norm_alpha_enable;norm_alpha_mode;norm_alpha_smoothing;norm_phi_enable;norm_phi_mode;norm_phi_thetarange;norm_theta_enable;norm_theta_mode;norm_theta_smoothing;norm_thetaphi_enable;norm_thetaphi_mode;norm_theta_smoothing;output_folding;output_horizon;graph_mode;graph_projection;graph_colortable;graph_contrast;"
50 
52 static function AfterCompiledHook()
53 
54  dfref savedf = GetDataFolderDFR()
55  variable do_init = 1
56  if (DataFolderExists(package_path))
57  setdatafolder $(package_path)
58  nvar /z init_done
59  if (nvar_exists(init_done))
60  if (init_done)
61  do_init = 0
62  endif
63  endif
64  endif
65 
66  if (do_init)
67  init_package()
68  load_prefs()
69  setdatafolder $(package_path)
70  variable /g init_done = 1
71  endif
72 
73  setdatafolder savedf
74  return 0
75 end
76 
77 static function init_package()
78  dfref savedf = getdatafolderdfr()
79  setdatafolder root:
80  newdatafolder /o/s packages
81  newdatafolder /o/s $package_name
82 
83  // configuration (persistent)
84  string /g graphname = "graph_anglescan_panel"
85 
86  // recently used (persistent)
87  variable /g theta_offset = 0
88  variable /g tilt_offset = 0
89  variable /g phi_offset = 0
90  variable /g alpha_offset = 0
91  variable /g crop_alpha_enable = 0
92  variable /g crop_alpha_value = 25
93  variable /g norm_alpha_enable = 0
94  variable /g norm_alpha_mode = 4
95  variable /g norm_alpha_smoothing = 0.25
96  variable /g norm_theta_enable = 0
97  variable /g norm_theta_mode = 4
98  variable /g norm_theta_smoothing = 0.25
99  variable /g norm_thetaphi_enable = 0
100  variable /g norm_thetaphi_mode = 4
101  variable /g norm_thetaphi_smoothing = 0.25
102  variable /g norm_phi_enable = 0
103  variable /g norm_phi_mode = 4
104  variable /g norm_phi_thetarange = 20
105  string /g output_name = "holo1"
106  variable /g output_folding = 1
107  variable /g output_horizon = 88
108  variable /g graph_mode = 1
109  variable /g graph_projection = kProjStereo
110  string /g graph_colortable = "grays"
111  variable /g graph_contrast = 2
112 
113  // recently used (volatile)
114  string /g source_path = ""
115  string /g export_folderpath = "root:"
116  variable /g export_format = 1
117 
118  // administrative data (volatile)
119  string /g panel_name = ""
120  string /g preview_graphname = ""
121  string /g dist_x_graphname = ""
122  string /g dist_y_graphname = ""
123  string /g output_graphname = ""
124 
125  // data (volatile)
126  make /n=(10,10) /o raw_data, process_data
127  make /o dist_x, dist_x_smoo
128  make /o dist_y, dist_y_smoo
129 
130  setdatafolder savedf
131 end
132 
137 static function save_prefs()
138  dfref saveDF = GetDataFolderDFR()
139 
140  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
141  fullPath += package_name
142  NewPath/O/C/Q tempPackagePrefsPath, fullPath
143  fullPath += ":preferences.pxp"
144 
145  SetDataFolder root:packages
146  SetDataFolder $package_name
147  SaveData /O /Q /J=prefs_objects fullPath
148 
149  KillPath/Z tempPackagePrefsPath
150 
151  SetDataFolder saveDF
152 end
153 
161 static function load_prefs()
162  dfref saveDF = GetDataFolderDFR()
163 
164  variable result = -1
165  setdatafolder root:
166  NewDataFolder /O/S packages
167  NewDataFolder /O/S $package_name
168  string fullPath = SpecialDirPath("Packages", 0, 0, 0)
169  fullPath += package_name
170 
171  GetFileFolderInfo /Q /Z fullPath
172  if (V_Flag == 0) // Disk directory exists?
173  fullPath += ":preferences.pxp"
174  GetFileFolderInfo /Q /Z fullPath
175  if (V_Flag == 0) // Preference file exist?
176  LoadData /O /R /Q fullPath
177  result = 0
178  endif
179  endif
180 
181  SetDataFolder saveDF
182  return result
183 end
184 
197 function asp_import_raw(raw_data)
198  wave raw_data
199 
200  dfref saveDF = GetDataFolderDFR()
201  dfref datadf = GetWavesDataFolderDFR(raw_data)
202  dfref attrdf = datadf:attr
203  if (!DataFolderRefStatus(attrdf))
204  setdatafolder datadf
205  setdatafolder ::
206  dfref parentdf = GetDataFolderDFR()
207  dfref attrdf = parentdf:attr
208  endif
209  setdatafolder $(package_path)
210 
211  // todo : check dimensions and scales
212 
213  svar source_path
214  source_path = GetWavesDataFolder(raw_data, 2)
215 
216  duplicate /o raw_data, raw, process_data
217 
218  wave /sdfr=attrdf /z ManipulatorTheta
219  wave /sdfr=attrdf /z ManipulatorTilt
220  wave /sdfr=attrdf /z ManipulatorPhi
221  if (WaveExists(ManipulatorTheta) && WaveExists(ManipulatorTilt) && WaveExists(ManipulatorPhi))
222  duplicate /o attrdf:ManipulatorTheta, raw_theta, process_theta
223  duplicate /o attrdf:ManipulatorTilt, raw_tilt, process_tilt
224  duplicate /o attrdf:ManipulatorPhi, raw_phi, process_phi
225  else
226  DoAlert 0, "Can't find manipulator angle waves.\rCheck that the attr folder exists, or provide values in the following table."
227  make /n=(dimsize(raw_data, 1)) /o raw_theta, raw_tilt, raw_phi
228  make /n=(dimsize(raw_data, 1)) /o process_theta, process_tilt, process_phi
229  edit /k=1 raw_theta, raw_tilt, raw_phi
230  endif
231 
232  make /o /n=(dimsize(raw_data, 0)) dist_x, dist_x_smoo
233  make /o /n=(dimsize(raw_data, 1)) dist_y, dist_y_smoo
234 
235  SetDataFolder saveDF
236 end
237 
243  dfref df = $(package_path)
244  wave /sdfr=df process_data
245  svar /sdfr=df preview_graphname
246 
247  if (strlen(preview_graphname) && (wintype(preview_graphname) == 1))
248  ad_update_profiles(process_data)
249  DoWindow /F $preview_graphname
250  else
251  preview_graphname = ad_display_profiles(process_data)
252  endif
253 
254  nvar /sdfr=df graph_contrast
255  svar /sdfr=df graph_colortable
256  set_contrast(graph_contrast, graph_contrast, graphname=preview_graphname, colortable=graph_colortable)
257 end
258 
266 function asp_display_dist_check(xdist, ydist)
267  variable xdist, ydist
268 
269  dfref df = $(package_path)
270  wave /sdfr=df dist_x
271  wave /sdfr=df dist_y
272  wave /sdfr=df dist_x_smoo
273  wave /sdfr=df dist_y_smoo
274  svar /sdfr=df dist_x_graphname
275  svar /sdfr=df dist_y_graphname
276 
277  if (xdist)
278  if (strlen(dist_x_graphname) && (wintype(dist_x_graphname) == 1))
279  DoWindow /F $dist_x_graphname
280  else
281  display /k=1 /n=graph_asp_dist_x dist_x, dist_x_smoo
282  dist_x_graphname = s_name
283  ModifyGraph /w=$dist_x_graphname mode(dist_x)=2
284  ModifyGraph /w=$dist_x_graphname lsize(dist_x)=2
285  ModifyGraph /w=$dist_x_graphname rgb(dist_x)=(0,0,0)
286  endif
287  endif
288 
289  if (ydist)
290  if (strlen(dist_y_graphname) && (wintype(dist_y_graphname) == 1))
291  DoWindow /F $dist_y_graphname
292  else
293  display /k=1 /n=graph_asp_dist_y dist_y, dist_y_smoo
294  dist_y_graphname = s_name
295  ModifyGraph /w=$dist_y_graphname mode(dist_y)=2
296  ModifyGraph /w=$dist_y_graphname lsize(dist_y)=2
297  ModifyGraph /w=$dist_y_graphname rgb(dist_y)=(0,0,0)
298  endif
299  endif
300 end
301 
311 static function do_init_process(check)
312  variable check
313 
314  dfref df = $(package_path)
315  wave /sdfr=df raw
316  wave /sdfr=df raw_theta
317  wave /sdfr=df raw_tilt
318  wave /sdfr=df raw_phi
319  nvar /sdfr=df theta_offset
320  nvar /sdfr=df tilt_offset
321  nvar /sdfr=df phi_offset
322  nvar /sdfr=df alpha_offset
323 
324  duplicate /o raw, df:process_data
325  duplicate /o raw_theta, df:process_theta
326  duplicate /o raw_tilt, df:process_tilt
327  duplicate /o raw_phi, df:process_phi
328 
329  wave /sdfr=df process_data
330  wave /sdfr=df process_theta
331  wave /sdfr=df process_tilt
332  wave /sdfr=df process_phi
333 
334  process_theta = raw_theta - theta_offset
335  process_tilt = raw_tilt - tilt_offset
336  process_phi = raw_phi - phi_offset
337  setscale /p x dimoffset(raw, 0) - alpha_offset, dimdelta(raw, 0), waveunits(raw, 0), process_data
338 end
339 
351 static function do_crop_alpha(check, [force])
352  variable check
353  variable force
354 
355  if (ParamIsDefault(force))
356  force = 0
357  endif
358 
359  dfref df = $(package_path)
360  wave /sdfr=df process_data
361  nvar /sdfr=df crop_alpha_enable
362  nvar /sdfr=df crop_alpha_value
363 
364  if ((force || crop_alpha_enable) && (crop_alpha_value > abs(dimdelta(process_data, 0))))
365  crop_strip(process_data, -crop_alpha_value, +crop_alpha_value)
366  endif
367 end
368 
380 static function do_norm_alpha(check, [force])
381  variable check
382  variable force
383 
384  if (ParamIsDefault(force))
385  force = 0
386  endif
387 
388  dfref saveDF = GetDataFolderDFR()
389  dfref df = $(package_path)
390  wave /sdfr=df process_data
391  nvar /sdfr=df norm_alpha_enable
392  nvar /sdfr=df norm_alpha_mode
393  nvar /sdfr=df norm_alpha_smoothing
394 
395  if (force || norm_alpha_enable)
396  dfref temp_df = newfreedatafolder()
397  setdatafolder temp_df
398  normalize_strip_x(process_data, smooth_method=norm_alpha_mode, smooth_factor=norm_alpha_smoothing, check=check)
399  if (check)
400  wave check_dist
401  wave check_smoo
402  duplicate /o check_dist, df:dist_x
403  duplicate /o check_smoo, df:dist_x_smoo
404  endif
405  endif
406 
407  SetDataFolder saveDF
408 end
409 
421 static function do_norm_phi(check, [force])
422  variable check
423  variable force
424 
425  if (ParamIsDefault(force))
426  force = 0
427  endif
428 
429  dfref saveDF = GetDataFolderDFR()
430  dfref df = $(package_path)
431  wave /sdfr=df process_data
432  wave /sdfr=df process_theta
433  wave /sdfr=df process_phi
434  nvar /sdfr=df norm_phi_enable
435  nvar /sdfr=df norm_phi_mode
436  nvar /sdfr=df norm_phi_thetarange
437 
438  if (force || norm_phi_enable)
439  dfref temp_df = newfreedatafolder()
440  setdatafolder temp_df
441  normalize_strip_phi(process_data, process_theta, process_phi, theta_range=norm_phi_thetarange, check=check)
442  if (check)
443  wave check_dist
444  wave check_smoo
445  duplicate /o check_dist, df:dist_y
446  duplicate /o check_smoo, df:dist_y_smoo
447  endif
448  endif
449 
450  SetDataFolder saveDF
451 end
452 
464 static function do_norm_theta(check, [force])
465  variable check
466  variable force
467 
468  if (ParamIsDefault(force))
469  force = 0
470  endif
471 
472  dfref saveDF = GetDataFolderDFR()
473  dfref df = $(package_path)
474  wave /sdfr=df process_data
475  wave /sdfr=df process_theta
476  nvar /sdfr=df norm_theta_enable
477  nvar /sdfr=df norm_theta_mode
478  nvar /sdfr=df norm_theta_smoothing
479 
480  if (force || norm_theta_enable)
481  dfref temp_df = newfreedatafolder()
482  setdatafolder temp_df
483  normalize_strip_theta(process_data, process_theta, smooth_method=norm_theta_mode, smooth_factor=norm_theta_smoothing, check=check)
484  if (check)
485  wave check_dist
486  wave check_smoo
487  duplicate /o check_dist, df:dist_y
488  duplicate /o check_smoo, df:dist_y_smoo
489  endif
490  endif
491 
492  SetDataFolder saveDF
493 end
494 
506 static function do_norm_thetaphi(check, [force])
507  variable check
508  variable force
509 
510  if (ParamIsDefault(force))
511  force = 0
512  endif
513 
514  dfref saveDF = GetDataFolderDFR()
515  dfref df = $(package_path)
516  wave /sdfr=df process_data
517  wave /sdfr=df process_theta
518  wave /sdfr=df process_phi
519  nvar /sdfr=df norm_thetaphi_enable
520  nvar /sdfr=df norm_thetaphi_mode
521  nvar /sdfr=df norm_thetaphi_smoothing
522 
523  if (force || norm_thetaphi_enable)
524  dfref temp_df = newfreedatafolder()
525  setdatafolder temp_df
526  normalize_strip_thetaphi(process_data, process_theta, process_phi, smooth_method=norm_thetaphi_mode, smooth_factor=norm_thetaphi_smoothing, check=check)
527  if (check)
528  wave check_dist
529  wave check_smoo
530  duplicate /o check_dist, df:dist_y
531  duplicate /o check_smoo, df:dist_y_smoo
532  endif
533  endif
534 
535  SetDataFolder saveDF
536 end
537 
543  dfref saveDF = GetDataFolderDFR()
544  setdatafolder $(package_path)
545 
546  svar output_name
547 
548  wave process_data
549  wave process_theta
550  wave process_tilt
551  wave process_phi
552 
553  nvar folding=output_folding
554  nvar horizon=output_horizon
555 
556  do_init_process(0)
557  do_crop_alpha(0)
558  do_norm_alpha(0)
559  do_norm_phi(0)
560  do_norm_theta(0)
562 
563  pizza_service_2(process_data, output_name, process_theta, process_tilt, process_phi, folding=folding, nograph=1)
564 
565  setdatafolder $output_name
566  wave values
567  wave pol
568  if (horizon > 0)
569  values = pol <= horizon ? values : nan
570  endif
571 
572  SetDataFolder saveDF
573 end
574 
588 function /s asp_display_output([data_df, data_name])
589  dfref data_df
590  string data_name
591 
592  dfref pkg_df = $(package_path)
593  svar /sdfr=pkg_df output_name
594  svar /sdfr=pkg_df output_graphname
595  nvar /sdfr=pkg_df graph_projection
596  nvar /sdfr=pkg_df graph_mode
597  svar /sdfr=pkg_df graph_colortable
598  nvar /sdfr=pkg_df graph_contrast
599 
600  if (ParamIsDefault(data_df))
601  dfref data_df = pkg_df
602  endif
603  if (ParamIsDefault(data_name))
604  data_name = output_name
605  endif
606 
607  dfref saveDF = GetDataFolderDFR()
608  setdatafolder data_df
609 
610  if (graph_mode == 3)
611  interpolate_hemi_scan(data_name, projection=graph_projection)
612  endif
613 
614  string graphname = data_name
615  graphname = display_hemi_scan(data_name, projection=graph_projection, graphtype=graph_mode, graphname=graphname)
616  if (ParamIsDefault(data_df))
617  output_graphname = graphname
618  endif
619  SetDataFolder saveDF
620 
621  if (strlen(graphname) && (wintype(graphname) == 1))
622  set_contrast(graph_contrast, graph_contrast, graphname=graphname, colortable=graph_colortable)
623  endif
624 
625  return graphname
626 end
627 
633  dfref df = $(package_path)
634 
635  svar /sdfr=df preview_graphname
636  svar /sdfr=df output_graphname
637  svar /sdfr=df graph_colortable
638  nvar /sdfr=df graph_contrast
639 
640  if (strlen(preview_graphname) && (wintype(preview_graphname) == 1))
641  set_contrast(graph_contrast, graph_contrast, graphname=preview_graphname, colortable=graph_colortable)
642  endif
643  if (strlen(output_graphname) && (wintype(output_graphname) == 1))
644  set_contrast(graph_contrast, graph_contrast, graphname=output_graphname, colortable=graph_colortable)
645  endif
646 end
647 
651  dfref df = $(package_path)
652 
653  svar /sdfr=df preview_graphname
654  svar /sdfr=df output_graphname
655  svar /sdfr=df dist_x_graphname
656  svar /sdfr=df dist_y_graphname
657 
658  if (strlen(preview_graphname) && (wintype(preview_graphname) == 1))
659  killwindow $preview_graphname
660  endif
661  if (strlen(output_graphname) && (wintype(output_graphname) == 1))
662  killwindow $output_graphname
663  endif
664  if (strlen(dist_x_graphname) && (wintype(dist_x_graphname) == 1))
665  killwindow $dist_x_graphname
666  endif
667  if (strlen(dist_y_graphname) && (wintype(dist_y_graphname) == 1))
668  killwindow $dist_y_graphname
669  endif
670 
671  preview_graphname = ""
672  output_graphname = ""
673  dist_x_graphname = ""
674  dist_y_graphname = ""
675 end
676 
690 function /s asp_duplicate_output(dest_name, [do_graph])
691  string dest_name
692  variable do_graph
693 
694  if (ParamIsDefault(do_graph))
695  do_graph = 0
696  endif
697 
698  dfref df = $(package_path)
699  svar /sdfr=df source_path
700  svar /sdfr=df output_name
701  svar /sdfr=df output_graphname
702  wave raw_data = $source_path
703 
704  dfref saveDF = GetDataFolderDFR()
705  dfref raw_df = GetWavesDataFolderDFR(raw_data)
706  setdatafolder raw_df
707  newdatafolder /o /s $dest_name
708  dfref dest_df = GetDataFolderDFR()
709  setdatafolder df
710  duplicate_hemi_scan(output_name, dest_df, "")
711 
712  string graphname = ""
713  if (do_graph)
714  graphname = asp_display_output(data_df=raw_df, data_name=dest_name)
715  endif
716 
717  SetDataFolder saveDF
718  return graphname
719 end
720 
724  dfref df = $(package_path)
725  svar /sdfr=df output_name
726 
727  dfref saveDF = GetDataFolderDFR()
728  setdatafolder df
729  save_hemi_scan(output_name, "", "")
730 
731  SetDataFolder saveDF
732 end
733 
738 function asp_save_output_etpi(ekin)
739  variable ekin
740 
741  dfref df = $(package_path)
742  svar /sdfr=df output_name
743  wave /sdfr=df process_data
744 
745  dfref saveDF = GetDataFolderDFR()
746  setdatafolder df
747  string s_prefix = ""
748  string s_int = "values"
749  dfref data_df = find_hemi_data(output_name, s_prefix, s_int)
750  string s_polar = s_prefix + "pol"
751  string s_azim = s_prefix + "az"
752 
753  pmsco_save_scan("", "", num2str(ekin), s_polar, s_azim, "", s_int, "", sdfr=data_df)
754 
755  SetDataFolder saveDF
756 end
757 
758 static function check_norm_alpha()
759  do_init_process(0)
760  do_crop_alpha(0)
761  do_norm_alpha(2, force=1)
763 end
764 
765 static function check_norm_phi()
766  do_init_process(0)
767  do_crop_alpha(0)
768  do_norm_phi(2, force=1)
769  asp_display_dist_check(0, 1)
770 end
771 
772 static function check_norm_theta()
773  do_init_process(0)
774  do_crop_alpha(0)
775  do_norm_theta(2, force=1)
776  asp_display_dist_check(0, 1)
777 end
778 
779 static function check_norm_thetaphi()
780  do_init_process(0)
781  do_crop_alpha(0)
782  do_norm_thetaphi(2, force=1)
783  asp_display_dist_check(0, 1)
784 end
785 
786 static function preview_crop_alpha()
787  do_init_process(0)
788  do_crop_alpha(0, force=1)
790 end
791 
792 static function preview_norm_alpha()
793  do_init_process(0)
794  do_crop_alpha(0)
795  do_norm_alpha(1, force=1)
797 end
798 
799 static function preview_norm_phi()
800  do_init_process(0)
801  do_crop_alpha(0)
802  do_norm_phi(1, force=1)
804 end
805 
806 static function preview_norm_theta()
807  do_init_process(0)
808  do_crop_alpha(0)
809  do_norm_theta(1, force=1)
811 end
812 
813 static function preview_norm_thetaphi()
814  do_init_process(0)
815  do_crop_alpha(0)
816  do_norm_thetaphi(1, force=1)
818 end
819 
822 function asp_show_panel()
823  dfref df = $(package_path)
824  svar /sdfr=df panel_name
825 
826  if (strlen(panel_name) && (wintype(panel_name) == 7))
827  DoWindow /F $panel_name
828  return 0
829  endif
830 
831  NewPanel /K=1 /N=anglescan_panel /W=(200,100,479,854) as "angle scan processing"
832  panel_name = s_name
833 
834  GroupBox gb_source, title="data source"
835  Button b_source_select, size={50,20},proc=PearlAnglescanPanel#bp_source_select,title="select..."
836  Button b_source_select, help={"select the source wave, e.g. ReducedData1. it must be in the scan or region data folder. the attr folder with the manipulator waves must be in the same folder or one level up."}
837  Button b_source_update, size={50,20},proc=PearlAnglescanPanel#bp_source_update,title="update"
838  Button b_source_update, help={"reload the process data from the previous source (link displayed below)"}
839  TitleBox tb_source_path, size={240,21}
840  TitleBox tb_source_path,variable= root:packages:pearl_anglescan_panel:source_path
841 
842  GroupBox gb_offsets, title="offsets"
843  SetVariable sv_theta_offset, size={88,16},bodyWidth=60,title="theta"
844  SetVariable sv_theta_offset,value= root:packages:pearl_anglescan_panel:theta_offset
845  SetVariable sv_theta_offset, help={"manipulator theta value that corresponds to normal emission."}
846  SetVariable sv_tilt_offset, size={74,16},bodyWidth=60,title="tilt"
847  SetVariable sv_tilt_offset,value= root:packages:pearl_anglescan_panel:tilt_offset
848  SetVariable sv_tilt_offset, help={"manipulator tilt value that corresponds to normal emission."}
849  SetVariable sv_phi_offset, size={78,16},bodyWidth=60,title="phi"
850  SetVariable sv_phi_offset,value= root:packages:pearl_anglescan_panel:phi_offset
851  SetVariable sv_phi_offset, help={"manipulator phi value that should map to the 3 o'clock angle."}
852  SetVariable sv_alpha_offset, size={90,16},bodyWidth=60,title="alpha"
853  SetVariable sv_alpha_offset,value= root:packages:pearl_anglescan_panel:alpha_offset
854  SetVariable sv_alpha_offset, help={"alpha value that corresponds to normal emission (if the sample normal is properly aligned)."}
855  Button b_save_prefs, size={80,20},proc=PearlAnglescanPanel#bp_save_prefs,title="save prefs"
856  Button b_save_prefs, help={"save settings as preferences."}
857  Button b_load_prefs, size={80,20},proc=PearlAnglescanPanel#bp_load_prefs,title="load prefs"
858  Button b_load_prefs, help={"load settings from preferences."}
859 
860  GroupBox gb_crop_alpha, title="crop alpha"
861  CheckBox cb_crop_alpha_enable, size={50,14}, title="enable"
862  CheckBox cb_crop_alpha_enable, help={"enable cropping at +/- alpha"}
863  CheckBox cb_crop_alpha_enable,variable= root:packages:pearl_anglescan_panel:crop_alpha_enable
864  SetVariable sv_crop_alpha_value, size={90,16},bodyWidth=60,title="angle"
865  SetVariable sv_crop_alpha_value,limits={0,30,1},value= root:packages:pearl_anglescan_panel:crop_alpha_value
866  SetVariable sv_crop_alpha_value, help={"alpha (detection angle) cropping angle"}
867  Button b_crop_alpha_preview, size={80,20},proc=PearlAnglescanPanel#bp_crop_alpha_preview,title="preview"
868  Button b_crop_alpha_preview, help={"show a preview of the cropped dataset."}
869 
870  GroupBox gb_norm_alpha, title="normalize alpha"
871  CheckBox cb_norm_alpha_enable, size={50,14}, title="enable"
872  CheckBox cb_norm_alpha_enable,variable= root:packages:pearl_anglescan_panel:norm_alpha_enable
873  CheckBox cb_norm_alpha_enable, help={"enable normalization of the alpha distribution"}
874  PopupMenu pm_norm_alpha_mode, size={138,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_norm_alpha_mode,title="method"
875  PopupMenu pm_norm_alpha_mode, mode=5, popvalue="loess", value= #"\"none;binomial;boxcar;scienta;loess;\""
876  PopupMenu pm_norm_alpha_mode, help={"alpha normalization method. recommended: loess"}
877  SetVariable sv_norm_alpha_smoothing, size={112,16}, bodyWidth=60, title="smoothing"
878  SetVariable sv_norm_alpha_smoothing, limits={0,1,0.05}, value= root:packages:pearl_anglescan_panel:norm_alpha_smoothing
879  SetVariable sv_norm_alpha_smoothing, help={"smoothing parameter (depends on the normalization method)."}
880  Button b_norm_alpha_check, size={80,20}, proc=PearlAnglescanPanel#bp_norm_alpha_check,title="check"
881  Button b_norm_alpha_check, help={"show a graph of the normalization function"}
882  Button b_norm_alpha_preview, size={80,20}, proc=PearlAnglescanPanel#bp_norm_alpha_preview,title="preview"
883  Button b_norm_alpha_preview, help={"show a preview of the normalized dataset (without other normalizations)."}
884 
885  GroupBox gb_norm_phi, title="normalize phi"
886  CheckBox cb_norm_phi_enable, size={50,14}, title="enable"
887  CheckBox cb_norm_phi_enable,variable= root:packages:pearl_anglescan_panel:norm_phi_enable
888  CheckBox cb_norm_phi_enable, help={"enable normalization of the phi distribution to reduce the effect of wobble"}
889  SetVariable sv_norm_phi_range, size={118,16}, bodyWidth=60, title="theta range"
890  SetVariable sv_norm_phi_range, limits={0,90,1}, value= root:packages:pearl_anglescan_panel:norm_phi_thetarange
891  SetVariable sv_norm_phi_range, help={"theta range (from normal) to factor into the normalization function"}
892  Button b_norm_phi_check, size={80,20}, proc=PearlAnglescanPanel#bp_norm_phi_check, title="check"
893  Button b_norm_phi_check, help={"show a graph of the normalization function"}
894  Button b_norm_phi_preview, size={80,20}, proc=PearlAnglescanPanel#bp_norm_phi_preview, title="preview"
895  Button b_norm_phi_preview, help={"show a preview of the normalized dataset (without other normalizations)."}
896 
897  GroupBox gb_norm_theta, title="normalize theta"
898  CheckBox cb_norm_theta_enable, size={50,14},title="enable"
899  CheckBox cb_norm_theta_enable, variable= root:packages:pearl_anglescan_panel:norm_theta_enable
900  CheckBox cb_norm_theta_enable, help={"enable normalization of the theta distribution (integrated over phi)"}
901  PopupMenu pm_norm_theta_mode, size={138,21},bodyWidth=100,proc=PearlAnglescanPanel#pmp_norm_theta_mode,title="method"
902  PopupMenu pm_norm_theta_mode,mode=5,popvalue="loess",value= #"\"none;binomial;boxcar;polynomial;loess;\""
903  PopupMenu pm_norm_theta_mode, help={"theta normalization method. recommended: loess"}
904  SetVariable sv_norm_theta_smoothing, size={112,16}, bodyWidth=60, title="smoothing"
905  SetVariable sv_norm_theta_smoothing, limits={0,1,0.05}, value= root:packages:pearl_anglescan_panel:norm_theta_smoothing
906  SetVariable sv_norm_theta_smoothing, help={"smoothing parameter (depends on the normalization method)."}
907  Button b_norm_theta_check, size={80,20}, proc=PearlAnglescanPanel#bp_norm_theta_check, title="check"
908  Button b_norm_theta_check, help={"show a graph of the normalization function"}
909  Button b_norm_theta_preview, size={80,20}, proc=PearlAnglescanPanel#bp_norm_theta_preview, title="preview"
910  Button b_norm_theta_preview, help={"show a preview of the normalized dataset (without other normalizations)."}
911 
912  GroupBox gb_norm_thetaphi, size={272,97},title="normalize (theta,phi)"
913  CheckBox cb_norm_thetaphi_enable, size={50,14},title="enable"
914  CheckBox cb_norm_thetaphi_enable, variable= root:packages:pearl_anglescan_panel:norm_thetaphi_enable
915  CheckBox cb_norm_thetaphi_enable, help={"enable normalization of the (theta, phi) distribution."}
916  PopupMenu pm_norm_thetaphi_mode, size={138,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_norm_thetaphi_mode,title="method"
917  PopupMenu pm_norm_thetaphi_mode, mode=5, popvalue="loess", value= #"\"none;none;none;none;loess;\""
918  PopupMenu pm_norm_thetaphi_mode, help={"theta normalization method. recommended: loess"}
919  SetVariable sv_norm_thetaphi_smoothing, size={112,16}, bodyWidth=60, title="smoothing"
920  SetVariable sv_norm_thetaphi_smoothing, limits={0,1,0.05}, value= root:packages:pearl_anglescan_panel:norm_thetaphi_smoothing
921  SetVariable sv_norm_thetaphi_smoothing, help={"smoothing parameter (depends on the normalization method)."}
922  Button b_norm_thetaphi_check, size={80,20}, proc=PearlAnglescanPanel#bp_norm_thetaphi_check, title="check"
923  Button b_norm_thetaphi_check, help={"show a graph of the normalization function"}
924  Button b_norm_thetaphi_preview, size={80,20}, proc=PearlAnglescanPanel#bp_norm_thetaphi_preview, title="preview"
925  Button b_norm_thetaphi_preview, help={"show a preview of the normalized dataset (without other normalizations)."}
926 
927  GroupBox gb_output, title="output"
928  SetVariable sv_output_folding, size={95,16}, bodyWidth=60, title="folding"
929  SetVariable sv_output_folding, limits={1,20,1}, value= root:packages:pearl_anglescan_panel:output_folding
930  SetVariable sv_output_folding, help={"n-fold rotational average. 1=no averaging."}
931  SetVariable sv_output_horizon, size={98,16}, bodyWidth=60, title="horizon"
932  SetVariable sv_output_horizon, limits={1,90,1}, value= root:packages:pearl_anglescan_panel:output_horizon
933  SetVariable sv_output_horizon, help={"highest theta to display"}
934  PopupMenu pm_graph_projection, size={149,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_graph_projection, title="projection"
935  PopupMenu pm_graph_projection, mode=2, popvalue="stereographic", value= #"\"equidistant;stereographic;equal area;gnomonic;orthographic;\""
936  PopupMenu pm_graph_projection, help={"projection (theta mapping) mode"}
937  PopupMenu pm_graph_mode, size={129,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_graph_mode,title="mode"
938  PopupMenu pm_graph_mode, mode=2, popvalue="dots", value= #"\"none;dots;none;image;\""
939  PopupMenu pm_graph_mode, help={"graph type: dots = coloured dots on circles; image = interpolated matrix"}
940  Button b_output_calc, size={80,20}, proc=PearlAnglescanPanel#bp_output_calc, title="calc + display"
941  Button b_output_calc, help={"execute data processing with the enabled filters and display the diffractogram."}
942  Button b_output_duplicate, size={80,20}, proc=PearlAnglescanPanel#bp_output_duplicate, title="duplicate ..."
943  Button b_output_duplicate, help={"copy the result to an arbitrary data folder."}
944  Button b_output_itx, size={80,20}, proc=PearlAnglescanPanel#bp_output_itx, title="save ITX ..."
945  Button b_output_itx, help={"save the result to an igor text file (itx)."}
946  Button b_output_etpi, size={80,20}, proc=PearlAnglescanPanel#bp_output_etpi, title="save ETPI ..."
947  Button b_output_etpi, help={"save the result to a pmsco angle scan file (etpi)."}
948 
949  GroupBox gb_graph, title="graph"
950  PopupMenu pm_graph_colortable, size={152,21}, bodyWidth=100, proc=PearlAnglescanPanel#pmp_graph_colortable, title="color table"
951  PopupMenu pm_graph_colortable, mode=0, value= #"\"*COLORTABLEPOPNONAMES*\""
952  PopupMenu pm_graph_colortable, help={"color table to use in pseudocolor graphs."}
953  SetVariable sv_graph_contrast, size={119,16}, bodyWidth=60, title="contrast (%)"
954  SetVariable sv_graph_contrast, limits={0,25,1}, value= root:packages:pearl_anglescan_panel:graph_contrast
955  SetVariable sv_graph_contrast, help={"contrast value (percentile)."}
956  Button b_graph_update, size={80,20}, proc=PearlAnglescanPanel#bp_graph_update, title="update"
957  Button b_graph_update, help={"update the existing graph."}
958  Button b_graph_png, size={80,20}, proc=PearlAnglescanPanel#bp_graph_png, title="save PNG ..."
959  Button b_graph_png, help={"save the graph in png format."}
960 
962  update_menus()
963 end
964 
965 static function arrange_controls()
966  dfref df = $(package_path)
967  svar /sdfr=df panel_name
968 
969  variable gb_space = 2
970  variable gb_internal_top = 16
971  variable gb_internal_bot = 4
972  variable line_space = 22
973 
974  variable cb_adj = 2
975  variable sv_adj = 2
976  variable pm_adj = 0
977  variable b_adj = 0
978  variable tb_adj = 0
979 
980  variable gb_top = 4
981  variable gb_ht = 0
982 
983  // ht = line + 30
984  // gb = gb + ht + 2
985  // cb = gb + 18
986  // pm = gb + 38
987  // line += 26
988  // sv = line + 2
989 
990  GroupBox gb_source,pos={4,gb_top}
991  gb_ht = gb_internal_top
992  Button b_source_select,pos={17, gb_top + gb_ht + b_adj},size={50,20}
993  Button b_source_update, pos={67, gb_top + gb_ht + b_adj},size={50,20}
994  gb_ht += line_space
995  TitleBox tb_source_path,pos={18, gb_top + gb_ht + tb_adj},size={240,21}
996  gb_ht += line_space
997  gb_ht += gb_internal_bot
998  GroupBox gb_source, size={272,gb_ht}
999 
1000  gb_top += gb_ht + gb_space
1001  GroupBox gb_offsets,pos={4,gb_top}
1002  gb_ht = gb_internal_top
1003  SetVariable sv_theta_offset,pos={46, gb_top + gb_ht + sv_adj},size={88,16}
1004  Button b_save_prefs,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1005  gb_ht += line_space
1006  SetVariable sv_tilt_offset,pos={60, gb_top + gb_ht + sv_adj},size={74,16}
1007  Button b_load_prefs,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1008  gb_ht += line_space
1009  SetVariable sv_phi_offset,pos={56, gb_top + gb_ht + sv_adj},size={78,16}
1010  gb_ht += line_space
1011  SetVariable sv_alpha_offset,pos={44, gb_top + gb_ht + sv_adj},size={90,16}
1012  gb_ht += line_space
1013  gb_ht += gb_internal_bot
1014  GroupBox gb_offsets, size={272,gb_ht}
1015 
1016  gb_top += gb_ht + gb_space
1017  GroupBox gb_crop_alpha,pos={4,gb_top}
1018  gb_ht = gb_internal_top
1019  CheckBox cb_crop_alpha_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14}
1020  gb_ht += line_space
1021  SetVariable sv_crop_alpha_value,pos={44, gb_top + gb_ht + sv_adj},size={90,16}
1022  Button b_crop_alpha_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1023  gb_ht += line_space
1024  gb_ht += gb_internal_bot
1025  GroupBox gb_crop_alpha, size={272,gb_ht}
1026 
1027  gb_top += gb_ht + gb_space
1028  GroupBox gb_norm_alpha,pos={4,gb_top}
1029  gb_ht = gb_internal_top
1030  CheckBox cb_norm_alpha_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14}
1031  gb_ht += line_space
1032  PopupMenu pm_norm_alpha_mode,pos={36, gb_top + gb_ht + pm_adj},size={138,21}
1033  Button b_norm_alpha_check,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1034  gb_ht += line_space
1035  SetVariable sv_norm_alpha_smoothing,pos={22, gb_top + gb_ht + sv_adj},size={112,16}
1036  Button b_norm_alpha_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1037  gb_ht += line_space
1038  gb_ht += gb_internal_bot
1039  GroupBox gb_norm_alpha, size={272,gb_ht}
1040 
1041  gb_top += gb_ht + gb_space
1042  GroupBox gb_norm_phi,pos={4,gb_top}
1043  gb_ht = gb_internal_top
1044  CheckBox cb_norm_phi_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14}
1045  Button b_norm_phi_check,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1046  gb_ht += line_space
1047  SetVariable sv_norm_phi_range,pos={15, gb_top + gb_ht + sv_adj},size={118,16}
1048  Button b_norm_phi_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1049  gb_ht += line_space
1050  gb_ht += gb_internal_bot
1051  GroupBox gb_norm_phi, size={272,gb_ht}
1052 
1053  gb_top += gb_ht + gb_space
1054  GroupBox gb_norm_theta,pos={4,gb_top}
1055  gb_ht = gb_internal_top
1056  CheckBox cb_norm_theta_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14}
1057  gb_ht += line_space
1058  PopupMenu pm_norm_theta_mode,pos={35, gb_top + gb_ht + pm_adj},size={138,21}
1059  Button b_norm_theta_check,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1060  gb_ht += line_space
1061  SetVariable sv_norm_theta_smoothing,pos={21, gb_top + gb_ht + sv_adj},size={112,16}
1062  Button b_norm_theta_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1063  gb_ht += line_space
1064  gb_ht += gb_internal_bot
1065  GroupBox gb_norm_theta, size={272,gb_ht}
1066 
1067  gb_top += gb_ht + gb_space
1068  GroupBox gb_norm_thetaphi,pos={4,gb_top}
1069  gb_ht = gb_internal_top
1070  CheckBox cb_norm_thetaphi_enable,pos={73, gb_top + gb_ht + cb_adj},size={50,14}
1071  gb_ht += line_space
1072  PopupMenu pm_norm_thetaphi_mode,pos={35, gb_top + gb_ht + pm_adj},size={138,21}
1073  Button b_norm_thetaphi_check,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1074  gb_ht += line_space
1075  SetVariable sv_norm_thetaphi_smoothing,pos={21, gb_top + gb_ht + sv_adj},size={112,16}
1076  Button b_norm_thetaphi_preview,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1077  gb_ht += line_space
1078  gb_ht += gb_internal_bot
1079  GroupBox gb_norm_thetaphi, size={272,gb_ht}
1080 
1081  gb_top += gb_ht + gb_space
1082  GroupBox gb_output,pos={4,gb_top}
1083  gb_ht = gb_internal_top
1084  SetVariable sv_output_folding,pos={38, gb_top + gb_ht + sv_adj},size={95,16}
1085  Button b_output_calc,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1086  gb_ht += line_space
1087  SetVariable sv_output_horizon,pos={35, gb_top + gb_ht + sv_adj},size={98,16}
1088  Button b_output_duplicate,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1089  gb_ht += line_space
1090  PopupMenu pm_graph_projection,pos={24, gb_top + gb_ht + pm_adj},size={149,21}
1091  Button b_output_itx,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1092  gb_ht += line_space
1093  PopupMenu pm_graph_mode,pos={44, gb_top + gb_ht + pm_adj},size={129,21}
1094  Button b_output_etpi,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1095  gb_ht += line_space
1096  gb_ht += gb_internal_bot
1097  GroupBox gb_output, size={272,gb_ht}
1098 
1099  gb_top += gb_ht + gb_space
1100  GroupBox gb_graph,pos={4,gb_top}
1101  gb_ht = gb_internal_top
1102  PopupMenu pm_graph_colortable,pos={21, gb_top + gb_ht + pm_adj},size={152,21}
1103  Button b_graph_update,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1104  gb_ht += line_space
1105  SetVariable sv_graph_contrast,pos={14, gb_top + gb_ht + sv_adj},size={119,16}
1106  Button b_graph_png,pos={186, gb_top + gb_ht + b_adj},size={80,20}
1107  gb_ht += line_space
1108  gb_ht += gb_internal_bot
1109  GroupBox gb_graph, size={272,gb_ht}
1110 
1111  gb_top += gb_ht + gb_space
1112  //MoveWindow 200, 100, 479, 100 + gb_top
1113 end
1114 
1117 static function update_menus()
1118  dfref df = $(package_path)
1119  svar /sdfr=df panel_name
1120  if (wintype(panel_name) == 7)
1121  variable m
1122  nvar /sdfr=df norm_alpha_mode
1123  m = norm_alpha_mode + 1
1124  PopupMenu pm_norm_alpha_mode win=$panel_name, mode=m
1125  nvar /sdfr=df norm_theta_mode
1126  m = norm_theta_mode + 1
1127  PopupMenu pm_norm_theta_mode win=$panel_name, mode=m
1128  nvar /sdfr=df norm_thetaphi_mode
1129  m = norm_thetaphi_mode + 1
1130  PopupMenu pm_norm_thetaphi_mode win=$panel_name, mode=m
1131  nvar /sdfr=df graph_mode
1132  m = graph_mode + 1
1133  PopupMenu pm_graph_mode win=$panel_name, mode=m
1134  nvar /sdfr=df graph_projection
1135  m = graph_projection + 1
1136  PopupMenu pm_graph_projection win=$panel_name, mode=m
1137  svar /sdfr=df graph_colortable
1138  m = 1 + WhichListItem(graph_colortable, CTabList())
1139  PopupMenu pm_graph_colortable win=$panel_name, mode=m
1140  endif
1141 end
1142 
1143 static function bp_load_prefs(ba) : ButtonControl
1144  STRUCT WMButtonAction &ba
1145 
1146  switch( ba.eventCode )
1147  case 2: // mouse up
1148  load_prefs()
1149  break
1150  case -1: // control being killed
1151  break
1152  endswitch
1153 
1154  return 0
1155 End
1156 
1157 static function bp_save_prefs(ba) : ButtonControl
1158  STRUCT WMButtonAction &ba
1159 
1160  switch( ba.eventCode )
1161  case 2: // mouse up
1162  save_prefs()
1163  break
1164  case -1: // control being killed
1165  break
1166  endswitch
1167 
1168  return 0
1169 End
1170 
1171 static function bp_source_select(ba) : ButtonControl
1172  STRUCT WMButtonAction &ba
1173 
1174  switch( ba.eventCode )
1175  case 2: // mouse up
1176  dfref dfBefore = GetDataFolderDFR()
1177  Execute /q/z "CreateBrowser prompt=\"Select 2D holo scan wave\", showWaves=1, showVars=0, showStrs=0"
1178  dfref dfAfter = GetDataFolderDFR()
1179  SetDataFolder dfBefore
1180 
1181  SVAR list = S_BrowserList
1182  NVAR flag = V_Flag
1183  if ((flag != 0) && (ItemsInList(list) >= 1))
1184  string wname = StringFromList(0, list)
1185  wave w = $wname
1186  asp_import_raw(w)
1187  endif
1188 
1189  break
1190  case -1: // control being killed
1191  break
1192  endswitch
1193 
1194  return 0
1195 End
1196 
1197 static function bp_source_update(ba) : ButtonControl
1198  STRUCT WMButtonAction &ba
1199 
1200  switch( ba.eventCode )
1201  case 2: // mouse up
1202  dfref packdf = $package_path
1203  svar /sdfr=packdf source_path
1204  wave /z w = $source_path
1205  if (waveexists(w))
1206  asp_import_raw(w)
1207  else
1208  DoAlert 0, "can't find source data."
1209  endif
1210  break
1211  case -1: // control being killed
1212  break
1213  endswitch
1214 
1215  return 0
1216 End
1217 
1218 static function bp_norm_alpha_check(ba) : ButtonControl
1219  STRUCT WMButtonAction &ba
1220 
1221  switch( ba.eventCode )
1222  case 2: // mouse up
1224  break
1225  case -1: // control being killed
1226  break
1227  endswitch
1228 
1229  return 0
1230 End
1231 
1232 static function bp_norm_theta_check(ba) : ButtonControl
1233  STRUCT WMButtonAction &ba
1234 
1235  switch( ba.eventCode )
1236  case 2: // mouse up
1238  break
1239  case -1: // control being killed
1240  break
1241  endswitch
1242 
1243  return 0
1244 End
1245 
1246 static function bp_norm_phi_check(ba) : ButtonControl
1247  STRUCT WMButtonAction &ba
1248 
1249  switch( ba.eventCode )
1250  case 2: // mouse up
1251  check_norm_phi()
1252  break
1253  case -1: // control being killed
1254  break
1255  endswitch
1256 
1257  return 0
1258 End
1259 
1260 static function bp_norm_thetaphi_check(ba) : ButtonControl
1261  STRUCT WMButtonAction &ba
1262 
1263  switch( ba.eventCode )
1264  case 2: // mouse up
1266  break
1267  case -1: // control being killed
1268  break
1269  endswitch
1270 
1271  return 0
1272 End
1273 
1274 static function bp_crop_alpha_preview(ba) : ButtonControl
1275  STRUCT WMButtonAction &ba
1276 
1277  switch( ba.eventCode )
1278  case 2: // mouse up
1280  break
1281  case -1: // control being killed
1282  break
1283  endswitch
1284 
1285  return 0
1286 End
1287 
1288 static function bp_norm_alpha_preview(ba) : ButtonControl
1289  STRUCT WMButtonAction &ba
1290 
1291  switch( ba.eventCode )
1292  case 2: // mouse up
1294  break
1295  case -1: // control being killed
1296  break
1297  endswitch
1298 
1299  return 0
1300 End
1301 
1302 static function bp_norm_phi_preview(ba) : ButtonControl
1303  STRUCT WMButtonAction &ba
1304 
1305  switch( ba.eventCode )
1306  case 2: // mouse up
1308  break
1309  case -1: // control being killed
1310  break
1311  endswitch
1312 
1313  return 0
1314 End
1315 
1316 static function bp_norm_theta_preview(ba) : ButtonControl
1317  STRUCT WMButtonAction &ba
1318 
1319  switch( ba.eventCode )
1320  case 2: // mouse up
1322  break
1323  case -1: // control being killed
1324  break
1325  endswitch
1326 
1327  return 0
1328 End
1329 
1330 static function bp_norm_thetaphi_preview(ba) : ButtonControl
1331  STRUCT WMButtonAction &ba
1332 
1333  switch( ba.eventCode )
1334  case 2: // mouse up
1336  break
1337  case -1: // control being killed
1338  break
1339  endswitch
1340 
1341  return 0
1342 End
1343 
1344 static function bp_output_calc(ba) : ButtonControl
1345  STRUCT WMButtonAction &ba
1346 
1347  switch( ba.eventCode )
1348  case 2: // mouse up
1351  break
1352  case -1: // control being killed
1353  break
1354  endswitch
1355 
1356  return 0
1357 End
1358 
1359 static function bp_output_duplicate(ba) : ButtonControl
1360  STRUCT WMButtonAction &ba
1361 
1362  switch( ba.eventCode )
1363  case 2: // mouse up
1364  string dest_folder
1365  variable do_graph = 1
1366  prompt dest_folder, "destination folder name (relative to data source)"
1367  prompt do_graph, "duplicate graph (yes = 1, no = 0)"
1368  doprompt "duplicate", dest_folder, do_graph
1369  if (!v_flag)
1370  asp_duplicate_output(dest_folder, do_graph=do_graph)
1371  endif
1372  break
1373  case -1: // control being killed
1374  break
1375  endswitch
1376 
1377  return 0
1378 End
1379 
1380 static function bp_output_etpi(ba) : ButtonControl
1381  STRUCT WMButtonAction &ba
1382 
1383  switch( ba.eventCode )
1384  case 2: // mouse up
1385  dfref df = $(package_path)
1386  wave /sdfr=df process_data
1387  variable ekin
1388  ekin = NumberByKey("KineticEnergy", note(process_data), "=", "\r")
1389  prompt ekin, "kinetic energy"
1390  doprompt "save etpi", ekin
1391  if (!v_flag)
1392  asp_save_output_etpi(ekin)
1393  endif
1394  break
1395  case -1: // control being killed
1396  break
1397  endswitch
1398 
1399  return 0
1400 End
1401 
1402 static function bp_output_itx(ba) : ButtonControl
1403  STRUCT WMButtonAction &ba
1404 
1405  switch( ba.eventCode )
1406  case 2: // mouse up
1408  break
1409  case -1: // control being killed
1410  break
1411  endswitch
1412 
1413  return 0
1414 End
1415 
1416 static function bp_graph_update(ba) : ButtonControl
1417  STRUCT WMButtonAction &ba
1418 
1419  switch( ba.eventCode )
1420  case 2: // mouse up
1422  break
1423  case -1: // control being killed
1424  break
1425  endswitch
1426 
1427  return 0
1428 End
1429 
1430 static function bp_graph_png(ba) : ButtonControl
1431  STRUCT WMButtonAction &ba
1432 
1433  switch( ba.eventCode )
1434  case 2: // mouse up
1435  dfref df = $(package_path)
1436  svar /sdfr=df source_path
1437  svar /sdfr=df output_graphname
1438  if (WinType(output_graphname) == 1)
1439  SavePICT /WIN=$output_graphname /E=-5 /B=144 /TRAN=0
1440  endif
1441  break
1442  case -1: // control being killed
1443  break
1444  endswitch
1445 
1446  return 0
1447 End
1448 
1449 static function pmp_norm_alpha_mode(pa) : PopupMenuControl
1450  STRUCT WMPopupAction &pa
1451 
1452  switch( pa.eventCode )
1453  case 2: // mouse up
1454  dfref df = $(package_path)
1455  nvar /sdfr=df norm_alpha_mode
1456  norm_alpha_mode = pa.popNum - 1
1457  break
1458  case -1: // control being killed
1459  break
1460  endswitch
1461 
1462  return 0
1463 End
1464 
1465 static function pmp_norm_theta_mode(pa) : PopupMenuControl
1466  STRUCT WMPopupAction &pa
1467 
1468  switch( pa.eventCode )
1469  case 2: // mouse up
1470  dfref df = $(package_path)
1471  nvar /sdfr=df norm_theta_mode
1472  norm_theta_mode = pa.popNum - 1
1473  break
1474  case -1: // control being killed
1475  break
1476  endswitch
1477 
1478  return 0
1479 End
1480 
1481 static function pmp_norm_thetaphi_mode(pa) : PopupMenuControl
1482  STRUCT WMPopupAction &pa
1483 
1484  switch( pa.eventCode )
1485  case 2: // mouse up
1486  dfref df = $(package_path)
1487  nvar /sdfr=df norm_thetaphi_mode
1488  norm_thetaphi_mode = pa.popNum - 1
1489  break
1490  case -1: // control being killed
1491  break
1492  endswitch
1493 
1494  return 0
1495 End
1496 
1497 static function pmp_graph_mode(pa) : PopupMenuControl
1498  STRUCT WMPopupAction &pa
1499 
1500  switch( pa.eventCode )
1501  case 2: // mouse up
1502  dfref df = $(package_path)
1503  nvar /sdfr=df graph_mode
1504  graph_mode = pa.popNum - 1
1505  break
1506  case -1: // control being killed
1507  break
1508  endswitch
1509 
1510  return 0
1511 End
1512 
1513 static function pmp_graph_projection(pa) : PopupMenuControl
1514  STRUCT WMPopupAction &pa
1515 
1516  switch( pa.eventCode )
1517  case 2: // mouse up
1518  dfref df = $(package_path)
1519  nvar /sdfr=df graph_projection
1520  graph_projection = pa.popNum - 1
1521  break
1522  case -1: // control being killed
1523  break
1524  endswitch
1525 
1526  return 0
1527 End
1528 
1529 static function pmp_graph_colortable(pa) : PopupMenuControl
1530  STRUCT WMPopupAction &pa
1531 
1532  switch( pa.eventCode )
1533  case 2: // mouse up
1534  dfref df = $(package_path)
1535  svar /sdfr=df graph_colortable
1536  graph_colortable = StringFromList(pa.popNum - 1, CTabList())
1538  break
1539  case -1: // control being killed
1540  break
1541  endswitch
1542 
1543  return 0
1544 End
static variable bp_norm_phi_preview(WMButtonAction *ba)
variable pizza_service_2(wave data, string nickname, wave m_theta, wave m_tilt, wave m_phi, variable npolar=defaultValue, variable nograph=defaultValue, variable folding=defaultValue, variable xpdplot=defaultValue)
create a pizza plot from a measured (energy-integrated) data strip
variable normalize_strip_theta(wave strip, wave theta, variable theta_offset=defaultValue, variable smooth_method=defaultValue, variable smooth_factor=defaultValue, variable check=defaultValue)
divide the strip by the average polar distribution.
static variable do_init_process(variable check)
initialize the process data with a copy of the raw data.
static variable preview_norm_alpha()
variable asp_calculate_output()
calculate the output using all enabled processing filters.
static variable check_norm_alpha()
variable asp_import_raw(wave raw_data)
import raw data
variable crop_strip(wave strip, variable xlo, variable xhi)
crop a strip at the sides.
variable ad_update_profiles(wave image)
update a profiles graph with new data.
static variable bp_save_prefs(WMButtonAction *ba)
variable asp_save_output_itx()
save the output diffractogram to an igor text file
string display_hemi_scan(string nickname, variable projection=defaultValue, variable graphtype=defaultValue, variable do_ticks=defaultValue, variable do_grids=defaultValue, string graphname=defaultValue)
display a plot of a hemispherical angle scan.
static variable pmp_graph_colortable(WMPopupAction *pa)
static variable save_prefs()
save persistent package data to the preferences file.
static variable bp_graph_update(WMButtonAction *ba)
dfr find_hemi_data(string nickname, string *prefix, string *intwave)
finds the folder, prefix and name of holo waves given their nick name
static variable bp_norm_alpha_preview(WMButtonAction *ba)
static variable preview_crop_alpha()
static variable pmp_norm_alpha_mode(WMPopupAction *pa)
static variable init_package()
static variable preview_norm_theta()
static variable bp_source_update(WMButtonAction *ba)
static variable bp_norm_thetaphi_check(WMButtonAction *ba)
static variable bp_norm_theta_preview(WMButtonAction *ba)
static variable do_crop_alpha(variable check, variable force=defaultValue)
alpha-crop the process data.
static const string package_path
data folder path
static variable bp_crop_alpha_preview(WMButtonAction *ba)
static variable do_norm_thetaphi(variable check, variable force=defaultValue)
theta,phi-normalize the process data.
static variable bp_load_prefs(WMButtonAction *ba)
static variable bp_output_etpi(WMButtonAction *ba)
variable asp_display_dist_check(variable xdist, variable ydist)
display a graph window of the distribution checks.
static variable bp_graph_png(WMButtonAction *ba)
static variable pmp_graph_mode(WMPopupAction *pa)
static variable preview_norm_phi()
string pmsco_save_scan(string pathname, string filename, string energy, string theta, string phi, string alpha, string intensity, string sigma, dfref sdfr=defaultValue)
save waves in a PMSCO scan data file.
static variable pmp_norm_theta_mode(WMPopupAction *pa)
variable interpolate_hemi_scan(string nickname, variable projection=defaultValue)
interpolate a hemispherical scan onto a rectangular grid
static variable do_norm_phi(variable check, variable force=defaultValue)
phi-normalize the process data.
static variable bp_norm_thetaphi_preview(WMButtonAction *ba)
static variable do_norm_theta(variable check, variable force=defaultValue)
theta-normalize the process data.
static variable check_norm_phi()
static const string prefs_objects
semicolon-separated list of persistent variable, string, and wave names
variable asp_show_panel()
create the angle scan processing panel
static variable bp_output_calc(WMButtonAction *ba)
static variable arrange_controls()
static variable bp_norm_theta_check(WMButtonAction *ba)
variable save_hemi_scan(string nickname, string pathname, string filename)
save a hemispherical scan to an Igor text file
string asp_duplicate_output(string dest_name, variable do_graph=defaultValue)
copy the output data to a new folder
variable normalize_strip_phi(wave strip, wave theta, wave phi, variable theta_offset=defaultValue, variable theta_range=defaultValue, variable check=defaultValue)
divide the strip by a sine function in phi (wobble correction).
variable normalize_strip_thetaphi(wave strip, wave theta, wave phi, variable theta_offset=defaultValue, variable smooth_method=defaultValue, variable smooth_factor=defaultValue, variable check=defaultValue)
divide the strip by a smooth polar-azimuthal distribution.
const variable kProjStereo
static variable update_menus()
update the popup menus to reflect the values of the global variables
static variable bp_output_itx(WMButtonAction *ba)
variable asp_close_graphs()
close all graphs created by the angle scan panel
static variable do_norm_alpha(variable check, variable force=defaultValue)
alpha-normalize the process data.
string ad_display_profiles(wave image, string filter=defaultValue)
open a new profiles graph window.
static variable load_prefs()
load persistent package data from the preferences file.
static variable check_norm_theta()
variable set_contrast(variable pcmin, variable pcmax, string graphname=defaultValue, string colortable=defaultValue)
set the pseudocolor contrast by percentile.
variable asp_display_previews()
display a graph window of the processed data.
variable asp_save_output_etpi(variable ekin)
save the output diffractogram to a PMSCO ETPI file
static variable bp_output_duplicate(WMButtonAction *ba)
static variable bp_norm_alpha_check(WMButtonAction *ba)
static variable check_norm_thetaphi()
static variable bp_norm_phi_check(WMButtonAction *ba)
static variable bp_source_select(WMButtonAction *ba)
static variable AfterCompiledHook()
initialize package data once when the procedure is first loaded
variable duplicate_hemi_scan(string source_nickname, dfref dest_folder, string dest_nickname, variable xpdplot=defaultValue)
duplicate a hemispherical scan dataset.
static variable pmp_norm_thetaphi_mode(WMPopupAction *pa)
static variable preview_norm_thetaphi()
string asp_display_output(dfref data_df=defaultValue, string data_name=defaultValue)
display the output diffractogram
static const string package_name
package name is used as data folder name
variable asp_update_graph()
update graphs with new color table or contrast
interactive processing of angle scanned XPD data.
static variable pmp_graph_projection(WMPopupAction *pa)
variable normalize_strip_x(wave strip, variable smooth_method=defaultValue, variable smooth_factor=defaultValue, variable check=defaultValue)
divide the strip by the average X distribution.